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
@@ -569,7 +569,7 @@ class BanManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModule"]
569
569
  // Add listener for ban panel hide
570
570
  $('#bnm-banModal').on('hidden.bs.modal', $.proxy(this._onBanModalHidden, this));
571
571
 
572
- // Initialize kendo validation on folder name form
572
+ // Initialize kendo validation on ban form
573
573
  this._banValidator = $('#bnm-banForm').kendoValidator({}).data('kendoValidator');
574
574
 
575
575
  // Add listener to Ban button click
@@ -639,7 +639,7 @@ class BanManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModule"]
639
639
  // Hide ban panel
640
640
  $('#bnm-banModal').modal('hide');
641
641
 
642
- // Remove room creation panel listener
642
+ // Remove ban panel listener
643
643
  $('#bnm-banModal').off('hidden.bs.modal');
644
644
  }
645
645
 
@@ -1018,4 +1018,4 @@ class BanManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModule"]
1018
1018
  /***/ })
1019
1019
 
1020
1020
  }]);
1021
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXRzL2pzL2NvcmUvbW9kdWxlcy9tb2R1bGUtMS5idW5kbGUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9kYXRhL2Jhbm5lZC11c2VyLmpzIiwid2VicGFjazovL2FwcGxpY2F0aW9uLy4vc3JjL21vZHVsZXMvYmFuLW1hbmFnZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgbW9tZW50IGZyb20gJ21vbWVudCc7XG5cbmV4cG9ydCBjbGFzcyBCYW5uZWRVc2VyXG57XG5cdGNvbnN0cnVjdG9yKG5hbWUsIHpvbmUpXG5cdHtcblx0XHR0aGlzLkRBVEVfRk9STUFUID0gJ0REL01NL1lZWVkgSEg6bW0nO1xuXG5cdCAgICB0aGlzLm5hbWUgPSBuYW1lO1xuXHRcdHRoaXMuem9uZSA9IHpvbmU7XG5cdH1cblxuXHRzdGF0aWMgZnJvbVNGU0FycmF5KHNmc2EpXG5cdHtcblx0XHRsZXQgYnUgPSBuZXcgQmFubmVkVXNlcihzZnNhLmdldFV0ZlN0cmluZygwKSwgc2ZzYS5nZXRVdGZTdHJpbmcoMSkpO1xuXG5cdFx0YnUubW9kZSA9IHNmc2EuZ2V0VXRmU3RyaW5nKDIpO1xuXHRcdGJ1LnJlYXNvbiA9IHNmc2EuZ2V0VXRmU3RyaW5nKDMpO1xuXHRcdGJ1LmFkbWluTmFtZSA9IHNmc2EuZ2V0VXRmU3RyaW5nKDQpO1xuXHRcdGJ1LmlwQWRkcmVzcyA9IHNmc2EuZ2V0VXRmU3RyaW5nKDUpO1xuXHRcdGJ1LmJhblRpbWVNaWxsaXMgPSBzZnNhLmdldExvbmcoNik7XG5cdFx0YnUuYmFuRHVyYXRpb25NaWxsaXMgPSBzZnNhLmdldExvbmcoNyk7XG5cdFx0YnUuZXhwaXJhdGlvbkRhdGUgPSBidS5fZ2V0RXhwaXJhdGlvbkRhdGUoKTtcblx0XHRidS5iYW5EYXRlID0gYnUuX2dldEJhbkRhdGUoKTtcblxuXHRcdHJldHVybiBidTtcblx0fVxuXG5cdF9nZXRFeHBpcmF0aW9uRGF0ZSgpXG5cdHtcblx0XHRjb25zdCBleHBpcmVPbiA9IG1vbWVudCh0aGlzLmJhblRpbWVNaWxsaXMgKyB0aGlzLmJhbkR1cmF0aW9uTWlsbGlzKTtcblxuXHRcdGlmIChleHBpcmVPbi55ZWFyKCkgPj0gbW9tZW50KCkueWVhcigpICsgMTAwKVxuXHRcdFx0cmV0dXJuICdOZXZlcic7XG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIGV4cGlyZU9uLmZvcm1hdCh0aGlzLkRBVEVfRk9STUFUKTtcblx0fVxuXG5cdF9nZXRCYW5EYXRlKClcblx0e1xuXHRcdHJldHVybiBtb21lbnQodGhpcy5iYW5UaW1lTWlsbGlzKS5mb3JtYXQodGhpcy5EQVRFX0ZPUk1BVCk7XG5cdH1cbn1cbiIsImltcG9ydCB7QmFzZU1vZHVsZX0gZnJvbSAnLi9iYXNlLW1vZHVsZSc7XG5pbXBvcnQge0Jhbm5lZFVzZXJ9IGZyb20gJy4uL2RhdGEvYmFubmVkLXVzZXInO1xuaW1wb3J0ICogYXMgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgQ2xpcGJvYXJkIGZyb20gJ2NsaXBib2FyZCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJhbk1hbmFnZXIgZXh0ZW5kcyBCYXNlTW9kdWxlXG57XG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHQgICAgc3VwZXIoJ2Jhbk1hbmFnZXInKTtcblxuXHRcdC8vIE91dGdvaW5nIHJlcXVlc3RzXG5cdFx0dGhpcy5SRVFfR0VUX1pPTkVTID0gJ2dldFpvbmVzJztcblx0XHR0aGlzLlJFUV9HRVRfVVNFUk5BTUVTID0gJ2dldFVOYW1lcyc7XG5cdFx0dGhpcy5SRVFfR0VUX0lQQUREUkVTU0VTID0gJ2dldElQcyc7XG5cdFx0dGhpcy5SRVFfUkVNT1ZFX1VTRVJOQU1FUyA9ICdyZW1vdmVVTmFtZXMnO1xuXHRcdHRoaXMuUkVRX1JFTU9WRV9JUEFERFJFU1NFUyA9ICdyZW1vdmVJUHMnO1xuXHRcdHRoaXMuUkVRX0JBTiA9ICdiYW4nO1xuXG5cdFx0Ly8gSW5jb21pbmcgcmVzcG9uc2VzXG5cdFx0dGhpcy5SRVNQX1pPTkVTID0gJ3pvbmVzJztcblx0XHR0aGlzLlJFU1BfVVNFUk5BTUVTID0gJ3VOYW1lcyc7XG5cdFx0dGhpcy5SRVNQX0lQQUREUkVTU0VTID0gJ0lQcyc7XG5cdH1cblxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQvLyBDT01NT04gTU9EVUxFIElOVEVSRkFDRSBNRVRIT0RTXG5cdC8vIFRoaXMgbWVtYmVycyBhcmUgdXNlZCBieSB0aGUgbWFpbiBjb250cm9sbGVyXG5cdC8vIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIG1vZHVsZSdzIGNvbnRyb2xsZXIuXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0aW5pdGlhbGl6ZShpZERhdGEsIHNoZWxsQ29udHJvbGxlcilcblx0e1xuXHRcdC8vIENhbGwgc3VwZXIgbWV0aG9kXG5cdFx0c3VwZXIuaW5pdGlhbGl6ZShpZERhdGEsIHNoZWxsQ29udHJvbGxlcik7XG5cblx0XHQvLyBJbml0aWFsaXplIHNjcm9sbGluZyB0YWJzXG5cdFx0JCgnI2JubS10YWJOYXZpZ2F0b3IgPiAjdGFicycpLnNjcm9sbGluZ1RhYnMoe1xuXHRcdFx0Ym9vdHN0cmFwVmVyc2lvbjogNCxcblx0XHRcdHNjcm9sbFRvVGFiRWRnZTogdHJ1ZSxcblx0XHRcdGVuYWJsZVN3aXBpbmc6IHRydWUsXG5cdFx0XHRkaXNhYmxlU2Nyb2xsQXJyb3dzT25GdWxseVNjcm9sbGVkOiB0cnVlLFxuXHRcdFx0Y3NzQ2xhc3NMZWZ0QXJyb3c6ICdmYSBmYS1jaGV2cm9uLWxlZnQnLFxuXHRcdFx0Y3NzQ2xhc3NSaWdodEFycm93OiAnZmEgZmEtY2hldnJvbi1yaWdodCdcblx0XHR9KTtcblxuXHRcdC8vIEluaXRpYWxpemUgem9uZSBmaWx0ZXIgZHJvcGRvd25cblx0XHR0aGlzLl96b25lc0REID0gJCgnI2JubS16b25lc0REJykua2VuZG9Ecm9wRG93bkxpc3Qoe1xuXHRcdFx0Y2hhbmdlOiAkLnByb3h5KHRoaXMuX29uWm9uZUNoYW5nZSwgdGhpcylcblx0XHR9KS5kYXRhKCdrZW5kb0Ryb3BEb3duTGlzdCcpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBiYW4gYnV0dG9uXG5cdFx0JCgnI2JubS1zaG93QmFuTW9kYWxCdCcpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25TaG93QmFuTW9kYWxDbGljaywgdGhpcykpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBiYW5uZWQgSVBzIGdyaWRcblx0XHR0aGlzLl9pcEdyaWQgPSAkKCcjYm5tLWlwR3JpZCcpLmtlbmRvR3JpZCh7XG5cdFx0XHRzY3JvbGxhYmxlOiB0cnVlLFxuICAgICAgICAgICAgc29ydGFibGU6IHRydWUsXG5cdFx0XHQvL3Jlc2l6YWJsZTogdHJ1ZSxcblx0XHRcdHNlbGVjdGFibGU6ICdtdWx0aXBsZScsXG5cdFx0XHRhbGxvd0NvcHk6IHRydWUsXG4gICAgICAgICAgICBjb2x1bW5zOlxuICAgICAgICAgICAgW1xuXHRcdFx0XHR7XG5cdCAgICAgICAgICAgICAgICBmaWVsZDogJ2lwQWRkcmVzcycsXG5cdCAgICAgICAgICAgICAgICB3aWR0aDogMTUwLFxuXHRcdFx0XHRcdHRpdGxlOiAnSVAgQWRkcmVzcycsXG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIHtcblx0ICAgICAgICAgICAgICAgIGZpZWxkOiAnYmFuRGF0ZScsXG5cdCAgICAgICAgICAgICAgICB3aWR0aDogMTIwLFxuXHQgICAgICAgICAgICAgICAgdGl0bGU6ICdEYXRlJyxcblx0XHRcdFx0XHRmb3JtYXQ6ICd7MDpkZC9NTS95eXl5IEhIOm1tfScsXG5cdFx0XHRcdFx0dHlwZTogJ2RhdGVUaW1lJ1xuXHQgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICB7XG5cdCAgICAgICAgICAgICAgICBmaWVsZDogJ2V4cGlyYXRpb25EYXRlJyxcblx0ICAgICAgICAgICAgICAgIHdpZHRoOiAxMjAsXG5cdCAgICAgICAgICAgICAgICB0aXRsZTogJ0V4cGlyYXRpb24nLFxuXHRcdFx0XHRcdGZvcm1hdDogJ3swOmRkL01NL3l5eXkgSEg6bW19Jyxcblx0XHRcdFx0XHR0eXBlOiAnZGF0ZVRpbWUnXG5cdCAgICAgICAgICAgIH0sXG5cdFx0XHRcdHtcblx0ICAgICAgICAgICAgICAgIGZpZWxkOiAncmVhc29uJyxcblx0ICAgICAgICAgICAgICAgIHdpZHRoOiAyNTAsXG5cdFx0XHRcdFx0dGl0bGU6ICdSZWFzb24nLFxuXHQgICAgICAgICAgICB9LFxuXHRcdFx0XHR7XG5cdCAgICAgICAgICAgICAgICBmaWVsZDogJ2FkbWluTmFtZScsXG5cdCAgICAgICAgICAgICAgICB3aWR0aDogMTUwLFxuXHRcdFx0XHRcdHRpdGxlOiAnQmFubmVkIEJ5Jyxcblx0ICAgICAgICAgICAgfSxcblx0XHRcdF0sXG5cdFx0XHRub1JlY29yZHM6IHtcblx0XHRcdFx0dGVtcGxhdGU6ICdObyBiYW5uZWQgSVAgYWRkcmVzc2VzLidcblx0XHRcdH0sXG5cdFx0XHRjaGFuZ2U6ICQucHJveHkodGhpcy5fb25JcEdyaWRTZWxlY3Rpb25DaGFuZ2UsIHRoaXMpLFxuXHRcdFx0ZGF0YVNvdXJjZTogW11cbiAgICAgICAgfSkuZGF0YSgna2VuZG9HcmlkJyk7XG5cblx0XHQvLyBJbml0aWFsaXplIGJhbm5lZCB1c2VybmFtZXMgZ3JpZFxuXHRcdHRoaXMuX25hbWVzR3JpZCA9ICQoJyNibm0tbmFtZXNHcmlkJykua2VuZG9HcmlkKHtcblx0XHRcdHNjcm9sbGFibGU6IHRydWUsXG4gICAgICAgICAgICBzb3J0YWJsZTogdHJ1ZSxcblx0XHRcdC8vcmVzaXphYmxlOiB0cnVlLFxuXHRcdFx0c2VsZWN0YWJsZTogJ211bHRpcGxlJyxcblx0XHRcdGFsbG93Q29weTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbHVtbnM6XG4gICAgICAgICAgICBbXG5cdFx0XHRcdHtcblx0ICAgICAgICAgICAgICAgIGZpZWxkOiAnbmFtZScsXG5cdCAgICAgICAgICAgICAgICB3aWR0aDogMTUwLFxuXHRcdFx0XHRcdHRpdGxlOiAnVXNlcm5hbWUnLFxuXHQgICAgICAgICAgICB9LFxuXHRcdFx0XHR7XG5cdCAgICAgICAgICAgICAgICBmaWVsZDogJ2JhbkRhdGUnLFxuXHQgICAgICAgICAgICAgICAgd2lkdGg6IDEyMCxcblx0ICAgICAgICAgICAgICAgIHRpdGxlOiAnRGF0ZScsXG5cdFx0XHRcdFx0Zm9ybWF0OiAnezA6ZGQvTU0veXl5eSBISDptbX0nLFxuXHRcdFx0XHRcdHR5cGU6ICdkYXRlVGltZSdcblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAge1xuXHQgICAgICAgICAgICAgICAgZmllbGQ6ICdleHBpcmF0aW9uRGF0ZScsXG5cdCAgICAgICAgICAgICAgICB3aWR0aDogMTIwLFxuXHQgICAgICAgICAgICAgICAgdGl0bGU6ICdFeHBpcmF0aW9uJyxcblx0XHRcdFx0XHRmb3JtYXQ6ICd7MDpkZC9NTS95eXl5IEhIOm1tfScsXG5cdFx0XHRcdFx0dHlwZTogJ2RhdGVUaW1lJ1xuXHQgICAgICAgICAgICB9LFxuXHRcdFx0XHR7XG5cdCAgICAgICAgICAgICAgICBmaWVsZDogJ3JlYXNvbicsXG5cdCAgICAgICAgICAgICAgICB3aWR0aDogMjUwLFxuXHRcdFx0XHRcdHRpdGxlOiAnUmVhc29uJyxcblx0ICAgICAgICAgICAgfSxcblx0XHRcdFx0e1xuXHQgICAgICAgICAgICAgICAgZmllbGQ6ICdhZG1pbk5hbWUnLFxuXHQgICAgICAgICAgICAgICAgd2lkdGg6IDE1MCxcblx0XHRcdFx0XHR0aXRsZTogJ0Jhbm5lZCBCeScsXG5cdCAgICAgICAgICAgIH0sXG5cdFx0XHRdLFxuXHRcdFx0bm9SZWNvcmRzOiB7XG5cdFx0XHRcdHRlbXBsYXRlOiAnTm8gYmFubmVkIHVzZXJuYW1lcy4nXG5cdFx0XHR9LFxuXHRcdFx0Y2hhbmdlOiAkLnByb3h5KHRoaXMuX29uTmFtZXNHcmlkU2VsZWN0aW9uQ2hhbmdlLCB0aGlzKSxcblx0XHRcdGRhdGFTb3VyY2U6IFtdXG4gICAgICAgIH0pLmRhdGEoJ2tlbmRvR3JpZCcpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBjb250ZXh0IG1lbnVzXG5cdFx0JChcIiNibm0tbmFtZXNHcmlkQ29udGV4dE1lbnVcIikua2VuZG9Db250ZXh0TWVudSh7XG4gICAgICAgICAgICB0YXJnZXQ6ICcjYm5tLW5hbWVzR3JpZCcsXG4gICAgICAgICAgICBmaWx0ZXI6ICd0ZCcsXG4gICAgICAgICAgICBzZWxlY3Q6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNlbGwgPSBlLnRhcmdldDtcbiAgICAgICAgICAgICAgICB2YXIgcm93ID0gJChjZWxsKS5wYXJlbnQoKVswXTtcbiAgICAgICAgICAgICAgICB2YXIgZ3JpZCA9ICQoJyNibm0tbmFtZXNHcmlkJykuZGF0YSgna2VuZG9HcmlkJyk7XG4gICAgICAgICAgICAgICAgdmFyIGl0ZW1JZCA9IGUuaXRlbS5pZDtcblxuICAgICAgICAgICAgICAgIHZhciBjZWxsVGV4dCA9IGNlbGwuaW5uZXJUZXh0O1xuXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW1JZCA9PT0gJ2JubS1uYW1lc0dyaWRDb3B5VGV4dCcpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3IENsaXBib2FyZCgnI2JubS1uYW1lc0dyaWRDb3B5VGV4dCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IGZ1bmN0aW9uICh0cmlnZ2VyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNlbGxUZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuXHRcdCQoXCIjYm5tLWlwR3JpZENvbnRleHRNZW51XCIpLmtlbmRvQ29udGV4dE1lbnUoe1xuICAgICAgICAgICAgdGFyZ2V0OiAnI2JubS1pcEdyaWQnLFxuICAgICAgICAgICAgZmlsdGVyOiAndGQnLFxuICAgICAgICAgICAgc2VsZWN0OiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHZhciBjZWxsID0gZS50YXJnZXQ7XG4gICAgICAgICAgICAgICAgdmFyIHJvdyA9ICQoY2VsbCkucGFyZW50KClbMF07XG4gICAgICAgICAgICAgICAgdmFyIGdyaWQgPSAkKCcjYm5tLWlwR3JpZCcpLmRhdGEoJ2tlbmRvR3JpZCcpO1xuICAgICAgICAgICAgICAgIHZhciBpdGVtSWQgPSBlLml0ZW0uaWQ7XG5cbiAgICAgICAgICAgICAgICB2YXIgY2VsbFRleHQgPSBjZWxsLmlubmVyVGV4dDtcblxuICAgICAgICAgICAgICAgIGlmIChpdGVtSWQgPT09ICdibm0taXBHcmlkQ29weVRleHQnKSB7XG4gICAgICAgICAgICAgICAgICAgIG5ldyBDbGlwYm9hcmQoJyNibm0taXBHcmlkQ29weVRleHQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBmdW5jdGlvbiAodHJpZ2dlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjZWxsVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cblx0XHQvLyBJbml0aWFsaXplIHJlZnJlc2ggYW5kIHJlbW92ZSBidXR0b25zXG5cdFx0JCgnI2JubS1yZWZyZXNoTmFtZXNCdCcpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25SZWZyZXNoTmFtZXNDbGljaywgdGhpcykpO1xuXHRcdCQoJyNibm0tcmVtb3ZlTmFtZUJ0Jykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vblJlbW92ZU5hbWVzQ2xpY2ssIHRoaXMpKTtcblx0XHQkKCcjYm5tLXJlbW92ZUFsbE5hbWVzQnQnKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uUmVtb3ZlQWxsTmFtZXNDbGljaywgdGhpcykpO1xuXHRcdCQoJyNibm0tcmVmcmVzaElwQnQnKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uUmVmcmVzaElwQ2xpY2ssIHRoaXMpKTtcblx0XHQkKCcjYm5tLXJlbW92ZUlwQnQnKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uUmVtb3ZlSXBDbGljaywgdGhpcykpO1xuXHRcdCQoJyNibm0tcmVtb3ZlQWxsSXBCdCcpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25SZW1vdmVBbGxJcENsaWNrLCB0aGlzKSk7XG5cblx0XHQvLyBDb25maWd1cmUgYmFuIHBhbmVsXG5cdFx0JCgnI2JubS1iYW5Nb2RhbCcpLm1vZGFsKHtcblx0XHRcdGJhY2tkcm9wOiAnc3RhdGljJyxcblx0XHRcdGtleWJvYXJkOiBmYWxzZSxcblx0XHRcdHNob3c6IGZhbHNlLFxuXHRcdH0pO1xuXG5cdFx0Ly8gQWRkIGxpc3RlbmVyIGZvciBiYW4gcGFuZWwgaGlkZVxuXHRcdCQoJyNibm0tYmFuTW9kYWwnKS5vbignaGlkZGVuLmJzLm1vZGFsJywgJC5wcm94eSh0aGlzLl9vbkJhbk1vZGFsSGlkZGVuLCB0aGlzKSk7XG5cblx0XHQvLyBJbml0aWFsaXplIGtlbmRvIHZhbGlkYXRpb24gb24gZm9sZGVyIG5hbWUgZm9ybVxuXHRcdHRoaXMuX2JhblZhbGlkYXRvciA9ICQoJyNibm0tYmFuRm9ybScpLmtlbmRvVmFsaWRhdG9yKHt9KS5kYXRhKCdrZW5kb1ZhbGlkYXRvcicpO1xuXG5cdFx0Ly8gQWRkIGxpc3RlbmVyIHRvIEJhbiBidXR0b24gY2xpY2tcblx0XHQkKCcjYm5tLWJhbkJ0Jykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vbkJhbkNsaWNrLCB0aGlzKSk7XG5cblx0XHQvLyBJbml0IGJhbiBkZWxheSBudW1lcmljIHN0ZXBwZXJcblx0XHR0aGlzLl9iYW5EZWxheUluID0gJCgnI2JubS1tb2RhbERlbGF5TlMnKS5rZW5kb051bWVyaWNUZXh0Qm94KHtcblx0XHQgICAgbWluOiAwLFxuXHRcdCAgICBzdGVwOiAxLFxuXHRcdCAgICBmb3JtYXQ6ICcjJ1xuXHRcdH0pLmRhdGEoJ2tlbmRvTnVtZXJpY1RleHRCb3gnKTtcblxuXHRcdC8vIEluaXQgYmFuIGV4cGlyYXRpb24gZGF0ZSBwaWNrZXJcblx0XHR0aGlzLl9iYW5FeHBEYXRlSW4gPSAkKCcjYm5tLWV4cGlyYXRpb25EUCcpLmtlbmRvRGF0ZVBpY2tlcih7XG5cdFx0XHR2YWx1ZTogdGhpcy5fdG9tb3Jyb3csXG5cdFx0XHRtaW46IHRoaXMuX3RvbW9ycm93LFxuXHRcdFx0Zm9vdGVyOiBmYWxzZSxcblx0XHRcdGZvcm1hdDogJ2RkL01NL3l5eXknXG5cdFx0fSkuZGF0YSgna2VuZG9EYXRlUGlja2VyJyk7XG5cblx0XHQvLyBEaXNhYmxlIG1hbnVhbCBkYXRlIGlucHV0XG5cdFx0JCgnI2JubS1leHBpcmF0aW9uRFAnKS5hdHRyKCdyZWFkb25seScsJ3JlYWRvbmx5Jyk7XG5cblx0XHQvLyBJbml0IGJhbiBleHBpcmF0aW9uIGhvdXJzL21pbnV0ZXMgaW5wdXRzXG5cdFx0dGhpcy5fYmFuRXhwSG91ckluID0gJCgnI2JubS1tb2RhbEV4cEhvdXJzTlMnKS5rZW5kb051bWVyaWNUZXh0Qm94KHtcblx0XHQgICAgbWluOiAwLFxuXHRcdFx0bWF4OiA5OSxcblx0XHQgICAgc3RlcDogMSxcblx0XHQgICAgZm9ybWF0OiAnIydcblx0XHR9KS5kYXRhKCdrZW5kb051bWVyaWNUZXh0Qm94Jyk7XG5cblx0XHR0aGlzLl9iYW5FeHBNaW5JbiA9ICQoJyNibm0tbW9kYWxFeHBNaW5zTlMnKS5rZW5kb051bWVyaWNUZXh0Qm94KHtcblx0XHQgICAgbWluOiAwLFxuXHRcdFx0bWF4OiA1OSxcblx0XHQgICAgc3RlcDogMSxcblx0XHQgICAgZm9ybWF0OiAnIydcblx0XHR9KS5kYXRhKCdrZW5kb051bWVyaWNUZXh0Qm94Jyk7XG5cblx0XHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRcdC8vIExvYWQgem9uZXMgbGlzdFxuXHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfR0VUX1pPTkVTKTtcblxuXHRcdC8vIExvYWQgYmFubmVkIElQIGFkZHJlc3Nlc1xuXHRcdC8vIE5vdGU6IHdlIGRvbid0IGxvYWQgdGhlIGJhbm5lZCB1c2VybmFtZXMgYXV0b21hdGljYWxseSBiZWNhdXNlIGEgem9uZSBtdXN0IGJlIHNlbGVjdGVkXG5cdFx0dGhpcy5fZ2V0QmFubmVkSVBzKCk7XG5cdH1cblxuXHRkZXN0cm95KClcblx0e1xuXHRcdC8vIENhbGwgc3VwZXIgbWV0aG9kXG5cdFx0c3VwZXIuZGVzdHJveSgpO1xuXG5cdFx0Ly8gRGVzdHJveSBzY3JvbGxpbmcgdGFic1xuXHRcdCQoJyNibm0tdGFiTmF2aWdhdG9yICN0YWJzJykuc2Nyb2xsaW5nVGFicygnZGVzdHJveScpO1xuXG5cdFx0Ly8gUmVtb3ZlIGNsaWNrIGxpc3RlbmVyc1xuXHRcdCQoJyNibm0tc2hvd0Jhbk1vZGFsQnQnKS5vZmYoJ2NsaWNrJyk7XG5cdFx0JCgnI2JubS1yZWZyZXNoTmFtZXNCdCcpLm9mZignY2xpY2snKTtcblx0XHQkKCcjYm5tLXJlbW92ZU5hbWVCdCcpLm9mZignY2xpY2snKTtcblx0XHQkKCcjYm5tLXJlbW92ZUFsbE5hbWVzQnQnKS5vZmYoJ2NsaWNrJyk7XG5cdFx0JCgnI2JubS1yZWZyZXNoSXBCdCcpLm9mZignY2xpY2snKTtcblx0XHQkKCcjYm5tLXJlbW92ZUlwQnQnKS5vZmYoJ2NsaWNrJyk7XG5cdFx0JCgnI2JubS1yZW1vdmVBbGxJcEJ0Jykub2ZmKCdjbGljaycpO1xuXHRcdCQoJyNibm0tYmFuQnQnKS5vZmYoJ2NsaWNrJyk7XG5cblx0XHQvLyBIaWRlIGJhbiBwYW5lbFxuXHRcdCQoJyNibm0tYmFuTW9kYWwnKS5tb2RhbCgnaGlkZScpO1xuXG5cdFx0Ly8gUmVtb3ZlIHJvb20gY3JlYXRpb24gcGFuZWwgbGlzdGVuZXJcblx0XHQkKCcjYm5tLWJhbk1vZGFsJykub2ZmKCdoaWRkZW4uYnMubW9kYWwnKTtcblx0fVxuXG5cdG9uRXh0ZW5zaW9uQ29tbWFuZChjb21tYW5kLCBkYXRhKVxuXHR7XG5cdFx0Ly8gRGF0YSByZWNlaXZlZFxuXHRcdGlmIChjb21tYW5kID09IHRoaXMuUkVTUF9aT05FUylcblx0XHR7XG5cdFx0XHRsZXQgem9uZXMgPSBkYXRhLmdldFV0ZlN0cmluZ0FycmF5KCd6b25lcycpO1xuXG5cdFx0XHQvLyBJZiB3ZSBoYXZlIDEgem9uZSBvbmx5LCB3ZSB3aWxsIHNlbGVjdCBpdCBpbW1lZGlhdGVseVxuXHRcdFx0Y29uc3Qgc2VsZWN0Rmlyc3Rab25lID0gem9uZXMubGVuZ3RoID09IDE7XG5cblx0XHRcdC8vIFNvcnQgem9uZXMgbGlzdFxuXHRcdFx0em9uZXMuc29ydChmdW5jdGlvbiAoYSwgYikge1xuXHRcdFx0XHRyZXR1cm4gYS5sb2NhbGVDb21wYXJlKGIpO1xuXHRcdFx0fSk7XG5cblx0XHRcdC8vIEFkZCBcIm5vbmVcIiB6b25lXG5cdFx0XHR6b25lcy51bnNoaWZ0KCdbbm9uZV0nKTtcblxuXHRcdFx0Ly8gU2V0IHpvbmUgZHJvcGRvd24gZGF0YXNvdXJjZVxuXHRcdFx0dGhpcy5fem9uZXNERC5zZXREYXRhU291cmNlKHpvbmVzKTtcblxuXHRcdFx0aWYgKHNlbGVjdEZpcnN0Wm9uZSlcblx0XHRcdHtcblx0XHRcdFx0dGhpcy5fem9uZXNERC5zZWxlY3QoMSk7XG5cdFx0XHRcdHRoaXMuX2dldEJhbm5lZFVzZXJuYW1lcygpO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHR0aGlzLl96b25lc0RELnNlbGVjdCgwKTtcblx0XHR9XG5cblx0XHRlbHNlIGlmIChjb21tYW5kID09IHRoaXMuUkVTUF9VU0VSTkFNRVMpXG5cdFx0e1xuXHRcdFx0Ly8gU3Vic3RpdHV0ZSBncmlkJ3MgZGF0YSBzb3VyY2UsIHJldGFpbmluZyBjdXJyZW50IHNvcnRpbmdcblx0XHRcdGxldCBjdXJyU29ydCA9IHRoaXMuX25hbWVzR3JpZC5kYXRhU291cmNlLnNvcnQoKTtcblxuXHRcdFx0bGV0IGRzID0gbmV3IGtlbmRvLmRhdGEuRGF0YVNvdXJjZSh7XG5cdFx0XHRcdHNjaGVtYToge1xuXHRcdFx0XHRcdG1vZGVsOiB7XG5cdFx0XHRcdFx0XHRmaWVsZHM6IHtcblx0XHRcdFx0XHRcdFx0ZXhwaXJhdGlvbkRhdGU6IHtcblx0XHRcdFx0XHRcdFx0XHR0eXBlOiAnZGF0ZVRpbWUnLFxuXHRcdFx0XHRcdFx0XHRcdHBhcnNlOiBmdW5jdGlvbiAoZSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG1vbWVudChlLCAnREQvTU0vWVlZWSBISDptbScpLnRvRGF0ZSgpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0YmFuRGF0ZToge1xuXHRcdFx0XHRcdFx0XHRcdHR5cGU6ICdkYXRlVGltZScsXG5cdFx0XHRcdFx0XHRcdFx0cGFyc2U6IGZ1bmN0aW9uIChlKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gbW9tZW50KGUsICdERC9NTS9ZWVlZIEhIOm1tJykudG9EYXRlKCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRzb3J0OiBjdXJyU29ydCwgLy8gRklYTUUgRXhwZWN0ZWQgc29ydGluZyBkb2Vzbid0IHNlZW0gdG8gYmUgYXBwbGllZFxuXHRcdFx0XHRkYXRhOiB0aGlzLl9nZW5lcmF0ZUJhbm5lZEVudHJpZXMoZGF0YS5nZXRTRlNBcnJheSgndU5hbWVzJykpXG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gQXNzaWduIGRhdGEgc291cmNlIHRvIGdyaWRcblx0XHRcdHRoaXMuX25hbWVzR3JpZC5zZXREYXRhU291cmNlKGRzKTtcblxuXHRcdFx0Ly8gRW5hYmxlIHJlbW92ZSBhbGwgYnV0dG9uXG5cdFx0XHQkKCcjYm5tLXJlbW92ZUFsbE5hbWVzQnQnKS5hdHRyKCdkaXNhYmxlZCcsIGRzLnRvdGFsKCkgPT0gMClcblx0XHR9XG5cdFx0ZWxzZSBpZiAoY29tbWFuZCA9PSB0aGlzLlJFU1BfSVBBRERSRVNTRVMpXG5cdFx0e1xuXHRcdFx0Ly8gU3Vic3RpdHV0ZSBncmlkJ3MgZGF0YSBzb3VyY2UsIHJldGFpbmluZyBjdXJyZW50IHNvcnRpbmcgKEZJWClcblx0XHRcdGxldCBjdXJyU29ydCA9IHRoaXMuX2lwR3JpZC5kYXRhU291cmNlLnNvcnQoKTtcblxuXHRcdFx0bGV0IGRzID0gbmV3IGtlbmRvLmRhdGEuRGF0YVNvdXJjZSh7XG5cdFx0XHRcdHNjaGVtYToge1xuXHRcdFx0XHRcdG1vZGVsOiB7XG5cdFx0XHRcdFx0XHRmaWVsZHM6IHtcblx0XHRcdFx0XHRcdFx0ZXhwaXJhdGlvbkRhdGU6IHtcblx0XHRcdFx0XHRcdFx0XHR0eXBlOiAnZGF0ZVRpbWUnLFxuXHRcdFx0XHRcdFx0XHRcdHBhcnNlOiBmdW5jdGlvbiAoZSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG1vbWVudChlLCAnREQvTU0vWVlZWSBISDptbScpLnRvRGF0ZSgpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0YmFuRGF0ZToge1xuXHRcdFx0XHRcdFx0XHRcdHR5cGU6ICdkYXRlVGltZScsXG5cdFx0XHRcdFx0XHRcdFx0cGFyc2U6IGZ1bmN0aW9uIChlKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gbW9tZW50KGUsICdERC9NTS9ZWVlZIEhIOm1tJykudG9EYXRlKCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRzb3J0OiBjdXJyU29ydCwgLy8gRklYTUUgRXhwZWN0ZWQgc29ydGluZyBkb2Vzbid0IHNlZW0gdG8gYmUgYXBwbGllZFxuXHRcdFx0XHRkYXRhOiB0aGlzLl9nZW5lcmF0ZUJhbm5lZEVudHJpZXMoZGF0YS5nZXRTRlNBcnJheSgnSVBzJykpXG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gQXNzaWduIGRhdGEgc291cmNlIHRvIGdyaWRcblx0XHRcdHRoaXMuX2lwR3JpZC5zZXREYXRhU291cmNlKGRzKTtcblxuXHRcdFx0Ly8gRW5hYmxlIHJlbW92ZSBhbGwgYnV0dG9uXG5cdFx0XHQkKCcjYm5tLXJlbW92ZUFsbElwQnQnKS5hdHRyKCdkaXNhYmxlZCcsIGRzLnRvdGFsKCkgPT0gMClcblx0XHR9XG5cdH1cblxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQvLyBVSSBFVkVOVCBMSVNURU5FUlNcblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRfb25TaG93QmFuTW9kYWxDbGljaygpXG5cdHtcblx0XHQvLyBEaXNwbGF5IHpvbmUgbmFtZVxuXHRcdCQoJyNibm0tbW9kYWxab25lTGInKS50ZXh0KHRoaXMuX3pvbmVzREQudmFsdWUoKSlcblxuXHRcdC8vIERpc3BsYXkgYmFuIHBhbmVsXG5cdFx0JCgnI2JubS1iYW5Nb2RhbCcpLm1vZGFsKCdzaG93Jyk7XG5cblx0XHQvLyBGb2N1cyBuYW1lIGZpZWxkXG5cdFx0JCgnI2JubS1tb2RhbE5hbWVJbicpLmZvY3VzKCk7XG5cdH1cblxuXHRfb25CYW5Nb2RhbEhpZGRlbihlKVxuXHR7XG5cdFx0Ly8gUmVzZXQgdmFsaWRhdG9yXG5cdFx0dGhpcy5fYmFuVmFsaWRhdG9yLmhpZGVNZXNzYWdlcygpO1xuXG5cdFx0Ly8gVGhlIG1ldGhvZCBhYm92ZSBkb2Vzbid0IHJlbW92ZSB0aGUgay1pbnZhbGlkIGNsYXNzZXMgYW5kIGFyaWEtaW52YWxpZD1cInRydWVcIiBhdHRyaWJ1dGVzIGZyb20gaW5wdXRzXG5cdFx0Ly8gTGV0J3MgZG8gaXQgbWFudWFsbHlcblx0XHQkKCcjYm5tLWJhbkZvcm0gLmstaW52YWxpZCcpLnJlbW92ZUNsYXNzKCdrLWludmFsaWQnKTtcblx0XHQkKCcjYm5tLWJhbkZvcm0gW2FyaWEtaW52YWxpZD1cInRydWVcIl0nKS5yZW1vdmVBdHRyKCdhcmlhLWludmFsaWQnKTtcblxuXHRcdC8vIFJlc2V0IGJhbiBmb3JtXG5cdFx0JCgnI2JubS1tb2RhbE5hbWVJbicpLnZhbCgnJyk7XG5cdFx0JCgnI2JubS1tb2RhbFJlYXNvbkluJykudmFsKCcnKTtcblx0XHQkKCcjYm5tLW1vZGFsTWVzc2FnZUluJykudmFsKCcnKTtcblxuXHRcdHRoaXMuX2JhbkRlbGF5SW4udmFsdWUoNSk7XG5cblx0XHQkKCdpbnB1dFtuYW1lPVwiZXhwaXJhdGlvblwiXScpLnJlbW92ZUF0dHIoJ2NoZWNrZWQnKTtcblx0XHQkKCcjYm5tLWV4cGlyYXRpb25SQjAnKS5wcm9wKCdjaGVja2VkJywgdHJ1ZSk7XG5cblx0XHR0aGlzLl9iYW5FeHBIb3VySW4udmFsdWUoMSk7XG5cdFx0dGhpcy5fYmFuRXhwTWluSW4udmFsdWUoMCk7XG5cblx0XHR0aGlzLl9iYW5FeHBEYXRlSW4ubWluKHRoaXMuX3RvbW9ycm93KTtcblx0XHR0aGlzLl9iYW5FeHBEYXRlSW4udmFsdWUodGhpcy5fdG9tb3Jyb3cpO1xuXHR9XG5cblx0X29uQmFuQ2xpY2soKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2JhblZhbGlkYXRvci52YWxpZGF0ZSgpKVxuXHRcdHtcblx0XHRcdC8vIFJldHJpZXZlIGJhbiBkZXRhaWxzXG5cdFx0XHRsZXQgcGFyYW1zID0gbmV3IFNGUzJYLlNGU09iamVjdCgpO1xuXG5cdFx0XHRwYXJhbXMucHV0VXRmU3RyaW5nKCd6b25lJywgdGhpcy5fem9uZXNERC52YWx1ZSgpKTtcblx0XHRcdHBhcmFtcy5wdXRVdGZTdHJpbmcoJ25hbWUnLCAkKCcjYm5tLW1vZGFsTmFtZUluJykudmFsKCkpO1xuXHRcdFx0cGFyYW1zLnB1dFV0ZlN0cmluZygnbXNnJywgJCgnI2JubS1tb2RhbE1lc3NhZ2VJbicpLnZhbCgpKTtcblx0XHRcdHBhcmFtcy5wdXRJbnQoJ2RlbGF5JywgdGhpcy5fYmFuRGVsYXlJbi52YWx1ZSgpICE9IG51bGwgPyB0aGlzLl9iYW5EZWxheUluLnZhbHVlKCkgOiAwKTtcblx0XHRcdHBhcmFtcy5wdXRVdGZTdHJpbmcoJ3JlYXNvbicsICQoJyNibm0tbW9kYWxSZWFzb25JbicpLnZhbCgpKTtcblxuXHRcdFx0Y29uc3QgZXhwID0gJCgnaW5wdXRbbmFtZT1cImV4cGlyYXRpb25cIl06Y2hlY2tlZCcpLnZhbCgpO1xuXHRcdFx0bGV0IGR1cmF0aW9uID0gLTE7XG5cblx0XHRcdGlmIChleHAgPT0gJ2FmdGVyJylcblx0XHRcdHtcblx0XHRcdFx0Y29uc3QgaG91cnMgPSB0aGlzLl9iYW5FeHBIb3VySW4udmFsdWUoKSAhPSBudWxsID8gdGhpcy5fYmFuRXhwSG91ckluLnZhbHVlKCkgOiAwO1xuXHRcdFx0XHRjb25zdCBtaW51dGVzID0gdGhpcy5fYmFuRXhwTWluSW4udmFsdWUoKSAhPSBudWxsID8gdGhpcy5fYmFuRXhwTWluSW4udmFsdWUoKSA6IDA7XG5cblx0XHRcdFx0ZHVyYXRpb24gPSAoaG91cnMgKiA2MCkgKyBtaW51dGVzO1xuXG5cdFx0XHRcdGlmIChkdXJhdGlvbiA8PSAwKVxuXHRcdFx0XHRcdGR1cmF0aW9uID0gMTtcblx0XHRcdH1cblx0XHRcdGVsc2UgaWYgKGV4cCA9PSAnb24nKVxuXHRcdFx0e1xuXHRcdFx0XHRjb25zdCBvbkRhdGUgPSBtb21lbnQodGhpcy5fYmFuRXhwRGF0ZUluLnZhbHVlKCkpO1xuXHRcdFx0XHRjb25zdCBub3cgPSBtb21lbnQoKTtcblxuXHRcdFx0XHRkdXJhdGlvbiA9IG9uRGF0ZS5zdGFydE9mKCdkYXknKS5kaWZmKG5vdy5zdGFydE9mKCdtaW51dGUnKSwgJ21pbnV0ZXMnKTtcblxuXHRcdFx0XHRpZiAoZHVyYXRpb24gPD0gMClcblx0XHRcdFx0XHRkdXJhdGlvbiA9IDE7XG5cdFx0XHR9XG5cblx0XHRcdHBhcmFtcy5wdXRJbnQoJ2R1ck1pbnMnLCBkdXJhdGlvbik7XG5cblx0XHRcdC8vIFNlbmQgYmFuIHJlcXVlc3QgdG8gc2VydmVyXG5cdFx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX0JBTiwgcGFyYW1zKTtcblxuXHRcdFx0Ly8gUmVmcmVzaCBsaXN0XG5cdFx0XHR0aGlzLl9nZXRCYW5uZWRVc2VybmFtZXMoKTtcblxuXHRcdFx0Ly8gRm9jdXMgdXNlcm5hbWUgZmllbGRcblx0XHRcdCQoJyNibm0tbW9kYWxOYW1lSW4nKS5mb2N1cygpO1xuXHRcdFx0JCgnI2JubS1tb2RhbE5hbWVJbicpLnNlbGVjdCgpO1xuXHRcdH1cblx0fVxuXG5cdF9vblpvbmVDaGFuZ2UoKVxuXHR7XG5cdFx0JCgnI2JubS1uYW1lc0J1dHRvbnMnKS5hdHRyKCdkaXNhYmxlZCcsIHRoaXMuX3pvbmVzREQuc2VsZWN0KCkgPT0gMCk7XG5cdFx0JCgnI2JubS1zaG93QmFuTW9kYWxCdCcpLmF0dHIoJ2Rpc2FibGVkJywgdGhpcy5fem9uZXNERC5zZWxlY3QoKSA9PSAwKTtcblxuXHRcdHRoaXMuX2dldEJhbm5lZFVzZXJuYW1lcygpO1xuXHR9XG5cblx0X29uTmFtZXNHcmlkU2VsZWN0aW9uQ2hhbmdlKClcblx0e1xuXHRcdC8vIEVuYWJsZS9kaXNhYmxlIHJlbW92ZSBidXR0b25cblx0XHRjb25zdCBzZWxlY3RlZFJvd3MgPSB0aGlzLl9uYW1lc0dyaWQuc2VsZWN0KCk7XG5cdFx0JCgnI2JubS1yZW1vdmVOYW1lQnQnKS5hdHRyKCdkaXNhYmxlZCcsIHNlbGVjdGVkUm93cy5sZW5ndGggPT0gMCk7XG5cdH1cblxuXHRfb25JcEdyaWRTZWxlY3Rpb25DaGFuZ2UoKVxuXHR7XG5cdFx0Ly8gRW5hYmxlL2Rpc2FibGUgcmVtb3ZlIGJ1dHRvblxuXHRcdGNvbnN0IHNlbGVjdGVkUm93cyA9IHRoaXMuX2lwR3JpZC5zZWxlY3QoKTtcblx0XHQkKCcjYm5tLXJlbW92ZUlwQnQnKS5hdHRyKCdkaXNhYmxlZCcsIHNlbGVjdGVkUm93cy5sZW5ndGggPT0gMCk7XG5cdH1cblxuXHRfb25SZWZyZXNoTmFtZXNDbGljaygpXG5cdHtcblx0XHR0aGlzLl9nZXRCYW5uZWRVc2VybmFtZXMoKTtcblx0fVxuXG5cdF9vblJlbW92ZU5hbWVzQ2xpY2soKVxuXHR7XG5cdFx0dGhpcy5zaGVsbEN0cmwuc2hvd0NvbmZpcm1XYXJuaW5nKGBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gcmVtb3ZlIHRoZSBiYW5uaW5nIGZvciB0aGUgc2VsZWN0ZWQgdXNlcm5hbWUke3RoaXMuX2lwR3JpZC5zZWxlY3QoKS5sZW5ndGggPiAxID8gJ3MnIDogJyd9P2AsICQucHJveHkodGhpcy5fb25SZW1vdmVOYW1lc0NvbmZpcm0sIHRoaXMpKTtcblx0fVxuXG5cdF9vblJlbW92ZU5hbWVzQ29uZmlybSgpXG5cdHtcblx0XHRsZXQgc2VsZWN0ZWRSb3dzID0gdGhpcy5fbmFtZXNHcmlkLnNlbGVjdCgpO1xuXHRcdGxldCB1c2VybmFtZXMgPSBbXTtcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgc2VsZWN0ZWRSb3dzLmxlbmd0aDsgaSsrKVxuXHRcdHtcblx0XHRcdGxldCBkYXRhSXRlbSA9IHRoaXMuX25hbWVzR3JpZC5kYXRhSXRlbShzZWxlY3RlZFJvd3NbaV0pO1xuXHRcdFx0dXNlcm5hbWVzLnB1c2goZGF0YUl0ZW0ubmFtZSk7XG5cdFx0fVxuXG5cdFx0dGhpcy5fcmVxdWVzdEJhbm5lZFVzZXJzUmVtb3ZhbCh1c2VybmFtZXMsIHRoaXMuX3pvbmVzREQudmFsdWUoKSk7XG5cdH1cblxuXHRfb25SZW1vdmVBbGxOYW1lc0NsaWNrKClcblx0e1xuXHRcdHRoaXMuc2hlbGxDdHJsLnNob3dDb25maXJtV2FybmluZyhgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHJlbW92ZSBhbGwgYmFubmVkIHVzZXJuYW1lcz9gLCAkLnByb3h5KHRoaXMuX29uUmVtb3ZBbGxOYW1lc0NvbmZpcm0sIHRoaXMpKTtcblx0fVxuXG5cdF9vblJlbW92QWxsTmFtZXNDb25maXJtKClcblx0e1xuXHRcdHRoaXMuX3JlcXVlc3RCYW5uZWRVc2Vyc1JlbW92YWwobnVsbCwgdGhpcy5fem9uZXNERC52YWx1ZSgpKTtcblx0fVxuXG5cdF9vblJlZnJlc2hJcENsaWNrKClcblx0e1xuXHRcdHRoaXMuX2dldEJhbm5lZElQcygpO1xuXHR9XG5cblx0X29uUmVtb3ZlSXBDbGljaygpXG5cdHtcblx0XHR0aGlzLnNoZWxsQ3RybC5zaG93Q29uZmlybVdhcm5pbmcoYEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byByZW1vdmUgdGhlIGJhbm5pbmcgZm9yIHRoZSBzZWxlY3RlZCBJUCBhZGRyZXNzJHt0aGlzLl9pcEdyaWQuc2VsZWN0KCkubGVuZ3RoID4gMSA/ICdlcycgOiAnJ30/YCwgJC5wcm94eSh0aGlzLl9vblJlbW92ZUlwQ29uZmlybSwgdGhpcykpO1xuXHR9XG5cblx0X29uUmVtb3ZlSXBDb25maXJtKClcblx0e1xuXHRcdGxldCBzZWxlY3RlZFJvd3MgPSB0aGlzLl9pcEdyaWQuc2VsZWN0KCk7XG5cdFx0bGV0IGlwQWRkcmVzc2VzID0gW107XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHNlbGVjdGVkUm93cy5sZW5ndGg7IGkrKylcblx0XHR7XG5cdFx0XHRsZXQgZGF0YUl0ZW0gPSB0aGlzLl9pcEdyaWQuZGF0YUl0ZW0oc2VsZWN0ZWRSb3dzW2ldKTtcblx0XHRcdGlwQWRkcmVzc2VzLnB1c2goZGF0YUl0ZW0uaXBBZGRyZXNzKTtcblx0XHR9XG5cblx0XHR0aGlzLl9yZXF1ZXN0QmFubmVkSVBzUmVtb3ZhbChpcEFkZHJlc3Nlcyk7XG5cdH1cblxuXHRfb25SZW1vdmVBbGxJcENsaWNrKClcblx0e1xuXHRcdHRoaXMuc2hlbGxDdHJsLnNob3dDb25maXJtV2FybmluZyhgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHJlbW92ZSBhbGwgYmFubmVkIElQIGFkZHJlc3Nlcz9gLCAkLnByb3h5KHRoaXMuX29uUmVtb3ZBbGxJcENvbmZpcm0sIHRoaXMpKTtcblx0fVxuXG5cdF9vblJlbW92QWxsSXBDb25maXJtKClcblx0e1xuXHRcdHRoaXMuX3JlcXVlc3RCYW5uZWRJUHNSZW1vdmFsKG51bGwpO1xuXHR9XG5cblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0Ly8gUFJJVkFURSBNRVRIT0RTXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0X2dldEJhbm5lZElQcygpXG5cdHtcblx0XHQvLyBSZW1vdmUgc2VsZWN0aW9uXG5cdFx0dGhpcy5faXBHcmlkLmNsZWFyU2VsZWN0aW9uKCk7XG5cblx0XHQvLyBDbGVhciBiYW5uZWQgSVBzIHRhYmxlXG5cdFx0dGhpcy5faXBHcmlkLnNldERhdGFTb3VyY2UoW10pO1xuXG5cdFx0Ly8gU2VuZCByZXF1ZXN0IHRvIGV4dGVuc2lvblxuXHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfR0VUX0lQQUREUkVTU0VTKTtcblx0fVxuXG5cdF9nZXRCYW5uZWRVc2VybmFtZXMoKVxuXHR7XG5cdFx0Ly8gUmVtb3ZlIHNlbGVjdGlvblxuXHRcdHRoaXMuX25hbWVzR3JpZC5jbGVhclNlbGVjdGlvbigpO1xuXG5cdFx0Ly8gQ2xlYXIgYmFubmVkIElQcyB0YWJsZVxuXHRcdHRoaXMuX25hbWVzR3JpZC5zZXREYXRhU291cmNlKFtdKTtcblxuXHRcdGlmICh0aGlzLl96b25lc0RELnNlbGVjdCgpID4gMClcblx0XHR7XG5cdFx0XHQvLyBHZXQgem9uZSBJRFxuXHRcdFx0bGV0IHBhcmFtcyA9IG5ldyBTRlMyWC5TRlNPYmplY3QoKTtcblx0XHRcdHBhcmFtcy5wdXRVdGZTdHJpbmcoJ3pvbmUnLCB0aGlzLl96b25lc0RELnZhbHVlKCkpO1xuXG5cdFx0XHQvLyBTZW5kIHJlcXVlc3QgdG8gZXh0ZW5zaW9uXG5cdFx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX0dFVF9VU0VSTkFNRVMsIHBhcmFtcyk7XG5cdFx0fVxuXHR9XG5cblx0X2dlbmVyYXRlQmFubmVkRW50cmllcyhiYW5EYXRhKVxuXHR7XG5cdFx0bGV0IGJhbm5lZEVudHJpZXMgPSBbXTtcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYmFuRGF0YS5zaXplKCk7IGkrKylcblx0XHR7XG5cdFx0XHRjb25zdCBidSA9IEJhbm5lZFVzZXIuZnJvbVNGU0FycmF5KGJhbkRhdGEuZ2V0U0ZTQXJyYXkoaSkpO1xuXHRcdFx0YmFubmVkRW50cmllcy5wdXNoKGJ1KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gYmFubmVkRW50cmllcztcblx0fVxuXG5cdF9yZXF1ZXN0QmFubmVkVXNlcnNSZW1vdmFsKHVzZXJuYW1lcywgem9uZSlcblx0e1xuXHRcdC8vIElmIHRoZSB1c2VybmFtZXMgYXJyYXkgaXMgbnVsbCwgc2VydmVyIHdpbGwgcmVtb3ZlIGFsbCBiYW5uZWQgdXNlcm5hbWVzXG5cdFx0bGV0IHBhcmFtcyA9IG5ldyBTRlMyWC5TRlNPYmplY3QoKTtcblx0XHRwYXJhbXMucHV0VXRmU3RyaW5nKCd6b25lJywgem9uZSk7XG5cblx0XHRpZiAodXNlcm5hbWVzID09IG51bGwpXG5cdFx0XHRwYXJhbXMucHV0TnVsbCgndU5hbWVzJyk7XG5cdFx0ZWxzZVxuXHRcdFx0cGFyYW1zLnB1dFV0ZlN0cmluZ0FycmF5KCd1TmFtZXMnLCB1c2VybmFtZXMpO1xuXG5cdFx0dGhpcy5zZW5kRXh0ZW5zaW9uUmVxdWVzdCh0aGlzLlJFUV9SRU1PVkVfVVNFUk5BTUVTLCBwYXJhbXMpO1xuXHR9XG5cblx0X3JlcXVlc3RCYW5uZWRJUHNSZW1vdmFsKGlwQWRkcmVzc2VzKVxuXHR7XG5cdFx0Ly8gSWYgdGhlIHVzZXJuYW1lcyBhcnJheSBpcyBudWxsLCBzZXJ2ZXIgd2lsbCByZW1vdmUgYWxsIGJhbm5lZCB1c2VybmFtZXNcblx0XHRsZXQgcGFyYW1zID0gbmV3IFNGUzJYLlNGU09iamVjdCgpO1xuXG5cdFx0aWYgKGlwQWRkcmVzc2VzID09IG51bGwpXG5cdFx0XHRwYXJhbXMucHV0TnVsbCgnSVBzJyk7XG5cdFx0ZWxzZVxuXHRcdFx0cGFyYW1zLnB1dFV0ZlN0cmluZ0FycmF5KCdJUHMnLCBpcEFkZHJlc3Nlcyk7XG5cblx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX1JFTU9WRV9JUEFERFJFU1NFUywgcGFyYW1zKTtcblx0fVxuXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdC8vIFBSSVZBVEUgR0VUVEVSU1xuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdGdldCBfdG9tb3Jyb3coKVxuXHR7XG5cdFx0bGV0IHRvbW9ycm93ID0gbW9tZW50KCkuYWRkKDEsICdkJyk7XG5cdFx0cmV0dXJuIHRvbW9ycm93LnRvRGF0ZSgpO1xuXHR9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUMxQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBIiwic291cmNlUm9vdCI6IiJ9
1021
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXRzL2pzL2NvcmUvbW9kdWxlcy9tb2R1bGUtMS5idW5kbGUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9kYXRhL2Jhbm5lZC11c2VyLmpzIiwid2VicGFjazovL2FwcGxpY2F0aW9uLy4vc3JjL21vZHVsZXMvYmFuLW1hbmFnZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgbW9tZW50IGZyb20gJ21vbWVudCc7XG5cbmV4cG9ydCBjbGFzcyBCYW5uZWRVc2VyXG57XG5cdGNvbnN0cnVjdG9yKG5hbWUsIHpvbmUpXG5cdHtcblx0XHR0aGlzLkRBVEVfRk9STUFUID0gJ0REL01NL1lZWVkgSEg6bW0nO1xuXG5cdCAgICB0aGlzLm5hbWUgPSBuYW1lO1xuXHRcdHRoaXMuem9uZSA9IHpvbmU7XG5cdH1cblxuXHRzdGF0aWMgZnJvbVNGU0FycmF5KHNmc2EpXG5cdHtcblx0XHRsZXQgYnUgPSBuZXcgQmFubmVkVXNlcihzZnNhLmdldFV0ZlN0cmluZygwKSwgc2ZzYS5nZXRVdGZTdHJpbmcoMSkpO1xuXG5cdFx0YnUubW9kZSA9IHNmc2EuZ2V0VXRmU3RyaW5nKDIpO1xuXHRcdGJ1LnJlYXNvbiA9IHNmc2EuZ2V0VXRmU3RyaW5nKDMpO1xuXHRcdGJ1LmFkbWluTmFtZSA9IHNmc2EuZ2V0VXRmU3RyaW5nKDQpO1xuXHRcdGJ1LmlwQWRkcmVzcyA9IHNmc2EuZ2V0VXRmU3RyaW5nKDUpO1xuXHRcdGJ1LmJhblRpbWVNaWxsaXMgPSBzZnNhLmdldExvbmcoNik7XG5cdFx0YnUuYmFuRHVyYXRpb25NaWxsaXMgPSBzZnNhLmdldExvbmcoNyk7XG5cdFx0YnUuZXhwaXJhdGlvbkRhdGUgPSBidS5fZ2V0RXhwaXJhdGlvbkRhdGUoKTtcblx0XHRidS5iYW5EYXRlID0gYnUuX2dldEJhbkRhdGUoKTtcblxuXHRcdHJldHVybiBidTtcblx0fVxuXG5cdF9nZXRFeHBpcmF0aW9uRGF0ZSgpXG5cdHtcblx0XHRjb25zdCBleHBpcmVPbiA9IG1vbWVudCh0aGlzLmJhblRpbWVNaWxsaXMgKyB0aGlzLmJhbkR1cmF0aW9uTWlsbGlzKTtcblxuXHRcdGlmIChleHBpcmVPbi55ZWFyKCkgPj0gbW9tZW50KCkueWVhcigpICsgMTAwKVxuXHRcdFx0cmV0dXJuICdOZXZlcic7XG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIGV4cGlyZU9uLmZvcm1hdCh0aGlzLkRBVEVfRk9STUFUKTtcblx0fVxuXG5cdF9nZXRCYW5EYXRlKClcblx0e1xuXHRcdHJldHVybiBtb21lbnQodGhpcy5iYW5UaW1lTWlsbGlzKS5mb3JtYXQodGhpcy5EQVRFX0ZPUk1BVCk7XG5cdH1cbn1cbiIsImltcG9ydCB7QmFzZU1vZHVsZX0gZnJvbSAnLi9iYXNlLW1vZHVsZSc7XG5pbXBvcnQge0Jhbm5lZFVzZXJ9IGZyb20gJy4uL2RhdGEvYmFubmVkLXVzZXInO1xuaW1wb3J0ICogYXMgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgQ2xpcGJvYXJkIGZyb20gJ2NsaXBib2FyZCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJhbk1hbmFnZXIgZXh0ZW5kcyBCYXNlTW9kdWxlXG57XG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHQgICAgc3VwZXIoJ2Jhbk1hbmFnZXInKTtcblxuXHRcdC8vIE91dGdvaW5nIHJlcXVlc3RzXG5cdFx0dGhpcy5SRVFfR0VUX1pPTkVTID0gJ2dldFpvbmVzJztcblx0XHR0aGlzLlJFUV9HRVRfVVNFUk5BTUVTID0gJ2dldFVOYW1lcyc7XG5cdFx0dGhpcy5SRVFfR0VUX0lQQUREUkVTU0VTID0gJ2dldElQcyc7XG5cdFx0dGhpcy5SRVFfUkVNT1ZFX1VTRVJOQU1FUyA9ICdyZW1vdmVVTmFtZXMnO1xuXHRcdHRoaXMuUkVRX1JFTU9WRV9JUEFERFJFU1NFUyA9ICdyZW1vdmVJUHMnO1xuXHRcdHRoaXMuUkVRX0JBTiA9ICdiYW4nO1xuXG5cdFx0Ly8gSW5jb21pbmcgcmVzcG9uc2VzXG5cdFx0dGhpcy5SRVNQX1pPTkVTID0gJ3pvbmVzJztcblx0XHR0aGlzLlJFU1BfVVNFUk5BTUVTID0gJ3VOYW1lcyc7XG5cdFx0dGhpcy5SRVNQX0lQQUREUkVTU0VTID0gJ0lQcyc7XG5cdH1cblxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQvLyBDT01NT04gTU9EVUxFIElOVEVSRkFDRSBNRVRIT0RTXG5cdC8vIFRoaXMgbWVtYmVycyBhcmUgdXNlZCBieSB0aGUgbWFpbiBjb250cm9sbGVyXG5cdC8vIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIG1vZHVsZSdzIGNvbnRyb2xsZXIuXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0aW5pdGlhbGl6ZShpZERhdGEsIHNoZWxsQ29udHJvbGxlcilcblx0e1xuXHRcdC8vIENhbGwgc3VwZXIgbWV0aG9kXG5cdFx0c3VwZXIuaW5pdGlhbGl6ZShpZERhdGEsIHNoZWxsQ29udHJvbGxlcik7XG5cblx0XHQvLyBJbml0aWFsaXplIHNjcm9sbGluZyB0YWJzXG5cdFx0JCgnI2JubS10YWJOYXZpZ2F0b3IgPiAjdGFicycpLnNjcm9sbGluZ1RhYnMoe1xuXHRcdFx0Ym9vdHN0cmFwVmVyc2lvbjogNCxcblx0XHRcdHNjcm9sbFRvVGFiRWRnZTogdHJ1ZSxcblx0XHRcdGVuYWJsZVN3aXBpbmc6IHRydWUsXG5cdFx0XHRkaXNhYmxlU2Nyb2xsQXJyb3dzT25GdWxseVNjcm9sbGVkOiB0cnVlLFxuXHRcdFx0Y3NzQ2xhc3NMZWZ0QXJyb3c6ICdmYSBmYS1jaGV2cm9uLWxlZnQnLFxuXHRcdFx0Y3NzQ2xhc3NSaWdodEFycm93OiAnZmEgZmEtY2hldnJvbi1yaWdodCdcblx0XHR9KTtcblxuXHRcdC8vIEluaXRpYWxpemUgem9uZSBmaWx0ZXIgZHJvcGRvd25cblx0XHR0aGlzLl96b25lc0REID0gJCgnI2JubS16b25lc0REJykua2VuZG9Ecm9wRG93bkxpc3Qoe1xuXHRcdFx0Y2hhbmdlOiAkLnByb3h5KHRoaXMuX29uWm9uZUNoYW5nZSwgdGhpcylcblx0XHR9KS5kYXRhKCdrZW5kb0Ryb3BEb3duTGlzdCcpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBiYW4gYnV0dG9uXG5cdFx0JCgnI2JubS1zaG93QmFuTW9kYWxCdCcpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25TaG93QmFuTW9kYWxDbGljaywgdGhpcykpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBiYW5uZWQgSVBzIGdyaWRcblx0XHR0aGlzLl9pcEdyaWQgPSAkKCcjYm5tLWlwR3JpZCcpLmtlbmRvR3JpZCh7XG5cdFx0XHRzY3JvbGxhYmxlOiB0cnVlLFxuICAgICAgICAgICAgc29ydGFibGU6IHRydWUsXG5cdFx0XHQvL3Jlc2l6YWJsZTogdHJ1ZSxcblx0XHRcdHNlbGVjdGFibGU6ICdtdWx0aXBsZScsXG5cdFx0XHRhbGxvd0NvcHk6IHRydWUsXG4gICAgICAgICAgICBjb2x1bW5zOlxuICAgICAgICAgICAgW1xuXHRcdFx0XHR7XG5cdCAgICAgICAgICAgICAgICBmaWVsZDogJ2lwQWRkcmVzcycsXG5cdCAgICAgICAgICAgICAgICB3aWR0aDogMTUwLFxuXHRcdFx0XHRcdHRpdGxlOiAnSVAgQWRkcmVzcycsXG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIHtcblx0ICAgICAgICAgICAgICAgIGZpZWxkOiAnYmFuRGF0ZScsXG5cdCAgICAgICAgICAgICAgICB3aWR0aDogMTIwLFxuXHQgICAgICAgICAgICAgICAgdGl0bGU6ICdEYXRlJyxcblx0XHRcdFx0XHRmb3JtYXQ6ICd7MDpkZC9NTS95eXl5IEhIOm1tfScsXG5cdFx0XHRcdFx0dHlwZTogJ2RhdGVUaW1lJ1xuXHQgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICB7XG5cdCAgICAgICAgICAgICAgICBmaWVsZDogJ2V4cGlyYXRpb25EYXRlJyxcblx0ICAgICAgICAgICAgICAgIHdpZHRoOiAxMjAsXG5cdCAgICAgICAgICAgICAgICB0aXRsZTogJ0V4cGlyYXRpb24nLFxuXHRcdFx0XHRcdGZvcm1hdDogJ3swOmRkL01NL3l5eXkgSEg6bW19Jyxcblx0XHRcdFx0XHR0eXBlOiAnZGF0ZVRpbWUnXG5cdCAgICAgICAgICAgIH0sXG5cdFx0XHRcdHtcblx0ICAgICAgICAgICAgICAgIGZpZWxkOiAncmVhc29uJyxcblx0ICAgICAgICAgICAgICAgIHdpZHRoOiAyNTAsXG5cdFx0XHRcdFx0dGl0bGU6ICdSZWFzb24nLFxuXHQgICAgICAgICAgICB9LFxuXHRcdFx0XHR7XG5cdCAgICAgICAgICAgICAgICBmaWVsZDogJ2FkbWluTmFtZScsXG5cdCAgICAgICAgICAgICAgICB3aWR0aDogMTUwLFxuXHRcdFx0XHRcdHRpdGxlOiAnQmFubmVkIEJ5Jyxcblx0ICAgICAgICAgICAgfSxcblx0XHRcdF0sXG5cdFx0XHRub1JlY29yZHM6IHtcblx0XHRcdFx0dGVtcGxhdGU6ICdObyBiYW5uZWQgSVAgYWRkcmVzc2VzLidcblx0XHRcdH0sXG5cdFx0XHRjaGFuZ2U6ICQucHJveHkodGhpcy5fb25JcEdyaWRTZWxlY3Rpb25DaGFuZ2UsIHRoaXMpLFxuXHRcdFx0ZGF0YVNvdXJjZTogW11cbiAgICAgICAgfSkuZGF0YSgna2VuZG9HcmlkJyk7XG5cblx0XHQvLyBJbml0aWFsaXplIGJhbm5lZCB1c2VybmFtZXMgZ3JpZFxuXHRcdHRoaXMuX25hbWVzR3JpZCA9ICQoJyNibm0tbmFtZXNHcmlkJykua2VuZG9HcmlkKHtcblx0XHRcdHNjcm9sbGFibGU6IHRydWUsXG4gICAgICAgICAgICBzb3J0YWJsZTogdHJ1ZSxcblx0XHRcdC8vcmVzaXphYmxlOiB0cnVlLFxuXHRcdFx0c2VsZWN0YWJsZTogJ211bHRpcGxlJyxcblx0XHRcdGFsbG93Q29weTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbHVtbnM6XG4gICAgICAgICAgICBbXG5cdFx0XHRcdHtcblx0ICAgICAgICAgICAgICAgIGZpZWxkOiAnbmFtZScsXG5cdCAgICAgICAgICAgICAgICB3aWR0aDogMTUwLFxuXHRcdFx0XHRcdHRpdGxlOiAnVXNlcm5hbWUnLFxuXHQgICAgICAgICAgICB9LFxuXHRcdFx0XHR7XG5cdCAgICAgICAgICAgICAgICBmaWVsZDogJ2JhbkRhdGUnLFxuXHQgICAgICAgICAgICAgICAgd2lkdGg6IDEyMCxcblx0ICAgICAgICAgICAgICAgIHRpdGxlOiAnRGF0ZScsXG5cdFx0XHRcdFx0Zm9ybWF0OiAnezA6ZGQvTU0veXl5eSBISDptbX0nLFxuXHRcdFx0XHRcdHR5cGU6ICdkYXRlVGltZSdcblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAge1xuXHQgICAgICAgICAgICAgICAgZmllbGQ6ICdleHBpcmF0aW9uRGF0ZScsXG5cdCAgICAgICAgICAgICAgICB3aWR0aDogMTIwLFxuXHQgICAgICAgICAgICAgICAgdGl0bGU6ICdFeHBpcmF0aW9uJyxcblx0XHRcdFx0XHRmb3JtYXQ6ICd7MDpkZC9NTS95eXl5IEhIOm1tfScsXG5cdFx0XHRcdFx0dHlwZTogJ2RhdGVUaW1lJ1xuXHQgICAgICAgICAgICB9LFxuXHRcdFx0XHR7XG5cdCAgICAgICAgICAgICAgICBmaWVsZDogJ3JlYXNvbicsXG5cdCAgICAgICAgICAgICAgICB3aWR0aDogMjUwLFxuXHRcdFx0XHRcdHRpdGxlOiAnUmVhc29uJyxcblx0ICAgICAgICAgICAgfSxcblx0XHRcdFx0e1xuXHQgICAgICAgICAgICAgICAgZmllbGQ6ICdhZG1pbk5hbWUnLFxuXHQgICAgICAgICAgICAgICAgd2lkdGg6IDE1MCxcblx0XHRcdFx0XHR0aXRsZTogJ0Jhbm5lZCBCeScsXG5cdCAgICAgICAgICAgIH0sXG5cdFx0XHRdLFxuXHRcdFx0bm9SZWNvcmRzOiB7XG5cdFx0XHRcdHRlbXBsYXRlOiAnTm8gYmFubmVkIHVzZXJuYW1lcy4nXG5cdFx0XHR9LFxuXHRcdFx0Y2hhbmdlOiAkLnByb3h5KHRoaXMuX29uTmFtZXNHcmlkU2VsZWN0aW9uQ2hhbmdlLCB0aGlzKSxcblx0XHRcdGRhdGFTb3VyY2U6IFtdXG4gICAgICAgIH0pLmRhdGEoJ2tlbmRvR3JpZCcpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBjb250ZXh0IG1lbnVzXG5cdFx0JChcIiNibm0tbmFtZXNHcmlkQ29udGV4dE1lbnVcIikua2VuZG9Db250ZXh0TWVudSh7XG4gICAgICAgICAgICB0YXJnZXQ6ICcjYm5tLW5hbWVzR3JpZCcsXG4gICAgICAgICAgICBmaWx0ZXI6ICd0ZCcsXG4gICAgICAgICAgICBzZWxlY3Q6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNlbGwgPSBlLnRhcmdldDtcbiAgICAgICAgICAgICAgICB2YXIgcm93ID0gJChjZWxsKS5wYXJlbnQoKVswXTtcbiAgICAgICAgICAgICAgICB2YXIgZ3JpZCA9ICQoJyNibm0tbmFtZXNHcmlkJykuZGF0YSgna2VuZG9HcmlkJyk7XG4gICAgICAgICAgICAgICAgdmFyIGl0ZW1JZCA9IGUuaXRlbS5pZDtcblxuICAgICAgICAgICAgICAgIHZhciBjZWxsVGV4dCA9IGNlbGwuaW5uZXJUZXh0O1xuXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW1JZCA9PT0gJ2JubS1uYW1lc0dyaWRDb3B5VGV4dCcpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3IENsaXBib2FyZCgnI2JubS1uYW1lc0dyaWRDb3B5VGV4dCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IGZ1bmN0aW9uICh0cmlnZ2VyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNlbGxUZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuXHRcdCQoXCIjYm5tLWlwR3JpZENvbnRleHRNZW51XCIpLmtlbmRvQ29udGV4dE1lbnUoe1xuICAgICAgICAgICAgdGFyZ2V0OiAnI2JubS1pcEdyaWQnLFxuICAgICAgICAgICAgZmlsdGVyOiAndGQnLFxuICAgICAgICAgICAgc2VsZWN0OiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHZhciBjZWxsID0gZS50YXJnZXQ7XG4gICAgICAgICAgICAgICAgdmFyIHJvdyA9ICQoY2VsbCkucGFyZW50KClbMF07XG4gICAgICAgICAgICAgICAgdmFyIGdyaWQgPSAkKCcjYm5tLWlwR3JpZCcpLmRhdGEoJ2tlbmRvR3JpZCcpO1xuICAgICAgICAgICAgICAgIHZhciBpdGVtSWQgPSBlLml0ZW0uaWQ7XG5cbiAgICAgICAgICAgICAgICB2YXIgY2VsbFRleHQgPSBjZWxsLmlubmVyVGV4dDtcblxuICAgICAgICAgICAgICAgIGlmIChpdGVtSWQgPT09ICdibm0taXBHcmlkQ29weVRleHQnKSB7XG4gICAgICAgICAgICAgICAgICAgIG5ldyBDbGlwYm9hcmQoJyNibm0taXBHcmlkQ29weVRleHQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBmdW5jdGlvbiAodHJpZ2dlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjZWxsVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cblx0XHQvLyBJbml0aWFsaXplIHJlZnJlc2ggYW5kIHJlbW92ZSBidXR0b25zXG5cdFx0JCgnI2JubS1yZWZyZXNoTmFtZXNCdCcpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25SZWZyZXNoTmFtZXNDbGljaywgdGhpcykpO1xuXHRcdCQoJyNibm0tcmVtb3ZlTmFtZUJ0Jykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vblJlbW92ZU5hbWVzQ2xpY2ssIHRoaXMpKTtcblx0XHQkKCcjYm5tLXJlbW92ZUFsbE5hbWVzQnQnKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uUmVtb3ZlQWxsTmFtZXNDbGljaywgdGhpcykpO1xuXHRcdCQoJyNibm0tcmVmcmVzaElwQnQnKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uUmVmcmVzaElwQ2xpY2ssIHRoaXMpKTtcblx0XHQkKCcjYm5tLXJlbW92ZUlwQnQnKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uUmVtb3ZlSXBDbGljaywgdGhpcykpO1xuXHRcdCQoJyNibm0tcmVtb3ZlQWxsSXBCdCcpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25SZW1vdmVBbGxJcENsaWNrLCB0aGlzKSk7XG5cblx0XHQvLyBDb25maWd1cmUgYmFuIHBhbmVsXG5cdFx0JCgnI2JubS1iYW5Nb2RhbCcpLm1vZGFsKHtcblx0XHRcdGJhY2tkcm9wOiAnc3RhdGljJyxcblx0XHRcdGtleWJvYXJkOiBmYWxzZSxcblx0XHRcdHNob3c6IGZhbHNlLFxuXHRcdH0pO1xuXG5cdFx0Ly8gQWRkIGxpc3RlbmVyIGZvciBiYW4gcGFuZWwgaGlkZVxuXHRcdCQoJyNibm0tYmFuTW9kYWwnKS5vbignaGlkZGVuLmJzLm1vZGFsJywgJC5wcm94eSh0aGlzLl9vbkJhbk1vZGFsSGlkZGVuLCB0aGlzKSk7XG5cblx0XHQvLyBJbml0aWFsaXplIGtlbmRvIHZhbGlkYXRpb24gb24gYmFuIGZvcm1cblx0XHR0aGlzLl9iYW5WYWxpZGF0b3IgPSAkKCcjYm5tLWJhbkZvcm0nKS5rZW5kb1ZhbGlkYXRvcih7fSkuZGF0YSgna2VuZG9WYWxpZGF0b3InKTtcblxuXHRcdC8vIEFkZCBsaXN0ZW5lciB0byBCYW4gYnV0dG9uIGNsaWNrXG5cdFx0JCgnI2JubS1iYW5CdCcpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25CYW5DbGljaywgdGhpcykpO1xuXG5cdFx0Ly8gSW5pdCBiYW4gZGVsYXkgbnVtZXJpYyBzdGVwcGVyXG5cdFx0dGhpcy5fYmFuRGVsYXlJbiA9ICQoJyNibm0tbW9kYWxEZWxheU5TJykua2VuZG9OdW1lcmljVGV4dEJveCh7XG5cdFx0ICAgIG1pbjogMCxcblx0XHQgICAgc3RlcDogMSxcblx0XHQgICAgZm9ybWF0OiAnIydcblx0XHR9KS5kYXRhKCdrZW5kb051bWVyaWNUZXh0Qm94Jyk7XG5cblx0XHQvLyBJbml0IGJhbiBleHBpcmF0aW9uIGRhdGUgcGlja2VyXG5cdFx0dGhpcy5fYmFuRXhwRGF0ZUluID0gJCgnI2JubS1leHBpcmF0aW9uRFAnKS5rZW5kb0RhdGVQaWNrZXIoe1xuXHRcdFx0dmFsdWU6IHRoaXMuX3RvbW9ycm93LFxuXHRcdFx0bWluOiB0aGlzLl90b21vcnJvdyxcblx0XHRcdGZvb3RlcjogZmFsc2UsXG5cdFx0XHRmb3JtYXQ6ICdkZC9NTS95eXl5J1xuXHRcdH0pLmRhdGEoJ2tlbmRvRGF0ZVBpY2tlcicpO1xuXG5cdFx0Ly8gRGlzYWJsZSBtYW51YWwgZGF0ZSBpbnB1dFxuXHRcdCQoJyNibm0tZXhwaXJhdGlvbkRQJykuYXR0cigncmVhZG9ubHknLCdyZWFkb25seScpO1xuXG5cdFx0Ly8gSW5pdCBiYW4gZXhwaXJhdGlvbiBob3Vycy9taW51dGVzIGlucHV0c1xuXHRcdHRoaXMuX2JhbkV4cEhvdXJJbiA9ICQoJyNibm0tbW9kYWxFeHBIb3Vyc05TJykua2VuZG9OdW1lcmljVGV4dEJveCh7XG5cdFx0ICAgIG1pbjogMCxcblx0XHRcdG1heDogOTksXG5cdFx0ICAgIHN0ZXA6IDEsXG5cdFx0ICAgIGZvcm1hdDogJyMnXG5cdFx0fSkuZGF0YSgna2VuZG9OdW1lcmljVGV4dEJveCcpO1xuXG5cdFx0dGhpcy5fYmFuRXhwTWluSW4gPSAkKCcjYm5tLW1vZGFsRXhwTWluc05TJykua2VuZG9OdW1lcmljVGV4dEJveCh7XG5cdFx0ICAgIG1pbjogMCxcblx0XHRcdG1heDogNTksXG5cdFx0ICAgIHN0ZXA6IDEsXG5cdFx0ICAgIGZvcm1hdDogJyMnXG5cdFx0fSkuZGF0YSgna2VuZG9OdW1lcmljVGV4dEJveCcpO1xuXG5cdFx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0XHQvLyBMb2FkIHpvbmVzIGxpc3Rcblx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX0dFVF9aT05FUyk7XG5cblx0XHQvLyBMb2FkIGJhbm5lZCBJUCBhZGRyZXNzZXNcblx0XHQvLyBOb3RlOiB3ZSBkb24ndCBsb2FkIHRoZSBiYW5uZWQgdXNlcm5hbWVzIGF1dG9tYXRpY2FsbHkgYmVjYXVzZSBhIHpvbmUgbXVzdCBiZSBzZWxlY3RlZFxuXHRcdHRoaXMuX2dldEJhbm5lZElQcygpO1xuXHR9XG5cblx0ZGVzdHJveSgpXG5cdHtcblx0XHQvLyBDYWxsIHN1cGVyIG1ldGhvZFxuXHRcdHN1cGVyLmRlc3Ryb3koKTtcblxuXHRcdC8vIERlc3Ryb3kgc2Nyb2xsaW5nIHRhYnNcblx0XHQkKCcjYm5tLXRhYk5hdmlnYXRvciAjdGFicycpLnNjcm9sbGluZ1RhYnMoJ2Rlc3Ryb3knKTtcblxuXHRcdC8vIFJlbW92ZSBjbGljayBsaXN0ZW5lcnNcblx0XHQkKCcjYm5tLXNob3dCYW5Nb2RhbEJ0Jykub2ZmKCdjbGljaycpO1xuXHRcdCQoJyNibm0tcmVmcmVzaE5hbWVzQnQnKS5vZmYoJ2NsaWNrJyk7XG5cdFx0JCgnI2JubS1yZW1vdmVOYW1lQnQnKS5vZmYoJ2NsaWNrJyk7XG5cdFx0JCgnI2JubS1yZW1vdmVBbGxOYW1lc0J0Jykub2ZmKCdjbGljaycpO1xuXHRcdCQoJyNibm0tcmVmcmVzaElwQnQnKS5vZmYoJ2NsaWNrJyk7XG5cdFx0JCgnI2JubS1yZW1vdmVJcEJ0Jykub2ZmKCdjbGljaycpO1xuXHRcdCQoJyNibm0tcmVtb3ZlQWxsSXBCdCcpLm9mZignY2xpY2snKTtcblx0XHQkKCcjYm5tLWJhbkJ0Jykub2ZmKCdjbGljaycpO1xuXG5cdFx0Ly8gSGlkZSBiYW4gcGFuZWxcblx0XHQkKCcjYm5tLWJhbk1vZGFsJykubW9kYWwoJ2hpZGUnKTtcblxuXHRcdC8vIFJlbW92ZSBiYW4gcGFuZWwgbGlzdGVuZXJcblx0XHQkKCcjYm5tLWJhbk1vZGFsJykub2ZmKCdoaWRkZW4uYnMubW9kYWwnKTtcblx0fVxuXG5cdG9uRXh0ZW5zaW9uQ29tbWFuZChjb21tYW5kLCBkYXRhKVxuXHR7XG5cdFx0Ly8gRGF0YSByZWNlaXZlZFxuXHRcdGlmIChjb21tYW5kID09IHRoaXMuUkVTUF9aT05FUylcblx0XHR7XG5cdFx0XHRsZXQgem9uZXMgPSBkYXRhLmdldFV0ZlN0cmluZ0FycmF5KCd6b25lcycpO1xuXG5cdFx0XHQvLyBJZiB3ZSBoYXZlIDEgem9uZSBvbmx5LCB3ZSB3aWxsIHNlbGVjdCBpdCBpbW1lZGlhdGVseVxuXHRcdFx0Y29uc3Qgc2VsZWN0Rmlyc3Rab25lID0gem9uZXMubGVuZ3RoID09IDE7XG5cblx0XHRcdC8vIFNvcnQgem9uZXMgbGlzdFxuXHRcdFx0em9uZXMuc29ydChmdW5jdGlvbiAoYSwgYikge1xuXHRcdFx0XHRyZXR1cm4gYS5sb2NhbGVDb21wYXJlKGIpO1xuXHRcdFx0fSk7XG5cblx0XHRcdC8vIEFkZCBcIm5vbmVcIiB6b25lXG5cdFx0XHR6b25lcy51bnNoaWZ0KCdbbm9uZV0nKTtcblxuXHRcdFx0Ly8gU2V0IHpvbmUgZHJvcGRvd24gZGF0YXNvdXJjZVxuXHRcdFx0dGhpcy5fem9uZXNERC5zZXREYXRhU291cmNlKHpvbmVzKTtcblxuXHRcdFx0aWYgKHNlbGVjdEZpcnN0Wm9uZSlcblx0XHRcdHtcblx0XHRcdFx0dGhpcy5fem9uZXNERC5zZWxlY3QoMSk7XG5cdFx0XHRcdHRoaXMuX2dldEJhbm5lZFVzZXJuYW1lcygpO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHR0aGlzLl96b25lc0RELnNlbGVjdCgwKTtcblx0XHR9XG5cblx0XHRlbHNlIGlmIChjb21tYW5kID09IHRoaXMuUkVTUF9VU0VSTkFNRVMpXG5cdFx0e1xuXHRcdFx0Ly8gU3Vic3RpdHV0ZSBncmlkJ3MgZGF0YSBzb3VyY2UsIHJldGFpbmluZyBjdXJyZW50IHNvcnRpbmdcblx0XHRcdGxldCBjdXJyU29ydCA9IHRoaXMuX25hbWVzR3JpZC5kYXRhU291cmNlLnNvcnQoKTtcblxuXHRcdFx0bGV0IGRzID0gbmV3IGtlbmRvLmRhdGEuRGF0YVNvdXJjZSh7XG5cdFx0XHRcdHNjaGVtYToge1xuXHRcdFx0XHRcdG1vZGVsOiB7XG5cdFx0XHRcdFx0XHRmaWVsZHM6IHtcblx0XHRcdFx0XHRcdFx0ZXhwaXJhdGlvbkRhdGU6IHtcblx0XHRcdFx0XHRcdFx0XHR0eXBlOiAnZGF0ZVRpbWUnLFxuXHRcdFx0XHRcdFx0XHRcdHBhcnNlOiBmdW5jdGlvbiAoZSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG1vbWVudChlLCAnREQvTU0vWVlZWSBISDptbScpLnRvRGF0ZSgpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0YmFuRGF0ZToge1xuXHRcdFx0XHRcdFx0XHRcdHR5cGU6ICdkYXRlVGltZScsXG5cdFx0XHRcdFx0XHRcdFx0cGFyc2U6IGZ1bmN0aW9uIChlKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gbW9tZW50KGUsICdERC9NTS9ZWVlZIEhIOm1tJykudG9EYXRlKCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRzb3J0OiBjdXJyU29ydCwgLy8gRklYTUUgRXhwZWN0ZWQgc29ydGluZyBkb2Vzbid0IHNlZW0gdG8gYmUgYXBwbGllZFxuXHRcdFx0XHRkYXRhOiB0aGlzLl9nZW5lcmF0ZUJhbm5lZEVudHJpZXMoZGF0YS5nZXRTRlNBcnJheSgndU5hbWVzJykpXG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gQXNzaWduIGRhdGEgc291cmNlIHRvIGdyaWRcblx0XHRcdHRoaXMuX25hbWVzR3JpZC5zZXREYXRhU291cmNlKGRzKTtcblxuXHRcdFx0Ly8gRW5hYmxlIHJlbW92ZSBhbGwgYnV0dG9uXG5cdFx0XHQkKCcjYm5tLXJlbW92ZUFsbE5hbWVzQnQnKS5hdHRyKCdkaXNhYmxlZCcsIGRzLnRvdGFsKCkgPT0gMClcblx0XHR9XG5cdFx0ZWxzZSBpZiAoY29tbWFuZCA9PSB0aGlzLlJFU1BfSVBBRERSRVNTRVMpXG5cdFx0e1xuXHRcdFx0Ly8gU3Vic3RpdHV0ZSBncmlkJ3MgZGF0YSBzb3VyY2UsIHJldGFpbmluZyBjdXJyZW50IHNvcnRpbmcgKEZJWClcblx0XHRcdGxldCBjdXJyU29ydCA9IHRoaXMuX2lwR3JpZC5kYXRhU291cmNlLnNvcnQoKTtcblxuXHRcdFx0bGV0IGRzID0gbmV3IGtlbmRvLmRhdGEuRGF0YVNvdXJjZSh7XG5cdFx0XHRcdHNjaGVtYToge1xuXHRcdFx0XHRcdG1vZGVsOiB7XG5cdFx0XHRcdFx0XHRmaWVsZHM6IHtcblx0XHRcdFx0XHRcdFx0ZXhwaXJhdGlvbkRhdGU6IHtcblx0XHRcdFx0XHRcdFx0XHR0eXBlOiAnZGF0ZVRpbWUnLFxuXHRcdFx0XHRcdFx0XHRcdHBhcnNlOiBmdW5jdGlvbiAoZSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG1vbWVudChlLCAnREQvTU0vWVlZWSBISDptbScpLnRvRGF0ZSgpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0YmFuRGF0ZToge1xuXHRcdFx0XHRcdFx0XHRcdHR5cGU6ICdkYXRlVGltZScsXG5cdFx0XHRcdFx0XHRcdFx0cGFyc2U6IGZ1bmN0aW9uIChlKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gbW9tZW50KGUsICdERC9NTS9ZWVlZIEhIOm1tJykudG9EYXRlKCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRzb3J0OiBjdXJyU29ydCwgLy8gRklYTUUgRXhwZWN0ZWQgc29ydGluZyBkb2Vzbid0IHNlZW0gdG8gYmUgYXBwbGllZFxuXHRcdFx0XHRkYXRhOiB0aGlzLl9nZW5lcmF0ZUJhbm5lZEVudHJpZXMoZGF0YS5nZXRTRlNBcnJheSgnSVBzJykpXG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gQXNzaWduIGRhdGEgc291cmNlIHRvIGdyaWRcblx0XHRcdHRoaXMuX2lwR3JpZC5zZXREYXRhU291cmNlKGRzKTtcblxuXHRcdFx0Ly8gRW5hYmxlIHJlbW92ZSBhbGwgYnV0dG9uXG5cdFx0XHQkKCcjYm5tLXJlbW92ZUFsbElwQnQnKS5hdHRyKCdkaXNhYmxlZCcsIGRzLnRvdGFsKCkgPT0gMClcblx0XHR9XG5cdH1cblxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQvLyBVSSBFVkVOVCBMSVNURU5FUlNcblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRfb25TaG93QmFuTW9kYWxDbGljaygpXG5cdHtcblx0XHQvLyBEaXNwbGF5IHpvbmUgbmFtZVxuXHRcdCQoJyNibm0tbW9kYWxab25lTGInKS50ZXh0KHRoaXMuX3pvbmVzREQudmFsdWUoKSlcblxuXHRcdC8vIERpc3BsYXkgYmFuIHBhbmVsXG5cdFx0JCgnI2JubS1iYW5Nb2RhbCcpLm1vZGFsKCdzaG93Jyk7XG5cblx0XHQvLyBGb2N1cyBuYW1lIGZpZWxkXG5cdFx0JCgnI2JubS1tb2RhbE5hbWVJbicpLmZvY3VzKCk7XG5cdH1cblxuXHRfb25CYW5Nb2RhbEhpZGRlbihlKVxuXHR7XG5cdFx0Ly8gUmVzZXQgdmFsaWRhdG9yXG5cdFx0dGhpcy5fYmFuVmFsaWRhdG9yLmhpZGVNZXNzYWdlcygpO1xuXG5cdFx0Ly8gVGhlIG1ldGhvZCBhYm92ZSBkb2Vzbid0IHJlbW92ZSB0aGUgay1pbnZhbGlkIGNsYXNzZXMgYW5kIGFyaWEtaW52YWxpZD1cInRydWVcIiBhdHRyaWJ1dGVzIGZyb20gaW5wdXRzXG5cdFx0Ly8gTGV0J3MgZG8gaXQgbWFudWFsbHlcblx0XHQkKCcjYm5tLWJhbkZvcm0gLmstaW52YWxpZCcpLnJlbW92ZUNsYXNzKCdrLWludmFsaWQnKTtcblx0XHQkKCcjYm5tLWJhbkZvcm0gW2FyaWEtaW52YWxpZD1cInRydWVcIl0nKS5yZW1vdmVBdHRyKCdhcmlhLWludmFsaWQnKTtcblxuXHRcdC8vIFJlc2V0IGJhbiBmb3JtXG5cdFx0JCgnI2JubS1tb2RhbE5hbWVJbicpLnZhbCgnJyk7XG5cdFx0JCgnI2JubS1tb2RhbFJlYXNvbkluJykudmFsKCcnKTtcblx0XHQkKCcjYm5tLW1vZGFsTWVzc2FnZUluJykudmFsKCcnKTtcblxuXHRcdHRoaXMuX2JhbkRlbGF5SW4udmFsdWUoNSk7XG5cblx0XHQkKCdpbnB1dFtuYW1lPVwiZXhwaXJhdGlvblwiXScpLnJlbW92ZUF0dHIoJ2NoZWNrZWQnKTtcblx0XHQkKCcjYm5tLWV4cGlyYXRpb25SQjAnKS5wcm9wKCdjaGVja2VkJywgdHJ1ZSk7XG5cblx0XHR0aGlzLl9iYW5FeHBIb3VySW4udmFsdWUoMSk7XG5cdFx0dGhpcy5fYmFuRXhwTWluSW4udmFsdWUoMCk7XG5cblx0XHR0aGlzLl9iYW5FeHBEYXRlSW4ubWluKHRoaXMuX3RvbW9ycm93KTtcblx0XHR0aGlzLl9iYW5FeHBEYXRlSW4udmFsdWUodGhpcy5fdG9tb3Jyb3cpO1xuXHR9XG5cblx0X29uQmFuQ2xpY2soKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2JhblZhbGlkYXRvci52YWxpZGF0ZSgpKVxuXHRcdHtcblx0XHRcdC8vIFJldHJpZXZlIGJhbiBkZXRhaWxzXG5cdFx0XHRsZXQgcGFyYW1zID0gbmV3IFNGUzJYLlNGU09iamVjdCgpO1xuXG5cdFx0XHRwYXJhbXMucHV0VXRmU3RyaW5nKCd6b25lJywgdGhpcy5fem9uZXNERC52YWx1ZSgpKTtcblx0XHRcdHBhcmFtcy5wdXRVdGZTdHJpbmcoJ25hbWUnLCAkKCcjYm5tLW1vZGFsTmFtZUluJykudmFsKCkpO1xuXHRcdFx0cGFyYW1zLnB1dFV0ZlN0cmluZygnbXNnJywgJCgnI2JubS1tb2RhbE1lc3NhZ2VJbicpLnZhbCgpKTtcblx0XHRcdHBhcmFtcy5wdXRJbnQoJ2RlbGF5JywgdGhpcy5fYmFuRGVsYXlJbi52YWx1ZSgpICE9IG51bGwgPyB0aGlzLl9iYW5EZWxheUluLnZhbHVlKCkgOiAwKTtcblx0XHRcdHBhcmFtcy5wdXRVdGZTdHJpbmcoJ3JlYXNvbicsICQoJyNibm0tbW9kYWxSZWFzb25JbicpLnZhbCgpKTtcblxuXHRcdFx0Y29uc3QgZXhwID0gJCgnaW5wdXRbbmFtZT1cImV4cGlyYXRpb25cIl06Y2hlY2tlZCcpLnZhbCgpO1xuXHRcdFx0bGV0IGR1cmF0aW9uID0gLTE7XG5cblx0XHRcdGlmIChleHAgPT0gJ2FmdGVyJylcblx0XHRcdHtcblx0XHRcdFx0Y29uc3QgaG91cnMgPSB0aGlzLl9iYW5FeHBIb3VySW4udmFsdWUoKSAhPSBudWxsID8gdGhpcy5fYmFuRXhwSG91ckluLnZhbHVlKCkgOiAwO1xuXHRcdFx0XHRjb25zdCBtaW51dGVzID0gdGhpcy5fYmFuRXhwTWluSW4udmFsdWUoKSAhPSBudWxsID8gdGhpcy5fYmFuRXhwTWluSW4udmFsdWUoKSA6IDA7XG5cblx0XHRcdFx0ZHVyYXRpb24gPSAoaG91cnMgKiA2MCkgKyBtaW51dGVzO1xuXG5cdFx0XHRcdGlmIChkdXJhdGlvbiA8PSAwKVxuXHRcdFx0XHRcdGR1cmF0aW9uID0gMTtcblx0XHRcdH1cblx0XHRcdGVsc2UgaWYgKGV4cCA9PSAnb24nKVxuXHRcdFx0e1xuXHRcdFx0XHRjb25zdCBvbkRhdGUgPSBtb21lbnQodGhpcy5fYmFuRXhwRGF0ZUluLnZhbHVlKCkpO1xuXHRcdFx0XHRjb25zdCBub3cgPSBtb21lbnQoKTtcblxuXHRcdFx0XHRkdXJhdGlvbiA9IG9uRGF0ZS5zdGFydE9mKCdkYXknKS5kaWZmKG5vdy5zdGFydE9mKCdtaW51dGUnKSwgJ21pbnV0ZXMnKTtcblxuXHRcdFx0XHRpZiAoZHVyYXRpb24gPD0gMClcblx0XHRcdFx0XHRkdXJhdGlvbiA9IDE7XG5cdFx0XHR9XG5cblx0XHRcdHBhcmFtcy5wdXRJbnQoJ2R1ck1pbnMnLCBkdXJhdGlvbik7XG5cblx0XHRcdC8vIFNlbmQgYmFuIHJlcXVlc3QgdG8gc2VydmVyXG5cdFx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX0JBTiwgcGFyYW1zKTtcblxuXHRcdFx0Ly8gUmVmcmVzaCBsaXN0XG5cdFx0XHR0aGlzLl9nZXRCYW5uZWRVc2VybmFtZXMoKTtcblxuXHRcdFx0Ly8gRm9jdXMgdXNlcm5hbWUgZmllbGRcblx0XHRcdCQoJyNibm0tbW9kYWxOYW1lSW4nKS5mb2N1cygpO1xuXHRcdFx0JCgnI2JubS1tb2RhbE5hbWVJbicpLnNlbGVjdCgpO1xuXHRcdH1cblx0fVxuXG5cdF9vblpvbmVDaGFuZ2UoKVxuXHR7XG5cdFx0JCgnI2JubS1uYW1lc0J1dHRvbnMnKS5hdHRyKCdkaXNhYmxlZCcsIHRoaXMuX3pvbmVzREQuc2VsZWN0KCkgPT0gMCk7XG5cdFx0JCgnI2JubS1zaG93QmFuTW9kYWxCdCcpLmF0dHIoJ2Rpc2FibGVkJywgdGhpcy5fem9uZXNERC5zZWxlY3QoKSA9PSAwKTtcblxuXHRcdHRoaXMuX2dldEJhbm5lZFVzZXJuYW1lcygpO1xuXHR9XG5cblx0X29uTmFtZXNHcmlkU2VsZWN0aW9uQ2hhbmdlKClcblx0e1xuXHRcdC8vIEVuYWJsZS9kaXNhYmxlIHJlbW92ZSBidXR0b25cblx0XHRjb25zdCBzZWxlY3RlZFJvd3MgPSB0aGlzLl9uYW1lc0dyaWQuc2VsZWN0KCk7XG5cdFx0JCgnI2JubS1yZW1vdmVOYW1lQnQnKS5hdHRyKCdkaXNhYmxlZCcsIHNlbGVjdGVkUm93cy5sZW5ndGggPT0gMCk7XG5cdH1cblxuXHRfb25JcEdyaWRTZWxlY3Rpb25DaGFuZ2UoKVxuXHR7XG5cdFx0Ly8gRW5hYmxlL2Rpc2FibGUgcmVtb3ZlIGJ1dHRvblxuXHRcdGNvbnN0IHNlbGVjdGVkUm93cyA9IHRoaXMuX2lwR3JpZC5zZWxlY3QoKTtcblx0XHQkKCcjYm5tLXJlbW92ZUlwQnQnKS5hdHRyKCdkaXNhYmxlZCcsIHNlbGVjdGVkUm93cy5sZW5ndGggPT0gMCk7XG5cdH1cblxuXHRfb25SZWZyZXNoTmFtZXNDbGljaygpXG5cdHtcblx0XHR0aGlzLl9nZXRCYW5uZWRVc2VybmFtZXMoKTtcblx0fVxuXG5cdF9vblJlbW92ZU5hbWVzQ2xpY2soKVxuXHR7XG5cdFx0dGhpcy5zaGVsbEN0cmwuc2hvd0NvbmZpcm1XYXJuaW5nKGBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gcmVtb3ZlIHRoZSBiYW5uaW5nIGZvciB0aGUgc2VsZWN0ZWQgdXNlcm5hbWUke3RoaXMuX2lwR3JpZC5zZWxlY3QoKS5sZW5ndGggPiAxID8gJ3MnIDogJyd9P2AsICQucHJveHkodGhpcy5fb25SZW1vdmVOYW1lc0NvbmZpcm0sIHRoaXMpKTtcblx0fVxuXG5cdF9vblJlbW92ZU5hbWVzQ29uZmlybSgpXG5cdHtcblx0XHRsZXQgc2VsZWN0ZWRSb3dzID0gdGhpcy5fbmFtZXNHcmlkLnNlbGVjdCgpO1xuXHRcdGxldCB1c2VybmFtZXMgPSBbXTtcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgc2VsZWN0ZWRSb3dzLmxlbmd0aDsgaSsrKVxuXHRcdHtcblx0XHRcdGxldCBkYXRhSXRlbSA9IHRoaXMuX25hbWVzR3JpZC5kYXRhSXRlbShzZWxlY3RlZFJvd3NbaV0pO1xuXHRcdFx0dXNlcm5hbWVzLnB1c2goZGF0YUl0ZW0ubmFtZSk7XG5cdFx0fVxuXG5cdFx0dGhpcy5fcmVxdWVzdEJhbm5lZFVzZXJzUmVtb3ZhbCh1c2VybmFtZXMsIHRoaXMuX3pvbmVzREQudmFsdWUoKSk7XG5cdH1cblxuXHRfb25SZW1vdmVBbGxOYW1lc0NsaWNrKClcblx0e1xuXHRcdHRoaXMuc2hlbGxDdHJsLnNob3dDb25maXJtV2FybmluZyhgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHJlbW92ZSBhbGwgYmFubmVkIHVzZXJuYW1lcz9gLCAkLnByb3h5KHRoaXMuX29uUmVtb3ZBbGxOYW1lc0NvbmZpcm0sIHRoaXMpKTtcblx0fVxuXG5cdF9vblJlbW92QWxsTmFtZXNDb25maXJtKClcblx0e1xuXHRcdHRoaXMuX3JlcXVlc3RCYW5uZWRVc2Vyc1JlbW92YWwobnVsbCwgdGhpcy5fem9uZXNERC52YWx1ZSgpKTtcblx0fVxuXG5cdF9vblJlZnJlc2hJcENsaWNrKClcblx0e1xuXHRcdHRoaXMuX2dldEJhbm5lZElQcygpO1xuXHR9XG5cblx0X29uUmVtb3ZlSXBDbGljaygpXG5cdHtcblx0XHR0aGlzLnNoZWxsQ3RybC5zaG93Q29uZmlybVdhcm5pbmcoYEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byByZW1vdmUgdGhlIGJhbm5pbmcgZm9yIHRoZSBzZWxlY3RlZCBJUCBhZGRyZXNzJHt0aGlzLl9pcEdyaWQuc2VsZWN0KCkubGVuZ3RoID4gMSA/ICdlcycgOiAnJ30/YCwgJC5wcm94eSh0aGlzLl9vblJlbW92ZUlwQ29uZmlybSwgdGhpcykpO1xuXHR9XG5cblx0X29uUmVtb3ZlSXBDb25maXJtKClcblx0e1xuXHRcdGxldCBzZWxlY3RlZFJvd3MgPSB0aGlzLl9pcEdyaWQuc2VsZWN0KCk7XG5cdFx0bGV0IGlwQWRkcmVzc2VzID0gW107XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHNlbGVjdGVkUm93cy5sZW5ndGg7IGkrKylcblx0XHR7XG5cdFx0XHRsZXQgZGF0YUl0ZW0gPSB0aGlzLl9pcEdyaWQuZGF0YUl0ZW0oc2VsZWN0ZWRSb3dzW2ldKTtcblx0XHRcdGlwQWRkcmVzc2VzLnB1c2goZGF0YUl0ZW0uaXBBZGRyZXNzKTtcblx0XHR9XG5cblx0XHR0aGlzLl9yZXF1ZXN0QmFubmVkSVBzUmVtb3ZhbChpcEFkZHJlc3Nlcyk7XG5cdH1cblxuXHRfb25SZW1vdmVBbGxJcENsaWNrKClcblx0e1xuXHRcdHRoaXMuc2hlbGxDdHJsLnNob3dDb25maXJtV2FybmluZyhgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHJlbW92ZSBhbGwgYmFubmVkIElQIGFkZHJlc3Nlcz9gLCAkLnByb3h5KHRoaXMuX29uUmVtb3ZBbGxJcENvbmZpcm0sIHRoaXMpKTtcblx0fVxuXG5cdF9vblJlbW92QWxsSXBDb25maXJtKClcblx0e1xuXHRcdHRoaXMuX3JlcXVlc3RCYW5uZWRJUHNSZW1vdmFsKG51bGwpO1xuXHR9XG5cblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0Ly8gUFJJVkFURSBNRVRIT0RTXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0X2dldEJhbm5lZElQcygpXG5cdHtcblx0XHQvLyBSZW1vdmUgc2VsZWN0aW9uXG5cdFx0dGhpcy5faXBHcmlkLmNsZWFyU2VsZWN0aW9uKCk7XG5cblx0XHQvLyBDbGVhciBiYW5uZWQgSVBzIHRhYmxlXG5cdFx0dGhpcy5faXBHcmlkLnNldERhdGFTb3VyY2UoW10pO1xuXG5cdFx0Ly8gU2VuZCByZXF1ZXN0IHRvIGV4dGVuc2lvblxuXHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfR0VUX0lQQUREUkVTU0VTKTtcblx0fVxuXG5cdF9nZXRCYW5uZWRVc2VybmFtZXMoKVxuXHR7XG5cdFx0Ly8gUmVtb3ZlIHNlbGVjdGlvblxuXHRcdHRoaXMuX25hbWVzR3JpZC5jbGVhclNlbGVjdGlvbigpO1xuXG5cdFx0Ly8gQ2xlYXIgYmFubmVkIElQcyB0YWJsZVxuXHRcdHRoaXMuX25hbWVzR3JpZC5zZXREYXRhU291cmNlKFtdKTtcblxuXHRcdGlmICh0aGlzLl96b25lc0RELnNlbGVjdCgpID4gMClcblx0XHR7XG5cdFx0XHQvLyBHZXQgem9uZSBJRFxuXHRcdFx0bGV0IHBhcmFtcyA9IG5ldyBTRlMyWC5TRlNPYmplY3QoKTtcblx0XHRcdHBhcmFtcy5wdXRVdGZTdHJpbmcoJ3pvbmUnLCB0aGlzLl96b25lc0RELnZhbHVlKCkpO1xuXG5cdFx0XHQvLyBTZW5kIHJlcXVlc3QgdG8gZXh0ZW5zaW9uXG5cdFx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX0dFVF9VU0VSTkFNRVMsIHBhcmFtcyk7XG5cdFx0fVxuXHR9XG5cblx0X2dlbmVyYXRlQmFubmVkRW50cmllcyhiYW5EYXRhKVxuXHR7XG5cdFx0bGV0IGJhbm5lZEVudHJpZXMgPSBbXTtcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYmFuRGF0YS5zaXplKCk7IGkrKylcblx0XHR7XG5cdFx0XHRjb25zdCBidSA9IEJhbm5lZFVzZXIuZnJvbVNGU0FycmF5KGJhbkRhdGEuZ2V0U0ZTQXJyYXkoaSkpO1xuXHRcdFx0YmFubmVkRW50cmllcy5wdXNoKGJ1KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gYmFubmVkRW50cmllcztcblx0fVxuXG5cdF9yZXF1ZXN0QmFubmVkVXNlcnNSZW1vdmFsKHVzZXJuYW1lcywgem9uZSlcblx0e1xuXHRcdC8vIElmIHRoZSB1c2VybmFtZXMgYXJyYXkgaXMgbnVsbCwgc2VydmVyIHdpbGwgcmVtb3ZlIGFsbCBiYW5uZWQgdXNlcm5hbWVzXG5cdFx0bGV0IHBhcmFtcyA9IG5ldyBTRlMyWC5TRlNPYmplY3QoKTtcblx0XHRwYXJhbXMucHV0VXRmU3RyaW5nKCd6b25lJywgem9uZSk7XG5cblx0XHRpZiAodXNlcm5hbWVzID09IG51bGwpXG5cdFx0XHRwYXJhbXMucHV0TnVsbCgndU5hbWVzJyk7XG5cdFx0ZWxzZVxuXHRcdFx0cGFyYW1zLnB1dFV0ZlN0cmluZ0FycmF5KCd1TmFtZXMnLCB1c2VybmFtZXMpO1xuXG5cdFx0dGhpcy5zZW5kRXh0ZW5zaW9uUmVxdWVzdCh0aGlzLlJFUV9SRU1PVkVfVVNFUk5BTUVTLCBwYXJhbXMpO1xuXHR9XG5cblx0X3JlcXVlc3RCYW5uZWRJUHNSZW1vdmFsKGlwQWRkcmVzc2VzKVxuXHR7XG5cdFx0Ly8gSWYgdGhlIHVzZXJuYW1lcyBhcnJheSBpcyBudWxsLCBzZXJ2ZXIgd2lsbCByZW1vdmUgYWxsIGJhbm5lZCB1c2VybmFtZXNcblx0XHRsZXQgcGFyYW1zID0gbmV3IFNGUzJYLlNGU09iamVjdCgpO1xuXG5cdFx0aWYgKGlwQWRkcmVzc2VzID09IG51bGwpXG5cdFx0XHRwYXJhbXMucHV0TnVsbCgnSVBzJyk7XG5cdFx0ZWxzZVxuXHRcdFx0cGFyYW1zLnB1dFV0ZlN0cmluZ0FycmF5KCdJUHMnLCBpcEFkZHJlc3Nlcyk7XG5cblx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX1JFTU9WRV9JUEFERFJFU1NFUywgcGFyYW1zKTtcblx0fVxuXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdC8vIFBSSVZBVEUgR0VUVEVSU1xuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdGdldCBfdG9tb3Jyb3coKVxuXHR7XG5cdFx0bGV0IHRvbW9ycm93ID0gbW9tZW50KCkuYWRkKDEsICdkJyk7XG5cdFx0cmV0dXJuIHRvbW9ycm93LnRvRGF0ZSgpO1xuXHR9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUMxQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBIiwic291cmNlUm9vdCI6IiJ9