rubyfox-server 2.13.5.1 → 2.16.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (572) hide show
  1. checksums.yaml +4 -4
  2. data/lib/rubyfox/server/data/config/UploadsLock.txt +3 -0
  3. data/lib/rubyfox/server/data/config/admin/admintool.xml +2 -0
  4. data/lib/rubyfox/server/data/config/admin/descriptors/config_room.txt +97 -43
  5. data/lib/rubyfox/server/data/config/admin/descriptors/config_server.txt +307 -93
  6. data/lib/rubyfox/server/data/config/admin/descriptors/config_zone.txt +311 -95
  7. data/lib/rubyfox/server/data/config/admin/descriptors/runtime_game.txt +5 -5
  8. data/lib/rubyfox/server/data/config/admin/descriptors/runtime_mmo.txt +6 -6
  9. data/lib/rubyfox/server/data/config/admin/descriptors/runtime_room.txt +69 -44
  10. data/lib/rubyfox/server/data/config/admin/descriptors/runtime_user.txt +55 -43
  11. data/lib/rubyfox/server/data/config/admin/descriptors/runtime_zone.txt +81 -36
  12. data/lib/rubyfox/server/data/config/admin/gmc/gmc.py +55 -18
  13. data/lib/rubyfox/server/data/config/admin/icons/Analytics.png +0 -0
  14. data/lib/rubyfox/server/data/config/admin/icons/Analytics.svg +1 -0
  15. data/lib/rubyfox/server/data/config/admin/icons/BanManager.png +0 -0
  16. data/lib/rubyfox/server/data/config/admin/icons/BanManager.svg +1 -0
  17. data/lib/rubyfox/server/data/config/admin/icons/BlueBoxMonitor.png +0 -0
  18. data/lib/rubyfox/server/data/config/admin/icons/BlueBoxMonitor.svg +1 -0
  19. data/lib/rubyfox/server/data/config/admin/icons/Console.png +0 -0
  20. data/lib/rubyfox/server/data/config/admin/icons/Console.svg +9 -0
  21. data/lib/rubyfox/server/data/config/admin/icons/Dashboard.png +0 -0
  22. data/lib/rubyfox/server/data/config/admin/icons/Dashboard.svg +1 -0
  23. data/lib/rubyfox/server/data/config/admin/icons/ExtensionManager.png +0 -0
  24. data/lib/rubyfox/server/data/config/admin/icons/ExtensionManager.svg +1 -0
  25. data/lib/rubyfox/server/data/config/admin/icons/LicenseManager.png +0 -0
  26. data/lib/rubyfox/server/data/config/admin/icons/LicenseManager.svg +1 -0
  27. data/lib/rubyfox/server/data/config/admin/icons/LogViewer.png +0 -0
  28. data/lib/rubyfox/server/data/config/admin/icons/LogViewer.svg +1 -0
  29. data/lib/rubyfox/server/data/config/admin/icons/ServerConfigurator.png +0 -0
  30. data/lib/rubyfox/server/data/config/admin/icons/ServerConfigurator.svg +1 -0
  31. data/lib/rubyfox/server/data/config/admin/icons/ServletManager.png +0 -0
  32. data/lib/rubyfox/server/data/config/admin/icons/ServletManager.svg +1 -0
  33. data/lib/rubyfox/server/data/config/admin/icons/ZoneConfigurator.png +0 -0
  34. data/lib/rubyfox/server/data/config/admin/icons/ZoneConfigurator.svg +1 -0
  35. data/lib/rubyfox/server/data/config/admin/icons/ZoneMonitor.png +0 -0
  36. data/lib/rubyfox/server/data/config/admin/icons/ZoneMonitor.svg +1 -0
  37. data/lib/rubyfox/server/data/config/core.xml +2 -2
  38. data/lib/rubyfox/server/data/config/log4j.properties +7 -7
  39. data/lib/rubyfox/server/data/config/server.xml +9 -10
  40. data/lib/rubyfox/server/data/config/wordsFile.txt +0 -2
  41. data/lib/rubyfox/server/data/data/GeoLite2-Country.mmdb +0 -0
  42. data/lib/rubyfox/server/data/{config → data/buddylists/BasicExamples}/.keep +0 -0
  43. data/lib/rubyfox/server/data/data/{buddylists → uploads}/.keep +0 -0
  44. data/lib/rubyfox/server/data/lib/BlueBox.war +0 -0
  45. data/lib/rubyfox/server/data/lib/apache-tomcat/LICENSE +1061 -0
  46. data/lib/rubyfox/server/data/lib/apache-tomcat/NOTICE +68 -0
  47. data/lib/rubyfox/server/data/lib/apache-tomcat/README.md +79 -0
  48. data/lib/rubyfox/server/data/lib/apache-tomcat/RELEASE-NOTES +174 -0
  49. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/bootstrap.jar +0 -0
  50. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/catalina-tasks.xml +39 -0
  51. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/catalina.bat +386 -0
  52. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/catalina.sh +689 -0
  53. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/ciphers.bat +58 -0
  54. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/ciphers.sh +60 -0
  55. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/commons-daemon-native.tar.gz +0 -0
  56. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/commons-daemon.jar +0 -0
  57. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/configtest.bat +58 -0
  58. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/configtest.sh +60 -0
  59. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/daemon.sh +293 -0
  60. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/digest.bat +58 -0
  61. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/digest.sh +60 -0
  62. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/makebase.bat +114 -0
  63. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/makebase.sh +115 -0
  64. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/setclasspath.bat +94 -0
  65. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/setclasspath.sh +98 -0
  66. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/shutdown.bat +58 -0
  67. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/shutdown.sh +60 -0
  68. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/startup.bat +58 -0
  69. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/startup.sh +60 -0
  70. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/tomcat-juli.jar +0 -0
  71. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/tomcat-native.tar.gz +0 -0
  72. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/tool-wrapper.bat +110 -0
  73. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/tool-wrapper.sh +153 -0
  74. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/version.bat +58 -0
  75. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/version.sh +60 -0
  76. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/Catalina/localhost/rewrite.config +1 -0
  77. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/catalina.policy +260 -0
  78. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/catalina.properties +206 -0
  79. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/context.xml +31 -0
  80. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/jaspic-providers.xml +23 -0
  81. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/jaspic-providers.xsd +53 -0
  82. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/keystore.jks +0 -0
  83. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/logging.properties +79 -0
  84. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/server.xml +161 -0
  85. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/tomcat-users.xml +41 -0
  86. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/tomcat-users.xsd +59 -0
  87. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/web.xml +4733 -0
  88. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/annotations-api.jar +0 -0
  89. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina-ant.jar +0 -0
  90. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina-ha.jar +0 -0
  91. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina-ssi.jar +0 -0
  92. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina-storeconfig.jar +0 -0
  93. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina-tribes.jar +0 -0
  94. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina.jar +0 -0
  95. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/ecj-4.15.jar +0 -0
  96. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/el-api.jar +0 -0
  97. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/jasper-el.jar +0 -0
  98. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/jasper.jar +0 -0
  99. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/jaspic-api.jar +0 -0
  100. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/jsp-api.jar +0 -0
  101. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/servlet-api.jar +0 -0
  102. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/sfs2x-ws-helper.jar +0 -0
  103. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-api.jar +0 -0
  104. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-coyote.jar +0 -0
  105. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-dbcp.jar +0 -0
  106. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-cs.jar +0 -0
  107. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-de.jar +0 -0
  108. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-es.jar +0 -0
  109. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-fr.jar +0 -0
  110. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-ja.jar +0 -0
  111. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-ko.jar +0 -0
  112. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-pt-BR.jar +0 -0
  113. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-ru.jar +0 -0
  114. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-zh-CN.jar +0 -0
  115. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-jdbc.jar +0 -0
  116. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-jni.jar +0 -0
  117. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-util-scan.jar +0 -0
  118. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-util.jar +0 -0
  119. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-websocket.jar +0 -0
  120. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/websocket-api.jar +0 -0
  121. data/lib/rubyfox/server/data/{extensions → lib/apache-tomcat/logs}/.keep +0 -0
  122. data/lib/rubyfox/server/data/lib/{jetty/lib/ext/.donotdelete → apache-tomcat/temp/safeToDelete.tmp} +0 -0
  123. data/lib/rubyfox/server/data/lib/{jetty/resources → apache-tomcat/work}/.keep +0 -0
  124. data/lib/rubyfox/server/data/lib/commons-collections-3.2.2.jar +0 -0
  125. data/lib/rubyfox/server/data/lib/commons-compress-1.19.jar +0 -0
  126. data/lib/rubyfox/server/data/lib/js/LibApi.js +48 -181
  127. data/lib/rubyfox/server/data/lib/sfs2x-admin.jar +0 -0
  128. data/lib/rubyfox/server/data/lib/sfs2x-core.jar +0 -0
  129. data/lib/rubyfox/server/data/lib/sfs2x-lib.jar +0 -0
  130. data/lib/rubyfox/server/data/lib/sfs2x-util.jar +0 -0
  131. data/lib/rubyfox/server/data/lib/sfs2x.jar +0 -0
  132. data/lib/rubyfox/server/data/sfs2x-service +6 -6
  133. data/lib/rubyfox/server/data/sfs2x-service.vmoptions +1 -1
  134. data/lib/rubyfox/server/data/sfs2x.sh +1 -1
  135. data/lib/rubyfox/server/data/www/BlueBox.war +0 -0
  136. data/lib/rubyfox/server/data/www/HelloServlet/index.jsp +1 -1
  137. data/lib/rubyfox/server/data/www/{root → ROOT}/_css_/default.css +0 -0
  138. data/lib/rubyfox/server/data/www/{root → ROOT}/_css_/reset.css +0 -0
  139. data/lib/rubyfox/server/data/www/{root → ROOT}/_images_/background_gradient.png +0 -0
  140. data/lib/rubyfox/server/data/www/{root → ROOT}/_images_/background_logo.png +0 -0
  141. data/lib/rubyfox/server/data/www/{root → ROOT}/_images_/favicon.png +0 -0
  142. data/lib/rubyfox/server/data/www/{root → ROOT}/_images_/logo_smartfoxserver.png +0 -0
  143. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/_changes-to-default-themes_.txt +15 -0
  144. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/bootstrap.min.css +7 -0
  145. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/custom-bootstrap.min.css +1 -0
  146. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/css/all.min.css +5 -0
  147. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-brands-400.eot +0 -0
  148. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-brands-400.svg +3459 -0
  149. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-brands-400.ttf +0 -0
  150. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-brands-400.woff +0 -0
  151. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-brands-400.woff2 +0 -0
  152. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-regular-400.eot +0 -0
  153. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-regular-400.svg +803 -0
  154. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-regular-400.ttf +0 -0
  155. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-regular-400.woff +0 -0
  156. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-regular-400.woff2 +0 -0
  157. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-solid-900.eot +0 -0
  158. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-solid-900.svg +4527 -0
  159. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-solid-900.ttf +0 -0
  160. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-solid-900.woff +0 -0
  161. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-solid-900.woff2 +0 -0
  162. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fonts.css +175 -0
  163. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/jquery.scrolling-tabs.min.css +8 -0
  164. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/kendo.custom-bootstrap-v4.css +15280 -0
  165. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/reset.css +54 -0
  166. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/style.css +1428 -0
  167. data/lib/rubyfox/server/data/www/ROOT/admin/assets/data/countries.geo.json +178 -0
  168. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/FreeMono.otf +0 -0
  169. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/FreeMono.ttf +0 -0
  170. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/FreeMono.woff +0 -0
  171. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/FreeMono.woff2 +0 -0
  172. 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
  173. 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
  174. 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
  175. 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
  176. 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
  177. 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
  178. 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
  179. 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
  180. 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
  181. 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
  182. 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
  183. 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
  184. 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
  185. 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
  186. 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
  187. 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
  188. 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
  189. 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
  190. 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
  191. 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
  192. 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
  193. 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
  194. 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
  195. 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
  196. 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
  197. 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
  198. 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
  199. 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
  200. 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
  201. 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
  202. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/roboto-condensed-v16-latin-300.ttf +0 -0
  203. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/roboto-condensed-v16-latin-300.woff +0 -0
  204. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/roboto-condensed-v16-latin-300.woff2 +0 -0
  205. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/roboto-condensed-v16-latin-700.ttf +0 -0
  206. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/roboto-condensed-v16-latin-700.woff +0 -0
  207. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/roboto-condensed-v16-latin-700.woff2 +0 -0
  208. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/compare.png +0 -0
  209. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/demographicsChart.png +0 -0
  210. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/demographicsCompare.png +0 -0
  211. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/demographicsFilter.png +0 -0
  212. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/demographicsMap.png +0 -0
  213. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/demographicsTable.png +0 -0
  214. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/technologyChart.png +0 -0
  215. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/technologyCompare.png +0 -0
  216. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/technologyFilter.png +0 -0
  217. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/technologyTable.png +0 -0
  218. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/apple-touch-icon-180x180.png +0 -0
  219. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/favicon-16x16.png +0 -0
  220. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/favicon-32x32.png +0 -0
  221. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/favicon-64x64.png +0 -0
  222. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/logo.png +0 -0
  223. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/application.bundle.js +2208 -0
  224. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-0.bundle.js +7662 -0
  225. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-1.bundle.js +929 -0
  226. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-10.bundle.js +766 -0
  227. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-11.bundle.js +71 -0
  228. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-12.bundle.js +1184 -0
  229. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-12~module-13~module-9.bundle.js +2618 -0
  230. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-13.bundle.js +3315 -0
  231. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-3.bundle.js +280 -0
  232. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-4.bundle.js +1122 -0
  233. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-5.bundle.js +2624 -0
  234. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-6.bundle.js +801 -0
  235. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-7.bundle.js +607 -0
  236. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-8.bundle.js +1221 -0
  237. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-9.bundle.js +847 -0
  238. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/vendors~module-0.bundle.js +3240 -0
  239. 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 +17357 -0
  240. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/vendors~module-9.bundle.js +807 -0
  241. data/lib/rubyfox/server/data/{lib/jetty/webapps → www/ROOT/admin/assets/js/custom-modules}/.keep +0 -0
  242. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/libs/bootstrap.min.js +7 -0
  243. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/libs/jquery-3.3.1.min.js +2 -0
  244. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/libs/jquery.scrolling-tabs.min.js +8 -0
  245. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/libs/js.cookie.min.js +8 -0
  246. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/libs/kendo.all.min.js +136 -0
  247. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/libs/popper.min.js +5 -0
  248. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/libs/sfs2x-api-1.7.15.js +8 -0
  249. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/libs/versions-readme.txt +16 -0
  250. data/lib/rubyfox/server/data/www/ROOT/admin/index.html +244 -0
  251. data/lib/rubyfox/server/data/www/ROOT/admin/manifest.json +25 -0
  252. data/lib/rubyfox/server/data/www/ROOT/admin/modules/analytics.html +328 -0
  253. data/lib/rubyfox/server/data/www/ROOT/admin/modules/ban-manager.html +160 -0
  254. data/lib/rubyfox/server/data/www/ROOT/admin/modules/blue-box-monitor.html +37 -0
  255. data/lib/rubyfox/server/data/www/ROOT/admin/modules/console.html +135 -0
  256. data/lib/rubyfox/server/data/www/ROOT/admin/modules/dashboard.html +368 -0
  257. data/lib/rubyfox/server/data/www/ROOT/admin/modules/extension-manager.html +98 -0
  258. data/lib/rubyfox/server/data/www/ROOT/admin/modules/license-manager.html +117 -0
  259. data/lib/rubyfox/server/data/www/ROOT/admin/modules/log-viewer.html +194 -0
  260. data/lib/rubyfox/server/data/www/ROOT/admin/modules/server-configurator.html +55 -0
  261. data/lib/rubyfox/server/data/www/ROOT/admin/modules/servlet-manager.html +98 -0
  262. data/lib/rubyfox/server/data/www/ROOT/admin/modules/zone-configurator.html +62 -0
  263. data/lib/rubyfox/server/data/www/ROOT/admin/modules/zone-monitor.html +346 -0
  264. data/lib/rubyfox/server/data/www/{root → ROOT}/crossdomain.xml +0 -0
  265. data/lib/rubyfox/server/data/www/{root → ROOT}/examples/index.html +0 -0
  266. data/lib/rubyfox/server/data/www/{root → ROOT}/favicon.ico +0 -0
  267. data/lib/rubyfox/server/data/www/{root → ROOT}/favicon.png +0 -0
  268. data/lib/rubyfox/server/data/www/{root → ROOT}/index.html +0 -0
  269. data/lib/rubyfox/server/data/www/host-manager/META-INF/context.xml +24 -0
  270. data/lib/rubyfox/server/data/www/host-manager/WEB-INF/jsp/401.jsp +71 -0
  271. data/lib/rubyfox/server/data/www/host-manager/WEB-INF/jsp/403.jsp +90 -0
  272. data/lib/rubyfox/server/data/www/host-manager/WEB-INF/jsp/404.jsp +62 -0
  273. data/lib/rubyfox/server/data/www/host-manager/WEB-INF/web.xml +131 -0
  274. data/lib/rubyfox/server/data/www/host-manager/images/asf-logo.svg +226 -0
  275. data/lib/rubyfox/server/data/www/host-manager/images/tomcat.gif +0 -0
  276. data/lib/rubyfox/server/data/www/host-manager/index.jsp +18 -0
  277. data/lib/rubyfox/server/data/www/host-manager/manager.xml +26 -0
  278. data/lib/rubyfox/server/data/{logs → www/logsBackup}/.keep +0 -0
  279. data/lib/rubyfox/server/data/www/manager/META-INF/context.xml +24 -0
  280. data/lib/rubyfox/server/data/www/manager/WEB-INF/jsp/401.jsp +80 -0
  281. data/lib/rubyfox/server/data/www/manager/WEB-INF/jsp/403.jsp +100 -0
  282. data/lib/rubyfox/server/data/www/manager/WEB-INF/jsp/404.jsp +63 -0
  283. data/lib/rubyfox/server/data/www/manager/WEB-INF/jsp/connectorCerts.jsp +92 -0
  284. data/lib/rubyfox/server/data/www/manager/WEB-INF/jsp/connectorCiphers.jsp +92 -0
  285. data/lib/rubyfox/server/data/www/manager/WEB-INF/jsp/connectorTrustedCerts.jsp +92 -0
  286. data/lib/rubyfox/server/data/www/manager/WEB-INF/jsp/sessionDetail.jsp +197 -0
  287. data/lib/rubyfox/server/data/www/manager/WEB-INF/jsp/sessionsList.jsp +170 -0
  288. data/lib/rubyfox/server/data/www/manager/WEB-INF/web.xml +195 -0
  289. data/lib/rubyfox/server/data/www/manager/images/asf-logo.svg +226 -0
  290. data/lib/rubyfox/server/data/www/manager/images/tomcat.gif +0 -0
  291. data/lib/rubyfox/server/data/www/manager/index.jsp +18 -0
  292. data/lib/rubyfox/server/data/www/manager/status.xsd +84 -0
  293. data/lib/rubyfox/server/data/www/manager/xform.xsl +125 -0
  294. data/lib/rubyfox/server/version.rb +1 -1
  295. metadata +258 -298
  296. data/lib/rubyfox/server/data/config/ExtensionManagerLock.txt +0 -2
  297. data/lib/rubyfox/server/data/lib/Lib/reindex$py.class +0 -0
  298. data/lib/rubyfox/server/data/lib/jetty/VERSION.txt +0 -9320
  299. data/lib/rubyfox/server/data/lib/jetty/etc/README.spnego +0 -62
  300. data/lib/rubyfox/server/data/lib/jetty/etc/jamon.xml +0 -32
  301. data/lib/rubyfox/server/data/lib/jetty/etc/jdbcRealm.properties +0 -72
  302. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-alpn.xml +0 -32
  303. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-annotations.xml +0 -20
  304. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-cdi.xml +0 -19
  305. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-debug.xml +0 -36
  306. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-debuglog.xml +0 -25
  307. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-deploy.xml +0 -76
  308. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-gcloud-memcached-sessions.xml +0 -27
  309. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-gcloud-session-idmgr.xml +0 -19
  310. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-gcloud-sessions.xml +0 -27
  311. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-gzip.xml +0 -67
  312. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-http-forwarded.xml +0 -17
  313. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-http.xml +0 -47
  314. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-http2.xml +0 -26
  315. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-http2c.xml +0 -18
  316. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-https.xml +0 -29
  317. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-infinispan.xml +0 -39
  318. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-ipaccess.xml +0 -28
  319. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-jaas.xml +0 -16
  320. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-jdbc-sessions.xml +0 -34
  321. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-jmx-remote.xml +0 -40
  322. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-jmx.xml +0 -32
  323. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-logging.xml +0 -36
  324. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-lowresources.xml +0 -22
  325. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-monitor.xml +0 -30
  326. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-nosql.xml +0 -19
  327. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-plus.xml +0 -26
  328. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-proxy-protocol-ssl.xml +0 -10
  329. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-proxy-protocol.xml +0 -10
  330. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-proxy.xml +0 -35
  331. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-requestlog.xml +0 -30
  332. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-rewrite-customizer.xml +0 -17
  333. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-rewrite.xml +0 -31
  334. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-setuid.xml +0 -30
  335. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-spring.xml +0 -61
  336. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-ssl-context.xml +0 -29
  337. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-ssl.xml +0 -58
  338. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-started.xml +0 -15
  339. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-stats.xml +0 -18
  340. data/lib/rubyfox/server/data/lib/jetty/etc/jetty.conf +0 -12
  341. data/lib/rubyfox/server/data/lib/jetty/etc/jetty.xml +0 -195
  342. data/lib/rubyfox/server/data/lib/jetty/etc/jminix.xml +0 -12
  343. data/lib/rubyfox/server/data/lib/jetty/etc/jolokia.xml +0 -16
  344. data/lib/rubyfox/server/data/lib/jetty/etc/keystore +0 -0
  345. data/lib/rubyfox/server/data/lib/jetty/etc/krb5.ini +0 -23
  346. data/lib/rubyfox/server/data/lib/jetty/etc/rewrite-compactpath.xml +0 -10
  347. data/lib/rubyfox/server/data/lib/jetty/etc/spnego.conf +0 -19
  348. data/lib/rubyfox/server/data/lib/jetty/etc/spnego.properties +0 -1
  349. data/lib/rubyfox/server/data/lib/jetty/etc/webdefault.xml +0 -539
  350. data/lib/rubyfox/server/data/lib/jetty/lib/asm-5.0.1.jar +0 -0
  351. data/lib/rubyfox/server/data/lib/jetty/lib/asm-commons-5.0.1.jar +0 -0
  352. data/lib/rubyfox/server/data/lib/jetty/lib/fcgi/fcgi-client-9.3.11.v20160721.jar +0 -0
  353. data/lib/rubyfox/server/data/lib/jetty/lib/fcgi/fcgi-server-9.3.11.v20160721.jar +0 -0
  354. data/lib/rubyfox/server/data/lib/jetty/lib/http2-common-9.3.11.v20160721.jar +0 -0
  355. data/lib/rubyfox/server/data/lib/jetty/lib/http2-hpack-9.3.11.v20160721.jar +0 -0
  356. data/lib/rubyfox/server/data/lib/jetty/lib/http2-server-9.3.11.v20160721.jar +0 -0
  357. data/lib/rubyfox/server/data/lib/jetty/lib/jaspi/javax.security.auth.message-1.0.0.v201108011116.jar +0 -0
  358. data/lib/rubyfox/server/data/lib/jetty/lib/javax-websocket-client-impl-9.3.11.v20160721.jar +0 -0
  359. data/lib/rubyfox/server/data/lib/jetty/lib/javax-websocket-server-impl-9.3.11.v20160721.jar +0 -0
  360. data/lib/rubyfox/server/data/lib/jetty/lib/javax.annotation-api-1.2.jar +0 -0
  361. data/lib/rubyfox/server/data/lib/jetty/lib/javax.websocket-api-1.0.jar +0 -0
  362. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-alpn-server-9.3.11.v20160721.jar +0 -0
  363. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-annotations-9.3.11.v20160721.jar +0 -0
  364. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-client-9.3.11.v20160721.jar +0 -0
  365. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-continuation-9.3.11.v20160721.jar +0 -0
  366. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-deploy-9.3.11.v20160721.jar +0 -0
  367. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-gcloud-memcached-session-manager-9.3.11.v20160721.jar +0 -0
  368. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-gcloud-session-manager-9.3.11.v20160721.jar +0 -0
  369. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-http-9.3.11.v20160721.jar +0 -0
  370. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-infinispan-9.3.11.v20160721.jar +0 -0
  371. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-io-9.3.11.v20160721.jar +0 -0
  372. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-jaas-9.3.11.v20160721.jar +0 -0
  373. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-jaspi-9.3.11.v20160721.jar +0 -0
  374. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-jmx-9.3.11.v20160721.jar +0 -0
  375. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-jndi-9.3.11.v20160721.jar +0 -0
  376. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-nosql-9.3.11.v20160721.jar +0 -0
  377. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-plus-9.3.11.v20160721.jar +0 -0
  378. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-proxy-9.3.11.v20160721.jar +0 -0
  379. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-quickstart-9.3.11.v20160721.jar +0 -0
  380. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-rewrite-9.3.11.v20160721.jar +0 -0
  381. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-schemas-3.1.jar +0 -0
  382. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-security-9.3.11.v20160721.jar +0 -0
  383. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-server-9.3.11.v20160721.jar +0 -0
  384. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-servlet-9.3.11.v20160721.jar +0 -0
  385. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-servlets-9.3.11.v20160721.jar +0 -0
  386. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-util-9.3.11.v20160721.jar +0 -0
  387. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-webapp-9.3.11.v20160721.jar +0 -0
  388. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-xml-9.3.11.v20160721.jar +0 -0
  389. data/lib/rubyfox/server/data/lib/jetty/lib/jndi/javax.mail.glassfish-1.4.1.v201005082020.jar +0 -0
  390. data/lib/rubyfox/server/data/lib/jetty/lib/jndi/javax.transaction-api-1.2.jar +0 -0
  391. data/lib/rubyfox/server/data/lib/jetty/lib/monitor/jetty-monitor-9.3.11.v20160721.jar +0 -0
  392. data/lib/rubyfox/server/data/lib/jetty/lib/org.apache.taglibs.taglibs-standard-impl-1.2.5.jar +0 -0
  393. data/lib/rubyfox/server/data/lib/jetty/lib/org.apache.taglibs.taglibs-standard-spec-1.2.5.jar +0 -0
  394. data/lib/rubyfox/server/data/lib/jetty/lib/org.eclipse.jdt.core.compiler.ecj-4.4.2.jar +0 -0
  395. data/lib/rubyfox/server/data/lib/jetty/lib/org.eclipse.jetty.apache-jsp-9.3.11.v20160721.jar +0 -0
  396. data/lib/rubyfox/server/data/lib/jetty/lib/org.mortbay.jasper.apache-el-8.0.33.jar +0 -0
  397. data/lib/rubyfox/server/data/lib/jetty/lib/org.mortbay.jasper.apache-jsp-8.0.33.jar +0 -0
  398. data/lib/rubyfox/server/data/lib/jetty/lib/servlet-api-3.1.jar +0 -0
  399. data/lib/rubyfox/server/data/lib/jetty/lib/setuid/jetty-setuid-java-1.0.3.jar +0 -0
  400. data/lib/rubyfox/server/data/lib/jetty/lib/setuid/libsetuid-linux.so +0 -0
  401. data/lib/rubyfox/server/data/lib/jetty/lib/setuid/libsetuid-osx.so +0 -0
  402. data/lib/rubyfox/server/data/lib/jetty/lib/spring/jetty-spring-9.3.11.v20160721.jar +0 -0
  403. data/lib/rubyfox/server/data/lib/jetty/lib/start.jar +0 -0
  404. data/lib/rubyfox/server/data/lib/jetty/lib/websocket-api-9.3.11.v20160721.jar +0 -0
  405. data/lib/rubyfox/server/data/lib/jetty/lib/websocket-client-9.3.11.v20160721.jar +0 -0
  406. data/lib/rubyfox/server/data/lib/jetty/lib/websocket-common-9.3.11h.v20160721.jar +0 -0
  407. data/lib/rubyfox/server/data/lib/jetty/lib/websocket-server-9.3.11.v20160721.jar +0 -0
  408. data/lib/rubyfox/server/data/lib/jetty/lib/websocket-servlet-9.3.11.v20160721.jar +0 -0
  409. data/lib/rubyfox/server/data/lib/jetty/license-eplv10-aslv20.html +0 -576
  410. data/lib/rubyfox/server/data/lib/jetty/modules/.donotdelete +0 -0
  411. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0.mod +0 -8
  412. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_05.mod +0 -8
  413. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_101.mod +0 -8
  414. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_102.mod +0 -8
  415. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_11.mod +0 -8
  416. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_20.mod +0 -8
  417. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_25.mod +0 -8
  418. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_31.mod +0 -8
  419. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_40.mod +0 -8
  420. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_45.mod +0 -8
  421. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_51.mod +0 -8
  422. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_60.mod +0 -8
  423. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_65.mod +0 -8
  424. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_66.mod +0 -8
  425. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_71.mod +0 -8
  426. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_72.mod +0 -8
  427. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_73.mod +0 -8
  428. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_74.mod +0 -8
  429. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_77.mod +0 -8
  430. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_91.mod +0 -8
  431. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_92.mod +0 -8
  432. data/lib/rubyfox/server/data/lib/jetty/modules/alpn.mod +0 -53
  433. data/lib/rubyfox/server/data/lib/jetty/modules/annotations.mod +0 -17
  434. data/lib/rubyfox/server/data/lib/jetty/modules/apache-jsp.mod +0 -10
  435. data/lib/rubyfox/server/data/lib/jetty/modules/apache-jstl.mod +0 -9
  436. data/lib/rubyfox/server/data/lib/jetty/modules/cdi.mod +0 -39
  437. data/lib/rubyfox/server/data/lib/jetty/modules/client.mod +0 -6
  438. data/lib/rubyfox/server/data/lib/jetty/modules/continuation.mod +0 -6
  439. data/lib/rubyfox/server/data/lib/jetty/modules/debug.mod +0 -29
  440. data/lib/rubyfox/server/data/lib/jetty/modules/debuglog.mod +0 -25
  441. data/lib/rubyfox/server/data/lib/jetty/modules/deploy.mod +0 -31
  442. data/lib/rubyfox/server/data/lib/jetty/modules/ext.mod +0 -11
  443. data/lib/rubyfox/server/data/lib/jetty/modules/fcgi.mod +0 -15
  444. data/lib/rubyfox/server/data/lib/jetty/modules/gcloud-memcached-sessions.mod +0 -26
  445. data/lib/rubyfox/server/data/lib/jetty/modules/gcloud-session-idmgr.mod +0 -63
  446. data/lib/rubyfox/server/data/lib/jetty/modules/gcloud-sessions.mod +0 -11
  447. data/lib/rubyfox/server/data/lib/jetty/modules/gzip.mod +0 -23
  448. data/lib/rubyfox/server/data/lib/jetty/modules/hawtio.mod +0 -28
  449. data/lib/rubyfox/server/data/lib/jetty/modules/home-base-warning.mod +0 -7
  450. data/lib/rubyfox/server/data/lib/jetty/modules/http-forwarded.mod +0 -20
  451. data/lib/rubyfox/server/data/lib/jetty/modules/http.mod +0 -39
  452. data/lib/rubyfox/server/data/lib/jetty/modules/http2.mod +0 -20
  453. data/lib/rubyfox/server/data/lib/jetty/modules/http2c.mod +0 -22
  454. data/lib/rubyfox/server/data/lib/jetty/modules/https.mod +0 -14
  455. data/lib/rubyfox/server/data/lib/jetty/modules/infinispan.mod +0 -33
  456. data/lib/rubyfox/server/data/lib/jetty/modules/ipaccess.mod +0 -9
  457. data/lib/rubyfox/server/data/lib/jetty/modules/jaas.mod +0 -17
  458. data/lib/rubyfox/server/data/lib/jetty/modules/jamon.mod +0 -31
  459. data/lib/rubyfox/server/data/lib/jetty/modules/jaspi.mod +0 -10
  460. data/lib/rubyfox/server/data/lib/jetty/modules/jdbc-sessions.mod +0 -27
  461. data/lib/rubyfox/server/data/lib/jetty/modules/jminix.mod +0 -41
  462. data/lib/rubyfox/server/data/lib/jetty/modules/jmx-remote.mod +0 -16
  463. data/lib/rubyfox/server/data/lib/jetty/modules/jmx.mod +0 -13
  464. data/lib/rubyfox/server/data/lib/jetty/modules/jndi.mod +0 -11
  465. data/lib/rubyfox/server/data/lib/jetty/modules/jolokia.mod +0 -19
  466. data/lib/rubyfox/server/data/lib/jetty/modules/jsp.mod +0 -9
  467. data/lib/rubyfox/server/data/lib/jetty/modules/jstl.mod +0 -8
  468. data/lib/rubyfox/server/data/lib/jetty/modules/jvm.mod +0 -22
  469. data/lib/rubyfox/server/data/lib/jetty/modules/logging.mod +0 -36
  470. data/lib/rubyfox/server/data/lib/jetty/modules/lowresources.mod +0 -28
  471. data/lib/rubyfox/server/data/lib/jetty/modules/monitor.mod +0 -13
  472. data/lib/rubyfox/server/data/lib/jetty/modules/nosql.mod +0 -31
  473. data/lib/rubyfox/server/data/lib/jetty/modules/plus.mod +0 -15
  474. data/lib/rubyfox/server/data/lib/jetty/modules/proxy-protocol-ssl.mod +0 -9
  475. data/lib/rubyfox/server/data/lib/jetty/modules/proxy-protocol.mod +0 -9
  476. data/lib/rubyfox/server/data/lib/jetty/modules/proxy.mod +0 -22
  477. data/lib/rubyfox/server/data/lib/jetty/modules/quickstart.mod +0 -11
  478. data/lib/rubyfox/server/data/lib/jetty/modules/requestlog.mod +0 -40
  479. data/lib/rubyfox/server/data/lib/jetty/modules/resources.mod +0 -10
  480. data/lib/rubyfox/server/data/lib/jetty/modules/rewrite-compactpath.mod +0 -10
  481. data/lib/rubyfox/server/data/lib/jetty/modules/rewrite-customizer.mod +0 -24
  482. data/lib/rubyfox/server/data/lib/jetty/modules/rewrite.mod +0 -23
  483. data/lib/rubyfox/server/data/lib/jetty/modules/security.mod +0 -9
  484. data/lib/rubyfox/server/data/lib/jetty/modules/server.mod +0 -79
  485. data/lib/rubyfox/server/data/lib/jetty/modules/servlet.mod +0 -9
  486. data/lib/rubyfox/server/data/lib/jetty/modules/servlets.mod +0 -11
  487. data/lib/rubyfox/server/data/lib/jetty/modules/setuid.mod +0 -19
  488. data/lib/rubyfox/server/data/lib/jetty/modules/spring.mod +0 -17
  489. data/lib/rubyfox/server/data/lib/jetty/modules/ssl.mod +0 -97
  490. data/lib/rubyfox/server/data/lib/jetty/modules/stats.mod +0 -9
  491. data/lib/rubyfox/server/data/lib/jetty/modules/webapp.mod +0 -10
  492. data/lib/rubyfox/server/data/lib/jetty/modules/websocket.mod +0 -12
  493. data/lib/rubyfox/server/data/lib/jetty/notice.html +0 -111
  494. data/lib/rubyfox/server/data/lib/jetty/start.d/README.TXT +0 -24
  495. data/lib/rubyfox/server/data/lib/jetty/start.d/http.ini +0 -7
  496. data/lib/rubyfox/server/data/lib/jetty/start.d/https.ini +0 -10
  497. data/lib/rubyfox/server/data/lib/jetty/start.d/ssl.ini +0 -19
  498. data/lib/rubyfox/server/data/lib/jetty/start.ini +0 -83
  499. data/lib/rubyfox/server/data/www/.keep +0 -0
  500. data/lib/rubyfox/server/data/www/HelloServlet/META-INF/context.xml +0 -2
  501. data/lib/rubyfox/server/data/www/PyServletExample/MyModule$py.class +0 -0
  502. data/lib/rubyfox/server/data/www/PyServletExample/MyModule.py +0 -5
  503. data/lib/rubyfox/server/data/www/PyServletExample/WEB-INF/web.xml +0 -37
  504. data/lib/rubyfox/server/data/www/PyServletExample/errors/404.htm +0 -20
  505. data/lib/rubyfox/server/data/www/PyServletExample/index.py +0 -42
  506. data/lib/rubyfox/server/data/www/root/admin/.keep +0 -0
  507. data/lib/rubyfox/server/data/www/root/admin/AdminTool.swf +0 -0
  508. data/lib/rubyfox/server/data/www/root/admin/ReleaseNotes.txt +0 -192
  509. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/adobeFlashPlayer.png +0 -0
  510. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/advanced.png +0 -0
  511. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/analytics.png +0 -0
  512. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/banManager.png +0 -0
  513. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/bannedIPs.png +0 -0
  514. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/bannedUsernames.png +0 -0
  515. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/bookmarks.png +0 -0
  516. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/bootLog.png +0 -0
  517. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/buddyList.png +0 -0
  518. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/buddyProperties.png +0 -0
  519. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/connection.png +0 -0
  520. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/databaseManager.png +0 -0
  521. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/floodFilter.png +0 -0
  522. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/gameSettings.png +0 -0
  523. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/general.png +0 -0
  524. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/globalServerStatus.png +0 -0
  525. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/hTML5WebSockets.png +0 -0
  526. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/iPDiscovery.png +0 -0
  527. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/iPFilter.png +0 -0
  528. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/jVMSettings.png +0 -0
  529. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/logsDownload.png +0 -0
  530. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/mMOSettings.png +0 -0
  531. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/mailer.png +0 -0
  532. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/permissionsAndEvents.png +0 -0
  533. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/privilegeManager.png +0 -0
  534. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/remoteAdmin.png +0 -0
  535. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/roomExtension.png +0 -0
  536. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/roomVariables.png +0 -0
  537. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/roomsAndGroups.png +0 -0
  538. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/runtimeLog.png +0 -0
  539. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/runtimeRoomSettings.png +0 -0
  540. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/runtimeUserSettings.png +0 -0
  541. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/runtimeZoneSettings.png +0 -0
  542. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/statsApplication.png +0 -0
  543. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/statsDemographics.png +0 -0
  544. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/statsExceptions.png +0 -0
  545. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/statsOverview.png +0 -0
  546. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/statsTechnology.png +0 -0
  547. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/systemQueueStatus.png +0 -0
  548. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/threadPools.png +0 -0
  549. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/userManagement.png +0 -0
  550. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/userVariables.png +0 -0
  551. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/webServer.png +0 -0
  552. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/wordsFilter.png +0 -0
  553. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/zoneExtension.png +0 -0
  554. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/zoneTraffic.png +0 -0
  555. data/lib/rubyfox/server/data/www/root/admin/expressInstall.swf +0 -0
  556. data/lib/rubyfox/server/data/www/root/admin/index.html +0 -124
  557. data/lib/rubyfox/server/data/www/root/admin/modules/Analytics.swf +0 -0
  558. data/lib/rubyfox/server/data/www/root/admin/modules/BanManager.swf +0 -0
  559. data/lib/rubyfox/server/data/www/root/admin/modules/BlueBoxMonitor.swf +0 -0
  560. data/lib/rubyfox/server/data/www/root/admin/modules/Console.swf +0 -0
  561. data/lib/rubyfox/server/data/www/root/admin/modules/Dashboard.swf +0 -0
  562. data/lib/rubyfox/server/data/www/root/admin/modules/ExtensionManager.swf +0 -0
  563. data/lib/rubyfox/server/data/www/root/admin/modules/LicenseManager.swf +0 -0
  564. data/lib/rubyfox/server/data/www/root/admin/modules/LogViewer.swf +0 -0
  565. data/lib/rubyfox/server/data/www/root/admin/modules/ServerConfigurator.swf +0 -0
  566. data/lib/rubyfox/server/data/www/root/admin/modules/ZoneConfigurator.swf +0 -0
  567. data/lib/rubyfox/server/data/www/root/admin/modules/ZoneMonitor.swf +0 -0
  568. data/lib/rubyfox/server/data/www/root/admin/swfobject.js +0 -4
  569. data/lib/rubyfox/server/data/www/root/examples/.keep +0 -0
  570. data/lib/rubyfox/server/data/www/sfs2x-ws.war +0 -0
  571. data/lib/rubyfox/server/data/www/sfs2x-ws.xml +0 -30
  572. data/lib/rubyfox/server/data/zones/BasicExamples.zone.xml +0 -147
@@ -0,0 +1,1221 @@
1
+ /*! (c) gotoAndPlay | All rights reserved */
2
+ (window["webpackJsonpapplication"] = window["webpackJsonpapplication"] || []).push([["module-8"],{
3
+
4
+ /***/ "./node_modules/file-saver/dist/FileSaver.min.js":
5
+ /*!*******************************************************!*\
6
+ !*** ./node_modules/file-saver/dist/FileSaver.min.js ***!
7
+ \*******************************************************/
8
+ /*! no static exports found */
9
+ /***/ (function(module, exports, __webpack_require__) {
10
+
11
+ /* WEBPACK VAR INJECTION */(function(global) {var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;(function(a,b){if(true)!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_FACTORY__ = (b),
12
+ __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
13
+ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
14
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));else {}})(this,function(){"use strict";function b(a,b){return"undefined"==typeof b?b={autoBom:!1}:"object"!=typeof b&&(console.warn("Deprecated: Expected third argument to be a object"),b={autoBom:!b}),b.autoBom&&/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(a.type)?new Blob(["\uFEFF",a],{type:a.type}):a}function c(b,c,d){var e=new XMLHttpRequest;e.open("GET",b),e.responseType="blob",e.onload=function(){a(e.response,c,d)},e.onerror=function(){console.error("could not download file")},e.send()}function d(a){var b=new XMLHttpRequest;b.open("HEAD",a,!1);try{b.send()}catch(a){}return 200<=b.status&&299>=b.status}function e(a){try{a.dispatchEvent(new MouseEvent("click"))}catch(c){var b=document.createEvent("MouseEvents");b.initMouseEvent("click",!0,!0,window,0,0,0,80,20,!1,!1,!1,!1,0,null),a.dispatchEvent(b)}}var f="object"==typeof window&&window.window===window?window:"object"==typeof self&&self.self===self?self:"object"==typeof global&&global.global===global?global:void 0,a=f.saveAs||("object"!=typeof window||window!==f?function(){}:"download"in HTMLAnchorElement.prototype?function(b,g,h){var i=f.URL||f.webkitURL,j=document.createElement("a");g=g||b.name||"download",j.download=g,j.rel="noopener","string"==typeof b?(j.href=b,j.origin===location.origin?e(j):d(j.href)?c(b,g,h):e(j,j.target="_blank")):(j.href=i.createObjectURL(b),setTimeout(function(){i.revokeObjectURL(j.href)},4E4),setTimeout(function(){e(j)},0))}:"msSaveOrOpenBlob"in navigator?function(f,g,h){if(g=g||f.name||"download","string"!=typeof f)navigator.msSaveOrOpenBlob(b(f,h),g);else if(d(f))c(f,g,h);else{var i=document.createElement("a");i.href=f,i.target="_blank",setTimeout(function(){e(i)})}}:function(a,b,d,e){if(e=e||open("","_blank"),e&&(e.document.title=e.document.body.innerText="downloading..."),"string"==typeof a)return c(a,b,d);var g="application/octet-stream"===a.type,h=/constructor/i.test(f.HTMLElement)||f.safari,i=/CriOS\/[\d]+/.test(navigator.userAgent);if((i||g&&h)&&"object"==typeof FileReader){var j=new FileReader;j.onloadend=function(){var a=j.result;a=i?a:a.replace(/^data:[^;]*;/,"data:attachment/file;"),e?e.location.href=a:location=a,e=null},j.readAsDataURL(a)}else{var k=f.URL||f.webkitURL,l=k.createObjectURL(a);e?e.location=l:location.href=l,e=null,setTimeout(function(){k.revokeObjectURL(l)},4E4)}});f.saveAs=a.saveAs=a, true&&(module.exports=a)});
15
+
16
+ //# sourceMappingURL=FileSaver.min.js.map
17
+ /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js")))
18
+
19
+ /***/ }),
20
+
21
+ /***/ "./node_modules/moment/locale sync recursive ^\\.\\/.*$":
22
+ /*!**************************************************!*\
23
+ !*** ./node_modules/moment/locale sync ^\.\/.*$ ***!
24
+ \**************************************************/
25
+ /*! no static exports found */
26
+ /***/ (function(module, exports, __webpack_require__) {
27
+
28
+ var map = {
29
+ "./af": "./node_modules/moment/locale/af.js",
30
+ "./af.js": "./node_modules/moment/locale/af.js",
31
+ "./ar": "./node_modules/moment/locale/ar.js",
32
+ "./ar-dz": "./node_modules/moment/locale/ar-dz.js",
33
+ "./ar-dz.js": "./node_modules/moment/locale/ar-dz.js",
34
+ "./ar-kw": "./node_modules/moment/locale/ar-kw.js",
35
+ "./ar-kw.js": "./node_modules/moment/locale/ar-kw.js",
36
+ "./ar-ly": "./node_modules/moment/locale/ar-ly.js",
37
+ "./ar-ly.js": "./node_modules/moment/locale/ar-ly.js",
38
+ "./ar-ma": "./node_modules/moment/locale/ar-ma.js",
39
+ "./ar-ma.js": "./node_modules/moment/locale/ar-ma.js",
40
+ "./ar-sa": "./node_modules/moment/locale/ar-sa.js",
41
+ "./ar-sa.js": "./node_modules/moment/locale/ar-sa.js",
42
+ "./ar-tn": "./node_modules/moment/locale/ar-tn.js",
43
+ "./ar-tn.js": "./node_modules/moment/locale/ar-tn.js",
44
+ "./ar.js": "./node_modules/moment/locale/ar.js",
45
+ "./az": "./node_modules/moment/locale/az.js",
46
+ "./az.js": "./node_modules/moment/locale/az.js",
47
+ "./be": "./node_modules/moment/locale/be.js",
48
+ "./be.js": "./node_modules/moment/locale/be.js",
49
+ "./bg": "./node_modules/moment/locale/bg.js",
50
+ "./bg.js": "./node_modules/moment/locale/bg.js",
51
+ "./bm": "./node_modules/moment/locale/bm.js",
52
+ "./bm.js": "./node_modules/moment/locale/bm.js",
53
+ "./bn": "./node_modules/moment/locale/bn.js",
54
+ "./bn.js": "./node_modules/moment/locale/bn.js",
55
+ "./bo": "./node_modules/moment/locale/bo.js",
56
+ "./bo.js": "./node_modules/moment/locale/bo.js",
57
+ "./br": "./node_modules/moment/locale/br.js",
58
+ "./br.js": "./node_modules/moment/locale/br.js",
59
+ "./bs": "./node_modules/moment/locale/bs.js",
60
+ "./bs.js": "./node_modules/moment/locale/bs.js",
61
+ "./ca": "./node_modules/moment/locale/ca.js",
62
+ "./ca.js": "./node_modules/moment/locale/ca.js",
63
+ "./cs": "./node_modules/moment/locale/cs.js",
64
+ "./cs.js": "./node_modules/moment/locale/cs.js",
65
+ "./cv": "./node_modules/moment/locale/cv.js",
66
+ "./cv.js": "./node_modules/moment/locale/cv.js",
67
+ "./cy": "./node_modules/moment/locale/cy.js",
68
+ "./cy.js": "./node_modules/moment/locale/cy.js",
69
+ "./da": "./node_modules/moment/locale/da.js",
70
+ "./da.js": "./node_modules/moment/locale/da.js",
71
+ "./de": "./node_modules/moment/locale/de.js",
72
+ "./de-at": "./node_modules/moment/locale/de-at.js",
73
+ "./de-at.js": "./node_modules/moment/locale/de-at.js",
74
+ "./de-ch": "./node_modules/moment/locale/de-ch.js",
75
+ "./de-ch.js": "./node_modules/moment/locale/de-ch.js",
76
+ "./de.js": "./node_modules/moment/locale/de.js",
77
+ "./dv": "./node_modules/moment/locale/dv.js",
78
+ "./dv.js": "./node_modules/moment/locale/dv.js",
79
+ "./el": "./node_modules/moment/locale/el.js",
80
+ "./el.js": "./node_modules/moment/locale/el.js",
81
+ "./en-SG": "./node_modules/moment/locale/en-SG.js",
82
+ "./en-SG.js": "./node_modules/moment/locale/en-SG.js",
83
+ "./en-au": "./node_modules/moment/locale/en-au.js",
84
+ "./en-au.js": "./node_modules/moment/locale/en-au.js",
85
+ "./en-ca": "./node_modules/moment/locale/en-ca.js",
86
+ "./en-ca.js": "./node_modules/moment/locale/en-ca.js",
87
+ "./en-gb": "./node_modules/moment/locale/en-gb.js",
88
+ "./en-gb.js": "./node_modules/moment/locale/en-gb.js",
89
+ "./en-ie": "./node_modules/moment/locale/en-ie.js",
90
+ "./en-ie.js": "./node_modules/moment/locale/en-ie.js",
91
+ "./en-il": "./node_modules/moment/locale/en-il.js",
92
+ "./en-il.js": "./node_modules/moment/locale/en-il.js",
93
+ "./en-nz": "./node_modules/moment/locale/en-nz.js",
94
+ "./en-nz.js": "./node_modules/moment/locale/en-nz.js",
95
+ "./eo": "./node_modules/moment/locale/eo.js",
96
+ "./eo.js": "./node_modules/moment/locale/eo.js",
97
+ "./es": "./node_modules/moment/locale/es.js",
98
+ "./es-do": "./node_modules/moment/locale/es-do.js",
99
+ "./es-do.js": "./node_modules/moment/locale/es-do.js",
100
+ "./es-us": "./node_modules/moment/locale/es-us.js",
101
+ "./es-us.js": "./node_modules/moment/locale/es-us.js",
102
+ "./es.js": "./node_modules/moment/locale/es.js",
103
+ "./et": "./node_modules/moment/locale/et.js",
104
+ "./et.js": "./node_modules/moment/locale/et.js",
105
+ "./eu": "./node_modules/moment/locale/eu.js",
106
+ "./eu.js": "./node_modules/moment/locale/eu.js",
107
+ "./fa": "./node_modules/moment/locale/fa.js",
108
+ "./fa.js": "./node_modules/moment/locale/fa.js",
109
+ "./fi": "./node_modules/moment/locale/fi.js",
110
+ "./fi.js": "./node_modules/moment/locale/fi.js",
111
+ "./fo": "./node_modules/moment/locale/fo.js",
112
+ "./fo.js": "./node_modules/moment/locale/fo.js",
113
+ "./fr": "./node_modules/moment/locale/fr.js",
114
+ "./fr-ca": "./node_modules/moment/locale/fr-ca.js",
115
+ "./fr-ca.js": "./node_modules/moment/locale/fr-ca.js",
116
+ "./fr-ch": "./node_modules/moment/locale/fr-ch.js",
117
+ "./fr-ch.js": "./node_modules/moment/locale/fr-ch.js",
118
+ "./fr.js": "./node_modules/moment/locale/fr.js",
119
+ "./fy": "./node_modules/moment/locale/fy.js",
120
+ "./fy.js": "./node_modules/moment/locale/fy.js",
121
+ "./ga": "./node_modules/moment/locale/ga.js",
122
+ "./ga.js": "./node_modules/moment/locale/ga.js",
123
+ "./gd": "./node_modules/moment/locale/gd.js",
124
+ "./gd.js": "./node_modules/moment/locale/gd.js",
125
+ "./gl": "./node_modules/moment/locale/gl.js",
126
+ "./gl.js": "./node_modules/moment/locale/gl.js",
127
+ "./gom-latn": "./node_modules/moment/locale/gom-latn.js",
128
+ "./gom-latn.js": "./node_modules/moment/locale/gom-latn.js",
129
+ "./gu": "./node_modules/moment/locale/gu.js",
130
+ "./gu.js": "./node_modules/moment/locale/gu.js",
131
+ "./he": "./node_modules/moment/locale/he.js",
132
+ "./he.js": "./node_modules/moment/locale/he.js",
133
+ "./hi": "./node_modules/moment/locale/hi.js",
134
+ "./hi.js": "./node_modules/moment/locale/hi.js",
135
+ "./hr": "./node_modules/moment/locale/hr.js",
136
+ "./hr.js": "./node_modules/moment/locale/hr.js",
137
+ "./hu": "./node_modules/moment/locale/hu.js",
138
+ "./hu.js": "./node_modules/moment/locale/hu.js",
139
+ "./hy-am": "./node_modules/moment/locale/hy-am.js",
140
+ "./hy-am.js": "./node_modules/moment/locale/hy-am.js",
141
+ "./id": "./node_modules/moment/locale/id.js",
142
+ "./id.js": "./node_modules/moment/locale/id.js",
143
+ "./is": "./node_modules/moment/locale/is.js",
144
+ "./is.js": "./node_modules/moment/locale/is.js",
145
+ "./it": "./node_modules/moment/locale/it.js",
146
+ "./it-ch": "./node_modules/moment/locale/it-ch.js",
147
+ "./it-ch.js": "./node_modules/moment/locale/it-ch.js",
148
+ "./it.js": "./node_modules/moment/locale/it.js",
149
+ "./ja": "./node_modules/moment/locale/ja.js",
150
+ "./ja.js": "./node_modules/moment/locale/ja.js",
151
+ "./jv": "./node_modules/moment/locale/jv.js",
152
+ "./jv.js": "./node_modules/moment/locale/jv.js",
153
+ "./ka": "./node_modules/moment/locale/ka.js",
154
+ "./ka.js": "./node_modules/moment/locale/ka.js",
155
+ "./kk": "./node_modules/moment/locale/kk.js",
156
+ "./kk.js": "./node_modules/moment/locale/kk.js",
157
+ "./km": "./node_modules/moment/locale/km.js",
158
+ "./km.js": "./node_modules/moment/locale/km.js",
159
+ "./kn": "./node_modules/moment/locale/kn.js",
160
+ "./kn.js": "./node_modules/moment/locale/kn.js",
161
+ "./ko": "./node_modules/moment/locale/ko.js",
162
+ "./ko.js": "./node_modules/moment/locale/ko.js",
163
+ "./ku": "./node_modules/moment/locale/ku.js",
164
+ "./ku.js": "./node_modules/moment/locale/ku.js",
165
+ "./ky": "./node_modules/moment/locale/ky.js",
166
+ "./ky.js": "./node_modules/moment/locale/ky.js",
167
+ "./lb": "./node_modules/moment/locale/lb.js",
168
+ "./lb.js": "./node_modules/moment/locale/lb.js",
169
+ "./lo": "./node_modules/moment/locale/lo.js",
170
+ "./lo.js": "./node_modules/moment/locale/lo.js",
171
+ "./lt": "./node_modules/moment/locale/lt.js",
172
+ "./lt.js": "./node_modules/moment/locale/lt.js",
173
+ "./lv": "./node_modules/moment/locale/lv.js",
174
+ "./lv.js": "./node_modules/moment/locale/lv.js",
175
+ "./me": "./node_modules/moment/locale/me.js",
176
+ "./me.js": "./node_modules/moment/locale/me.js",
177
+ "./mi": "./node_modules/moment/locale/mi.js",
178
+ "./mi.js": "./node_modules/moment/locale/mi.js",
179
+ "./mk": "./node_modules/moment/locale/mk.js",
180
+ "./mk.js": "./node_modules/moment/locale/mk.js",
181
+ "./ml": "./node_modules/moment/locale/ml.js",
182
+ "./ml.js": "./node_modules/moment/locale/ml.js",
183
+ "./mn": "./node_modules/moment/locale/mn.js",
184
+ "./mn.js": "./node_modules/moment/locale/mn.js",
185
+ "./mr": "./node_modules/moment/locale/mr.js",
186
+ "./mr.js": "./node_modules/moment/locale/mr.js",
187
+ "./ms": "./node_modules/moment/locale/ms.js",
188
+ "./ms-my": "./node_modules/moment/locale/ms-my.js",
189
+ "./ms-my.js": "./node_modules/moment/locale/ms-my.js",
190
+ "./ms.js": "./node_modules/moment/locale/ms.js",
191
+ "./mt": "./node_modules/moment/locale/mt.js",
192
+ "./mt.js": "./node_modules/moment/locale/mt.js",
193
+ "./my": "./node_modules/moment/locale/my.js",
194
+ "./my.js": "./node_modules/moment/locale/my.js",
195
+ "./nb": "./node_modules/moment/locale/nb.js",
196
+ "./nb.js": "./node_modules/moment/locale/nb.js",
197
+ "./ne": "./node_modules/moment/locale/ne.js",
198
+ "./ne.js": "./node_modules/moment/locale/ne.js",
199
+ "./nl": "./node_modules/moment/locale/nl.js",
200
+ "./nl-be": "./node_modules/moment/locale/nl-be.js",
201
+ "./nl-be.js": "./node_modules/moment/locale/nl-be.js",
202
+ "./nl.js": "./node_modules/moment/locale/nl.js",
203
+ "./nn": "./node_modules/moment/locale/nn.js",
204
+ "./nn.js": "./node_modules/moment/locale/nn.js",
205
+ "./pa-in": "./node_modules/moment/locale/pa-in.js",
206
+ "./pa-in.js": "./node_modules/moment/locale/pa-in.js",
207
+ "./pl": "./node_modules/moment/locale/pl.js",
208
+ "./pl.js": "./node_modules/moment/locale/pl.js",
209
+ "./pt": "./node_modules/moment/locale/pt.js",
210
+ "./pt-br": "./node_modules/moment/locale/pt-br.js",
211
+ "./pt-br.js": "./node_modules/moment/locale/pt-br.js",
212
+ "./pt.js": "./node_modules/moment/locale/pt.js",
213
+ "./ro": "./node_modules/moment/locale/ro.js",
214
+ "./ro.js": "./node_modules/moment/locale/ro.js",
215
+ "./ru": "./node_modules/moment/locale/ru.js",
216
+ "./ru.js": "./node_modules/moment/locale/ru.js",
217
+ "./sd": "./node_modules/moment/locale/sd.js",
218
+ "./sd.js": "./node_modules/moment/locale/sd.js",
219
+ "./se": "./node_modules/moment/locale/se.js",
220
+ "./se.js": "./node_modules/moment/locale/se.js",
221
+ "./si": "./node_modules/moment/locale/si.js",
222
+ "./si.js": "./node_modules/moment/locale/si.js",
223
+ "./sk": "./node_modules/moment/locale/sk.js",
224
+ "./sk.js": "./node_modules/moment/locale/sk.js",
225
+ "./sl": "./node_modules/moment/locale/sl.js",
226
+ "./sl.js": "./node_modules/moment/locale/sl.js",
227
+ "./sq": "./node_modules/moment/locale/sq.js",
228
+ "./sq.js": "./node_modules/moment/locale/sq.js",
229
+ "./sr": "./node_modules/moment/locale/sr.js",
230
+ "./sr-cyrl": "./node_modules/moment/locale/sr-cyrl.js",
231
+ "./sr-cyrl.js": "./node_modules/moment/locale/sr-cyrl.js",
232
+ "./sr.js": "./node_modules/moment/locale/sr.js",
233
+ "./ss": "./node_modules/moment/locale/ss.js",
234
+ "./ss.js": "./node_modules/moment/locale/ss.js",
235
+ "./sv": "./node_modules/moment/locale/sv.js",
236
+ "./sv.js": "./node_modules/moment/locale/sv.js",
237
+ "./sw": "./node_modules/moment/locale/sw.js",
238
+ "./sw.js": "./node_modules/moment/locale/sw.js",
239
+ "./ta": "./node_modules/moment/locale/ta.js",
240
+ "./ta.js": "./node_modules/moment/locale/ta.js",
241
+ "./te": "./node_modules/moment/locale/te.js",
242
+ "./te.js": "./node_modules/moment/locale/te.js",
243
+ "./tet": "./node_modules/moment/locale/tet.js",
244
+ "./tet.js": "./node_modules/moment/locale/tet.js",
245
+ "./tg": "./node_modules/moment/locale/tg.js",
246
+ "./tg.js": "./node_modules/moment/locale/tg.js",
247
+ "./th": "./node_modules/moment/locale/th.js",
248
+ "./th.js": "./node_modules/moment/locale/th.js",
249
+ "./tl-ph": "./node_modules/moment/locale/tl-ph.js",
250
+ "./tl-ph.js": "./node_modules/moment/locale/tl-ph.js",
251
+ "./tlh": "./node_modules/moment/locale/tlh.js",
252
+ "./tlh.js": "./node_modules/moment/locale/tlh.js",
253
+ "./tr": "./node_modules/moment/locale/tr.js",
254
+ "./tr.js": "./node_modules/moment/locale/tr.js",
255
+ "./tzl": "./node_modules/moment/locale/tzl.js",
256
+ "./tzl.js": "./node_modules/moment/locale/tzl.js",
257
+ "./tzm": "./node_modules/moment/locale/tzm.js",
258
+ "./tzm-latn": "./node_modules/moment/locale/tzm-latn.js",
259
+ "./tzm-latn.js": "./node_modules/moment/locale/tzm-latn.js",
260
+ "./tzm.js": "./node_modules/moment/locale/tzm.js",
261
+ "./ug-cn": "./node_modules/moment/locale/ug-cn.js",
262
+ "./ug-cn.js": "./node_modules/moment/locale/ug-cn.js",
263
+ "./uk": "./node_modules/moment/locale/uk.js",
264
+ "./uk.js": "./node_modules/moment/locale/uk.js",
265
+ "./ur": "./node_modules/moment/locale/ur.js",
266
+ "./ur.js": "./node_modules/moment/locale/ur.js",
267
+ "./uz": "./node_modules/moment/locale/uz.js",
268
+ "./uz-latn": "./node_modules/moment/locale/uz-latn.js",
269
+ "./uz-latn.js": "./node_modules/moment/locale/uz-latn.js",
270
+ "./uz.js": "./node_modules/moment/locale/uz.js",
271
+ "./vi": "./node_modules/moment/locale/vi.js",
272
+ "./vi.js": "./node_modules/moment/locale/vi.js",
273
+ "./x-pseudo": "./node_modules/moment/locale/x-pseudo.js",
274
+ "./x-pseudo.js": "./node_modules/moment/locale/x-pseudo.js",
275
+ "./yo": "./node_modules/moment/locale/yo.js",
276
+ "./yo.js": "./node_modules/moment/locale/yo.js",
277
+ "./zh-cn": "./node_modules/moment/locale/zh-cn.js",
278
+ "./zh-cn.js": "./node_modules/moment/locale/zh-cn.js",
279
+ "./zh-hk": "./node_modules/moment/locale/zh-hk.js",
280
+ "./zh-hk.js": "./node_modules/moment/locale/zh-hk.js",
281
+ "./zh-tw": "./node_modules/moment/locale/zh-tw.js",
282
+ "./zh-tw.js": "./node_modules/moment/locale/zh-tw.js"
283
+ };
284
+
285
+
286
+ function webpackContext(req) {
287
+ var id = webpackContextResolve(req);
288
+ return __webpack_require__(id);
289
+ }
290
+ function webpackContextResolve(req) {
291
+ if(!__webpack_require__.o(map, req)) {
292
+ var e = new Error("Cannot find module '" + req + "'");
293
+ e.code = 'MODULE_NOT_FOUND';
294
+ throw e;
295
+ }
296
+ return map[req];
297
+ }
298
+ webpackContext.keys = function webpackContextKeys() {
299
+ return Object.keys(map);
300
+ };
301
+ webpackContext.resolve = webpackContextResolve;
302
+ module.exports = webpackContext;
303
+ webpackContext.id = "./node_modules/moment/locale sync recursive ^\\.\\/.*$";
304
+
305
+ /***/ }),
306
+
307
+ /***/ "./node_modules/webpack/buildin/global.js":
308
+ /*!***********************************!*\
309
+ !*** (webpack)/buildin/global.js ***!
310
+ \***********************************/
311
+ /*! no static exports found */
312
+ /***/ (function(module, exports) {
313
+
314
+ var g;
315
+
316
+ // This works in non-strict mode
317
+ g = (function() {
318
+ return this;
319
+ })();
320
+
321
+ try {
322
+ // This works if eval is allowed (see CSP)
323
+ g = g || new Function("return this")();
324
+ } catch (e) {
325
+ // This works if the window reference is available
326
+ if (typeof window === "object") g = window;
327
+ }
328
+
329
+ // g can still be undefined, but nothing to do about it...
330
+ // We return undefined, instead of nothing here, so it's
331
+ // easier to handle this case. if(!global) { ...}
332
+
333
+ module.exports = g;
334
+
335
+
336
+ /***/ }),
337
+
338
+ /***/ "./src/data/runtime-log-entry.js":
339
+ /*!***************************************!*\
340
+ !*** ./src/data/runtime-log-entry.js ***!
341
+ \***************************************/
342
+ /*! exports provided: RuntimeLogEntry */
343
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
344
+
345
+ "use strict";
346
+ __webpack_require__.r(__webpack_exports__);
347
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RuntimeLogEntry", function() { return RuntimeLogEntry; });
348
+ class RuntimeLogEntry
349
+ {
350
+ constructor(separator)
351
+ {
352
+ this.sep = separator
353
+ }
354
+
355
+ static fromArray(separator, logEntryData)
356
+ {
357
+ let rle = new RuntimeLogEntry(separator);
358
+
359
+ rle.date = logEntryData[0];
360
+ rle.time = logEntryData[1];
361
+ rle.dateTime = rle._getDateTime();
362
+ rle.level = logEntryData[2].trim();
363
+ rle.thread = logEntryData[3];
364
+ rle.clazz = logEntryData[4];
365
+ rle.message = logEntryData[6];
366
+
367
+ return rle;
368
+ }
369
+
370
+ _getDateTime()
371
+ {
372
+ return this.date + '\n' + this.time;
373
+ }
374
+ }
375
+
376
+
377
+ /***/ }),
378
+
379
+ /***/ "./src/modules/log-viewer.js":
380
+ /*!***********************************!*\
381
+ !*** ./src/modules/log-viewer.js ***!
382
+ \***********************************/
383
+ /*! exports provided: default */
384
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
385
+
386
+ "use strict";
387
+ __webpack_require__.r(__webpack_exports__);
388
+ /* WEBPACK VAR INJECTION */(function($) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return LogViewer; });
389
+ /* harmony import */ var _base_module__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./base-module */ "./src/modules/base-module.js");
390
+ /* harmony import */ var _data_runtime_log_entry__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../data/runtime-log-entry */ "./src/data/runtime-log-entry.js");
391
+ /* harmony import */ var file_saver__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! file-saver */ "./node_modules/file-saver/dist/FileSaver.min.js");
392
+ /* harmony import */ var file_saver__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(file_saver__WEBPACK_IMPORTED_MODULE_2__);
393
+ /* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! moment */ "./node_modules/moment/moment.js");
394
+ /* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_3__);
395
+ /* harmony import */ var _utils_utilities__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/utilities */ "./src/utils/utilities.js");
396
+
397
+
398
+
399
+
400
+
401
+
402
+ class LogViewer extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModule"]
403
+ {
404
+ constructor()
405
+ {
406
+ super('logViewer');
407
+
408
+ this.COMMANDS_PREFIX = 'logViewer';
409
+ this.HELP_URL = '/admintool-LogViewer';
410
+
411
+ this.ANY_LEVEL = '[any]';
412
+ this.LEVELS = ['TRACE','DEBUG','INFO','WARN','ERROR'];
413
+ this.ANY_CLASS = '[any]';
414
+
415
+ this.LOG_DATA_LABEL = 'lines';
416
+
417
+ this.BOOT_LOG_BACKUP_ID = 'SFS2X_BootLog';
418
+ this.RUNTIME_LOG_BACKUP_ID = 'SFS2X_RuntimeLog';
419
+ this.FULL_BACKUP_ID = 'SFS2X_Logs';
420
+
421
+ // Outgoing requests
422
+ this.REQ_GET_RUNTIME_LOG = 'getRunLog';
423
+ this.REQ_GET_BOOT_LOG = 'getBootLog';
424
+ this.REQ_GET_BACKUPS_STATUS = 'getBakStatus';
425
+ this.REQ_BACKUP_BOOT_LOG = 'bakBootLog';
426
+ this.REQ_BACKUP_RUNTIME_LOG = 'bakRunLog';
427
+ this.REQ_BACKUP_FULL_LOGS = 'bakFullLogs';
428
+ this.REQ_DELETE_BACKUP = 'delBackup';
429
+
430
+ // Incoming responses
431
+ this.RESP_INIT_ERROR = 'initErr';
432
+ this.RESP_RUNTIME_LOG_ERROR = 'runLogErr';
433
+ this.RESP_RUNTIME_LOG_INVALID = 'runLogInv';
434
+ this.RESP_RUNTIME_LOG = 'runLog';
435
+ this.RESP_BOOT_LOG_ERROR = 'bootLogErr';
436
+ this.RESP_BOOT_LOG = 'bootLog';
437
+ this.RESP_BACKUPS_STATUS = 'bakStatus';
438
+ this.RESP_DELETE_BACKUP_FAILED = 'delBakFail';
439
+ this.RESP_BACKUP_ERROR = 'bakError';
440
+ this.RESP_BACKUP_WARNING = 'bakWarn';
441
+ }
442
+
443
+ //------------------------------------
444
+ // COMMON MODULE INTERFACE METHODS
445
+ // This members are used by the main controller
446
+ // to communicate with the module's controller.
447
+ //------------------------------------
448
+
449
+ initialize(idData, shellController)
450
+ {
451
+ // Call super method
452
+ super.initialize(idData, shellController);
453
+
454
+ // Initialize scrolling tabs
455
+ $('#lgv-tabNavigator > #tabs').scrollingTabs({
456
+ bootstrapVersion: 4,
457
+ scrollToTabEdge: true,
458
+ enableSwiping: true,
459
+ disableScrollArrowsOnFullyScrolled: true,
460
+ cssClassLeftArrow: 'fa fa-chevron-left',
461
+ cssClassRightArrow: 'fa fa-chevron-right'
462
+ });
463
+
464
+ // Add listener to tab shown event
465
+ $('a[data-toggle="tab"]').on('shown.bs.tab', $.proxy(this._onTabShown, this));
466
+
467
+ // Initialize log lines dropdown
468
+ this._logLinesDD = $('#lgv-logLinesDD').kendoDropDownList({
469
+ valueTemplate: '<span class="text-muted pr-1">Log entries:</span><span>#:data.text#</span>',
470
+ }).data('kendoDropDownList');
471
+
472
+ // Initialize load button
473
+ $('#lgv-loadBt').on('click', $.proxy(this._onRuntimeLogLoadBtClick, this));
474
+
475
+ // Initialize progress bars
476
+ $('.progress-bar').kendoProgressBar({
477
+ min: 0,
478
+ max: 100,
479
+ value: false,
480
+ type: 'value',
481
+ animation: {
482
+ duration: 400
483
+ }
484
+ });
485
+
486
+ // Initialize level filter dropdown
487
+ this._levelFilterDD = $('#lgv-levelDD').kendoDropDownList({
488
+ dataSource: [this.ANY_LEVEL].concat(this.LEVELS),
489
+ change: $.proxy(this._onFilterChange, this)
490
+ }).data('kendoDropDownList');
491
+
492
+ // Initialize class filter dropdown
493
+ this._classFilterDD = $('#lgv-classDD').kendoDropDownList({
494
+ change: $.proxy(this._onFilterChange, this)
495
+ }).data('kendoDropDownList');
496
+
497
+ // Initialize message filter input
498
+ $('#lgv-messageIn').on('input', $.proxy(this._onFilterChange, this));
499
+
500
+ // Initialize clear button
501
+ $('#lgv-clearFilterBt').on('click', $.proxy(this._onClearFilterClick, this));
502
+
503
+ // Initialize export button
504
+ $('#lgv-exportRuntimeLogBt').on('click', $.proxy(this._onExportRuntimeLogBtClick, this));
505
+
506
+ // Initialize runtime log grid
507
+ this._runtimeLogGrid = $('#lgv-runtimeLogGrid').kendoGrid({
508
+ scrollable: true,
509
+ sortable: false,
510
+ //resizable: true,
511
+ selectable: false,
512
+ columns:
513
+ [
514
+ {
515
+ field: 'dateTime',
516
+ width: 150,
517
+ title: 'Date/Time',
518
+ },
519
+ {
520
+ field: 'level',
521
+ width: 100,
522
+ title: 'Level',
523
+ },
524
+ {
525
+ field: 'thread',
526
+ width: 150,
527
+ title: 'Thread',
528
+ },
529
+ {
530
+ field: 'clazz',
531
+ width: 250,
532
+ title: 'Class',
533
+ },
534
+ {
535
+ field: 'message',
536
+ width: 1000,
537
+ title: 'Message',
538
+ },
539
+ ],
540
+ noRecords: {
541
+ template: 'No log entries to display.'
542
+ },
543
+ dataSource: []
544
+ }).data('kendoGrid');
545
+
546
+ // Initialize boot log view buttons
547
+ $('#lgv-exportBootLogBt').on('click', $.proxy(this._onExportBootLogBtClick, this));
548
+ $('#lgv-switchBootLogColorBt').on('click', $.proxy(this._onSwitchBootLogColorBtClick, this));
549
+
550
+ // Initialize generate backup buttons
551
+ $('#lgv-bootLogBackupCard .backup-button').on('click', $.proxy(this._onBootLogGenerateBtClick, this));
552
+ $('#lgv-runtimeLogBackupCard .backup-button').on('click', $.proxy(this._onRuntimeLogGenerateBtClick, this));
553
+ $('#lgv-fullLogBackupCard .backup-button').on('click', $.proxy(this._onFullLogsGenerateBtClick, this));
554
+
555
+ this._initBackupCard('#lgv-bootLogBackupCard');
556
+ this._initBackupCard('#lgv-runtimeLogBackupCard');
557
+ this._initBackupCard('#lgv-fullLogBackupCard');
558
+
559
+ // Initialize download grid
560
+ this._downloadGrid = $('#lgv-downloadGrid').kendoGrid({
561
+ scrollable: true,
562
+ sortable: true,
563
+ //resizable: true,
564
+ selectable: 'row',
565
+ columns:
566
+ [
567
+ {
568
+ field: 'date',
569
+ width: 100,
570
+ title: 'Date',
571
+ },
572
+ {
573
+ field: 'time',
574
+ width: 100,
575
+ title: 'Time',
576
+ },
577
+ {
578
+ field: 'name',
579
+ width: 300,
580
+ title: 'Filename',
581
+ },
582
+ {
583
+ field: 'size',
584
+ width: 100,
585
+ title: 'Size',
586
+ },
587
+ ],
588
+ noRecords: {
589
+ template: 'No backups available.'
590
+ },
591
+ change: $.proxy(this._onDownloadGridSelectionChange, this),
592
+ dataSource: []
593
+ }).data('kendoGrid');
594
+
595
+ // Initialize delete button
596
+ $('#lgv-deleteBt').on('click', $.proxy(this._onDeleteBtClick, this));
597
+ }
598
+
599
+ destroy()
600
+ {
601
+ // Call super method
602
+ super.destroy();
603
+
604
+ // Remove listener to tab shown event
605
+ $('a[data-toggle="tab"]').off('shown.bs.tab');
606
+
607
+ // Destroy scrolling tabs
608
+ $('#lgv-tabNavigator #tabs').scrollingTabs('destroy');
609
+
610
+ // Remove click listeners
611
+ $('#lgv-loadBt').off('click');
612
+ $('#lgv-exportBootLogBt').off('click');
613
+ $('#lgv-switchBootLogColorBt').off('click');
614
+ $('#lgv-bootLogBackupCard .backup-button').off('click');
615
+ $('#lgv-runtimeLogBackupCard .backup-button').off('click');
616
+ $('#lgv-clearFilterBt').off('click');
617
+ $('#lgv-deleteBt').off('click');
618
+
619
+ $('#lgv-messageIn').off('input');
620
+ }
621
+
622
+ onExtensionCommand(command, data)
623
+ {
624
+ // Error during initialization (unable to access log4j configuration file)
625
+ if (command == this.RESP_INIT_ERROR)
626
+ {
627
+ const error = data.getUtfString('error');
628
+
629
+ // Show an alert
630
+ this.shellCtrl.showSimpleAlert(error, true);
631
+
632
+ // Set all tabs to show errors
633
+ this._switchBootViewStack('lgv-bootLogErrorView');
634
+ this._switchRuntimeViewStack('lgv-runtimeLogErrorView');
635
+ this._switchDownloadViewStack('lgv-downloadErrorView');
636
+
637
+ // Disable runtime log controls
638
+ this._enableRuntimeLogControls(false);
639
+
640
+ this._initFailed = true;
641
+ }
642
+
643
+ // Error responses
644
+ else if (command == this.RESP_BOOT_LOG_ERROR || command == this.RESP_RUNTIME_LOG_ERROR)
645
+ {
646
+ const error = data.getUtfString('error');
647
+
648
+ // Show an alert
649
+ this.shellCtrl.showSimpleAlert(error, true);
650
+
651
+ if (command == this.RESP_BOOT_LOG_ERROR)
652
+ {
653
+ // Set tab to show error
654
+ this._switchBootViewStack('lgv-bootLogErrorView');
655
+
656
+ // Disable boot log backup generation
657
+ this._bootLogBackupUnavailable = true;
658
+ this._disableBackupInterface(false);
659
+
660
+ this._bootLogRequested = true;
661
+ }
662
+
663
+ if (command == this.RESP_RUNTIME_LOG_ERROR)
664
+ {
665
+ // Disable controls
666
+ this._enableRuntimeLogControls(false);
667
+
668
+ // Remove loading bar (runtime log)
669
+ this._switchRuntimeViewStack('lgv-runtimeLogErrorView');
670
+
671
+ // Disable runtime log backup download
672
+ this._runtimeLogBackupUnavailable = true;
673
+ this._disableBackupInterface(false);
674
+ }
675
+ }
676
+
677
+ // Modified conversion pattern in the log4j properties file: unable to parse the log
678
+ else if (command == this.RESP_RUNTIME_LOG_INVALID)
679
+ {
680
+ // Disable controls
681
+ this._enableRuntimeLogControls(false);
682
+
683
+ // Fill in error message
684
+ $('#lgv-convPattName').text(data.getUtfString('param'));
685
+ $('#lgv-convPattVal').text(data.getUtfString('value'));
686
+
687
+ // Remove loading bar (runtime log)
688
+ this._switchRuntimeViewStack('lgv-invConvPattView');
689
+ }
690
+
691
+ // Runtime log received
692
+ else if (command == this.RESP_RUNTIME_LOG)
693
+ {
694
+ let classes = [];
695
+ classes.push(this.ANY_CLASS);
696
+
697
+ let logEntries = data.getUtfStringArray(this.LOG_DATA_LABEL);
698
+ let separator = data.getUtfString('sep');
699
+ let columns = data.getInt('cols');
700
+ let dsArr = [];
701
+
702
+ this._totalRuntimeLogEntries = logEntries.length;
703
+
704
+ // Parse log entries
705
+ // We can't use the split method because there could be instances of the separator in the log message too
706
+ for (let e = 0; e < logEntries.length; e++)
707
+ {
708
+ const logEntry = logEntries[e];
709
+
710
+ let logEntryData = [];
711
+ let startIndex = 0;
712
+
713
+ for (let c = 0; c < columns - 1; c++)
714
+ {
715
+ let endIndex = logEntry.indexOf(separator, startIndex);
716
+ logEntryData.push(logEntry.substring(startIndex, endIndex));
717
+ startIndex = endIndex + separator.length;
718
+ }
719
+
720
+ if (startIndex < logEntry.length)
721
+ logEntryData.push(logEntry.substring(startIndex));
722
+
723
+ // Fill datagrid's dataprovider
724
+ let rle = _data_runtime_log_entry__WEBPACK_IMPORTED_MODULE_1__["RuntimeLogEntry"].fromArray(separator, logEntryData);
725
+ dsArr.push(rle);
726
+
727
+ // Add class to filtering dropdown
728
+ if (classes.indexOf(rle.clazz) < 0)
729
+ classes.push(rle.clazz);
730
+ }
731
+
732
+ // Show classes list
733
+ classes.sort(function (a, b) {
734
+ return a.localeCompare(b);
735
+ });
736
+
737
+ this._classFilterDD.setDataSource(classes);
738
+ this._classFilterDD.select(0);
739
+
740
+ // Assign data source to grid
741
+ let ds = new kendo.data.DataSource({
742
+ data: dsArr
743
+ })
744
+
745
+ this._setRuntimeLogDataSource(ds);
746
+
747
+ // Re-enable log loading controls
748
+ this._enableRuntimeLogControls(true);
749
+
750
+ // Remove loading bar
751
+ this._switchRuntimeViewStack('lgv-runtimeLogView');
752
+ }
753
+
754
+ // Boot log received
755
+ else if (command == this.RESP_BOOT_LOG)
756
+ {
757
+ const bootLogEntries = data.getSFSArray(this.LOG_DATA_LABEL);
758
+ let text = '';
759
+
760
+ for (let i = 0; i < bootLogEntries.size(); i++)
761
+ text += bootLogEntries.getUtfString(i) + '\n';
762
+
763
+ $('#lgv-bootLogText').text(text);
764
+
765
+ // Remove loading bar
766
+ this._switchBootViewStack('lgv-bootLogView');
767
+ }
768
+
769
+ // Logs backups status received
770
+ else if (command == this.RESP_BACKUPS_STATUS)
771
+ {
772
+ // Show/hide operation in progress message
773
+ this._disableBackupInterface(data.getBool('running'), data.getUtfString('type'));
774
+
775
+ // Backup files list
776
+ if (data.containsKey('files'))
777
+ {
778
+ let files = data.getSFSArray('files');
779
+
780
+ let lastBootLogBackupFound = false;
781
+ let lastRuntimeLogBackupFound = false;
782
+ let lastFullBackupFound = false;
783
+
784
+ let backupsList = [];
785
+
786
+ const webServerProtocol = (data.containsKey('protocol') ? data.getUtfString('protocol') : 'http') + '://';
787
+ const webServerPort = (data.containsKey('port') ? ':' + data.getInt('port') : '');
788
+
789
+ let totalSize = 0;
790
+
791
+ for (let f = 0; f < files.size(); f++)
792
+ {
793
+ const file = files.getSFSObject(f);
794
+
795
+ const filePath = file.getUtfString('path');
796
+
797
+ const fileObj = {};
798
+ fileObj.path = filePath;
799
+ fileObj.url = webServerProtocol + this.smartFox.config.host + webServerPort + '/' + filePath;
800
+ fileObj.name = filePath.substr(filePath.lastIndexOf('/') + 1);
801
+ fileObj.date = file.getUtfString('date');
802
+ fileObj.time = file.getUtfString('time');
803
+ fileObj.size = Object(_utils_utilities__WEBPACK_IMPORTED_MODULE_4__["bytesToSize"])(file.getLong('size'), 2);
804
+
805
+ totalSize += file.getLong('size');
806
+
807
+ // Check if this is a boot log backup
808
+ if (!lastBootLogBackupFound)
809
+ {
810
+ if (fileObj.name.startsWith(this.BOOT_LOG_BACKUP_ID))
811
+ {
812
+ this._fillBackupCard('#lgv-bootLogBackupCard', fileObj);
813
+
814
+ lastBootLogBackupFound = true;
815
+ }
816
+ }
817
+
818
+ // Check if this is a runtime log backup
819
+ if (!lastRuntimeLogBackupFound)
820
+ {
821
+ if (fileObj.name.startsWith(this.RUNTIME_LOG_BACKUP_ID))
822
+ {
823
+ this._fillBackupCard('#lgv-runtimeLogBackupCard', fileObj);
824
+
825
+ lastRuntimeLogBackupFound = true;
826
+ }
827
+ }
828
+
829
+ // Check if this is a full backup
830
+ if (!lastFullBackupFound)
831
+ {
832
+ if (fileObj.name.startsWith(this.FULL_BACKUP_ID))
833
+ {
834
+ this._fillBackupCard('#lgv-fullLogBackupCard', fileObj);
835
+
836
+ lastFullBackupFound = true;
837
+ }
838
+ }
839
+
840
+ // Populate logs list
841
+ backupsList.push(fileObj);
842
+ }
843
+
844
+ // Show total backups size
845
+ $('#lgv-logSizeLb').html(`Total size: <strong>${Object(_utils_utilities__WEBPACK_IMPORTED_MODULE_4__["bytesToSize"])(totalSize, 2, 'KB')}</strong>`);
846
+
847
+ // Assign data source to grid
848
+ this._setDownloadGridDataSource(backupsList);
849
+ this._onDownloadGridSelectionChange();
850
+
851
+ // Hide links to latest files if not available
852
+ if (!lastBootLogBackupFound)
853
+ this._fillBackupCard('#lgv-bootLogBackupCard', null);
854
+
855
+ if (!lastRuntimeLogBackupFound)
856
+ this._fillBackupCard('#lgv-runtimeLogBackupCard', null);
857
+
858
+ if (!lastFullBackupFound)
859
+ this._fillBackupCard('#lgv-fullLogBackupCard', null);
860
+
861
+ if (data.containsKey('message'))
862
+ {
863
+ // Display notification
864
+ this.shellCtrl.showNotification(`Log backup warning`, data.getUtfString('message'));
865
+ }
866
+ }
867
+
868
+ // Set download view to main
869
+ this._switchDownloadViewStack('lgv-downloadView');
870
+ }
871
+
872
+ // Logs backup deletion failed
873
+ else if (command == this.RESP_DELETE_BACKUP_FAILED)
874
+ {
875
+ const error = data.getUtfString('error');
876
+
877
+ // Show an alert
878
+ this.shellCtrl.showSimpleAlert(error, true);
879
+ }
880
+
881
+ // A blocking error occurred during backup operation
882
+ else if (command == this.RESP_BACKUP_ERROR)
883
+ {
884
+ const error = data.getUtfString('error');
885
+
886
+ // Show an alert
887
+ this.shellCtrl.showSimpleAlert(error, true);
888
+ }
889
+
890
+ // An non-blocking error occurred during backup operation
891
+ else if (command == this.RESP_BACKUP_WARNING)
892
+ {
893
+ let warn = data.getUtfString('warn');
894
+
895
+ // Display notification
896
+ this.shellCtrl.showNotification(`Log backup warning`, warn);
897
+ }
898
+ }
899
+
900
+ //---------------------------------
901
+ // UI EVENT LISTENERS
902
+ //---------------------------------
903
+
904
+ _onTabShown(e)
905
+ {
906
+ if (!this._initFailed)
907
+ {
908
+ // If boot log view was displayed...
909
+ if (e.target.id == 'lgv-bootLog-tab')
910
+ {
911
+ // Load boot log the first time the tab is selected
912
+ if (!this._bootLogRequested)
913
+ {
914
+ this.sendExtensionRequest(this.REQ_GET_BOOT_LOG);
915
+ this._bootLogRequested = true;
916
+ }
917
+ }
918
+
919
+ // If backup&dowload view was displayed...
920
+ else if (e.target.id == 'lgv-logsDownload-tab')
921
+ {
922
+ // Request logs backup status the first time the tab is selected
923
+ if (!this._backupStatusRequested)
924
+ {
925
+ this.sendExtensionRequest(this.REQ_GET_BACKUPS_STATUS);
926
+ this._backupStatusRequested = true;
927
+ }
928
+ }
929
+ }
930
+ }
931
+
932
+ _onRuntimeLogLoadBtClick()
933
+ {
934
+ // Request log
935
+ this._loadRuntimeLog();
936
+ }
937
+
938
+ _onExportBootLogBtClick()
939
+ {
940
+ // Export log to file
941
+ this._exportLog($('#lgv-bootLogText').text(), this.BOOT_LOG_BACKUP_ID);
942
+ }
943
+
944
+ _onSwitchBootLogColorBtClick()
945
+ {
946
+ if ($('#lgv-bootLogText').hasClass('invert'))
947
+ $('#lgv-bootLogText').removeClass('invert');
948
+ else
949
+ $('#lgv-bootLogText').addClass('invert');
950
+ }
951
+
952
+ _onBootLogGenerateBtClick()
953
+ {
954
+ // Show/hide operation in progress message
955
+ this._disableBackupInterface(true, this.BOOT_LOG_BACKUP_ID);
956
+
957
+ // Request backup generation
958
+ this.sendExtensionRequest(this.REQ_BACKUP_BOOT_LOG);
959
+ }
960
+
961
+ _onRuntimeLogGenerateBtClick()
962
+ {
963
+ // Show/hide operation in progress message
964
+ this._disableBackupInterface(true, this.RUNTIME_LOG_BACKUP_ID);
965
+
966
+ // Request backup generation
967
+ this.sendExtensionRequest(this.REQ_BACKUP_RUNTIME_LOG);
968
+ }
969
+
970
+ _onFullLogsGenerateBtClick()
971
+ {
972
+ // Show/hide operation in progress message
973
+ this._disableBackupInterface(true, this.FULL_BACKUP_ID);
974
+
975
+ // Request backup generation
976
+ this.sendExtensionRequest(this.REQ_BACKUP_FULL_LOGS);
977
+ }
978
+
979
+ _onFilterChange()
980
+ {
981
+ // Set filters
982
+ this._setRuntimeLogDataSource(this._runtimeLogGrid.dataSource);
983
+ }
984
+
985
+ _onClearFilterClick()
986
+ {
987
+ this._clearRuntimeLogFilters();
988
+ this._setRuntimeLogDataSource(this._runtimeLogGrid.dataSource);
989
+ }
990
+
991
+ _onExportRuntimeLogBtClick()
992
+ {
993
+ let log = '';
994
+ const entries = this._runtimeLogGrid.dataSource.view();
995
+
996
+ for (let i = 0; i < entries.length; i++)
997
+ {
998
+ const item = entries[i];
999
+ log += [item.date, item.time, item.level, item.thread, item.clazz, item.message].join(item.sep) + '\n';
1000
+ }
1001
+
1002
+ // Export log to file
1003
+ this._exportLog(log, this.RUNTIME_LOG_BACKUP_ID);
1004
+ }
1005
+
1006
+ _onDownloadGridSelectionChange()
1007
+ {
1008
+ // Enable/disable buttons
1009
+ const selectedRows = this._downloadGrid.select();
1010
+ $('#lgv-downloadBt').attr('disabled', selectedRows.length == 0);
1011
+ $('#lgv-deleteBt').attr('disabled', selectedRows.length == 0);
1012
+
1013
+ if (selectedRows.length > 0)
1014
+ {
1015
+ let dataItem = this._downloadGrid.dataItem(selectedRows[0]);
1016
+ $('#lgv-downloadBt').attr('href', dataItem.url);
1017
+ }
1018
+ else
1019
+ $('#lgv-downloadBt').attr('href', '#');
1020
+ }
1021
+
1022
+ _onDeleteBtClick()
1023
+ {
1024
+ let selectedRows = this._downloadGrid.select();
1025
+
1026
+ if (selectedRows.length > 0)
1027
+ {
1028
+ let dataItem = this._downloadGrid.dataItem(selectedRows[0]);
1029
+
1030
+ // Request backup deletion
1031
+ let params = new SFS2X.SFSObject();
1032
+ params.putUtfString('file', dataItem.name);
1033
+
1034
+ this.sendExtensionRequest(this.REQ_DELETE_BACKUP, params);
1035
+ }
1036
+ }
1037
+
1038
+ //------------------------------------
1039
+ // PRIVATE METHODS
1040
+ //------------------------------------
1041
+
1042
+ _switchRuntimeViewStack(viewId)
1043
+ {
1044
+ document.getElementById('lgv-runtime-viewstack').selectedElement = document.getElementById(viewId);
1045
+ }
1046
+
1047
+ _switchBootViewStack(viewId)
1048
+ {
1049
+ document.getElementById('lgv-boot-viewstack').selectedElement = document.getElementById(viewId);
1050
+ }
1051
+
1052
+ _switchDownloadViewStack(viewId)
1053
+ {
1054
+ document.getElementById('lgv-download-viewstack').selectedElement = document.getElementById(viewId);
1055
+ }
1056
+
1057
+ _enableRuntimeLogControls(enable)
1058
+ {
1059
+ $('#lgv-loadBt').attr('disabled', !enable);
1060
+ $('#lgv-exportRuntimeLogBt').attr('disabled', !enable);
1061
+ $('#lgv-filterBt').attr('disabled', !enable);
1062
+ }
1063
+
1064
+ _loadRuntimeLog()
1065
+ {
1066
+ // Disable controls to load log, so that impatient users can't send multiple requests
1067
+ // (it will be enabled again when a response is received)
1068
+ this._enableRuntimeLogControls(false);
1069
+
1070
+ // Clear filters
1071
+ this._clearRuntimeLogFilters();
1072
+
1073
+ // Show loading bar
1074
+ this._switchRuntimeViewStack('lgv-runtimeLogLoadingView');
1075
+
1076
+ // Send request
1077
+ // (the number of lines to be retrieved is sent)
1078
+ let params = new SFS2X.SFSObject();
1079
+ params.putInt('numEntries', Number(this._logLinesDD.value()));
1080
+
1081
+ this.sendExtensionRequest(this.REQ_GET_RUNTIME_LOG, params);
1082
+ }
1083
+
1084
+ _clearRuntimeLogFilters()
1085
+ {
1086
+ this._levelFilterDD.select(0);
1087
+ this._classFilterDD.select(0);
1088
+ $('#lgv-messageIn').val('');
1089
+ }
1090
+
1091
+ _exportLog(log, name)
1092
+ {
1093
+ let blob = new Blob([log], {type: "text/plain;charset=utf-8"});
1094
+ let date = moment__WEBPACK_IMPORTED_MODULE_3__().format('YYYYMMDD_HHmmss');
1095
+
1096
+ file_saver__WEBPACK_IMPORTED_MODULE_2__["saveAs"](blob, `${name}_${date}.log`);
1097
+ }
1098
+
1099
+ _setRuntimeLogDataSource(ds)
1100
+ {
1101
+ // Read current horizontal scroll value
1102
+ const scrollLeft = $('#lgv-runtimeLogGrid .k-grid-content', this._runtimeLogGrid.wrapper).scrollLeft();
1103
+
1104
+ // Assign data source to grid
1105
+ this._runtimeLogGrid.setDataSource(ds);
1106
+
1107
+ // Set filters
1108
+ this._setFilters(ds);
1109
+
1110
+ // Set horizontal scroll
1111
+ $('#lgv-runtimeLogGrid .k-grid-content', this._runtimeLogGrid.wrapper).scrollLeft(scrollLeft);
1112
+
1113
+ // Update counter
1114
+ $('#lgv-runtimeLogEntriesLb').text(`Log entries: ${this._totalRuntimeLogEntries} (${ds.total()} displayed)`);
1115
+ }
1116
+
1117
+ _setFilters(ds)
1118
+ {
1119
+ let filters = [];
1120
+
1121
+ // Level filtering
1122
+ if (this._levelFilterDD.select() > 0)
1123
+ filters.push({
1124
+ field: 'level', operator: 'eq', value: this._levelFilterDD.value()
1125
+ });
1126
+
1127
+ // Class filtering
1128
+ if (this._classFilterDD.select() > 0)
1129
+ filters.push({
1130
+ field: 'clazz', operator: 'eq', value: this._classFilterDD.value()
1131
+ });
1132
+
1133
+ // Message filtering
1134
+ if ($('#lgv-messageIn').val() != '')
1135
+ filters.push({
1136
+ field: 'message', operator: 'contains', value: $('#lgv-messageIn').val()
1137
+ });
1138
+
1139
+ // Set filters
1140
+ ds.filter(filters);
1141
+ }
1142
+
1143
+ _disableBackupInterface(disable, backupId = null)
1144
+ {
1145
+ if (disable)
1146
+ {
1147
+ // Show proper progress bar
1148
+ if (backupId == this.BOOT_LOG_BACKUP_ID)
1149
+ $('#lgv-bootLogBackupCard .progress-bar').show();
1150
+ else if (backupId == this.RUNTIME_LOG_BACKUP_ID)
1151
+ $('#lgv-runtimeLogBackupCard .progress-bar').show();
1152
+ else if (backupId == this.FULL_BACKUP_ID)
1153
+ $('#lgv-fullLogBackupCard .progress-bar').show();
1154
+
1155
+ // Disable buttons
1156
+ $('#lgv-bootLogBackupCard .backup-button').attr('disabled', true);
1157
+ $('#lgv-runtimeLogBackupCard .backup-button').attr('disabled', true);
1158
+ $('#lgv-fullLogBackupCard .backup-button').attr('disabled', true);
1159
+ }
1160
+ else
1161
+ {
1162
+ // Hide all progress bar
1163
+ $('.card-body .progress-bar').hide();
1164
+
1165
+ // Enable buttons
1166
+ $('#lgv-fullLogBackupCard .backup-button').attr('disabled', false);
1167
+
1168
+ if (!this._bootLogBackupUnavailable)
1169
+ $('#lgv-bootLogBackupCard .backup-button').attr('disabled', false);
1170
+
1171
+ if (!this._runtimeLogBackupUnavailable)
1172
+ $('#lgv-runtimeLogBackupCard .backup-button').attr('disabled', false);
1173
+ }
1174
+ }
1175
+
1176
+ _initBackupCard(idSelector)
1177
+ {
1178
+ $(idSelector + ' .backup-details').hide();
1179
+ $(idSelector + ' .progress-bar').hide();
1180
+ }
1181
+
1182
+ _fillBackupCard(idSelector, detailsObj = null)
1183
+ {
1184
+ if (detailsObj == null)
1185
+ $(idSelector + ' .backup-details').hide();
1186
+ else
1187
+ {
1188
+ $(idSelector + ' .backup-details').show();
1189
+
1190
+ $(idSelector + ' .backup-link').attr('href', detailsObj.url);
1191
+ $(idSelector + ' .backup-date').text(detailsObj.date);
1192
+ $(idSelector + ' .backup-time').text(detailsObj.time);
1193
+ $(idSelector + ' .backup-size').text(detailsObj.size);
1194
+ }
1195
+ }
1196
+
1197
+ _setDownloadGridDataSource(ds)
1198
+ {
1199
+ // Read current horizontal scroll value
1200
+ const scrollLeft = $('#lgv-downloadGrid .k-grid-content', this._downloadGrid.wrapper).scrollLeft();
1201
+
1202
+ // Assign data source to grid
1203
+ this._downloadGrid.setDataSource(ds);
1204
+
1205
+ // Set horizontal scroll
1206
+ $('#lgv-downloadGrid .k-grid-content', this._downloadGrid.wrapper).scrollLeft(scrollLeft);
1207
+ }
1208
+
1209
+ //---------------------------------
1210
+ // PRIVATE GETTERS
1211
+ //---------------------------------
1212
+
1213
+
1214
+ }
1215
+
1216
+ /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ "jquery")))
1217
+
1218
+ /***/ })
1219
+
1220
+ }]);
1221
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXRzL2pzL2NvcmUvbW9kdWxlcy9tb2R1bGUtOC5idW5kbGUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL25vZGVfbW9kdWxlcy9maWxlLXNhdmVyL2Rpc3QvRmlsZVNhdmVyLm1pbi5qcyIsIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8od2VicGFjaykvYnVpbGRpbi9nbG9iYWwuanMiLCJ3ZWJwYWNrOi8vYXBwbGljYXRpb24vLi9zcmMvZGF0YS9ydW50aW1lLWxvZy1lbnRyeS5qcyIsIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9tb2R1bGVzL2xvZy12aWV3ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uKGEsYil7aWYoXCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kKWRlZmluZShbXSxiKTtlbHNlIGlmKFwidW5kZWZpbmVkXCIhPXR5cGVvZiBleHBvcnRzKWIoKTtlbHNle2IoKSxhLkZpbGVTYXZlcj17ZXhwb3J0czp7fX0uZXhwb3J0c319KSh0aGlzLGZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gYihhLGIpe3JldHVyblwidW5kZWZpbmVkXCI9PXR5cGVvZiBiP2I9e2F1dG9Cb206ITF9Olwib2JqZWN0XCIhPXR5cGVvZiBiJiYoY29uc29sZS53YXJuKFwiRGVwcmVjYXRlZDogRXhwZWN0ZWQgdGhpcmQgYXJndW1lbnQgdG8gYmUgYSBvYmplY3RcIiksYj17YXV0b0JvbTohYn0pLGIuYXV0b0JvbSYmL15cXHMqKD86dGV4dFxcL1xcUyp8YXBwbGljYXRpb25cXC94bWx8XFxTKlxcL1xcUypcXCt4bWwpXFxzKjsuKmNoYXJzZXRcXHMqPVxccyp1dGYtOC9pLnRlc3QoYS50eXBlKT9uZXcgQmxvYihbXCJcXHVGRUZGXCIsYV0se3R5cGU6YS50eXBlfSk6YX1mdW5jdGlvbiBjKGIsYyxkKXt2YXIgZT1uZXcgWE1MSHR0cFJlcXVlc3Q7ZS5vcGVuKFwiR0VUXCIsYiksZS5yZXNwb25zZVR5cGU9XCJibG9iXCIsZS5vbmxvYWQ9ZnVuY3Rpb24oKXthKGUucmVzcG9uc2UsYyxkKX0sZS5vbmVycm9yPWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcihcImNvdWxkIG5vdCBkb3dubG9hZCBmaWxlXCIpfSxlLnNlbmQoKX1mdW5jdGlvbiBkKGEpe3ZhciBiPW5ldyBYTUxIdHRwUmVxdWVzdDtiLm9wZW4oXCJIRUFEXCIsYSwhMSk7dHJ5e2Iuc2VuZCgpfWNhdGNoKGEpe31yZXR1cm4gMjAwPD1iLnN0YXR1cyYmMjk5Pj1iLnN0YXR1c31mdW5jdGlvbiBlKGEpe3RyeXthLmRpc3BhdGNoRXZlbnQobmV3IE1vdXNlRXZlbnQoXCJjbGlja1wiKSl9Y2F0Y2goYyl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJNb3VzZUV2ZW50c1wiKTtiLmluaXRNb3VzZUV2ZW50KFwiY2xpY2tcIiwhMCwhMCx3aW5kb3csMCwwLDAsODAsMjAsITEsITEsITEsITEsMCxudWxsKSxhLmRpc3BhdGNoRXZlbnQoYil9fXZhciBmPVwib2JqZWN0XCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdy53aW5kb3c9PT13aW5kb3c/d2luZG93Olwib2JqZWN0XCI9PXR5cGVvZiBzZWxmJiZzZWxmLnNlbGY9PT1zZWxmP3NlbGY6XCJvYmplY3RcIj09dHlwZW9mIGdsb2JhbCYmZ2xvYmFsLmdsb2JhbD09PWdsb2JhbD9nbG9iYWw6dm9pZCAwLGE9Zi5zYXZlQXN8fChcIm9iamVjdFwiIT10eXBlb2Ygd2luZG93fHx3aW5kb3chPT1mP2Z1bmN0aW9uKCl7fTpcImRvd25sb2FkXCJpbiBIVE1MQW5jaG9yRWxlbWVudC5wcm90b3R5cGU/ZnVuY3Rpb24oYixnLGgpe3ZhciBpPWYuVVJMfHxmLndlYmtpdFVSTCxqPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO2c9Z3x8Yi5uYW1lfHxcImRvd25sb2FkXCIsai5kb3dubG9hZD1nLGoucmVsPVwibm9vcGVuZXJcIixcInN0cmluZ1wiPT10eXBlb2YgYj8oai5ocmVmPWIsai5vcmlnaW49PT1sb2NhdGlvbi5vcmlnaW4/ZShqKTpkKGouaHJlZik/YyhiLGcsaCk6ZShqLGoudGFyZ2V0PVwiX2JsYW5rXCIpKTooai5ocmVmPWkuY3JlYXRlT2JqZWN0VVJMKGIpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtpLnJldm9rZU9iamVjdFVSTChqLmhyZWYpfSw0RTQpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKGopfSwwKSl9OlwibXNTYXZlT3JPcGVuQmxvYlwiaW4gbmF2aWdhdG9yP2Z1bmN0aW9uKGYsZyxoKXtpZihnPWd8fGYubmFtZXx8XCJkb3dubG9hZFwiLFwic3RyaW5nXCIhPXR5cGVvZiBmKW5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKGIoZixoKSxnKTtlbHNlIGlmKGQoZikpYyhmLGcsaCk7ZWxzZXt2YXIgaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtpLmhyZWY9ZixpLnRhcmdldD1cIl9ibGFua1wiLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKGkpfSl9fTpmdW5jdGlvbihhLGIsZCxlKXtpZihlPWV8fG9wZW4oXCJcIixcIl9ibGFua1wiKSxlJiYoZS5kb2N1bWVudC50aXRsZT1lLmRvY3VtZW50LmJvZHkuaW5uZXJUZXh0PVwiZG93bmxvYWRpbmcuLi5cIiksXCJzdHJpbmdcIj09dHlwZW9mIGEpcmV0dXJuIGMoYSxiLGQpO3ZhciBnPVwiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtXCI9PT1hLnR5cGUsaD0vY29uc3RydWN0b3IvaS50ZXN0KGYuSFRNTEVsZW1lbnQpfHxmLnNhZmFyaSxpPS9DcmlPU1xcL1tcXGRdKy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtpZigoaXx8ZyYmaCkmJlwib2JqZWN0XCI9PXR5cGVvZiBGaWxlUmVhZGVyKXt2YXIgaj1uZXcgRmlsZVJlYWRlcjtqLm9ubG9hZGVuZD1mdW5jdGlvbigpe3ZhciBhPWoucmVzdWx0O2E9aT9hOmEucmVwbGFjZSgvXmRhdGE6W147XSo7LyxcImRhdGE6YXR0YWNobWVudC9maWxlO1wiKSxlP2UubG9jYXRpb24uaHJlZj1hOmxvY2F0aW9uPWEsZT1udWxsfSxqLnJlYWRBc0RhdGFVUkwoYSl9ZWxzZXt2YXIgaz1mLlVSTHx8Zi53ZWJraXRVUkwsbD1rLmNyZWF0ZU9iamVjdFVSTChhKTtlP2UubG9jYXRpb249bDpsb2NhdGlvbi5ocmVmPWwsZT1udWxsLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtrLnJldm9rZU9iamVjdFVSTChsKX0sNEU0KX19KTtmLnNhdmVBcz1hLnNhdmVBcz1hLFwidW5kZWZpbmVkXCIhPXR5cGVvZiBtb2R1bGUmJihtb2R1bGUuZXhwb3J0cz1hKX0pO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1GaWxlU2F2ZXIubWluLmpzLm1hcCIsInZhciBnO1xuXG4vLyBUaGlzIHdvcmtzIGluIG5vbi1zdHJpY3QgbW9kZVxuZyA9IChmdW5jdGlvbigpIHtcblx0cmV0dXJuIHRoaXM7XG59KSgpO1xuXG50cnkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIGV2YWwgaXMgYWxsb3dlZCAoc2VlIENTUClcblx0ZyA9IGcgfHwgbmV3IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKTtcbn0gY2F0Y2ggKGUpIHtcblx0Ly8gVGhpcyB3b3JrcyBpZiB0aGUgd2luZG93IHJlZmVyZW5jZSBpcyBhdmFpbGFibGVcblx0aWYgKHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIpIGcgPSB3aW5kb3c7XG59XG5cbi8vIGcgY2FuIHN0aWxsIGJlIHVuZGVmaW5lZCwgYnV0IG5vdGhpbmcgdG8gZG8gYWJvdXQgaXQuLi5cbi8vIFdlIHJldHVybiB1bmRlZmluZWQsIGluc3RlYWQgb2Ygbm90aGluZyBoZXJlLCBzbyBpdCdzXG4vLyBlYXNpZXIgdG8gaGFuZGxlIHRoaXMgY2FzZS4gaWYoIWdsb2JhbCkgeyAuLi59XG5cbm1vZHVsZS5leHBvcnRzID0gZztcbiIsImV4cG9ydCBjbGFzcyBSdW50aW1lTG9nRW50cnlcbntcblx0Y29uc3RydWN0b3Ioc2VwYXJhdG9yKVxuXHR7XG5cdFx0dGhpcy5zZXAgPSBzZXBhcmF0b3Jcblx0fVxuXG5cdHN0YXRpYyBmcm9tQXJyYXkoc2VwYXJhdG9yLCBsb2dFbnRyeURhdGEpXG5cdHtcblx0XHRsZXQgcmxlID0gbmV3IFJ1bnRpbWVMb2dFbnRyeShzZXBhcmF0b3IpO1xuXG5cdFx0cmxlLmRhdGUgPSBsb2dFbnRyeURhdGFbMF07XG5cdFx0cmxlLnRpbWUgPSBsb2dFbnRyeURhdGFbMV07XG5cdFx0cmxlLmRhdGVUaW1lID0gcmxlLl9nZXREYXRlVGltZSgpO1xuXHRcdHJsZS5sZXZlbCA9IGxvZ0VudHJ5RGF0YVsyXS50cmltKCk7XG5cdFx0cmxlLnRocmVhZCA9IGxvZ0VudHJ5RGF0YVszXTtcblx0XHRybGUuY2xhenogPSBsb2dFbnRyeURhdGFbNF07XG5cdFx0cmxlLm1lc3NhZ2UgPSBsb2dFbnRyeURhdGFbNl07XG5cblx0XHRyZXR1cm4gcmxlO1xuXHR9XG5cblx0X2dldERhdGVUaW1lKClcblx0e1xuXHRcdHJldHVybiB0aGlzLmRhdGUgKyAnXFxuJyArIHRoaXMudGltZTtcblx0fVxufVxuIiwiaW1wb3J0IHtCYXNlTW9kdWxlfSBmcm9tICcuL2Jhc2UtbW9kdWxlJztcbmltcG9ydCB7UnVudGltZUxvZ0VudHJ5fSBmcm9tICcuLi9kYXRhL3J1bnRpbWUtbG9nLWVudHJ5JztcbmltcG9ydCAqIGFzIEZpbGVTYXZlciBmcm9tICdmaWxlLXNhdmVyJztcbmltcG9ydCAqIGFzIG1vbWVudCBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHtieXRlc1RvU2l6ZX0gZnJvbSAnLi4vdXRpbHMvdXRpbGl0aWVzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTG9nVmlld2VyIGV4dGVuZHMgQmFzZU1vZHVsZVxue1xuXHRjb25zdHJ1Y3RvcigpXG5cdHtcblx0ICAgIHN1cGVyKCdsb2dWaWV3ZXInKTtcblxuXHRcdHRoaXMuQ09NTUFORFNfUFJFRklYID0gJ2xvZ1ZpZXdlcic7XG5cdFx0dGhpcy5IRUxQX1VSTCA9ICcvYWRtaW50b29sLUxvZ1ZpZXdlcic7XG5cblx0XHR0aGlzLkFOWV9MRVZFTCA9ICdbYW55XSc7XG5cdFx0dGhpcy5MRVZFTFMgPSBbJ1RSQUNFJywnREVCVUcnLCdJTkZPJywnV0FSTicsJ0VSUk9SJ107XG5cdFx0dGhpcy5BTllfQ0xBU1MgPSAnW2FueV0nO1xuXG5cdFx0dGhpcy5MT0dfREFUQV9MQUJFTCA9ICdsaW5lcyc7XG5cblx0XHR0aGlzLkJPT1RfTE9HX0JBQ0tVUF9JRCA9ICdTRlMyWF9Cb290TG9nJztcblx0XHR0aGlzLlJVTlRJTUVfTE9HX0JBQ0tVUF9JRCA9ICdTRlMyWF9SdW50aW1lTG9nJztcblx0XHR0aGlzLkZVTExfQkFDS1VQX0lEID0gJ1NGUzJYX0xvZ3MnO1xuXG5cdFx0Ly8gT3V0Z29pbmcgcmVxdWVzdHNcblx0XHR0aGlzLlJFUV9HRVRfUlVOVElNRV9MT0cgPSAnZ2V0UnVuTG9nJztcblx0XHR0aGlzLlJFUV9HRVRfQk9PVF9MT0cgPSAnZ2V0Qm9vdExvZyc7XG5cdFx0dGhpcy5SRVFfR0VUX0JBQ0tVUFNfU1RBVFVTID0gJ2dldEJha1N0YXR1cyc7XG5cdFx0dGhpcy5SRVFfQkFDS1VQX0JPT1RfTE9HID0gJ2Jha0Jvb3RMb2cnO1xuXHRcdHRoaXMuUkVRX0JBQ0tVUF9SVU5USU1FX0xPRyA9ICdiYWtSdW5Mb2cnO1xuXHRcdHRoaXMuUkVRX0JBQ0tVUF9GVUxMX0xPR1MgPSAnYmFrRnVsbExvZ3MnO1xuXHRcdHRoaXMuUkVRX0RFTEVURV9CQUNLVVAgPSAnZGVsQmFja3VwJztcblxuXHRcdC8vIEluY29taW5nIHJlc3BvbnNlc1xuXHRcdHRoaXMuUkVTUF9JTklUX0VSUk9SID0gJ2luaXRFcnInO1xuXHRcdHRoaXMuUkVTUF9SVU5USU1FX0xPR19FUlJPUiA9ICdydW5Mb2dFcnInO1xuXHRcdHRoaXMuUkVTUF9SVU5USU1FX0xPR19JTlZBTElEID0gJ3J1bkxvZ0ludic7XG5cdFx0dGhpcy5SRVNQX1JVTlRJTUVfTE9HID0gJ3J1bkxvZyc7XG5cdFx0dGhpcy5SRVNQX0JPT1RfTE9HX0VSUk9SID0gJ2Jvb3RMb2dFcnInO1xuXHRcdHRoaXMuUkVTUF9CT09UX0xPRyA9ICdib290TG9nJztcblx0XHR0aGlzLlJFU1BfQkFDS1VQU19TVEFUVVMgPSAnYmFrU3RhdHVzJztcblx0XHR0aGlzLlJFU1BfREVMRVRFX0JBQ0tVUF9GQUlMRUQgPSAnZGVsQmFrRmFpbCc7XG5cdFx0dGhpcy5SRVNQX0JBQ0tVUF9FUlJPUiA9ICdiYWtFcnJvcic7XG5cdFx0dGhpcy5SRVNQX0JBQ0tVUF9XQVJOSU5HID0gJ2Jha1dhcm4nO1xuXHR9XG5cblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0Ly8gQ09NTU9OIE1PRFVMRSBJTlRFUkZBQ0UgTUVUSE9EU1xuXHQvLyBUaGlzIG1lbWJlcnMgYXJlIHVzZWQgYnkgdGhlIG1haW4gY29udHJvbGxlclxuXHQvLyB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBtb2R1bGUncyBjb250cm9sbGVyLlxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdGluaXRpYWxpemUoaWREYXRhLCBzaGVsbENvbnRyb2xsZXIpXG5cdHtcblx0XHQvLyBDYWxsIHN1cGVyIG1ldGhvZFxuXHRcdHN1cGVyLmluaXRpYWxpemUoaWREYXRhLCBzaGVsbENvbnRyb2xsZXIpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBzY3JvbGxpbmcgdGFic1xuXHRcdCQoJyNsZ3YtdGFiTmF2aWdhdG9yID4gI3RhYnMnKS5zY3JvbGxpbmdUYWJzKHtcblx0XHRcdGJvb3RzdHJhcFZlcnNpb246IDQsXG5cdFx0XHRzY3JvbGxUb1RhYkVkZ2U6IHRydWUsXG5cdFx0XHRlbmFibGVTd2lwaW5nOiB0cnVlLFxuXHRcdFx0ZGlzYWJsZVNjcm9sbEFycm93c09uRnVsbHlTY3JvbGxlZDogdHJ1ZSxcblx0XHRcdGNzc0NsYXNzTGVmdEFycm93OiAnZmEgZmEtY2hldnJvbi1sZWZ0Jyxcblx0XHRcdGNzc0NsYXNzUmlnaHRBcnJvdzogJ2ZhIGZhLWNoZXZyb24tcmlnaHQnXG5cdFx0fSk7XG5cblx0XHQvLyBBZGQgbGlzdGVuZXIgdG8gdGFiIHNob3duIGV2ZW50XG5cdFx0JCgnYVtkYXRhLXRvZ2dsZT1cInRhYlwiXScpLm9uKCdzaG93bi5icy50YWInLCAkLnByb3h5KHRoaXMuX29uVGFiU2hvd24sIHRoaXMpKTtcblxuXHRcdC8vIEluaXRpYWxpemUgbG9nIGxpbmVzIGRyb3Bkb3duXG5cdFx0dGhpcy5fbG9nTGluZXNERCA9ICQoJyNsZ3YtbG9nTGluZXNERCcpLmtlbmRvRHJvcERvd25MaXN0KHtcblx0XHRcdHZhbHVlVGVtcGxhdGU6ICc8c3BhbiBjbGFzcz1cInRleHQtbXV0ZWQgcHItMVwiPkxvZyBlbnRyaWVzOjwvc3Bhbj48c3Bhbj4jOmRhdGEudGV4dCM8L3NwYW4+Jyxcblx0XHR9KS5kYXRhKCdrZW5kb0Ryb3BEb3duTGlzdCcpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBsb2FkIGJ1dHRvblxuXHRcdCQoJyNsZ3YtbG9hZEJ0Jykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vblJ1bnRpbWVMb2dMb2FkQnRDbGljaywgdGhpcykpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBwcm9ncmVzcyBiYXJzXG5cdFx0JCgnLnByb2dyZXNzLWJhcicpLmtlbmRvUHJvZ3Jlc3NCYXIoe1xuXHRcdFx0bWluOiAwLFxuICAgICAgICAgICAgbWF4OiAxMDAsXG5cdFx0XHR2YWx1ZTogZmFsc2UsXG4gICAgICAgICAgICB0eXBlOiAndmFsdWUnLFxuICAgICAgICAgICAgYW5pbWF0aW9uOiB7XG4gICAgICAgICAgICAgICAgZHVyYXRpb246IDQwMFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuXHRcdC8vIEluaXRpYWxpemUgbGV2ZWwgZmlsdGVyIGRyb3Bkb3duXG5cdFx0dGhpcy5fbGV2ZWxGaWx0ZXJERCA9ICQoJyNsZ3YtbGV2ZWxERCcpLmtlbmRvRHJvcERvd25MaXN0KHtcblx0XHRcdGRhdGFTb3VyY2U6IFt0aGlzLkFOWV9MRVZFTF0uY29uY2F0KHRoaXMuTEVWRUxTKSxcblx0XHRcdGNoYW5nZTogJC5wcm94eSh0aGlzLl9vbkZpbHRlckNoYW5nZSwgdGhpcylcblx0XHR9KS5kYXRhKCdrZW5kb0Ryb3BEb3duTGlzdCcpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBjbGFzcyBmaWx0ZXIgZHJvcGRvd25cblx0XHR0aGlzLl9jbGFzc0ZpbHRlckREID0gJCgnI2xndi1jbGFzc0REJykua2VuZG9Ecm9wRG93bkxpc3Qoe1xuXHRcdFx0Y2hhbmdlOiAkLnByb3h5KHRoaXMuX29uRmlsdGVyQ2hhbmdlLCB0aGlzKVxuXHRcdH0pLmRhdGEoJ2tlbmRvRHJvcERvd25MaXN0Jyk7XG5cblx0XHQvLyBJbml0aWFsaXplIG1lc3NhZ2UgZmlsdGVyIGlucHV0XG5cdFx0JCgnI2xndi1tZXNzYWdlSW4nKS5vbignaW5wdXQnLCAkLnByb3h5KHRoaXMuX29uRmlsdGVyQ2hhbmdlLCB0aGlzKSk7XG5cblx0XHQvLyBJbml0aWFsaXplIGNsZWFyIGJ1dHRvblxuXHRcdCQoJyNsZ3YtY2xlYXJGaWx0ZXJCdCcpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25DbGVhckZpbHRlckNsaWNrLCB0aGlzKSk7XG5cblx0XHQvLyBJbml0aWFsaXplIGV4cG9ydCBidXR0b25cblx0XHQkKCcjbGd2LWV4cG9ydFJ1bnRpbWVMb2dCdCcpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25FeHBvcnRSdW50aW1lTG9nQnRDbGljaywgdGhpcykpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBydW50aW1lIGxvZyBncmlkXG5cdFx0dGhpcy5fcnVudGltZUxvZ0dyaWQgPSAkKCcjbGd2LXJ1bnRpbWVMb2dHcmlkJykua2VuZG9HcmlkKHtcblx0XHRcdHNjcm9sbGFibGU6IHRydWUsXG4gICAgICAgICAgICBzb3J0YWJsZTogZmFsc2UsXG5cdFx0XHQvL3Jlc2l6YWJsZTogdHJ1ZSxcblx0XHRcdHNlbGVjdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29sdW1uczpcbiAgICAgICAgICAgIFtcblx0XHRcdFx0e1xuXHQgICAgICAgICAgICAgICAgZmllbGQ6ICdkYXRlVGltZScsXG5cdCAgICAgICAgICAgICAgICB3aWR0aDogMTUwLFxuXHRcdFx0XHRcdHRpdGxlOiAnRGF0ZS9UaW1lJyxcblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAge1xuXHQgICAgICAgICAgICAgICAgZmllbGQ6ICdsZXZlbCcsXG5cdCAgICAgICAgICAgICAgICB3aWR0aDogMTAwLFxuXHQgICAgICAgICAgICAgICAgdGl0bGU6ICdMZXZlbCcsXG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIHtcblx0ICAgICAgICAgICAgICAgIGZpZWxkOiAndGhyZWFkJyxcblx0ICAgICAgICAgICAgICAgIHdpZHRoOiAxNTAsXG5cdCAgICAgICAgICAgICAgICB0aXRsZTogJ1RocmVhZCcsXG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIHtcblx0ICAgICAgICAgICAgICAgIGZpZWxkOiAnY2xhenonLFxuXHQgICAgICAgICAgICAgICAgd2lkdGg6IDI1MCxcblx0ICAgICAgICAgICAgICAgIHRpdGxlOiAnQ2xhc3MnLFxuXHQgICAgICAgICAgICB9LFxuXHRcdFx0XHR7XG5cdCAgICAgICAgICAgICAgICBmaWVsZDogJ21lc3NhZ2UnLFxuXHQgICAgICAgICAgICAgICAgd2lkdGg6IDEwMDAsXG5cdFx0XHRcdFx0dGl0bGU6ICdNZXNzYWdlJyxcblx0ICAgICAgICAgICAgfSxcblx0XHRcdF0sXG5cdFx0XHRub1JlY29yZHM6IHtcblx0XHRcdFx0dGVtcGxhdGU6ICdObyBsb2cgZW50cmllcyB0byBkaXNwbGF5Lidcblx0XHRcdH0sXG5cdFx0XHRkYXRhU291cmNlOiBbXVxuICAgICAgICB9KS5kYXRhKCdrZW5kb0dyaWQnKTtcblxuXHRcdC8vIEluaXRpYWxpemUgYm9vdCBsb2cgdmlldyBidXR0b25zXG5cdFx0JCgnI2xndi1leHBvcnRCb290TG9nQnQnKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uRXhwb3J0Qm9vdExvZ0J0Q2xpY2ssIHRoaXMpKTtcblx0XHQkKCcjbGd2LXN3aXRjaEJvb3RMb2dDb2xvckJ0Jykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vblN3aXRjaEJvb3RMb2dDb2xvckJ0Q2xpY2ssIHRoaXMpKTtcblxuXHRcdC8vIEluaXRpYWxpemUgZ2VuZXJhdGUgYmFja3VwIGJ1dHRvbnNcblx0XHQkKCcjbGd2LWJvb3RMb2dCYWNrdXBDYXJkIC5iYWNrdXAtYnV0dG9uJykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vbkJvb3RMb2dHZW5lcmF0ZUJ0Q2xpY2ssIHRoaXMpKTtcblx0XHQkKCcjbGd2LXJ1bnRpbWVMb2dCYWNrdXBDYXJkIC5iYWNrdXAtYnV0dG9uJykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vblJ1bnRpbWVMb2dHZW5lcmF0ZUJ0Q2xpY2ssIHRoaXMpKTtcblx0XHQkKCcjbGd2LWZ1bGxMb2dCYWNrdXBDYXJkIC5iYWNrdXAtYnV0dG9uJykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vbkZ1bGxMb2dzR2VuZXJhdGVCdENsaWNrLCB0aGlzKSk7XG5cblx0XHR0aGlzLl9pbml0QmFja3VwQ2FyZCgnI2xndi1ib290TG9nQmFja3VwQ2FyZCcpO1xuXHRcdHRoaXMuX2luaXRCYWNrdXBDYXJkKCcjbGd2LXJ1bnRpbWVMb2dCYWNrdXBDYXJkJyk7XG5cdFx0dGhpcy5faW5pdEJhY2t1cENhcmQoJyNsZ3YtZnVsbExvZ0JhY2t1cENhcmQnKTtcblxuXHRcdC8vIEluaXRpYWxpemUgZG93bmxvYWQgZ3JpZFxuXHRcdHRoaXMuX2Rvd25sb2FkR3JpZCA9ICQoJyNsZ3YtZG93bmxvYWRHcmlkJykua2VuZG9HcmlkKHtcblx0XHRcdHNjcm9sbGFibGU6IHRydWUsXG4gICAgICAgICAgICBzb3J0YWJsZTogdHJ1ZSxcblx0XHRcdC8vcmVzaXphYmxlOiB0cnVlLFxuXHRcdFx0c2VsZWN0YWJsZTogJ3JvdycsXG4gICAgICAgICAgICBjb2x1bW5zOlxuICAgICAgICAgICAgW1xuXHRcdFx0XHR7XG5cdCAgICAgICAgICAgICAgICBmaWVsZDogJ2RhdGUnLFxuXHQgICAgICAgICAgICAgICAgd2lkdGg6IDEwMCxcblx0XHRcdFx0XHR0aXRsZTogJ0RhdGUnLFxuXHQgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICB7XG5cdCAgICAgICAgICAgICAgICBmaWVsZDogJ3RpbWUnLFxuXHQgICAgICAgICAgICAgICAgd2lkdGg6IDEwMCxcblx0ICAgICAgICAgICAgICAgIHRpdGxlOiAnVGltZScsXG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIHtcblx0ICAgICAgICAgICAgICAgIGZpZWxkOiAnbmFtZScsXG5cdCAgICAgICAgICAgICAgICB3aWR0aDogMzAwLFxuXHQgICAgICAgICAgICAgICAgdGl0bGU6ICdGaWxlbmFtZScsXG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIHtcblx0ICAgICAgICAgICAgICAgIGZpZWxkOiAnc2l6ZScsXG5cdCAgICAgICAgICAgICAgICB3aWR0aDogMTAwLFxuXHQgICAgICAgICAgICAgICAgdGl0bGU6ICdTaXplJyxcblx0ICAgICAgICAgICAgfSxcblx0XHRcdF0sXG5cdFx0XHRub1JlY29yZHM6IHtcblx0XHRcdFx0dGVtcGxhdGU6ICdObyBiYWNrdXBzIGF2YWlsYWJsZS4nXG5cdFx0XHR9LFxuXHRcdFx0Y2hhbmdlOiAkLnByb3h5KHRoaXMuX29uRG93bmxvYWRHcmlkU2VsZWN0aW9uQ2hhbmdlLCB0aGlzKSxcblx0XHRcdGRhdGFTb3VyY2U6IFtdXG4gICAgICAgIH0pLmRhdGEoJ2tlbmRvR3JpZCcpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBkZWxldGUgYnV0dG9uXG5cdFx0JCgnI2xndi1kZWxldGVCdCcpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25EZWxldGVCdENsaWNrLCB0aGlzKSk7XG5cdH1cblxuXHRkZXN0cm95KClcblx0e1xuXHRcdC8vIENhbGwgc3VwZXIgbWV0aG9kXG5cdFx0c3VwZXIuZGVzdHJveSgpO1xuXG5cdFx0Ly8gUmVtb3ZlIGxpc3RlbmVyIHRvIHRhYiBzaG93biBldmVudFxuXHRcdCQoJ2FbZGF0YS10b2dnbGU9XCJ0YWJcIl0nKS5vZmYoJ3Nob3duLmJzLnRhYicpO1xuXG5cdFx0Ly8gRGVzdHJveSBzY3JvbGxpbmcgdGFic1xuXHRcdCQoJyNsZ3YtdGFiTmF2aWdhdG9yICN0YWJzJykuc2Nyb2xsaW5nVGFicygnZGVzdHJveScpO1xuXG5cdFx0Ly8gUmVtb3ZlIGNsaWNrIGxpc3RlbmVyc1xuXHRcdCQoJyNsZ3YtbG9hZEJ0Jykub2ZmKCdjbGljaycpO1xuXHRcdCQoJyNsZ3YtZXhwb3J0Qm9vdExvZ0J0Jykub2ZmKCdjbGljaycpO1xuXHRcdCQoJyNsZ3Ytc3dpdGNoQm9vdExvZ0NvbG9yQnQnKS5vZmYoJ2NsaWNrJyk7XG5cdFx0JCgnI2xndi1ib290TG9nQmFja3VwQ2FyZCAuYmFja3VwLWJ1dHRvbicpLm9mZignY2xpY2snKTtcblx0XHQkKCcjbGd2LXJ1bnRpbWVMb2dCYWNrdXBDYXJkIC5iYWNrdXAtYnV0dG9uJykub2ZmKCdjbGljaycpO1xuXHRcdCQoJyNsZ3YtY2xlYXJGaWx0ZXJCdCcpLm9mZignY2xpY2snKTtcblx0XHQkKCcjbGd2LWRlbGV0ZUJ0Jykub2ZmKCdjbGljaycpO1xuXG5cdFx0JCgnI2xndi1tZXNzYWdlSW4nKS5vZmYoJ2lucHV0Jyk7XG5cdH1cblxuXHRvbkV4dGVuc2lvbkNvbW1hbmQoY29tbWFuZCwgZGF0YSlcblx0e1xuXHRcdC8vIEVycm9yIGR1cmluZyBpbml0aWFsaXphdGlvbiAodW5hYmxlIHRvIGFjY2VzcyBsb2c0aiBjb25maWd1cmF0aW9uIGZpbGUpXG5cdFx0aWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX0lOSVRfRVJST1IpXG5cdFx0e1xuXHRcdFx0Y29uc3QgZXJyb3IgPSBkYXRhLmdldFV0ZlN0cmluZygnZXJyb3InKTtcblxuXHRcdFx0Ly8gU2hvdyBhbiBhbGVydFxuXHRcdFx0dGhpcy5zaGVsbEN0cmwuc2hvd1NpbXBsZUFsZXJ0KGVycm9yLCB0cnVlKTtcblxuXHRcdFx0Ly8gU2V0IGFsbCB0YWJzIHRvIHNob3cgZXJyb3JzXG5cdFx0XHR0aGlzLl9zd2l0Y2hCb290Vmlld1N0YWNrKCdsZ3YtYm9vdExvZ0Vycm9yVmlldycpO1xuXHRcdFx0dGhpcy5fc3dpdGNoUnVudGltZVZpZXdTdGFjaygnbGd2LXJ1bnRpbWVMb2dFcnJvclZpZXcnKTtcblx0XHRcdHRoaXMuX3N3aXRjaERvd25sb2FkVmlld1N0YWNrKCdsZ3YtZG93bmxvYWRFcnJvclZpZXcnKTtcblxuXHRcdFx0Ly8gRGlzYWJsZSBydW50aW1lIGxvZyBjb250cm9sc1xuXHRcdFx0dGhpcy5fZW5hYmxlUnVudGltZUxvZ0NvbnRyb2xzKGZhbHNlKTtcblxuXHRcdFx0dGhpcy5faW5pdEZhaWxlZCA9IHRydWU7XG5cdFx0fVxuXG5cdFx0Ly8gRXJyb3IgcmVzcG9uc2VzXG5cdFx0ZWxzZSBpZiAoY29tbWFuZCA9PSB0aGlzLlJFU1BfQk9PVF9MT0dfRVJST1IgfHwgY29tbWFuZCA9PSB0aGlzLlJFU1BfUlVOVElNRV9MT0dfRVJST1IpXG5cdFx0e1xuXHRcdFx0Y29uc3QgZXJyb3IgPSBkYXRhLmdldFV0ZlN0cmluZygnZXJyb3InKTtcblxuXHRcdFx0Ly8gU2hvdyBhbiBhbGVydFxuXHRcdFx0dGhpcy5zaGVsbEN0cmwuc2hvd1NpbXBsZUFsZXJ0KGVycm9yLCB0cnVlKTtcblxuXHRcdFx0aWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX0JPT1RfTE9HX0VSUk9SKVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBTZXQgdGFiIHRvIHNob3cgZXJyb3Jcblx0XHRcdFx0dGhpcy5fc3dpdGNoQm9vdFZpZXdTdGFjaygnbGd2LWJvb3RMb2dFcnJvclZpZXcnKTtcblxuXHRcdFx0XHQvLyBEaXNhYmxlIGJvb3QgbG9nIGJhY2t1cCBnZW5lcmF0aW9uXG5cdFx0XHRcdHRoaXMuX2Jvb3RMb2dCYWNrdXBVbmF2YWlsYWJsZSA9IHRydWU7XG5cdFx0XHRcdHRoaXMuX2Rpc2FibGVCYWNrdXBJbnRlcmZhY2UoZmFsc2UpO1xuXG5cdFx0XHRcdHRoaXMuX2Jvb3RMb2dSZXF1ZXN0ZWQgPSB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoY29tbWFuZCA9PSB0aGlzLlJFU1BfUlVOVElNRV9MT0dfRVJST1IpXG5cdFx0XHR7XG5cdFx0XHRcdC8vIERpc2FibGUgY29udHJvbHNcblx0XHRcdFx0dGhpcy5fZW5hYmxlUnVudGltZUxvZ0NvbnRyb2xzKGZhbHNlKTtcblxuXHRcdFx0XHQvLyBSZW1vdmUgbG9hZGluZyBiYXIgKHJ1bnRpbWUgbG9nKVxuXHRcdFx0XHR0aGlzLl9zd2l0Y2hSdW50aW1lVmlld1N0YWNrKCdsZ3YtcnVudGltZUxvZ0Vycm9yVmlldycpO1xuXG5cdFx0XHRcdC8vIERpc2FibGUgcnVudGltZSBsb2cgYmFja3VwIGRvd25sb2FkXG5cdFx0XHRcdHRoaXMuX3J1bnRpbWVMb2dCYWNrdXBVbmF2YWlsYWJsZSA9IHRydWU7XG5cdFx0XHRcdHRoaXMuX2Rpc2FibGVCYWNrdXBJbnRlcmZhY2UoZmFsc2UpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIE1vZGlmaWVkIGNvbnZlcnNpb24gcGF0dGVybiBpbiB0aGUgbG9nNGogcHJvcGVydGllcyBmaWxlOiB1bmFibGUgdG8gcGFyc2UgdGhlIGxvZ1xuXHRcdGVsc2UgaWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX1JVTlRJTUVfTE9HX0lOVkFMSUQpXG5cdFx0e1xuXHRcdFx0Ly8gRGlzYWJsZSBjb250cm9sc1xuXHRcdFx0dGhpcy5fZW5hYmxlUnVudGltZUxvZ0NvbnRyb2xzKGZhbHNlKTtcblxuXHRcdFx0Ly8gRmlsbCBpbiBlcnJvciBtZXNzYWdlXG5cdFx0XHQkKCcjbGd2LWNvbnZQYXR0TmFtZScpLnRleHQoZGF0YS5nZXRVdGZTdHJpbmcoJ3BhcmFtJykpO1xuXHRcdFx0JCgnI2xndi1jb252UGF0dFZhbCcpLnRleHQoZGF0YS5nZXRVdGZTdHJpbmcoJ3ZhbHVlJykpO1xuXG5cdFx0XHQvLyBSZW1vdmUgbG9hZGluZyBiYXIgKHJ1bnRpbWUgbG9nKVxuXHRcdFx0dGhpcy5fc3dpdGNoUnVudGltZVZpZXdTdGFjaygnbGd2LWludkNvbnZQYXR0VmlldycpO1xuXHRcdH1cblxuXHRcdC8vIFJ1bnRpbWUgbG9nIHJlY2VpdmVkXG5cdFx0ZWxzZSBpZiAoY29tbWFuZCA9PSB0aGlzLlJFU1BfUlVOVElNRV9MT0cpXG5cdFx0e1xuXHRcdFx0bGV0IGNsYXNzZXMgPSBbXTtcblx0XHRcdGNsYXNzZXMucHVzaCh0aGlzLkFOWV9DTEFTUyk7XG5cblx0XHRcdGxldCBsb2dFbnRyaWVzID0gZGF0YS5nZXRVdGZTdHJpbmdBcnJheSh0aGlzLkxPR19EQVRBX0xBQkVMKTtcblx0XHRcdGxldCBzZXBhcmF0b3IgPSBkYXRhLmdldFV0ZlN0cmluZygnc2VwJyk7XG5cdFx0XHRsZXQgY29sdW1ucyA9IGRhdGEuZ2V0SW50KCdjb2xzJyk7XG5cdFx0XHRsZXQgZHNBcnIgPSBbXTtcblxuXHRcdFx0dGhpcy5fdG90YWxSdW50aW1lTG9nRW50cmllcyA9IGxvZ0VudHJpZXMubGVuZ3RoO1xuXG5cdFx0XHQvLyBQYXJzZSBsb2cgZW50cmllc1xuXHRcdFx0Ly8gV2UgY2FuJ3QgdXNlIHRoZSBzcGxpdCBtZXRob2QgYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBpbnN0YW5jZXMgb2YgdGhlIHNlcGFyYXRvciBpbiB0aGUgbG9nIG1lc3NhZ2UgdG9vXG5cdFx0XHRmb3IgKGxldCBlID0gMDsgZSA8IGxvZ0VudHJpZXMubGVuZ3RoOyBlKyspXG5cdFx0XHR7XG5cdFx0XHRcdGNvbnN0IGxvZ0VudHJ5ID0gbG9nRW50cmllc1tlXTtcblxuXHRcdFx0XHRsZXQgbG9nRW50cnlEYXRhID0gW107XG5cdFx0XHRcdGxldCBzdGFydEluZGV4ID0gMDtcblxuXHRcdFx0XHRmb3IgKGxldCBjID0gMDsgYyA8IGNvbHVtbnMgLSAxOyBjKyspXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsZXQgZW5kSW5kZXggPSBsb2dFbnRyeS5pbmRleE9mKHNlcGFyYXRvciwgc3RhcnRJbmRleCk7XG5cdFx0XHRcdFx0bG9nRW50cnlEYXRhLnB1c2gobG9nRW50cnkuc3Vic3RyaW5nKHN0YXJ0SW5kZXgsIGVuZEluZGV4KSk7XG5cdFx0XHRcdFx0c3RhcnRJbmRleCA9IGVuZEluZGV4ICsgc2VwYXJhdG9yLmxlbmd0aDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChzdGFydEluZGV4IDwgbG9nRW50cnkubGVuZ3RoKVxuXHRcdFx0XHRcdGxvZ0VudHJ5RGF0YS5wdXNoKGxvZ0VudHJ5LnN1YnN0cmluZyhzdGFydEluZGV4KSk7XG5cblx0XHRcdFx0Ly8gRmlsbCBkYXRhZ3JpZCdzIGRhdGFwcm92aWRlclxuXHRcdFx0XHRsZXQgcmxlID0gUnVudGltZUxvZ0VudHJ5LmZyb21BcnJheShzZXBhcmF0b3IsIGxvZ0VudHJ5RGF0YSk7XG5cdFx0XHRcdGRzQXJyLnB1c2gocmxlKTtcblxuXHRcdFx0XHQvLyBBZGQgY2xhc3MgdG8gZmlsdGVyaW5nIGRyb3Bkb3duXG5cdFx0XHRcdGlmIChjbGFzc2VzLmluZGV4T2YocmxlLmNsYXp6KSA8IDApXG5cdFx0XHRcdFx0Y2xhc3Nlcy5wdXNoKHJsZS5jbGF6eik7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNob3cgY2xhc3NlcyBsaXN0XG5cdFx0XHRjbGFzc2VzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcblx0XHRcdFx0cmV0dXJuIGEubG9jYWxlQ29tcGFyZShiKTtcblx0XHRcdH0pO1xuXG5cdFx0XHR0aGlzLl9jbGFzc0ZpbHRlckRELnNldERhdGFTb3VyY2UoY2xhc3Nlcyk7XG5cdFx0XHR0aGlzLl9jbGFzc0ZpbHRlckRELnNlbGVjdCgwKTtcblxuXHRcdFx0Ly8gQXNzaWduIGRhdGEgc291cmNlIHRvIGdyaWRcblx0XHRcdGxldCBkcyA9IG5ldyBrZW5kby5kYXRhLkRhdGFTb3VyY2Uoe1xuXHRcdFx0XHRkYXRhOiBkc0FyclxuXHRcdFx0fSlcblxuXHRcdFx0dGhpcy5fc2V0UnVudGltZUxvZ0RhdGFTb3VyY2UoZHMpO1xuXG5cdFx0XHQvLyBSZS1lbmFibGUgbG9nIGxvYWRpbmcgY29udHJvbHNcblx0XHRcdHRoaXMuX2VuYWJsZVJ1bnRpbWVMb2dDb250cm9scyh0cnVlKTtcblxuXHRcdFx0Ly8gUmVtb3ZlIGxvYWRpbmcgYmFyXG5cdFx0XHR0aGlzLl9zd2l0Y2hSdW50aW1lVmlld1N0YWNrKCdsZ3YtcnVudGltZUxvZ1ZpZXcnKTtcblx0XHR9XG5cblx0XHQvLyBCb290IGxvZyByZWNlaXZlZFxuXHRcdGVsc2UgaWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX0JPT1RfTE9HKVxuXHRcdHtcblx0XHRcdGNvbnN0IGJvb3RMb2dFbnRyaWVzID0gZGF0YS5nZXRTRlNBcnJheSh0aGlzLkxPR19EQVRBX0xBQkVMKTtcblx0XHRcdGxldCB0ZXh0ID0gJyc7XG5cblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYm9vdExvZ0VudHJpZXMuc2l6ZSgpOyBpKyspXG5cdFx0XHRcdHRleHQgKz0gYm9vdExvZ0VudHJpZXMuZ2V0VXRmU3RyaW5nKGkpICsgJ1xcbic7XG5cblx0XHRcdCQoJyNsZ3YtYm9vdExvZ1RleHQnKS50ZXh0KHRleHQpO1xuXG5cdFx0XHQvLyBSZW1vdmUgbG9hZGluZyBiYXJcblx0XHRcdHRoaXMuX3N3aXRjaEJvb3RWaWV3U3RhY2soJ2xndi1ib290TG9nVmlldycpO1xuXHRcdH1cblxuXHRcdC8vIExvZ3MgYmFja3VwcyBzdGF0dXMgcmVjZWl2ZWRcblx0XHRlbHNlIGlmIChjb21tYW5kID09IHRoaXMuUkVTUF9CQUNLVVBTX1NUQVRVUylcblx0XHR7XG5cdFx0XHQvLyBTaG93L2hpZGUgb3BlcmF0aW9uIGluIHByb2dyZXNzIG1lc3NhZ2Vcblx0XHRcdHRoaXMuX2Rpc2FibGVCYWNrdXBJbnRlcmZhY2UoZGF0YS5nZXRCb29sKCdydW5uaW5nJyksIGRhdGEuZ2V0VXRmU3RyaW5nKCd0eXBlJykpO1xuXG5cdFx0XHQvLyBCYWNrdXAgZmlsZXMgbGlzdFxuXHRcdFx0aWYgKGRhdGEuY29udGFpbnNLZXkoJ2ZpbGVzJykpXG5cdFx0XHR7XG5cdFx0XHRcdGxldCBmaWxlcyA9IGRhdGEuZ2V0U0ZTQXJyYXkoJ2ZpbGVzJyk7XG5cblx0XHRcdFx0bGV0IGxhc3RCb290TG9nQmFja3VwRm91bmQgPSBmYWxzZTtcblx0XHRcdFx0bGV0IGxhc3RSdW50aW1lTG9nQmFja3VwRm91bmQgPSBmYWxzZTtcblx0XHRcdFx0bGV0IGxhc3RGdWxsQmFja3VwRm91bmQgPSBmYWxzZTtcblxuXHRcdFx0XHRsZXQgYmFja3Vwc0xpc3QgPSBbXTtcblxuXHRcdFx0XHRjb25zdCB3ZWJTZXJ2ZXJQcm90b2NvbCA9IChkYXRhLmNvbnRhaW5zS2V5KCdwcm90b2NvbCcpID8gZGF0YS5nZXRVdGZTdHJpbmcoJ3Byb3RvY29sJykgOiAnaHR0cCcpICsgJzovLyc7XG5cdFx0XHRcdGNvbnN0IHdlYlNlcnZlclBvcnQgPSAoZGF0YS5jb250YWluc0tleSgncG9ydCcpID8gJzonICsgZGF0YS5nZXRJbnQoJ3BvcnQnKSA6ICcnKTtcblxuXHRcdFx0XHRsZXQgdG90YWxTaXplID0gMDtcblxuXHRcdFx0XHRmb3IgKGxldCBmID0gMDsgZiA8IGZpbGVzLnNpemUoKTsgZisrKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Y29uc3QgZmlsZSA9IGZpbGVzLmdldFNGU09iamVjdChmKTtcblxuXHRcdFx0XHRcdGNvbnN0IGZpbGVQYXRoID0gZmlsZS5nZXRVdGZTdHJpbmcoJ3BhdGgnKTtcblxuXHRcdFx0XHRcdGNvbnN0IGZpbGVPYmogPSB7fTtcblx0XHRcdFx0XHRmaWxlT2JqLnBhdGggPSBmaWxlUGF0aDtcblx0XHRcdFx0XHRmaWxlT2JqLnVybCA9IHdlYlNlcnZlclByb3RvY29sICsgdGhpcy5zbWFydEZveC5jb25maWcuaG9zdCArIHdlYlNlcnZlclBvcnQgKyAnLycgKyBmaWxlUGF0aDtcblx0XHRcdFx0XHRmaWxlT2JqLm5hbWUgPSBmaWxlUGF0aC5zdWJzdHIoZmlsZVBhdGgubGFzdEluZGV4T2YoJy8nKSArIDEpO1xuXHRcdFx0XHRcdGZpbGVPYmouZGF0ZSA9IGZpbGUuZ2V0VXRmU3RyaW5nKCdkYXRlJyk7XG5cdFx0XHRcdFx0ZmlsZU9iai50aW1lID0gZmlsZS5nZXRVdGZTdHJpbmcoJ3RpbWUnKTtcblx0XHRcdFx0XHRmaWxlT2JqLnNpemUgPSBieXRlc1RvU2l6ZShmaWxlLmdldExvbmcoJ3NpemUnKSwgMik7XG5cblx0XHRcdFx0XHR0b3RhbFNpemUgKz0gZmlsZS5nZXRMb25nKCdzaXplJyk7XG5cblx0XHRcdFx0XHQvLyBDaGVjayBpZiB0aGlzIGlzIGEgYm9vdCBsb2cgYmFja3VwXG5cdFx0XHRcdFx0aWYgKCFsYXN0Qm9vdExvZ0JhY2t1cEZvdW5kKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGlmIChmaWxlT2JqLm5hbWUuc3RhcnRzV2l0aCh0aGlzLkJPT1RfTE9HX0JBQ0tVUF9JRCkpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRoaXMuX2ZpbGxCYWNrdXBDYXJkKCcjbGd2LWJvb3RMb2dCYWNrdXBDYXJkJywgZmlsZU9iaik7XG5cblx0XHRcdFx0XHRcdFx0bGFzdEJvb3RMb2dCYWNrdXBGb3VuZCA9IHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gQ2hlY2sgaWYgdGhpcyBpcyBhIHJ1bnRpbWUgbG9nIGJhY2t1cFxuXHRcdFx0XHRcdGlmICghbGFzdFJ1bnRpbWVMb2dCYWNrdXBGb3VuZClcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRpZiAoZmlsZU9iai5uYW1lLnN0YXJ0c1dpdGgodGhpcy5SVU5USU1FX0xPR19CQUNLVVBfSUQpKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0aGlzLl9maWxsQmFja3VwQ2FyZCgnI2xndi1ydW50aW1lTG9nQmFja3VwQ2FyZCcsIGZpbGVPYmopO1xuXG5cdFx0XHRcdFx0XHRcdGxhc3RSdW50aW1lTG9nQmFja3VwRm91bmQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIENoZWNrIGlmIHRoaXMgaXMgYSBmdWxsIGJhY2t1cFxuXHRcdFx0XHRcdGlmICghbGFzdEZ1bGxCYWNrdXBGb3VuZClcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRpZiAoZmlsZU9iai5uYW1lLnN0YXJ0c1dpdGgodGhpcy5GVUxMX0JBQ0tVUF9JRCkpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRoaXMuX2ZpbGxCYWNrdXBDYXJkKCcjbGd2LWZ1bGxMb2dCYWNrdXBDYXJkJywgZmlsZU9iaik7XG5cblx0XHRcdFx0XHRcdFx0bGFzdEZ1bGxCYWNrdXBGb3VuZCA9IHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gUG9wdWxhdGUgbG9ncyBsaXN0XG5cdFx0XHRcdFx0YmFja3Vwc0xpc3QucHVzaChmaWxlT2JqKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFNob3cgdG90YWwgYmFja3VwcyBzaXplXG5cdFx0XHRcdCQoJyNsZ3YtbG9nU2l6ZUxiJykuaHRtbChgVG90YWwgc2l6ZTogPHN0cm9uZz4ke2J5dGVzVG9TaXplKHRvdGFsU2l6ZSwgMiwgJ0tCJyl9PC9zdHJvbmc+YCk7XG5cblx0XHQgICBcdFx0Ly8gQXNzaWduIGRhdGEgc291cmNlIHRvIGdyaWRcblx0XHRcdFx0dGhpcy5fc2V0RG93bmxvYWRHcmlkRGF0YVNvdXJjZShiYWNrdXBzTGlzdCk7XG5cdFx0XHRcdHRoaXMuX29uRG93bmxvYWRHcmlkU2VsZWN0aW9uQ2hhbmdlKCk7XG5cblx0XHRcdFx0Ly8gSGlkZSBsaW5rcyB0byBsYXRlc3QgZmlsZXMgaWYgbm90IGF2YWlsYWJsZVxuXHRcdFx0XHRpZiAoIWxhc3RCb290TG9nQmFja3VwRm91bmQpXG5cdFx0XHRcdFx0dGhpcy5fZmlsbEJhY2t1cENhcmQoJyNsZ3YtYm9vdExvZ0JhY2t1cENhcmQnLCBudWxsKTtcblxuXHRcdFx0XHRpZiAoIWxhc3RSdW50aW1lTG9nQmFja3VwRm91bmQpXG5cdFx0XHRcdFx0dGhpcy5fZmlsbEJhY2t1cENhcmQoJyNsZ3YtcnVudGltZUxvZ0JhY2t1cENhcmQnLCBudWxsKTtcblxuXHRcdFx0XHRpZiAoIWxhc3RGdWxsQmFja3VwRm91bmQpXG5cdFx0XHRcdFx0dGhpcy5fZmlsbEJhY2t1cENhcmQoJyNsZ3YtZnVsbExvZ0JhY2t1cENhcmQnLCBudWxsKTtcblxuXHRcdFx0XHRpZiAoZGF0YS5jb250YWluc0tleSgnbWVzc2FnZScpKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Ly8gRGlzcGxheSBub3RpZmljYXRpb25cblx0XHRcdFx0XHR0aGlzLnNoZWxsQ3RybC5zaG93Tm90aWZpY2F0aW9uKGBMb2cgYmFja3VwIHdhcm5pbmdgLCBkYXRhLmdldFV0ZlN0cmluZygnbWVzc2FnZScpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBTZXQgZG93bmxvYWQgdmlldyB0byBtYWluXG5cdFx0XHR0aGlzLl9zd2l0Y2hEb3dubG9hZFZpZXdTdGFjaygnbGd2LWRvd25sb2FkVmlldycpO1xuXHRcdH1cblxuXHRcdC8vIExvZ3MgYmFja3VwIGRlbGV0aW9uIGZhaWxlZFxuXHRcdGVsc2UgaWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX0RFTEVURV9CQUNLVVBfRkFJTEVEKVxuXHRcdHtcblx0XHRcdGNvbnN0IGVycm9yID0gZGF0YS5nZXRVdGZTdHJpbmcoJ2Vycm9yJyk7XG5cblx0XHRcdC8vIFNob3cgYW4gYWxlcnRcblx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dTaW1wbGVBbGVydChlcnJvciwgdHJ1ZSk7XG5cdFx0fVxuXG5cdFx0Ly8gQSBibG9ja2luZyBlcnJvciBvY2N1cnJlZCBkdXJpbmcgYmFja3VwIG9wZXJhdGlvblxuXHRcdGVsc2UgaWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX0JBQ0tVUF9FUlJPUilcblx0XHR7XG5cdFx0XHRjb25zdCBlcnJvciA9IGRhdGEuZ2V0VXRmU3RyaW5nKCdlcnJvcicpO1xuXG5cdFx0XHQvLyBTaG93IGFuIGFsZXJ0XG5cdFx0XHR0aGlzLnNoZWxsQ3RybC5zaG93U2ltcGxlQWxlcnQoZXJyb3IsIHRydWUpO1xuXHRcdH1cblxuXHRcdC8vIEFuIG5vbi1ibG9ja2luZyBlcnJvciBvY2N1cnJlZCBkdXJpbmcgYmFja3VwIG9wZXJhdGlvblxuXHRcdGVsc2UgaWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX0JBQ0tVUF9XQVJOSU5HKVxuXHRcdHtcblx0XHRcdGxldCB3YXJuID0gZGF0YS5nZXRVdGZTdHJpbmcoJ3dhcm4nKTtcblxuXHRcdFx0Ly8gRGlzcGxheSBub3RpZmljYXRpb25cblx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dOb3RpZmljYXRpb24oYExvZyBiYWNrdXAgd2FybmluZ2AsIHdhcm4pO1xuXHRcdH1cblx0fVxuXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdC8vIFVJIEVWRU5UIExJU1RFTkVSU1xuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdF9vblRhYlNob3duKGUpXG5cdHtcblx0XHRpZiAoIXRoaXMuX2luaXRGYWlsZWQpXG5cdFx0e1xuXHRcdFx0Ly8gSWYgYm9vdCBsb2cgdmlldyB3YXMgZGlzcGxheWVkLi4uXG5cdFx0XHRpZiAoZS50YXJnZXQuaWQgPT0gJ2xndi1ib290TG9nLXRhYicpXG5cdFx0XHR7XG5cdFx0XHRcdC8vIExvYWQgYm9vdCBsb2cgdGhlIGZpcnN0IHRpbWUgdGhlIHRhYiBpcyBzZWxlY3RlZFxuXHRcdFx0XHRpZiAoIXRoaXMuX2Jvb3RMb2dSZXF1ZXN0ZWQpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX0dFVF9CT09UX0xPRyk7XG5cdFx0XHRcdFx0dGhpcy5fYm9vdExvZ1JlcXVlc3RlZCA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgYmFja3VwJmRvd2xvYWQgdmlldyB3YXMgZGlzcGxheWVkLi4uXG5cdFx0XHRlbHNlIGlmIChlLnRhcmdldC5pZCA9PSAnbGd2LWxvZ3NEb3dubG9hZC10YWInKVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBSZXF1ZXN0IGxvZ3MgYmFja3VwIHN0YXR1cyB0aGUgZmlyc3QgdGltZSB0aGUgdGFiIGlzIHNlbGVjdGVkXG5cdFx0XHRcdGlmICghdGhpcy5fYmFja3VwU3RhdHVzUmVxdWVzdGVkKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGhpcy5zZW5kRXh0ZW5zaW9uUmVxdWVzdCh0aGlzLlJFUV9HRVRfQkFDS1VQU19TVEFUVVMpO1xuXHRcdFx0XHRcdHRoaXMuX2JhY2t1cFN0YXR1c1JlcXVlc3RlZCA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRfb25SdW50aW1lTG9nTG9hZEJ0Q2xpY2soKVxuXHR7XG5cdFx0Ly8gUmVxdWVzdCBsb2dcblx0XHR0aGlzLl9sb2FkUnVudGltZUxvZygpO1xuXHR9XG5cblx0X29uRXhwb3J0Qm9vdExvZ0J0Q2xpY2soKVxuXHR7XG5cdFx0Ly8gRXhwb3J0IGxvZyB0byBmaWxlXG5cdFx0dGhpcy5fZXhwb3J0TG9nKCQoJyNsZ3YtYm9vdExvZ1RleHQnKS50ZXh0KCksIHRoaXMuQk9PVF9MT0dfQkFDS1VQX0lEKTtcblx0fVxuXG5cdF9vblN3aXRjaEJvb3RMb2dDb2xvckJ0Q2xpY2soKVxuXHR7XG5cdFx0aWYgKCQoJyNsZ3YtYm9vdExvZ1RleHQnKS5oYXNDbGFzcygnaW52ZXJ0JykpXG5cdFx0XHQkKCcjbGd2LWJvb3RMb2dUZXh0JykucmVtb3ZlQ2xhc3MoJ2ludmVydCcpO1xuXHRcdGVsc2Vcblx0XHRcdCQoJyNsZ3YtYm9vdExvZ1RleHQnKS5hZGRDbGFzcygnaW52ZXJ0Jyk7XG5cdH1cblxuXHRfb25Cb290TG9nR2VuZXJhdGVCdENsaWNrKClcblx0e1xuXHRcdC8vIFNob3cvaGlkZSBvcGVyYXRpb24gaW4gcHJvZ3Jlc3MgbWVzc2FnZVxuXHRcdHRoaXMuX2Rpc2FibGVCYWNrdXBJbnRlcmZhY2UodHJ1ZSwgdGhpcy5CT09UX0xPR19CQUNLVVBfSUQpO1xuXG5cdFx0Ly8gUmVxdWVzdCBiYWNrdXAgZ2VuZXJhdGlvblxuXHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfQkFDS1VQX0JPT1RfTE9HKTtcblx0fVxuXG5cdF9vblJ1bnRpbWVMb2dHZW5lcmF0ZUJ0Q2xpY2soKVxuXHR7XG5cdFx0Ly8gU2hvdy9oaWRlIG9wZXJhdGlvbiBpbiBwcm9ncmVzcyBtZXNzYWdlXG5cdFx0dGhpcy5fZGlzYWJsZUJhY2t1cEludGVyZmFjZSh0cnVlLCB0aGlzLlJVTlRJTUVfTE9HX0JBQ0tVUF9JRCk7XG5cblx0XHQvLyBSZXF1ZXN0IGJhY2t1cCBnZW5lcmF0aW9uXG5cdFx0dGhpcy5zZW5kRXh0ZW5zaW9uUmVxdWVzdCh0aGlzLlJFUV9CQUNLVVBfUlVOVElNRV9MT0cpO1xuXHR9XG5cblx0X29uRnVsbExvZ3NHZW5lcmF0ZUJ0Q2xpY2soKVxuXHR7XG5cdFx0Ly8gU2hvdy9oaWRlIG9wZXJhdGlvbiBpbiBwcm9ncmVzcyBtZXNzYWdlXG5cdFx0dGhpcy5fZGlzYWJsZUJhY2t1cEludGVyZmFjZSh0cnVlLCB0aGlzLkZVTExfQkFDS1VQX0lEKTtcblxuXHRcdC8vIFJlcXVlc3QgYmFja3VwIGdlbmVyYXRpb25cblx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX0JBQ0tVUF9GVUxMX0xPR1MpO1xuXHR9XG5cblx0X29uRmlsdGVyQ2hhbmdlKClcblx0e1xuXHRcdC8vIFNldCBmaWx0ZXJzXG5cdFx0dGhpcy5fc2V0UnVudGltZUxvZ0RhdGFTb3VyY2UodGhpcy5fcnVudGltZUxvZ0dyaWQuZGF0YVNvdXJjZSk7XG5cdH1cblxuXHRfb25DbGVhckZpbHRlckNsaWNrKClcblx0e1xuXHRcdHRoaXMuX2NsZWFyUnVudGltZUxvZ0ZpbHRlcnMoKTtcblx0XHR0aGlzLl9zZXRSdW50aW1lTG9nRGF0YVNvdXJjZSh0aGlzLl9ydW50aW1lTG9nR3JpZC5kYXRhU291cmNlKTtcblx0fVxuXG5cdF9vbkV4cG9ydFJ1bnRpbWVMb2dCdENsaWNrKClcblx0e1xuXHRcdGxldCBsb2cgPSAnJztcblx0XHRjb25zdCBlbnRyaWVzID0gdGhpcy5fcnVudGltZUxvZ0dyaWQuZGF0YVNvdXJjZS52aWV3KCk7XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspXG5cdFx0e1xuXHRcdFx0Y29uc3QgaXRlbSA9IGVudHJpZXNbaV07XG5cdFx0XHRsb2cgKz0gW2l0ZW0uZGF0ZSwgaXRlbS50aW1lLCBpdGVtLmxldmVsLCBpdGVtLnRocmVhZCwgaXRlbS5jbGF6eiwgaXRlbS5tZXNzYWdlXS5qb2luKGl0ZW0uc2VwKSArICdcXG4nO1xuXHRcdH1cblxuXHRcdC8vIEV4cG9ydCBsb2cgdG8gZmlsZVxuXHRcdHRoaXMuX2V4cG9ydExvZyhsb2csIHRoaXMuUlVOVElNRV9MT0dfQkFDS1VQX0lEKTtcblx0fVxuXG5cdF9vbkRvd25sb2FkR3JpZFNlbGVjdGlvbkNoYW5nZSgpXG5cdHtcblx0XHQvLyBFbmFibGUvZGlzYWJsZSBidXR0b25zXG5cdFx0Y29uc3Qgc2VsZWN0ZWRSb3dzID0gdGhpcy5fZG93bmxvYWRHcmlkLnNlbGVjdCgpO1xuXHRcdCQoJyNsZ3YtZG93bmxvYWRCdCcpLmF0dHIoJ2Rpc2FibGVkJywgc2VsZWN0ZWRSb3dzLmxlbmd0aCA9PSAwKTtcblx0XHQkKCcjbGd2LWRlbGV0ZUJ0JykuYXR0cignZGlzYWJsZWQnLCBzZWxlY3RlZFJvd3MubGVuZ3RoID09IDApO1xuXG5cdFx0aWYgKHNlbGVjdGVkUm93cy5sZW5ndGggPiAwKVxuXHRcdHtcblx0XHRcdGxldCBkYXRhSXRlbSA9IHRoaXMuX2Rvd25sb2FkR3JpZC5kYXRhSXRlbShzZWxlY3RlZFJvd3NbMF0pO1xuXHRcdFx0JCgnI2xndi1kb3dubG9hZEJ0JykuYXR0cignaHJlZicsIGRhdGFJdGVtLnVybCk7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHRcdCQoJyNsZ3YtZG93bmxvYWRCdCcpLmF0dHIoJ2hyZWYnLCAnIycpO1xuXHR9XG5cblx0X29uRGVsZXRlQnRDbGljaygpXG5cdHtcblx0XHRsZXQgc2VsZWN0ZWRSb3dzID0gdGhpcy5fZG93bmxvYWRHcmlkLnNlbGVjdCgpO1xuXG5cdFx0aWYgKHNlbGVjdGVkUm93cy5sZW5ndGggPiAwKVxuXHRcdHtcblx0XHRcdGxldCBkYXRhSXRlbSA9IHRoaXMuX2Rvd25sb2FkR3JpZC5kYXRhSXRlbShzZWxlY3RlZFJvd3NbMF0pO1xuXG5cdFx0XHQvLyBSZXF1ZXN0IGJhY2t1cCBkZWxldGlvblxuXHRcdFx0bGV0IHBhcmFtcyA9IG5ldyBTRlMyWC5TRlNPYmplY3QoKTtcblx0XHRcdHBhcmFtcy5wdXRVdGZTdHJpbmcoJ2ZpbGUnLCBkYXRhSXRlbS5uYW1lKTtcblxuXHRcdFx0dGhpcy5zZW5kRXh0ZW5zaW9uUmVxdWVzdCh0aGlzLlJFUV9ERUxFVEVfQkFDS1VQLCBwYXJhbXMpO1xuXHRcdH1cblx0fVxuXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdC8vIFBSSVZBVEUgTUVUSE9EU1xuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdF9zd2l0Y2hSdW50aW1lVmlld1N0YWNrKHZpZXdJZClcblx0e1xuXHRcdGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsZ3YtcnVudGltZS12aWV3c3RhY2snKS5zZWxlY3RlZEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh2aWV3SWQpO1xuXHR9XG5cblx0X3N3aXRjaEJvb3RWaWV3U3RhY2sodmlld0lkKVxuXHR7XG5cdFx0ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xndi1ib290LXZpZXdzdGFjaycpLnNlbGVjdGVkRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHZpZXdJZCk7XG5cdH1cblxuXHRfc3dpdGNoRG93bmxvYWRWaWV3U3RhY2sodmlld0lkKVxuXHR7XG5cdFx0ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xndi1kb3dubG9hZC12aWV3c3RhY2snKS5zZWxlY3RlZEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh2aWV3SWQpO1xuXHR9XG5cblx0X2VuYWJsZVJ1bnRpbWVMb2dDb250cm9scyhlbmFibGUpXG5cdHtcblx0XHQkKCcjbGd2LWxvYWRCdCcpLmF0dHIoJ2Rpc2FibGVkJywgIWVuYWJsZSk7XG5cdFx0JCgnI2xndi1leHBvcnRSdW50aW1lTG9nQnQnKS5hdHRyKCdkaXNhYmxlZCcsICFlbmFibGUpO1xuXHRcdCQoJyNsZ3YtZmlsdGVyQnQnKS5hdHRyKCdkaXNhYmxlZCcsICFlbmFibGUpO1xuXHR9XG5cblx0X2xvYWRSdW50aW1lTG9nKClcblx0e1xuXHRcdC8vIERpc2FibGUgY29udHJvbHMgdG8gbG9hZCBsb2csIHNvIHRoYXQgaW1wYXRpZW50IHVzZXJzIGNhbid0IHNlbmQgbXVsdGlwbGUgcmVxdWVzdHNcblx0XHQvLyAoaXQgd2lsbCBiZSBlbmFibGVkIGFnYWluIHdoZW4gYSByZXNwb25zZSBpcyByZWNlaXZlZClcblx0XHR0aGlzLl9lbmFibGVSdW50aW1lTG9nQ29udHJvbHMoZmFsc2UpO1xuXG5cdFx0Ly8gQ2xlYXIgZmlsdGVyc1xuXHRcdHRoaXMuX2NsZWFyUnVudGltZUxvZ0ZpbHRlcnMoKTtcblxuXHRcdC8vIFNob3cgbG9hZGluZyBiYXJcblx0XHR0aGlzLl9zd2l0Y2hSdW50aW1lVmlld1N0YWNrKCdsZ3YtcnVudGltZUxvZ0xvYWRpbmdWaWV3Jyk7XG5cblx0XHQvLyBTZW5kIHJlcXVlc3Rcblx0XHQvLyAodGhlIG51bWJlciBvZiBsaW5lcyB0byBiZSByZXRyaWV2ZWQgaXMgc2VudClcblx0XHRsZXQgcGFyYW1zID0gbmV3IFNGUzJYLlNGU09iamVjdCgpO1xuXHRcdHBhcmFtcy5wdXRJbnQoJ251bUVudHJpZXMnLCBOdW1iZXIodGhpcy5fbG9nTGluZXNERC52YWx1ZSgpKSk7XG5cblx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX0dFVF9SVU5USU1FX0xPRywgcGFyYW1zKTtcblx0fVxuXG5cdF9jbGVhclJ1bnRpbWVMb2dGaWx0ZXJzKClcblx0e1xuXHRcdHRoaXMuX2xldmVsRmlsdGVyREQuc2VsZWN0KDApO1xuXHRcdHRoaXMuX2NsYXNzRmlsdGVyREQuc2VsZWN0KDApO1xuXHRcdCQoJyNsZ3YtbWVzc2FnZUluJykudmFsKCcnKTtcblx0fVxuXG5cdF9leHBvcnRMb2cobG9nLCBuYW1lKVxuXHR7XG5cdFx0bGV0IGJsb2IgPSBuZXcgQmxvYihbbG9nXSwge3R5cGU6IFwidGV4dC9wbGFpbjtjaGFyc2V0PXV0Zi04XCJ9KTtcblx0XHRsZXQgZGF0ZSA9IG1vbWVudCgpLmZvcm1hdCgnWVlZWU1NRERfSEhtbXNzJyk7XG5cblx0XHRGaWxlU2F2ZXIuc2F2ZUFzKGJsb2IsIGAke25hbWV9XyR7ZGF0ZX0ubG9nYCk7XG5cdH1cblxuXHRfc2V0UnVudGltZUxvZ0RhdGFTb3VyY2UoZHMpXG5cdHtcblx0XHQvLyBSZWFkIGN1cnJlbnQgaG9yaXpvbnRhbCBzY3JvbGwgdmFsdWVcblx0XHRjb25zdCBzY3JvbGxMZWZ0ID0gJCgnI2xndi1ydW50aW1lTG9nR3JpZCAuay1ncmlkLWNvbnRlbnQnLCB0aGlzLl9ydW50aW1lTG9nR3JpZC53cmFwcGVyKS5zY3JvbGxMZWZ0KCk7XG5cblx0XHQvLyBBc3NpZ24gZGF0YSBzb3VyY2UgdG8gZ3JpZFxuXHRcdHRoaXMuX3J1bnRpbWVMb2dHcmlkLnNldERhdGFTb3VyY2UoZHMpO1xuXG5cdFx0Ly8gU2V0IGZpbHRlcnNcblx0XHR0aGlzLl9zZXRGaWx0ZXJzKGRzKTtcblxuXHRcdC8vIFNldCBob3Jpem9udGFsIHNjcm9sbFxuXHRcdCQoJyNsZ3YtcnVudGltZUxvZ0dyaWQgLmstZ3JpZC1jb250ZW50JywgdGhpcy5fcnVudGltZUxvZ0dyaWQud3JhcHBlcikuc2Nyb2xsTGVmdChzY3JvbGxMZWZ0KTtcblxuXHRcdC8vIFVwZGF0ZSBjb3VudGVyXG5cdFx0JCgnI2xndi1ydW50aW1lTG9nRW50cmllc0xiJykudGV4dChgTG9nIGVudHJpZXM6ICR7dGhpcy5fdG90YWxSdW50aW1lTG9nRW50cmllc30gKCR7ZHMudG90YWwoKX0gZGlzcGxheWVkKWApO1xuXHR9XG5cblx0X3NldEZpbHRlcnMoZHMpXG5cdHtcblx0XHRsZXQgZmlsdGVycyA9IFtdO1xuXG5cdFx0Ly8gTGV2ZWwgZmlsdGVyaW5nXG5cdFx0aWYgKHRoaXMuX2xldmVsRmlsdGVyREQuc2VsZWN0KCkgPiAwKVxuXHRcdFx0ZmlsdGVycy5wdXNoKHtcblx0XHRcdFx0ZmllbGQ6ICdsZXZlbCcsIG9wZXJhdG9yOiAnZXEnLCB2YWx1ZTogdGhpcy5fbGV2ZWxGaWx0ZXJERC52YWx1ZSgpXG5cdFx0XHR9KTtcblxuXHRcdC8vIENsYXNzIGZpbHRlcmluZ1xuXHRcdGlmICh0aGlzLl9jbGFzc0ZpbHRlckRELnNlbGVjdCgpID4gMClcblx0XHRcdGZpbHRlcnMucHVzaCh7XG5cdFx0XHRcdGZpZWxkOiAnY2xhenonLCBvcGVyYXRvcjogJ2VxJywgdmFsdWU6IHRoaXMuX2NsYXNzRmlsdGVyREQudmFsdWUoKVxuXHRcdFx0fSk7XG5cblx0XHQvLyBNZXNzYWdlIGZpbHRlcmluZ1xuXHRcdGlmICgkKCcjbGd2LW1lc3NhZ2VJbicpLnZhbCgpICE9ICcnKVxuXHRcdFx0ZmlsdGVycy5wdXNoKHtcblx0XHRcdFx0ZmllbGQ6ICdtZXNzYWdlJywgb3BlcmF0b3I6ICdjb250YWlucycsIHZhbHVlOiAkKCcjbGd2LW1lc3NhZ2VJbicpLnZhbCgpXG5cdFx0XHR9KTtcblxuXHRcdC8vIFNldCBmaWx0ZXJzXG5cdFx0ZHMuZmlsdGVyKGZpbHRlcnMpO1xuXHR9XG5cblx0X2Rpc2FibGVCYWNrdXBJbnRlcmZhY2UoZGlzYWJsZSwgYmFja3VwSWQgPSBudWxsKVxuXHR7XG5cdFx0aWYgKGRpc2FibGUpXG5cdFx0e1xuXHRcdFx0Ly8gU2hvdyBwcm9wZXIgcHJvZ3Jlc3MgYmFyXG5cdFx0XHRpZiAoYmFja3VwSWQgPT0gdGhpcy5CT09UX0xPR19CQUNLVVBfSUQpXG5cdFx0XHRcdCQoJyNsZ3YtYm9vdExvZ0JhY2t1cENhcmQgLnByb2dyZXNzLWJhcicpLnNob3coKTtcblx0XHRcdGVsc2UgaWYgKGJhY2t1cElkID09IHRoaXMuUlVOVElNRV9MT0dfQkFDS1VQX0lEKVxuXHRcdFx0XHQkKCcjbGd2LXJ1bnRpbWVMb2dCYWNrdXBDYXJkIC5wcm9ncmVzcy1iYXInKS5zaG93KCk7XG5cdFx0XHRlbHNlIGlmIChiYWNrdXBJZCA9PSB0aGlzLkZVTExfQkFDS1VQX0lEKVxuXHRcdFx0XHQkKCcjbGd2LWZ1bGxMb2dCYWNrdXBDYXJkIC5wcm9ncmVzcy1iYXInKS5zaG93KCk7XG5cblx0XHRcdC8vIERpc2FibGUgYnV0dG9uc1xuXHRcdFx0JCgnI2xndi1ib290TG9nQmFja3VwQ2FyZCAuYmFja3VwLWJ1dHRvbicpLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSk7XG5cdFx0XHQkKCcjbGd2LXJ1bnRpbWVMb2dCYWNrdXBDYXJkIC5iYWNrdXAtYnV0dG9uJykuYXR0cignZGlzYWJsZWQnLCB0cnVlKTtcblx0XHRcdCQoJyNsZ3YtZnVsbExvZ0JhY2t1cENhcmQgLmJhY2t1cC1idXR0b24nKS5hdHRyKCdkaXNhYmxlZCcsIHRydWUpO1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0Ly8gSGlkZSBhbGwgcHJvZ3Jlc3MgYmFyXG5cdFx0XHQkKCcuY2FyZC1ib2R5IC5wcm9ncmVzcy1iYXInKS5oaWRlKCk7XG5cblx0XHRcdC8vIEVuYWJsZSBidXR0b25zXG5cdFx0XHQkKCcjbGd2LWZ1bGxMb2dCYWNrdXBDYXJkIC5iYWNrdXAtYnV0dG9uJykuYXR0cignZGlzYWJsZWQnLCBmYWxzZSk7XG5cblx0XHRcdGlmICghdGhpcy5fYm9vdExvZ0JhY2t1cFVuYXZhaWxhYmxlKVxuXHRcdFx0XHQkKCcjbGd2LWJvb3RMb2dCYWNrdXBDYXJkIC5iYWNrdXAtYnV0dG9uJykuYXR0cignZGlzYWJsZWQnLCBmYWxzZSk7XG5cblx0XHRcdGlmICghdGhpcy5fcnVudGltZUxvZ0JhY2t1cFVuYXZhaWxhYmxlKVxuXHRcdFx0XHQkKCcjbGd2LXJ1bnRpbWVMb2dCYWNrdXBDYXJkIC5iYWNrdXAtYnV0dG9uJykuYXR0cignZGlzYWJsZWQnLCBmYWxzZSk7XG5cdFx0fVxuXHR9XG5cblx0X2luaXRCYWNrdXBDYXJkKGlkU2VsZWN0b3IpXG5cdHtcblx0XHQkKGlkU2VsZWN0b3IgKyAnIC5iYWNrdXAtZGV0YWlscycpLmhpZGUoKTtcblx0XHQkKGlkU2VsZWN0b3IgKyAnIC5wcm9ncmVzcy1iYXInKS5oaWRlKCk7XG5cdH1cblxuXHRfZmlsbEJhY2t1cENhcmQoaWRTZWxlY3RvciwgZGV0YWlsc09iaiA9IG51bGwpXG5cdHtcblx0XHRpZiAoZGV0YWlsc09iaiA9PSBudWxsKVxuXHRcdFx0JChpZFNlbGVjdG9yICsgJyAuYmFja3VwLWRldGFpbHMnKS5oaWRlKCk7XG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdCQoaWRTZWxlY3RvciArICcgLmJhY2t1cC1kZXRhaWxzJykuc2hvdygpO1xuXG5cdFx0XHQkKGlkU2VsZWN0b3IgKyAnIC5iYWNrdXAtbGluaycpLmF0dHIoJ2hyZWYnLCBkZXRhaWxzT2JqLnVybCk7XG5cdFx0XHQkKGlkU2VsZWN0b3IgKyAnIC5iYWNrdXAtZGF0ZScpLnRleHQoZGV0YWlsc09iai5kYXRlKTtcblx0XHRcdCQoaWRTZWxlY3RvciArICcgLmJhY2t1cC10aW1lJykudGV4dChkZXRhaWxzT2JqLnRpbWUpO1xuXHRcdFx0JChpZFNlbGVjdG9yICsgJyAuYmFja3VwLXNpemUnKS50ZXh0KGRldGFpbHNPYmouc2l6ZSk7XG5cdFx0fVxuXHR9XG5cblx0X3NldERvd25sb2FkR3JpZERhdGFTb3VyY2UoZHMpXG5cdHtcblx0XHQvLyBSZWFkIGN1cnJlbnQgaG9yaXpvbnRhbCBzY3JvbGwgdmFsdWVcblx0ICAgY29uc3Qgc2Nyb2xsTGVmdCA9ICQoJyNsZ3YtZG93bmxvYWRHcmlkIC5rLWdyaWQtY29udGVudCcsIHRoaXMuX2Rvd25sb2FkR3JpZC53cmFwcGVyKS5zY3JvbGxMZWZ0KCk7XG5cblx0ICAgLy8gQXNzaWduIGRhdGEgc291cmNlIHRvIGdyaWRcblx0ICAgdGhpcy5fZG93bmxvYWRHcmlkLnNldERhdGFTb3VyY2UoZHMpO1xuXG5cdCAgIC8vIFNldCBob3Jpem9udGFsIHNjcm9sbFxuXHQgICAkKCcjbGd2LWRvd25sb2FkR3JpZCAuay1ncmlkLWNvbnRlbnQnLCB0aGlzLl9kb3dubG9hZEdyaWQud3JhcHBlcikuc2Nyb2xsTGVmdChzY3JvbGxMZWZ0KTtcblx0fVxuXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdC8vIFBSSVZBVEUgR0VUVEVSU1xuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNuQkE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQzFCQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBIiwic291cmNlUm9vdCI6IiJ9