rubyfox-server 2.17.3.1 → 2.19.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (160) hide show
  1. checksums.yaml +4 -4
  2. data/lib/rubyfox/server/data/config/admin/descriptors/config_room.txt +10 -1
  3. data/lib/rubyfox/server/data/config/admin/descriptors/config_server.txt +90 -20
  4. data/lib/rubyfox/server/data/config/admin/descriptors/config_zone.txt +9 -0
  5. data/lib/rubyfox/server/data/config/admin/descriptors/runtime_room.txt +11 -0
  6. data/lib/rubyfox/server/data/config/admin/descriptors/runtime_user.txt +3 -3
  7. data/lib/rubyfox/server/data/config/core.xml +4 -4
  8. data/lib/rubyfox/server/data/config/default.words.txt +11 -0
  9. data/lib/rubyfox/server/data/config/log4j.properties +1 -2
  10. data/lib/rubyfox/server/data/config/server.xml +1 -1
  11. data/lib/rubyfox/server/data/data/GeoLite2-Country.mmdb +0 -0
  12. data/lib/rubyfox/server/data/data/bannedusers/users.bin +0 -0
  13. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/bootstrap.jar +0 -0
  14. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/catalina-tasks.xml +39 -39
  15. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/catalina.sh +0 -0
  16. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/ciphers.sh +0 -0
  17. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/commons-daemon-native.tar.gz +0 -0
  18. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/commons-daemon.jar +0 -0
  19. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/configtest.sh +0 -0
  20. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/daemon.sh +0 -0
  21. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/digest.sh +0 -0
  22. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/makebase.sh +0 -0
  23. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/setclasspath.sh +0 -0
  24. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/shutdown.sh +0 -0
  25. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/startup.sh +0 -0
  26. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/tomcat-juli.jar +0 -0
  27. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/tomcat-native.tar.gz +0 -0
  28. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/tool-wrapper.sh +0 -0
  29. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/version.sh +0 -0
  30. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/Catalina/localhost/rewrite.config +1 -1
  31. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/catalina.policy +263 -264
  32. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/catalina.properties +209 -207
  33. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/context.xml +31 -31
  34. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/jaspic-providers.xml +23 -23
  35. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/jaspic-providers.xsd +52 -52
  36. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/keystore.jks +0 -0
  37. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/server.xml +177 -161
  38. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/tomcat-users.xml +18 -7
  39. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/tomcat-users.xsd +59 -59
  40. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/web.xml +4740 -4737
  41. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/annotations-api.jar +0 -0
  42. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina-ant.jar +0 -0
  43. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina-ha.jar +0 -0
  44. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina-ssi.jar +0 -0
  45. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina-storeconfig.jar +0 -0
  46. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina-tribes.jar +0 -0
  47. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina.jar +0 -0
  48. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/el-api.jar +0 -0
  49. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/jasper-el.jar +0 -0
  50. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/jasper.jar +0 -0
  51. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/jaspic-api.jar +0 -0
  52. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/jsp-api.jar +0 -0
  53. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/servlet-api.jar +0 -0
  54. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/sfs2x-ws-helper.jar +0 -0
  55. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-api.jar +0 -0
  56. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-coyote.jar +0 -0
  57. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-dbcp.jar +0 -0
  58. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-cs.jar +0 -0
  59. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-de.jar +0 -0
  60. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-es.jar +0 -0
  61. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-fr.jar +0 -0
  62. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-ja.jar +0 -0
  63. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-ko.jar +0 -0
  64. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-pt-BR.jar +0 -0
  65. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-ru.jar +0 -0
  66. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-zh-CN.jar +0 -0
  67. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-jdbc.jar +0 -0
  68. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-jni.jar +0 -0
  69. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-util-scan.jar +0 -0
  70. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-util.jar +0 -0
  71. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-websocket.jar +0 -0
  72. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/websocket-api.jar +0 -0
  73. data/lib/rubyfox/server/data/lib/javax.activation-1.2.0.jar +0 -0
  74. data/lib/rubyfox/server/data/lib/javax.mail.jar +0 -0
  75. data/lib/rubyfox/server/data/lib/js/JSApi.js +2 -1
  76. data/lib/rubyfox/server/data/lib/js/LibApi.js +181 -48
  77. data/lib/rubyfox/server/data/lib/sfs2x-admin.jar +0 -0
  78. data/lib/rubyfox/server/data/lib/sfs2x-cluster.jar +0 -0
  79. data/lib/rubyfox/server/data/lib/sfs2x-core.jar +0 -0
  80. data/lib/rubyfox/server/data/lib/sfs2x.jar +0 -0
  81. data/lib/rubyfox/server/data/sfs2x-service +26 -30
  82. data/lib/rubyfox/server/data/www/BlueBox.war +0 -0
  83. data/lib/rubyfox/server/data/www/HelloServlet/WEB-INF/web.xml +1 -3
  84. data/lib/rubyfox/server/data/www/ROOT/_css_/default.css +14 -6
  85. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/style.css +44 -2
  86. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/application.bundle.js +98 -61
  87. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/endors~mod-0~mod-1~mod-11~mod-12~mod-17~mod-6~mod-7~mod-8~mod-9.bundle.js +17357 -0
  88. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-0.bundle.js +4 -4
  89. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-1.bundle.js +3 -3
  90. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-10.bundle.js +101 -66
  91. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-11.bundle.js +544 -8
  92. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-12.bundle.js +915 -1480
  93. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-12~module-15~module-16~module-4.bundle.js +2665 -0
  94. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-13.bundle.js +606 -3093
  95. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-13~module-16~module-17~module-4.bundle.js +2665 -0
  96. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-14.bundle.js +764 -0
  97. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-15.bundle.js +71 -0
  98. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-16.bundle.js +1787 -0
  99. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-17.bundle.js +3383 -0
  100. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-4.bundle.js +121 -1009
  101. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-5.bundle.js +1214 -1744
  102. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-6.bundle.js +398 -666
  103. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-7.bundle.js +717 -192
  104. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-8.bundle.js +2117 -665
  105. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-9.bundle.js +613 -690
  106. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/vendors~mod-0~mod-1~mod-10~mod-11~mod-16~mod-5~mod-6~mod-7~mod-8.bundle.js +17357 -0
  107. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/vendors~mod-0~mod-1~mod-11~mod-12~mod-17~mod-5~mod-6~mod-7~mod-8~mod-9.bundle.js +17357 -0
  108. 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 → vendors~mod-0~mod-1~mod-11~mod-12~mod-17~mod-5~mod-7~mod-8~mod-9.bundle.js} +2 -2
  109. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/vendors~module-12.bundle.js +807 -0
  110. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/vendors~module-13.bundle.js +807 -0
  111. data/lib/rubyfox/server/data/www/ROOT/admin/modules/cluster-configurator.html +32 -0
  112. data/lib/rubyfox/server/data/www/ROOT/admin/modules/cluster-monitor.html +185 -0
  113. data/lib/rubyfox/server/data/www/ROOT/admin/modules/cluster-updater.html +47 -0
  114. data/lib/rubyfox/server/data/www/ROOT/admin/modules/extension-deployer.html +84 -0
  115. data/lib/rubyfox/server/data/www/ROOT/admin/modules/zone-monitor.html +15 -8
  116. data/lib/rubyfox/server/data/www/ROOT/index.html +13 -23
  117. data/lib/rubyfox/server/data/www/host-manager/META-INF/context.xml +2 -2
  118. data/lib/rubyfox/server/data/www/host-manager/WEB-INF/jsp/404.jsp +2 -2
  119. data/lib/rubyfox/server/data/www/host-manager/{manager.xml → WEB-INF/manager.xml} +5 -1
  120. data/lib/rubyfox/server/data/www/host-manager/WEB-INF/web.xml +17 -0
  121. data/lib/rubyfox/server/data/www/host-manager/css/manager.css +141 -0
  122. data/lib/rubyfox/server/data/www/host-manager/images/tomcat.svg +967 -0
  123. data/lib/rubyfox/server/data/www/manager/META-INF/context.xml +2 -0
  124. data/lib/rubyfox/server/data/www/manager/WEB-INF/jsp/connectorCerts.jsp +1 -1
  125. data/lib/rubyfox/server/data/www/manager/WEB-INF/jsp/connectorCiphers.jsp +1 -1
  126. data/lib/rubyfox/server/data/www/manager/WEB-INF/jsp/connectorTrustedCerts.jsp +1 -1
  127. data/lib/rubyfox/server/data/www/manager/WEB-INF/jsp/sessionDetail.jsp +3 -3
  128. data/lib/rubyfox/server/data/www/manager/WEB-INF/jsp/sessionsList.jsp +1 -1
  129. data/lib/rubyfox/server/data/www/manager/WEB-INF/web.xml +17 -0
  130. data/lib/rubyfox/server/data/www/manager/css/manager.css +141 -0
  131. data/lib/rubyfox/server/data/www/manager/images/tomcat.svg +967 -0
  132. data/lib/rubyfox/server/data/www/manager/xform.xsl +74 -59
  133. data/lib/rubyfox/server/version.rb +1 -1
  134. metadata +30 -31
  135. data/lib/rubyfox/server/data/config/admin/icons/Analytics.png +0 -0
  136. data/lib/rubyfox/server/data/config/admin/icons/BanManager.png +0 -0
  137. data/lib/rubyfox/server/data/config/admin/icons/BlueBoxMonitor.png +0 -0
  138. data/lib/rubyfox/server/data/config/admin/icons/Console.png +0 -0
  139. data/lib/rubyfox/server/data/config/admin/icons/Dashboard.png +0 -0
  140. data/lib/rubyfox/server/data/config/admin/icons/ExtensionManager.png +0 -0
  141. data/lib/rubyfox/server/data/config/admin/icons/LicenseManager.png +0 -0
  142. data/lib/rubyfox/server/data/config/admin/icons/LogViewer.png +0 -0
  143. data/lib/rubyfox/server/data/config/admin/icons/ServerConfigurator.png +0 -0
  144. data/lib/rubyfox/server/data/config/admin/icons/ServletManager.png +0 -0
  145. data/lib/rubyfox/server/data/config/admin/icons/ZoneConfigurator.png +0 -0
  146. data/lib/rubyfox/server/data/config/admin/icons/ZoneMonitor.png +0 -0
  147. data/lib/rubyfox/server/data/lib/BlueBox.war +0 -0
  148. data/lib/rubyfox/server/data/lib/apache-tomcat/LICENSE +0 -1061
  149. data/lib/rubyfox/server/data/lib/apache-tomcat/NOTICE +0 -68
  150. data/lib/rubyfox/server/data/lib/apache-tomcat/README.md +0 -81
  151. data/lib/rubyfox/server/data/lib/apache-tomcat/RELEASE-NOTES +0 -174
  152. data/lib/rubyfox/server/data/lib/imap.jar +0 -0
  153. data/lib/rubyfox/server/data/lib/mailapi.jar +0 -0
  154. data/lib/rubyfox/server/data/lib/pop3.jar +0 -0
  155. data/lib/rubyfox/server/data/lib/smtp.jar +0 -0
  156. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-12~module-13~module-9.bundle.js +0 -2634
  157. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/vendors~module-9.bundle.js +0 -807
  158. data/lib/rubyfox/server/data/www/host-manager/images/tomcat.gif +0 -0
  159. data/lib/rubyfox/server/data/www/manager/images/tomcat.gif +0 -0
  160. /data/lib/rubyfox/server/data/data/buddylists/{BasicExamples/.keep → .keep} +0 -0
@@ -160,16 +160,16 @@ class FileDataSourceManager
160
160
 
161
161
  /***/ }),
162
162
 
163
- /***/ "./src/modules/servlet-manager.js":
164
- /*!****************************************!*\
165
- !*** ./src/modules/servlet-manager.js ***!
166
- \****************************************/
163
+ /***/ "./src/modules/extension-manager.js":
164
+ /*!******************************************!*\
165
+ !*** ./src/modules/extension-manager.js ***!
166
+ \******************************************/
167
167
  /*! exports provided: default */
168
168
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
169
169
 
170
170
  "use strict";
171
171
  __webpack_require__.r(__webpack_exports__);
172
- /* WEBPACK VAR INJECTION */(function($) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ServletManager; });
172
+ /* WEBPACK VAR INJECTION */(function($) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ExtensionManager; });
173
173
  /* harmony import */ var _base_module__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./base-module */ "./src/modules/base-module.js");
174
174
  /* harmony import */ var _managers_file_datasource_manager__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../managers/file-datasource-manager */ "./src/managers/file-datasource-manager.js");
175
175
  /* harmony import */ var _utils_utilities__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/utilities */ "./src/utils/utilities.js");
@@ -177,22 +177,23 @@ __webpack_require__.r(__webpack_exports__);
177
177
 
178
178
 
179
179
 
180
- class ServletManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModule"]
180
+ class ExtensionManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModule"]
181
181
  {
182
182
  constructor()
183
183
  {
184
- super('servletMan');
184
+ super('extensionMan');
185
185
 
186
186
  // Outgoing requests
187
187
  this.REQ_INIT = 'init';
188
- this.REQ_GET_SERVLETS = 'getServlets';
188
+ this.REQ_GET_EXTENSIONS = 'getExtensions';
189
189
  this.REQ_CREATE_FOLDER = 'createFolder';
190
- this.REQ_DELETE_FILES = 'deleteSrvltFiles';
190
+ this.REQ_DELETE_FILES = 'deleteExtFiles';
191
+ this.REQ_RELOAD_EXTENSIONS = 'reloadExt';
191
192
 
192
193
  // Incoming responses
193
194
  this.RESP_LOCKED = 'lock';
194
195
  this.RESP_INIT = 'init';
195
- this.RESP_SERVLETS = 'servlets';
196
+ this.RESP_EXTENSIONS = 'extensions';
196
197
  this.RESP_FILE_ADDED = 'fileAdded';
197
198
  this.RESP_FILES_DELETED = 'filesDeleted';
198
199
  this.RESP_ERROR = 'error';
@@ -210,7 +211,7 @@ class ServletManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModu
210
211
  super.initialize(idData, shellController);
211
212
 
212
213
  // Initialize progress bar
213
- $('#svm-progressBar').kendoProgressBar({
214
+ $('#exm-progressBar').kendoProgressBar({
214
215
  min: 0,
215
216
  max: 100,
216
217
  value: false,
@@ -221,11 +222,11 @@ class ServletManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModu
221
222
  });
222
223
 
223
224
  // Add listeners to buttons
224
- $('#svm-retryBt').on('click', $.proxy(this._onRetryClick, this));
225
- $('#svm-refreshBt').on('click', $.proxy(this._onRefreshClick, this));
225
+ $('#exm-retryBt').on('click', $.proxy(this._onRetryClick, this));
226
+ $('#exm-refreshBt').on('click', $.proxy(this._onRefreshClick, this));
226
227
 
227
228
  // Initialize files list
228
- this._filesList = $('#svm-fileList').kendoTreeList({
229
+ this._filesList = $('#exm-fileList').kendoTreeList({
229
230
  dataSource: [],
230
231
  resizable: true,
231
232
  selectable: true,
@@ -251,12 +252,18 @@ class ServletManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModu
251
252
  <div class="file-controls flex-grow-1 text-right" data-item-id="#:id#">
252
253
  # if (isDir) { #
253
254
  <button type="button" class="k-button k-primary my-1 create-folder-bt"><i class="fas fa-folder-plus"></i></button>
254
- <button type="button" class="k-button k-primary my-1 upload-files-bt"><i class="fas fa-file-upload"></i></button>
255
+ # if (level > 0) { #
256
+ <button type="button" class="k-button k-primary my-1 upload-files-bt"><i class="fas fa-file-upload"></i></button>
257
+ # } #
255
258
  # } #
256
259
 
257
260
  # if (level > 0 && !isProtected) { #
258
261
  <button type="button" class="k-button k-primary my-1 remove-file-bt"><i class="fas fa-minus-circle"></i></button>
259
262
  # } #
263
+
264
+ # if (level == 1 && !isLib) { #
265
+ <button type="button" class="k-button k-primary my-1 reload-ext-bt"><i class="fas fa-redo-alt"></i></button>
266
+ # } #
260
267
  </div>
261
268
  `),
262
269
  },
@@ -288,14 +295,15 @@ class ServletManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModu
288
295
  //-------------------------------------------
289
296
 
290
297
  // Add listeners to catch control button clicks on rows
291
- $('#svm-fileList').on('click', '.create-folder-bt', $.proxy(this._showAddFolderModalClick, this));
292
- $('#svm-fileList').on('click', '.upload-files-bt', $.proxy(this._showUploadFilesModalClick, this));
293
- $('#svm-fileList').on('click', '.remove-file-bt', $.proxy(this._onRemoveFileClick, this));
298
+ $('#exm-fileList').on('click', '.create-folder-bt', $.proxy(this._showAddFolderModalClick, this));
299
+ $('#exm-fileList').on('click', '.upload-files-bt', $.proxy(this._showUploadFilesModalClick, this));
300
+ $('#exm-fileList').on('click', '.remove-file-bt', $.proxy(this._onRemoveFileClick, this));
301
+ $('#exm-fileList').on('click', '.reload-ext-bt', $.proxy(this._onReloadExtClick, this));
294
302
 
295
303
  //-------------------------------------------
296
304
 
297
305
  // Initialize "add folder" modal
298
- this._addFolderModal = $('#svm-addFolderModal');
306
+ this._addFolderModal = $('#exm-addFolderModal');
299
307
  this._addFolderModal.modal({
300
308
  backdrop: 'static',
301
309
  keyboard: false,
@@ -306,15 +314,15 @@ class ServletManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModu
306
314
  this._addFolderModal.on('hidden.bs.modal', $.proxy(this._onAddFolderModalHidden, this));
307
315
 
308
316
  // Add listener to Add button click
309
- $('#svm-addFolderBt').on('click', $.proxy(this._onAddFolderClick, this));
317
+ $('#exm-addFolderBt').on('click', $.proxy(this._onAddFolderClick, this));
310
318
 
311
319
  // Initialize kendo validation on folder name form
312
- this._addFolderValidator = $('#svm-addFolderForm').kendoValidator({}).data('kendoValidator');
320
+ this._addFolderValidator = $('#exm-addFolderForm').kendoValidator({}).data('kendoValidator');
313
321
 
314
322
  //-------------------------------------------
315
323
 
316
324
  // Initialize "upload files" modal
317
- this._uploadFilesModal = $('#svm-uploadModal');
325
+ this._uploadFilesModal = $('#exm-uploadModal');
318
326
  this._uploadFilesModal.modal({
319
327
  backdrop: 'static',
320
328
  keyboard: false,
@@ -322,7 +330,7 @@ class ServletManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModu
322
330
  });
323
331
 
324
332
  // Initialize kendo uploader
325
- this._uploader = $('#svm-uploader').kendoUpload({
333
+ this._uploader = $('#exm-uploader').kendoUpload({
326
334
  multiple: true,
327
335
  async: {
328
336
  saveUrl: 'http://localhost', // This will be changed later in _onUploadStart method
@@ -337,7 +345,7 @@ class ServletManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModu
337
345
  }).data('kendoUpload');
338
346
 
339
347
  // Add listener to Upload button click
340
- $('#svm-clearFilesBt').on('click', $.proxy(this._onClearFilesClick, this));
348
+ $('#exm-clearFilesBt').on('click', $.proxy(this._onClearFilesClick, this));
341
349
 
342
350
  //-------------------------------------------
343
351
 
@@ -350,17 +358,17 @@ class ServletManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModu
350
358
  // Call super method
351
359
  super.destroy();
352
360
 
353
- $('#svm-retryBt').off('click');
354
- $('#svm-refreshBt').off('click');
361
+ $('#exm-retryBt').off('click');
362
+ $('#exm-refreshBt').off('click');
355
363
 
356
- $('#svm-fileList').off('click');
364
+ $('#exm-fileList').off('click');
357
365
 
358
366
  this._addFolderModal.off('hidden.bs.modal');
359
367
  this._addFolderModal.modal('dispose');
360
- $('#svm-addFolderBt').off('click');
368
+ $('#exm-addFolderBt').off('click');
361
369
 
362
370
  this._uploadFilesModal.modal('dispose');
363
- $('#svm-clearFilesBt').off('click');
371
+ $('#exm-clearFilesBt').off('click');
364
372
  }
365
373
 
366
374
  onExtensionCommand(command, data)
@@ -371,8 +379,11 @@ class ServletManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModu
371
379
  // Retrieve file separator
372
380
  this._fileSeparator = data.getUtfString('sep');
373
381
 
382
+ // Retrieve Extensions' __lib__ folder name
383
+ const libFolder = data.getUtfString('lib');
384
+
374
385
  // Create file data source manager
375
- this._fileManager = new _managers_file_datasource_manager__WEBPACK_IMPORTED_MODULE_1__["FileDataSourceManager"](null, [], this._fileSeparator);
386
+ this._fileManager = new _managers_file_datasource_manager__WEBPACK_IMPORTED_MODULE_1__["FileDataSourceManager"](libFolder, [libFolder], this._fileSeparator);
376
387
 
377
388
  // Retrieve module id sent by the server (required because multiple modules use file uploading service)
378
389
  const uploadModuleId = data.getUtfString('modId');
@@ -386,7 +397,7 @@ class ServletManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModu
386
397
  protocol: this.smartFox.config.useSSL ? 'https' : 'http'
387
398
  };
388
399
 
389
- // Request Servlet files data to server instance
400
+ // Request Extension files data to server instance
390
401
  this._refreshDataList();
391
402
  }
392
403
 
@@ -394,40 +405,40 @@ class ServletManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModu
394
405
  * This response is returned if the file UploadsLock.txt exists in the /config folder of the server.
395
406
  * This is an additional security measure to avoid unwanted files to be uploaded by malicius users accessing the server
396
407
  * with the default credentials, in case they have not been changed by the administrator after the installation.
397
- * The file must be removed manually before accessing the Servlet Manager module for the first time
408
+ * The file must be removed manually before accessing the Extension Manager module for the first time
398
409
  */
399
410
  else if (command == this.RESP_LOCKED)
400
411
  {
401
412
  // Show warning
402
- this._switchView('svm-locked');
413
+ this._switchView('exm-locked');
403
414
  }
404
415
 
405
- // Servlet folders and files
406
- else if (command == this.RESP_SERVLETS)
416
+ // Extensions folders and files
417
+ else if (command == this.RESP_EXTENSIONS)
407
418
  {
408
- // Retrieve Servlets file list
409
- let servletsObj = data.getSFSObject('servlets');
419
+ // Retrieve Extension file list
420
+ let extensionsObj = data.getSFSObject('extensions');
410
421
 
411
422
  // Initialize manager
412
423
  this._fileManager.init();
413
424
 
414
425
  // Add list to manager
415
- this._fileManager.addFile(servletsObj);
426
+ this._fileManager.addFile(extensionsObj);
416
427
 
417
428
  // Set TreeList data source
418
429
  this._filesList.setDataSource(this._fileManager.dataSource);
419
430
 
420
431
  // Expand first level
421
- this._filesList.expand($('#svm-fileList tbody>tr:eq(0)'));
432
+ this._filesList.expand($('#exm-fileList tbody>tr:eq(0)'));
422
433
 
423
434
  // Enable interface
424
435
  this._enableInterface(true);
425
436
 
426
437
  // Show module's main view
427
- this._switchView('svm-main');
438
+ this._switchView('exm-main');
428
439
  }
429
440
 
430
- // An error occurred while managing servlet files
441
+ // An error occurred while managing extension files
431
442
  else if (command == this.RESP_ERROR)
432
443
  {
433
444
  // Hide add folder modal
@@ -440,7 +451,7 @@ class ServletManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModu
440
451
  this.shellCtrl.showSimpleAlert(data.getUtfString('error'));
441
452
  }
442
453
 
443
- // Servlet folder or file added
454
+ // Extension folder or file added
444
455
  else if (command == this.RESP_FILE_ADDED)
445
456
  {
446
457
  // Get name of the user who added the file/folder
@@ -466,7 +477,7 @@ class ServletManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModu
466
477
  if (requester == this.smartFox.mySelf.name)
467
478
  {
468
479
  // Expand parent
469
- this._filesList.expand($(`#svm-fileList .file-controls[data-item-id="${$.escapeSelector(parentPath)}"]`).closest('tr'));
480
+ this._filesList.expand($(`#exm-fileList .file-controls[data-item-id="${$.escapeSelector(parentPath)}"]`).closest('tr'));
470
481
 
471
482
  if (!isUpload)
472
483
  {
@@ -474,7 +485,7 @@ class ServletManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModu
474
485
  this._addFolderModal.modal('hide');
475
486
 
476
487
  // Select upload file
477
- this._filesList.select($(`#svm-fileList .file-controls[data-item-id="${$.escapeSelector(filePath)}"]`).closest('tr'));
488
+ this._filesList.select($(`#exm-fileList .file-controls[data-item-id="${$.escapeSelector(filePath)}"]`).closest('tr'));
478
489
  }
479
490
 
480
491
  // Update selection
@@ -500,7 +511,7 @@ class ServletManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModu
500
511
  this._enableInterface(true);
501
512
  }
502
513
 
503
- // Servlet files deleted
514
+ // Extension files deleted
504
515
  else if (command == this.RESP_FILES_DELETED)
505
516
  {
506
517
  // Get name of the user who deleted the file/s
@@ -524,7 +535,7 @@ class ServletManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModu
524
535
 
525
536
  // Collapse parent if the last of its children was deleted
526
537
  if (parentItem && !parentItem.hasChildren)
527
- this._filesList.collapse($(`#svm-fileList .file-controls[data-item-id="${$.escapeSelector(parentItem.id)}"]`).closest('tr'));
538
+ this._filesList.collapse($(`#exm-fileList .file-controls[data-item-id="${$.escapeSelector(parentItem.id)}"]`).closest('tr'));
528
539
  }
529
540
 
530
541
  if (requester == this.smartFox.mySelf.name)
@@ -555,7 +566,7 @@ class ServletManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModu
555
566
 
556
567
  _onRetryClick()
557
568
  {
558
- this._switchView('svm-init');
569
+ this._switchView('exm-init');
559
570
 
560
571
  // Re-send initialization request
561
572
  this.sendExtensionRequest(this.REQ_INIT);
@@ -571,7 +582,7 @@ class ServletManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModu
571
582
  {
572
583
  // Hide control buttons on currently selected item
573
584
  if (this._selectedItem)
574
- $(`#svm-fileList .file-controls[data-item-id="${$.escapeSelector(this._selectedItem.id)}"]`).hide();
585
+ $(`#exm-fileList .file-controls[data-item-id="${$.escapeSelector(this._selectedItem.id)}"]`).hide();
575
586
 
576
587
  // Get selected item
577
588
  let selectedRows = this._filesList.select();
@@ -582,7 +593,7 @@ class ServletManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModu
582
593
  this._selectedItem = this._filesList.dataItem(selectedRows[0]);
583
594
 
584
595
  // Show control buttons on new selected item
585
- $(`#svm-fileList .file-controls[data-item-id="${$.escapeSelector(this._selectedItem.id)}"]`).show();
596
+ $(`#exm-fileList .file-controls[data-item-id="${$.escapeSelector(this._selectedItem.id)}"]`).show();
586
597
  }
587
598
  else
588
599
  this._selectedItem = null;
@@ -593,7 +604,7 @@ class ServletManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModu
593
604
  if (this._selectedItem && this._selectedItem.isDir)
594
605
  {
595
606
  this._addFolderModal.modal('show');
596
- $('#svm-folderNameIn').focus();
607
+ $('#exm-folderNameIn').focus();
597
608
  }
598
609
  }
599
610
 
@@ -613,7 +624,7 @@ class ServletManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModu
613
624
  this._enableAddFolderModal(false);
614
625
 
615
626
  let data = new SFS2X.SFSObject();
616
- data.putUtfString('folder', this._selectedItem.id + this._fileSeparator + $('#svm-folderNameIn').val());
627
+ data.putUtfString('folder', this._selectedItem.id + this._fileSeparator + $('#exm-folderNameIn').val());
617
628
 
618
629
  // Send request to server
619
630
  this.sendExtensionRequest(this.REQ_CREATE_FOLDER, data);
@@ -622,7 +633,7 @@ class ServletManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModu
622
633
 
623
634
  _onAddFolderModalHidden()
624
635
  {
625
- $('#svm-folderNameIn').val('');
636
+ $('#exm-folderNameIn').val('');
626
637
  this._resetAddFolderValidation();
627
638
 
628
639
  // Enable modal interface
@@ -643,11 +654,11 @@ class ServletManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModu
643
654
  _onUploadStart(e)
644
655
  {
645
656
  // Disable clear button
646
- $('#svm-clearFilesBt').attr('disabled', true);
657
+ $('#exm-clearFilesBt').attr('disabled', true);
647
658
 
648
659
  // Set destination url
649
660
  const url = this._uploadTargetConfig.protocol + '://' + this._uploadTargetConfig.host + ':' + this._uploadTargetConfig.port + '/BlueBox/SFS2XFileUpload?sessHashId=' + this._uploadTargetConfig.sessionToken;
650
-
661
+
651
662
  e.sender.options.async.saveUrl = url;
652
663
 
653
664
  // Set payload
@@ -664,7 +675,7 @@ class ServletManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModu
664
675
  _onUploadEnd(e)
665
676
  {
666
677
  // Enable clear button
667
- $('#svm-clearFilesBt').attr('disabled', false);
678
+ $('#exm-clearFilesBt').attr('disabled', false);
668
679
  }
669
680
 
670
681
  _onFilesUploadEnd(response)
@@ -690,7 +701,7 @@ class ServletManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModu
690
701
  // Disable interface
691
702
  this._enableInterface(false);
692
703
 
693
- // Request Servlet files removal
704
+ // Request Extension files removal
694
705
  // NOTE: for compatibility with older AdminTool, the file to be deleted is sent
695
706
  // in an array of strings, even if we can't delete more than 1 file at once in this AdminTool
696
707
 
@@ -703,19 +714,43 @@ class ServletManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModu
703
714
  this.sendExtensionRequest(this.REQ_DELETE_FILES, params);
704
715
  }
705
716
 
717
+ _onReloadExtClick()
718
+ {
719
+ if (this._selectedItem)
720
+ {
721
+ let pathArr = this._selectedItem.id.split(this._fileSeparator);
722
+
723
+ if (pathArr.length > 1)
724
+ {
725
+ // Request Extension reload
726
+ // NOTE: for compatibility with older AdminTool, the Extension to be reloaded is sent
727
+ // in an array of strings, even if we can't reload more than 1 Extension at once in this AdminTool
728
+
729
+ let extToReload = [];
730
+ extToReload.push(pathArr[1]);
731
+
732
+ let params = new SFS2X.SFSObject();
733
+ params.putUtfStringArray('extensions', extToReload);
734
+
735
+ // Send request to server
736
+ this.sendExtensionRequest(this.REQ_RELOAD_EXTENSIONS, params);
737
+ }
738
+ }
739
+ }
740
+
706
741
  //------------------------------------
707
742
  // PRIVATE METHODS
708
743
  //------------------------------------
709
744
 
710
745
  _switchView(viewId)
711
746
  {
712
- document.getElementById('svm-viewstack').selectedElement = document.getElementById(viewId);
747
+ document.getElementById('exm-viewstack').selectedElement = document.getElementById(viewId);
713
748
  }
714
749
 
715
750
  _enableInterface(enable)
716
751
  {
717
- $('#svm-fileList').attr('disabled', !enable);
718
- $('#svm-refreshBt').attr('disabled', !enable);
752
+ $('#exm-fileList').attr('disabled', !enable);
753
+ $('#exm-refreshBt').attr('disabled', !enable);
719
754
  }
720
755
 
721
756
  _refreshDataList()
@@ -724,7 +759,7 @@ class ServletManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModu
724
759
  this._enableInterface(false);
725
760
 
726
761
  // Send request to server
727
- this.sendExtensionRequest(this.REQ_GET_SERVLETS)
762
+ this.sendExtensionRequest(this.REQ_GET_EXTENSIONS)
728
763
  }
729
764
 
730
765
  _resetAddFolderValidation()
@@ -733,20 +768,20 @@ class ServletManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModu
733
768
 
734
769
  // The method above doesn't remove the k-invalid classes and aria-invalid="true" attributes from inputs
735
770
  // Let's do it manually
736
- $('#svm-addFolderForm .k-invalid').removeClass('k-invalid');
737
- $('#svm-addFolderForm [aria-invalid="true"]').removeAttr('aria-invalid');
771
+ $('#exm-addFolderForm .k-invalid').removeClass('k-invalid');
772
+ $('#exm-addFolderForm [aria-invalid="true"]').removeAttr('aria-invalid');
738
773
  }
739
774
 
740
775
  _enableAddFolderModal(enable)
741
776
  {
742
777
  // Disable modal close buttons
743
- $('#svm-addFolderModal button[data-dismiss="modal"]').attr('disabled', !enable);
778
+ $('#exm-addFolderModal button[data-dismiss="modal"]').attr('disabled', !enable);
744
779
 
745
780
  // Disable add button
746
- $('#svm-addFolderBt').attr('disabled', !enable);
781
+ $('#exm-addFolderBt').attr('disabled', !enable);
747
782
 
748
783
  // Disable fieldset
749
- $('#svm-addFolderForm').attr('disabled', !enable);
784
+ $('#exm-addFolderForm').attr('disabled', !enable);
750
785
  }
751
786
 
752
787
  //---------------------------------
@@ -761,4 +796,4 @@ class ServletManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModu
761
796
  /***/ })
762
797
 
763
798
  }]);
764
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXRzL2pzL2NvcmUvbW9kdWxlcy9tb2R1bGUtMTAuYnVuZGxlLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYXBwbGljYXRpb24vLi9zcmMvbWFuYWdlcnMvZmlsZS1kYXRhc291cmNlLW1hbmFnZXIuanMiLCJ3ZWJwYWNrOi8vYXBwbGljYXRpb24vLi9zcmMvbW9kdWxlcy9zZXJ2bGV0LW1hbmFnZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNsYXNzIEZpbGVEYXRhU291cmNlTWFuYWdlclxue1xuXHRjb25zdHJ1Y3RvcihsaWJGb2xkZXIsIHByb3RlY3RlZEZvbGRlcnMsIGZpbGVTZXBhcmF0b3IpXG5cdHtcblx0XHR0aGlzLl9wcm90ZWN0ZWRGb2xkZXJzID0gcHJvdGVjdGVkRm9sZGVyczsgLy8gRm9sZGVycyB3aGljaCBjYW4ndCBiZSBkZWxldGVkIChidXQgdGhlaXIgY29udGVudCBjYW4pXG5cdFx0dGhpcy5fbGliRm9sZGVyID0gbGliRm9sZGVyO1xuXHRcdHRoaXMuX2ZpbGVTZXBhcmF0b3IgPSBmaWxlU2VwYXJhdG9yO1xuXHR9XG5cblx0Z2V0IGRhdGFTb3VyY2UoKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2RhdGFTb3VyY2U7XG5cdH1cblxuXHRpbml0KClcblx0e1xuXHRcdHRoaXMuX2RhdGFTb3VyY2UgPSBuZXcga2VuZG8uZGF0YS5UcmVlTGlzdERhdGFTb3VyY2Uoe1xuXHRcdFx0ZGF0YTogW10sXG5cdFx0XHRzY2hlbWE6IHtcblx0XHRcdFx0bW9kZWw6IHtcblx0XHRcdFx0XHRpZDogJ2lkJyxcblx0XHRcdFx0XHRwYXJlbnRJZDogJ3BhcmVudElkJyxcblx0XHRcdFx0XHRleHBhbmRlZDogZmFsc2Vcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdHNvcnQ6IHsgZmllbGQ6ICduYW1lJywgZGlyOiAnYXNjJyB9XG5cdFx0fSk7XG5cdH1cblxuXHRhZGRGaWxlKGZpbGVPYmosIHBhcmVudExldmVsID0gbnVsbClcblx0e1xuXHRcdGxldCBmaWxlID0ge307XG5cblx0XHRmaWxlLm5hbWUgPSBmaWxlT2JqLmdldFV0ZlN0cmluZygnbmFtZScpO1xuXHRcdGZpbGUuaXNEaXIgPSBmaWxlT2JqLmdldEJvb2woJ2lzRGlyJyk7XG5cdFx0ZmlsZS5sYXN0TW9kID0gZmlsZU9iai5nZXRMb25nKCdsYXN0TW9kJyk7XG5cdFx0ZmlsZS5pc0xpYiA9IChmaWxlLmlzRGlyICYmIGZpbGUubmFtZSA9PSB0aGlzLl9saWJGb2xkZXIpO1xuXHRcdGZpbGUuaXNQcm90ZWN0ZWQgPSAoZmlsZS5pc0RpciAmJiB0aGlzLl9wcm90ZWN0ZWRGb2xkZXJzLmluZGV4T2YoZmlsZS5uYW1lKSA+IC0xKTtcblx0XHRmaWxlLnNpemUgPSAwO1xuXG5cdFx0aWYgKHBhcmVudExldmVsID09IG51bGwpXG5cdFx0XHRmaWxlLmxldmVsID0gMDtcblx0XHRlbHNlXG5cdFx0XHRmaWxlLmxldmVsID0gcGFyZW50TGV2ZWwgKyAxO1xuXG5cdFx0aWYgKGZpbGVPYmouY29udGFpbnNLZXkoJ3BhcmVudCcpKVxuXHRcdHtcblx0XHRcdGZpbGUucGFyZW50SWQgPSBmaWxlT2JqLmdldFV0ZlN0cmluZygncGFyZW50Jyk7XG5cdFx0XHRmaWxlLmlkID0gZmlsZS5wYXJlbnRJZCArIHRoaXMuX2ZpbGVTZXBhcmF0b3IgKyBmaWxlLm5hbWU7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHRmaWxlLnBhcmVudElkID0gbnVsbDtcblx0XHRcdGZpbGUuaWQgPSBmaWxlLm5hbWU7XG5cdFx0fVxuXG5cdFx0Ly8gQWRkIGNoaWxkIGZpbGVzXG5cdFx0aWYgKGZpbGUuaXNEaXIpXG5cdFx0e1xuXHRcdFx0bGV0IGZpbGVzQXJyID0gZmlsZU9iai5nZXRTRlNBcnJheSgnZmlsZXMnKTtcblxuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBmaWxlc0Fyci5zaXplKCk7IGkrKylcblx0XHRcdFx0ZmlsZS5zaXplICs9IHRoaXMuYWRkRmlsZShmaWxlc0Fyci5nZXRTRlNPYmplY3QoaSksIGZpbGUubGV2ZWwpO1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0XHRmaWxlLnNpemUgPSBmaWxlT2JqLmdldExvbmcoJ3NpemUnKTtcblxuXHRcdC8vIEFkZCBmaWxlIHRvIGRhdGEgc291cmNlXG5cdFx0dGhpcy5fZGF0YVNvdXJjZS5hZGQoZmlsZSk7XG5cblx0XHQvLyBSZXR1cm4gZmlsZSBzaXplXG5cdFx0cmV0dXJuIGZpbGUuc2l6ZTtcblx0fVxuXG5cdHJlbW92ZUZpbGUoaWQpXG5cdHtcblx0XHRsZXQgZmlsZUl0ZW0gPSB0aGlzLl9kYXRhU291cmNlLmdldChpZCk7XG5cblx0XHRpZiAoZmlsZUl0ZW0pXG5cdFx0e1xuXHRcdFx0aWYgKGZpbGVJdGVtLnBhcmVudElkKVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBTdWJ0cmFjdCBvbGQgc2l6ZSBmcm9tIHBhcmVudCBzaXplXG5cdFx0XHRcdGxldCBwYXJlbnRJdGVtID0gdGhpcy5fZGF0YVNvdXJjZS5nZXQoZmlsZUl0ZW0ucGFyZW50SWQpO1xuXHRcdFx0XHR0aGlzLl91cGRhdGVQYXJlbnRTaXplKHBhcmVudEl0ZW0sIC1maWxlSXRlbS5zaXplKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5fZGF0YVNvdXJjZS5yZW1vdmUoZmlsZUl0ZW0pO1xuXG5cdFx0XHQvLyBSZXR1cm4gcGFyZW50IGl0ZW1cblx0XHRcdGlmIChmaWxlSXRlbS5wYXJlbnRJZClcblx0XHRcdFx0cmV0dXJuIHRoaXMuX2RhdGFTb3VyY2UuZ2V0KGZpbGVJdGVtLnBhcmVudElkKTtcblx0XHR9XG5cdH1cblxuXHRnZXRGaWxlQnlJZChpZClcblx0e1xuXHRcdHJldHVybiB0aGlzLl9kYXRhU291cmNlLmdldChpZCk7XG5cdH1cblxuXHRhZGRGaWxlVG9QYXJlbnQoZmlsZU9iaiwgcGFyZW50SWQpXG5cdHtcblx0XHRsZXQgcGFyZW50SXRlbSA9IHRoaXMuX2RhdGFTb3VyY2UuZ2V0KHBhcmVudElkKTtcblxuXHRcdGlmIChwYXJlbnRJdGVtICE9IG51bGwgJiYgcGFyZW50SXRlbS5pc0Rpcilcblx0XHR7XG5cdFx0XHRjb25zdCBmaWxlSWQgPSBwYXJlbnRJZCArIHRoaXMuX2ZpbGVTZXBhcmF0b3IgKyBmaWxlT2JqLmdldFV0ZlN0cmluZygnbmFtZScpO1xuXHRcdFx0bGV0IGZpbGVJdGVtID0gdGhpcy5fZGF0YVNvdXJjZS5nZXQoZmlsZUlkKTtcblxuXHRcdFx0aWYgKGZpbGVJdGVtICE9IG51bGwpXG5cdFx0XHR7XG5cdFx0XHRcdC8vIFN1YnRyYWN0IG9sZCBzaXplIGZyb20gcGFyZW50IHNpemVcblx0XHRcdFx0dGhpcy5fdXBkYXRlUGFyZW50U2l6ZShwYXJlbnRJdGVtLCAtZmlsZUl0ZW0uc2l6ZSk7XG5cblx0XHRcdFx0Ly8gVXBkYXRlIGV4aXN0aW5nIGl0ZW1cblx0XHRcdFx0ZmlsZUl0ZW0ubmFtZSA9IGZpbGVPYmouZ2V0VXRmU3RyaW5nKCduYW1lJyk7XG5cdFx0XHRcdGZpbGVJdGVtLmxhc3RNb2QgPSBmaWxlT2JqLmdldExvbmcoJ2xhc3RNb2QnKTtcblx0XHRcdFx0ZmlsZUl0ZW0uc2l6ZSA9IGZpbGVPYmouZ2V0TG9uZygnc2l6ZScpO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBBZGQgbmV3IGl0ZW1cblx0XHRcdFx0dGhpcy5hZGRGaWxlKGZpbGVPYmosIHBhcmVudEl0ZW0ubGV2ZWwpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBVcGRhdGUgcGFyZW50IGl0ZW0gc2l6ZVxuXHRcdFx0dGhpcy5fdXBkYXRlUGFyZW50U2l6ZShwYXJlbnRJdGVtLCBmaWxlT2JqLmdldExvbmcoJ3NpemUnKSk7XG5cblx0XHRcdHJldHVybiBmaWxlSWQ7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHRcdHRocm93IG5ldyBFcnJvcihgQW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZCB3aGlsZSBhZGRpbmcgZmlsZSAnJHtmaWxlT2JqLmdldFV0ZlN0cmluZygnbmFtZScpfScgKHRhcmdldDogJHtwYXJlbnRJZH0pLmApO1xuXHR9XG5cblx0X3VwZGF0ZVBhcmVudFNpemUocGFyZW50SXRlbSwgdmFsdWUpXG5cdHtcblx0XHRwYXJlbnRJdGVtLnNpemUgKz0gdmFsdWU7XG5cblx0XHRpZiAocGFyZW50SXRlbS5wYXJlbnRJZClcblx0XHR7XG5cdFx0XHRsZXQgZ3JhbmRQYXJlbnQgPSB0aGlzLl9kYXRhU291cmNlLmdldChwYXJlbnRJdGVtLnBhcmVudElkKTtcblx0XHRcdHRoaXMuX3VwZGF0ZVBhcmVudFNpemUoZ3JhbmRQYXJlbnQsIHZhbHVlKTtcblx0XHR9XG5cdH1cbn1cbiIsImltcG9ydCB7QmFzZU1vZHVsZX0gZnJvbSAnLi9iYXNlLW1vZHVsZSc7XG5pbXBvcnQge0ZpbGVEYXRhU291cmNlTWFuYWdlcn0gZnJvbSAnLi4vbWFuYWdlcnMvZmlsZS1kYXRhc291cmNlLW1hbmFnZXInO1xuaW1wb3J0IHtieXRlc1RvU2l6ZX0gZnJvbSAnLi4vdXRpbHMvdXRpbGl0aWVzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2VydmxldE1hbmFnZXIgZXh0ZW5kcyBCYXNlTW9kdWxlXG57XG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHQgICAgc3VwZXIoJ3NlcnZsZXRNYW4nKTtcblxuXHRcdC8vIE91dGdvaW5nIHJlcXVlc3RzXG5cdFx0dGhpcy5SRVFfSU5JVCA9ICdpbml0Jztcblx0XHR0aGlzLlJFUV9HRVRfU0VSVkxFVFMgPSAnZ2V0U2VydmxldHMnO1xuXHRcdHRoaXMuUkVRX0NSRUFURV9GT0xERVIgPSAnY3JlYXRlRm9sZGVyJztcblx0XHR0aGlzLlJFUV9ERUxFVEVfRklMRVMgPSAnZGVsZXRlU3J2bHRGaWxlcyc7XG5cblx0XHQvLyBJbmNvbWluZyByZXNwb25zZXNcblx0XHR0aGlzLlJFU1BfTE9DS0VEID0gJ2xvY2snO1xuXHRcdHRoaXMuUkVTUF9JTklUID0gJ2luaXQnO1xuXHRcdHRoaXMuUkVTUF9TRVJWTEVUUyA9ICdzZXJ2bGV0cyc7XG5cdFx0dGhpcy5SRVNQX0ZJTEVfQURERUQgPSAnZmlsZUFkZGVkJztcblx0XHR0aGlzLlJFU1BfRklMRVNfREVMRVRFRCA9ICdmaWxlc0RlbGV0ZWQnO1xuXHRcdHRoaXMuUkVTUF9FUlJPUiA9ICdlcnJvcic7XG5cdH1cblxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQvLyBDT01NT04gTU9EVUxFIElOVEVSRkFDRSBNRVRIT0RTXG5cdC8vIFRoaXMgbWVtYmVycyBhcmUgdXNlZCBieSB0aGUgbWFpbiBjb250cm9sbGVyXG5cdC8vIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIG1vZHVsZSdzIGNvbnRyb2xsZXIuXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0aW5pdGlhbGl6ZShpZERhdGEsIHNoZWxsQ29udHJvbGxlcilcblx0e1xuXHRcdC8vIENhbGwgc3VwZXIgbWV0aG9kXG5cdFx0c3VwZXIuaW5pdGlhbGl6ZShpZERhdGEsIHNoZWxsQ29udHJvbGxlcik7XG5cblx0XHQvLyBJbml0aWFsaXplIHByb2dyZXNzIGJhclxuXHRcdCQoJyNzdm0tcHJvZ3Jlc3NCYXInKS5rZW5kb1Byb2dyZXNzQmFyKHtcblx0XHRcdG1pbjogMCxcbiAgICAgICAgICAgIG1heDogMTAwLFxuXHRcdFx0dmFsdWU6IGZhbHNlLFxuICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJyxcbiAgICAgICAgICAgIGFuaW1hdGlvbjoge1xuICAgICAgICAgICAgICAgIGR1cmF0aW9uOiA0MDBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cblx0XHQvLyBBZGQgbGlzdGVuZXJzIHRvIGJ1dHRvbnNcblx0XHQkKCcjc3ZtLXJldHJ5QnQnKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uUmV0cnlDbGljaywgdGhpcykpO1xuXHRcdCQoJyNzdm0tcmVmcmVzaEJ0Jykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vblJlZnJlc2hDbGljaywgdGhpcykpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBmaWxlcyBsaXN0XG5cdFx0dGhpcy5fZmlsZXNMaXN0ID0gJCgnI3N2bS1maWxlTGlzdCcpLmtlbmRvVHJlZUxpc3Qoe1xuICAgICAgICAgICAgZGF0YVNvdXJjZTogW10sXG5cdFx0XHRyZXNpemFibGU6IHRydWUsXG5cdFx0XHRzZWxlY3RhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29sdW1uczogW1xuICAgICAgICAgICAgICAgIHtcblx0XHRcdFx0XHRmaWVsZDogJ25hbWUnLFxuXHRcdFx0XHRcdHRpdGxlOiAnTmFtZScsXG5cdFx0XHRcdFx0dGVtcGxhdGU6IGtlbmRvLnRlbXBsYXRlKGBcblx0XHRcdFx0XHRcdDxkaXYgPlxuXHRcdFx0XHRcdFx0XHQjIGlmIChpc0RpcikgeyAjXG5cdFx0XHRcdFx0XHRcdFx0IyBpZiAoZXhwYW5kZWQpIHsgI1xuXHRcdFx0XHRcdFx0XHRcdFx0PGkgY2xhc3M9XCJmYXMgZmEtZm9sZGVyLW9wZW5cIj48L2k+XG5cdFx0XHRcdFx0XHRcdFx0IyB9IGVsc2UgeyAjXG5cdFx0XHRcdFx0XHRcdFx0XHQ8aSBjbGFzcz1cImZhcyBmYS1mb2xkZXJcIj48L2k+XG5cdFx0XHRcdFx0XHRcdFx0IyB9ICNcblx0XHRcdFx0XHRcdFx0IyB9IGVsc2UgeyAjXG5cdFx0XHRcdFx0XHRcdFx0PGkgY2xhc3M9XCJmYXIgZmEtZmlsZVwiPjwvaT5cblx0XHRcdFx0XHRcdFx0IyB9ICNcblxuXHRcdFx0XHRcdFx0XHQjOiBuYW1lICNcblxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZmlsZS1jb250cm9scyBmbGV4LWdyb3ctMSB0ZXh0LXJpZ2h0XCIgZGF0YS1pdGVtLWlkPVwiIzppZCNcIj5cblx0XHRcdFx0XHRcdFx0IyBpZiAoaXNEaXIpIHsgI1xuXHRcdFx0XHRcdFx0XHRcdDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiay1idXR0b24gay1wcmltYXJ5IG15LTEgY3JlYXRlLWZvbGRlci1idFwiPjxpIGNsYXNzPVwiZmFzIGZhLWZvbGRlci1wbHVzXCI+PC9pPjwvYnV0dG9uPlxuXHRcdFx0XHRcdFx0XHRcdDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiay1idXR0b24gay1wcmltYXJ5IG15LTEgdXBsb2FkLWZpbGVzLWJ0XCI+PGkgY2xhc3M9XCJmYXMgZmEtZmlsZS11cGxvYWRcIj48L2k+PC9idXR0b24+XG5cdFx0XHRcdFx0XHRcdCMgfSAjXG5cblx0XHRcdFx0XHRcdFx0IyBpZiAobGV2ZWwgPiAwICYmICFpc1Byb3RlY3RlZCkgeyAjXG5cdFx0XHRcdFx0XHRcdFx0PGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJrLWJ1dHRvbiBrLXByaW1hcnkgbXktMSByZW1vdmUtZmlsZS1idFwiPjxpIGNsYXNzPVwiZmFzIGZhLW1pbnVzLWNpcmNsZVwiPjwvaT48L2J1dHRvbj5cblx0XHRcdFx0XHRcdFx0IyB9ICNcblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdGApLFxuXHRcdFx0XHR9LFxuICAgICAgICAgICAgICAgIHtcblx0XHRcdFx0XHRmaWVsZDogJ3NpemUnLFxuXHRcdFx0XHRcdHRpdGxlOiAnU2l6ZScsXG5cdFx0XHRcdFx0dGVtcGxhdGU6IGZ1bmN0aW9uKGRhdGFJdGVtKSB7XG5cdFx0XHRcdFx0XHRkYXRhSXRlbS5ieXRlc1RvU2l6ZSA9IGJ5dGVzVG9TaXplOyAvLyBQYXNzIGJ5dGVzVG9TaXplIHV0aWxpdHkgZnVuY3Rpb24gdG8gdGVtcGxhdGVcblx0XHRcdFx0XHRcdHJldHVybiBrZW5kby50ZW1wbGF0ZShgXG5cdFx0XHRcdFx0XHRcdCM6IGJ5dGVzVG9TaXplKHNpemUsIDIsICdLQicpICNcblx0XHRcdFx0XHRcdGApKGRhdGFJdGVtKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHdpZHRoOiAxMjAsXG5cdFx0XHRcdFx0bWluU2NyZWVuV2lkdGg6IDU3NlxuXHRcdFx0XHR9LFxuICAgICAgICAgICAgICAgIHtcblx0XHRcdFx0XHRmaWVsZDogJ2xhc3RNb2QnLFxuXHRcdFx0XHRcdHRpdGxlOiAnTGFzdCBNb2RpZmllZCcsXG5cdFx0XHRcdFx0dGVtcGxhdGU6IGtlbmRvLnRlbXBsYXRlKGBcblx0XHRcdFx0XHRcdCM6IGtlbmRvLnRvU3RyaW5nKG5ldyBEYXRlKGxhc3RNb2QpLCAnZGQgTU1NIHl5eXkgSEg6bW06c3MnKSAjXG5cdFx0XHRcdFx0YCksXG5cdFx0XHRcdFx0d2lkdGg6IDIwMCxcblx0XHRcdFx0XHRtaW5TY3JlZW5XaWR0aDogNzY4XG5cdFx0XHRcdH0sXG4gICAgICAgICAgICBdLFxuXHRcdFx0Y2hhbmdlOiAkLnByb3h5KHRoaXMuX29uRmlsZVNlbGVjdGVkQ2hhbmdlLCB0aGlzKVxuICAgICAgICB9KS5kYXRhKCdrZW5kb1RyZWVMaXN0Jyk7XG5cblx0XHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRcdC8vIEFkZCBsaXN0ZW5lcnMgdG8gY2F0Y2ggY29udHJvbCBidXR0b24gY2xpY2tzIG9uIHJvd3Ncblx0XHQkKCcjc3ZtLWZpbGVMaXN0Jykub24oJ2NsaWNrJywgJy5jcmVhdGUtZm9sZGVyLWJ0JywgJC5wcm94eSh0aGlzLl9zaG93QWRkRm9sZGVyTW9kYWxDbGljaywgdGhpcykpO1xuXHRcdCQoJyNzdm0tZmlsZUxpc3QnKS5vbignY2xpY2snLCAnLnVwbG9hZC1maWxlcy1idCcsICQucHJveHkodGhpcy5fc2hvd1VwbG9hZEZpbGVzTW9kYWxDbGljaywgdGhpcykpO1xuXHRcdCQoJyNzdm0tZmlsZUxpc3QnKS5vbignY2xpY2snLCAnLnJlbW92ZS1maWxlLWJ0JywgJC5wcm94eSh0aGlzLl9vblJlbW92ZUZpbGVDbGljaywgdGhpcykpO1xuXG5cdFx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0XHQvLyBJbml0aWFsaXplIFwiYWRkIGZvbGRlclwiIG1vZGFsXG5cdFx0dGhpcy5fYWRkRm9sZGVyTW9kYWwgPSAkKCcjc3ZtLWFkZEZvbGRlck1vZGFsJyk7XG5cdFx0dGhpcy5fYWRkRm9sZGVyTW9kYWwubW9kYWwoe1xuXHRcdFx0YmFja2Ryb3A6ICdzdGF0aWMnLFxuXHRcdFx0a2V5Ym9hcmQ6IGZhbHNlLFxuXHRcdFx0c2hvdzogZmFsc2Vcblx0XHR9KTtcblxuXHRcdC8vIEFkZCBsaXN0ZW5lciB0byBtb2RhbCBoaWRlIGV2ZW50XG5cdFx0dGhpcy5fYWRkRm9sZGVyTW9kYWwub24oJ2hpZGRlbi5icy5tb2RhbCcsICQucHJveHkodGhpcy5fb25BZGRGb2xkZXJNb2RhbEhpZGRlbiwgdGhpcykpO1xuXG5cdFx0Ly8gQWRkIGxpc3RlbmVyIHRvIEFkZCBidXR0b24gY2xpY2tcblx0XHQkKCcjc3ZtLWFkZEZvbGRlckJ0Jykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vbkFkZEZvbGRlckNsaWNrLCB0aGlzKSk7XG5cblx0XHQvLyBJbml0aWFsaXplIGtlbmRvIHZhbGlkYXRpb24gb24gZm9sZGVyIG5hbWUgZm9ybVxuXHRcdHRoaXMuX2FkZEZvbGRlclZhbGlkYXRvciA9ICQoJyNzdm0tYWRkRm9sZGVyRm9ybScpLmtlbmRvVmFsaWRhdG9yKHt9KS5kYXRhKCdrZW5kb1ZhbGlkYXRvcicpO1xuXG5cdFx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0XHQvLyBJbml0aWFsaXplIFwidXBsb2FkIGZpbGVzXCIgbW9kYWxcblx0XHR0aGlzLl91cGxvYWRGaWxlc01vZGFsID0gJCgnI3N2bS11cGxvYWRNb2RhbCcpO1xuXHRcdHRoaXMuX3VwbG9hZEZpbGVzTW9kYWwubW9kYWwoe1xuXHRcdFx0YmFja2Ryb3A6ICdzdGF0aWMnLFxuXHRcdFx0a2V5Ym9hcmQ6IGZhbHNlLFxuXHRcdFx0c2hvdzogZmFsc2Vcblx0XHR9KTtcblxuXHRcdC8vIEluaXRpYWxpemUga2VuZG8gdXBsb2FkZXJcblx0XHR0aGlzLl91cGxvYWRlciA9ICQoJyNzdm0tdXBsb2FkZXInKS5rZW5kb1VwbG9hZCh7XG5cdFx0XHRtdWx0aXBsZTogdHJ1ZSxcblx0XHRcdGFzeW5jOiB7XG5cdFx0XHRcdHNhdmVVcmw6ICdodHRwOi8vbG9jYWxob3N0JywgLy8gVGhpcyB3aWxsIGJlIGNoYW5nZWQgbGF0ZXIgaW4gX29uVXBsb2FkU3RhcnQgbWV0aG9kXG5cdFx0XHRcdGF1dG9VcGxvYWQ6IHRydWUsXG5cdFx0XHR9LFxuXHRcdFx0ZGlyZWN0b3J5RHJvcDogdHJ1ZSxcblx0XHRcdHVwbG9hZDogJC5wcm94eSh0aGlzLl9vblVwbG9hZFN0YXJ0LCB0aGlzKSxcblx0XHRcdGNvbXBsZXRlOiAkLnByb3h5KHRoaXMuX29uVXBsb2FkRW5kLCB0aGlzKSxcblx0XHRcdGxvY2FsaXphdGlvbjoge1xuXHRcdFx0XHRzZWxlY3Q6ICdTZWxlY3QgZmlsZXMuLi4nXG5cdFx0XHR9XG5cdFx0fSkuZGF0YSgna2VuZG9VcGxvYWQnKTtcblxuXHRcdC8vIEFkZCBsaXN0ZW5lciB0byBVcGxvYWQgYnV0dG9uIGNsaWNrXG5cdFx0JCgnI3N2bS1jbGVhckZpbGVzQnQnKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uQ2xlYXJGaWxlc0NsaWNrLCB0aGlzKSk7XG5cblx0XHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRcdC8vIFNlbmQgaW5pdGlhbGl6YXRpb24gcmVxdWVzdFxuXHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfSU5JVCk7XG5cdH1cblxuXHRkZXN0cm95KClcblx0e1xuXHRcdC8vIENhbGwgc3VwZXIgbWV0aG9kXG5cdFx0c3VwZXIuZGVzdHJveSgpO1xuXG5cdFx0JCgnI3N2bS1yZXRyeUJ0Jykub2ZmKCdjbGljaycpO1xuXHRcdCQoJyNzdm0tcmVmcmVzaEJ0Jykub2ZmKCdjbGljaycpO1xuXG5cdFx0JCgnI3N2bS1maWxlTGlzdCcpLm9mZignY2xpY2snKTtcblxuXHRcdHRoaXMuX2FkZEZvbGRlck1vZGFsLm9mZignaGlkZGVuLmJzLm1vZGFsJyk7XG5cdFx0dGhpcy5fYWRkRm9sZGVyTW9kYWwubW9kYWwoJ2Rpc3Bvc2UnKTtcblx0XHQkKCcjc3ZtLWFkZEZvbGRlckJ0Jykub2ZmKCdjbGljaycpO1xuXG5cdFx0dGhpcy5fdXBsb2FkRmlsZXNNb2RhbC5tb2RhbCgnZGlzcG9zZScpO1xuXHRcdCQoJyNzdm0tY2xlYXJGaWxlc0J0Jykub2ZmKCdjbGljaycpO1xuXHR9XG5cblx0b25FeHRlbnNpb25Db21tYW5kKGNvbW1hbmQsIGRhdGEpXG5cdHtcblx0XHQvLyBNb2R1bGUgY2FuIGJlIGVuYWJsZWQgKG5vIGxvY2tpbmcgZmlsZSBleGlzdHMpXG5cdFx0aWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX0lOSVQpXG5cdFx0e1xuXHRcdFx0Ly8gUmV0cmlldmUgZmlsZSBzZXBhcmF0b3Jcblx0XHRcdHRoaXMuX2ZpbGVTZXBhcmF0b3IgPSBkYXRhLmdldFV0ZlN0cmluZygnc2VwJyk7XG5cblx0XHRcdC8vIENyZWF0ZSBmaWxlIGRhdGEgc291cmNlIG1hbmFnZXJcblx0XHRcdHRoaXMuX2ZpbGVNYW5hZ2VyID0gbmV3IEZpbGVEYXRhU291cmNlTWFuYWdlcihudWxsLCBbXSwgdGhpcy5fZmlsZVNlcGFyYXRvcik7XG5cblx0XHRcdC8vIFJldHJpZXZlIG1vZHVsZSBpZCBzZW50IGJ5IHRoZSBzZXJ2ZXIgKHJlcXVpcmVkIGJlY2F1c2UgbXVsdGlwbGUgbW9kdWxlcyB1c2UgZmlsZSB1cGxvYWRpbmcgc2VydmljZSlcblx0XHRcdGNvbnN0IHVwbG9hZE1vZHVsZUlkID0gZGF0YS5nZXRVdGZTdHJpbmcoJ21vZElkJyk7XG5cblx0XHRcdC8vIFNldCBmaWxlIHVwbG9hZGluZyB0YXJnZXQgY29uZmlndXJhdGlvblxuXHRcdFx0dGhpcy5fdXBsb2FkVGFyZ2V0Q29uZmlnID0ge1xuXHRcdFx0XHRzZXNzaW9uVG9rZW46IHRoaXMuc21hcnRGb3guc2Vzc2lvblRva2VuLFxuXHRcdFx0XHRob3N0OiB0aGlzLnNtYXJ0Rm94LmNvbmZpZy5ob3N0LFxuXHRcdFx0XHRwb3J0OiB0aGlzLnNtYXJ0Rm94LmNvbmZpZy5wb3J0LFxuXHRcdFx0XHRtb2R1bGVJZDogdXBsb2FkTW9kdWxlSWQsXG5cdFx0XHRcdHByb3RvY29sOiB0aGlzLnNtYXJ0Rm94LmNvbmZpZy51c2VTU0wgPyAnaHR0cHMnIDogJ2h0dHAnXG5cdFx0XHR9O1xuXG5cdFx0XHQvLyBSZXF1ZXN0IFNlcnZsZXQgZmlsZXMgZGF0YSB0byBzZXJ2ZXIgaW5zdGFuY2Vcblx0XHRcdHRoaXMuX3JlZnJlc2hEYXRhTGlzdCgpO1xuXHRcdH1cblxuXHRcdC8qXG5cdFx0ICogVGhpcyByZXNwb25zZSBpcyByZXR1cm5lZCBpZiB0aGUgZmlsZSBVcGxvYWRzTG9jay50eHQgZXhpc3RzIGluIHRoZSAvY29uZmlnIGZvbGRlciBvZiB0aGUgc2VydmVyLlxuXHRcdCAqIFRoaXMgaXMgYW4gYWRkaXRpb25hbCBzZWN1cml0eSBtZWFzdXJlIHRvIGF2b2lkIHVud2FudGVkIGZpbGVzIHRvIGJlIHVwbG9hZGVkIGJ5IG1hbGljaXVzIHVzZXJzIGFjY2Vzc2luZyB0aGUgc2VydmVyXG5cdFx0ICogd2l0aCB0aGUgZGVmYXVsdCBjcmVkZW50aWFscywgaW4gY2FzZSB0aGV5IGhhdmUgbm90IGJlZW4gY2hhbmdlZCBieSB0aGUgYWRtaW5pc3RyYXRvciBhZnRlciB0aGUgaW5zdGFsbGF0aW9uLlxuXHRcdCAqIFRoZSBmaWxlIG11c3QgYmUgcmVtb3ZlZCBtYW51YWxseSBiZWZvcmUgYWNjZXNzaW5nIHRoZSBTZXJ2bGV0IE1hbmFnZXIgbW9kdWxlIGZvciB0aGUgZmlyc3QgdGltZVxuXHRcdCAqL1xuXHRcdGVsc2UgaWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX0xPQ0tFRClcblx0XHR7XG5cdFx0XHQvLyBTaG93IHdhcm5pbmdcblx0XHRcdHRoaXMuX3N3aXRjaFZpZXcoJ3N2bS1sb2NrZWQnKTtcblx0XHR9XG5cblx0XHQvLyBTZXJ2bGV0IGZvbGRlcnMgYW5kIGZpbGVzXG5cdFx0ZWxzZSBpZiAoY29tbWFuZCA9PSB0aGlzLlJFU1BfU0VSVkxFVFMpXG5cdFx0e1xuXHRcdFx0Ly8gUmV0cmlldmUgU2VydmxldHMgZmlsZSBsaXN0XG5cdFx0XHRsZXQgc2VydmxldHNPYmogPSBkYXRhLmdldFNGU09iamVjdCgnc2VydmxldHMnKTtcblxuXHRcdFx0Ly8gSW5pdGlhbGl6ZSBtYW5hZ2VyXG5cdFx0XHR0aGlzLl9maWxlTWFuYWdlci5pbml0KCk7XG5cblx0XHRcdC8vIEFkZCBsaXN0IHRvIG1hbmFnZXJcblx0XHRcdHRoaXMuX2ZpbGVNYW5hZ2VyLmFkZEZpbGUoc2VydmxldHNPYmopO1xuXG5cdFx0XHQvLyBTZXQgVHJlZUxpc3QgZGF0YSBzb3VyY2Vcblx0XHRcdHRoaXMuX2ZpbGVzTGlzdC5zZXREYXRhU291cmNlKHRoaXMuX2ZpbGVNYW5hZ2VyLmRhdGFTb3VyY2UpO1xuXG5cdFx0XHQvLyBFeHBhbmQgZmlyc3QgbGV2ZWxcblx0XHRcdHRoaXMuX2ZpbGVzTGlzdC5leHBhbmQoJCgnI3N2bS1maWxlTGlzdCB0Ym9keT50cjplcSgwKScpKTtcblxuXHRcdFx0Ly8gRW5hYmxlIGludGVyZmFjZVxuXHRcdFx0dGhpcy5fZW5hYmxlSW50ZXJmYWNlKHRydWUpO1xuXG5cdFx0XHQvLyBTaG93IG1vZHVsZSdzIG1haW4gdmlld1xuXHRcdFx0dGhpcy5fc3dpdGNoVmlldygnc3ZtLW1haW4nKTtcblx0XHR9XG5cblx0XHQvLyBBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBtYW5hZ2luZyBzZXJ2bGV0IGZpbGVzXG5cdFx0ZWxzZSBpZiAoY29tbWFuZCA9PSB0aGlzLlJFU1BfRVJST1IpXG5cdFx0e1xuXHRcdFx0Ly8gSGlkZSBhZGQgZm9sZGVyIG1vZGFsXG5cdFx0XHR0aGlzLl9hZGRGb2xkZXJNb2RhbC5tb2RhbCgnaGlkZScpO1xuXG5cdFx0XHQvLyBSZS1lbmFibGUgaW50ZXJmYWNlXG5cdFx0XHR0aGlzLl9lbmFibGVJbnRlcmZhY2UodHJ1ZSk7XG5cblx0XHRcdC8vIFNob3cgYW4gYWxlcnRcblx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dTaW1wbGVBbGVydChkYXRhLmdldFV0ZlN0cmluZygnZXJyb3InKSk7XG5cdFx0fVxuXG5cdFx0Ly8gU2VydmxldCBmb2xkZXIgb3IgZmlsZSBhZGRlZFxuXHRcdGVsc2UgaWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX0ZJTEVfQURERUQpXG5cdFx0e1xuXHRcdFx0Ly8gR2V0IG5hbWUgb2YgdGhlIHVzZXIgd2hvIGFkZGVkIHRoZSBmaWxlL2ZvbGRlclxuXHRcdFx0Y29uc3QgcmVxdWVzdGVyID0gZGF0YS5nZXRVdGZTdHJpbmcoJ3VzZXInKTtcblxuXHRcdFx0Ly8gR2V0IHRoZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBmaWxlL2ZvbGRlciBiZWluZyBhZGRlZFxuXHRcdFx0Y29uc3QgZmlsZU9iaiA9IGRhdGEuZ2V0U0ZTT2JqZWN0KCdmaWxlJyk7XG5cblx0XHRcdC8vIEdldCB0aGUgdGFyZ2V0IGZvbGRlciB3aGVyZSB0aGUgbmV3IGZpbGUvZm9sZGVyIHNob3VsZCBiZSBhZGRlZFxuXHRcdFx0Y29uc3QgcGFyZW50UGF0aCA9IGRhdGEuZ2V0VXRmU3RyaW5nKCdwYXJlbnQnKTtcblxuXHRcdFx0Ly8gR2V0IHRoZSBmbGFnIG5vdGlmeWluZyB0aGlzIHdhcyBhIGZpbGUgdXBsb2FkXG5cdFx0XHRjb25zdCBpc1VwbG9hZCA9IGRhdGEuZ2V0Qm9vbCgnaXNVcGxvYWQnKTtcblxuXHRcdFx0dHJ5XG5cdFx0XHR7XG5cdFx0XHRcdC8vIEFkZC91cGRhdGUgaXRlbSBvbiBkYXRhIHNvdXJjZVxuXHRcdFx0XHRjb25zdCBmaWxlUGF0aCA9IHRoaXMuX2ZpbGVNYW5hZ2VyLmFkZEZpbGVUb1BhcmVudChmaWxlT2JqLCBwYXJlbnRQYXRoKTtcblxuXHRcdFx0XHQvLyBSZWZyZXNoIHZpZXdcblx0XHRcdFx0dGhpcy5fZmlsZXNMaXN0LnJlZnJlc2goKTtcblxuXHRcdFx0XHRpZiAocmVxdWVzdGVyID09IHRoaXMuc21hcnRGb3gubXlTZWxmLm5hbWUpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHQvLyBFeHBhbmQgcGFyZW50XG5cdFx0XHRcdFx0dGhpcy5fZmlsZXNMaXN0LmV4cGFuZCgkKGAjc3ZtLWZpbGVMaXN0IC5maWxlLWNvbnRyb2xzW2RhdGEtaXRlbS1pZD1cIiR7JC5lc2NhcGVTZWxlY3RvcihwYXJlbnRQYXRoKX1cIl1gKS5jbG9zZXN0KCd0cicpKTtcblxuXHRcdFx0XHRcdGlmICghaXNVcGxvYWQpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0Ly8gSGlkZSBtb2RhbFxuXHRcdFx0XHRcdFx0dGhpcy5fYWRkRm9sZGVyTW9kYWwubW9kYWwoJ2hpZGUnKTtcblxuXHRcdFx0XHRcdFx0Ly8gU2VsZWN0IHVwbG9hZCBmaWxlXG5cdFx0XHRcdFx0XHR0aGlzLl9maWxlc0xpc3Quc2VsZWN0KCQoYCNzdm0tZmlsZUxpc3QgLmZpbGUtY29udHJvbHNbZGF0YS1pdGVtLWlkPVwiJHskLmVzY2FwZVNlbGVjdG9yKGZpbGVQYXRoKX1cIl1gKS5jbG9zZXN0KCd0cicpKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBVcGRhdGUgc2VsZWN0aW9uXG5cdFx0XHRcdFx0dGhpcy5fb25GaWxlU2VsZWN0ZWRDaGFuZ2UoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdHtcblx0XHRcdFx0XHQvLyBEaXNwbGF5IG5vdGlmaWNhdGlvblxuXHRcdFx0XHRcdGlmICghaXNVcGxvYWQpXG5cdFx0XHRcdFx0XHR0aGlzLnNoZWxsQ3RybC5zaG93Tm90aWZpY2F0aW9uKGBGb2xkZXIgY3JlYXRlZGAsIGBBZG1pbmlzdHJhdG9yICR7cmVxdWVzdGVyfSBjcmVhdGVkIGZvbGRlcjogPHN0cm9uZz4ke2ZpbGVQYXRofTwvc3Ryb25nPmApO1xuXHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dOb3RpZmljYXRpb24oYEZpbGUgdXBsb2FkZWRgLCBgQWRtaW5pc3RyYXRvciAke3JlcXVlc3Rlcn0gdXBsb2FkZWQgZmlsZTogPHN0cm9uZz4ke2ZpbGVQYXRofTwvc3Ryb25nPmApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRjYXRjaCAoZSlcblx0XHRcdHtcblx0XHRcdFx0Ly8gVGhpcyBzaG91bGQgbm90IGhhcHBlbi4uLiBkYXRhIHNvdXJjZSBpcyBjb3JydXB0ZWQ/XG5cdFx0XHRcdGlmIChyZXF1ZXN0ZXIgPT0gdGhpcy5zbWFydEZveC5teVNlbGYubmFtZSlcblx0XHRcdFx0XHR0aGlzLnNoZWxsQ3RybC5zaG93U2ltcGxlQWxlcnQoZS5tZXNzYWdlLCB0cnVlKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gRW5hYmxlIGludGVyZmFjZVxuXHRcdFx0dGhpcy5fZW5hYmxlSW50ZXJmYWNlKHRydWUpO1xuXHRcdH1cblxuXHRcdC8vIFNlcnZsZXQgZmlsZXMgZGVsZXRlZFxuXHRcdGVsc2UgaWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX0ZJTEVTX0RFTEVURUQpXG5cdFx0e1xuXHRcdFx0Ly8gR2V0IG5hbWUgb2YgdGhlIHVzZXIgd2hvIGRlbGV0ZWQgdGhlIGZpbGUvc1xuXHRcdFx0Y29uc3QgcmVxdWVzdGVyID0gZGF0YS5nZXRVdGZTdHJpbmcoJ3VzZXInKTtcblxuXHRcdFx0Ly8gR2V0IHRoZSBsaXN0IG9mIGRlbGV0ZWQgZmlsZXNcblx0XHRcdGxldCBmaWxlcyA9IGRhdGEuZ2V0U0ZTQXJyYXkoJ2ZpbGVzJyk7XG5cblx0XHRcdGxldCBmaWxlc0FyciA9IFtdO1xuXG5cdFx0XHQvLyBVcGRhdGUgZGF0YSBzb3VyY2Vcblx0XHRcdGZvciAobGV0IGogPSAwOyBqIDwgZmlsZXMuc2l6ZSgpOyBqKyspXG5cdFx0XHR7XG5cdFx0XHRcdGxldCBwYXRoID0gZmlsZXMuZ2V0VXRmU3RyaW5nKGopO1xuXHRcdFx0XHRmaWxlc0Fyci5wdXNoKHBhdGgpO1xuXG5cdFx0XHRcdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0XHRcdFx0Ly8gUmVtb3ZlIGl0ZW0gZnJvbSBkYXRhIHNvdXJjZTsgcGFyZW50IGl0ZW0gaXMgcmV0dXJuZWRcblx0XHRcdFx0bGV0IHBhcmVudEl0ZW0gPSB0aGlzLl9maWxlTWFuYWdlci5yZW1vdmVGaWxlKHBhdGgpO1xuXG5cdFx0XHRcdC8vIENvbGxhcHNlIHBhcmVudCBpZiB0aGUgbGFzdCBvZiBpdHMgY2hpbGRyZW4gd2FzIGRlbGV0ZWRcblx0XHRcdFx0aWYgKHBhcmVudEl0ZW0gJiYgIXBhcmVudEl0ZW0uaGFzQ2hpbGRyZW4pXG5cdFx0XHRcdFx0dGhpcy5fZmlsZXNMaXN0LmNvbGxhcHNlKCQoYCNzdm0tZmlsZUxpc3QgLmZpbGUtY29udHJvbHNbZGF0YS1pdGVtLWlkPVwiJHskLmVzY2FwZVNlbGVjdG9yKHBhcmVudEl0ZW0uaWQpfVwiXWApLmNsb3Nlc3QoJ3RyJykpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAocmVxdWVzdGVyID09IHRoaXMuc21hcnRGb3gubXlTZWxmLm5hbWUpXG5cdFx0XHR7XG5cdFx0XHRcdC8vIERpc3BsYXkgbm90aWZpY2F0aW9uXG5cdFx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dOb3RpZmljYXRpb24oYCR7dGhpcy5fc2VsZWN0ZWRJdGVtLmlzRGlyID8gJ0ZvbGRlcicgOiAnRmlsZSd9IGRlbGV0ZWRgLCBgJHt0aGlzLl9zZWxlY3RlZEl0ZW0uaXNEaXIgPyAnRm9sZGVyJyA6ICdGaWxlJ30gJyR7dGhpcy5fc2VsZWN0ZWRJdGVtLm5hbWV9JyBkZWxldGVkIHN1Y2Nlc3NmdWxseWApO1xuXG5cdFx0XHRcdHRoaXMuX3NlbGVjdGVkSXRlbSA9IG51bGw7XG5cblx0XHRcdFx0dGhpcy5fZW5hYmxlSW50ZXJmYWNlKHRydWUpO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBEaXNwbGF5IG5vdGlmaWNhdGlvblxuXHRcdFx0XHR0aGlzLnNoZWxsQ3RybC5zaG93Tm90aWZpY2F0aW9uKGBGaWxlIGRlbGV0ZWRgLCBgQWRtaW5pc3RyYXRvciAke3JlcXVlc3Rlcn0gZGVsZXRlZCB0aGUgZm9sbG93aW5nIGZpbGUke2ZpbGVzQXJyLmxlbmd0aCA+IDEgPyAncycgOiAnJ306IDxzdHJvbmc+JHtmaWxlc0Fyci5qb2luKCc8YnI+ICcpfTwvc3Ryb25nPmApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZXNldCBzZWxlY3Rpb25cblx0XHRcdHRoaXMuX29uRmlsZVNlbGVjdGVkQ2hhbmdlKCk7XG5cdFx0fVxuXG5cdFx0Ly8gZWxzZSBpZiAoKVxuXHR9XG5cblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0Ly8gVUkgRVZFTlQgTElTVEVORVJTXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0X29uUmV0cnlDbGljaygpXG5cdHtcblx0XHR0aGlzLl9zd2l0Y2hWaWV3KCdzdm0taW5pdCcpO1xuXG5cdFx0Ly8gUmUtc2VuZCBpbml0aWFsaXphdGlvbiByZXF1ZXN0XG5cdFx0dGhpcy5zZW5kRXh0ZW5zaW9uUmVxdWVzdCh0aGlzLlJFUV9JTklUKTtcblx0fVxuXG5cdF9vblJlZnJlc2hDbGljaygpXG5cdHtcblx0XHR0aGlzLl9maWxlc0xpc3QuY2xlYXJTZWxlY3Rpb24oKTtcblx0XHR0aGlzLl9yZWZyZXNoRGF0YUxpc3QoKTtcblx0fVxuXG5cdF9vbkZpbGVTZWxlY3RlZENoYW5nZSgpXG5cdHtcblx0XHQvLyBIaWRlIGNvbnRyb2wgYnV0dG9ucyBvbiBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbVxuXHRcdGlmICh0aGlzLl9zZWxlY3RlZEl0ZW0pXG5cdFx0XHQkKGAjc3ZtLWZpbGVMaXN0IC5maWxlLWNvbnRyb2xzW2RhdGEtaXRlbS1pZD1cIiR7JC5lc2NhcGVTZWxlY3Rvcih0aGlzLl9zZWxlY3RlZEl0ZW0uaWQpfVwiXWApLmhpZGUoKTtcblxuXHRcdC8vIEdldCBzZWxlY3RlZCBpdGVtXG5cdFx0bGV0IHNlbGVjdGVkUm93cyA9IHRoaXMuX2ZpbGVzTGlzdC5zZWxlY3QoKTtcblxuXHRcdGlmIChzZWxlY3RlZFJvd3MubGVuZ3RoID4gMClcblx0XHR7XG5cdFx0XHQvLyBTYXZlIHJlZi4gdG8gc2VsZWN0ZWQgaXRlbVxuXHRcdFx0dGhpcy5fc2VsZWN0ZWRJdGVtID0gdGhpcy5fZmlsZXNMaXN0LmRhdGFJdGVtKHNlbGVjdGVkUm93c1swXSk7XG5cblx0XHRcdC8vIFNob3cgY29udHJvbCBidXR0b25zIG9uIG5ldyBzZWxlY3RlZCBpdGVtXG5cdFx0XHQkKGAjc3ZtLWZpbGVMaXN0IC5maWxlLWNvbnRyb2xzW2RhdGEtaXRlbS1pZD1cIiR7JC5lc2NhcGVTZWxlY3Rvcih0aGlzLl9zZWxlY3RlZEl0ZW0uaWQpfVwiXWApLnNob3coKTtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5fc2VsZWN0ZWRJdGVtID0gbnVsbDtcblx0fVxuXG5cdF9zaG93QWRkRm9sZGVyTW9kYWxDbGljaygpXG5cdHtcblx0XHRpZiAodGhpcy5fc2VsZWN0ZWRJdGVtICYmIHRoaXMuX3NlbGVjdGVkSXRlbS5pc0Rpcilcblx0XHR7XG5cdFx0XHR0aGlzLl9hZGRGb2xkZXJNb2RhbC5tb2RhbCgnc2hvdycpO1xuXHRcdFx0JCgnI3N2bS1mb2xkZXJOYW1lSW4nKS5mb2N1cygpO1xuXHRcdH1cblx0fVxuXG5cdF9vbkFkZEZvbGRlckNsaWNrKClcblx0e1xuXHRcdC8vIFRoZSBwYXJlbnQgZm9sZGVyIGNvdWxkIGhhdmUgYmVlbiBkZWxldGVkIHdoaWxlIHVzZXIgaXMgc3RpbGwgdHlwaW5nIHRoZSBuYW1lIG9mIHRoZSBuZXcgY2hpbGQgZm9sZGVyXG5cdFx0aWYgKCF0aGlzLl9zZWxlY3RlZEl0ZW0pXG5cdFx0e1xuXHRcdFx0dGhpcy5fYWRkRm9sZGVyTW9kYWwubW9kYWwoJ2hpZGUnKTtcblx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dTaW1wbGVBbGVydCgnVW5hYmxlIHRvIGNyZWF0ZSBmb2xkZXI7IHRoZSBwYXJlbnQgZm9sZGVyIGRvZXNuXFwndCBleGlzdC4nKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5fYWRkRm9sZGVyVmFsaWRhdG9yLnZhbGlkYXRlKCkpXG5cdFx0e1xuXHRcdFx0Ly8gRGlzYWJsZSBtb2RhbCBpbnRlcmZhY2Vcblx0XHRcdHRoaXMuX2VuYWJsZUFkZEZvbGRlck1vZGFsKGZhbHNlKTtcblxuXHRcdFx0bGV0IGRhdGEgPSBuZXcgU0ZTMlguU0ZTT2JqZWN0KCk7XG5cdFx0XHRkYXRhLnB1dFV0ZlN0cmluZygnZm9sZGVyJywgdGhpcy5fc2VsZWN0ZWRJdGVtLmlkICsgdGhpcy5fZmlsZVNlcGFyYXRvciArICQoJyNzdm0tZm9sZGVyTmFtZUluJykudmFsKCkpO1xuXG5cdFx0XHQvLyBTZW5kIHJlcXVlc3QgdG8gc2VydmVyXG5cdFx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX0NSRUFURV9GT0xERVIsIGRhdGEpO1xuXHRcdH1cblx0fVxuXG5cdF9vbkFkZEZvbGRlck1vZGFsSGlkZGVuKClcblx0e1xuXHRcdCQoJyNzdm0tZm9sZGVyTmFtZUluJykudmFsKCcnKTtcblx0XHR0aGlzLl9yZXNldEFkZEZvbGRlclZhbGlkYXRpb24oKTtcblxuXHRcdC8vIEVuYWJsZSBtb2RhbCBpbnRlcmZhY2Vcblx0XHR0aGlzLl9lbmFibGVBZGRGb2xkZXJNb2RhbCh0cnVlKTtcblx0fVxuXG5cdF9zaG93VXBsb2FkRmlsZXNNb2RhbENsaWNrKClcblx0e1xuXHRcdGlmICh0aGlzLl9zZWxlY3RlZEl0ZW0pXG5cdFx0XHR0aGlzLl91cGxvYWRGaWxlc01vZGFsLm1vZGFsKCdzaG93Jyk7XG5cdH1cblxuXHRfb25DbGVhckZpbGVzQ2xpY2soKVxuXHR7XG5cdFx0dGhpcy5fdXBsb2FkZXIuY2xlYXJBbGxGaWxlcygpO1xuXHR9XG5cblx0X29uVXBsb2FkU3RhcnQoZSlcblx0e1xuXHRcdC8vIERpc2FibGUgY2xlYXIgYnV0dG9uXG5cdFx0JCgnI3N2bS1jbGVhckZpbGVzQnQnKS5hdHRyKCdkaXNhYmxlZCcsIHRydWUpO1xuXG5cdFx0Ly8gU2V0IGRlc3RpbmF0aW9uIHVybFxuXHRcdGNvbnN0IHVybCA9IHRoaXMuX3VwbG9hZFRhcmdldENvbmZpZy5wcm90b2NvbCArICc6Ly8nICsgdGhpcy5fdXBsb2FkVGFyZ2V0Q29uZmlnLmhvc3QgKyAnOicgKyB0aGlzLl91cGxvYWRUYXJnZXRDb25maWcucG9ydCArICcvQmx1ZUJveC9TRlMyWEZpbGVVcGxvYWQ/c2Vzc0hhc2hJZD0nICsgdGhpcy5fdXBsb2FkVGFyZ2V0Q29uZmlnLnNlc3Npb25Ub2tlbjtcblxuXHRcdGUuc2VuZGVyLm9wdGlvbnMuYXN5bmMuc2F2ZVVybCA9IHVybDtcblxuXHRcdC8vIFNldCBwYXlsb2FkXG5cdFx0Y29uc3QgcGFyYW1zID0gbmV3IEZvcm1EYXRhKCk7XG5cdFx0cGFyYW1zLmFwcGVuZCgnX19tb2R1bGUnLCB0aGlzLl91cGxvYWRUYXJnZXRDb25maWcubW9kdWxlSWQpO1xuXHRcdHBhcmFtcy5hcHBlbmQoJ19fdGFyZ2V0JywgdGhpcy5fc2VsZWN0ZWRJdGVtLmlkKTtcblxuXHRcdGZvciAobGV0IGYgPSAwOyBmIDwgZS5maWxlcy5sZW5ndGg7IGYrKylcblx0XHRcdHBhcmFtcy5hcHBlbmQoJ2ZpbGVzW10nLCBlLmZpbGVzW2ZdLnJhd0ZpbGUpO1xuXG5cdFx0ZS5mb3JtRGF0YSA9IHBhcmFtcztcblx0fVxuXG5cdF9vblVwbG9hZEVuZChlKVxuXHR7XG5cdFx0Ly8gRW5hYmxlIGNsZWFyIGJ1dHRvblxuXHRcdCQoJyNzdm0tY2xlYXJGaWxlc0J0JykuYXR0cignZGlzYWJsZWQnLCBmYWxzZSk7XG5cdH1cblxuXHRfb25GaWxlc1VwbG9hZEVuZChyZXNwb25zZSlcblx0e1xuXHRcdC8vIE5vdGhpbmcgdG8gZG86IHdlIGhhdmUgdG8gd2FpdCB0aGUgdXBsb2FkIHByb2Nlc3MgY29tcGxldGlvbiB0byBiZSBzaWduYWxlZCBieSB0aGUgc2VydmVyIHRocm91Z2ggdGhlIGRlZGljYXRlZCBFeHRlbnNpb24gcmVzcG9uc2VcblxuXHRcdC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHRcdC8vIFRPRE8gU2hvdWxkIHdlIGhhbmRsZSB0aGlzIHJlc3BvbnNlIGluIHNvbWUgd2F5PyBGb3Igc29tZSB1bmtub3duIHJlYXNvbiB3ZSBhbHdheXMgZ2V0IG9rPWZhbHNlIGFuZCBzdGF0dXM9MFxuXHRcdC8vIGNvbnNvbGUubG9nKHJlc3BvbnNlKVxuXHRcdC8vIGNvbnNvbGUubG9nKHJlc3BvbnNlLm9rKVxuXHRcdC8vIGNvbnNvbGUubG9nKHJlc3BvbnNlLnN0YXR1cylcblx0fVxuXG5cdF9vblJlbW92ZUZpbGVDbGljaygpXG5cdHtcblx0XHRpZiAodGhpcy5fc2VsZWN0ZWRJdGVtKVxuXHRcdFx0dGhpcy5zaGVsbEN0cmwuc2hvd0NvbmZpcm1XYXJuaW5nKGBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoZSBzZWxlY3RlZCAke3RoaXMuX3NlbGVjdGVkSXRlbS5pc0RpciA/ICdmb2xkZXInIDogJ2ZpbGUnfT88YnI+PGJyPlBhdGg6IDxzdHJvbmc+JHt0aGlzLl9zZWxlY3RlZEl0ZW0uaWR9PC9zdHJvbmc+YCwgJC5wcm94eSh0aGlzLl9vblJlbW92ZUZpbGVDb25maXJtLCB0aGlzKSk7XG5cdH1cblxuXHRfb25SZW1vdmVGaWxlQ29uZmlybSgpXG5cdHtcblx0XHQvLyBEaXNhYmxlIGludGVyZmFjZVxuXHRcdHRoaXMuX2VuYWJsZUludGVyZmFjZShmYWxzZSk7XG5cblx0XHQvLyBSZXF1ZXN0IFNlcnZsZXQgZmlsZXMgcmVtb3ZhbFxuXHRcdC8vIE5PVEU6IGZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgQWRtaW5Ub29sLCB0aGUgZmlsZSB0byBiZSBkZWxldGVkIGlzIHNlbnRcblx0XHQvLyBpbiBhbiBhcnJheSBvZiBzdHJpbmdzLCBldmVuIGlmIHdlIGNhbid0IGRlbGV0ZSBtb3JlIHRoYW4gMSBmaWxlIGF0IG9uY2UgaW4gdGhpcyBBZG1pblRvb2xcblxuXHRcdGxldCBmaWxlcyA9IG5ldyBTRlMyWC5TRlNBcnJheSgpO1xuXHRcdGZpbGVzLmFkZFV0ZlN0cmluZyh0aGlzLl9zZWxlY3RlZEl0ZW0uaWQpO1xuXG5cdFx0bGV0IHBhcmFtcyA9IG5ldyBTRlMyWC5TRlNPYmplY3QoKTtcblx0XHRwYXJhbXMucHV0U0ZTQXJyYXkoJ2ZpbGVzJywgZmlsZXMpO1xuXG5cdFx0dGhpcy5zZW5kRXh0ZW5zaW9uUmVxdWVzdCh0aGlzLlJFUV9ERUxFVEVfRklMRVMsIHBhcmFtcyk7XG5cdH1cblxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQvLyBQUklWQVRFIE1FVEhPRFNcblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRfc3dpdGNoVmlldyh2aWV3SWQpXG5cdHtcblx0XHRkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZtLXZpZXdzdGFjaycpLnNlbGVjdGVkRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHZpZXdJZCk7XG5cdH1cblxuXHRfZW5hYmxlSW50ZXJmYWNlKGVuYWJsZSlcblx0e1xuXHRcdCQoJyNzdm0tZmlsZUxpc3QnKS5hdHRyKCdkaXNhYmxlZCcsICFlbmFibGUpO1xuXHRcdCQoJyNzdm0tcmVmcmVzaEJ0JykuYXR0cignZGlzYWJsZWQnLCAhZW5hYmxlKTtcblx0fVxuXG5cdF9yZWZyZXNoRGF0YUxpc3QoKVxuXHR7XG5cdFx0Ly8gRGlzYWJsZSBpbnRlcmZhY2Vcblx0XHR0aGlzLl9lbmFibGVJbnRlcmZhY2UoZmFsc2UpO1xuXG5cdFx0Ly8gU2VuZCByZXF1ZXN0IHRvIHNlcnZlclxuXHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfR0VUX1NFUlZMRVRTKVxuXHR9XG5cblx0X3Jlc2V0QWRkRm9sZGVyVmFsaWRhdGlvbigpXG5cdHtcblx0XHR0aGlzLl9hZGRGb2xkZXJWYWxpZGF0b3IuaGlkZU1lc3NhZ2VzKCk7XG5cblx0XHQvLyBUaGUgbWV0aG9kIGFib3ZlIGRvZXNuJ3QgcmVtb3ZlIHRoZSBrLWludmFsaWQgY2xhc3NlcyBhbmQgYXJpYS1pbnZhbGlkPVwidHJ1ZVwiIGF0dHJpYnV0ZXMgZnJvbSBpbnB1dHNcblx0XHQvLyBMZXQncyBkbyBpdCBtYW51YWxseVxuXHRcdCQoJyNzdm0tYWRkRm9sZGVyRm9ybSAuay1pbnZhbGlkJykucmVtb3ZlQ2xhc3MoJ2staW52YWxpZCcpO1xuXHRcdCQoJyNzdm0tYWRkRm9sZGVyRm9ybSBbYXJpYS1pbnZhbGlkPVwidHJ1ZVwiXScpLnJlbW92ZUF0dHIoJ2FyaWEtaW52YWxpZCcpO1xuXHR9XG5cblx0X2VuYWJsZUFkZEZvbGRlck1vZGFsKGVuYWJsZSlcblx0e1xuXHRcdC8vIERpc2FibGUgbW9kYWwgY2xvc2UgYnV0dG9uc1xuXHRcdCQoJyNzdm0tYWRkRm9sZGVyTW9kYWwgYnV0dG9uW2RhdGEtZGlzbWlzcz1cIm1vZGFsXCJdJykuYXR0cignZGlzYWJsZWQnLCAhZW5hYmxlKTtcblxuXHRcdC8vIERpc2FibGUgYWRkIGJ1dHRvblxuXHRcdCQoJyNzdm0tYWRkRm9sZGVyQnQnKS5hdHRyKCdkaXNhYmxlZCcsICFlbmFibGUpO1xuXG5cdFx0Ly8gRGlzYWJsZSBmaWVsZHNldFxuXHRcdCQoJyNzdm0tYWRkRm9sZGVyRm9ybScpLmF0dHIoJ2Rpc2FibGVkJywgIWVuYWJsZSk7XG5cdH1cblxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQvLyBQUklWQVRFIEdFVFRFUlNcblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDaEpBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBIiwic291cmNlUm9vdCI6IiJ9
799
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXRzL2pzL2NvcmUvbW9kdWxlcy9tb2R1bGUtMTAuYnVuZGxlLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYXBwbGljYXRpb24vLi9zcmMvbWFuYWdlcnMvZmlsZS1kYXRhc291cmNlLW1hbmFnZXIuanMiLCJ3ZWJwYWNrOi8vYXBwbGljYXRpb24vLi9zcmMvbW9kdWxlcy9leHRlbnNpb24tbWFuYWdlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgRmlsZURhdGFTb3VyY2VNYW5hZ2VyXG57XG5cdGNvbnN0cnVjdG9yKGxpYkZvbGRlciwgcHJvdGVjdGVkRm9sZGVycywgZmlsZVNlcGFyYXRvcilcblx0e1xuXHRcdHRoaXMuX3Byb3RlY3RlZEZvbGRlcnMgPSBwcm90ZWN0ZWRGb2xkZXJzOyAvLyBGb2xkZXJzIHdoaWNoIGNhbid0IGJlIGRlbGV0ZWQgKGJ1dCB0aGVpciBjb250ZW50IGNhbilcblx0XHR0aGlzLl9saWJGb2xkZXIgPSBsaWJGb2xkZXI7XG5cdFx0dGhpcy5fZmlsZVNlcGFyYXRvciA9IGZpbGVTZXBhcmF0b3I7XG5cdH1cblxuXHRnZXQgZGF0YVNvdXJjZSgpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fZGF0YVNvdXJjZTtcblx0fVxuXG5cdGluaXQoKVxuXHR7XG5cdFx0dGhpcy5fZGF0YVNvdXJjZSA9IG5ldyBrZW5kby5kYXRhLlRyZWVMaXN0RGF0YVNvdXJjZSh7XG5cdFx0XHRkYXRhOiBbXSxcblx0XHRcdHNjaGVtYToge1xuXHRcdFx0XHRtb2RlbDoge1xuXHRcdFx0XHRcdGlkOiAnaWQnLFxuXHRcdFx0XHRcdHBhcmVudElkOiAncGFyZW50SWQnLFxuXHRcdFx0XHRcdGV4cGFuZGVkOiBmYWxzZVxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0c29ydDogeyBmaWVsZDogJ25hbWUnLCBkaXI6ICdhc2MnIH1cblx0XHR9KTtcblx0fVxuXG5cdGFkZEZpbGUoZmlsZU9iaiwgcGFyZW50TGV2ZWwgPSBudWxsKVxuXHR7XG5cdFx0bGV0IGZpbGUgPSB7fTtcblxuXHRcdGZpbGUubmFtZSA9IGZpbGVPYmouZ2V0VXRmU3RyaW5nKCduYW1lJyk7XG5cdFx0ZmlsZS5pc0RpciA9IGZpbGVPYmouZ2V0Qm9vbCgnaXNEaXInKTtcblx0XHRmaWxlLmxhc3RNb2QgPSBmaWxlT2JqLmdldExvbmcoJ2xhc3RNb2QnKTtcblx0XHRmaWxlLmlzTGliID0gKGZpbGUuaXNEaXIgJiYgZmlsZS5uYW1lID09IHRoaXMuX2xpYkZvbGRlcik7XG5cdFx0ZmlsZS5pc1Byb3RlY3RlZCA9IChmaWxlLmlzRGlyICYmIHRoaXMuX3Byb3RlY3RlZEZvbGRlcnMuaW5kZXhPZihmaWxlLm5hbWUpID4gLTEpO1xuXHRcdGZpbGUuc2l6ZSA9IDA7XG5cblx0XHRpZiAocGFyZW50TGV2ZWwgPT0gbnVsbClcblx0XHRcdGZpbGUubGV2ZWwgPSAwO1xuXHRcdGVsc2Vcblx0XHRcdGZpbGUubGV2ZWwgPSBwYXJlbnRMZXZlbCArIDE7XG5cblx0XHRpZiAoZmlsZU9iai5jb250YWluc0tleSgncGFyZW50JykpXG5cdFx0e1xuXHRcdFx0ZmlsZS5wYXJlbnRJZCA9IGZpbGVPYmouZ2V0VXRmU3RyaW5nKCdwYXJlbnQnKTtcblx0XHRcdGZpbGUuaWQgPSBmaWxlLnBhcmVudElkICsgdGhpcy5fZmlsZVNlcGFyYXRvciArIGZpbGUubmFtZTtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdGZpbGUucGFyZW50SWQgPSBudWxsO1xuXHRcdFx0ZmlsZS5pZCA9IGZpbGUubmFtZTtcblx0XHR9XG5cblx0XHQvLyBBZGQgY2hpbGQgZmlsZXNcblx0XHRpZiAoZmlsZS5pc0Rpcilcblx0XHR7XG5cdFx0XHRsZXQgZmlsZXNBcnIgPSBmaWxlT2JqLmdldFNGU0FycmF5KCdmaWxlcycpO1xuXG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGZpbGVzQXJyLnNpemUoKTsgaSsrKVxuXHRcdFx0XHRmaWxlLnNpemUgKz0gdGhpcy5hZGRGaWxlKGZpbGVzQXJyLmdldFNGU09iamVjdChpKSwgZmlsZS5sZXZlbCk7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHRcdGZpbGUuc2l6ZSA9IGZpbGVPYmouZ2V0TG9uZygnc2l6ZScpO1xuXG5cdFx0Ly8gQWRkIGZpbGUgdG8gZGF0YSBzb3VyY2Vcblx0XHR0aGlzLl9kYXRhU291cmNlLmFkZChmaWxlKTtcblxuXHRcdC8vIFJldHVybiBmaWxlIHNpemVcblx0XHRyZXR1cm4gZmlsZS5zaXplO1xuXHR9XG5cblx0cmVtb3ZlRmlsZShpZClcblx0e1xuXHRcdGxldCBmaWxlSXRlbSA9IHRoaXMuX2RhdGFTb3VyY2UuZ2V0KGlkKTtcblxuXHRcdGlmIChmaWxlSXRlbSlcblx0XHR7XG5cdFx0XHRpZiAoZmlsZUl0ZW0ucGFyZW50SWQpXG5cdFx0XHR7XG5cdFx0XHRcdC8vIFN1YnRyYWN0IG9sZCBzaXplIGZyb20gcGFyZW50IHNpemVcblx0XHRcdFx0bGV0IHBhcmVudEl0ZW0gPSB0aGlzLl9kYXRhU291cmNlLmdldChmaWxlSXRlbS5wYXJlbnRJZCk7XG5cdFx0XHRcdHRoaXMuX3VwZGF0ZVBhcmVudFNpemUocGFyZW50SXRlbSwgLWZpbGVJdGVtLnNpemUpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLl9kYXRhU291cmNlLnJlbW92ZShmaWxlSXRlbSk7XG5cblx0XHRcdC8vIFJldHVybiBwYXJlbnQgaXRlbVxuXHRcdFx0aWYgKGZpbGVJdGVtLnBhcmVudElkKVxuXHRcdFx0XHRyZXR1cm4gdGhpcy5fZGF0YVNvdXJjZS5nZXQoZmlsZUl0ZW0ucGFyZW50SWQpO1xuXHRcdH1cblx0fVxuXG5cdGdldEZpbGVCeUlkKGlkKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2RhdGFTb3VyY2UuZ2V0KGlkKTtcblx0fVxuXG5cdGFkZEZpbGVUb1BhcmVudChmaWxlT2JqLCBwYXJlbnRJZClcblx0e1xuXHRcdGxldCBwYXJlbnRJdGVtID0gdGhpcy5fZGF0YVNvdXJjZS5nZXQocGFyZW50SWQpO1xuXG5cdFx0aWYgKHBhcmVudEl0ZW0gIT0gbnVsbCAmJiBwYXJlbnRJdGVtLmlzRGlyKVxuXHRcdHtcblx0XHRcdGNvbnN0IGZpbGVJZCA9IHBhcmVudElkICsgdGhpcy5fZmlsZVNlcGFyYXRvciArIGZpbGVPYmouZ2V0VXRmU3RyaW5nKCduYW1lJyk7XG5cdFx0XHRsZXQgZmlsZUl0ZW0gPSB0aGlzLl9kYXRhU291cmNlLmdldChmaWxlSWQpO1xuXG5cdFx0XHRpZiAoZmlsZUl0ZW0gIT0gbnVsbClcblx0XHRcdHtcblx0XHRcdFx0Ly8gU3VidHJhY3Qgb2xkIHNpemUgZnJvbSBwYXJlbnQgc2l6ZVxuXHRcdFx0XHR0aGlzLl91cGRhdGVQYXJlbnRTaXplKHBhcmVudEl0ZW0sIC1maWxlSXRlbS5zaXplKTtcblxuXHRcdFx0XHQvLyBVcGRhdGUgZXhpc3RpbmcgaXRlbVxuXHRcdFx0XHRmaWxlSXRlbS5uYW1lID0gZmlsZU9iai5nZXRVdGZTdHJpbmcoJ25hbWUnKTtcblx0XHRcdFx0ZmlsZUl0ZW0ubGFzdE1vZCA9IGZpbGVPYmouZ2V0TG9uZygnbGFzdE1vZCcpO1xuXHRcdFx0XHRmaWxlSXRlbS5zaXplID0gZmlsZU9iai5nZXRMb25nKCdzaXplJyk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlXG5cdFx0XHR7XG5cdFx0XHRcdC8vIEFkZCBuZXcgaXRlbVxuXHRcdFx0XHR0aGlzLmFkZEZpbGUoZmlsZU9iaiwgcGFyZW50SXRlbS5sZXZlbCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFVwZGF0ZSBwYXJlbnQgaXRlbSBzaXplXG5cdFx0XHR0aGlzLl91cGRhdGVQYXJlbnRTaXplKHBhcmVudEl0ZW0sIGZpbGVPYmouZ2V0TG9uZygnc2l6ZScpKTtcblxuXHRcdFx0cmV0dXJuIGZpbGVJZDtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBBbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VycmVkIHdoaWxlIGFkZGluZyBmaWxlICcke2ZpbGVPYmouZ2V0VXRmU3RyaW5nKCduYW1lJyl9JyAodGFyZ2V0OiAke3BhcmVudElkfSkuYCk7XG5cdH1cblxuXHRfdXBkYXRlUGFyZW50U2l6ZShwYXJlbnRJdGVtLCB2YWx1ZSlcblx0e1xuXHRcdHBhcmVudEl0ZW0uc2l6ZSArPSB2YWx1ZTtcblxuXHRcdGlmIChwYXJlbnRJdGVtLnBhcmVudElkKVxuXHRcdHtcblx0XHRcdGxldCBncmFuZFBhcmVudCA9IHRoaXMuX2RhdGFTb3VyY2UuZ2V0KHBhcmVudEl0ZW0ucGFyZW50SWQpO1xuXHRcdFx0dGhpcy5fdXBkYXRlUGFyZW50U2l6ZShncmFuZFBhcmVudCwgdmFsdWUpO1xuXHRcdH1cblx0fVxufVxuIiwiaW1wb3J0IHtCYXNlTW9kdWxlfSBmcm9tICcuL2Jhc2UtbW9kdWxlJztcbmltcG9ydCB7RmlsZURhdGFTb3VyY2VNYW5hZ2VyfSBmcm9tICcuLi9tYW5hZ2Vycy9maWxlLWRhdGFzb3VyY2UtbWFuYWdlcic7XG5pbXBvcnQge2J5dGVzVG9TaXplfSBmcm9tICcuLi91dGlscy91dGlsaXRpZXMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFeHRlbnNpb25NYW5hZ2VyIGV4dGVuZHMgQmFzZU1vZHVsZVxue1xuXHRjb25zdHJ1Y3RvcigpXG5cdHtcblx0ICAgIHN1cGVyKCdleHRlbnNpb25NYW4nKTtcblxuXHRcdC8vIE91dGdvaW5nIHJlcXVlc3RzXG5cdFx0dGhpcy5SRVFfSU5JVCA9ICdpbml0Jztcblx0XHR0aGlzLlJFUV9HRVRfRVhURU5TSU9OUyA9ICdnZXRFeHRlbnNpb25zJztcblx0XHR0aGlzLlJFUV9DUkVBVEVfRk9MREVSID0gJ2NyZWF0ZUZvbGRlcic7XG5cdFx0dGhpcy5SRVFfREVMRVRFX0ZJTEVTID0gJ2RlbGV0ZUV4dEZpbGVzJztcblx0XHR0aGlzLlJFUV9SRUxPQURfRVhURU5TSU9OUyA9ICdyZWxvYWRFeHQnO1xuXG5cdFx0Ly8gSW5jb21pbmcgcmVzcG9uc2VzXG5cdFx0dGhpcy5SRVNQX0xPQ0tFRCA9ICdsb2NrJztcblx0XHR0aGlzLlJFU1BfSU5JVCA9ICdpbml0Jztcblx0XHR0aGlzLlJFU1BfRVhURU5TSU9OUyA9ICdleHRlbnNpb25zJztcblx0XHR0aGlzLlJFU1BfRklMRV9BRERFRCA9ICdmaWxlQWRkZWQnO1xuXHRcdHRoaXMuUkVTUF9GSUxFU19ERUxFVEVEID0gJ2ZpbGVzRGVsZXRlZCc7XG5cdFx0dGhpcy5SRVNQX0VSUk9SID0gJ2Vycm9yJztcblx0fVxuXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdC8vIENPTU1PTiBNT0RVTEUgSU5URVJGQUNFIE1FVEhPRFNcblx0Ly8gVGhpcyBtZW1iZXJzIGFyZSB1c2VkIGJ5IHRoZSBtYWluIGNvbnRyb2xsZXJcblx0Ly8gdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgbW9kdWxlJ3MgY29udHJvbGxlci5cblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRpbml0aWFsaXplKGlkRGF0YSwgc2hlbGxDb250cm9sbGVyKVxuXHR7XG5cdFx0Ly8gQ2FsbCBzdXBlciBtZXRob2Rcblx0XHRzdXBlci5pbml0aWFsaXplKGlkRGF0YSwgc2hlbGxDb250cm9sbGVyKTtcblxuXHRcdC8vIEluaXRpYWxpemUgcHJvZ3Jlc3MgYmFyXG5cdFx0JCgnI2V4bS1wcm9ncmVzc0JhcicpLmtlbmRvUHJvZ3Jlc3NCYXIoe1xuXHRcdFx0bWluOiAwLFxuICAgICAgICAgICAgbWF4OiAxMDAsXG5cdFx0XHR2YWx1ZTogZmFsc2UsXG4gICAgICAgICAgICB0eXBlOiAndmFsdWUnLFxuICAgICAgICAgICAgYW5pbWF0aW9uOiB7XG4gICAgICAgICAgICAgICAgZHVyYXRpb246IDQwMFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuXHRcdC8vIEFkZCBsaXN0ZW5lcnMgdG8gYnV0dG9uc1xuXHRcdCQoJyNleG0tcmV0cnlCdCcpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25SZXRyeUNsaWNrLCB0aGlzKSk7XG5cdFx0JCgnI2V4bS1yZWZyZXNoQnQnKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uUmVmcmVzaENsaWNrLCB0aGlzKSk7XG5cblx0XHQvLyBJbml0aWFsaXplIGZpbGVzIGxpc3Rcblx0XHR0aGlzLl9maWxlc0xpc3QgPSAkKCcjZXhtLWZpbGVMaXN0Jykua2VuZG9UcmVlTGlzdCh7XG4gICAgICAgICAgICBkYXRhU291cmNlOiBbXSxcblx0XHRcdHJlc2l6YWJsZTogdHJ1ZSxcblx0XHRcdHNlbGVjdGFibGU6IHRydWUsXG4gICAgICAgICAgICBjb2x1bW5zOiBbXG4gICAgICAgICAgICAgICAge1xuXHRcdFx0XHRcdGZpZWxkOiAnbmFtZScsXG5cdFx0XHRcdFx0dGl0bGU6ICdOYW1lJyxcblx0XHRcdFx0XHR0ZW1wbGF0ZToga2VuZG8udGVtcGxhdGUoYFxuXHRcdFx0XHRcdFx0PGRpdiA+XG5cdFx0XHRcdFx0XHRcdCMgaWYgKGlzRGlyKSB7ICNcblx0XHRcdFx0XHRcdFx0XHQjIGlmIChleHBhbmRlZCkgeyAjXG5cdFx0XHRcdFx0XHRcdFx0XHQ8aSBjbGFzcz1cImZhcyBmYS1mb2xkZXItb3BlblwiPjwvaT5cblx0XHRcdFx0XHRcdFx0XHQjIH0gZWxzZSB7ICNcblx0XHRcdFx0XHRcdFx0XHRcdDxpIGNsYXNzPVwiZmFzIGZhLWZvbGRlclwiPjwvaT5cblx0XHRcdFx0XHRcdFx0XHQjIH0gI1xuXHRcdFx0XHRcdFx0XHQjIH0gZWxzZSB7ICNcblx0XHRcdFx0XHRcdFx0XHQ8aSBjbGFzcz1cImZhciBmYS1maWxlXCI+PC9pPlxuXHRcdFx0XHRcdFx0XHQjIH0gI1xuXG5cdFx0XHRcdFx0XHRcdCM6IG5hbWUgI1xuXG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJmaWxlLWNvbnRyb2xzIGZsZXgtZ3Jvdy0xIHRleHQtcmlnaHRcIiBkYXRhLWl0ZW0taWQ9XCIjOmlkI1wiPlxuXHRcdFx0XHRcdFx0XHQjIGlmIChpc0RpcikgeyAjXG5cdFx0XHRcdFx0XHRcdFx0PGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJrLWJ1dHRvbiBrLXByaW1hcnkgbXktMSBjcmVhdGUtZm9sZGVyLWJ0XCI+PGkgY2xhc3M9XCJmYXMgZmEtZm9sZGVyLXBsdXNcIj48L2k+PC9idXR0b24+XG5cdFx0XHRcdFx0XHRcdFx0IyBpZiAobGV2ZWwgPiAwKSB7ICNcblx0XHRcdFx0XHRcdFx0XHRcdDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiay1idXR0b24gay1wcmltYXJ5IG15LTEgdXBsb2FkLWZpbGVzLWJ0XCI+PGkgY2xhc3M9XCJmYXMgZmEtZmlsZS11cGxvYWRcIj48L2k+PC9idXR0b24+XG5cdFx0XHRcdFx0XHRcdFx0IyB9ICNcblx0XHRcdFx0XHRcdFx0IyB9ICNcblxuXHRcdFx0XHRcdFx0XHQjIGlmIChsZXZlbCA+IDAgJiYgIWlzUHJvdGVjdGVkKSB7ICNcblx0XHRcdFx0XHRcdFx0XHQ8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImstYnV0dG9uIGstcHJpbWFyeSBteS0xIHJlbW92ZS1maWxlLWJ0XCI+PGkgY2xhc3M9XCJmYXMgZmEtbWludXMtY2lyY2xlXCI+PC9pPjwvYnV0dG9uPlxuXHRcdFx0XHRcdFx0XHQjIH0gI1xuXG5cdFx0XHRcdFx0XHRcdCMgaWYgKGxldmVsID09IDEgJiYgIWlzTGliKSB7ICNcblx0XHRcdFx0XHRcdFx0XHQ8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImstYnV0dG9uIGstcHJpbWFyeSBteS0xIHJlbG9hZC1leHQtYnRcIj48aSBjbGFzcz1cImZhcyBmYS1yZWRvLWFsdFwiPjwvaT48L2J1dHRvbj5cblx0XHRcdFx0XHRcdFx0IyB9ICNcblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdGApLFxuXHRcdFx0XHR9LFxuICAgICAgICAgICAgICAgIHtcblx0XHRcdFx0XHRmaWVsZDogJ3NpemUnLFxuXHRcdFx0XHRcdHRpdGxlOiAnU2l6ZScsXG5cdFx0XHRcdFx0dGVtcGxhdGU6IGZ1bmN0aW9uKGRhdGFJdGVtKSB7XG5cdFx0XHRcdFx0XHRkYXRhSXRlbS5ieXRlc1RvU2l6ZSA9IGJ5dGVzVG9TaXplOyAvLyBQYXNzIGJ5dGVzVG9TaXplIHV0aWxpdHkgZnVuY3Rpb24gdG8gdGVtcGxhdGVcblx0XHRcdFx0XHRcdHJldHVybiBrZW5kby50ZW1wbGF0ZShgXG5cdFx0XHRcdFx0XHRcdCM6IGJ5dGVzVG9TaXplKHNpemUsIDIsICdLQicpICNcblx0XHRcdFx0XHRcdGApKGRhdGFJdGVtKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHdpZHRoOiAxMjAsXG5cdFx0XHRcdFx0bWluU2NyZWVuV2lkdGg6IDU3NlxuXHRcdFx0XHR9LFxuICAgICAgICAgICAgICAgIHtcblx0XHRcdFx0XHRmaWVsZDogJ2xhc3RNb2QnLFxuXHRcdFx0XHRcdHRpdGxlOiAnTGFzdCBNb2RpZmllZCcsXG5cdFx0XHRcdFx0dGVtcGxhdGU6IGtlbmRvLnRlbXBsYXRlKGBcblx0XHRcdFx0XHRcdCM6IGtlbmRvLnRvU3RyaW5nKG5ldyBEYXRlKGxhc3RNb2QpLCAnZGQgTU1NIHl5eXkgSEg6bW06c3MnKSAjXG5cdFx0XHRcdFx0YCksXG5cdFx0XHRcdFx0d2lkdGg6IDIwMCxcblx0XHRcdFx0XHRtaW5TY3JlZW5XaWR0aDogNzY4XG5cdFx0XHRcdH0sXG4gICAgICAgICAgICBdLFxuXHRcdFx0Y2hhbmdlOiAkLnByb3h5KHRoaXMuX29uRmlsZVNlbGVjdGVkQ2hhbmdlLCB0aGlzKVxuICAgICAgICB9KS5kYXRhKCdrZW5kb1RyZWVMaXN0Jyk7XG5cblx0XHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRcdC8vIEFkZCBsaXN0ZW5lcnMgdG8gY2F0Y2ggY29udHJvbCBidXR0b24gY2xpY2tzIG9uIHJvd3Ncblx0XHQkKCcjZXhtLWZpbGVMaXN0Jykub24oJ2NsaWNrJywgJy5jcmVhdGUtZm9sZGVyLWJ0JywgJC5wcm94eSh0aGlzLl9zaG93QWRkRm9sZGVyTW9kYWxDbGljaywgdGhpcykpO1xuXHRcdCQoJyNleG0tZmlsZUxpc3QnKS5vbignY2xpY2snLCAnLnVwbG9hZC1maWxlcy1idCcsICQucHJveHkodGhpcy5fc2hvd1VwbG9hZEZpbGVzTW9kYWxDbGljaywgdGhpcykpO1xuXHRcdCQoJyNleG0tZmlsZUxpc3QnKS5vbignY2xpY2snLCAnLnJlbW92ZS1maWxlLWJ0JywgJC5wcm94eSh0aGlzLl9vblJlbW92ZUZpbGVDbGljaywgdGhpcykpO1xuXHRcdCQoJyNleG0tZmlsZUxpc3QnKS5vbignY2xpY2snLCAnLnJlbG9hZC1leHQtYnQnLCAkLnByb3h5KHRoaXMuX29uUmVsb2FkRXh0Q2xpY2ssIHRoaXMpKTtcblxuXHRcdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBcImFkZCBmb2xkZXJcIiBtb2RhbFxuXHRcdHRoaXMuX2FkZEZvbGRlck1vZGFsID0gJCgnI2V4bS1hZGRGb2xkZXJNb2RhbCcpO1xuXHRcdHRoaXMuX2FkZEZvbGRlck1vZGFsLm1vZGFsKHtcblx0XHRcdGJhY2tkcm9wOiAnc3RhdGljJyxcblx0XHRcdGtleWJvYXJkOiBmYWxzZSxcblx0XHRcdHNob3c6IGZhbHNlXG5cdFx0fSk7XG5cblx0XHQvLyBBZGQgbGlzdGVuZXIgdG8gbW9kYWwgaGlkZSBldmVudFxuXHRcdHRoaXMuX2FkZEZvbGRlck1vZGFsLm9uKCdoaWRkZW4uYnMubW9kYWwnLCAkLnByb3h5KHRoaXMuX29uQWRkRm9sZGVyTW9kYWxIaWRkZW4sIHRoaXMpKTtcblxuXHRcdC8vIEFkZCBsaXN0ZW5lciB0byBBZGQgYnV0dG9uIGNsaWNrXG5cdFx0JCgnI2V4bS1hZGRGb2xkZXJCdCcpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25BZGRGb2xkZXJDbGljaywgdGhpcykpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBrZW5kbyB2YWxpZGF0aW9uIG9uIGZvbGRlciBuYW1lIGZvcm1cblx0XHR0aGlzLl9hZGRGb2xkZXJWYWxpZGF0b3IgPSAkKCcjZXhtLWFkZEZvbGRlckZvcm0nKS5rZW5kb1ZhbGlkYXRvcih7fSkuZGF0YSgna2VuZG9WYWxpZGF0b3InKTtcblxuXHRcdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBcInVwbG9hZCBmaWxlc1wiIG1vZGFsXG5cdFx0dGhpcy5fdXBsb2FkRmlsZXNNb2RhbCA9ICQoJyNleG0tdXBsb2FkTW9kYWwnKTtcblx0XHR0aGlzLl91cGxvYWRGaWxlc01vZGFsLm1vZGFsKHtcblx0XHRcdGJhY2tkcm9wOiAnc3RhdGljJyxcblx0XHRcdGtleWJvYXJkOiBmYWxzZSxcblx0XHRcdHNob3c6IGZhbHNlXG5cdFx0fSk7XG5cblx0XHQvLyBJbml0aWFsaXplIGtlbmRvIHVwbG9hZGVyXG5cdFx0dGhpcy5fdXBsb2FkZXIgPSAkKCcjZXhtLXVwbG9hZGVyJykua2VuZG9VcGxvYWQoe1xuXHRcdFx0bXVsdGlwbGU6IHRydWUsXG5cdFx0XHRhc3luYzoge1xuXHRcdFx0XHRzYXZlVXJsOiAnaHR0cDovL2xvY2FsaG9zdCcsIC8vIFRoaXMgd2lsbCBiZSBjaGFuZ2VkIGxhdGVyIGluIF9vblVwbG9hZFN0YXJ0IG1ldGhvZFxuXHRcdFx0XHRhdXRvVXBsb2FkOiB0cnVlLFxuXHRcdFx0fSxcblx0XHRcdGRpcmVjdG9yeURyb3A6IHRydWUsXG5cdFx0XHR1cGxvYWQ6ICQucHJveHkodGhpcy5fb25VcGxvYWRTdGFydCwgdGhpcyksXG5cdFx0XHRjb21wbGV0ZTogJC5wcm94eSh0aGlzLl9vblVwbG9hZEVuZCwgdGhpcyksXG5cdFx0XHRsb2NhbGl6YXRpb246IHtcblx0XHRcdFx0c2VsZWN0OiAnU2VsZWN0IGZpbGVzLi4uJ1xuXHRcdFx0fVxuXHRcdH0pLmRhdGEoJ2tlbmRvVXBsb2FkJyk7XG5cblx0XHQvLyBBZGQgbGlzdGVuZXIgdG8gVXBsb2FkIGJ1dHRvbiBjbGlja1xuXHRcdCQoJyNleG0tY2xlYXJGaWxlc0J0Jykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vbkNsZWFyRmlsZXNDbGljaywgdGhpcykpO1xuXG5cdFx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0XHQvLyBTZW5kIGluaXRpYWxpemF0aW9uIHJlcXVlc3Rcblx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX0lOSVQpO1xuXHR9XG5cblx0ZGVzdHJveSgpXG5cdHtcblx0XHQvLyBDYWxsIHN1cGVyIG1ldGhvZFxuXHRcdHN1cGVyLmRlc3Ryb3koKTtcblxuXHRcdCQoJyNleG0tcmV0cnlCdCcpLm9mZignY2xpY2snKTtcblx0XHQkKCcjZXhtLXJlZnJlc2hCdCcpLm9mZignY2xpY2snKTtcblxuXHRcdCQoJyNleG0tZmlsZUxpc3QnKS5vZmYoJ2NsaWNrJyk7XG5cblx0XHR0aGlzLl9hZGRGb2xkZXJNb2RhbC5vZmYoJ2hpZGRlbi5icy5tb2RhbCcpO1xuXHRcdHRoaXMuX2FkZEZvbGRlck1vZGFsLm1vZGFsKCdkaXNwb3NlJyk7XG5cdFx0JCgnI2V4bS1hZGRGb2xkZXJCdCcpLm9mZignY2xpY2snKTtcblxuXHRcdHRoaXMuX3VwbG9hZEZpbGVzTW9kYWwubW9kYWwoJ2Rpc3Bvc2UnKTtcblx0XHQkKCcjZXhtLWNsZWFyRmlsZXNCdCcpLm9mZignY2xpY2snKTtcblx0fVxuXG5cdG9uRXh0ZW5zaW9uQ29tbWFuZChjb21tYW5kLCBkYXRhKVxuXHR7XG5cdFx0Ly8gTW9kdWxlIGNhbiBiZSBlbmFibGVkIChubyBsb2NraW5nIGZpbGUgZXhpc3RzKVxuXHRcdGlmIChjb21tYW5kID09IHRoaXMuUkVTUF9JTklUKVxuXHRcdHtcblx0XHRcdC8vIFJldHJpZXZlIGZpbGUgc2VwYXJhdG9yXG5cdFx0XHR0aGlzLl9maWxlU2VwYXJhdG9yID0gZGF0YS5nZXRVdGZTdHJpbmcoJ3NlcCcpO1xuXG5cdFx0XHQvLyBSZXRyaWV2ZSBFeHRlbnNpb25zJyBfX2xpYl9fIGZvbGRlciBuYW1lXG5cdFx0XHRjb25zdCBsaWJGb2xkZXIgPSBkYXRhLmdldFV0ZlN0cmluZygnbGliJyk7XG5cblx0XHRcdC8vIENyZWF0ZSBmaWxlIGRhdGEgc291cmNlIG1hbmFnZXJcblx0XHRcdHRoaXMuX2ZpbGVNYW5hZ2VyID0gbmV3IEZpbGVEYXRhU291cmNlTWFuYWdlcihsaWJGb2xkZXIsIFtsaWJGb2xkZXJdLCB0aGlzLl9maWxlU2VwYXJhdG9yKTtcblxuXHRcdFx0Ly8gUmV0cmlldmUgbW9kdWxlIGlkIHNlbnQgYnkgdGhlIHNlcnZlciAocmVxdWlyZWQgYmVjYXVzZSBtdWx0aXBsZSBtb2R1bGVzIHVzZSBmaWxlIHVwbG9hZGluZyBzZXJ2aWNlKVxuXHRcdFx0Y29uc3QgdXBsb2FkTW9kdWxlSWQgPSBkYXRhLmdldFV0ZlN0cmluZygnbW9kSWQnKTtcblxuXHRcdFx0Ly8gU2V0IGZpbGUgdXBsb2FkaW5nIHRhcmdldCBjb25maWd1cmF0aW9uXG5cdFx0XHR0aGlzLl91cGxvYWRUYXJnZXRDb25maWcgPSB7XG5cdFx0XHRcdHNlc3Npb25Ub2tlbjogdGhpcy5zbWFydEZveC5zZXNzaW9uVG9rZW4sXG5cdFx0XHRcdGhvc3Q6IHRoaXMuc21hcnRGb3guY29uZmlnLmhvc3QsXG5cdFx0XHRcdHBvcnQ6IHRoaXMuc21hcnRGb3guY29uZmlnLnBvcnQsXG5cdFx0XHRcdG1vZHVsZUlkOiB1cGxvYWRNb2R1bGVJZCxcblx0XHRcdFx0cHJvdG9jb2w6IHRoaXMuc21hcnRGb3guY29uZmlnLnVzZVNTTCA/ICdodHRwcycgOiAnaHR0cCdcblx0XHRcdH07XG5cblx0XHRcdC8vIFJlcXVlc3QgRXh0ZW5zaW9uIGZpbGVzIGRhdGEgdG8gc2VydmVyIGluc3RhbmNlXG5cdFx0XHR0aGlzLl9yZWZyZXNoRGF0YUxpc3QoKTtcblx0XHR9XG5cblx0XHQvKlxuXHRcdCAqIFRoaXMgcmVzcG9uc2UgaXMgcmV0dXJuZWQgaWYgdGhlIGZpbGUgVXBsb2Fkc0xvY2sudHh0IGV4aXN0cyBpbiB0aGUgL2NvbmZpZyBmb2xkZXIgb2YgdGhlIHNlcnZlci5cblx0XHQgKiBUaGlzIGlzIGFuIGFkZGl0aW9uYWwgc2VjdXJpdHkgbWVhc3VyZSB0byBhdm9pZCB1bndhbnRlZCBmaWxlcyB0byBiZSB1cGxvYWRlZCBieSBtYWxpY2l1cyB1c2VycyBhY2Nlc3NpbmcgdGhlIHNlcnZlclxuXHRcdCAqIHdpdGggdGhlIGRlZmF1bHQgY3JlZGVudGlhbHMsIGluIGNhc2UgdGhleSBoYXZlIG5vdCBiZWVuIGNoYW5nZWQgYnkgdGhlIGFkbWluaXN0cmF0b3IgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvbi5cblx0XHQgKiBUaGUgZmlsZSBtdXN0IGJlIHJlbW92ZWQgbWFudWFsbHkgYmVmb3JlIGFjY2Vzc2luZyB0aGUgRXh0ZW5zaW9uIE1hbmFnZXIgbW9kdWxlIGZvciB0aGUgZmlyc3QgdGltZVxuXHRcdCAqL1xuXHRcdGVsc2UgaWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX0xPQ0tFRClcblx0XHR7XG5cdFx0XHQvLyBTaG93IHdhcm5pbmdcblx0XHRcdHRoaXMuX3N3aXRjaFZpZXcoJ2V4bS1sb2NrZWQnKTtcblx0XHR9XG5cblx0XHQvLyBFeHRlbnNpb25zIGZvbGRlcnMgYW5kIGZpbGVzXG5cdFx0ZWxzZSBpZiAoY29tbWFuZCA9PSB0aGlzLlJFU1BfRVhURU5TSU9OUylcblx0XHR7XG5cdFx0XHQvLyBSZXRyaWV2ZSBFeHRlbnNpb24gZmlsZSBsaXN0XG5cdFx0XHRsZXQgZXh0ZW5zaW9uc09iaiA9IGRhdGEuZ2V0U0ZTT2JqZWN0KCdleHRlbnNpb25zJyk7XG5cblx0XHRcdC8vIEluaXRpYWxpemUgbWFuYWdlclxuXHRcdFx0dGhpcy5fZmlsZU1hbmFnZXIuaW5pdCgpO1xuXG5cdFx0XHQvLyBBZGQgbGlzdCB0byBtYW5hZ2VyXG5cdFx0XHR0aGlzLl9maWxlTWFuYWdlci5hZGRGaWxlKGV4dGVuc2lvbnNPYmopO1xuXG5cdFx0XHQvLyBTZXQgVHJlZUxpc3QgZGF0YSBzb3VyY2Vcblx0XHRcdHRoaXMuX2ZpbGVzTGlzdC5zZXREYXRhU291cmNlKHRoaXMuX2ZpbGVNYW5hZ2VyLmRhdGFTb3VyY2UpO1xuXG5cdFx0XHQvLyBFeHBhbmQgZmlyc3QgbGV2ZWxcblx0XHRcdHRoaXMuX2ZpbGVzTGlzdC5leHBhbmQoJCgnI2V4bS1maWxlTGlzdCB0Ym9keT50cjplcSgwKScpKTtcblxuXHRcdFx0Ly8gRW5hYmxlIGludGVyZmFjZVxuXHRcdFx0dGhpcy5fZW5hYmxlSW50ZXJmYWNlKHRydWUpO1xuXG5cdFx0XHQvLyBTaG93IG1vZHVsZSdzIG1haW4gdmlld1xuXHRcdFx0dGhpcy5fc3dpdGNoVmlldygnZXhtLW1haW4nKTtcblx0XHR9XG5cblx0XHQvLyBBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBtYW5hZ2luZyBleHRlbnNpb24gZmlsZXNcblx0XHRlbHNlIGlmIChjb21tYW5kID09IHRoaXMuUkVTUF9FUlJPUilcblx0XHR7XG5cdFx0XHQvLyBIaWRlIGFkZCBmb2xkZXIgbW9kYWxcblx0XHRcdHRoaXMuX2FkZEZvbGRlck1vZGFsLm1vZGFsKCdoaWRlJyk7XG5cblx0XHRcdC8vIFJlLWVuYWJsZSBpbnRlcmZhY2Vcblx0XHRcdHRoaXMuX2VuYWJsZUludGVyZmFjZSh0cnVlKTtcblxuXHRcdFx0Ly8gU2hvdyBhbiBhbGVydFxuXHRcdFx0dGhpcy5zaGVsbEN0cmwuc2hvd1NpbXBsZUFsZXJ0KGRhdGEuZ2V0VXRmU3RyaW5nKCdlcnJvcicpKTtcblx0XHR9XG5cblx0XHQvLyBFeHRlbnNpb24gZm9sZGVyIG9yIGZpbGUgYWRkZWRcblx0XHRlbHNlIGlmIChjb21tYW5kID09IHRoaXMuUkVTUF9GSUxFX0FEREVEKVxuXHRcdHtcblx0XHRcdC8vIEdldCBuYW1lIG9mIHRoZSB1c2VyIHdobyBhZGRlZCB0aGUgZmlsZS9mb2xkZXJcblx0XHRcdGNvbnN0IHJlcXVlc3RlciA9IGRhdGEuZ2V0VXRmU3RyaW5nKCd1c2VyJyk7XG5cblx0XHRcdC8vIEdldCB0aGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZmlsZS9mb2xkZXIgYmVpbmcgYWRkZWRcblx0XHRcdGNvbnN0IGZpbGVPYmogPSBkYXRhLmdldFNGU09iamVjdCgnZmlsZScpO1xuXG5cdFx0XHQvLyBHZXQgdGhlIHRhcmdldCBmb2xkZXIgd2hlcmUgdGhlIG5ldyBmaWxlL2ZvbGRlciBzaG91bGQgYmUgYWRkZWRcblx0XHRcdGNvbnN0IHBhcmVudFBhdGggPSBkYXRhLmdldFV0ZlN0cmluZygncGFyZW50Jyk7XG5cblx0XHRcdC8vIEdldCB0aGUgZmxhZyBub3RpZnlpbmcgdGhpcyB3YXMgYSBmaWxlIHVwbG9hZFxuXHRcdFx0Y29uc3QgaXNVcGxvYWQgPSBkYXRhLmdldEJvb2woJ2lzVXBsb2FkJyk7XG5cblx0XHRcdHRyeVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBBZGQvdXBkYXRlIGl0ZW0gb24gZGF0YSBzb3VyY2Vcblx0XHRcdFx0Y29uc3QgZmlsZVBhdGggPSB0aGlzLl9maWxlTWFuYWdlci5hZGRGaWxlVG9QYXJlbnQoZmlsZU9iaiwgcGFyZW50UGF0aCk7XG5cblx0XHRcdFx0Ly8gUmVmcmVzaCB2aWV3XG5cdFx0XHRcdHRoaXMuX2ZpbGVzTGlzdC5yZWZyZXNoKCk7XG5cblx0XHRcdFx0aWYgKHJlcXVlc3RlciA9PSB0aGlzLnNtYXJ0Rm94Lm15U2VsZi5uYW1lKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Ly8gRXhwYW5kIHBhcmVudFxuXHRcdFx0XHRcdHRoaXMuX2ZpbGVzTGlzdC5leHBhbmQoJChgI2V4bS1maWxlTGlzdCAuZmlsZS1jb250cm9sc1tkYXRhLWl0ZW0taWQ9XCIkeyQuZXNjYXBlU2VsZWN0b3IocGFyZW50UGF0aCl9XCJdYCkuY2xvc2VzdCgndHInKSk7XG5cblx0XHRcdFx0XHRpZiAoIWlzVXBsb2FkKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdC8vIEhpZGUgbW9kYWxcblx0XHRcdFx0XHRcdHRoaXMuX2FkZEZvbGRlck1vZGFsLm1vZGFsKCdoaWRlJyk7XG5cblx0XHRcdFx0XHRcdC8vIFNlbGVjdCB1cGxvYWQgZmlsZVxuXHRcdFx0XHRcdFx0dGhpcy5fZmlsZXNMaXN0LnNlbGVjdCgkKGAjZXhtLWZpbGVMaXN0IC5maWxlLWNvbnRyb2xzW2RhdGEtaXRlbS1pZD1cIiR7JC5lc2NhcGVTZWxlY3RvcihmaWxlUGF0aCl9XCJdYCkuY2xvc2VzdCgndHInKSk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gVXBkYXRlIHNlbGVjdGlvblxuXHRcdFx0XHRcdHRoaXMuX29uRmlsZVNlbGVjdGVkQ2hhbmdlKCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Ly8gRGlzcGxheSBub3RpZmljYXRpb25cblx0XHRcdFx0XHRpZiAoIWlzVXBsb2FkKVxuXHRcdFx0XHRcdFx0dGhpcy5zaGVsbEN0cmwuc2hvd05vdGlmaWNhdGlvbihgRm9sZGVyIGNyZWF0ZWRgLCBgQWRtaW5pc3RyYXRvciAke3JlcXVlc3Rlcn0gY3JlYXRlZCBmb2xkZXI6IDxzdHJvbmc+JHtmaWxlUGF0aH08L3N0cm9uZz5gKTtcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHR0aGlzLnNoZWxsQ3RybC5zaG93Tm90aWZpY2F0aW9uKGBGaWxlIHVwbG9hZGVkYCwgYEFkbWluaXN0cmF0b3IgJHtyZXF1ZXN0ZXJ9IHVwbG9hZGVkIGZpbGU6IDxzdHJvbmc+JHtmaWxlUGF0aH08L3N0cm9uZz5gKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Y2F0Y2ggKGUpXG5cdFx0XHR7XG5cdFx0XHRcdC8vIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uLi4gZGF0YSBzb3VyY2UgaXMgY29ycnVwdGVkP1xuXHRcdFx0XHRpZiAocmVxdWVzdGVyID09IHRoaXMuc21hcnRGb3gubXlTZWxmLm5hbWUpXG5cdFx0XHRcdFx0dGhpcy5zaGVsbEN0cmwuc2hvd1NpbXBsZUFsZXJ0KGUubWVzc2FnZSwgdHJ1ZSk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEVuYWJsZSBpbnRlcmZhY2Vcblx0XHRcdHRoaXMuX2VuYWJsZUludGVyZmFjZSh0cnVlKTtcblx0XHR9XG5cblx0XHQvLyBFeHRlbnNpb24gZmlsZXMgZGVsZXRlZFxuXHRcdGVsc2UgaWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX0ZJTEVTX0RFTEVURUQpXG5cdFx0e1xuXHRcdFx0Ly8gR2V0IG5hbWUgb2YgdGhlIHVzZXIgd2hvIGRlbGV0ZWQgdGhlIGZpbGUvc1xuXHRcdFx0Y29uc3QgcmVxdWVzdGVyID0gZGF0YS5nZXRVdGZTdHJpbmcoJ3VzZXInKTtcblxuXHRcdFx0Ly8gR2V0IHRoZSBsaXN0IG9mIGRlbGV0ZWQgZmlsZXNcblx0XHRcdGxldCBmaWxlcyA9IGRhdGEuZ2V0U0ZTQXJyYXkoJ2ZpbGVzJyk7XG5cblx0XHRcdGxldCBmaWxlc0FyciA9IFtdO1xuXG5cdFx0XHQvLyBVcGRhdGUgZGF0YSBzb3VyY2Vcblx0XHRcdGZvciAobGV0IGogPSAwOyBqIDwgZmlsZXMuc2l6ZSgpOyBqKyspXG5cdFx0XHR7XG5cdFx0XHRcdGxldCBwYXRoID0gZmlsZXMuZ2V0VXRmU3RyaW5nKGopO1xuXHRcdFx0XHRmaWxlc0Fyci5wdXNoKHBhdGgpO1xuXG5cdFx0XHRcdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0XHRcdFx0Ly8gUmVtb3ZlIGl0ZW0gZnJvbSBkYXRhIHNvdXJjZTsgcGFyZW50IGl0ZW0gaXMgcmV0dXJuZWRcblx0XHRcdFx0bGV0IHBhcmVudEl0ZW0gPSB0aGlzLl9maWxlTWFuYWdlci5yZW1vdmVGaWxlKHBhdGgpO1xuXG5cdFx0XHRcdC8vIENvbGxhcHNlIHBhcmVudCBpZiB0aGUgbGFzdCBvZiBpdHMgY2hpbGRyZW4gd2FzIGRlbGV0ZWRcblx0XHRcdFx0aWYgKHBhcmVudEl0ZW0gJiYgIXBhcmVudEl0ZW0uaGFzQ2hpbGRyZW4pXG5cdFx0XHRcdFx0dGhpcy5fZmlsZXNMaXN0LmNvbGxhcHNlKCQoYCNleG0tZmlsZUxpc3QgLmZpbGUtY29udHJvbHNbZGF0YS1pdGVtLWlkPVwiJHskLmVzY2FwZVNlbGVjdG9yKHBhcmVudEl0ZW0uaWQpfVwiXWApLmNsb3Nlc3QoJ3RyJykpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAocmVxdWVzdGVyID09IHRoaXMuc21hcnRGb3gubXlTZWxmLm5hbWUpXG5cdFx0XHR7XG5cdFx0XHRcdC8vIERpc3BsYXkgbm90aWZpY2F0aW9uXG5cdFx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dOb3RpZmljYXRpb24oYCR7dGhpcy5fc2VsZWN0ZWRJdGVtLmlzRGlyID8gJ0ZvbGRlcicgOiAnRmlsZSd9IGRlbGV0ZWRgLCBgJHt0aGlzLl9zZWxlY3RlZEl0ZW0uaXNEaXIgPyAnRm9sZGVyJyA6ICdGaWxlJ30gJyR7dGhpcy5fc2VsZWN0ZWRJdGVtLm5hbWV9JyBkZWxldGVkIHN1Y2Nlc3NmdWxseWApO1xuXG5cdFx0XHRcdHRoaXMuX3NlbGVjdGVkSXRlbSA9IG51bGw7XG5cblx0XHRcdFx0dGhpcy5fZW5hYmxlSW50ZXJmYWNlKHRydWUpO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBEaXNwbGF5IG5vdGlmaWNhdGlvblxuXHRcdFx0XHR0aGlzLnNoZWxsQ3RybC5zaG93Tm90aWZpY2F0aW9uKGBGaWxlIGRlbGV0ZWRgLCBgQWRtaW5pc3RyYXRvciAke3JlcXVlc3Rlcn0gZGVsZXRlZCB0aGUgZm9sbG93aW5nIGZpbGUke2ZpbGVzQXJyLmxlbmd0aCA+IDEgPyAncycgOiAnJ306IDxzdHJvbmc+JHtmaWxlc0Fyci5qb2luKCc8YnI+ICcpfTwvc3Ryb25nPmApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZXNldCBzZWxlY3Rpb25cblx0XHRcdHRoaXMuX29uRmlsZVNlbGVjdGVkQ2hhbmdlKCk7XG5cdFx0fVxuXG5cdFx0Ly8gZWxzZSBpZiAoKVxuXHR9XG5cblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0Ly8gVUkgRVZFTlQgTElTVEVORVJTXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0X29uUmV0cnlDbGljaygpXG5cdHtcblx0XHR0aGlzLl9zd2l0Y2hWaWV3KCdleG0taW5pdCcpO1xuXG5cdFx0Ly8gUmUtc2VuZCBpbml0aWFsaXphdGlvbiByZXF1ZXN0XG5cdFx0dGhpcy5zZW5kRXh0ZW5zaW9uUmVxdWVzdCh0aGlzLlJFUV9JTklUKTtcblx0fVxuXG5cdF9vblJlZnJlc2hDbGljaygpXG5cdHtcblx0XHR0aGlzLl9maWxlc0xpc3QuY2xlYXJTZWxlY3Rpb24oKTtcblx0XHR0aGlzLl9yZWZyZXNoRGF0YUxpc3QoKTtcblx0fVxuXG5cdF9vbkZpbGVTZWxlY3RlZENoYW5nZSgpXG5cdHtcblx0XHQvLyBIaWRlIGNvbnRyb2wgYnV0dG9ucyBvbiBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbVxuXHRcdGlmICh0aGlzLl9zZWxlY3RlZEl0ZW0pXG5cdFx0XHQkKGAjZXhtLWZpbGVMaXN0IC5maWxlLWNvbnRyb2xzW2RhdGEtaXRlbS1pZD1cIiR7JC5lc2NhcGVTZWxlY3Rvcih0aGlzLl9zZWxlY3RlZEl0ZW0uaWQpfVwiXWApLmhpZGUoKTtcblxuXHRcdC8vIEdldCBzZWxlY3RlZCBpdGVtXG5cdFx0bGV0IHNlbGVjdGVkUm93cyA9IHRoaXMuX2ZpbGVzTGlzdC5zZWxlY3QoKTtcblxuXHRcdGlmIChzZWxlY3RlZFJvd3MubGVuZ3RoID4gMClcblx0XHR7XG5cdFx0XHQvLyBTYXZlIHJlZi4gdG8gc2VsZWN0ZWQgaXRlbVxuXHRcdFx0dGhpcy5fc2VsZWN0ZWRJdGVtID0gdGhpcy5fZmlsZXNMaXN0LmRhdGFJdGVtKHNlbGVjdGVkUm93c1swXSk7XG5cblx0XHRcdC8vIFNob3cgY29udHJvbCBidXR0b25zIG9uIG5ldyBzZWxlY3RlZCBpdGVtXG5cdFx0XHQkKGAjZXhtLWZpbGVMaXN0IC5maWxlLWNvbnRyb2xzW2RhdGEtaXRlbS1pZD1cIiR7JC5lc2NhcGVTZWxlY3Rvcih0aGlzLl9zZWxlY3RlZEl0ZW0uaWQpfVwiXWApLnNob3coKTtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5fc2VsZWN0ZWRJdGVtID0gbnVsbDtcblx0fVxuXG5cdF9zaG93QWRkRm9sZGVyTW9kYWxDbGljaygpXG5cdHtcblx0XHRpZiAodGhpcy5fc2VsZWN0ZWRJdGVtICYmIHRoaXMuX3NlbGVjdGVkSXRlbS5pc0Rpcilcblx0XHR7XG5cdFx0XHR0aGlzLl9hZGRGb2xkZXJNb2RhbC5tb2RhbCgnc2hvdycpO1xuXHRcdFx0JCgnI2V4bS1mb2xkZXJOYW1lSW4nKS5mb2N1cygpO1xuXHRcdH1cblx0fVxuXG5cdF9vbkFkZEZvbGRlckNsaWNrKClcblx0e1xuXHRcdC8vIFRoZSBwYXJlbnQgZm9sZGVyIGNvdWxkIGhhdmUgYmVlbiBkZWxldGVkIHdoaWxlIHVzZXIgaXMgc3RpbGwgdHlwaW5nIHRoZSBuYW1lIG9mIHRoZSBuZXcgY2hpbGQgZm9sZGVyXG5cdFx0aWYgKCF0aGlzLl9zZWxlY3RlZEl0ZW0pXG5cdFx0e1xuXHRcdFx0dGhpcy5fYWRkRm9sZGVyTW9kYWwubW9kYWwoJ2hpZGUnKTtcblx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dTaW1wbGVBbGVydCgnVW5hYmxlIHRvIGNyZWF0ZSBmb2xkZXI7IHRoZSBwYXJlbnQgZm9sZGVyIGRvZXNuXFwndCBleGlzdC4nKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5fYWRkRm9sZGVyVmFsaWRhdG9yLnZhbGlkYXRlKCkpXG5cdFx0e1xuXHRcdFx0Ly8gRGlzYWJsZSBtb2RhbCBpbnRlcmZhY2Vcblx0XHRcdHRoaXMuX2VuYWJsZUFkZEZvbGRlck1vZGFsKGZhbHNlKTtcblxuXHRcdFx0bGV0IGRhdGEgPSBuZXcgU0ZTMlguU0ZTT2JqZWN0KCk7XG5cdFx0XHRkYXRhLnB1dFV0ZlN0cmluZygnZm9sZGVyJywgdGhpcy5fc2VsZWN0ZWRJdGVtLmlkICsgdGhpcy5fZmlsZVNlcGFyYXRvciArICQoJyNleG0tZm9sZGVyTmFtZUluJykudmFsKCkpO1xuXG5cdFx0XHQvLyBTZW5kIHJlcXVlc3QgdG8gc2VydmVyXG5cdFx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX0NSRUFURV9GT0xERVIsIGRhdGEpO1xuXHRcdH1cblx0fVxuXG5cdF9vbkFkZEZvbGRlck1vZGFsSGlkZGVuKClcblx0e1xuXHRcdCQoJyNleG0tZm9sZGVyTmFtZUluJykudmFsKCcnKTtcblx0XHR0aGlzLl9yZXNldEFkZEZvbGRlclZhbGlkYXRpb24oKTtcblxuXHRcdC8vIEVuYWJsZSBtb2RhbCBpbnRlcmZhY2Vcblx0XHR0aGlzLl9lbmFibGVBZGRGb2xkZXJNb2RhbCh0cnVlKTtcblx0fVxuXG5cdF9zaG93VXBsb2FkRmlsZXNNb2RhbENsaWNrKClcblx0e1xuXHRcdGlmICh0aGlzLl9zZWxlY3RlZEl0ZW0pXG5cdFx0XHR0aGlzLl91cGxvYWRGaWxlc01vZGFsLm1vZGFsKCdzaG93Jyk7XG5cdH1cblxuXHRfb25DbGVhckZpbGVzQ2xpY2soKVxuXHR7XG5cdFx0dGhpcy5fdXBsb2FkZXIuY2xlYXJBbGxGaWxlcygpO1xuXHR9XG5cblx0X29uVXBsb2FkU3RhcnQoZSlcblx0e1xuXHRcdC8vIERpc2FibGUgY2xlYXIgYnV0dG9uXG5cdFx0JCgnI2V4bS1jbGVhckZpbGVzQnQnKS5hdHRyKCdkaXNhYmxlZCcsIHRydWUpO1xuXG5cdFx0Ly8gU2V0IGRlc3RpbmF0aW9uIHVybFxuXHRcdGNvbnN0IHVybCA9IHRoaXMuX3VwbG9hZFRhcmdldENvbmZpZy5wcm90b2NvbCArICc6Ly8nICsgdGhpcy5fdXBsb2FkVGFyZ2V0Q29uZmlnLmhvc3QgKyAnOicgKyB0aGlzLl91cGxvYWRUYXJnZXRDb25maWcucG9ydCArICcvQmx1ZUJveC9TRlMyWEZpbGVVcGxvYWQ/c2Vzc0hhc2hJZD0nICsgdGhpcy5fdXBsb2FkVGFyZ2V0Q29uZmlnLnNlc3Npb25Ub2tlbjtcblx0XHRcblx0XHRlLnNlbmRlci5vcHRpb25zLmFzeW5jLnNhdmVVcmwgPSB1cmw7XG5cblx0XHQvLyBTZXQgcGF5bG9hZFxuXHRcdGNvbnN0IHBhcmFtcyA9IG5ldyBGb3JtRGF0YSgpO1xuXHRcdHBhcmFtcy5hcHBlbmQoJ19fbW9kdWxlJywgdGhpcy5fdXBsb2FkVGFyZ2V0Q29uZmlnLm1vZHVsZUlkKTtcblx0XHRwYXJhbXMuYXBwZW5kKCdfX3RhcmdldCcsIHRoaXMuX3NlbGVjdGVkSXRlbS5pZCk7XG5cblx0XHRmb3IgKGxldCBmID0gMDsgZiA8IGUuZmlsZXMubGVuZ3RoOyBmKyspXG5cdFx0XHRwYXJhbXMuYXBwZW5kKCdmaWxlc1tdJywgZS5maWxlc1tmXS5yYXdGaWxlKTtcblxuXHRcdGUuZm9ybURhdGEgPSBwYXJhbXM7XG5cdH1cblxuXHRfb25VcGxvYWRFbmQoZSlcblx0e1xuXHRcdC8vIEVuYWJsZSBjbGVhciBidXR0b25cblx0XHQkKCcjZXhtLWNsZWFyRmlsZXNCdCcpLmF0dHIoJ2Rpc2FibGVkJywgZmFsc2UpO1xuXHR9XG5cblx0X29uRmlsZXNVcGxvYWRFbmQocmVzcG9uc2UpXG5cdHtcblx0XHQvLyBOb3RoaW5nIHRvIGRvOiB3ZSBoYXZlIHRvIHdhaXQgdGhlIHVwbG9hZCBwcm9jZXNzIGNvbXBsZXRpb24gdG8gYmUgc2lnbmFsZWQgYnkgdGhlIHNlcnZlciB0aHJvdWdoIHRoZSBkZWRpY2F0ZWQgRXh0ZW5zaW9uIHJlc3BvbnNlXG5cblx0XHQvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblx0XHQvLyBUT0RPIFNob3VsZCB3ZSBoYW5kbGUgdGhpcyByZXNwb25zZSBpbiBzb21lIHdheT8gRm9yIHNvbWUgdW5rbm93biByZWFzb24gd2UgYWx3YXlzIGdldCBvaz1mYWxzZSBhbmQgc3RhdHVzPTBcblx0XHQvLyBjb25zb2xlLmxvZyhyZXNwb25zZSlcblx0XHQvLyBjb25zb2xlLmxvZyhyZXNwb25zZS5vaylcblx0XHQvLyBjb25zb2xlLmxvZyhyZXNwb25zZS5zdGF0dXMpXG5cdH1cblxuXHRfb25SZW1vdmVGaWxlQ2xpY2soKVxuXHR7XG5cdFx0aWYgKHRoaXMuX3NlbGVjdGVkSXRlbSlcblx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dDb25maXJtV2FybmluZyhgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGUgc2VsZWN0ZWQgJHt0aGlzLl9zZWxlY3RlZEl0ZW0uaXNEaXIgPyAnZm9sZGVyJyA6ICdmaWxlJ30/PGJyPjxicj5QYXRoOiA8c3Ryb25nPiR7dGhpcy5fc2VsZWN0ZWRJdGVtLmlkfTwvc3Ryb25nPmAsICQucHJveHkodGhpcy5fb25SZW1vdmVGaWxlQ29uZmlybSwgdGhpcykpO1xuXHR9XG5cblx0X29uUmVtb3ZlRmlsZUNvbmZpcm0oKVxuXHR7XG5cdFx0Ly8gRGlzYWJsZSBpbnRlcmZhY2Vcblx0XHR0aGlzLl9lbmFibGVJbnRlcmZhY2UoZmFsc2UpO1xuXG5cdFx0Ly8gUmVxdWVzdCBFeHRlbnNpb24gZmlsZXMgcmVtb3ZhbFxuXHRcdC8vIE5PVEU6IGZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgQWRtaW5Ub29sLCB0aGUgZmlsZSB0byBiZSBkZWxldGVkIGlzIHNlbnRcblx0XHQvLyBpbiBhbiBhcnJheSBvZiBzdHJpbmdzLCBldmVuIGlmIHdlIGNhbid0IGRlbGV0ZSBtb3JlIHRoYW4gMSBmaWxlIGF0IG9uY2UgaW4gdGhpcyBBZG1pblRvb2xcblxuXHRcdGxldCBmaWxlcyA9IG5ldyBTRlMyWC5TRlNBcnJheSgpO1xuXHRcdGZpbGVzLmFkZFV0ZlN0cmluZyh0aGlzLl9zZWxlY3RlZEl0ZW0uaWQpO1xuXG5cdFx0bGV0IHBhcmFtcyA9IG5ldyBTRlMyWC5TRlNPYmplY3QoKTtcblx0XHRwYXJhbXMucHV0U0ZTQXJyYXkoJ2ZpbGVzJywgZmlsZXMpO1xuXG5cdFx0dGhpcy5zZW5kRXh0ZW5zaW9uUmVxdWVzdCh0aGlzLlJFUV9ERUxFVEVfRklMRVMsIHBhcmFtcyk7XG5cdH1cblxuXHRfb25SZWxvYWRFeHRDbGljaygpXG5cdHtcblx0XHRpZiAodGhpcy5fc2VsZWN0ZWRJdGVtKVxuXHRcdHtcblx0XHRcdGxldCBwYXRoQXJyID0gdGhpcy5fc2VsZWN0ZWRJdGVtLmlkLnNwbGl0KHRoaXMuX2ZpbGVTZXBhcmF0b3IpO1xuXG5cdFx0XHRpZiAocGF0aEFyci5sZW5ndGggPiAxKVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBSZXF1ZXN0IEV4dGVuc2lvbiByZWxvYWRcblx0XHRcdFx0Ly8gTk9URTogZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBBZG1pblRvb2wsIHRoZSBFeHRlbnNpb24gdG8gYmUgcmVsb2FkZWQgaXMgc2VudFxuXHRcdFx0XHQvLyBpbiBhbiBhcnJheSBvZiBzdHJpbmdzLCBldmVuIGlmIHdlIGNhbid0IHJlbG9hZCBtb3JlIHRoYW4gMSBFeHRlbnNpb24gYXQgb25jZSBpbiB0aGlzIEFkbWluVG9vbFxuXG5cdFx0XHRcdGxldCBleHRUb1JlbG9hZCA9IFtdO1xuXHRcdFx0XHRleHRUb1JlbG9hZC5wdXNoKHBhdGhBcnJbMV0pO1xuXG5cdFx0XHRcdGxldCBwYXJhbXMgPSBuZXcgU0ZTMlguU0ZTT2JqZWN0KCk7XG5cdFx0XHRcdHBhcmFtcy5wdXRVdGZTdHJpbmdBcnJheSgnZXh0ZW5zaW9ucycsIGV4dFRvUmVsb2FkKTtcblxuXHRcdFx0XHQvLyBTZW5kIHJlcXVlc3QgdG8gc2VydmVyXG5cdFx0XHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfUkVMT0FEX0VYVEVOU0lPTlMsIHBhcmFtcyk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0Ly8gUFJJVkFURSBNRVRIT0RTXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0X3N3aXRjaFZpZXcodmlld0lkKVxuXHR7XG5cdFx0ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4bS12aWV3c3RhY2snKS5zZWxlY3RlZEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh2aWV3SWQpO1xuXHR9XG5cblx0X2VuYWJsZUludGVyZmFjZShlbmFibGUpXG5cdHtcblx0XHQkKCcjZXhtLWZpbGVMaXN0JykuYXR0cignZGlzYWJsZWQnLCAhZW5hYmxlKTtcblx0XHQkKCcjZXhtLXJlZnJlc2hCdCcpLmF0dHIoJ2Rpc2FibGVkJywgIWVuYWJsZSk7XG5cdH1cblxuXHRfcmVmcmVzaERhdGFMaXN0KClcblx0e1xuXHRcdC8vIERpc2FibGUgaW50ZXJmYWNlXG5cdFx0dGhpcy5fZW5hYmxlSW50ZXJmYWNlKGZhbHNlKTtcblxuXHRcdC8vIFNlbmQgcmVxdWVzdCB0byBzZXJ2ZXJcblx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX0dFVF9FWFRFTlNJT05TKVxuXHR9XG5cblx0X3Jlc2V0QWRkRm9sZGVyVmFsaWRhdGlvbigpXG5cdHtcblx0XHR0aGlzLl9hZGRGb2xkZXJWYWxpZGF0b3IuaGlkZU1lc3NhZ2VzKCk7XG5cblx0XHQvLyBUaGUgbWV0aG9kIGFib3ZlIGRvZXNuJ3QgcmVtb3ZlIHRoZSBrLWludmFsaWQgY2xhc3NlcyBhbmQgYXJpYS1pbnZhbGlkPVwidHJ1ZVwiIGF0dHJpYnV0ZXMgZnJvbSBpbnB1dHNcblx0XHQvLyBMZXQncyBkbyBpdCBtYW51YWxseVxuXHRcdCQoJyNleG0tYWRkRm9sZGVyRm9ybSAuay1pbnZhbGlkJykucmVtb3ZlQ2xhc3MoJ2staW52YWxpZCcpO1xuXHRcdCQoJyNleG0tYWRkRm9sZGVyRm9ybSBbYXJpYS1pbnZhbGlkPVwidHJ1ZVwiXScpLnJlbW92ZUF0dHIoJ2FyaWEtaW52YWxpZCcpO1xuXHR9XG5cblx0X2VuYWJsZUFkZEZvbGRlck1vZGFsKGVuYWJsZSlcblx0e1xuXHRcdC8vIERpc2FibGUgbW9kYWwgY2xvc2UgYnV0dG9uc1xuXHRcdCQoJyNleG0tYWRkRm9sZGVyTW9kYWwgYnV0dG9uW2RhdGEtZGlzbWlzcz1cIm1vZGFsXCJdJykuYXR0cignZGlzYWJsZWQnLCAhZW5hYmxlKTtcblxuXHRcdC8vIERpc2FibGUgYWRkIGJ1dHRvblxuXHRcdCQoJyNleG0tYWRkRm9sZGVyQnQnKS5hdHRyKCdkaXNhYmxlZCcsICFlbmFibGUpO1xuXG5cdFx0Ly8gRGlzYWJsZSBmaWVsZHNldFxuXHRcdCQoJyNleG0tYWRkRm9sZGVyRm9ybScpLmF0dHIoJ2Rpc2FibGVkJywgIWVuYWJsZSk7XG5cdH1cblxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQvLyBQUklWQVRFIEdFVFRFUlNcblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDaEpBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QSIsInNvdXJjZVJvb3QiOiIifQ==