rubyfox-server 2.16.0.0 → 2.16.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (89) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +2 -1
  3. data/README.md +19 -0
  4. data/lib/rubyfox/server/cli.rb +39 -5
  5. data/lib/rubyfox/server/data/lib/apache-tomcat/LICENSE +1061 -1061
  6. data/lib/rubyfox/server/data/lib/apache-tomcat/NOTICE +68 -68
  7. data/lib/rubyfox/server/data/lib/apache-tomcat/README.md +79 -79
  8. data/lib/rubyfox/server/data/lib/apache-tomcat/RELEASE-NOTES +174 -173
  9. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/bootstrap.jar +0 -0
  10. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/catalina-tasks.xml +39 -39
  11. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/catalina.bat +28 -13
  12. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/catalina.sh +52 -14
  13. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/ciphers.bat +0 -0
  14. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/commons-daemon-native.tar.gz +0 -0
  15. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/commons-daemon.jar +0 -0
  16. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/configtest.bat +0 -0
  17. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/daemon.sh +54 -36
  18. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/digest.bat +0 -0
  19. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/makebase.bat +0 -0
  20. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/setclasspath.bat +0 -0
  21. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/shutdown.bat +0 -0
  22. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/startup.bat +0 -0
  23. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/tomcat-juli.jar +0 -0
  24. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/tomcat-native.tar.gz +0 -0
  25. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/tool-wrapper.bat +0 -0
  26. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/tool-wrapper.sh +4 -4
  27. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/version.bat +0 -0
  28. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/catalina.policy +259 -259
  29. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/catalina.properties +206 -205
  30. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/context.xml +31 -31
  31. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/jaspic-providers.xml +23 -23
  32. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/jaspic-providers.xsd +52 -52
  33. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/logging.properties +0 -0
  34. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/server.xml +0 -0
  35. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/tomcat-users.xml +0 -0
  36. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/tomcat-users.xsd +59 -59
  37. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/web.xml +4737 -4737
  38. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/annotations-api.jar +0 -0
  39. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina-ant.jar +0 -0
  40. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina-ha.jar +0 -0
  41. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina-ssi.jar +0 -0
  42. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina-storeconfig.jar +0 -0
  43. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina-tribes.jar +0 -0
  44. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina.jar +0 -0
  45. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/ecj-4.17.jar +0 -0
  46. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/el-api.jar +0 -0
  47. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/jasper-el.jar +0 -0
  48. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/jasper.jar +0 -0
  49. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/jaspic-api.jar +0 -0
  50. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/jsp-api.jar +0 -0
  51. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/servlet-api.jar +0 -0
  52. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-api.jar +0 -0
  53. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-coyote.jar +0 -0
  54. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-dbcp.jar +0 -0
  55. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-cs.jar +0 -0
  56. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-de.jar +0 -0
  57. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-es.jar +0 -0
  58. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-fr.jar +0 -0
  59. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-ja.jar +0 -0
  60. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-ko.jar +0 -0
  61. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-pt-BR.jar +0 -0
  62. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-ru.jar +0 -0
  63. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-zh-CN.jar +0 -0
  64. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-jdbc.jar +0 -0
  65. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-jni.jar +0 -0
  66. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-util-scan.jar +0 -0
  67. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-util.jar +0 -0
  68. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-websocket.jar +0 -0
  69. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/websocket-api.jar +0 -0
  70. data/lib/rubyfox/server/data/lib/apache-tomcat/temp/safeToDelete.tmp +0 -0
  71. data/lib/rubyfox/server/data/lib/sfs2x-admin.jar +0 -0
  72. data/lib/rubyfox/server/data/lib/sfs2x-core.jar +0 -0
  73. data/lib/rubyfox/server/data/lib/sfs2x.jar +0 -0
  74. data/lib/rubyfox/server/data/sfs2x.sh +1 -1
  75. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/style.css +3 -1
  76. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/application.bundle.js +2 -2
  77. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-10.bundle.js +9 -11
  78. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-12.bundle.js +604 -2
  79. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-12~module-13~module-9.bundle.js +4 -1
  80. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-13.bundle.js +19 -2
  81. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-6.bundle.js +10 -12
  82. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-9.bundle.js +4 -6
  83. data/lib/rubyfox/server/data/www/ROOT/admin/modules/template.html +5 -0
  84. data/lib/rubyfox/server/data/www/ROOT/admin/modules/zone-configurator.html +11 -1
  85. data/lib/rubyfox/server/data/www/ROOT/admin/modules/zone-monitor.html +8 -0
  86. data/lib/rubyfox/server/data/zones/BasicExamples.zone.xml +147 -0
  87. data/lib/rubyfox/server/version.rb +1 -1
  88. metadata +7 -4
  89. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/ecj-4.12.jar +0 -0
@@ -2017,6 +2017,9 @@ class ConfigInterfaceBuilder
2017
2017
 
2018
2018
  // Remove form inside static tab panes (predefined tab panes in html)
2019
2019
  $(`#${this._mainContainerId} > #tabPanels > div.tab-pane > form`).remove();
2020
+
2021
+ // Remove "active" class from static tab panes (otherwise this class messes with the tab navigator functioning)
2022
+ $(`#${this._mainContainerId} > #tabPanels > div.tab-pane`).removeClass('active');
2020
2023
  }
2021
2024
 
2022
2025
  disableInterface(disable)
@@ -2615,4 +2618,4 @@ class ConfigurationParameter
2615
2618
  /***/ })
2616
2619
 
2617
2620
  }]);
2618
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXRzL2pzL2NvcmUvbW9kdWxlcy9tb2R1bGUtMTJ+bW9kdWxlLTEzfm1vZHVsZS05LmJ1bmRsZS5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2FwcGxpY2F0aW9uLy4vc3JjL2NvbXBvbmVudHMvdWlidWlsZGVyL2NvbmZpZy1jaGVjay1ib3guanMiLCJ3ZWJwYWNrOi8vYXBwbGljYXRpb24vLi9zcmMvY29tcG9uZW50cy91aWJ1aWxkZXIvY29uZmlnLWRyb3AtZG93bi1saXN0LmpzIiwid2VicGFjazovL2FwcGxpY2F0aW9uLy4vc3JjL2NvbXBvbmVudHMvdWlidWlsZGVyL2NvbmZpZy1kdWFsLWxpc3QuanMiLCJ3ZWJwYWNrOi8vYXBwbGljYXRpb24vLi9zcmMvY29tcG9uZW50cy91aWJ1aWxkZXIvY29uZmlnLWZvcm0taXRlbS5qcyIsIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9jb21wb25lbnRzL3VpYnVpbGRlci9jb25maWctZ3JpZC5qcyIsIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9jb21wb25lbnRzL3VpYnVpbGRlci9jb25maWctbGFiZWwuanMiLCJ3ZWJwYWNrOi8vYXBwbGljYXRpb24vLi9zcmMvY29tcG9uZW50cy91aWJ1aWxkZXIvY29uZmlnLW51bWVyaWMtc3RlcHBlci5qcyIsIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9jb21wb25lbnRzL3VpYnVpbGRlci9jb25maWctdGV4dC1pbnB1dC5qcyIsIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9jb21wb25lbnRzL3VpYnVpbGRlci9jb25maWctdmVjdG9yLTNkLmpzIiwid2VicGFjazovL2FwcGxpY2F0aW9uLy4vc3JjL2NvbXBvbmVudHMvdWlidWlsZGVyL3dpZGdldHMvbGlzdC1pdGVtLWVkaXRvci5qcyIsIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9jb21wb25lbnRzL3VpYnVpbGRlci93aWRnZXRzL3ZlY3Rvci0zZC1pbnB1dC5qcyIsIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy91dGlscy91aWJ1aWxkZXIvY29uZmlnLWZvcm0taXRlbS1mYWN0b3J5LmpzIiwid2VicGFjazovL2FwcGxpY2F0aW9uLy4vc3JjL3V0aWxzL3VpYnVpbGRlci9jb25maWctaW50ZXJmYWNlLWJ1aWxkZXIuanMiLCJ3ZWJwYWNrOi8vYXBwbGljYXRpb24vLi9zcmMvdXRpbHMvdWlidWlsZGVyL2NvbmZpZ3VyYXRpb24tcGFyYW1ldGVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29uZmlnRm9ybUl0ZW19IGZyb20gJy4vY29uZmlnLWZvcm0taXRlbSc7XG5pbXBvcnQge0NvbmZpZ0xhYmVsfSBmcm9tICcuL2NvbmZpZy1sYWJlbCc7XG5cbmV4cG9ydCBjbGFzcyBDb25maWdDaGVja0JveCBleHRlbmRzIENvbmZpZ0Zvcm1JdGVtXG57XG5cdGNvbnN0cnVjdG9yKGNvbmZpZ1BhcmFtLCBlZGl0RW5hYmxlZCwgaW5EaWFsb2cpXG5cdHtcblx0ICAgIHN1cGVyKGNvbmZpZ1BhcmFtLCBlZGl0RW5hYmxlZCwgaW5EaWFsb2cpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZSB3aWRnZXQgdG8gcmVuZGVyIHRoZSBDb25maWdQYXJhbWV0ZXIgdmFsdWUuXG5cdCAqIElmIHBhcmFtZXRlciBpcyBub3QgZWRpdGFibGUsIGEgc2ltcGxlIGxhYmVsIGlzIHVzZWQuXG5cdCAqIEBvdmVycmlkZVxuXHQgKi9cblx0X2dlbmVyYXRlSW5uZXJXaWRnZXQoKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2RhdGEuZWRpdGFibGUpXG5cdFx0e1xuXHRcdFx0Ly8gU2V0IHdpZGdldCBjb25maWd1cmF0aW9uXG5cdFx0XHRsZXQgY29uZmlnID0ge1xuXHRcdFx0XHR0eXBlOiAnY2hlY2tib3gnLFxuXHRcdFx0XHRjbGFzczogJycsXG5cdFx0XHRcdGlkOiB0aGlzLl9kYXRhLm5hbWUsXG5cdFx0XHRcdG5hbWU6IHRoaXMuX2RhdGEubmFtZSxcblx0XHRcdFx0J2RhdGEtcm9sZSc6ICdzd2l0Y2gnLFxuXHRcdFx0fTtcblxuXHRcdFx0Ly8gU2V0IHdpZGdldCBhdHRyaWJ1dGVzIChzZWUgcGFyZW50IGNsYXNzKVxuXHRcdFx0dGhpcy5fc2V0V2lkZ2V0QXR0cmlidXRlcyhjb25maWcpO1xuXG5cdFx0XHQvLyBTZXQgYWRkaXRpb25hbCB3aWRnZXQgYXR0cmlidXRlcyBiYXNlZCBvbiB2YWxpZGF0aW9uIHJ1bGVzIChzZWUgcGFyZW50IGNsYXNzKVxuXHRcdFx0dGhpcy5fc2V0V2lkZ2V0VmFsaWRhdGlvbkF0dHJpYnV0ZXMoY29uZmlnKTtcblxuXHRcdFx0Ly8gQ3JlYXRlIHdpZGdldCdzIGh0bWxcblx0XHRcdHRoaXMuX3dpZGdldEh0bWwgPSAkKCc8aW5wdXQ+JywgY29uZmlnKTtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5fd2lkZ2V0SHRtbCA9IG5ldyBDb25maWdMYWJlbCgpO1xuXG5cdFx0Ly8gUmV0dXJuIGNvbXBvbmVudFxuXHRcdHJldHVybiB0aGlzLl93aWRnZXRIdG1sO1xuXHR9XG5cblx0LyoqXG5cdCAqIEluaXRpYWxpemUgd2lkZ2V0LlxuXHQgKiBAb3ZlcnJpZGVcblx0ICovXG4gICBfaW5pdGlhbGl6ZSgpXG4gICB7XG5cdCAgIGlmICh0aGlzLl9kYXRhLmVkaXRhYmxlKVxuXHQgICB7XG5cdFx0ICAgLy8gSW5pdGlhbGl6ZSBrZW5kbyB3aWRnZXRcblx0XHQgICBrZW5kby5pbml0KHRoaXMuX3dpZGdldEh0bWwpO1xuXG5cdFx0ICAgLy8gU2F2ZSByZWYuIHRvIHdpZGdldFxuXHRcdCAgIHRoaXMuX2lubmVyV2lkZ2V0ID0gdGhpcy5fd2lkZ2V0SHRtbC5kYXRhKCdrZW5kb1N3aXRjaCcpO1xuXG5cdFx0ICAgLy8gRW5hYmxlIHZhbHVlIGNvbW1pdCBiaW5kaW5nXG5cdFx0ICAgdGhpcy5faW5uZXJXaWRnZXQuYmluZCgnY2hhbmdlJywgJC5wcm94eSh0aGlzLl9vblZhbHVlSW5wdXQsIHRoaXMpKTtcblx0ICAgfVxuXG5cdCAgIC8vIFByb2NlZWQgd2l0aCBpbml0aWFsaXphdGlvblxuXHQgICBzdXBlci5faW5pdGlhbGl6ZSgpO1xuICAgfVxuXG5cdC8qKlxuXHQgKiBTZXQgd2lkZ2V0J3MgdmFsdWUuXG5cdCAqIElmIHBhcmFtZXRlciBpcyBub3QgZWRpdGFibGUsIHRoZSBsYWJlbCB0ZXh0IGlzIHNldC5cblx0ICogQG92ZXJyaWRlXG5cdCAqL1xuXHRfc2V0V2lkZ2V0VmFsdWUoKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2RhdGEuZWRpdGFibGUpXG5cdFx0XHR0aGlzLl9pbm5lcldpZGdldC52YWx1ZSh0aGlzLl9kYXRhLnZhbHVlKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLl93aWRnZXRIdG1sLnZhbHVlID0gdGhpcy5fZGF0YS52YWx1ZTtcblxuXHRcdC8vIFRyaWdnZXIgZXZlbnRcblx0XHR0aGlzLl90cmlnZ2VyRXZlbnQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXQgd2lkZ2V0J3MgZGlzYWJsZWQgc3RhdGUuXG5cdCAqIEBvdmVycmlkZVxuXHQgKi9cblx0X3NldFdpZGdldEVkaXRFbmFibGVkKClcblx0e1xuXHRcdGlmICh0aGlzLl9kYXRhLmVkaXRhYmxlKVxuXHRcdFx0dGhpcy5faW5uZXJXaWRnZXQuZW5hYmxlKHRoaXMuX2VkaXRFbmFibGVkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBVcGRhdGUgQ29uZmlndXJhdGlvbiBQYXJhbWV0ZXIgdmFsdWUuXG5cdCAqIEBvdmVycmlkZVxuXHQgKi9cblx0X29uVmFsdWVJbnB1dChlKVxuXHR7XG5cdFx0Ly8gVXBkYXRlIENvbmZpZ3VyYXRpb24gUGFyYW1ldGVyIHRvIG5ldyB2YWx1ZVxuXHRcdHRoaXMuX2RhdGEudmFsdWUgPSB0aGlzLl9pbm5lcldpZGdldC52YWx1ZSgpO1xuXG5cdFx0Ly8gVHJpZ2dlciBldmVudFxuXHRcdHRoaXMuX3RyaWdnZXJFdmVudCgpO1xuXHR9XG59XG5cbi8vIERFRklORSBDT01QT05FTlRcbmlmICghd2luZG93LmN1c3RvbUVsZW1lbnRzLmdldCgnY29uZmlnLWNoZWNrLWJveCcpKVxuXHR3aW5kb3cuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdjb25maWctY2hlY2stYm94JywgQ29uZmlnQ2hlY2tCb3gpO1xuIiwiaW1wb3J0IHtDb25maWdGb3JtSXRlbX0gZnJvbSAnLi9jb25maWctZm9ybS1pdGVtJztcbmltcG9ydCB7Q29uZmlnTGFiZWx9IGZyb20gJy4vY29uZmlnLWxhYmVsJztcblxuZXhwb3J0IGNsYXNzIENvbmZpZ0Ryb3BEb3duTGlzdCBleHRlbmRzIENvbmZpZ0Zvcm1JdGVtXG57XG5cdGNvbnN0cnVjdG9yKGNvbmZpZ1BhcmFtLCBlZGl0RW5hYmxlZCwgaW5EaWFsb2cpXG5cdHtcblx0ICAgIHN1cGVyKGNvbmZpZ1BhcmFtLCBlZGl0RW5hYmxlZCwgaW5EaWFsb2cpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZSB3aWRnZXQgdG8gcmVuZGVyIHRoZSBDb25maWdQYXJhbWV0ZXIgdmFsdWUuXG5cdCAqIElmIHBhcmFtZXRlciBpcyBub3QgZWRpdGFibGUsIGEgc2ltcGxlIGxhYmVsIGlzIHVzZWQuXG5cdCAqIEBvdmVycmlkZVxuXHQgKi9cblx0X2dlbmVyYXRlSW5uZXJXaWRnZXQoKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2RhdGEuZWRpdGFibGUpXG5cdFx0e1xuXHRcdFx0Ly8gU2V0IHdpZGdldCBjb25maWd1cmF0aW9uXG5cdFx0XHRsZXQgY29uZmlnID0ge1xuXHRcdFx0XHRjbGFzczogJ2Zvcm0tY29udHJvbCcsXG5cdFx0XHRcdGlkOiB0aGlzLl9kYXRhLm5hbWUsXG5cdFx0XHRcdG5hbWU6IHRoaXMuX2RhdGEubmFtZSxcblx0XHRcdFx0J2RhdGEtcm9sZSc6ICdkcm9wZG93bmxpc3QnLFxuXHRcdFx0fTtcblxuXHRcdFx0Ly8gU2V0IHdpZGdldCBhdHRyaWJ1dGVzIChzZWUgcGFyZW50IGNsYXNzKVxuXHRcdFx0dGhpcy5fc2V0V2lkZ2V0QXR0cmlidXRlcyhjb25maWcpO1xuXG5cdFx0XHQvLyBTZXQgYWRkaXRpb25hbCB3aWRnZXQgYXR0cmlidXRlcyBiYXNlZCBvbiB2YWxpZGF0aW9uIHJ1bGVzIChzZWUgcGFyZW50IGNsYXNzKVxuXHRcdFx0dGhpcy5fc2V0V2lkZ2V0VmFsaWRhdGlvbkF0dHJpYnV0ZXMoY29uZmlnKTtcblxuXHRcdFx0Ly8gQ3JlYXRlIHdpZGdldCdzIGh0bWxcblx0XHRcdHRoaXMuX3dpZGdldEh0bWwgPSAkKCc8aW5wdXQ+JywgY29uZmlnKTtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5fd2lkZ2V0SHRtbCA9IG5ldyBDb25maWdMYWJlbCgpO1xuXG5cdFx0Ly8gUmV0dXJuIGNvbXBvbmVudFxuXHRcdHJldHVybiB0aGlzLl93aWRnZXRIdG1sO1xuXHR9XG5cblx0LyoqXG5cdCAqIEluaXRpYWxpemUgd2lkZ2V0LlxuXHQgKiBAb3ZlcnJpZGVcblx0ICovXG4gICBfaW5pdGlhbGl6ZSgpXG4gICB7XG5cdCAgIGlmICh0aGlzLl9kYXRhLmVkaXRhYmxlKVxuXHQgICB7XG5cdFx0ICAgLy8gSW5pdGlhbGl6ZSBrZW5kbyB3aWRnZXRcblx0XHQgICBrZW5kby5pbml0KHRoaXMuX3dpZGdldEh0bWwpO1xuXG5cdFx0ICAgLy8gU2F2ZSByZWYuIHRvIHdpZGdldFxuXHRcdCAgIHRoaXMuX2lubmVyV2lkZ2V0ID0gdGhpcy5fd2lkZ2V0SHRtbC5kYXRhKCdrZW5kb0Ryb3BEb3duTGlzdCcpO1xuXG5cdFx0ICAgLy8gU2V0IGxpc3QgaXRlbXNcblx0XHQgICB0aGlzLl9pbm5lcldpZGdldC5zZXREYXRhU291cmNlKHRoaXMuX2dldERhdGFTb3VyY2UodGhpcy5fZGF0YS5kYXRhUHJvdmlkZXIpKVxuXG5cdFx0ICAgLy8gRW5hYmxlIHZhbHVlIGNvbW1pdCBiaW5kaW5nXG5cdFx0ICAgdGhpcy5fd2lkZ2V0SHRtbC5iaW5kKCdjaGFuZ2UnLCAkLnByb3h5KHRoaXMuX29uVmFsdWVJbnB1dCwgdGhpcykpO1xuXHQgICB9XG5cblx0ICAgLy8gUHJvY2VlZCB3aXRoIGluaXRpYWxpemF0aW9uXG5cdCAgIHN1cGVyLl9pbml0aWFsaXplKCk7XG4gICB9XG5cblx0LyoqXG5cdCAqIFNldCB3aWRnZXQncyB2YWx1ZS5cblx0ICogSWYgcGFyYW1ldGVyIGlzIG5vdCBlZGl0YWJsZSwgdGhlIGxhYmVsIHRleHQgaXMgc2V0LlxuXHQgKiBAb3ZlcnJpZGVcblx0ICovXG5cdF9zZXRXaWRnZXRWYWx1ZSgpXG5cdHtcblx0XHRpZiAodGhpcy5fZGF0YS5lZGl0YWJsZSlcblx0XHRcdHRoaXMuX2lubmVyV2lkZ2V0LnZhbHVlKHRoaXMuX2RhdGEudmFsdWUpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMuX3dpZGdldEh0bWwudmFsdWUgPSB0aGlzLl9kYXRhLnZhbHVlO1xuXG5cdFx0Ly8gVHJpZ2dlciBldmVudFxuXHRcdHRoaXMuX3RyaWdnZXJFdmVudCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldCB3aWRnZXQncyBkaXNhYmxlZCBzdGF0ZS5cblx0ICogQG92ZXJyaWRlXG5cdCAqL1xuXHRfc2V0V2lkZ2V0RWRpdEVuYWJsZWQoKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2RhdGEuZWRpdGFibGUpXG5cdFx0XHR0aGlzLl9pbm5lcldpZGdldC53cmFwcGVyLmF0dHIoJ2Rpc2FibGVkJywgIXRoaXMuX2VkaXRFbmFibGVkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBVcGRhdGUgQ29uZmlndXJhdGlvbiBQYXJhbWV0ZXIgdmFsdWUuXG5cdCAqIEBvdmVycmlkZVxuXHQgKi9cblx0X29uVmFsdWVJbnB1dChlKVxuXHR7XG5cdFx0Ly8gVXBkYXRlIENvbmZpZ3VyYXRpb24gUGFyYW1ldGVyIHRvIG5ldyB2YWx1ZVxuXHRcdHRoaXMuX2RhdGEudmFsdWUgPSB0aGlzLl9pbm5lcldpZGdldC52YWx1ZSgpO1xuXG5cdFx0Ly8gVHJpZ2dlciBldmVudFxuXHRcdHRoaXMuX3RyaWdnZXJFdmVudCgpO1xuXHR9XG5cblx0X2dldERhdGFTb3VyY2UoZHBTdHJpbmcpXG5cdHtcblx0XHRpZiAoZHBTdHJpbmcpXG5cdFx0XHRyZXR1cm4gZHBTdHJpbmcuc3BsaXQoJywnKTtcblxuXHRcdC8vIEluIGNhc2UgdGhlIGRhdGFwcm92aWRlciBpcyBlbXB0eSwgYWRkIGF0IGxlYXN0IHRoZSBjdXJyZW50IHZhbHVlXG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIFt0aGlzLl9kYXRhLnZhbHVlXTtcblx0fVxufVxuXG4vLyBERUZJTkUgQ09NUE9ORU5UXG5pZiAoIXdpbmRvdy5jdXN0b21FbGVtZW50cy5nZXQoJ2NvbmZpZy1kcm9wLWRvd24tbGlzdCcpKVxuXHR3aW5kb3cuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdjb25maWctZHJvcC1kb3duLWxpc3QnLCBDb25maWdEcm9wRG93bkxpc3QpO1xuIiwiaW1wb3J0IHtDb25maWdGb3JtSXRlbX0gZnJvbSAnLi9jb25maWctZm9ybS1pdGVtJztcbmltcG9ydCB7Q29uZmlnTGFiZWx9IGZyb20gJy4vY29uZmlnLWxhYmVsJztcblxuZXhwb3J0IGNsYXNzIENvbmZpZ0R1YWxMaXN0IGV4dGVuZHMgQ29uZmlnRm9ybUl0ZW1cbntcblx0Y29uc3RydWN0b3IoY29uZmlnUGFyYW0sIGVkaXRFbmFibGVkLCBpbkRpYWxvZylcblx0e1xuXHQgICAgc3VwZXIoY29uZmlnUGFyYW0sIGVkaXRFbmFibGVkLCBpbkRpYWxvZyk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlIHdpZGdldCB0byByZW5kZXIgdGhlIENvbmZpZ1BhcmFtZXRlci5cblx0ICogQG92ZXJyaWRlXG5cdCAqL1xuXHRfZ2VuZXJhdGVJbm5lcldpZGdldCgpXG5cdHtcblx0XHR0aGlzLl93aWRnZXRIdG1sID0gJCgnPGRpdj4nKTtcblxuXHRcdGNvbnN0IGF2YWlsYWJsZUlkID0gdGhpcy5fZ2V0SWQodGhpcy5fZGF0YS5uYW1lLCAnYXZhaWxhYmxlJyk7XG5cdFx0Y29uc3Qgc2VsZWN0ZWRJZCA9IHRoaXMuX2dldElkKHRoaXMuX2RhdGEubmFtZSwgJ3NlbGVjdGVkJyk7XG5cblx0XHQvLyBDcmVhdGUgaGVhZGVyIGZvciBsYWJlbHNcblx0XHRsZXQgaGVhZGVyID0gJCgnPGRpdj4nLCB7Y2xhc3M6ICdmb3JtLWxhYmVsLWNvbnRhaW5lciBkdWFsLWxpc3QtbGFiZWxzJ30pO1xuXG5cdFx0aGVhZGVyLmFwcGVuZCgkKCc8bGFiZWw+Jywge1xuXHRcdFx0Y2xhc3M6ICdmb250LWl0YWxpYyBmb3JtLWxhYmVsIGR1YWwtbGlzdC1sZWZ0LWNvbCcgKyAoIXRoaXMuX2RhdGEuZWRpdGFibGUgPyAnIG5vLWludGVyYWN0JyA6ICcnKSxcblx0XHRcdGZvcjogYXZhaWxhYmxlSWQsXG5cdFx0fSkudGV4dCgnQXZhaWxhYmxlJykpO1xuXG5cdFx0aGVhZGVyLmFwcGVuZCgkKCc8bGFiZWw+Jywge1xuXHRcdFx0Y2xhc3M6ICdmb250LWl0YWxpYyBmb250LXdlaWdodC1ib2xkIGZvcm0tbGFiZWwgZHVhbC1saXN0LXJpZ2h0LWNvbCcgKyAoIXRoaXMuX2RhdGEuZWRpdGFibGUgPyAnIG5vLWludGVyYWN0JyA6ICcnKSxcblx0XHRcdGZvcjogc2VsZWN0ZWRJZCxcblx0XHR9KS50ZXh0KCdTZWxlY3RlZCcpKTtcblxuXHRcdHRoaXMuX3dpZGdldEh0bWwuYXBwZW5kKGhlYWRlcik7XG5cblx0XHQvLyBBZGQgYXZhaWxhYmxlIGl0ZW1zIGxpc3Rcblx0XHR0aGlzLl9hdmFpbGFibGVMaXN0SHRtbCA9ICQoJzxzZWxlY3Q+Jywge1xuXHRcdFx0aWQ6IGF2YWlsYWJsZUlkLFxuXHRcdFx0Y2xhc3M6ICdkdWFsLWxpc3QtbGVmdC1jb2wnICsgKCF0aGlzLl9kYXRhLmVkaXRhYmxlID8gJyBuby1pbnRlcmFjdCcgOiAnJyksXG5cdFx0fSk7XG5cdFx0dGhpcy5fd2lkZ2V0SHRtbC5hcHBlbmQodGhpcy5fYXZhaWxhYmxlTGlzdEh0bWwpO1xuXG5cdFx0Ly8gQWRkIHNlbGVjdGVkIGl0ZW1zIGxpc3Rcblx0XHR0aGlzLl9zZWxlY3RlZExpc3RIdG1sID0gJCgnPHNlbGVjdD4nLCB7XG5cdFx0XHRpZDogc2VsZWN0ZWRJZCxcblx0XHRcdGNsYXNzOiAnZHVhbC1saXN0LXJpZ2h0LWNvbCcgKyAoIXRoaXMuX2RhdGEuZWRpdGFibGUgPyAnIG5vLWludGVyYWN0JyA6ICcnKSxcblx0XHR9KTtcblx0XHR0aGlzLl93aWRnZXRIdG1sLmFwcGVuZCh0aGlzLl9zZWxlY3RlZExpc3RIdG1sKTtcblxuXHRcdC8vIFJldHVybiBjb21wb25lbnRcblx0XHRyZXR1cm4gdGhpcy5fd2lkZ2V0SHRtbDtcblx0fVxuXG5cdC8vIElEcyBjb250YWluaW5nIGEgXCIuXCIgY2F1c2UgaXNzdWVzIHRvIGNvbm5lY3RlZCBsaXN0c1xuXHRfZ2V0SWQobmFtZSwgc3VmZml4KVxuXHR7XG5cdFx0cmV0dXJuIG5hbWUucmVwbGFjZSgnLicsICdfJykgKyAnLScgKyBzdWZmaXg7XG5cdH1cblxuXHQvKipcblx0ICogSW5pdGlhbGl6ZSB3aWRnZXQuXG5cdCAqIEBvdmVycmlkZVxuXHQgKi9cblx0X2luaXRpYWxpemUoKVxuXHR7XG5cdFx0Ly8gSW5pdGlhbGl6ZSBcImF2YWxhYmxlXCIgbGlzdGJveFxuXHRcdHRoaXMuX2F2YWlsYWJsZUxpc3QgPSB0aGlzLl9hdmFpbGFibGVMaXN0SHRtbC5rZW5kb0xpc3RCb3goe1xuICAgICAgICAgICAgY29ubmVjdFdpdGg6IHRoaXMuX2dldElkKHRoaXMuX2RhdGEubmFtZSwgJ3NlbGVjdGVkJyksXG4gICAgICAgICAgICB0b29sYmFyOiB7XG4gICAgICAgICAgICAgICAgdG9vbHM6IHRoaXMuX2RhdGEuZWRpdGFibGUgPyBbJ3RyYW5zZmVyVG8nLCAndHJhbnNmZXJGcm9tJywgJ3RyYW5zZmVyQWxsVG8nLCAndHJhbnNmZXJBbGxGcm9tJ10gOiBbXVxuICAgICAgICAgICAgfSxcblx0XHRcdHRlbXBsYXRlOiBcIjxkaXY+Izp2YWx1ZSM8L2Rpdj5cIixcblx0XHRcdHNlbGVjdGFibGU6ICdtdWx0aXBsZScsXG4gICAgICAgIH0pLmRhdGEoJ2tlbmRvTGlzdEJveCcpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBcInNlbGVjdGVkXCIgbGlzdGJveFxuICAgICAgICB0aGlzLl9zZWxlY3RlZExpc3QgPSB0aGlzLl9zZWxlY3RlZExpc3RIdG1sLmtlbmRvTGlzdEJveCh7XG5cdFx0XHR0ZW1wbGF0ZTogXCI8ZGl2PiM6dmFsdWUjPC9kaXY+XCIsXG5cdFx0XHRzZWxlY3RhYmxlOiAnbXVsdGlwbGUnLFxuXHRcdFx0Ly8gVGhlIGZvbGxvd2luZyBsaXN0ZW5lcnMgY2FuJ3QgYmUgdXNlZCBiZWNhdXNlIGV2ZW50cyBhcmUgZmlyZWQgYmVmb3JlIHRoZSBkYXRhc291cmNlIGlzIGFjdHVhbGx5IHVwZGF0ZWRcblx0XHRcdC8vIFdlIGhhdmUgdG8gdXNlIGEgY2hhbmdlIGV2ZW50IGxpc3RlbmVyIG9uIHRoZSBkYXRhc291cmNlIChzZWUgYmVsb3cpLCBldmVuIGlmIG5vdCBvcHRpbWFsXG5cdFx0XHQvL2FkZDogJC5wcm94eSh0aGlzLl9vblZhbHVlSW5wdXQsIHRoaXMpLFxuXHRcdFx0Ly9yZW1vdmU6ICQucHJveHkodGhpcy5fb25WYWx1ZUlucHV0LCB0aGlzKSxcblx0XHR9KS5kYXRhKCdrZW5kb0xpc3RCb3gnKTtcblxuXHRcdC8vIFByb2NlZWQgd2l0aCBpbml0aWFsaXphdGlvblxuXHRcdHN1cGVyLl9pbml0aWFsaXplKCk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0IHdpZGdldCdzIGRhdGFzb3VyY2UuXG5cdCAqIEBvdmVycmlkZVxuXHQgKi9cblx0X3NldFdpZGdldFZhbHVlKClcblx0e1xuXHRcdGxldCBhdmFpbGFibGVBcnIgPSB0aGlzLl9kYXRhLmRhdGFQcm92aWRlciAhPSAnJyA/IHRoaXMuX2RhdGEuZGF0YVByb3ZpZGVyLnNwbGl0KCcsJykgOiBbXTtcblx0XHRsZXQgc2VsZWN0ZWRBcnIgPSB0aGlzLl9kYXRhLnZhbHVlICE9ICcnID8gdGhpcy5fZGF0YS52YWx1ZS5zcGxpdCgnLCcpIDogW107XG5cblx0XHQvLyBSZW1vdmUgc2VsZWN0ZWQgdmFsdWVzIGZyb20gYXZhaWxhYmxlIHZhbHVlc1xuXHRcdGlmIChzZWxlY3RlZEFyci5sZW5ndGggPiAwKVxuXHRcdHtcblx0XHRcdGxldCB0ZW1wID0gW107XG5cblx0XHRcdGZvciAobGV0IHZhbCBvZiBhdmFpbGFibGVBcnIpXG5cdFx0XHR7XG5cdFx0XHRcdGlmIChzZWxlY3RlZEFyci5pbmRleE9mKHZhbCkgPT0gLTEpXG5cdFx0XHRcdFx0dGVtcC5wdXNoKHZhbCk7XG5cdFx0XHR9XG5cblx0XHRcdGF2YWlsYWJsZUFyciA9IHRlbXA7XG5cdFx0fVxuXG5cdFx0Ly8gQ29udmVydCBsaXN0cyBvZiBzdHJpbmdzIHRvIGxpc3RzIG9mIG9iamVjdHNcblx0XHRsZXQgYXZhaWxhYmxlVmFsdWVzID0gW107XG5cdFx0Zm9yIChsZXQgdmFsIG9mIGF2YWlsYWJsZUFycilcblx0XHRcdGF2YWlsYWJsZVZhbHVlcy5wdXNoKHt2YWx1ZTogdmFsfSk7XG5cblx0XHRsZXQgc2VsZWN0ZWRWYWx1ZXMgPSBbXTtcblx0XHRmb3IgKGxldCB2YWwgb2Ygc2VsZWN0ZWRBcnIpXG5cdFx0XHRzZWxlY3RlZFZhbHVlcy5wdXNoKHt2YWx1ZTogdmFsfSk7XG5cblx0XHQvLyBDbGVhciBzZWxlY3Rpb25cblx0XHR0aGlzLl9hdmFpbGFibGVMaXN0LmNsZWFyU2VsZWN0aW9uKCk7XG5cdFx0dGhpcy5fc2VsZWN0ZWRMaXN0LmNsZWFyU2VsZWN0aW9uKCk7XG5cblx0XHQvLyBTZXQgZGF0YXNvdXJjZXNcblx0XHR0aGlzLl9hdmFpbGFibGVMaXN0LnNldERhdGFTb3VyY2UobmV3IGtlbmRvLmRhdGEuRGF0YVNvdXJjZSh7XG5cdFx0XHRkYXRhOiBhdmFpbGFibGVWYWx1ZXNcblx0XHR9KSk7XG5cblx0XHR0aGlzLl9zZWxlY3RlZExpc3Quc2V0RGF0YVNvdXJjZShuZXcga2VuZG8uZGF0YS5EYXRhU291cmNlKHtcblx0XHRcdGRhdGE6IHNlbGVjdGVkVmFsdWVzLFxuXHRcdFx0Ly8gV2UgbGlzdGVuIHRvIHRoZSBjaGFuZ2UgZXZlbnQgaW5zdGVhZCBvZiB0aGUgYWRkL3JlbW92ZSBldmVudHMgb24gdGhlIGxpc3Rib3gsIGJlY2F1c2UgdGhvc2UgYXJlIGZpcmVkIGJlZm9yZSB0aGUgZGF0YXNvdXJjZSBpcyB1cGRhdGVkXG5cdFx0XHQvLyBUaGlzIGlzIG5vdCBvcHRpbWFsIGJlY2F1c2UgdGhlIGV2ZW50IGlzIGZpcmVkIGZvciBlYWNoIGl0ZW0gYWRkZWQgdG8gb3IgcmVtb3ZlZCBmcm9tIHRoZSBkYXRhc291cmNlXG5cdFx0XHRjaGFuZ2U6ICQucHJveHkodGhpcy5fb25WYWx1ZUlucHV0LCB0aGlzKVxuXHRcdH0pKTtcblxuXHRcdC8vIERpc2FibGUgZWRpdGluZ1xuXHRcdGlmICghdGhpcy5fZGF0YS5lZGl0YWJsZSlcblx0XHR7XG5cdFx0XHR0aGlzLl9hdmFpbGFibGVMaXN0LmVuYWJsZSgnLmstaXRlbScsIGZhbHNlKTtcblx0XHRcdHRoaXMuX3NlbGVjdGVkTGlzdC5lbmFibGUoJy5rLWl0ZW0nLCBmYWxzZSk7XG5cdFx0fVxuXG5cdFx0Ly8gVHJpZ2dlciBldmVudFxuXHRcdHRoaXMuX3RyaWdnZXJFdmVudCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldCB3aWRnZXQncyBkaXNhYmxlZCBzdGF0ZS5cblx0ICogQG92ZXJyaWRlXG5cdCAqL1xuXHRfc2V0V2lkZ2V0RWRpdEVuYWJsZWQoKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2RhdGEuZWRpdGFibGUpXG5cdFx0e1xuXHRcdFx0Ly8gQ2xlYXIgc2VsZWN0aW9uXG5cdFx0XHR0aGlzLl9hdmFpbGFibGVMaXN0LmNsZWFyU2VsZWN0aW9uKCk7XG5cdFx0XHR0aGlzLl9zZWxlY3RlZExpc3QuY2xlYXJTZWxlY3Rpb24oKTtcblxuXHRcdFx0Ly8gRW5hYmxlL2Rpc2FibGUgbGlzdHNcblx0XHRcdHRoaXMuX2F2YWlsYWJsZUxpc3Qud3JhcHBlci5hdHRyKCdkaXNhYmxlZCcsICF0aGlzLl9lZGl0RW5hYmxlZCk7XG5cdFx0XHR0aGlzLl9zZWxlY3RlZExpc3Qud3JhcHBlci5hdHRyKCdkaXNhYmxlZCcsICF0aGlzLl9lZGl0RW5hYmxlZCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFVwZGF0ZSBDb25maWd1cmF0aW9uIFBhcmFtZXRlciB2YWx1ZS5cblx0ICogQG92ZXJyaWRlXG5cdCAqL1xuXHRfb25WYWx1ZUlucHV0KGUpXG5cdHtcblx0XHRsZXQgbGlzdERhdGEgPSB0aGlzLl9zZWxlY3RlZExpc3QuZGF0YVNvdXJjZS5kYXRhKCk7XG5cblx0XHQvLyBVcGRhdGUgQ29uZmlndXJhdGlvbiBQYXJhbWV0ZXIgdG8gbmV3IHZhbHVlXG5cdFx0dGhpcy5fZGF0YS52YWx1ZSA9IGxpc3REYXRhLm1hcChlID0+IGUudmFsdWUpLmpvaW4oJywnKTtcblxuXHRcdC8vIFRyaWdnZXIgZXZlbnRcblx0XHR0aGlzLl90cmlnZ2VyRXZlbnQoKTtcblx0fVxufVxuXG4vLyBERUZJTkUgQ09NUE9ORU5UXG5pZiAoIXdpbmRvdy5jdXN0b21FbGVtZW50cy5nZXQoJ2NvbmZpZy1kdWFsLWxpc3QnKSlcblx0d2luZG93LmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnY29uZmlnLWR1YWwtbGlzdCcsIENvbmZpZ0R1YWxMaXN0KTtcbiIsImV4cG9ydCBjbGFzcyBDb25maWdGb3JtSXRlbSBleHRlbmRzIEhUTUxFbGVtZW50XG57XG5cdGNvbnN0cnVjdG9yKGNvbmZpZ1BhcmFtLCBlZGl0RW5hYmxlZCwgaW5EaWFsb2cpXG5cdHtcblx0ICAgIHN1cGVyKCk7XG5cblx0XHR0aGlzLmlkID0gJ2Zvcm0taXRlbS0nICsgY29uZmlnUGFyYW0ubmFtZTtcblx0XHR0aGlzLl9lZGl0RW5hYmxlZCA9IGVkaXRFbmFibGVkO1xuXHRcdHRoaXMuX2RhdGEgPSBjb25maWdQYXJhbTtcblxuXHRcdC8vIENyZWF0ZSBmb3JtIGl0ZW0gdmlld1xuXHRcdHRoaXMuX2J1aWxkVmlldyhpbkRpYWxvZyk7XG5cblx0XHQvLyBJbml0aWFsaXplIGZvcm0gaXRlbVxuXHRcdHRoaXMuX2luaXRpYWxpemUoKTtcblx0fVxuXG5cdGNvbm5lY3RlZENhbGxiYWNrKClcblx0e1xuXHRcdC8vIFRyaWdnZXIgZXZlbnRcblx0XHQvLyBOT1RFOiB3aGVuIGEgQ29uZmlnRm9ybUl0ZW0gaXMgaW5zdGFudGlhdGVkLCB0aGUgX3RyaWdnZXJFdmVudCBtZXRob2QgaXMgY2FsbGVkIGFzIHNvb24gYXMgaXRzIHZhbHVlIGlzIHNldC5cblx0XHQvLyBXaGVuIHRoaXMgaGFwcGVuc28sIGR1ZSB0byB0aGUgZmFjdCB0aGF0IHRoZSBvYmplY3QgaXMgbm90IHlldCBpbiB0aGUgRE9NLCB0aGUgZXZlbnQgaXMgbm90IGNhdGNoZWQgYnkgdGhlIGxpc3RlbmVyXG5cdFx0Ly8gKHdoaWNoIGlzIGF0dGFjaGVkIHRvIHRoZSBvdXRlciBjb250YWluZXIpLiBTbyBmb3JjaW5nIHRoZSBldmVudCB0byB0cmlnZ2VyIGFnYWluIGFzIHNvb24gYXMgdGhlIENvbmZpZ0Zvcm1JdGVtXG5cdFx0Ly8gaXMgYXBwZW5kZWQgdG8gdGhlIERPTSBpcyBuZWVkZWQuXG5cdFx0dGhpcy5fdHJpZ2dlckV2ZW50KCk7XG5cdH1cblxuXHRzZXQgZGF0YShjb25maWdQYXJhbSlcblx0e1xuXHRcdHRoaXMuX2RhdGEgPSBjb25maWdQYXJhbTtcblx0XHR0aGlzLl9zZXRXaWRnZXRWYWx1ZSgpO1xuXHR9XG5cblx0Z2V0IGRhdGEoKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2RhdGE7XG5cdH1cblxuXHRzZXQgZWRpdEVuYWJsZWQoZW5hYmxlKVxuXHR7XG5cdFx0aWYgKGVuYWJsZSAhPSB0aGlzLl9lZGl0RW5hYmxlZClcblx0XHR7XG5cdFx0XHR0aGlzLl9lZGl0RW5hYmxlZCA9IGVuYWJsZTtcblx0XHRcdHRoaXMuX3NldFdpZGdldEVkaXRFbmFibGVkKCk7XG5cdFx0fVxuXHR9XG5cblx0Z2V0IGVkaXRFbmFibGVkKClcblx0e1xuXHRcdHJldHVybiB0aGlzLl9lZGl0RW5hYmxlZDtcblx0fVxuXG5cdF9idWlsZFZpZXcoaXNJbnNpZGVEaWFsb2cpXG5cdHtcblx0XHRpZiAoIWlzSW5zaWRlRGlhbG9nKVxuXHRcdHtcblx0XHRcdC8vIFNldCBhZGRpdGlvbmFsIGNsYXNzZXMgZm9yIGlubmVyIHdpZGdldFxuXHRcdFx0bGV0IGNsYXNzTmFtZXMgPSAnJztcblxuXHRcdFx0c3dpdGNoICh0aGlzLl9kYXRhLnR5cGUpXG5cdFx0XHR7XG5cdFx0XHRcdGNhc2UgJ0R1YWxMaXN0Jzpcblx0XHRcdFx0XHRjbGFzc05hbWVzID0gJ2NvbC1zbS03IGNvbC1sZy04Jztcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnRGF0YUdyaWQnOlxuXHRcdFx0XHRcdGNsYXNzTmFtZXMgPSAnY29sLXNtJzsgLy8gVXNlICdjb2wtc20tNyBjb2wtbGctOCcgZm9yIERhdGFHcmlkIHRvbz9cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRjbGFzc05hbWVzID0gJ2NvbC1zbS1hdXRvJztcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBHZW5lcmF0ZSBib2lsZXJwbGF0ZSBodG1sLCBzdXJyb3VuZGluZyB0aGUgYWN0dWFsIHdpZGdldCAobGFiZWwsIG51bWVyaWMgc3RlcHBlciwgZXRjKVxuXHRcdFx0dGhpcy5pbm5lckhUTUwgPSBgXG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHBvc2l0aW9uLXJlbGF0aXZlIHJvd1wiPlxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJjb2wtc20tNSBjb2wtbGctNCBjb2wtZm9ybS1sYWJlbCBmb3JtLWxhYmVsLWNvbnRhaW5lclwiPlxuXHRcdFx0XHRcdFx0PGxhYmVsIGZvcj1cIiR7dGhpcy5fZGF0YS5uYW1lfVwiIGNsYXNzPVwiZm9ybS1sYWJlbCAkeyh0aGlzLl9kYXRhLmNsaWVudE9ubHkgPyAnY2xpZW50LW9ubHknIDogJycpfVwiPiR7dGhpcy5fZGF0YS5sYWJlbH0gPGkgY2xhc3M9XCJmYXMgZmEtcXVlc3Rpb24tY2lyY2xlIHRleHQtbXV0ZWQgaGVscFwiIHRpdGxlPVwiJHt0aGlzLl9kYXRhLnRvb2x0aXB9XCI+PC9pPjwvbGFiZWw+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cImlubmVyLXdpZGdldCBhbGlnbi1zZWxmLWNlbnRlciAke2NsYXNzTmFtZXN9XCI+XG5cdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImstaW52YWxpZC1tc2dcIiBkYXRhLWZvcj1cIiR7dGhpcy5fZGF0YS5uYW1lfVwiPjwvc3Bhbj5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHRgO1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0dGhpcy5pbm5lckhUTUwgPSBgXG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHBvc2l0aW9uLXJlbGF0aXZlXCI+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cImNvbC1mb3JtLWxhYmVsIGZvcm0tbGFiZWwtY29udGFpbmVyXCI+XG5cdFx0XHRcdFx0XHQ8bGFiZWwgZm9yPVwiJHt0aGlzLl9kYXRhLm5hbWV9XCIgY2xhc3M9XCJmb3JtLWxhYmVsICR7KHRoaXMuX2RhdGEuY2xpZW50T25seSA/ICdjbGllbnQtb25seScgOiAnJyl9XCI+JHt0aGlzLl9kYXRhLmxhYmVsfSA8aSBjbGFzcz1cImZhcyBmYS1xdWVzdGlvbi1jaXJjbGUgdGV4dC1tdXRlZCBoZWxwXCIgdGl0bGU9XCIke3RoaXMuX2RhdGEudG9vbHRpcH1cIj48L2k+PC9sYWJlbD5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiaW5uZXItd2lkZ2V0XCI+XG5cdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImstaW52YWxpZC1tc2dcIiBkYXRhLWZvcj1cIiR7dGhpcy5fZGF0YS5uYW1lfVwiPjwvc3Bhbj5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHRgO1xuXHRcdH1cblxuXHRcdC8vIENyZWF0ZSBpbm5lciB3aWRnZXQgKG11c3QgYmUgb3ZlcnJpZGRlbilcblx0XHRsZXQgd2lkZ2V0ID0gdGhpcy5fZ2VuZXJhdGVJbm5lcldpZGdldCgpO1xuXG5cdFx0Ly8gQXBwZW5kIGlubmVyIHdpZGdldFxuXHRcdCQodGhpcykuZmluZCgnLmlubmVyLXdpZGdldCcpLnByZXBlbmQod2lkZ2V0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUTyBCRSBPVkVSUklEREVOXG5cdCAqL1xuXHRfZ2VuZXJhdGVJbm5lcldpZGdldCgpXG5cdHtcblx0XHQvLyBTaG93IGFuIGVycm9yLCBzaG91bGQgYmUgb3ZlcnJpZGRlblxuXHRcdGNvbnNvbGUuZXJyb3IoYFVuYWJsZSB0byBjcmVhdGUgJHt0aGlzLl9kYXRhLnR5cGV9IGZvcm0gaXRlbSBmb3IgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgJHt0aGlzLmlkfWApO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldCBhdHRyaWJ1dGVzIG9uIHRoZSB3aWRnZXQgY29uZmlndXJhdGlvbiBvYmplY3QuXG5cdCAqL1xuXHRfc2V0V2lkZ2V0QXR0cmlidXRlcyhjb25maWcpXG5cdHtcblx0XHRjb25zdCBhdHRyaWJzID0gdGhpcy5fZGF0YS5hdHRyaWJ1dGVzO1xuXG5cdFx0aWYgKGF0dHJpYnMpXG5cdFx0e1xuXHRcdFx0Zm9yIChsZXQgYXR0ciBpbiBhdHRyaWJzKVxuXHRcdFx0e1xuXHRcdFx0XHRjb25maWdbYXR0cl0gPSBhdHRyaWJzW2F0dHJdO1xuXG5cdFx0XHRcdGlmIChhdHRyID09ICdwYXR0ZXJuJylcblx0XHRcdFx0XHRjb25maWdbJ2RhdGEtcGF0dGVybi1tc2cnXSA9ICdDb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMnO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTZXQgYWRkaXRpb25hbCBhdHRyaWJ1dGVzIG9uIHRoZSB3aWRnZXQgY29uZmlndXJhdGlvbiBvYmplY3QgdG8gcHJvcGVybHkgdmFsaWRhdGUgaW5wdXQuXG5cdCAqL1xuXHRfc2V0V2lkZ2V0VmFsaWRhdGlvbkF0dHJpYnV0ZXMoY29uZmlnKVxuXHR7XG5cdFx0Y29uc3QgdmFsID0gdGhpcy5fZGF0YS52YWxpZGF0b3I7XG5cblx0XHRpZiAodmFsICE9IG51bGwgJiYgdmFsICE9ICcnKVxuXHRcdHtcblx0XHRcdGlmICh2YWwgPT0gJ2lwJylcblx0XHRcdHtcblx0XHRcdFx0Y29uZmlnWydwYXR0ZXJuJ10gPSAnXigyNVswLTVdfDJbMC00XVswLTldfFswMV0/WzAtOV1bMC05XT8pXFwuKDI1WzAtNV18MlswLTRdWzAtOV18WzAxXT9bMC05XVswLTldPylcXC4oMjVbMC01XXwyWzAtNF1bMC05XXxbMDFdP1swLTldWzAtOV0/KVxcLigyNVswLTVdfDJbMC00XVswLTldfFswMV0/WzAtOV1bMC05XT8pJCc7XG5cdFx0XHRcdGNvbmZpZ1snZGF0YS1wYXR0ZXJuLW1zZyddID0gJ0ludmFsaWQgSVAgYWRkcmVzcyc7XG5cdFx0XHRcdGNvbmZpZ1sncmVxdWlyZWQnXSA9IHRydWU7XG5cdFx0XHRcdGNvbmZpZ1snZGF0YS1yZXF1aXJlZC1tc2cnXSA9ICdSZXF1aXJlZCc7XG5cdFx0XHR9XG5cblx0XHRcdGVsc2UgaWYgKHZhbCA9PSAnbm90TnVsbCcpXG5cdFx0XHR7XG5cdFx0XHRcdGNvbmZpZ1sncmVxdWlyZWQnXSA9IHRydWU7XG5cdFx0XHRcdGNvbmZpZ1snZGF0YS1yZXF1aXJlZC1tc2cnXSA9ICdSZXF1aXJlZCc7XG5cdFx0XHR9XG5cblx0XHRcdGVsc2UgaWYgKHZhbCA9PSAncHdkJylcblx0XHRcdHtcblx0XHRcdFx0Y29uZmlnWydwYXR0ZXJuJ10gPSAnXi57Nix9JCc7XG5cdFx0XHRcdGNvbmZpZ1snZGF0YS1wYXR0ZXJuLW1zZyddID0gJ01pbmltdW0gbGVuZ3RoOiA2IGNoYXJhY3RlcnMnO1xuXHRcdFx0fVxuXG5cdFx0XHRlbHNlIGlmICh2YWwgPT0gJ3Bvc051bScpXG5cdFx0XHR7XG5cdFx0XHRcdGNvbmZpZ1sncGF0dGVybiddID0gJ15bMC05XVxcZCokJztcblx0XHRcdFx0Y29uZmlnWydkYXRhLXBhdHRlcm4tbXNnJ10gPSAnTm9uLW5lZ2F0aXZlIG51bWJlciByZXF1aXJlZCc7XG5cdFx0XHR9XG5cblx0XHRcdGVsc2UgaWYgKHZhbCA9PSAnYW9pJylcblx0XHRcdHtcblx0XHRcdFx0Ly8gTm90aGluZyB0byBkb1xuXHRcdFx0XHQvLyBTZWUgS2VuZG8gdmFsaWRhdGlvbiBpbml0aWFsaXphdGlvbiBpbiBjb25maWctaW50ZXJmYWNlLWJ1aWxkZXIuanNcblx0XHRcdH1cblxuXHRcdFx0ZWxzZSBpZiAodmFsID09ICd1cmwnKVxuXHRcdFx0e1xuXHRcdFx0XHRjb25maWdbJ3R5cGUnXSA9ICd1cmwnO1xuXHRcdFx0XHRjb25maWdbJ2RhdGEtdXJsLW1zZyddID0gJ0ludmFsaWQgVVJMJztcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogSW5pdGlhbGl6ZSBmb3JtIGl0ZW0uXG5cdCAqXG5cdCAqIE5PVEU6IG11c3QgYmUgb3ZlcnJpZGRlbiBpZiBpbm5lciB3aWRnZXQgcmVxdWlyZXMgc3BlY2lhbCBpbml0aWFsaXphdGlvbiAoZm9yIGV4YW1wbGUgS2VuZG8gd2lkZ2V0cylcblx0ICovXG5cdF9pbml0aWFsaXplKClcblx0e1xuXHRcdC8vIFNldCB2YWx1ZVxuIFx0ICAgdGhpcy5fc2V0V2lkZ2V0VmFsdWUoKTtcblxuIFx0ICAgLy8gU2V0IGVkaXQgZW5hYmxlZFxuIFx0ICAgdGhpcy5fc2V0V2lkZ2V0RWRpdEVuYWJsZWQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUTyBCRSBPVkVSUklEREVOXG5cdCAqL1xuXHRfc2V0V2lkZ2V0VmFsdWUoKVxuXHR7XG5cdFx0Ly8gTm90aGluZyB0byBkbywgbXVzdCBiZSBvdmVycmlkZGVuXG5cdH1cblxuXHQvKipcblx0ICogVE8gQkUgT1ZFUlJJRERFTlxuXHQgKi9cblx0X3NldFdpZGdldEVkaXRFbmFibGVkKClcblx0e1xuXHRcdC8vIE5vdGhpbmcgdG8gZG8sIG11c3QgYmUgb3ZlcnJpZGRlblxuXHR9XG5cblx0LyoqXG5cdCAqIFRPIEJFIE9WRVJSSURERU5cblx0ICovXG5cdF9vblZhbHVlSW5wdXQoZSlcblx0e1xuXHRcdC8vIE5vdGhpbmcgdG8gZG8sIG11c3QgYmUgb3ZlcnJpZGRlblxuXHR9XG5cblx0X3RyaWdnZXJFdmVudCgpXG5cdHtcblx0XHRpZiAodGhpcy5fZGF0YS50cmlnZ2VyKVxuXHRcdHtcblx0XHRcdGxldCBldmVudCA9IG5ldyBDdXN0b21FdmVudCgndmFsdWUtc2V0Jywge2RldGFpbDogbnVsbCwgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZX0pO1xuXHRcdFx0dGhpcy5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcblx0XHR9XG5cdH1cbn1cblxuLy8gREVGSU5FIENPTVBPTkVOVFxuaWYgKCF3aW5kb3cuY3VzdG9tRWxlbWVudHMuZ2V0KCdjb25maWctZm9ybS1pdGVtJykpXG5cdHdpbmRvdy5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ2NvbmZpZy1mb3JtLWl0ZW0nLCBDb25maWdGb3JtSXRlbSk7XG4iLCJpbXBvcnQge0NvbmZpZ0Zvcm1JdGVtfSBmcm9tICcuL2NvbmZpZy1mb3JtLWl0ZW0nO1xuaW1wb3J0IHtDb25maWdMYWJlbH0gZnJvbSAnLi9jb25maWctbGFiZWwnO1xuaW1wb3J0IHtMaXN0SXRlbUVkaXRvcn0gZnJvbSAnLi93aWRnZXRzL2xpc3QtaXRlbS1lZGl0b3InO1xuXG5leHBvcnQgY2xhc3MgQ29uZmlnR3JpZCBleHRlbmRzIENvbmZpZ0Zvcm1JdGVtXG57XG5cdGNvbnN0cnVjdG9yKGNvbmZpZ1BhcmFtLCBlZGl0RW5hYmxlZCwgaW5EaWFsb2cpXG5cdHtcblx0ICAgIHN1cGVyKGNvbmZpZ1BhcmFtLCBlZGl0RW5hYmxlZCwgaW5EaWFsb2cpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZSB3aWRnZXQgdG8gcmVuZGVyIHRoZSBDb25maWdQYXJhbWV0ZXIuXG5cdCAqIEBvdmVycmlkZVxuXHQgKi9cblx0X2dlbmVyYXRlSW5uZXJXaWRnZXQoKVxuXHR7XG5cdFx0Ly8gQ3JlYXRlIG1haW4gd2lkZ2V0J3MgaHRtbFxuXHRcdHRoaXMuX3dpZGdldEh0bWwgPSAkKCc8ZGl2PicsIHtjbGFzczogJyd9KTtcblxuXHRcdC8vIFNldCBncmlkIHdpZGdldCBjb25maWd1cmF0aW9uXG5cdFx0bGV0IGdyaWRDb25maWcgPSB7XG5cdFx0XHRpZDogdGhpcy5fZGF0YS5uYW1lLFxuXHRcdFx0bmFtZTogdGhpcy5fZGF0YS5uYW1lLFxuXHRcdFx0Y2xhc3M6ICdsaW1pdGVkLWhlaWdodCcgKyAoIXRoaXMuX2RhdGEuZWRpdGFibGUgPyAnIG5vLWludGVyYWN0JyA6ICcnKVxuXHRcdH07XG5cblx0XHQvLyBBcHBlbmQgZ3JpZCB0byBtYWluIGh0bWw7IGdyaWQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gS2VuZG8gd2lkZ2V0IGR1cmluZyBpbml0aWFsaXphdGlvblxuXHRcdHRoaXMuX3dpZGdldEh0bWwuYXBwZW5kKCQoJzxkaXY+JywgZ3JpZENvbmZpZykpO1xuXG5cdFx0aWYgKHRoaXMuX2RhdGEuZWRpdGFibGUpXG5cdFx0e1xuXHRcdFx0Ly8gQlVUVE9OU1xuXG5cdFx0XHQvLyBDcmVhdGUgYnV0dG9ucyBjb250YWluZXJcblx0XHRcdGxldCBidXR0b25zID0gJCgnPGRpdj4nLCB7Y2xhc3M6ICdtdC0yIHRleHQtcmlnaHQnfSk7XG5cblx0XHRcdC8vIEFwcGVuZCBidXR0b25zIHRvIGNvbnRhaW5lclxuXHRcdFx0dGhpcy5fYWRkQnV0dG9uID0gJCgnPGJ1dHRvbj4nLCB7dHlwZTogJ2J1dHRvbicsIGNsYXNzOiAnay1idXR0b24gay1zZWNvbmRhcnknLCB0aXRsZTogJ0FkZCd9KS5hcHBlbmQoJCgnPGkgY2xhc3M9XCJmYXMgZmEtcGx1c1wiPjwvaT4nKSk7XG5cdFx0XHR0aGlzLl9lZGl0QnV0dG9uID0gJCgnPGJ1dHRvbj4nLCB7dHlwZTogJ2J1dHRvbicsIGNsYXNzOiAnay1idXR0b24gay1zZWNvbmRhcnkgbWwtMicsIHRpdGxlOiAnRWRpdCcsIGRpc2FibGVkOiB0cnVlfSkuYXBwZW5kKCQoJzxpIGNsYXNzPVwiZmFzIGZhLXBlblwiPjwvaT4nKSk7XG5cdFx0XHR0aGlzLl9yZW1vdmVCdXR0b24gPSAkKCc8YnV0dG9uPicsIHt0eXBlOiAnYnV0dG9uJywgY2xhc3M6ICdrLWJ1dHRvbiBrLXNlY29uZGFyeSBtbC0yJywgdGl0bGU6ICdSZW1vdmUnLCBkaXNhYmxlZDogdHJ1ZX0pLmFwcGVuZCgkKCc8aSBjbGFzcz1cImZhcyBmYS10aW1lc1wiPjwvaT4nKSk7XG5cblx0XHRcdGJ1dHRvbnMuYXBwZW5kKHRoaXMuX2FkZEJ1dHRvbik7XG5cdFx0XHRidXR0b25zLmFwcGVuZCh0aGlzLl9lZGl0QnV0dG9uKTtcblx0XHRcdGJ1dHRvbnMuYXBwZW5kKHRoaXMuX3JlbW92ZUJ1dHRvbik7XG5cblx0XHRcdC8vIEFwcGVuZCBidXR0b25zIGNvbnRhaW5lciB0byBtYWluIGh0bWxcblx0XHRcdHRoaXMuX3dpZGdldEh0bWwuYXBwZW5kKGJ1dHRvbnMpO1xuXG5cdFx0XHQvLyBDcmVhdGUgZWRpdCBkaWFsb2dcblx0XHRcdC8vIE5PVEU6IGRhdGEtZGlzbWlzcz1cIm1vZGFsXCIgb24gdGhlIGNsb3NlL2NhbmNlbCBidXR0b25zIHdhcyByZW1vdmVkIHRvIHdvcmsgYXJvdW5kIGFuIGlzc3VlIHdpdGggbmVzdGVkIG1vZGFscztcblx0XHRcdC8vIHRoZSBjdXN0b20gXCJkYXRhLWNhbmNlbFwiIGF0dHJpYnV0ZSBpcyB1c2VkIHRvIGFkZCBhIGN1c3RvbSBsaXN0ZW5lciB0byB0aGUgYnV0dG9uc1xuXHRcdFx0dGhpcy5fZWRpdERpYWxvZyA9ICQoYFxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwibW9kYWxcIiB0YWJpbmRleD1cIi0xXCIgcm9sZT1cImRpYWxvZ1wiIGFyaWEtbGFiZWxsZWRieT1cIm1vZGFsVGl0bGVcIiBhcmlhLWhpZGRlbj1cInRydWVcIiBkYXRhLWtleWJvYXJkPVwiZmFsc2VcIiBkYXRhLWJhY2tkcm9wPVwic3RhdGljXCI+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZyBtb2RhbC1kaWFsb2ctY2VudGVyZWRcIiByb2xlPVwiZG9jdW1lbnRcIj5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cblx0XHRcdFx0XHRcdFx0XHQ8aDUgY2xhc3M9XCJtb2RhbC10aXRsZSB0ZXh0LXByaW1hcnlcIiBpZD1cIm1vZGFsVGl0bGVcIj4ke3RoaXMuX2RhdGEubGFiZWx9PC9oNT5cblx0XHRcdFx0XHRcdFx0XHQ8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNsb3NlXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCIgZGF0YS1jYW5jZWw9XCJtb2RhbFwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0PHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JnRpbWVzOzwvc3Bhbj5cblx0XHRcdFx0XHRcdFx0XHQ8L2J1dHRvbj5cblx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5IGluLWZsb3ctaW52YWxpZC1tc2dcIj5cblxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlciBmbGV4LWNvbHVtblwiPlxuXHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJkLWZsZXggdy0xMDBcIj5cblx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJmbGV4LWdyb3ctMSB0ZXh0LWxlZnRcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJrLWJ1dHRvbiBrLXByaW1hcnlcIj4uLi48L2J1dHRvbj5cblx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImZsZXgtZ3Jvdy0xIHRleHQtcmlnaHRcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJrLWJ1dHRvbiBrLXNlY29uZGFyeVwiIGRhdGEtY2FuY2VsPVwibW9kYWxcIj5DYW5jZWw8L2J1dHRvbj5cblx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdGApO1xuXG5cdFx0XHQvLyBBZGQgbGlzdGVuZXIgdG8gZGlhbG9nIGhpZGUgZXZlbnRcblx0XHRcdHRoaXMuX2VkaXREaWFsb2cub24oJ2hpZGRlbi5icy5tb2RhbCcsICQucHJveHkodGhpcy5fb25FZGl0UGFuZWxIaWRkZW4sIHRoaXMpKTtcblxuXHRcdFx0Ly8gQWRkIGxpc3RlbmVyIHRvIG1haW4gYnV0dG9uIGNsaWNrIGV2ZW50XG5cdFx0XHQkKCdidXR0b24uay1wcmltYXJ5JywgdGhpcy5fZWRpdERpYWxvZykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vblN1Ym1pdEJ0Q2xpY2ssIHRoaXMpKTtcblxuXHRcdFx0Ly8gQWRkIGxpc3RlbmVyIHRvIGNsb3NlL2NhbmNlbCBidXR0b25zIGNsaWNrIGV2ZW50XG5cdFx0XHQkKCdidXR0b25bZGF0YS1jYW5jZWw9XCJtb2RhbFwiXScsIHRoaXMuX2VkaXREaWFsb2cpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25DYW5jZWxCdENsaWNrLCB0aGlzKSk7XG5cblx0XHRcdC8vIEFwcGVuZCBlZGl0IGRpYWxvZyB0byBtYWluIGh0bWxcblx0XHRcdHRoaXMuX3dpZGdldEh0bWwuYXBwZW5kKHRoaXMuX2VkaXREaWFsb2cpO1xuXHRcdH1cblxuXHRcdC8vIFJldHVybiBjb21wb25lbnRcblx0XHRyZXR1cm4gdGhpcy5fd2lkZ2V0SHRtbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbml0aWFsaXplIHdpZGdldC5cblx0ICogQG92ZXJyaWRlXG5cdCAqL1xuXHRfaW5pdGlhbGl6ZSgpXG5cdHtcblx0XHRsZXQgY29sdW1ucyA9IFtdO1xuXHRcdGZvciAobGV0IHN1YkNvbmZpZ1BhcmFtIG9mIHRoaXMuX2RhdGEuZGVmYXVsdExpc3RJdGVtKVxuXHRcdHtcblx0XHRcdGxldCBjb2wgPSB7XG5cdFx0XHRcdGZpZWxkOiBzdWJDb25maWdQYXJhbS5uYW1lLFxuXHRcdFx0XHR0aXRsZTogc3ViQ29uZmlnUGFyYW0ubGFiZWwsXG5cdFx0XHRcdHdpZHRoOiAxMjBcblx0XHRcdH1cblxuXHRcdFx0Ly8gRGlzcGxheSBWIG9yIFggZm9yIGJvb2xlYW5zXG5cdFx0XHRpZiAodHlwZW9mIHN1YkNvbmZpZ1BhcmFtLnZhbHVlID09PSAnYm9vbGVhbicpXG5cdFx0XHRcdGNvbC50ZW1wbGF0ZSA9IGAjPSAke3N1YkNvbmZpZ1BhcmFtLm5hbWV9ID8gJzxpIGNsYXNzPVwiZmFzIGZhLWNoZWNrXCI+PC9pPicgOiAnPGkgY2xhc3M9XCJmYXMgZmEtdGltZXNcIj48L2k+JyAjYDtcblxuXHRcdFx0Ly8gSGlkZSBwYXNzd29yZHNcblx0XHRcdGlmIChzdWJDb25maWdQYXJhbS50eXBlID09ICdUZXh0SW5wdXQnICYmIHN1YkNvbmZpZ1BhcmFtLmF0dHJpYnV0ZXMgIT0gbnVsbCAmJiBzdWJDb25maWdQYXJhbS5hdHRyaWJ1dGVzLnR5cGUgPT0gJ3Bhc3N3b3JkJylcblx0XHRcdFx0Y29sLnRlbXBsYXRlID0gYCM9ICfigKInLnJlcGVhdChkYXRhLiR7c3ViQ29uZmlnUGFyYW0ubmFtZX0ubGVuZ3RoKSAjYDtcblxuXHRcdFx0Y29sdW1ucy5wdXNoKGNvbCk7XG5cdFx0fVxuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBncmlkXG5cdFx0bGV0IGdyaWRIdG1sID0gdGhpcy5fd2lkZ2V0SHRtbC5maW5kKGAjJHskLmVzY2FwZVNlbGVjdG9yKHRoaXMuX2RhdGEubmFtZSl9YCk7XG5cblx0XHRncmlkSHRtbC5rZW5kb0dyaWQoe1xuXHRcdFx0cmVzaXphYmxlOiB0cnVlLFxuXHRcdFx0c2VsZWN0YWJsZTogdGhpcy5fZGF0YS5lZGl0YWJsZSA/ICdyb3cnIDogZmFsc2UsXG5cdFx0XHRjaGFuZ2U6ICQucHJveHkodGhpcy5fb25HcmlkU2VsZWN0aW9uQ2hhbmdlLCB0aGlzKSxcblx0XHRcdGNvbHVtbnM6IGNvbHVtbnMsXG5cdFx0XHRub1JlY29yZHM6IHtcblx0XHRcdFx0dGVtcGxhdGU6ICdObyBpdGVtcy4nXG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvLyBTYXZlIHJlZi4gdG8gd2lkZ2V0XG5cdFx0dGhpcy5fZ3JpZFdpZGdldCA9IGdyaWRIdG1sLmRhdGEoJ2tlbmRvR3JpZCcpO1xuXG5cdFx0Ly8gU2hvdyB0b290aXAgaWYgZ3JpZCdzIGNlbGwgY29udGVudCBleGNlZWRzIGNlbGwgd2lkdGggKGVsbGlwc2lzIGlzIGRpc3BsYXllZCBieSBLZW5kbyBHcmlkKVxuXHRcdGdyaWRIdG1sLmtlbmRvVG9vbHRpcCh7XG5cdFx0XHRmaWx0ZXI6ICd0ZCcsXG5cdFx0XHRzaG93OiBmdW5jdGlvbihlKSB7XG5cdFx0XHRcdC8vIE5ldmVyIHNob3cgdG9vbHRpcC4uLlxuXHRcdFx0XHR0aGlzLmNvbnRlbnQucGFyZW50KCkuY3NzKCd2aXNpYmlsaXR5JywgJ2hpZGRlbicpO1xuXG5cdFx0XHRcdC8vIC4uLnVubGVzcyBjb250ZW50IGlzIHJldHVybmVkIChzZWUgYmVsb3cpIGR1ZSB0byBjZWxsIHdpZHRoIGJlaW5nIGV4Y2VlZGVkXG5cdFx0XHRcdGlmICh0aGlzLmNvbnRlbnQudGV4dCgpICE9ICcnKVxuXHRcdFx0XHRcdHRoaXMuY29udGVudC5wYXJlbnQoKS5jc3MoJ3Zpc2liaWxpdHknLCAndmlzaWJsZScpO1xuXHRcdFx0fSxcblx0XHRcdGhpZGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR0aGlzLmNvbnRlbnQucGFyZW50KCkuY3NzKCd2aXNpYmlsaXR5JywgJ2hpZGRlbicpO1xuXHRcdFx0fSxcblx0XHRcdGNvbnRlbnQ6IGZ1bmN0aW9uKGUpIHtcblx0XHRcdFx0bGV0IGVsZW1lbnQgPSBlLnRhcmdldFswXTtcblx0XHRcdFx0aWYgKGVsZW1lbnQub2Zmc2V0V2lkdGggPCBlbGVtZW50LnNjcm9sbFdpZHRoKVxuXHRcdFx0XHRcdHJldHVybiBlLnRhcmdldC50ZXh0KCk7XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRyZXR1cm4gJyc7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvKlxuXHRcdC8vIEluaXRpYWxpemUgYnV0dG9uIHRvb2x0aXBzXG5cdFx0dGhpcy5fd2lkZ2V0SHRtbC5rZW5kb1Rvb2x0aXAoe1xuXHRcdFx0ZmlsdGVyOiAnYnV0dG9uJyxcblx0XHRcdGNvbnRlbnQ6IGZ1bmN0aW9uKGUpIHtcblx0XHRcdFx0cmV0dXJuIGA8ZGl2IGNsYXNzPVwiaGVscC10b29sdGlwXCI+JHtlLnRhcmdldC5kYXRhKCd0aXRsZScpfTwvZGl2PmA7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0Ki9cblxuXHRcdC8vIEFkZCBidXR0b24gbGlzdGVuZXJzXG5cdFx0aWYgKHRoaXMuX2RhdGEuZWRpdGFibGUpXG5cdFx0e1xuXHRcdFx0dGhpcy5fYWRkQnV0dG9uLmNsaWNrKCQucHJveHkodGhpcy5fb25BZGRDbGljaywgdGhpcykpO1xuXHRcdFx0dGhpcy5fZWRpdEJ1dHRvbi5jbGljaygkLnByb3h5KHRoaXMuX29uRWRpdENsaWNrLCB0aGlzKSk7XG5cdFx0XHR0aGlzLl9yZW1vdmVCdXR0b24uY2xpY2soJC5wcm94eSh0aGlzLl9vblJlbW92ZUNsaWNrLCB0aGlzKSk7XG5cdFx0fVxuXG5cdFx0Ly8gUHJvY2VlZCB3aXRoIGluaXRpYWxpemF0aW9uXG5cdFx0c3VwZXIuX2luaXRpYWxpemUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXQgd2lkZ2V0J3MgZGF0YXNvdXJjZS5cblx0ICogQG92ZXJyaWRlXG5cdCAqL1xuXHRfc2V0V2lkZ2V0VmFsdWUoKVxuXHR7XG5cdFx0bGV0IGRhdGFTb3VyY2UgPSBuZXcga2VuZG8uZGF0YS5EYXRhU291cmNlKHtcblx0XHRcdGRhdGE6IHRoaXMuX2RhdGEubGlzdFZhbHVlc1xuXHRcdH0pO1xuXG5cdFx0Ly8gUmVhZCBjdXJyZW50IGhvcml6b250YWwgc2Nyb2xsIHZhbHVlXG5cdFx0Y29uc3Qgc2Nyb2xsTGVmdCA9ICQoJy5rLWdyaWQtY29udGVudCcsIHRoaXMuX2dyaWRXaWRnZXQud3JhcHBlcikuc2Nyb2xsTGVmdCgpO1xuXG5cdFx0Ly8gQ2xlYXIgZ3JpZCBzZWxlY3Rpb24gaWYgYW55XG5cdFx0dGhpcy5fZ3JpZFdpZGdldC5jbGVhclNlbGVjdGlvbigpO1xuXG5cdFx0Ly8gU2V0IHVwZGF0ZWQgZ3JpZCdzIGRhdGFzb3VyY2Vcblx0XHR0aGlzLl9ncmlkV2lkZ2V0LnNldERhdGFTb3VyY2UoZGF0YVNvdXJjZSk7XG5cblx0XHQvLyBTZXQgaG9yaXpvbnRhbCBzY3JvbGxcblx0XHQkKCcuay1ncmlkLWNvbnRlbnQnLCB0aGlzLl9ncmlkV2lkZ2V0LndyYXBwZXIpLnNjcm9sbExlZnQoc2Nyb2xsTGVmdCk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0IHdpZGdldCdzIGRpc2FibGVkIHN0YXRlLlxuXHQgKiBAb3ZlcnJpZGVcblx0ICovXG5cdF9zZXRXaWRnZXRFZGl0RW5hYmxlZCgpXG5cdHtcblx0XHRpZiAodGhpcy5fZGF0YS5lZGl0YWJsZSlcblx0XHR7XG5cdFx0XHQvLyBEZXNlbGVjdCBpdGVtXG5cdFx0XHR0aGlzLl9ncmlkV2lkZ2V0LmNsZWFyU2VsZWN0aW9uKCk7XG5cblx0XHRcdC8vIEVuYWJsZS9kaXNhYmxlIGdyaWRcblx0XHRcdHRoaXMuX2dyaWRXaWRnZXQud3JhcHBlci5hdHRyKCdkaXNhYmxlZCcsICF0aGlzLl9lZGl0RW5hYmxlZCk7XG5cblx0XHRcdC8vIEVuYWJsZSBcIkFkZFwiIGJ1dHRvblxuXHRcdFx0aWYgKHRoaXMuX2VkaXRFbmFibGVkKVxuXHRcdFx0XHR0aGlzLl9hZGRCdXR0b24uYXR0cignZGlzYWJsZWQnLCBmYWxzZSk7XG5cblx0XHRcdC8vIERpc2FibGUgYWxsIGJ1dHRvbnNcblx0XHRcdGVsc2Vcblx0XHRcdHtcblx0XHRcdFx0dGhpcy5fYWRkQnV0dG9uLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSk7XG5cdFx0XHRcdHRoaXMuX2VkaXRCdXR0b24uYXR0cignZGlzYWJsZWQnLCB0cnVlKTtcblx0XHRcdFx0dGhpcy5fcmVtb3ZlQnV0dG9uLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0X29uR3JpZFNlbGVjdGlvbkNoYW5nZShlKVxuXHR7XG5cdFx0bGV0IHNlbGVjdGVkUm93cyA9IHRoaXMuX2dyaWRXaWRnZXQuc2VsZWN0KCk7XG5cdFx0bGV0IHNlbGVjdGVkRGF0YUl0ZW1zID0gW107XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHNlbGVjdGVkUm93cy5sZW5ndGg7IGkrKylcblx0XHR7XG5cdFx0XHRsZXQgZGF0YUl0ZW0gPSB0aGlzLl9ncmlkV2lkZ2V0LmRhdGFJdGVtKHNlbGVjdGVkUm93c1tpXSk7XG5cdFx0XHRzZWxlY3RlZERhdGFJdGVtcy5wdXNoKGRhdGFJdGVtKTtcblx0XHR9XG5cblx0XHQvLyBFbmFibGUvZGlzYWJsZSBlZGl0IGJ1dHRvblxuXHRcdGlmICh0aGlzLl9lZGl0QnV0dG9uKVxuXHRcdFx0dGhpcy5fZWRpdEJ1dHRvbi5wcm9wKCdkaXNhYmxlZCcsIHNlbGVjdGVkRGF0YUl0ZW1zLmxlbmd0aCA9PSAwKTtcblxuXHRcdC8vIEVuYWJsZS9kaXNhYmxlIHJlbW92ZSBidXR0b25cblx0XHRpZiAodGhpcy5fcmVtb3ZlQnV0dG9uKVxuXHRcdFx0dGhpcy5fcmVtb3ZlQnV0dG9uLnByb3AoJ2Rpc2FibGVkJywgc2VsZWN0ZWREYXRhSXRlbXMubGVuZ3RoID09IDApO1xuICAgIH1cblxuXHRfb25SZW1vdmVDbGljaygpXG5cdHtcblx0XHRsZXQgc2VsZWN0ZWRJbmRleCA9IHRoaXMuX2dyaWRXaWRnZXQuc2VsZWN0KCkuaW5kZXgoKTtcblxuXHRcdC8vIFJlbW92ZSBpdGVtIGZyb20gbGlzdFxuXHRcdHRoaXMuX2RhdGEucmVtb3ZlTGlzdEl0ZW0oc2VsZWN0ZWRJbmRleCk7XG5cblx0XHQvLyBSZWdlbmVyYXRlIGRhdGFncmlkJ3MgZGF0YXNvdXJjZVxuXHRcdHRoaXMuX3NldFdpZGdldFZhbHVlKCk7XG5cdH1cblxuXHRfb25BZGRDbGljaygpXG5cdHtcblx0XHQvLyBDbG9uZSBkZWZhdWx0IGl0ZW0gYW5kIGFkZCB0byBsaXN0XG5cdFx0bGV0IG5ld0xpc3RJdGVtID0gW107XG5cdFx0Zm9yIChsZXQgc3ViQ1Agb2YgdGhpcy5fZGF0YS5kZWZhdWx0TGlzdEl0ZW0pXG5cdFx0XHRuZXdMaXN0SXRlbS5wdXNoKHN1YkNQLmNsb25lKHRydWUpKTtcblxuXHRcdC8vIENyZWF0ZSBlZGl0IHBvcHVwXG5cdFx0dGhpcy5fb3BlbkVkaXRQYW5lbChuZXdMaXN0SXRlbSk7XG5cdH1cblxuXHRfb25FZGl0Q2xpY2soKVxuXHR7XG5cdFx0bGV0IHNlbGVjdGVkSW5kZXggPSB0aGlzLl9ncmlkV2lkZ2V0LnNlbGVjdCgpLmluZGV4KCk7XG5cblx0XHQvLyBDbG9uZSBzZWxlY3RlZCBpdGVtIGFuZCBhZGQgdG8gbGlzdFxuXHRcdGxldCBjbG9uZWRMaXN0SXRlbSA9IFtdO1xuXHRcdGZvciAobGV0IHN1YkNQIG9mIHRoaXMuX2RhdGEubGlzdEl0ZW1zW3NlbGVjdGVkSW5kZXhdKVxuXHRcdFx0Y2xvbmVkTGlzdEl0ZW0ucHVzaChzdWJDUC5jbG9uZSh0cnVlKSk7XG5cblx0XHQvLyBDcmVhdGUgZWRpdCBwb3B1cFxuXHRcdHRoaXMuX29wZW5FZGl0UGFuZWwoY2xvbmVkTGlzdEl0ZW0sIHNlbGVjdGVkSW5kZXgpO1xuXHR9XG5cblx0X29wZW5FZGl0UGFuZWwoc3ViQ29uZmlnUGFyYW1zQXJyYXksIGVkaXRJbmRleCA9IC0xKVxuXHR7XG5cdFx0Ly8gQ2hlY2sgaWYgdGhpcyBjb25maWd1cmF0aW9uIGl0ZW0gaXMgaW5zaWRlIGEgbW9kYWwgd2luZG93O1xuXHRcdC8vIGlmIHllcywgdGhlIGVkaXQgcGFuZWwgKHdoaWNoIGlzIGEgbW9kYWwgYXMgd2VsbCkgbXVzdCBiZSBjb25maWd1cmVkIHRvIHJlbW92ZSB0aGUgZGFyayBiYWNrZ3JvdW5kXG5cdFx0aWYgKCQodGhpcykucGFyZW50cygnLm1vZGFsJykubGVuZ3RoID4gMClcblx0XHRcdCQoJy5tb2RhbCcsICQodGhpcykpLmF0dHIoJ2RhdGEtYmFja2Ryb3AnLCBmYWxzZSk7XG5cblx0XHQvLyBDcmVhdGUgZGlhbG9nIGNvbnRlbnRcblx0XHR0aGlzLl9pdGVtRWRpdG9yID0gbmV3IExpc3RJdGVtRWRpdG9yKCk7XG5cdFx0dGhpcy5faXRlbUVkaXRvci5kYXRhID0gc3ViQ29uZmlnUGFyYW1zQXJyYXk7XG5cdFx0dGhpcy5faXRlbUVkaXRvci5pbmRleCA9IGVkaXRJbmRleDtcblxuXHRcdGxldCBpdGVtRWRpdG9yID0gJCh0aGlzLl9pdGVtRWRpdG9yKTtcblxuXHRcdC8vIEFwcGVuZCBjb250ZW50IHRvIGRpYWxvZ1xuXHRcdCQoJy5tb2RhbC1ib2R5JywgdGhpcy5fZWRpdERpYWxvZykuYXBwZW5kKGl0ZW1FZGl0b3IpO1xuXG5cdFx0Ly8gU2V0IGRpYWxvZyBtYWluIGJ1dHRvbiB0ZXh0XG5cdFx0JCgnYnV0dG9uLmstcHJpbWFyeScsIHRoaXMuX2VkaXREaWFsb2cpLmh0bWwoZWRpdEluZGV4ID4gLTEgPyAnPGkgY2xhc3M9XCJmYXMgZmEtcGVuIG1yLTFcIj48L2k+VXBkYXRlJyA6ICc8aSBjbGFzcz1cImZhcyBmYS1wbHVzIG1yLTFcIj48L2k+QWRkJyk7XG5cblx0XHQvLyBEaXNwbGF5IGRpYWxvZ1xuXHRcdHRoaXMuX2VkaXREaWFsb2cubW9kYWwoJ3Nob3cnKTtcblx0fVxuXG5cdF9vblN1Ym1pdEJ0Q2xpY2soKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2l0ZW1FZGl0b3IudmFsaWRhdGUoKSlcblx0XHR7XG5cdFx0XHRsZXQgZGF0YSA9IHRoaXMuX2l0ZW1FZGl0b3IuZGF0YTtcblx0XHRcdGxldCBpbmRleCA9IHRoaXMuX2l0ZW1FZGl0b3IuaW5kZXg7XG5cblx0XHRcdC8vIEhpZGUgbW9kYWxcblx0XHRcdHRoaXMuX2VkaXREaWFsb2cubW9kYWwoJ2hpZGUnKTtcblxuXHRcdFx0Ly8gQ29tcGxldGUgZWRpdGluZ1xuXHRcdFx0dGhpcy5fb25FZGl0Q29tcGxldGUoZGF0YSwgaW5kZXgpO1xuXHRcdH1cblx0fVxuXG5cdF9vbkNhbmNlbEJ0Q2xpY2soKVxuXHR7XG5cdFx0Ly8gSGlkZSBtb2RhbFxuXHRcdHRoaXMuX2VkaXREaWFsb2cubW9kYWwoJ2hpZGUnKTtcblx0fVxuXG5cdF9vbkVkaXRQYW5lbEhpZGRlbihlKVxuXHR7XG5cdFx0Ly8gUmVtb3ZlIGNvbnRlbnQgZnJvbSBkaWFsb2dcblx0XHR0aGlzLl9pdGVtRWRpdG9yLnJlbW92ZSgpO1xuXG5cdFx0Ly8gU2V0IGRpYWxvZyBtYWluIGJ1dHRvbiB0ZXh0XG5cdFx0JCgnYnV0dG9uLmstcHJpbWFyeScsIHRoaXMuX2VkaXREaWFsb2cpLmh0bWwoJy4uLicpO1xuXG5cdFx0dGhpcy5faXRlbUVkaXRvciA9IG51bGw7XG5cdH1cblxuXHRfb25FZGl0Q29tcGxldGUobGlzdEl0ZW0sIGVkaXRJbmRleClcblx0e1xuXHRcdC8vIEFuIGV4aXN0aW5nIGxpc3QgaXRlbSB3YXMgdXBkYXRlZFxuXHRcdGlmIChlZGl0SW5kZXggPiAtMSlcblx0XHRcdHRoaXMuX2RhdGEudXBkYXRlTGlzdEl0ZW0obGlzdEl0ZW0sIGVkaXRJbmRleCk7XG5cblx0XHQvLyBBIG5ldyBsaXN0IGl0ZW0gd2FzIGFkZGVkOyBhZGQgaXQgdG8gdGhlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyXG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5fZGF0YS5hZGRMaXN0SXRlbShsaXN0SXRlbSk7XG5cblx0XHQvLyBSZWdlbmVyYXRlIGRhdGFncmlkJ3MgZGF0YXNvdXJjZVxuXHRcdHRoaXMuX3NldFdpZGdldFZhbHVlKCk7XG5cdH1cbn1cblxuLy8gREVGSU5FIENPTVBPTkVOVFxuaWYgKCF3aW5kb3cuY3VzdG9tRWxlbWVudHMuZ2V0KCdjb25maWctZ3JpZCcpKVxuXHR3aW5kb3cuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdjb25maWctZ3JpZCcsIENvbmZpZ0dyaWQpO1xuIiwiZXhwb3J0IGNsYXNzIENvbmZpZ0xhYmVsIGV4dGVuZHMgSFRNTEVsZW1lbnRcbntcblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdCAgICBzdXBlcigpO1xuXG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywnY29uZmlnLWxhYmVsJyk7XG5cdH1cblxuXHRzZXQgdmFsdWUodmFsKVxuXHR7XG5cdFx0aWYgKHR5cGVvZiB2YWwgPT09ICdib29sZWFuJylcblx0XHRcdHRoaXMuaW5uZXJIVE1MID0gKHZhbCA/ICd0cnVlJyA6ICdmYWxzZScpO1xuXHRcdGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKVxuXHRcdFx0dGhpcy5pbm5lckhUTUwgPSAodmFsID8gdmFsIDogMCk7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5pbm5lckhUTUwgPSAodmFsICE9ICcnID8gdmFsIDogJyZtZGFzaDsnKTtcblx0fVxuXG5cdGdldCB2YWx1ZSgpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy50ZXh0Q29udGVudDtcblx0fVxufVxuXG4vLyBERUZJTkUgQ09NUE9ORU5UXG5pZiAoIXdpbmRvdy5jdXN0b21FbGVtZW50cy5nZXQoJ2NvbmZpZy1sYWJlbCcpKVxuXHR3aW5kb3cuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdjb25maWctbGFiZWwnLCBDb25maWdMYWJlbCk7XG4iLCJpbXBvcnQge0NvbmZpZ0Zvcm1JdGVtfSBmcm9tICcuL2NvbmZpZy1mb3JtLWl0ZW0nO1xuaW1wb3J0IHtDb25maWdMYWJlbH0gZnJvbSAnLi9jb25maWctbGFiZWwnO1xuXG5leHBvcnQgY2xhc3MgQ29uZmlnTnVtZXJpY1N0ZXBwZXIgZXh0ZW5kcyBDb25maWdGb3JtSXRlbVxue1xuXHRjb25zdHJ1Y3Rvcihjb25maWdQYXJhbSwgZWRpdEVuYWJsZWQsIGluRGlhbG9nKVxuXHR7XG5cdCAgICBzdXBlcihjb25maWdQYXJhbSwgZWRpdEVuYWJsZWQsIGluRGlhbG9nKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGUgd2lkZ2V0IHRvIHJlbmRlciB0aGUgQ29uZmlnUGFyYW1ldGVyIHZhbHVlLlxuXHQgKiBJZiBwYXJhbWV0ZXIgaXMgbm90IGVkaXRhYmxlLCBhIHNpbXBsZSBsYWJlbCBpcyB1c2VkLlxuXHQgKiBAb3ZlcnJpZGVcblx0ICovXG5cdF9nZW5lcmF0ZUlubmVyV2lkZ2V0KClcblx0e1xuXHRcdGlmICh0aGlzLl9kYXRhLmVkaXRhYmxlKVxuXHRcdHtcblx0XHRcdC8vIFNldCB3aWRnZXQgY29uZmlndXJhdGlvblxuXHRcdFx0bGV0IGNvbmZpZyA9IHtcblx0XHRcdFx0dHlwZTogJ251bWJlcicsXG5cdFx0XHRcdGNsYXNzOiAnZm9ybS1jb250cm9sJyxcblx0XHRcdFx0aWQ6IHRoaXMuX2RhdGEubmFtZSxcblx0XHRcdFx0bmFtZTogdGhpcy5fZGF0YS5uYW1lLFxuXHRcdFx0XHQnZGF0YS1yb2xlJzogJ251bWVyaWN0ZXh0Ym94Jyxcblx0XHRcdFx0J2RhdGEtcmVxdWlyZWQtbXNnJzogJ1JlcXVpcmVkJyxcblx0XHRcdFx0J2RhdGEtZm9ybWF0JzogJyMnLFxuXHRcdFx0XHRyZXF1aXJlZDogJ3JlcXVpcmVkJyxcblx0XHRcdH07XG5cblx0XHRcdC8vIFNldCB3aWRnZXQgYXR0cmlidXRlcyAoc2VlIHBhcmVudCBjbGFzcylcblx0XHRcdHRoaXMuX3NldFdpZGdldEF0dHJpYnV0ZXMoY29uZmlnKTtcblxuXHRcdFx0Ly8gU2V0IGFkZGl0aW9uYWwgd2lkZ2V0IGF0dHJpYnV0ZXMgYmFzZWQgb24gdmFsaWRhdGlvbiBydWxlcyAoc2VlIHBhcmVudCBjbGFzcylcblx0XHRcdHRoaXMuX3NldFdpZGdldFZhbGlkYXRpb25BdHRyaWJ1dGVzKGNvbmZpZyk7XG5cblx0XHRcdC8vIENyZWF0ZSB3aWRnZXQncyBodG1sXG5cdFx0XHR0aGlzLl93aWRnZXRIdG1sID0gJCgnPGlucHV0PicsIGNvbmZpZyk7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHRcdHRoaXMuX3dpZGdldEh0bWwgPSBuZXcgQ29uZmlnTGFiZWwoKTtcblxuXHRcdC8vIFJldHVybiBjb21wb25lbnRcblx0XHRyZXR1cm4gdGhpcy5fd2lkZ2V0SHRtbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbml0aWFsaXplIHdpZGdldC5cblx0ICogQG92ZXJyaWRlXG5cdCAqL1xuICAgX2luaXRpYWxpemUoKVxuICAge1xuXHQgICBpZiAodGhpcy5fZGF0YS5lZGl0YWJsZSlcblx0ICAge1xuXHRcdCAgIC8vIEluaXRpYWxpemUga2VuZG8gd2lkZ2V0XG5cdFx0ICAga2VuZG8uaW5pdCh0aGlzLl93aWRnZXRIdG1sKTtcblxuXHRcdCAgIC8vIFNhdmUgcmVmLiB0byB3aWRnZXRcblx0XHQgICB0aGlzLl9pbm5lcldpZGdldCA9IHRoaXMuX3dpZGdldEh0bWwuZGF0YSgna2VuZG9OdW1lcmljVGV4dEJveCcpO1xuXG5cdFx0ICAgLy8gRW5hYmxlIHZhbHVlIGNvbW1pdCBiaW5kaW5nXG5cdFx0ICAgdGhpcy5faW5uZXJXaWRnZXQuYmluZCgnY2hhbmdlJywgJC5wcm94eSh0aGlzLl9vblZhbHVlSW5wdXQsIHRoaXMpKTtcblx0ICAgfVxuXG5cdCAgIC8vIFByb2NlZWQgd2l0aCBpbml0aWFsaXphdGlvblxuXHQgICBzdXBlci5faW5pdGlhbGl6ZSgpO1xuICAgfVxuXG5cdC8qKlxuXHQgKiBTZXQgd2lkZ2V0J3MgdmFsdWUuXG5cdCAqIElmIHBhcmFtZXRlciBpcyBub3QgZWRpdGFibGUsIHRoZSBsYWJlbCB0ZXh0IGlzIHNldC5cblx0ICogQG92ZXJyaWRlXG5cdCAqL1xuXHRfc2V0V2lkZ2V0VmFsdWUoKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2RhdGEuZWRpdGFibGUpXG5cdFx0XHR0aGlzLl9pbm5lcldpZGdldC52YWx1ZSh0aGlzLl9kYXRhLnZhbHVlKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLl93aWRnZXRIdG1sLnZhbHVlID0gdGhpcy5fZGF0YS52YWx1ZTtcblxuXHRcdC8vIFRyaWdnZXIgZXZlbnRcblx0XHR0aGlzLl90cmlnZ2VyRXZlbnQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXQgd2lkZ2V0J3MgZGlzYWJsZWQgc3RhdGUuXG5cdCAqIEBvdmVycmlkZVxuXHQgKi9cblx0X3NldFdpZGdldEVkaXRFbmFibGVkKClcblx0e1xuXHRcdGlmICh0aGlzLl9kYXRhLmVkaXRhYmxlKVxuXHRcdFx0dGhpcy5faW5uZXJXaWRnZXQuZW5hYmxlKHRoaXMuX2VkaXRFbmFibGVkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBVcGRhdGUgQ29uZmlndXJhdGlvbiBQYXJhbWV0ZXIgdmFsdWUuXG5cdCAqIEBvdmVycmlkZVxuXHQgKi9cblx0X29uVmFsdWVJbnB1dChlKVxuXHR7XG5cdFx0Ly8gVXBkYXRlIENvbmZpZ3VyYXRpb24gUGFyYW1ldGVyIHRvIG5ldyB2YWx1ZVxuXHRcdHRoaXMuX2RhdGEudmFsdWUgPSBOdW1iZXIodGhpcy5faW5uZXJXaWRnZXQudmFsdWUoKSk7XG5cblx0XHQvLyBUcmlnZ2VyIGV2ZW50XG5cdFx0dGhpcy5fdHJpZ2dlckV2ZW50KCk7XG5cdH1cbn1cblxuLy8gREVGSU5FIENPTVBPTkVOVFxuaWYgKCF3aW5kb3cuY3VzdG9tRWxlbWVudHMuZ2V0KCdjb25maWctbnVtZXJpYy1zdGVwcGVyJykpXG5cdHdpbmRvdy5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ2NvbmZpZy1udW1lcmljLXN0ZXBwZXInLCBDb25maWdOdW1lcmljU3RlcHBlcik7XG4iLCJpbXBvcnQge0NvbmZpZ0Zvcm1JdGVtfSBmcm9tICcuL2NvbmZpZy1mb3JtLWl0ZW0nO1xuaW1wb3J0IHtDb25maWdMYWJlbH0gZnJvbSAnLi9jb25maWctbGFiZWwnO1xuXG5leHBvcnQgY2xhc3MgQ29uZmlnVGV4dElucHV0IGV4dGVuZHMgQ29uZmlnRm9ybUl0ZW1cbntcblx0Y29uc3RydWN0b3IoY29uZmlnUGFyYW0sIGVkaXRFbmFibGVkLCBpbkRpYWxvZylcblx0e1xuXHQgICAgc3VwZXIoY29uZmlnUGFyYW0sIGVkaXRFbmFibGVkLCBpbkRpYWxvZyk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlIHdpZGdldCB0byByZW5kZXIgdGhlIENvbmZpZ1BhcmFtZXRlciB2YWx1ZS5cblx0ICogSWYgcGFyYW1ldGVyIGlzIG5vdCBlZGl0YWJsZSwgYSBzaW1wbGUgbGFiZWwgaXMgdXNlZC5cblx0ICogQG92ZXJyaWRlXG5cdCAqL1xuXHRfZ2VuZXJhdGVJbm5lcldpZGdldCgpXG5cdHtcblx0XHRpZiAodGhpcy5fZGF0YS5lZGl0YWJsZSlcblx0XHR7XG5cdFx0XHQvLyBTZXQgd2lkZ2V0IGNvbmZpZ3VyYXRpb25cblx0XHRcdGxldCBjb25maWcgPSB7XG5cdFx0XHRcdHR5cGU6ICd0ZXh0Jyxcblx0XHRcdFx0Y2xhc3M6ICdmb3JtLWNvbnRyb2wgay10ZXh0Ym94Jyxcblx0XHRcdFx0aWQ6IHRoaXMuX2RhdGEubmFtZSxcblx0XHRcdFx0bmFtZTogdGhpcy5fZGF0YS5uYW1lLFxuXHRcdFx0XHRhdXRvY29tcGxldGU6ICdvZmYnLFxuXHRcdFx0fTtcblxuXHRcdFx0Ly8gU2V0IHdpZGdldCBhdHRyaWJ1dGVzXG5cdFx0XHR0aGlzLl9zZXRXaWRnZXRBdHRyaWJ1dGVzKGNvbmZpZyk7XG5cblx0XHRcdC8vIFNldCBhZGRpdGlvbmFsIHdpZGdldCBhdHRyaWJ1dGVzIGJhc2VkIG9uIHZhbGlkYXRpb24gcnVsZXNcblx0XHRcdHRoaXMuX3NldFdpZGdldFZhbGlkYXRpb25BdHRyaWJ1dGVzKGNvbmZpZyk7XG5cblx0XHRcdC8vIENyZWF0ZSB3aWRnZXQncyBodG1sXG5cdFx0XHR0aGlzLl93aWRnZXRIdG1sID0gJCgnPGlucHV0PicsIGNvbmZpZyk7XG5cblx0XHRcdC8vIEVuYWJsZSB2YWx1ZSBjb21taXQgYmluZGluZ1xuXHRcdFx0dGhpcy5fd2lkZ2V0SHRtbC5vbignY2hhbmdlJywgJC5wcm94eSh0aGlzLl9vblZhbHVlSW5wdXQsIHRoaXMpKTtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5fd2lkZ2V0SHRtbCA9IG5ldyBDb25maWdMYWJlbCgpO1xuXG5cdFx0Ly8gUmV0dXJuIGNvbXBvbmVudFxuXHRcdHJldHVybiB0aGlzLl93aWRnZXRIdG1sO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldCB3aWRnZXQncyB2YWx1ZS5cblx0ICogSWYgcGFyYW1ldGVyIGlzIG5vdCBlZGl0YWJsZSwgdGhlIGxhYmVsIHRleHQgaXMgc2V0LlxuXHQgKiBAb3ZlcnJpZGVcblx0ICovXG5cdF9zZXRXaWRnZXRWYWx1ZSgpXG5cdHtcblx0XHRpZiAodGhpcy5fZGF0YS5lZGl0YWJsZSlcblx0XHRcdHRoaXMuX3dpZGdldEh0bWwudmFsKHRoaXMuX2RhdGEudmFsdWUpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMuX3dpZGdldEh0bWwudmFsdWUgPSB0aGlzLl9kYXRhLnZhbHVlO1xuXG5cdFx0Ly8gVHJpZ2dlciBldmVudFxuXHRcdHRoaXMuX3RyaWdnZXJFdmVudCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldCB3aWRnZXQncyBkaXNhYmxlZCBzdGF0ZS5cblx0ICogQG92ZXJyaWRlXG5cdCAqL1xuXHRfc2V0V2lkZ2V0RWRpdEVuYWJsZWQoKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2RhdGEuZWRpdGFibGUpXG5cdFx0XHR0aGlzLl93aWRnZXRIdG1sLmF0dHIoJ2Rpc2FibGVkJywgIXRoaXMuX2VkaXRFbmFibGVkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBVcGRhdGUgQ29uZmlndXJhdGlvbiBQYXJhbWV0ZXIgdmFsdWUuXG5cdCAqIEBvdmVycmlkZVxuXHQgKi9cblx0X29uVmFsdWVJbnB1dChlKVxuXHR7XG5cdFx0Ly8gVXBkYXRlIENvbmZpZ3VyYXRpb24gUGFyYW1ldGVyIHRvIG5ldyB2YWx1ZVxuXHRcdHRoaXMuX2RhdGEudmFsdWUgPSB0aGlzLl93aWRnZXRIdG1sLnZhbCgpO1xuXG5cdFx0Ly8gVHJpZ2dlciBldmVudFxuXHRcdHRoaXMuX3RyaWdnZXJFdmVudCgpO1xuXHR9XG59XG5cbi8vIERFRklORSBDT01QT05FTlRcbmlmICghd2luZG93LmN1c3RvbUVsZW1lbnRzLmdldCgnY29uZmlnLXRleHQtaW5wdXQnKSlcblx0d2luZG93LmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnY29uZmlnLXRleHQtaW5wdXQnLCBDb25maWdUZXh0SW5wdXQpO1xuIiwiaW1wb3J0IHtDb25maWdGb3JtSXRlbX0gZnJvbSAnLi9jb25maWctZm9ybS1pdGVtJztcbmltcG9ydCB7Q29uZmlnTGFiZWx9IGZyb20gJy4vY29uZmlnLWxhYmVsJztcbmltcG9ydCB7VmVjdG9yM0RJbnB1dH0gZnJvbSAnLi93aWRnZXRzL3ZlY3Rvci0zZC1pbnB1dCc7XG5cbmV4cG9ydCBjbGFzcyBDb25maWdWZWN0b3IzRCBleHRlbmRzIENvbmZpZ0Zvcm1JdGVtXG57XG5cdGNvbnN0cnVjdG9yKGNvbmZpZ1BhcmFtLCBlZGl0RW5hYmxlZCwgaW5EaWFsb2cpXG5cdHtcblx0ICAgIHN1cGVyKGNvbmZpZ1BhcmFtLCBlZGl0RW5hYmxlZCwgaW5EaWFsb2cpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZSB3aWRnZXQgdG8gcmVuZGVyIHRoZSBDb25maWdQYXJhbWV0ZXIgdmFsdWUuXG5cdCAqIElmIHBhcmFtZXRlciBpcyBub3QgZWRpdGFibGUsIGEgc2ltcGxlIGxhYmVsIGlzIHVzZWQuXG5cdCAqIEBvdmVycmlkZVxuXHQgKi9cblx0X2dlbmVyYXRlSW5uZXJXaWRnZXQoKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2RhdGEuZWRpdGFibGUpXG5cdFx0e1xuXHRcdFx0Ly8gQ3JlYXRlIHdpZGdldCdzIGh0bWxcblx0XHRcdHRoaXMuX3dpZGdldEh0bWwgPSBuZXcgVmVjdG9yM0RJbnB1dCh0aGlzLl9kYXRhLm5hbWUsIHRoaXMuX2RhdGEudmFsaWRhdG9yID09ICdhb2knKTtcblxuXHRcdFx0Ly8gU2V0IHdpZGdldCBhdHRyaWJ1dGVzXG5cdFx0XHR0aGlzLl9zZXRXaWRnZXRBdHRyaWJ1dGVzKHRoaXMuX3dpZGdldEh0bWwpO1xuXG5cdFx0XHQvLyBFbmFibGUgdmFsdWUgY29tbWl0IGJpbmRpbmdcblx0XHRcdCQodGhpcy5fd2lkZ2V0SHRtbCkub24oJ2NoYW5nZScsICQucHJveHkodGhpcy5fb25WYWx1ZUlucHV0LCB0aGlzKSk7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHRcdHRoaXMuX3dpZGdldEh0bWwgPSBuZXcgQ29uZmlnTGFiZWwoKTtcblxuXHRcdC8vIFJldHVybiBjb21wb25lbnRcblx0XHRyZXR1cm4gdGhpcy5fd2lkZ2V0SHRtbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXQgd2lkZ2V0J3MgdmFsdWUuXG5cdCAqIElmIHBhcmFtZXRlciBpcyBub3QgZWRpdGFibGUsIHRoZSBsYWJlbCB0ZXh0IGlzIHNldC5cblx0ICogQG92ZXJyaWRlXG5cdCAqL1xuXHRfc2V0V2lkZ2V0VmFsdWUoKVxuXHR7XG5cdFx0dGhpcy5fd2lkZ2V0SHRtbC52YWx1ZSA9IHRoaXMuX2RhdGEudmFsdWU7XG5cblx0XHQvLyBUcmlnZ2VyIGV2ZW50XG5cdFx0dGhpcy5fdHJpZ2dlckV2ZW50KCk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0IHdpZGdldCdzIGRpc2FibGVkIHN0YXRlLlxuXHQgKiBAb3ZlcnJpZGVcblx0ICovXG5cdF9zZXRXaWRnZXRFZGl0RW5hYmxlZCgpXG5cdHtcblx0XHRpZiAodGhpcy5fZGF0YS5lZGl0YWJsZSlcblx0XHR7XG5cdFx0XHQkKHRoaXMuX3dpZGdldEh0bWwpLmF0dHIoJ2Rpc2FibGVkJywgIXRoaXMuX2VkaXRFbmFibGVkKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogVXBkYXRlIENvbmZpZ3VyYXRpb24gUGFyYW1ldGVyIHZhbHVlLlxuXHQgKiBAb3ZlcnJpZGVcblx0ICovXG5cdF9vblZhbHVlSW5wdXQoZSlcblx0e1xuXHRcdC8vIFVwZGF0ZSBDb25maWd1cmF0aW9uIFBhcmFtZXRlciB0byBuZXcgdmFsdWVcblx0XHR0aGlzLl9kYXRhLnZhbHVlID0gdGhpcy5fd2lkZ2V0SHRtbC52YWx1ZTtcblxuXHRcdC8vIFRyaWdnZXIgZXZlbnRcblx0XHR0aGlzLl90cmlnZ2VyRXZlbnQoKTtcblx0fVxufVxuXG4vLyBERUZJTkUgQ09NUE9ORU5UXG5pZiAoIXdpbmRvdy5jdXN0b21FbGVtZW50cy5nZXQoJ2NvbmZpZy12ZWN0b3ItM2QnKSlcblx0d2luZG93LmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnY29uZmlnLXZlY3Rvci0zZCcsIENvbmZpZ1ZlY3RvcjNEKTtcbiIsImltcG9ydCB7Q29uZmlnRm9ybUl0ZW1GYWN0b3J5fSBmcm9tICcuLi8uLi8uLi91dGlscy91aWJ1aWxkZXIvY29uZmlnLWZvcm0taXRlbS1mYWN0b3J5JztcblxuZXhwb3J0IGNsYXNzIExpc3RJdGVtRWRpdG9yIGV4dGVuZHMgSFRNTEVsZW1lbnRcbntcblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdCAgICBzdXBlcigpO1xuXHR9XG5cblx0c2V0IGRhdGEoc3ViQ29uZmlnUGFyYW1zQXJyYXkpXG5cdHtcblx0XHR0aGlzLl9kYXRhID0gc3ViQ29uZmlnUGFyYW1zQXJyYXk7XG5cblx0XHR0aGlzLl9idWlsZFZpZXcoKTtcblx0fVxuXG5cdGdldCBkYXRhKClcblx0e1xuXHRcdHJldHVybiB0aGlzLl9kYXRhO1xuXHR9XG5cblx0c2V0IGluZGV4KGluZGV4KVxuXHR7XG5cdFx0dGhpcy5faW5kZXggPSBpbmRleDtcblx0fVxuXG5cdGdldCBpbmRleCgpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5faW5kZXg7XG5cdH1cblxuXHRfYnVpbGRWaWV3KClcblx0e1xuXHRcdC8vIEdlbmVyYXRlIGNvbnRhaW5lciBmb3JtXG5cdFx0dGhpcy5fZm9ybSA9ICQoJzxmb3JtPicsIHt9KTtcblxuXHRcdC8vIEFwcGVuZCBmb3JtXG5cdFx0JCh0aGlzKS5hcHBlbmQodGhpcy5fZm9ybSk7XG5cblx0XHQvLyBHZW5lcmF0ZSBmb3JtIGZpZWxkc1xuXHRcdGZvciAobGV0IGNvbmZpZ1BhcmFtIG9mIHRoaXMuX2RhdGEpXG5cdFx0e1xuXHRcdFx0Ly8gQ3JlYXRlIGZvcm0gaXRlbVxuXHRcdFx0bGV0IGZvcm1JdGVtID0gQ29uZmlnRm9ybUl0ZW1GYWN0b3J5LmNyZWF0ZShjb25maWdQYXJhbSwgdHJ1ZSwgdHJ1ZSk7XG5cdFx0XHRmb3JtSXRlbS5kYXRhID0gY29uZmlnUGFyYW07XG5cblx0XHRcdC8vIEFkZCBmb3JtIGl0ZW0gdG8gZm9ybVxuXHRcdFx0dGhpcy5fZm9ybS5hcHBlbmQoZm9ybUl0ZW0pO1xuXHRcdH1cblxuXHRcdC8vIEluaXRpYWxpemUga2VuZG8gdmFsaWRhdGlvbiBvbiBmb3JtXG5cdFx0dGhpcy5fdmFsaWRhdG9yID0gdGhpcy5fZm9ybS5rZW5kb1ZhbGlkYXRvcih7XG5cdFx0XHR2YWxpZGF0ZU9uQmx1cjogdHJ1ZSxcblx0XHRcdHJ1bGVzOiB7XG5cdFx0XHRcdC8vIEFkZCBydWxlIHRvIHZhbGlkYXRlIEFPSSBmb3JtIGl0ZW1zP1xuXHRcdFx0XHQvLyAoc2VlOiBodHRwczovL2RlbW9zLnRlbGVyaWsuY29tL2tlbmRvLXVpL3ZhbGlkYXRvci9jdXN0b20tdmFsaWRhdGlvbilcblx0XHRcdFx0YW9pOiBmdW5jdGlvbiAoaW5wdXQpIHtcblx0XHRcdFx0XHRpZiAoaW5wdXQuaXMoJ1tkYXRhLWFvaS1tc2ddJykgJiYgaW5wdXQudmFsKCkgIT0gJycpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0aWYgKGlucHV0LnZhbCgpID09ICcwLDAsMCcpXG5cdFx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cblx0XHRcdH1cblx0XHR9KS5kYXRhKCdrZW5kb1ZhbGlkYXRvcicpO1xuXHR9XG5cblx0dmFsaWRhdGUoKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3ZhbGlkYXRvci52YWxpZGF0ZSgpO1xuXHR9XG59XG5cbi8vIERFRklORSBDT01QT05FTlRcbmlmICghd2luZG93LmN1c3RvbUVsZW1lbnRzLmdldCgnbGlzdC1pdGVtLWVkaXRvcicpKVxuXHR3aW5kb3cuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdsaXN0LWl0ZW0tZWRpdG9yJywgTGlzdEl0ZW1FZGl0b3IpO1xuIiwiZXhwb3J0IGNsYXNzIFZlY3RvcjNESW5wdXQgZXh0ZW5kcyBIVE1MRWxlbWVudFxue1xuXHRjb25zdHJ1Y3RvcihpZCwgaXNWYWxpZGFibGUpXG5cdHtcblx0ICAgIHN1cGVyKCk7XG5cblx0XHR0aGlzLmlkID0gaWQ7XG5cdFx0dGhpcy5uYW1lID0gaWQ7XG5cblx0XHR0aGlzLl9pc1ZhbGlkYWJsZSA9IGlzVmFsaWRhYmxlO1xuXG5cdFx0dGhpcy5faW5pdGlhbGl6ZSgpO1xuXHR9XG5cblx0c2V0IGVuYWJsZUNsZWFyKHZhbHVlKVxuXHR7XG5cdFx0aWYgKHZhbHVlKVxuXHRcdFx0dGhpcy5fY2xlYXJCdXR0b24uc2hvdygpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMuX2NsZWFyQnV0dG9uLmhpZGUoKTtcblx0fVxuXG5cdHNldCBhbGxvd05lZ2F0aXZlKHZhbHVlKVxuXHR7XG5cdFx0aWYgKHZhbHVlKVxuXHRcdHtcblx0XHRcdHRoaXMuX3dpZGdldFguc2V0T3B0aW9ucygge21pbjogbnVsbH0gKTtcblx0XHRcdHRoaXMuX3dpZGdldFkuc2V0T3B0aW9ucygge21pbjogbnVsbH0gKTtcblx0XHRcdHRoaXMuX3dpZGdldFouc2V0T3B0aW9ucygge21pbjogbnVsbH0gKTtcblx0XHR9XG5cdH1cblxuXHRzZXQgdmFsdWUodmFsKVxuXHR7XG5cdFx0dmFyIGNvb3JkcyA9IHZhbC5zcGxpdCgnLCcpO1xuXG5cdFx0aWYgKGNvb3Jkcy5sZW5ndGggPj0gMSlcblx0XHRcdHRoaXMuX3dpZGdldFgudmFsdWUoY29vcmRzWzBdKTtcblxuXHRcdGlmIChjb29yZHMubGVuZ3RoID49IDIpXG5cdFx0XHR0aGlzLl93aWRnZXRZLnZhbHVlKGNvb3Jkc1sxXSk7XG5cblx0XHRpZiAoY29vcmRzLmxlbmd0aCA+PSAzKVxuXHRcdFx0dGhpcy5fd2lkZ2V0Wi52YWx1ZShjb29yZHNbMl0pO1xuXG5cdFx0aWYgKHRoaXMuX2lzVmFsaWRhYmxlKVxuXHRcdFx0dGhpcy5faW5wdXRWYWwudmFsKHRoaXMudmFsdWUpO1xuXHR9XG5cblx0Z2V0IHZhbHVlKClcblx0e1xuXHRcdGlmICh0aGlzLl93aWRnZXRYLnZhbHVlKCkgPT0gbnVsbCAmJiB0aGlzLl93aWRnZXRZLnZhbHVlKCkgPT0gbnVsbCAmJiB0aGlzLl93aWRnZXRaLnZhbHVlKCkgPT0gbnVsbClcblx0XHRcdHJldHVybiAnJztcblx0XHRlbHNlXG5cdFx0XHRyZXR1cm4gdGhpcy5fd2lkZ2V0WC52YWx1ZSgpICsgJywnICsgdGhpcy5fd2lkZ2V0WS52YWx1ZSgpICsgJywnICsgdGhpcy5fd2lkZ2V0Wi52YWx1ZSgpO1xuXHR9XG5cblx0X2luaXRpYWxpemUoKVxuXHR7XG5cdFx0Ly8gR2VuZXJhdGUgY29udGFpbmVyIGZvcm1cblx0XHR0aGlzLl9jb250YWluZXIgPSAkKCc8ZGl2PicsIHtcblx0XHRcdGNsYXNzOiAnZm9ybS1pbmxpbmUnXG5cdFx0fSk7XG5cblx0XHQvLyBBcHBlbmQgY29udGFpbmVyXG5cdFx0JCh0aGlzKS5hcHBlbmQodGhpcy5fY29udGFpbmVyKTtcblxuXHRcdC8vIFNldCBpbnB1dHMgY29uZmlndXJhdGlvblxuXHRcdGxldCBjb25maWdIdG1sID0ge1xuXHRcdFx0dHlwZTogJ251bWJlcicsXG5cdFx0XHRjbGFzczogJ2Zvcm0tY29udHJvbCBzaG9ydC00Jyxcblx0XHR9O1xuXG5cdFx0Ly8gU2V0IHdpZGdldCBjb25maWd1cmF0aW9uXG5cdFx0bGV0IGNvbmZpZ1dpZGdldCA9IHtcblx0XHRcdG1pbjogMCxcblx0XHRcdHNwaW5uZXJzOiBmYWxzZSxcblx0XHRcdGZvcm1hdDogJyMuIyMjIyMjJyxcblx0XHRcdGRlY2ltYWxzOiA2LFxuXHRcdFx0cm91bmQ6IGZhbHNlLFxuXHRcdFx0c3Bpbm5lcnM6IGZhbHNlLFxuXHRcdFx0cmVzdHJpY3REZWNpbWFsczogZmFsc2UsXG5cdFx0XHRjaGFuZ2U6ICQucHJveHkodGhpcy5fb25DaGFuZ2UsIHRoaXMpXG5cdFx0fTtcblxuXHRcdC8vIENyZWF0ZSB3aWRnZXRzXG5cdFx0dGhpcy5faW5wdXRYID0gJCgnPGlucHV0PicsIGNvbmZpZ0h0bWwpO1xuXHRcdHRoaXMuX2NvbnRhaW5lci5hcHBlbmQodGhpcy5faW5wdXRYKTtcblx0XHR0aGlzLl93aWRnZXRYID0gdGhpcy5faW5wdXRYLmtlbmRvTnVtZXJpY1RleHRCb3goY29uZmlnV2lkZ2V0KS5kYXRhKCdrZW5kb051bWVyaWNUZXh0Qm94Jyk7XG5cblx0XHR0aGlzLl9jb250YWluZXIuYXBwZW5kKCc8c3BhbiBjbGFzcz1cInB4LTFcIj4sPC9zcGFuPicpO1xuXG5cdFx0dGhpcy5faW5wdXRZID0gJCgnPGlucHV0PicsIGNvbmZpZ0h0bWwpO1xuXHRcdHRoaXMuX2NvbnRhaW5lci5hcHBlbmQodGhpcy5faW5wdXRZKTtcblx0XHR0aGlzLl93aWRnZXRZID0gdGhpcy5faW5wdXRZLmtlbmRvTnVtZXJpY1RleHRCb3goY29uZmlnV2lkZ2V0KS5kYXRhKCdrZW5kb051bWVyaWNUZXh0Qm94Jyk7XG5cblx0XHR0aGlzLl9jb250YWluZXIuYXBwZW5kKCc8c3BhbiBjbGFzcz1cInB4LTFcIj4sPC9zcGFuPicpO1xuXG5cdFx0dGhpcy5faW5wdXRaID0gJCgnPGlucHV0PicsIGNvbmZpZ0h0bWwpO1xuXHRcdHRoaXMuX2NvbnRhaW5lci5hcHBlbmQodGhpcy5faW5wdXRaKTtcblx0XHR0aGlzLl93aWRnZXRaID0gdGhpcy5faW5wdXRaLmtlbmRvTnVtZXJpY1RleHRCb3goY29uZmlnV2lkZ2V0KS5kYXRhKCdrZW5kb051bWVyaWNUZXh0Qm94Jyk7XG5cblx0XHR0aGlzLl9jb250YWluZXIuYXBwZW5kKCc8c3BhbiBjbGFzcz1cInB4LTFcIj48L3NwYW4+Jyk7IC8vIEFkZGl0aW9uYWwgc3BhY2VyXG5cblx0XHQvLyBDcmVhdGUgaW52aXNpYmxlIGZpZWxkIHRvIGFwcGx5IG92ZXJhbGwgdmFsaWRhdGlvblxuXHRcdGlmICh0aGlzLl9pc1ZhbGlkYWJsZSlcblx0XHR7XG5cdFx0XHR0aGlzLl9pbnB1dFZhbCA9ICQoJzxpbnB1dD4nLCB7bmFtZTogYCR7dGhpcy5uYW1lfS1jdXN0b20tdmFsaWRhdGVgLCAnZGF0YS1hb2ktbXNnJzogJ1ZhbHVlcyBjYW5cXCd0IGFsbCBiZSAwJ30pO1xuXHRcdFx0dGhpcy5fY29udGFpbmVyLmFwcGVuZCh0aGlzLl9pbnB1dFZhbCk7XG5cdFx0XHR0aGlzLl9jb250YWluZXIuYXBwZW5kKGA8c3BhbiBjbGFzcz1cImstaW52YWxpZC1tc2dcIiBkYXRhLWZvcj1cIiR7dGhpcy5uYW1lfS1jdXN0b20tdmFsaWRhdGVcIj48L3NwYW4+YClcblx0XHRcdHRoaXMuX2lucHV0VmFsLmhpZGUoKTtcblx0XHR9XG5cblx0XHQvLyBDcmVhdGUgYW5kIGFwcGVuZCBDbGVhciBidXR0b25cblx0XHR0aGlzLl9jbGVhckJ1dHRvbiA9ICQoJzxidXR0b24+Jywge3R5cGU6ICdidXR0b24nLCBjbGFzczogJ2stYnV0dG9uIGstc2Vjb25kYXJ5IG15LTEnLCB0aXRsZTogJ0NsZWFyJ30pLmFwcGVuZCgkKCc8aSBjbGFzcz1cImZhcyBmYS10aW1lc1wiPjwvaT4nKSk7XG5cdFx0dGhpcy5fY2xlYXJCdXR0b24ub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vbkNsZWFyQ2xpY2ssIHRoaXMpKTtcblx0XHR0aGlzLl9jb250YWluZXIuYXBwZW5kKHRoaXMuX2NsZWFyQnV0dG9uKTtcblxuXHRcdC8vIEhpZGUgYnV0dG9uIGJ5IGRlZmF1bHRcblx0XHR0aGlzLl9jbGVhckJ1dHRvbi5oaWRlKCk7XG5cdH1cblxuXHRfb25DaGFuZ2UoKVxuXHR7XG5cdFx0Ly8gRW1wdHkgc3RyaW5ncyBhcmUgbm90IGFsbG93ZWRcblx0XHRpZiAodGhpcy5fd2lkZ2V0WC52YWx1ZSgpID09IG51bGwpXG5cdFx0XHR0aGlzLl93aWRnZXRYLnZhbHVlKDApO1xuXG5cdFx0aWYgKHRoaXMuX3dpZGdldFkudmFsdWUoKSA9PSBudWxsKVxuXHRcdFx0dGhpcy5fd2lkZ2V0WS52YWx1ZSgwKTtcblxuXHRcdGlmICh0aGlzLl93aWRnZXRaLnZhbHVlKCkgPT0gbnVsbClcblx0XHRcdHRoaXMuX3dpZGdldFoudmFsdWUoMCk7XG5cblx0XHR0aGlzLl9kaXNwYXRjaENvbW1pdCgpO1xuXHR9XG5cblx0X29uQ2xlYXJDbGljaygpXG5cdHtcblx0XHR0aGlzLl93aWRnZXRYLnZhbHVlKCcnKTtcblx0XHR0aGlzLl93aWRnZXRZLnZhbHVlKCcnKTtcblx0XHR0aGlzLl93aWRnZXRaLnZhbHVlKCcnKTtcblxuXHRcdHRoaXMuX2Rpc3BhdGNoQ29tbWl0KCk7XG5cdH1cblxuXHRfZGlzcGF0Y2hDb21taXQoKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2lzVmFsaWRhYmxlKVxuXHRcdFx0dGhpcy5faW5wdXRWYWwudmFsKHRoaXMudmFsdWUpO1xuXG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnY2hhbmdlJykpO1xuXHR9XG59XG5cbi8vIERFRklORSBDT01QT05FTlRcbmlmICghd2luZG93LmN1c3RvbUVsZW1lbnRzLmdldCgndmVjdG9yLTNkLWlucHV0JykpXG5cdHdpbmRvdy5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3ZlY3Rvci0zZC1pbnB1dCcsIFZlY3RvcjNESW5wdXQpO1xuIiwiaW1wb3J0IHtDb25maWdGb3JtSXRlbX0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy91aWJ1aWxkZXIvY29uZmlnLWZvcm0taXRlbSc7XG5cbmltcG9ydCB7Q29uZmlnTnVtZXJpY1N0ZXBwZXJ9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvdWlidWlsZGVyL2NvbmZpZy1udW1lcmljLXN0ZXBwZXInO1xuaW1wb3J0IHtDb25maWdUZXh0SW5wdXR9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvdWlidWlsZGVyL2NvbmZpZy10ZXh0LWlucHV0JztcbmltcG9ydCB7Q29uZmlnQ2hlY2tCb3h9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvdWlidWlsZGVyL2NvbmZpZy1jaGVjay1ib3gnO1xuaW1wb3J0IHtDb25maWdEcm9wRG93bkxpc3R9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvdWlidWlsZGVyL2NvbmZpZy1kcm9wLWRvd24tbGlzdCc7XG5pbXBvcnQge0NvbmZpZ0dyaWR9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvdWlidWlsZGVyL2NvbmZpZy1ncmlkJztcbmltcG9ydCB7Q29uZmlnRHVhbExpc3R9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvdWlidWlsZGVyL2NvbmZpZy1kdWFsLWxpc3QnO1xuaW1wb3J0IHtDb25maWdWZWN0b3IzRH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy91aWJ1aWxkZXIvY29uZmlnLXZlY3Rvci0zZCc7XG5cbmV4cG9ydCBjbGFzcyBDb25maWdGb3JtSXRlbUZhY3Rvcnlcbntcblx0c3RhdGljIGNyZWF0ZShjb25maWdQYXJhbSwgZWRpdEVuYWJsZWQsIGluRGlhbG9nID0gZmFsc2UpXG5cdHtcblx0XHRzd2l0Y2ggKGNvbmZpZ1BhcmFtLnR5cGUpXG5cdFx0e1xuXHRcdFx0Y2FzZSAnVGV4dElucHV0Jzpcblx0XHRcdFx0cmV0dXJuIG5ldyBDb25maWdUZXh0SW5wdXQoY29uZmlnUGFyYW0sIGVkaXRFbmFibGVkLCBpbkRpYWxvZyk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdDaGVja0JveCc6XG5cdFx0XHRcdHJldHVybiBuZXcgQ29uZmlnQ2hlY2tCb3goY29uZmlnUGFyYW0sIGVkaXRFbmFibGVkLCBpbkRpYWxvZyk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdOdW1lcmljU3RlcHBlcic6XG5cdFx0XHRcdHJldHVybiBuZXcgQ29uZmlnTnVtZXJpY1N0ZXBwZXIoY29uZmlnUGFyYW0sIGVkaXRFbmFibGVkLCBpbkRpYWxvZyk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdDb21ib0JveCc6XG5cdFx0XHRcdHJldHVybiBuZXcgQ29uZmlnRHJvcERvd25MaXN0KGNvbmZpZ1BhcmFtLCBlZGl0RW5hYmxlZCwgaW5EaWFsb2cpO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnRGF0YUdyaWQnOlxuXHRcdFx0XHRyZXR1cm4gbmV3IENvbmZpZ0dyaWQoY29uZmlnUGFyYW0sIGVkaXRFbmFibGVkLCBpbkRpYWxvZyk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdEdWFsTGlzdCc6XG5cdFx0XHRcdHJldHVybiBuZXcgQ29uZmlnRHVhbExpc3QoY29uZmlnUGFyYW0sIGVkaXRFbmFibGVkLCBpbkRpYWxvZyk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdWZWN0b3IzRCc6XG5cdFx0XHRcdHJldHVybiBuZXcgQ29uZmlnVmVjdG9yM0QoY29uZmlnUGFyYW0sIGVkaXRFbmFibGVkLCBpbkRpYWxvZyk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gbmV3IENvbmZpZ0Zvcm1JdGVtKGNvbmZpZ1BhcmFtLCBlZGl0RW5hYmxlZCwgaW5EaWFsb2cpOyAvLyBXaWxsIGxvZyBhbiBlcnJvciBmb3IgbWlzc2luZyBmb3JtIGl0ZW0gdHlwZVxuXHRcdH1cblx0fVxufVxuIiwiaW1wb3J0IHtDb25maWd1cmF0aW9uUGFyYW1ldGVyfSBmcm9tICcuL2NvbmZpZ3VyYXRpb24tcGFyYW1ldGVyJztcbmltcG9ydCB7Q29uZmlnRm9ybUl0ZW1GYWN0b3J5fSBmcm9tICcuL2NvbmZpZy1mb3JtLWl0ZW0tZmFjdG9yeSc7XG5cbmV4cG9ydCBjbGFzcyBDb25maWdJbnRlcmZhY2VCdWlsZGVyXG57XG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHRcdC8vIFNldCBzb21lIGNvbnN0YW50c1xuXHRcdHRoaXMuVEFCX1BSRUZJWCA9ICd0YWItJ1xuXHRcdHRoaXMuVEFCX1BBTkVfUFJFRklYID0gJ3RhYnBhbmUtJztcblx0XHR0aGlzLlNFUEFSQVRPUl9CRUZPUkUgPSAnYmVmb3JlJztcblx0XHR0aGlzLlNFUEFSQVRPUl9BRlRFUiA9ICdhZnRlcic7XG5cdH1cblxuXHRkdW1wKG1vZGlmaWVkT25seSA9IGZhbHNlKVxuXHR7XG5cdFx0bGV0IGR1bXBTdHIgPSAnJztcblxuXHRcdGZvciAobGV0IGNwIG9mIHRoaXMuX2NvbmZpZ1BhcmFtcylcblx0XHR7XG5cdFx0XHRpZiAobW9kaWZpZWRPbmx5KVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAoY3AuaXNNb2RpZmllZClcblx0XHRcdFx0XHRkdW1wU3RyICs9IGNwLnRvU3RyaW5nKCkgKyAnXFxuJztcblx0XHRcdH1cblx0XHRcdGVsc2Vcblx0XHRcdFx0ZHVtcFN0ciArPSBjcC50b1N0cmluZygpICsgJ1xcbic7XG5cdFx0fVxuXG5cdFx0Y29uc29sZS5sb2coZHVtcFN0cik7XG5cdH1cblxuXHRidWlsZEludGVyZmFjZShkYXRhLCBtYWluQ29udGFpbmVySWQsIGRpc2FibGVFZGl0ID0gZmFsc2UsIHRhYlN1ZmZpeCA9ICcnKVxuXHR7XG5cdFx0dGhpcy5fbWFpbkNvbnRhaW5lcklkID0gbWFpbkNvbnRhaW5lcklkO1xuXHRcdHRoaXMuX2NvbmZpZ1BhcmFtcyA9IG5ldyBBcnJheSgpO1xuXHRcdHRoaXMuX3ZhbGlkYXRvciA9IG51bGw7XG5cblx0XHRsZXQgaGFzTmV3Rm9ybUl0ZW0gPSBmYWxzZTtcblxuXHRcdC8vY29uc29sZS5sb2coZGF0YS5nZXREdW1wKCkpXG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEuc2l6ZSgpOyBpKyspXG5cdFx0e1xuXHRcdFx0Ly8gUEFSU0UgREFUQVxuXG5cdFx0XHRsZXQgY29uZmlnUGFyYW0gPSBDb25maWd1cmF0aW9uUGFyYW1ldGVyLmZyb21TZnNPYmplY3QoZGF0YS5nZXQoaSkpO1xuXHRcdFx0dGhpcy5fY29uZmlnUGFyYW1zLnB1c2goY29uZmlnUGFyYW0pO1xuXG5cdFx0XHQvLyBHZXQgdGFiIGFuZCB0YWIgcGFuZSBpZCBmcm9tIGdyb3VwIGlkXG5cdFx0XHRjb25zdCB0YWJJZCA9IHRoaXMuVEFCX1BSRUZJWCArIGNvbmZpZ1BhcmFtLmNhdGVnb3J5SWQgKyAodGFiU3VmZml4ID8gJ18nICsgdGFiU3VmZml4IDogJycpO1xuXHRcdFx0Y29uc3QgdGFiUGFuZUlkID0gdGhpcy5UQUJfUEFORV9QUkVGSVggKyBjb25maWdQYXJhbS5jYXRlZ29yeUlkICsgKHRhYlN1ZmZpeCA/ICdfJyArIHRhYlN1ZmZpeCA6ICcnKTtcblxuXHRcdFx0Ly8gQlVJTEQgSU5URVJGQUNFIDo6IFRBQlNcblxuXHRcdFx0Ly8gQ2hlY2sgaWYgYSB0YWIgc3BlY2lmaWMgZm9yIHRoaXMgZ3JvdXAgYWxyZWFkeSBleGlzdHMgaW5zaWRlIHRoZSBtYWluQ29udGFpbmVyOiBpZiBub3QsIGNyZWF0ZSBpdFxuXHRcdFx0Ly8gKGEgdGFiIGFscmVhZHkgZXhpc3RzIGlmIGl0IHdhcyBjcmVhdGVkIGluIGEgcHJldmlvdXMgbG9vcClcblx0XHRcdGxldCB0YWIgPSAkKGAjJHttYWluQ29udGFpbmVySWR9ID4gI3RhYnMgIyR7dGFiSWR9YCk7XG5cblx0XHRcdGlmICh0YWIubGVuZ3RoID09IDApXG5cdFx0XHR7XG5cdFx0XHRcdC8vIENyZWF0ZSB0YWIgZm9yIHRhYiBwYW5lXG5cdFx0XHRcdHRhYiA9ICQoJzxsaT4nLCB7Y2xhc3M6ICduYXYtaXRlbSd9KTtcblx0XHRcdFx0dGFiLmFwcGVuZCgkKCc8YT4nLCB7XG5cdFx0XHRcdFx0Y2xhc3M6ICduYXYtbGluaycgKyAoaSA9PSAwID8gJyBhY3RpdmUnIDogJycpLFxuXHRcdFx0XHRcdGlkOiB0YWJJZCxcblx0XHRcdFx0XHQnZGF0YS10b2dnbGUnOiAndGFiJyxcblx0XHRcdFx0XHRocmVmOiAnIycgKyB0YWJQYW5lSWQsXG5cdFx0XHRcdFx0cm9sZTogJ3RhYicsXG5cdFx0XHRcdFx0J2FyaWEtY29udHJvbHMnOiB0YWJQYW5lSWQsXG5cdFx0XHRcdFx0J2FyaWEtc2VsZWN0ZWQnOiAoaSA9PSAwID8gJ3RydWUnIDogJ2ZhbHNlJyksXG5cdFx0XHRcdFx0aHRtbDogY29uZmlnUGFyYW0uY2F0ZWdvcnksXG5cdFx0XHRcdH0pKTtcblxuXHRcdFx0XHQvLyBBZGQgdGFiIHRvIGNvbnRhaW5lclxuXHRcdFx0XHQkKGAjJHttYWluQ29udGFpbmVySWR9ID4gI3RhYnNgKS5hcHBlbmQodGFiKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQlVJTEQgSU5URVJGQUNFIDo6IFRBQiBQQU5FU1xuXG5cdFx0XHQvLyBDaGVjayBpZiBhIHRhYiBwYW5lIHNwZWNpZmljIGZvciB0aGlzIGdyb3VwIGFscmVhZHkgZXhpc3RzIGluc2lkZSB0aGUgbWFpbkNvbnRhaW5lcjogaWYgbm90LCBjcmVhdGUgaXRcblx0XHRcdC8vIChhIHRhYiBwYW5lIGFscmVhZHkgZXhpc3RzIGlmIGl0IHdhcyBjcmVhdGVkIGluIGEgcHJldmlvdXMgbG9vcCBvciBpZiBpdCBleGlzdHMgc3RhdGljYWxseSBpbiB0aGUgaHRtbCAtIGluIGNhc2UgaXQgaXMgbmVlZGVkIHRvIGFkZCBzb21lIHN0YXRpYyBjb250ZW50KVxuXHRcdFx0bGV0IHRhYlBhbmUgPSAkKGAjJHttYWluQ29udGFpbmVySWR9ID4gI3RhYlBhbmVscyA+ICMke3RhYlBhbmVJZH1gKTtcblxuXHRcdFx0aWYgKHRhYlBhbmUubGVuZ3RoID09IDApXG5cdFx0XHR7XG5cdFx0XHRcdC8vIENyZWF0ZSB0YWIgcGFuZVxuXHRcdFx0XHR0YWJQYW5lID0gJCgnPGRpdj4nLCB7XG5cdFx0XHRcdFx0Y2xhc3M6ICd0YWItcGFuZScgKyAoaSA9PSAwID8gJyBzaG93IGFjdGl2ZScgOiAnJyksXG5cdFx0XHRcdFx0aWQ6IHRhYlBhbmVJZCxcblx0XHRcdFx0XHRyb2xlOiAndGFicGFuZWwnLFxuXHRcdFx0XHRcdCdhcmlhLWxhYmVsbGVkYnknOiB0YWJJZCxcblx0XHRcdFx0XHQnZGF0YS1keW5hbWljJzogJ3RydWUnLFxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHQvLyBBZGQgdGFiIHBhbmUgdG8gY29udGFpbmVyXG5cdFx0XHRcdCQoYCMke21haW5Db250YWluZXJJZH0gPiAjdGFiUGFuZWxzYCkuYXBwZW5kKHRhYlBhbmUpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBCVUlMRCBJTlRFUkZBQ0UgOjogVEFCIFBBTkVTJyBGT1JNXG5cblx0XHRcdC8vIENoZWNrIGlmIGEgZm9ybSBhbHJlYWR5IGV4aXN0cyBpbnNpZGUgdGhlIHRhYiBwYW5lOiBpZiBub3QsIGNyZWF0ZSBpdFxuXHRcdFx0bGV0IGZvcm0gPSB0YWJQYW5lLmZpbmQoJ2Zvcm0nKTtcblxuXHRcdFx0aWYgKGZvcm0ubGVuZ3RoID09IDApXG5cdFx0XHR7XG5cdFx0XHRcdC8vIENyZWF0ZSBmb3JtXG5cdFx0XHRcdGZvcm0gPSAkKCc8Zm9ybT4nLCB7XG5cdFx0XHRcdFx0Y2xhc3M6ICcnLFxuXHRcdFx0XHRcdGF1dG9jb21wbGV0ZTogJ29mZidcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0Ly8gQ3JlYXRlIGFuIGlubmVyIGZpZWxkc2V0OyB0aGlzIG1pZ2h0IGJlIHVzZWZ1bCB0byBlYXNpbHkgZGlzYWJsZSB0aGUgd2hvbGUgZm9ybSBhdCBvbmNlIChhY3R1YWxseSB3ZSBkb24ndCB1c2UgaXQgYmVjYXVzZSBLZW5kbyB3aWRnZXRzIGFyZSBub3QgZGlzYWJsZWQgYXV0b21hdGljYWxseSlcblx0XHRcdFx0Zm9ybS5hcHBlbmQoXG5cdFx0XHRcdFx0JCgnPGZpZWxkc2V0PicsIHtcblx0XHRcdFx0XHRcdGNsYXNzOiAnJ1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0Ly8gQWRkIGZvcm0gdG8gdGFiIHBhbmVcblx0XHRcdFx0dGFiUGFuZS5wcmVwZW5kKGZvcm0pO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBHZXQgZmllbGRzZXQsIHdoaWNoIGlzIHRoZSBhY3R1YWwgZm9ybSBpdGVtcyBjb250YWluZXJcblx0XHRcdGxldCBmaWVsZHNldCA9IGZvcm0uZmluZCgnZmllbGRzZXQnKTtcblxuXHRcdFx0Ly8gQlVJTEQgSU5URVJGQUNFIDo6IFRBQiBQQU5FUycgRk9STSBJVEVNU1xuXG5cdFx0XHQvLyBDaGVjayBpZiBmb3JtIGl0ZW0gYWxyZWFkeSBleGlzdHMgaW4gZmllbGRzZXQ7IGlmIHllcywganVzdCB1cGRhdGUgaXRzIGRhdGFcblx0XHRcdGxldCBmb3JtSXRlbSA9IGZpZWxkc2V0LmZpbmQoYCNmb3JtLWl0ZW0tJHskLmVzY2FwZVNlbGVjdG9yKGNvbmZpZ1BhcmFtLm5hbWUpfWApO1xuXG5cdFx0XHRpZiAoZm9ybUl0ZW0ubGVuZ3RoID09IDApXG5cdFx0XHR7XG5cdFx0XHRcdGhhc05ld0Zvcm1JdGVtID0gdHJ1ZTtcblxuXHRcdFx0XHRmb3JtSXRlbSA9IENvbmZpZ0Zvcm1JdGVtRmFjdG9yeS5jcmVhdGUoY29uZmlnUGFyYW0sICFkaXNhYmxlRWRpdCk7XG5cblx0XHRcdFx0Ly8gQWRkIHNlcGFyYXRvciBiZWZvcmVcblx0XHRcdFx0aWYgKGNvbmZpZ1BhcmFtLnNlcGFyYXRvciAhPSBudWxsICYmIGNvbmZpZ1BhcmFtLnNlcGFyYXRvci5wb3MgPT0gJ2JlZm9yZScpXG5cdFx0XHRcdFx0ZmllbGRzZXQuYXBwZW5kKHRoaXMuX2J1aWxkU2VwYXJhdG9yKGNvbmZpZ1BhcmFtLnNlcGFyYXRvcikpO1xuXG5cdFx0XHRcdC8vIEFkZCBmb3JtIGl0ZW0gdG8gZm9ybVxuXHRcdFx0XHRmaWVsZHNldC5hcHBlbmQoZm9ybUl0ZW0pO1xuXG5cdFx0XHRcdC8vIEFkZCBzZXBhcmF0b3IgYWZ0ZXJcblx0XHRcdFx0aWYgKGNvbmZpZ1BhcmFtLnNlcGFyYXRvciAhPSBudWxsICYmIGNvbmZpZ1BhcmFtLnNlcGFyYXRvci5wb3MgPT0gJ2FmdGVyJylcblx0XHRcdFx0XHRmaWVsZHNldC5hcHBlbmQodGhpcy5fYnVpbGRTZXBhcmF0b3IoY29uZmlnUGFyYW0uc2VwYXJhdG9yKSk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlXG5cdFx0XHRcdGZvcm1JdGVtWzBdLmRhdGEgPSBjb25maWdQYXJhbTtcblx0XHR9XG5cblx0XHQvLyBBZGQgbGlzdGVuZXIgdG8gc2hvdyBoZWxwIHRvb2x0aXBzXG5cdFx0bGV0IGFsbFRhYlBhbmVzID0gJChgIyR7bWFpbkNvbnRhaW5lcklkfSA+ICN0YWJQYW5lbHMgPiBkaXYudGFiLXBhbmVgKTtcblx0XHRhbGxUYWJQYW5lcy5rZW5kb1Rvb2x0aXAoe1xuXHRcdFx0ZmlsdGVyOiAnaVt0aXRsZV0uaGVscCcsXG5cdFx0XHRwb3NpdGlvbjogJ3JpZ2h0Jyxcblx0XHRcdHdpZHRoOiAnMjUwcHgnLFxuXHRcdFx0Y29udGVudDogZnVuY3Rpb24oZSkge1xuXHRcdFx0XHRyZXR1cm4gYDxkaXYgY2xhc3M9XCJoZWxwLXRvb2x0aXBcIj4ke2UudGFyZ2V0LmRhdGEoJ3RpdGxlJyl9PC9kaXY+YDtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdC8vIEluaXRpYWxpemUga2VuZG8gdmFsaWRhdGlvbiBvbiBmb3JtcycgbWFpbiBjb250YWluZXJcblx0XHR0aGlzLl92YWxpZGF0b3IgPSAkKGAjJHttYWluQ29udGFpbmVySWR9YCkua2VuZG9WYWxpZGF0b3Ioe1xuXHRcdFx0dmFsaWRhdGVPbkJsdXI6IHRydWUsXG5cdFx0XHRydWxlczoge1xuXHRcdFx0XHQvLyBBZGQgcnVsZSB0byB2YWxpZGF0ZSBBT0kgZm9ybSBpdGVtc1xuXHRcdFx0XHQvLyAoc2VlOiBodHRwczovL2RlbW9zLnRlbGVyaWsuY29tL2tlbmRvLXVpL3ZhbGlkYXRvci9jdXN0b20tdmFsaWRhdGlvbilcblx0XHRcdFx0YW9pOiBmdW5jdGlvbiAoaW5wdXQpIHtcblx0XHRcdFx0XHRpZiAoaW5wdXQuaXMoJ1tkYXRhLWFvaS1tc2ddJykgJiYgaW5wdXQudmFsKCkgIT0gJycpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0aWYgKGlucHV0LnZhbCgpID09ICcwLDAsMCcpXG5cdFx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cblx0XHRcdH1cblx0XHR9KS5kYXRhKCdrZW5kb1ZhbGlkYXRvcicpO1xuXHR9XG5cblx0ZGVzdHJveUludGVyZmFjZSgpXG5cdHtcblx0XHQvLyBEZXN0cm95IGFsbCBLZW5kbyB3aWRnZXRzIGluIGZvcm1zXG5cdFx0a2VuZG8uZGVzdHJveSgkKGAjJHt0aGlzLl9tYWluQ29udGFpbmVySWR9ID4gI3RhYlBhbmVscyA+IGRpdi50YWItcGFuZSA+IGZvcm1gKSk7XG5cblx0XHQvLyBSZW1vdmUgYWxsIHRhYnNcblx0XHQkKGAjJHt0aGlzLl9tYWluQ29udGFpbmVySWR9ID4gI3RhYnNgKS5lbXB0eSgpO1xuXG5cdFx0Ly8gUmVtb3ZlIGR5bmFtaWMgdGFiIHBhbmVzICh0YWIgcGFuZXMgY3JlYXRlZCBieSBJbnRlcmZhY2UgQnVpbGRlcilcblx0XHQkKGAjJHt0aGlzLl9tYWluQ29udGFpbmVySWR9ID4gI3RhYlBhbmVscyA+IGRpdi50YWItcGFuZVtkYXRhLWR5bmFtaWM9XCJ0cnVlXCJdYCkucmVtb3ZlKCk7XG5cblx0XHQvLyBSZW1vdmUgZm9ybSBpbnNpZGUgc3RhdGljIHRhYiBwYW5lcyAocHJlZGVmaW5lZCB0YWIgcGFuZXMgaW4gaHRtbClcblx0XHQkKGAjJHt0aGlzLl9tYWluQ29udGFpbmVySWR9ID4gI3RhYlBhbmVscyA+IGRpdi50YWItcGFuZSA+IGZvcm1gKS5yZW1vdmUoKTtcblx0fVxuXG5cdGRpc2FibGVJbnRlcmZhY2UoZGlzYWJsZSlcblx0e1xuXHRcdC8vIEVuYWJsZS9kaXNhYmxlIGFsbCBjb25maWcgZm9ybSBpdGVtc1xuXHRcdCQoYCMke3RoaXMuX21haW5Db250YWluZXJJZH0gKltpZF49J2Zvcm0taXRlbS0nXWApLnByb3AoJ2VkaXRFbmFibGVkJywgIWRpc2FibGUpO1xuXHR9XG5cblx0X2J1aWxkU2VwYXJhdG9yKHNlcGFyYXRvcilcblx0e1xuXHRcdGlmIChzZXBhcmF0b3IudGV4dCA9PSBudWxsKVxuXHRcdFx0cmV0dXJuICQoYDxociBjbGFzcz1cImNvbmZpZy1mb3JtLXNlcGFyYXRvclwiPmApO1xuXG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuICQoYDxsYWJlbCBjbGFzcz1cImNvbmZpZy1mb3JtLXNlcGFyYXRvci1sYWJlbCBtYi0zXCI+JHtzZXBhcmF0b3IudGV4dH08L2xhYmVsPmApO1xuXHR9XG5cblx0Z2V0Q2hhbmdlZERhdGEoKVxuXHR7XG5cdFx0bGV0IGNoYW5nZXMgPSBuZXcgU0ZTMlguU0ZTQXJyYXkoKTtcblxuXHRcdGZvciAodmFyIGNwIG9mIHRoaXMuX2NvbmZpZ1BhcmFtcylcblx0XHR7XG5cdFx0XHRpZiAoY3AuaXNNb2RpZmllZClcblx0XHRcdFx0Y2hhbmdlcy5hZGRTRlNPYmplY3QoY3AudG9TZnNPYmplY3QoKSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNoYW5nZXM7XG5cdH1cblxuXHRyZXNldElzTW9kaWZpZWQoKVxuXHR7XG5cdFx0Zm9yIChsZXQgY3Agb2YgdGhpcy5fY29uZmlnUGFyYW1zKVxuXHRcdHtcblx0XHRcdGlmIChjcC5pc01vZGlmaWVkKVxuXHRcdFx0XHRjcC5yZXNldElzTW9kaWZpZWQoKTtcblx0XHR9XG5cdH1cblxuXHRjaGVja0lzVmFsaWQoKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3ZhbGlkYXRvci52YWxpZGF0ZSgpO1xuXHR9XG5cblx0cmVzZXRWYWxpZGF0aW9uKClcblx0e1xuXHRcdHRoaXMuX3ZhbGlkYXRvci5oaWRlTWVzc2FnZXMoKTtcblxuXHRcdC8vIFRoZSBtZXRob2QgYWJvdmUgZG9lc24ndCByZW1vdmUgdGhlIGstaW52YWxpZCBjbGFzc2VzIGFuZCBhcmlhLWludmFsaWQ9XCJ0cnVlXCIgYXR0cmlidXRlcyBmcm9tIGlucHV0c1xuXHRcdC8vIExldCdzIGRvIGl0IG1hbnVhbGx5XG5cdFx0JChgIyR7dGhpcy5fbWFpbkNvbnRhaW5lcklkfSAuay1pbnZhbGlkYCkucmVtb3ZlQ2xhc3MoJ2staW52YWxpZCcpO1xuXHRcdCQoYCMke3RoaXMuX21haW5Db250YWluZXJJZH0gW2FyaWEtaW52YWxpZD1cInRydWVcIl1gKS5yZW1vdmVBdHRyKCdhcmlhLWludmFsaWQnKTtcblx0fVxuXG5cdGdldENvbmZpZ0Zvcm1JdGVtKGNvbmZpZ1BhcmFtTmFtZSlcblx0e1xuXHRcdGxldCBmb3JtSXRlbSA9ICQoYCMke3RoaXMuX21haW5Db250YWluZXJJZH1gKS5maW5kKGAjZm9ybS1pdGVtLSR7JC5lc2NhcGVTZWxlY3Rvcihjb25maWdQYXJhbU5hbWUpfWApO1xuXG5cdFx0aWYgKGZvcm1JdGVtLmxlbmd0aCA+IDApXG5cdFx0XHRyZXR1cm4gZm9ybUl0ZW1bMF07XG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHRhY3RpdmF0ZUZpcnN0VGFiUGFuZWwoKVxuXHR7XG5cdFx0bGV0IGNvbmZpZ1BhcmFtID0gdGhpcy5fY29uZmlnUGFyYW1zWzBdO1xuXHRcdGNvbnN0IHRhYlBhbmVJZCA9IHRoaXMuVEFCX1BBTkVfUFJFRklYICsgY29uZmlnUGFyYW0uY2F0ZWdvcnlJZDtcblx0XHRsZXQgdGFiUGFuZSA9ICQoYCMke3RoaXMuX21haW5Db250YWluZXJJZH0gPiAjdGFiUGFuZWxzID4gIyR7dGFiUGFuZUlkfWApO1xuXHRcdHRhYlBhbmUuYWRkQ2xhc3MoJ3Nob3cgYWN0aXZlJyk7XG5cdH1cbn1cbiIsImV4cG9ydCBjbGFzcyBDb25maWd1cmF0aW9uUGFyYW1ldGVyXG57XG5cdHN0YXRpYyBmcm9tU2ZzT2JqZWN0KGVsZW1lbnQpXG5cdHtcblx0XHRsZXQgY3AgPSBuZXcgQ29uZmlndXJhdGlvblBhcmFtZXRlcigpO1xuXG5cdFx0Ly8gUGFyc2UgY29tbW9uIGRhdGFcblx0XHRjcC5uYW1lID0gZWxlbWVudC5nZXRVdGZTdHJpbmcoJ25hbWUnKTtcblx0XHRjcC5sYWJlbCA9IGVsZW1lbnQuZ2V0VXRmU3RyaW5nKCdsYWJlbCcpO1xuXHRcdGNwLmNhdGVnb3J5ID0gZWxlbWVudC5nZXRVdGZTdHJpbmcoJ2NhdGVnb3J5Jyk7XG5cdFx0Y3AudG9vbHRpcCA9IGVsZW1lbnQuZ2V0VXRmU3RyaW5nKCd0b29sdGlwJyk7XG5cdFx0Y3AudHlwZSA9IGVsZW1lbnQuZ2V0VXRmU3RyaW5nKCd0eXBlJyk7XG5cdFx0Y3AudmFsdWUgPSBlbGVtZW50LmdldCgndmFsdWUnKTtcblx0XHRjcC52YWxpZGF0b3IgPSBlbGVtZW50LmdldFV0ZlN0cmluZygndmFsaWRhdG9yJyk7XG5cdFx0Y3AuZWRpdGFibGUgPSAoZWxlbWVudC5jb250YWluc0tleSgnZWRpdCcpID8gZWxlbWVudC5nZXRCb29sKCdlZGl0JykgOiB0cnVlKTtcblx0XHRjcC50cmlnZ2VyID0gKGVsZW1lbnQuY29udGFpbnNLZXkoJ3RyaWdnZXInKSA/IGVsZW1lbnQuZ2V0Qm9vbCgndHJpZ2dlcicpIDogZmFsc2UpO1xuXHRcdGNwLnRyaWdnZXJEYXRhID0gZWxlbWVudC5nZXRTRlNBcnJheSgndHJpZ2dlckRhdGEnKTtcblx0XHRjcC5jbGllbnRPbmx5ID0gKGVsZW1lbnQuY29udGFpbnNLZXkoJ2NsaWVudE9ubHknKSA/IGVsZW1lbnQuZ2V0Qm9vbCgnY2xpZW50T25seScpIDogZmFsc2UpO1xuXHRcdGNwLmRhdGFQcm92aWRlciA9IGVsZW1lbnQuZ2V0VXRmU3RyaW5nKCdkYXRhUHJvdmlkZXInKTtcblxuXHRcdC8vIFBhcnNlIGNvbXBvbmVudCBzcGVjaWZpYyBhdHRyaWJ1dGVzXG5cdFx0bGV0IHRtcEF0dHJpYnV0ZXMgPSBlbGVtZW50LmdldFNGU09iamVjdCgnYXR0cmlidXRlcycpO1xuXHRcdGlmICh0bXBBdHRyaWJ1dGVzICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0bGV0IGF0dHJpYnV0ZXMgPSB7fTtcblxuXHRcdFx0bGV0IGtleXMgPSB0bXBBdHRyaWJ1dGVzLmdldEtleXNBcnJheSgpO1xuXHRcdFx0Zm9yIChsZXQga2V5IG9mIGtleXMpXG5cdFx0XHRcdGF0dHJpYnV0ZXNba2V5XSA9IHRtcEF0dHJpYnV0ZXMuZ2V0KGtleSk7XG5cblx0XHRcdGNwLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzO1xuXHRcdH1cblxuXHRcdC8vIFBhcnNlIHNlcGFyYXRvciBzZXR0aW5nc1xuXHRcdGxldCB0bXBTZXBhcmF0b3IgPSBlbGVtZW50LmdldFNGU09iamVjdCgnc2VwYXJhdG9yJyk7XG5cdFx0aWYgKHRtcFNlcGFyYXRvciAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGxldCBzZXBhcmF0b3IgPSB7fTtcblxuXHRcdFx0bGV0IGtleXMxID0gdG1wU2VwYXJhdG9yLmdldEtleXNBcnJheSgpO1xuXHRcdFx0Zm9yIChsZXQga2V5MSBvZiBrZXlzMSlcblx0XHRcdFx0c2VwYXJhdG9yW2tleTFdID0gdG1wU2VwYXJhdG9yLmdldChrZXkxKTtcblxuXHRcdFx0Y3Auc2VwYXJhdG9yID0gc2VwYXJhdG9yO1xuXHRcdH1cblxuXHRcdC8vIFBhcnNlIGRlZmF1bHQgbGlzdCBpdGVtXG5cdFx0bGV0IHRtcERlZmF1bHRMaXN0SXRlbSA9IGVsZW1lbnQuZ2V0U0ZTQXJyYXkoJ2RlZmF1bHRMaXN0SXRlbScpO1xuXHRcdGlmICh0bXBEZWZhdWx0TGlzdEl0ZW0gIT0gbnVsbCAmJiB0bXBEZWZhdWx0TGlzdEl0ZW0uc2l6ZSgpID4gMClcblx0XHR7XG5cdFx0XHRsZXQgZGVmYXVsdExpc3RJdGVtID0gW107XG5cblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdG1wRGVmYXVsdExpc3RJdGVtLnNpemUoKTsgaSsrKVxuXHRcdFx0XHRkZWZhdWx0TGlzdEl0ZW0ucHVzaChDb25maWd1cmF0aW9uUGFyYW1ldGVyLmZyb21TZnNPYmplY3QodG1wRGVmYXVsdExpc3RJdGVtLmdldFNGU09iamVjdChpKSkpO1xuXG5cdFx0XHRjcC5kZWZhdWx0TGlzdEl0ZW0gPSBkZWZhdWx0TGlzdEl0ZW07XG5cblx0XHRcdC8vIFBhcnNlIGxpc3QgdmFsdWVzXG5cdFx0XHRsZXQgbGlzdFZhbHVlcyA9IFtdO1xuXG5cdFx0XHRsZXQgdG1wTGlzdFZhbHVlcyA9IGVsZW1lbnQuZ2V0U0ZTQXJyYXkoJ2xpc3RWYWx1ZXMnKTtcblx0XHRcdGlmICh0bXBMaXN0VmFsdWVzICE9IG51bGwgJiYgdG1wTGlzdFZhbHVlcy5zaXplKCkgPiAwKVxuXHRcdFx0e1xuXHRcdFx0XHRmb3IgKGxldCB2ID0gMDsgdiA8IHRtcExpc3RWYWx1ZXMuc2l6ZSgpOyB2KyspXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsZXQgbGlzdFZhbHVlT2JqID0gdG1wTGlzdFZhbHVlcy5nZXRTRlNPYmplY3Qodik7XG5cdFx0XHRcdFx0bGV0IG9iaiA9IHt9O1xuXG5cdFx0XHRcdFx0bGV0IGtleXMyID0gbGlzdFZhbHVlT2JqLmdldEtleXNBcnJheSgpO1xuXHRcdFx0XHRcdGZvciAobGV0IGtleTIgb2Yga2V5czIpXG5cdFx0XHRcdFx0XHRvYmpba2V5Ml0gPSBsaXN0VmFsdWVPYmouZ2V0KGtleTIpO1xuXG5cdFx0XHRcdFx0bGlzdFZhbHVlcy5wdXNoKG9iaik7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Y3AubGlzdFZhbHVlcyA9IGxpc3RWYWx1ZXM7XG5cblx0XHRcdC8vIElmIHdlIGhhdmUgYSBsaXN0LCBvbiB0aGUgc2VydmVyLXNpZGUgaXRlbXMgY291bGQgYmUgcmVwcmVzZW50ZWQgYnkgYSBjbGFzc1xuXHRcdFx0Y3AuY2xhenogPSBlbGVtZW50LmdldFV0ZlN0cmluZygnY2xhenonKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gY3A7XG5cdH1cblxuXHRjb25zdHJ1Y3RvcigpXG5cdHtcblx0XHQvKiBDT05TVEFOVFMgKi9cblx0XHR0aGlzLkRFRkFVTFRfQ0FURUdPUllfTkFNRSA9ICdHZW5lcmFsJztcblx0XHR0aGlzLkRFRkFVTFRfQ0FURUdPUllfSUQgPSAnZ2VuZXJhbCc7XG5cblx0XHQvKiBQVUJMSUMgVkFSUyAqL1xuXG5cdFx0dGhpcy5uYW1lID0gJyc7XG5cdFx0dGhpcy5sYWJlbCA9ICcnO1xuXHRcdHRoaXMudG9vbHRpcCA9ICcnO1xuXHRcdHRoaXMudHlwZSA9IG51bGw7XG5cdFx0dGhpcy50cmlnZ2VyID0gZmFsc2U7XG5cdFx0dGhpcy50cmlnZ2VyRGF0YSA9IG51bGw7XG5cdFx0dGhpcy5jbGllbnRPbmx5ID0gZmFsc2U7XG5cdFx0dGhpcy5lZGl0YWJsZSA9IHRydWU7XG5cdFx0dGhpcy5hdHRyaWJ1dGVzID0gbnVsbDtcblx0XHR0aGlzLmRhdGFQcm92aWRlciA9IG51bGw7XG5cblx0XHR0aGlzLnNlcGFyYXRvciA9IG51bGw7XHRcdFx0Ly8gUGFyYW1ldGVyIHVzZWQgdG8gY3JlYXRlIGEgc2VwYXJhdG9yIGJlZm9yZSBvciBhZnRlciB0aGUgY29uZmlnIHBhcmFtZXRlclxuXHRcdHRoaXMuZGVmYXVsdExpc3RJdGVtID0gbnVsbDtcdFx0Ly8gTGlzdCBvZiBzdWItQ29uZmlndXJhdGlvblBhcmFtZXRlcnMsIGVhY2ggY29udGFpbmluZyB0aGUgZGVmYXVsdCB2YWx1ZXNcblx0XHR0aGlzLmNsYXp6ID0gbnVsbDtcdFx0XHRcdC8vIE5hbWUgb2YgdGhlIGNsYXNzIHJlcHJlc2VudGluZyB0aGUgbGlzdCBpdGVtIChub3QgdXNlZCBpbiBjYXNlIG9mIHByaW1pdGV2ZSBkYXRhIHR5cGVzKVxuXG5cdFx0LyogUFJJVkFURSBWQVJTICovXG5cblx0XHR0aGlzLl9jYXRlZ29yeSA9IHRoaXMuREVGQVVMVF9DQVRFR09SWV9OQU1FO1xuXHRcdHRoaXMuX2NhdGVnb3J5SWQgPSB0aGlzLkRFRkFVTFRfQ0FURUdPUllfSUQ7XG5cdFx0dGhpcy5fdmFsdWUgPSBudWxsO1xuXHRcdHRoaXMuX2luaXRpYWxWYWx1ZSA9IG51bGw7XHRcdC8vIFNhdmUgdGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyLCB0byBjaGVjayBpZiB0aGUgdmFsdWUgd2FzIG1vZGlmaWVkXG5cdFx0dGhpcy5fdmFsaWRhdG9yID0gbnVsbDtcblxuXHRcdHRoaXMuX2xpc3RJdGVtcyA9IFtdO1x0XHRcdC8vIEFycmF5IG9mIGFycmF5cyBvZiBDb25maWd1cmF0aW9uUGFyYW1ldGVyc1xuXHRcdHRoaXMuX2xpc3RJdGVtc0NoYW5nZWQgPSBmYWxzZTtcdC8vIEZsYWcgdG8gYmUgc2V0IGluIGNhc2UgYSBsaXN0IGl0ZW0gaXMgYWRkZWQgb3IgcmVtb3ZlZFxuXHR9XG5cblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0Ly8gR0VUVEVSUyAvIFNFVFRFUlNcblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRzZXQgY2F0ZWdvcnkodmFsKVxuXHR7XG5cdFx0aWYgKHZhbClcblx0XHR7XG5cdFx0XHR0aGlzLl9jYXRlZ29yeSA9IHZhbDtcblx0XHRcdHRoaXMuX3NldElkRnJvbUNhdGVnb3J5TmFtZSh0aGlzLl9jYXRlZ29yeSk7XG5cdFx0fVxuXHR9XG5cblx0Z2V0IGNhdGVnb3J5KClcblx0e1xuXHRcdHJldHVybiB0aGlzLl9jYXRlZ29yeTtcblx0fVxuXG5cdHNldCB2YWx1ZSh2YWwpXG5cdHtcblx0XHRpZiAodGhpcy5fdmFsdWUgIT0gdmFsKVxuXHRcdHtcblx0XHRcdC8vIElmIHZhbHVlIGlzIG51bGwsIHRoZW4gd2UgYXJlIHNldHRpbmcgdGhpcyBmb3IgdGhlIGZpcnN0IHRpbWUgYW5kXG5cdFx0XHQvLyB3ZSB3YW50IHRvIHNhdmUgdGhlIGluaXRpYWwgdmFsdWUsIHRvIGNoZWNrIGxhdGVyIGlmIGl0IGhhcyBiZWVuIG1vZGlmaWVkXG5cdFx0XHRpZiAodGhpcy5fdmFsdWUgPT0gbnVsbClcblx0XHRcdFx0dGhpcy5faW5pdGlhbFZhbHVlID0gdmFsO1xuXG5cdFx0XHR0aGlzLl92YWx1ZSA9IHZhbDtcblx0XHR9XG5cdH1cblxuXHRnZXQgdmFsdWUoKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3ZhbHVlO1xuXHR9XG5cblx0c2V0IHZhbGlkYXRvcih2YWwpXG5cdHtcblx0XHRpZiAodmFsKVxuXHRcdFx0dGhpcy5fdmFsaWRhdG9yID0gdmFsO1xuXHR9XG5cblx0Z2V0IHZhbGlkYXRvcigpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fdmFsaWRhdG9yO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFuIGFycmF5IG9mIG9iamVjdHM7IGVhY2ggb2JqZWN0IGNvbnRhaW5zIHRoZSBuYW1lLXZhbHVlIHBhaXJzIHVzZWQgdG9cblx0ICogcG9wdWxhdGUgdGhlIGxpc3Qgb2Ygc3ViLWNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBhcnJheXMsIGJhc2VkIG9uIGRlZmF1bHRMaXN0SXRlbS5cblx0ICovXG5cdHNldCBsaXN0VmFsdWVzKGFycilcblx0e1xuXHRcdHRoaXMuX3NldFN1YkNvbmZpZ3VyYXRpb25QYXJhbXMoYXJyKTtcblx0fVxuXG5cdGdldCBsaXN0VmFsdWVzKClcblx0e1xuXHRcdHJldHVybiB0aGlzLl9nZXRTdWJDb25maWd1cmF0aW9uUGFyYW1zVmFsdWVzKCk7XG5cdH1cblxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQvLyBHRVRURVJTIE9OTFlcblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRnZXQgaXNNb2RpZmllZCgpXG5cdHtcblx0XHRsZXQgX2lzTW9kaWZpZWQgPSBmYWxzZTtcblxuXHRcdC8vIElmIHRoZSBwYXJhbWV0ZXIgaXMgdXNlZCBvbiB0aGUgY2xpZW50IG9ubHkgKGZvciBleGFtcGxlIGluIGEgY3VzdG9tIHRyaWdnZXIpXG5cdFx0Ly8gdGhlbiB3ZSBuZXZlciBoYXZlIHRvIGNvbnNpZGVyIGl0IGFzIG1vZGlmaWVkLCB0byBwcmV2ZW50IGl0IGJlaW5nIHNlbnQgdG8gdGhlIHNlcnZlclxuXHRcdGlmICghdGhpcy5jbGllbnRPbmx5KVxuXHRcdHtcblx0XHRcdGlmICh0aGlzLl92YWx1ZSAhPSB0aGlzLl9pbml0aWFsVmFsdWUgfHwgdGhpcy5fbGlzdEl0ZW1zQ2hhbmdlZClcblx0XHRcdFx0X2lzTW9kaWZpZWQgPSB0cnVlO1xuXHRcdFx0ZWxzZVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBDaGVjayBzdWIgcGFyYW1ldGVyc1xuXHRcdFx0XHRvdXRlckxvb3A6IGZvciAobGV0IGxpc3RJdGVtIG9mIHRoaXMuX2xpc3RJdGVtcylcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGZvciAobGV0IHN1YkNQIG9mIGxpc3RJdGVtKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGlmIChzdWJDUC5pc01vZGlmaWVkKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRfaXNNb2RpZmllZCA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdGJyZWFrIG91dGVyTG9vcDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gX2lzTW9kaWZpZWQ7XG5cdH1cblxuXHRnZXQgY2F0ZWdvcnlJZCgpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fY2F0ZWdvcnlJZDtcblx0fVxuXG5cdGdldCBsaXN0SXRlbXMoKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2xpc3RJdGVtcztcblx0fVxuXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdC8vIFBVQkxJQyBNRVRIT0RTXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0LyoqXG5cdCAqIFJldHVybiBhIGNsb25lIG9mIHRoaXMgQ29uZmlndXJhdGlvblBhcmFtZXRlci5cblx0ICovXG5cdGNsb25lKGNsb25lVmFsdWUgPSBmYWxzZSlcblx0e1xuXHRcdGxldCBjcCA9IG5ldyBDb25maWd1cmF0aW9uUGFyYW1ldGVyKCk7XG5cdFx0Y3AubmFtZSA9IHRoaXMubmFtZTtcblx0XHRjcC5sYWJlbCA9IHRoaXMubGFiZWw7XG5cdFx0Y3AuY2F0ZWdvcnkgPSB0aGlzLmNhdGVnb3J5O1xuXHRcdGNwLnRvb2x0aXAgPSB0aGlzLnRvb2x0aXA7XG5cdFx0Y3AudHlwZSA9IHRoaXMudHlwZTtcblx0XHRjcC52YWxpZGF0b3IgPSB0aGlzLnZhbGlkYXRvcjtcblx0XHRjcC50cmlnZ2VyID0gdGhpcy50cmlnZ2VyO1xuXHRcdGNwLnRyaWdnZXJEYXRhID0gKHRoaXMudHJpZ2dlckRhdGEgIT0gbnVsbCA/IFNGUzJYLlNGU0FycmF5Lm5ld0Zyb21CaW5hcnlEYXRhKHRoaXMudHJpZ2dlckRhdGEudG9CaW5hcnkoKSkgOiBudWxsKTtcblx0XHRjcC5jbGllbnRPbmx5ID0gdGhpcy5jbGllbnRPbmx5O1xuXHRcdGNwLmRhdGFQcm92aWRlciA9IHRoaXMuZGF0YVByb3ZpZGVyO1xuXG5cdFx0aWYgKGNsb25lVmFsdWUpXG5cdFx0XHRjcC52YWx1ZSA9IHRoaXMudmFsdWU7XG5cblx0XHRpZiAodGhpcy5hdHRyaWJ1dGVzICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0Y3AuYXR0cmlidXRlcyA9IG5ldyBPYmplY3QoKTtcblx0XHRcdGZvciAobGV0IHMxIGluIHRoaXMuYXR0cmlidXRlcylcblx0XHRcdFx0Y3AuYXR0cmlidXRlc1tzMV0gPSB0aGlzLmF0dHJpYnV0ZXNbczFdO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLnNlcGFyYXRvciAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGNwLnNlcGFyYXRvciA9IG5ldyBPYmplY3QoKVxuXHRcdFx0Zm9yIChsZXQgczIgaW4gdGhpcy5zZXBhcmF0b3IpXG5cdFx0XHRcdGNwLnNlcGFyYXRvcltzMl0gPSB0aGlzLnNlcGFyYXRvcltzMl07XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuZGVmYXVsdExpc3RJdGVtICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0bGV0IGNsb25lZERlZmF1bHRMaXN0SXRlbXMgPSBbXTtcblxuXHRcdFx0Zm9yIChsZXQgc3ViQ1Agb2YgdGhpcy5kZWZhdWx0TGlzdEl0ZW0pXG5cdFx0XHRcdGNsb25lZERlZmF1bHRMaXN0SXRlbXMucHVzaChzdWJDUC5jbG9uZShjbG9uZVZhbHVlKSk7XG5cblx0XHRcdGNwLmRlZmF1bHRMaXN0SXRlbSA9IGNsb25lZERlZmF1bHRMaXN0SXRlbXM7XG5cdFx0fVxuXG5cdFx0Y3AubGlzdFZhbHVlcyA9IHRoaXMubGlzdFZhbHVlczsgLy8gTm8gbmVlZCB0byBjbG9uZSB0aGlzLCBhcyB0aGUgbGlzdFZhbHVlcyBzZXR0ZXIgYWxyZWFkeSBkb2VzIGl0XG5cdFx0Y3AuY2xhenogPSB0aGlzLmNsYXp6O1xuXG5cdFx0cmV0dXJuIGNwO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlc2V0IGluaXRpYWwgdmFsdWUgYnkgY29weWluZyB0aGUgY3VycmVudCB2YWx1ZS5cblx0ICovXG5cdHJlc2V0SXNNb2RpZmllZCgpXG5cdHtcblx0XHR0aGlzLl9pbml0aWFsVmFsdWUgPSB0aGlzLl92YWx1ZTtcblxuXHRcdC8vIFJlc2V0IHN1Yi1wYXJhbWV0ZXJzXG5cdFx0aWYgKHRoaXMuX2xpc3RJdGVtcyAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGZvciAobGV0IGxpc3RJdGVtIG9mIHRoaXMuX2xpc3RJdGVtcylcblx0XHRcdHtcblx0XHRcdFx0Zm9yIChsZXQgc3ViQ1Agb2YgbGlzdEl0ZW0pXG5cdFx0XHRcdFx0c3ViQ1AucmVzZXRJc01vZGlmaWVkKCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dGhpcy5fbGlzdEl0ZW1zQ2hhbmdlZCA9IGZhbHNlO1xuXHR9XG5cblx0YWRkTGlzdEl0ZW0obmV3TGlzdEl0ZW0pXG5cdHtcblx0XHR0aGlzLl9saXN0SXRlbXMucHVzaChuZXdMaXN0SXRlbSk7XG5cdFx0dGhpcy5fbGlzdEl0ZW1zQ2hhbmdlZCA9IHRydWU7XG5cdH1cblxuXHR1cGRhdGVMaXN0SXRlbShsaXN0SXRlbSwgaXRlbUluZGV4KVxuXHR7XG5cdFx0dGhpcy5fbGlzdEl0ZW1zW2l0ZW1JbmRleF0gPSBsaXN0SXRlbTtcblx0XHR0aGlzLl9saXN0SXRlbXNDaGFuZ2VkID0gdHJ1ZTtcblx0fVxuXG5cdHJlbW92ZUxpc3RJdGVtKGl0ZW1JbmRleClcblx0e1xuXHRcdHRoaXMuX2xpc3RJdGVtcy5zcGxpY2UoaXRlbUluZGV4LCAxKTtcblx0XHR0aGlzLl9saXN0SXRlbXNDaGFuZ2VkID0gdHJ1ZTtcblx0fVxuXG5cdHRvU2ZzT2JqZWN0KClcblx0e1xuXHRcdGxldCBvYmogPSBuZXcgU0ZTMlguU0ZTT2JqZWN0KCk7XG5cblx0XHQvLyBTZXQgY2hhbmdlZCBzZXR0aW5nIG5hbWVcblx0XHRvYmoucHV0VXRmU3RyaW5nKCduYW1lJywgdGhpcy5uYW1lKTtcblxuXHRcdC8vIFNldCBjaGFuZ2VkIHNldHRpbmcgY2xhc3MsIGlmIGFueVxuXHRcdGlmICh0aGlzLmNsYXp6ICE9IG51bGwpXG5cdFx0XHRvYmoucHV0VXRmU3RyaW5nKCdjbGF6eicsIHRoaXMuY2xhenopO1xuXG5cdFx0aWYgKHRoaXMudmFsdWUgIT0gbnVsbClcblx0XHR7XG5cdFx0XHQvLyBTZXQgY2hhbmdlZCBzZXR0aW5nIHZhbHVlXG5cdFx0XHRpZiAodHlwZW9mIHRoaXMudmFsdWUgPT09ICdib29sZWFuJylcblx0XHRcdFx0b2JqLnB1dEJvb2woJ3ZhbHVlJywgdGhpcy52YWx1ZSk7XG5cdFx0XHRlbHNlIGlmICh0eXBlb2YgdGhpcy52YWx1ZSA9PT0gJ251bWJlcicpXG5cdFx0XHRcdG9iai5wdXRJbnQoJ3ZhbHVlJywgdGhpcy52YWx1ZSk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdG9iai5wdXRUZXh0KCd2YWx1ZScsIHRoaXMudmFsdWUpO1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0Ly8gU2V0IGNoYW5nZWQgc2V0dGluZyBsaXN0IG9mIHZhbHVlc1xuXG5cdFx0XHRsZXQgbGlzdEl0ZW1zID0gbmV3IFNGUzJYLlNGU0FycmF5KCk7XG5cblx0XHRcdGZvciAobGV0IGEgb2YgdGhpcy5fbGlzdEl0ZW1zKVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAoYS5sZW5ndGggPT0gMSkgLy8gV2UgaGF2ZSBqdXN0IG9uZSBzdWIgY29uZmlnIHBhcmFtOyBubyBuZWVkIHRvIHBhcnNlIGl0IGNvbXBsaXRlbHlcblx0XHRcdFx0e1xuXHRcdFx0XHRcdC8vIFNpbXBsZSBsaXN0XG5cdFx0XHRcdFx0bGV0IHRlbXBPYmogPSBhWzBdLnRvU2ZzT2JqZWN0KCk7XG5cdFx0XHRcdFx0bGV0IHdhID0gdGVtcE9iai5nZXRXcmFwcGVkSXRlbSgndmFsdWUnKTtcblx0XHRcdFx0XHRsaXN0SXRlbXMuYWRkKHdhLnZhbHVlLCB3YS50eXBlKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdHtcblx0XHRcdFx0XHQvLyBDb21wbGV4IGxpc3RcblxuXHRcdFx0XHRcdGxldCB2YWx1ZXMgPSBuZXcgU0ZTMlguU0ZTQXJyYXkoKTtcblxuXHRcdFx0XHRcdGZvciAobGV0IHN1YkNwIG9mIGEpXG5cdFx0XHRcdFx0XHR2YWx1ZXMuYWRkU0ZTT2JqZWN0KHN1YkNwLnRvU2ZzT2JqZWN0KCkpO1xuXG5cdFx0XHRcdFx0bGlzdEl0ZW1zLmFkZFNGU0FycmF5KHZhbHVlcyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0b2JqLnB1dFNGU0FycmF5KCd2YWx1ZScsIGxpc3RJdGVtcyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG9iajtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm4gYSBkZXNjcmlwdGlvbiBvZiB0aGUgQ29uZmlndXJhdGlvblBhcmFtZXRlciBpbnN0YW5jZS5cblx0ICovXG5cdHRvU3RyaW5nKClcblx0e1xuXHRcdGxldCBzID0gYGA7XG5cdFx0cyArPSBgQ29uZmlndXJhdGlvbiBwYXJhbWV0ZXI6ICR7dGhpcy5uYW1lfVxcbmA7XG5cdFx0cyArPSBgXFx0dHlwZTogJHt0aGlzLnR5cGV9XFxuYDtcblx0XHRzICs9IGBcXHRsYWJlbDogJHt0aGlzLmxhYmVsfVxcbmA7XG5cdFx0cyArPSBgXFx0Y2F0ZWdvcnkgbmFtZTogJHt0aGlzLmNhdGVnb3J5fVxcbmA7XG5cdFx0cyArPSBgXFx0Y2F0ZWdvcnkgaWQ6ICR7dGhpcy5jYXRlZ29yeUlkfVxcbmA7XG5cdFx0cyArPSBgXFx0dG9vbHRpcDogJHt0aGlzLnRvb2x0aXB9XFxuYDtcblx0XHRzICs9IGBcXHR2YWx1ZTogJHt0aGlzLnZhbHVlfVxcbmA7XG5cdFx0cyArPSBgXFx0dHJpZ2dlcjogJHt0aGlzLnRyaWdnZXJ9XFxuYDtcblx0XHRzICs9IGBcXHR0cmlnZ2VyIGRhdGE6ICR7dGhpcy50cmlnZ2VyRGF0YX1cXG5gO1xuXHRcdHMgKz0gYFxcdGNsaWVudCBvbmx5OiAke3RoaXMuY2xpZW50T25seX1cXG5gO1xuXHRcdHMgKz0gYFxcdHZhbGlkYXRvcjogJHt0aGlzLnZhbGlkYXRvcn1cXG5gO1xuXHRcdHMgKz0gYFxcdGlzIG1vZGlmaWVkOiAke3RoaXMuaXNNb2RpZmllZH1cXG5gO1xuXG5cdFx0aWYgKHRoaXMuYXR0cmlidXRlcyAhPSBudWxsKVxuXHRcdHtcblx0XHRcdHMgKz0gYFxcdGNvbXBvbmVudCBhdHRyaWJ1dGVzOlxcbmA7XG5cblx0XHRcdGZvciAobGV0IHMxIGluIHRoaXMuYXR0cmlidXRlcylcblx0XHRcdFx0cyArPSBgXFx0XFx0JHtzMX0gLS0+ICR7dGhpcy5hdHRyaWJ1dGVzW3MxXX1cXG5gO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLmRhdGFQcm92aWRlciAhPSBudWxsKVxuXHRcdFx0cyArPSBgXFx0ZGF0YSBwcm92aWRlcjogJHt0aGlzLmRhdGFQcm92aWRlcn1cXG5gO1xuXG5cdFx0aWYgKHRoaXMuc2VwYXJhdG9yICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0cyArPSBgXFx0c2VwYXJhdG9yOlxcbmA7XG5cblx0XHRcdGZvciAobGV0IHMyIGluIHRoaXMuc2VwYXJhdG9yKVxuXHRcdFx0XHRzICs9IGBcXHRcXHQke3MyfSAtLT4gJHt0aGlzLnNlcGFyYXRvcltzMl19XFxuYDtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5fbGlzdEl0ZW1zICE9IG51bGwgJiYgdGhpcy5fbGlzdEl0ZW1zLmxlbmd0aCA+IDApXG5cdFx0e1xuXHRcdFx0cyArPSBgXFx0IyBsaXN0IGl0ZW1zOiAke3RoaXMuX2xpc3RJdGVtcy5sZW5ndGh9XFxuYDtcblxuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9saXN0SXRlbXMubGVuZ3RoOyBpKyspXG5cdFx0XHR7XG5cdFx0XHRcdHMgKz0gYFxcdGxpc3QgaXRlbSAke2l9IHN1Yi1wYXJhbWV0ZXJzOlxcbmA7XG5cdFx0XHRcdGZvciAobGV0IGUgPSAwOyBlIDwgdGhpcy5fbGlzdEl0ZW1zW2ldLmxlbmd0aDsgZSsrKVxuXHRcdFx0XHRcdHMgKz0gYFxcdFxcdCR7dGhpcy5fbGlzdEl0ZW1zW2ldW2VdLnRvQ29tcGFjdFN0cmluZygpfVxcbmA7XG5cdFx0XHR9XG5cblx0XHRcdHMgKz0gYFxcdGNsYXNzIG5hbWU6ICR7dGhpcy5jbGF6en1cXG5gO1xuXHRcdH1cblxuXHRcdHJldHVybiBzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybiBhIGNvbXBhY3QgZGVzY3JpcHRpb24gb2YgdGhlIENvbmZpZ3VyYXRpb25QYXJhbWV0ZXIgaW5zdGFuY2UuXG5cdCAqL1xuXHR0b0NvbXBhY3RTdHJpbmcoKVxuXHR7XG5cdFx0cmV0dXJuIGBDb25maWd1cmF0aW9uIHBhcmFtZXRlciAnJHt0aGlzLm5hbWV9JzogJHt0aGlzLnZhbHVlfSAke3RoaXMuaXNNb2RpZmllZCA/ICdbWF0nIDogJ1sgXSd9YDtcblx0fVxuXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdC8vIFBSSVZBVEUgTUVUSE9EU1xuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZSB0aGUgY2F0ZWdvcnkgaWQgZm9ybSB0aGUgY2F0ZWdvcnkgbmFtZS5cblx0ICogU3BhY2VzIGFuZCBpbnZhbGlkIGNoYXJhY3RlcnMgYXJlIHJlbW92ZWQ7IHdvcmRzIGFyZSBzZXBhcmF0ZWQgdXNpbmcgY2FwaXRhbHMuXG5cdCAqL1xuXHRfc2V0SWRGcm9tQ2F0ZWdvcnlOYW1lKGNhdGVnb3J5TmFtZSlcblx0e1xuXHRcdHRoaXMuX2NhdGVnb3J5SWQgPSBjYXRlZ29yeU5hbWU7XG5cblx0XHQvLyBTdHJpcCBpbnZhbGlkIGNoYXJhY3RlcnNcblx0XHR2YXIgcGF0dGVybiA9IC9bXjAtOWEtekEtWl0vZztcblx0XHR0aGlzLl9jYXRlZ29yeUlkID0gdGhpcy5fY2F0ZWdvcnlJZC5yZXBsYWNlKHBhdHRlcm4sICcgJyk7XG5cblx0XHQvLyBDYXBpdGFsaXplIHdvcmRzXG5cdFx0dmFyIHdvcmRzID0gdGhpcy5fY2F0ZWdvcnlJZC5zcGxpdCgnICcpO1xuXHRcdHRoaXMuX2NhdGVnb3J5SWQgPSAnJztcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgd29yZHMubGVuZ3RoOyBpKyspXG5cdFx0e1xuXHRcdFx0bGV0IHdvcmQgPSB3b3Jkc1tpXTtcblx0XHRcdGlmICh3b3JkLmxlbmd0aCA+IDApXG5cdFx0XHRcdHRoaXMuX2NhdGVnb3J5SWQgKz0gKGkgPiAwID8gd29yZC5zdWJzdHIoMCwxKS50b1VwcGVyQ2FzZSgpIDogd29yZC5zdWJzdHIoMCwxKS50b0xvd2VyQ2FzZSgpKSArICh3b3JkLmxlbmd0aCA+IDEgPyB3b3JkLnN1YnN0cigxKSA6IFwiXCIpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLl9jYXRlZ29yeUlkLmxlbmd0aCA9PSAwKVxuXHRcdFx0dGhpcy5fY2F0ZWdvcnlJZCA9IHRoaXMuREVGQVVMVF9DQVRFR09SWV9JRDtcblx0fVxuXG5cdF9zZXRTdWJDb25maWd1cmF0aW9uUGFyYW1zKF9saXN0VmFsdWVzKVxuXHR7XG5cdFx0dGhpcy5fbGlzdEl0ZW1zID0gW107XG5cblx0XHRmb3IgKGxldCBvYmogb2YgX2xpc3RWYWx1ZXMpXG5cdFx0e1xuXHRcdFx0bGV0IGxpc3RJdGVtID0gW107XG5cblx0XHRcdGZvciAobGV0IGRlZmF1bHRDUCBvZiB0aGlzLmRlZmF1bHRMaXN0SXRlbSlcblx0XHRcdHtcblx0XHRcdFx0bGV0IHN1YkNQID0gZGVmYXVsdENQLmNsb25lKGZhbHNlKTtcblx0XHRcdFx0c3ViQ1AudmFsdWUgPSBvYmpbc3ViQ1AubmFtZV07XG5cblx0XHRcdFx0bGlzdEl0ZW0ucHVzaChzdWJDUCk7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuX2xpc3RJdGVtcy5wdXNoKGxpc3RJdGVtKTtcblx0XHR9XG5cdH1cblxuXHRfZ2V0U3ViQ29uZmlndXJhdGlvblBhcmFtc1ZhbHVlcygpXG5cdHtcblx0XHRsZXQgX2xpc3RWYWx1ZXMgPSBbXTtcblxuXHRcdGZvciAobGV0IGxpc3RJdGVtIG9mIHRoaXMuX2xpc3RJdGVtcylcblx0XHR7XG5cdFx0XHRsZXQgb2JqID0ge307XG5cblx0XHRcdGZvciAobGV0IHN1YkNQIG9mIGxpc3RJdGVtKVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAoc3ViQ1AudmFsdWUgIT0gbnVsbClcblx0XHRcdFx0XHRvYmpbc3ViQ1AubmFtZV0gPSBzdWJDUC52YWx1ZTtcblx0XHRcdH1cblxuXHRcdFx0X2xpc3RWYWx1ZXMucHVzaChvYmopO1xuXHRcdH1cblxuXHRcdHJldHVybiBfbGlzdFZhbHVlcztcblx0fVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FDNUdBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FDeEhBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7OztBQ3pMQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUN4T0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7OztBQzNXQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUMzQkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUMvR0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FDekZBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FDN0VBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUM3RUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FDN0pBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNoREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FDMVFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBIiwic291cmNlUm9vdCI6IiJ9
2621
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXRzL2pzL2NvcmUvbW9kdWxlcy9tb2R1bGUtMTJ+bW9kdWxlLTEzfm1vZHVsZS05LmJ1bmRsZS5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2FwcGxpY2F0aW9uLy4vc3JjL2NvbXBvbmVudHMvdWlidWlsZGVyL2NvbmZpZy1jaGVjay1ib3guanMiLCJ3ZWJwYWNrOi8vYXBwbGljYXRpb24vLi9zcmMvY29tcG9uZW50cy91aWJ1aWxkZXIvY29uZmlnLWRyb3AtZG93bi1saXN0LmpzIiwid2VicGFjazovL2FwcGxpY2F0aW9uLy4vc3JjL2NvbXBvbmVudHMvdWlidWlsZGVyL2NvbmZpZy1kdWFsLWxpc3QuanMiLCJ3ZWJwYWNrOi8vYXBwbGljYXRpb24vLi9zcmMvY29tcG9uZW50cy91aWJ1aWxkZXIvY29uZmlnLWZvcm0taXRlbS5qcyIsIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9jb21wb25lbnRzL3VpYnVpbGRlci9jb25maWctZ3JpZC5qcyIsIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9jb21wb25lbnRzL3VpYnVpbGRlci9jb25maWctbGFiZWwuanMiLCJ3ZWJwYWNrOi8vYXBwbGljYXRpb24vLi9zcmMvY29tcG9uZW50cy91aWJ1aWxkZXIvY29uZmlnLW51bWVyaWMtc3RlcHBlci5qcyIsIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9jb21wb25lbnRzL3VpYnVpbGRlci9jb25maWctdGV4dC1pbnB1dC5qcyIsIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9jb21wb25lbnRzL3VpYnVpbGRlci9jb25maWctdmVjdG9yLTNkLmpzIiwid2VicGFjazovL2FwcGxpY2F0aW9uLy4vc3JjL2NvbXBvbmVudHMvdWlidWlsZGVyL3dpZGdldHMvbGlzdC1pdGVtLWVkaXRvci5qcyIsIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9jb21wb25lbnRzL3VpYnVpbGRlci93aWRnZXRzL3ZlY3Rvci0zZC1pbnB1dC5qcyIsIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy91dGlscy91aWJ1aWxkZXIvY29uZmlnLWZvcm0taXRlbS1mYWN0b3J5LmpzIiwid2VicGFjazovL2FwcGxpY2F0aW9uLy4vc3JjL3V0aWxzL3VpYnVpbGRlci9jb25maWctaW50ZXJmYWNlLWJ1aWxkZXIuanMiLCJ3ZWJwYWNrOi8vYXBwbGljYXRpb24vLi9zcmMvdXRpbHMvdWlidWlsZGVyL2NvbmZpZ3VyYXRpb24tcGFyYW1ldGVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29uZmlnRm9ybUl0ZW19IGZyb20gJy4vY29uZmlnLWZvcm0taXRlbSc7XG5pbXBvcnQge0NvbmZpZ0xhYmVsfSBmcm9tICcuL2NvbmZpZy1sYWJlbCc7XG5cbmV4cG9ydCBjbGFzcyBDb25maWdDaGVja0JveCBleHRlbmRzIENvbmZpZ0Zvcm1JdGVtXG57XG5cdGNvbnN0cnVjdG9yKGNvbmZpZ1BhcmFtLCBlZGl0RW5hYmxlZCwgaW5EaWFsb2cpXG5cdHtcblx0ICAgIHN1cGVyKGNvbmZpZ1BhcmFtLCBlZGl0RW5hYmxlZCwgaW5EaWFsb2cpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZSB3aWRnZXQgdG8gcmVuZGVyIHRoZSBDb25maWdQYXJhbWV0ZXIgdmFsdWUuXG5cdCAqIElmIHBhcmFtZXRlciBpcyBub3QgZWRpdGFibGUsIGEgc2ltcGxlIGxhYmVsIGlzIHVzZWQuXG5cdCAqIEBvdmVycmlkZVxuXHQgKi9cblx0X2dlbmVyYXRlSW5uZXJXaWRnZXQoKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2RhdGEuZWRpdGFibGUpXG5cdFx0e1xuXHRcdFx0Ly8gU2V0IHdpZGdldCBjb25maWd1cmF0aW9uXG5cdFx0XHRsZXQgY29uZmlnID0ge1xuXHRcdFx0XHR0eXBlOiAnY2hlY2tib3gnLFxuXHRcdFx0XHRjbGFzczogJycsXG5cdFx0XHRcdGlkOiB0aGlzLl9kYXRhLm5hbWUsXG5cdFx0XHRcdG5hbWU6IHRoaXMuX2RhdGEubmFtZSxcblx0XHRcdFx0J2RhdGEtcm9sZSc6ICdzd2l0Y2gnLFxuXHRcdFx0fTtcblxuXHRcdFx0Ly8gU2V0IHdpZGdldCBhdHRyaWJ1dGVzIChzZWUgcGFyZW50IGNsYXNzKVxuXHRcdFx0dGhpcy5fc2V0V2lkZ2V0QXR0cmlidXRlcyhjb25maWcpO1xuXG5cdFx0XHQvLyBTZXQgYWRkaXRpb25hbCB3aWRnZXQgYXR0cmlidXRlcyBiYXNlZCBvbiB2YWxpZGF0aW9uIHJ1bGVzIChzZWUgcGFyZW50IGNsYXNzKVxuXHRcdFx0dGhpcy5fc2V0V2lkZ2V0VmFsaWRhdGlvbkF0dHJpYnV0ZXMoY29uZmlnKTtcblxuXHRcdFx0Ly8gQ3JlYXRlIHdpZGdldCdzIGh0bWxcblx0XHRcdHRoaXMuX3dpZGdldEh0bWwgPSAkKCc8aW5wdXQ+JywgY29uZmlnKTtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5fd2lkZ2V0SHRtbCA9IG5ldyBDb25maWdMYWJlbCgpO1xuXG5cdFx0Ly8gUmV0dXJuIGNvbXBvbmVudFxuXHRcdHJldHVybiB0aGlzLl93aWRnZXRIdG1sO1xuXHR9XG5cblx0LyoqXG5cdCAqIEluaXRpYWxpemUgd2lkZ2V0LlxuXHQgKiBAb3ZlcnJpZGVcblx0ICovXG4gICBfaW5pdGlhbGl6ZSgpXG4gICB7XG5cdCAgIGlmICh0aGlzLl9kYXRhLmVkaXRhYmxlKVxuXHQgICB7XG5cdFx0ICAgLy8gSW5pdGlhbGl6ZSBrZW5kbyB3aWRnZXRcblx0XHQgICBrZW5kby5pbml0KHRoaXMuX3dpZGdldEh0bWwpO1xuXG5cdFx0ICAgLy8gU2F2ZSByZWYuIHRvIHdpZGdldFxuXHRcdCAgIHRoaXMuX2lubmVyV2lkZ2V0ID0gdGhpcy5fd2lkZ2V0SHRtbC5kYXRhKCdrZW5kb1N3aXRjaCcpO1xuXG5cdFx0ICAgLy8gRW5hYmxlIHZhbHVlIGNvbW1pdCBiaW5kaW5nXG5cdFx0ICAgdGhpcy5faW5uZXJXaWRnZXQuYmluZCgnY2hhbmdlJywgJC5wcm94eSh0aGlzLl9vblZhbHVlSW5wdXQsIHRoaXMpKTtcblx0ICAgfVxuXG5cdCAgIC8vIFByb2NlZWQgd2l0aCBpbml0aWFsaXphdGlvblxuXHQgICBzdXBlci5faW5pdGlhbGl6ZSgpO1xuICAgfVxuXG5cdC8qKlxuXHQgKiBTZXQgd2lkZ2V0J3MgdmFsdWUuXG5cdCAqIElmIHBhcmFtZXRlciBpcyBub3QgZWRpdGFibGUsIHRoZSBsYWJlbCB0ZXh0IGlzIHNldC5cblx0ICogQG92ZXJyaWRlXG5cdCAqL1xuXHRfc2V0V2lkZ2V0VmFsdWUoKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2RhdGEuZWRpdGFibGUpXG5cdFx0XHR0aGlzLl9pbm5lcldpZGdldC52YWx1ZSh0aGlzLl9kYXRhLnZhbHVlKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLl93aWRnZXRIdG1sLnZhbHVlID0gdGhpcy5fZGF0YS52YWx1ZTtcblxuXHRcdC8vIFRyaWdnZXIgZXZlbnRcblx0XHR0aGlzLl90cmlnZ2VyRXZlbnQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXQgd2lkZ2V0J3MgZGlzYWJsZWQgc3RhdGUuXG5cdCAqIEBvdmVycmlkZVxuXHQgKi9cblx0X3NldFdpZGdldEVkaXRFbmFibGVkKClcblx0e1xuXHRcdGlmICh0aGlzLl9kYXRhLmVkaXRhYmxlKVxuXHRcdFx0dGhpcy5faW5uZXJXaWRnZXQuZW5hYmxlKHRoaXMuX2VkaXRFbmFibGVkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBVcGRhdGUgQ29uZmlndXJhdGlvbiBQYXJhbWV0ZXIgdmFsdWUuXG5cdCAqIEBvdmVycmlkZVxuXHQgKi9cblx0X29uVmFsdWVJbnB1dChlKVxuXHR7XG5cdFx0Ly8gVXBkYXRlIENvbmZpZ3VyYXRpb24gUGFyYW1ldGVyIHRvIG5ldyB2YWx1ZVxuXHRcdHRoaXMuX2RhdGEudmFsdWUgPSB0aGlzLl9pbm5lcldpZGdldC52YWx1ZSgpO1xuXG5cdFx0Ly8gVHJpZ2dlciBldmVudFxuXHRcdHRoaXMuX3RyaWdnZXJFdmVudCgpO1xuXHR9XG59XG5cbi8vIERFRklORSBDT01QT05FTlRcbmlmICghd2luZG93LmN1c3RvbUVsZW1lbnRzLmdldCgnY29uZmlnLWNoZWNrLWJveCcpKVxuXHR3aW5kb3cuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdjb25maWctY2hlY2stYm94JywgQ29uZmlnQ2hlY2tCb3gpO1xuIiwiaW1wb3J0IHtDb25maWdGb3JtSXRlbX0gZnJvbSAnLi9jb25maWctZm9ybS1pdGVtJztcbmltcG9ydCB7Q29uZmlnTGFiZWx9IGZyb20gJy4vY29uZmlnLWxhYmVsJztcblxuZXhwb3J0IGNsYXNzIENvbmZpZ0Ryb3BEb3duTGlzdCBleHRlbmRzIENvbmZpZ0Zvcm1JdGVtXG57XG5cdGNvbnN0cnVjdG9yKGNvbmZpZ1BhcmFtLCBlZGl0RW5hYmxlZCwgaW5EaWFsb2cpXG5cdHtcblx0ICAgIHN1cGVyKGNvbmZpZ1BhcmFtLCBlZGl0RW5hYmxlZCwgaW5EaWFsb2cpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZSB3aWRnZXQgdG8gcmVuZGVyIHRoZSBDb25maWdQYXJhbWV0ZXIgdmFsdWUuXG5cdCAqIElmIHBhcmFtZXRlciBpcyBub3QgZWRpdGFibGUsIGEgc2ltcGxlIGxhYmVsIGlzIHVzZWQuXG5cdCAqIEBvdmVycmlkZVxuXHQgKi9cblx0X2dlbmVyYXRlSW5uZXJXaWRnZXQoKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2RhdGEuZWRpdGFibGUpXG5cdFx0e1xuXHRcdFx0Ly8gU2V0IHdpZGdldCBjb25maWd1cmF0aW9uXG5cdFx0XHRsZXQgY29uZmlnID0ge1xuXHRcdFx0XHRjbGFzczogJ2Zvcm0tY29udHJvbCcsXG5cdFx0XHRcdGlkOiB0aGlzLl9kYXRhLm5hbWUsXG5cdFx0XHRcdG5hbWU6IHRoaXMuX2RhdGEubmFtZSxcblx0XHRcdFx0J2RhdGEtcm9sZSc6ICdkcm9wZG93bmxpc3QnLFxuXHRcdFx0fTtcblxuXHRcdFx0Ly8gU2V0IHdpZGdldCBhdHRyaWJ1dGVzIChzZWUgcGFyZW50IGNsYXNzKVxuXHRcdFx0dGhpcy5fc2V0V2lkZ2V0QXR0cmlidXRlcyhjb25maWcpO1xuXG5cdFx0XHQvLyBTZXQgYWRkaXRpb25hbCB3aWRnZXQgYXR0cmlidXRlcyBiYXNlZCBvbiB2YWxpZGF0aW9uIHJ1bGVzIChzZWUgcGFyZW50IGNsYXNzKVxuXHRcdFx0dGhpcy5fc2V0V2lkZ2V0VmFsaWRhdGlvbkF0dHJpYnV0ZXMoY29uZmlnKTtcblxuXHRcdFx0Ly8gQ3JlYXRlIHdpZGdldCdzIGh0bWxcblx0XHRcdHRoaXMuX3dpZGdldEh0bWwgPSAkKCc8aW5wdXQ+JywgY29uZmlnKTtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5fd2lkZ2V0SHRtbCA9IG5ldyBDb25maWdMYWJlbCgpO1xuXG5cdFx0Ly8gUmV0dXJuIGNvbXBvbmVudFxuXHRcdHJldHVybiB0aGlzLl93aWRnZXRIdG1sO1xuXHR9XG5cblx0LyoqXG5cdCAqIEluaXRpYWxpemUgd2lkZ2V0LlxuXHQgKiBAb3ZlcnJpZGVcblx0ICovXG4gICBfaW5pdGlhbGl6ZSgpXG4gICB7XG5cdCAgIGlmICh0aGlzLl9kYXRhLmVkaXRhYmxlKVxuXHQgICB7XG5cdFx0ICAgLy8gSW5pdGlhbGl6ZSBrZW5kbyB3aWRnZXRcblx0XHQgICBrZW5kby5pbml0KHRoaXMuX3dpZGdldEh0bWwpO1xuXG5cdFx0ICAgLy8gU2F2ZSByZWYuIHRvIHdpZGdldFxuXHRcdCAgIHRoaXMuX2lubmVyV2lkZ2V0ID0gdGhpcy5fd2lkZ2V0SHRtbC5kYXRhKCdrZW5kb0Ryb3BEb3duTGlzdCcpO1xuXG5cdFx0ICAgLy8gU2V0IGxpc3QgaXRlbXNcblx0XHQgICB0aGlzLl9pbm5lcldpZGdldC5zZXREYXRhU291cmNlKHRoaXMuX2dldERhdGFTb3VyY2UodGhpcy5fZGF0YS5kYXRhUHJvdmlkZXIpKVxuXG5cdFx0ICAgLy8gRW5hYmxlIHZhbHVlIGNvbW1pdCBiaW5kaW5nXG5cdFx0ICAgdGhpcy5fd2lkZ2V0SHRtbC5iaW5kKCdjaGFuZ2UnLCAkLnByb3h5KHRoaXMuX29uVmFsdWVJbnB1dCwgdGhpcykpO1xuXHQgICB9XG5cblx0ICAgLy8gUHJvY2VlZCB3aXRoIGluaXRpYWxpemF0aW9uXG5cdCAgIHN1cGVyLl9pbml0aWFsaXplKCk7XG4gICB9XG5cblx0LyoqXG5cdCAqIFNldCB3aWRnZXQncyB2YWx1ZS5cblx0ICogSWYgcGFyYW1ldGVyIGlzIG5vdCBlZGl0YWJsZSwgdGhlIGxhYmVsIHRleHQgaXMgc2V0LlxuXHQgKiBAb3ZlcnJpZGVcblx0ICovXG5cdF9zZXRXaWRnZXRWYWx1ZSgpXG5cdHtcblx0XHRpZiAodGhpcy5fZGF0YS5lZGl0YWJsZSlcblx0XHRcdHRoaXMuX2lubmVyV2lkZ2V0LnZhbHVlKHRoaXMuX2RhdGEudmFsdWUpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMuX3dpZGdldEh0bWwudmFsdWUgPSB0aGlzLl9kYXRhLnZhbHVlO1xuXG5cdFx0Ly8gVHJpZ2dlciBldmVudFxuXHRcdHRoaXMuX3RyaWdnZXJFdmVudCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldCB3aWRnZXQncyBkaXNhYmxlZCBzdGF0ZS5cblx0ICogQG92ZXJyaWRlXG5cdCAqL1xuXHRfc2V0V2lkZ2V0RWRpdEVuYWJsZWQoKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2RhdGEuZWRpdGFibGUpXG5cdFx0XHR0aGlzLl9pbm5lcldpZGdldC53cmFwcGVyLmF0dHIoJ2Rpc2FibGVkJywgIXRoaXMuX2VkaXRFbmFibGVkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBVcGRhdGUgQ29uZmlndXJhdGlvbiBQYXJhbWV0ZXIgdmFsdWUuXG5cdCAqIEBvdmVycmlkZVxuXHQgKi9cblx0X29uVmFsdWVJbnB1dChlKVxuXHR7XG5cdFx0Ly8gVXBkYXRlIENvbmZpZ3VyYXRpb24gUGFyYW1ldGVyIHRvIG5ldyB2YWx1ZVxuXHRcdHRoaXMuX2RhdGEudmFsdWUgPSB0aGlzLl9pbm5lcldpZGdldC52YWx1ZSgpO1xuXG5cdFx0Ly8gVHJpZ2dlciBldmVudFxuXHRcdHRoaXMuX3RyaWdnZXJFdmVudCgpO1xuXHR9XG5cblx0X2dldERhdGFTb3VyY2UoZHBTdHJpbmcpXG5cdHtcblx0XHRpZiAoZHBTdHJpbmcpXG5cdFx0XHRyZXR1cm4gZHBTdHJpbmcuc3BsaXQoJywnKTtcblxuXHRcdC8vIEluIGNhc2UgdGhlIGRhdGFwcm92aWRlciBpcyBlbXB0eSwgYWRkIGF0IGxlYXN0IHRoZSBjdXJyZW50IHZhbHVlXG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIFt0aGlzLl9kYXRhLnZhbHVlXTtcblx0fVxufVxuXG4vLyBERUZJTkUgQ09NUE9ORU5UXG5pZiAoIXdpbmRvdy5jdXN0b21FbGVtZW50cy5nZXQoJ2NvbmZpZy1kcm9wLWRvd24tbGlzdCcpKVxuXHR3aW5kb3cuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdjb25maWctZHJvcC1kb3duLWxpc3QnLCBDb25maWdEcm9wRG93bkxpc3QpO1xuIiwiaW1wb3J0IHtDb25maWdGb3JtSXRlbX0gZnJvbSAnLi9jb25maWctZm9ybS1pdGVtJztcbmltcG9ydCB7Q29uZmlnTGFiZWx9IGZyb20gJy4vY29uZmlnLWxhYmVsJztcblxuZXhwb3J0IGNsYXNzIENvbmZpZ0R1YWxMaXN0IGV4dGVuZHMgQ29uZmlnRm9ybUl0ZW1cbntcblx0Y29uc3RydWN0b3IoY29uZmlnUGFyYW0sIGVkaXRFbmFibGVkLCBpbkRpYWxvZylcblx0e1xuXHQgICAgc3VwZXIoY29uZmlnUGFyYW0sIGVkaXRFbmFibGVkLCBpbkRpYWxvZyk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlIHdpZGdldCB0byByZW5kZXIgdGhlIENvbmZpZ1BhcmFtZXRlci5cblx0ICogQG92ZXJyaWRlXG5cdCAqL1xuXHRfZ2VuZXJhdGVJbm5lcldpZGdldCgpXG5cdHtcblx0XHR0aGlzLl93aWRnZXRIdG1sID0gJCgnPGRpdj4nKTtcblxuXHRcdGNvbnN0IGF2YWlsYWJsZUlkID0gdGhpcy5fZ2V0SWQodGhpcy5fZGF0YS5uYW1lLCAnYXZhaWxhYmxlJyk7XG5cdFx0Y29uc3Qgc2VsZWN0ZWRJZCA9IHRoaXMuX2dldElkKHRoaXMuX2RhdGEubmFtZSwgJ3NlbGVjdGVkJyk7XG5cblx0XHQvLyBDcmVhdGUgaGVhZGVyIGZvciBsYWJlbHNcblx0XHRsZXQgaGVhZGVyID0gJCgnPGRpdj4nLCB7Y2xhc3M6ICdmb3JtLWxhYmVsLWNvbnRhaW5lciBkdWFsLWxpc3QtbGFiZWxzJ30pO1xuXG5cdFx0aGVhZGVyLmFwcGVuZCgkKCc8bGFiZWw+Jywge1xuXHRcdFx0Y2xhc3M6ICdmb250LWl0YWxpYyBmb3JtLWxhYmVsIGR1YWwtbGlzdC1sZWZ0LWNvbCcgKyAoIXRoaXMuX2RhdGEuZWRpdGFibGUgPyAnIG5vLWludGVyYWN0JyA6ICcnKSxcblx0XHRcdGZvcjogYXZhaWxhYmxlSWQsXG5cdFx0fSkudGV4dCgnQXZhaWxhYmxlJykpO1xuXG5cdFx0aGVhZGVyLmFwcGVuZCgkKCc8bGFiZWw+Jywge1xuXHRcdFx0Y2xhc3M6ICdmb250LWl0YWxpYyBmb250LXdlaWdodC1ib2xkIGZvcm0tbGFiZWwgZHVhbC1saXN0LXJpZ2h0LWNvbCcgKyAoIXRoaXMuX2RhdGEuZWRpdGFibGUgPyAnIG5vLWludGVyYWN0JyA6ICcnKSxcblx0XHRcdGZvcjogc2VsZWN0ZWRJZCxcblx0XHR9KS50ZXh0KCdTZWxlY3RlZCcpKTtcblxuXHRcdHRoaXMuX3dpZGdldEh0bWwuYXBwZW5kKGhlYWRlcik7XG5cblx0XHQvLyBBZGQgYXZhaWxhYmxlIGl0ZW1zIGxpc3Rcblx0XHR0aGlzLl9hdmFpbGFibGVMaXN0SHRtbCA9ICQoJzxzZWxlY3Q+Jywge1xuXHRcdFx0aWQ6IGF2YWlsYWJsZUlkLFxuXHRcdFx0Y2xhc3M6ICdkdWFsLWxpc3QtbGVmdC1jb2wnICsgKCF0aGlzLl9kYXRhLmVkaXRhYmxlID8gJyBuby1pbnRlcmFjdCcgOiAnJyksXG5cdFx0fSk7XG5cdFx0dGhpcy5fd2lkZ2V0SHRtbC5hcHBlbmQodGhpcy5fYXZhaWxhYmxlTGlzdEh0bWwpO1xuXG5cdFx0Ly8gQWRkIHNlbGVjdGVkIGl0ZW1zIGxpc3Rcblx0XHR0aGlzLl9zZWxlY3RlZExpc3RIdG1sID0gJCgnPHNlbGVjdD4nLCB7XG5cdFx0XHRpZDogc2VsZWN0ZWRJZCxcblx0XHRcdGNsYXNzOiAnZHVhbC1saXN0LXJpZ2h0LWNvbCcgKyAoIXRoaXMuX2RhdGEuZWRpdGFibGUgPyAnIG5vLWludGVyYWN0JyA6ICcnKSxcblx0XHR9KTtcblx0XHR0aGlzLl93aWRnZXRIdG1sLmFwcGVuZCh0aGlzLl9zZWxlY3RlZExpc3RIdG1sKTtcblxuXHRcdC8vIFJldHVybiBjb21wb25lbnRcblx0XHRyZXR1cm4gdGhpcy5fd2lkZ2V0SHRtbDtcblx0fVxuXG5cdC8vIElEcyBjb250YWluaW5nIGEgXCIuXCIgY2F1c2UgaXNzdWVzIHRvIGNvbm5lY3RlZCBsaXN0c1xuXHRfZ2V0SWQobmFtZSwgc3VmZml4KVxuXHR7XG5cdFx0cmV0dXJuIG5hbWUucmVwbGFjZSgnLicsICdfJykgKyAnLScgKyBzdWZmaXg7XG5cdH1cblxuXHQvKipcblx0ICogSW5pdGlhbGl6ZSB3aWRnZXQuXG5cdCAqIEBvdmVycmlkZVxuXHQgKi9cblx0X2luaXRpYWxpemUoKVxuXHR7XG5cdFx0Ly8gSW5pdGlhbGl6ZSBcImF2YWxhYmxlXCIgbGlzdGJveFxuXHRcdHRoaXMuX2F2YWlsYWJsZUxpc3QgPSB0aGlzLl9hdmFpbGFibGVMaXN0SHRtbC5rZW5kb0xpc3RCb3goe1xuICAgICAgICAgICAgY29ubmVjdFdpdGg6IHRoaXMuX2dldElkKHRoaXMuX2RhdGEubmFtZSwgJ3NlbGVjdGVkJyksXG4gICAgICAgICAgICB0b29sYmFyOiB7XG4gICAgICAgICAgICAgICAgdG9vbHM6IHRoaXMuX2RhdGEuZWRpdGFibGUgPyBbJ3RyYW5zZmVyVG8nLCAndHJhbnNmZXJGcm9tJywgJ3RyYW5zZmVyQWxsVG8nLCAndHJhbnNmZXJBbGxGcm9tJ10gOiBbXVxuICAgICAgICAgICAgfSxcblx0XHRcdHRlbXBsYXRlOiBcIjxkaXY+Izp2YWx1ZSM8L2Rpdj5cIixcblx0XHRcdHNlbGVjdGFibGU6ICdtdWx0aXBsZScsXG4gICAgICAgIH0pLmRhdGEoJ2tlbmRvTGlzdEJveCcpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBcInNlbGVjdGVkXCIgbGlzdGJveFxuICAgICAgICB0aGlzLl9zZWxlY3RlZExpc3QgPSB0aGlzLl9zZWxlY3RlZExpc3RIdG1sLmtlbmRvTGlzdEJveCh7XG5cdFx0XHR0ZW1wbGF0ZTogXCI8ZGl2PiM6dmFsdWUjPC9kaXY+XCIsXG5cdFx0XHRzZWxlY3RhYmxlOiAnbXVsdGlwbGUnLFxuXHRcdFx0Ly8gVGhlIGZvbGxvd2luZyBsaXN0ZW5lcnMgY2FuJ3QgYmUgdXNlZCBiZWNhdXNlIGV2ZW50cyBhcmUgZmlyZWQgYmVmb3JlIHRoZSBkYXRhc291cmNlIGlzIGFjdHVhbGx5IHVwZGF0ZWRcblx0XHRcdC8vIFdlIGhhdmUgdG8gdXNlIGEgY2hhbmdlIGV2ZW50IGxpc3RlbmVyIG9uIHRoZSBkYXRhc291cmNlIChzZWUgYmVsb3cpLCBldmVuIGlmIG5vdCBvcHRpbWFsXG5cdFx0XHQvL2FkZDogJC5wcm94eSh0aGlzLl9vblZhbHVlSW5wdXQsIHRoaXMpLFxuXHRcdFx0Ly9yZW1vdmU6ICQucHJveHkodGhpcy5fb25WYWx1ZUlucHV0LCB0aGlzKSxcblx0XHR9KS5kYXRhKCdrZW5kb0xpc3RCb3gnKTtcblxuXHRcdC8vIFByb2NlZWQgd2l0aCBpbml0aWFsaXphdGlvblxuXHRcdHN1cGVyLl9pbml0aWFsaXplKCk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0IHdpZGdldCdzIGRhdGFzb3VyY2UuXG5cdCAqIEBvdmVycmlkZVxuXHQgKi9cblx0X3NldFdpZGdldFZhbHVlKClcblx0e1xuXHRcdGxldCBhdmFpbGFibGVBcnIgPSB0aGlzLl9kYXRhLmRhdGFQcm92aWRlciAhPSAnJyA/IHRoaXMuX2RhdGEuZGF0YVByb3ZpZGVyLnNwbGl0KCcsJykgOiBbXTtcblx0XHRsZXQgc2VsZWN0ZWRBcnIgPSB0aGlzLl9kYXRhLnZhbHVlICE9ICcnID8gdGhpcy5fZGF0YS52YWx1ZS5zcGxpdCgnLCcpIDogW107XG5cblx0XHQvLyBSZW1vdmUgc2VsZWN0ZWQgdmFsdWVzIGZyb20gYXZhaWxhYmxlIHZhbHVlc1xuXHRcdGlmIChzZWxlY3RlZEFyci5sZW5ndGggPiAwKVxuXHRcdHtcblx0XHRcdGxldCB0ZW1wID0gW107XG5cblx0XHRcdGZvciAobGV0IHZhbCBvZiBhdmFpbGFibGVBcnIpXG5cdFx0XHR7XG5cdFx0XHRcdGlmIChzZWxlY3RlZEFyci5pbmRleE9mKHZhbCkgPT0gLTEpXG5cdFx0XHRcdFx0dGVtcC5wdXNoKHZhbCk7XG5cdFx0XHR9XG5cblx0XHRcdGF2YWlsYWJsZUFyciA9IHRlbXA7XG5cdFx0fVxuXG5cdFx0Ly8gQ29udmVydCBsaXN0cyBvZiBzdHJpbmdzIHRvIGxpc3RzIG9mIG9iamVjdHNcblx0XHRsZXQgYXZhaWxhYmxlVmFsdWVzID0gW107XG5cdFx0Zm9yIChsZXQgdmFsIG9mIGF2YWlsYWJsZUFycilcblx0XHRcdGF2YWlsYWJsZVZhbHVlcy5wdXNoKHt2YWx1ZTogdmFsfSk7XG5cblx0XHRsZXQgc2VsZWN0ZWRWYWx1ZXMgPSBbXTtcblx0XHRmb3IgKGxldCB2YWwgb2Ygc2VsZWN0ZWRBcnIpXG5cdFx0XHRzZWxlY3RlZFZhbHVlcy5wdXNoKHt2YWx1ZTogdmFsfSk7XG5cblx0XHQvLyBDbGVhciBzZWxlY3Rpb25cblx0XHR0aGlzLl9hdmFpbGFibGVMaXN0LmNsZWFyU2VsZWN0aW9uKCk7XG5cdFx0dGhpcy5fc2VsZWN0ZWRMaXN0LmNsZWFyU2VsZWN0aW9uKCk7XG5cblx0XHQvLyBTZXQgZGF0YXNvdXJjZXNcblx0XHR0aGlzLl9hdmFpbGFibGVMaXN0LnNldERhdGFTb3VyY2UobmV3IGtlbmRvLmRhdGEuRGF0YVNvdXJjZSh7XG5cdFx0XHRkYXRhOiBhdmFpbGFibGVWYWx1ZXNcblx0XHR9KSk7XG5cblx0XHR0aGlzLl9zZWxlY3RlZExpc3Quc2V0RGF0YVNvdXJjZShuZXcga2VuZG8uZGF0YS5EYXRhU291cmNlKHtcblx0XHRcdGRhdGE6IHNlbGVjdGVkVmFsdWVzLFxuXHRcdFx0Ly8gV2UgbGlzdGVuIHRvIHRoZSBjaGFuZ2UgZXZlbnQgaW5zdGVhZCBvZiB0aGUgYWRkL3JlbW92ZSBldmVudHMgb24gdGhlIGxpc3Rib3gsIGJlY2F1c2UgdGhvc2UgYXJlIGZpcmVkIGJlZm9yZSB0aGUgZGF0YXNvdXJjZSBpcyB1cGRhdGVkXG5cdFx0XHQvLyBUaGlzIGlzIG5vdCBvcHRpbWFsIGJlY2F1c2UgdGhlIGV2ZW50IGlzIGZpcmVkIGZvciBlYWNoIGl0ZW0gYWRkZWQgdG8gb3IgcmVtb3ZlZCBmcm9tIHRoZSBkYXRhc291cmNlXG5cdFx0XHRjaGFuZ2U6ICQucHJveHkodGhpcy5fb25WYWx1ZUlucHV0LCB0aGlzKVxuXHRcdH0pKTtcblxuXHRcdC8vIERpc2FibGUgZWRpdGluZ1xuXHRcdGlmICghdGhpcy5fZGF0YS5lZGl0YWJsZSlcblx0XHR7XG5cdFx0XHR0aGlzLl9hdmFpbGFibGVMaXN0LmVuYWJsZSgnLmstaXRlbScsIGZhbHNlKTtcblx0XHRcdHRoaXMuX3NlbGVjdGVkTGlzdC5lbmFibGUoJy5rLWl0ZW0nLCBmYWxzZSk7XG5cdFx0fVxuXG5cdFx0Ly8gVHJpZ2dlciBldmVudFxuXHRcdHRoaXMuX3RyaWdnZXJFdmVudCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldCB3aWRnZXQncyBkaXNhYmxlZCBzdGF0ZS5cblx0ICogQG92ZXJyaWRlXG5cdCAqL1xuXHRfc2V0V2lkZ2V0RWRpdEVuYWJsZWQoKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2RhdGEuZWRpdGFibGUpXG5cdFx0e1xuXHRcdFx0Ly8gQ2xlYXIgc2VsZWN0aW9uXG5cdFx0XHR0aGlzLl9hdmFpbGFibGVMaXN0LmNsZWFyU2VsZWN0aW9uKCk7XG5cdFx0XHR0aGlzLl9zZWxlY3RlZExpc3QuY2xlYXJTZWxlY3Rpb24oKTtcblxuXHRcdFx0Ly8gRW5hYmxlL2Rpc2FibGUgbGlzdHNcblx0XHRcdHRoaXMuX2F2YWlsYWJsZUxpc3Qud3JhcHBlci5hdHRyKCdkaXNhYmxlZCcsICF0aGlzLl9lZGl0RW5hYmxlZCk7XG5cdFx0XHR0aGlzLl9zZWxlY3RlZExpc3Qud3JhcHBlci5hdHRyKCdkaXNhYmxlZCcsICF0aGlzLl9lZGl0RW5hYmxlZCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFVwZGF0ZSBDb25maWd1cmF0aW9uIFBhcmFtZXRlciB2YWx1ZS5cblx0ICogQG92ZXJyaWRlXG5cdCAqL1xuXHRfb25WYWx1ZUlucHV0KGUpXG5cdHtcblx0XHRsZXQgbGlzdERhdGEgPSB0aGlzLl9zZWxlY3RlZExpc3QuZGF0YVNvdXJjZS5kYXRhKCk7XG5cblx0XHQvLyBVcGRhdGUgQ29uZmlndXJhdGlvbiBQYXJhbWV0ZXIgdG8gbmV3IHZhbHVlXG5cdFx0dGhpcy5fZGF0YS52YWx1ZSA9IGxpc3REYXRhLm1hcChlID0+IGUudmFsdWUpLmpvaW4oJywnKTtcblxuXHRcdC8vIFRyaWdnZXIgZXZlbnRcblx0XHR0aGlzLl90cmlnZ2VyRXZlbnQoKTtcblx0fVxufVxuXG4vLyBERUZJTkUgQ09NUE9ORU5UXG5pZiAoIXdpbmRvdy5jdXN0b21FbGVtZW50cy5nZXQoJ2NvbmZpZy1kdWFsLWxpc3QnKSlcblx0d2luZG93LmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnY29uZmlnLWR1YWwtbGlzdCcsIENvbmZpZ0R1YWxMaXN0KTtcbiIsImV4cG9ydCBjbGFzcyBDb25maWdGb3JtSXRlbSBleHRlbmRzIEhUTUxFbGVtZW50XG57XG5cdGNvbnN0cnVjdG9yKGNvbmZpZ1BhcmFtLCBlZGl0RW5hYmxlZCwgaW5EaWFsb2cpXG5cdHtcblx0ICAgIHN1cGVyKCk7XG5cblx0XHR0aGlzLmlkID0gJ2Zvcm0taXRlbS0nICsgY29uZmlnUGFyYW0ubmFtZTtcblx0XHR0aGlzLl9lZGl0RW5hYmxlZCA9IGVkaXRFbmFibGVkO1xuXHRcdHRoaXMuX2RhdGEgPSBjb25maWdQYXJhbTtcblxuXHRcdC8vIENyZWF0ZSBmb3JtIGl0ZW0gdmlld1xuXHRcdHRoaXMuX2J1aWxkVmlldyhpbkRpYWxvZyk7XG5cblx0XHQvLyBJbml0aWFsaXplIGZvcm0gaXRlbVxuXHRcdHRoaXMuX2luaXRpYWxpemUoKTtcblx0fVxuXG5cdGNvbm5lY3RlZENhbGxiYWNrKClcblx0e1xuXHRcdC8vIFRyaWdnZXIgZXZlbnRcblx0XHQvLyBOT1RFOiB3aGVuIGEgQ29uZmlnRm9ybUl0ZW0gaXMgaW5zdGFudGlhdGVkLCB0aGUgX3RyaWdnZXJFdmVudCBtZXRob2QgaXMgY2FsbGVkIGFzIHNvb24gYXMgaXRzIHZhbHVlIGlzIHNldC5cblx0XHQvLyBXaGVuIHRoaXMgaGFwcGVuc28sIGR1ZSB0byB0aGUgZmFjdCB0aGF0IHRoZSBvYmplY3QgaXMgbm90IHlldCBpbiB0aGUgRE9NLCB0aGUgZXZlbnQgaXMgbm90IGNhdGNoZWQgYnkgdGhlIGxpc3RlbmVyXG5cdFx0Ly8gKHdoaWNoIGlzIGF0dGFjaGVkIHRvIHRoZSBvdXRlciBjb250YWluZXIpLiBTbyBmb3JjaW5nIHRoZSBldmVudCB0byB0cmlnZ2VyIGFnYWluIGFzIHNvb24gYXMgdGhlIENvbmZpZ0Zvcm1JdGVtXG5cdFx0Ly8gaXMgYXBwZW5kZWQgdG8gdGhlIERPTSBpcyBuZWVkZWQuXG5cdFx0dGhpcy5fdHJpZ2dlckV2ZW50KCk7XG5cdH1cblxuXHRzZXQgZGF0YShjb25maWdQYXJhbSlcblx0e1xuXHRcdHRoaXMuX2RhdGEgPSBjb25maWdQYXJhbTtcblx0XHR0aGlzLl9zZXRXaWRnZXRWYWx1ZSgpO1xuXHR9XG5cblx0Z2V0IGRhdGEoKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2RhdGE7XG5cdH1cblxuXHRzZXQgZWRpdEVuYWJsZWQoZW5hYmxlKVxuXHR7XG5cdFx0aWYgKGVuYWJsZSAhPSB0aGlzLl9lZGl0RW5hYmxlZClcblx0XHR7XG5cdFx0XHR0aGlzLl9lZGl0RW5hYmxlZCA9IGVuYWJsZTtcblx0XHRcdHRoaXMuX3NldFdpZGdldEVkaXRFbmFibGVkKCk7XG5cdFx0fVxuXHR9XG5cblx0Z2V0IGVkaXRFbmFibGVkKClcblx0e1xuXHRcdHJldHVybiB0aGlzLl9lZGl0RW5hYmxlZDtcblx0fVxuXG5cdF9idWlsZFZpZXcoaXNJbnNpZGVEaWFsb2cpXG5cdHtcblx0XHRpZiAoIWlzSW5zaWRlRGlhbG9nKVxuXHRcdHtcblx0XHRcdC8vIFNldCBhZGRpdGlvbmFsIGNsYXNzZXMgZm9yIGlubmVyIHdpZGdldFxuXHRcdFx0bGV0IGNsYXNzTmFtZXMgPSAnJztcblxuXHRcdFx0c3dpdGNoICh0aGlzLl9kYXRhLnR5cGUpXG5cdFx0XHR7XG5cdFx0XHRcdGNhc2UgJ0R1YWxMaXN0Jzpcblx0XHRcdFx0XHRjbGFzc05hbWVzID0gJ2NvbC1zbS03IGNvbC1sZy04Jztcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnRGF0YUdyaWQnOlxuXHRcdFx0XHRcdGNsYXNzTmFtZXMgPSAnY29sLXNtJzsgLy8gVXNlICdjb2wtc20tNyBjb2wtbGctOCcgZm9yIERhdGFHcmlkIHRvbz9cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRjbGFzc05hbWVzID0gJ2NvbC1zbS1hdXRvJztcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBHZW5lcmF0ZSBib2lsZXJwbGF0ZSBodG1sLCBzdXJyb3VuZGluZyB0aGUgYWN0dWFsIHdpZGdldCAobGFiZWwsIG51bWVyaWMgc3RlcHBlciwgZXRjKVxuXHRcdFx0dGhpcy5pbm5lckhUTUwgPSBgXG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHBvc2l0aW9uLXJlbGF0aXZlIHJvd1wiPlxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJjb2wtc20tNSBjb2wtbGctNCBjb2wtZm9ybS1sYWJlbCBmb3JtLWxhYmVsLWNvbnRhaW5lclwiPlxuXHRcdFx0XHRcdFx0PGxhYmVsIGZvcj1cIiR7dGhpcy5fZGF0YS5uYW1lfVwiIGNsYXNzPVwiZm9ybS1sYWJlbCAkeyh0aGlzLl9kYXRhLmNsaWVudE9ubHkgPyAnY2xpZW50LW9ubHknIDogJycpfVwiPiR7dGhpcy5fZGF0YS5sYWJlbH0gPGkgY2xhc3M9XCJmYXMgZmEtcXVlc3Rpb24tY2lyY2xlIHRleHQtbXV0ZWQgaGVscFwiIHRpdGxlPVwiJHt0aGlzLl9kYXRhLnRvb2x0aXB9XCI+PC9pPjwvbGFiZWw+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cImlubmVyLXdpZGdldCBhbGlnbi1zZWxmLWNlbnRlciAke2NsYXNzTmFtZXN9XCI+XG5cdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImstaW52YWxpZC1tc2dcIiBkYXRhLWZvcj1cIiR7dGhpcy5fZGF0YS5uYW1lfVwiPjwvc3Bhbj5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHRgO1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0dGhpcy5pbm5lckhUTUwgPSBgXG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHBvc2l0aW9uLXJlbGF0aXZlXCI+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cImNvbC1mb3JtLWxhYmVsIGZvcm0tbGFiZWwtY29udGFpbmVyXCI+XG5cdFx0XHRcdFx0XHQ8bGFiZWwgZm9yPVwiJHt0aGlzLl9kYXRhLm5hbWV9XCIgY2xhc3M9XCJmb3JtLWxhYmVsICR7KHRoaXMuX2RhdGEuY2xpZW50T25seSA/ICdjbGllbnQtb25seScgOiAnJyl9XCI+JHt0aGlzLl9kYXRhLmxhYmVsfSA8aSBjbGFzcz1cImZhcyBmYS1xdWVzdGlvbi1jaXJjbGUgdGV4dC1tdXRlZCBoZWxwXCIgdGl0bGU9XCIke3RoaXMuX2RhdGEudG9vbHRpcH1cIj48L2k+PC9sYWJlbD5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiaW5uZXItd2lkZ2V0XCI+XG5cdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImstaW52YWxpZC1tc2dcIiBkYXRhLWZvcj1cIiR7dGhpcy5fZGF0YS5uYW1lfVwiPjwvc3Bhbj5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHRgO1xuXHRcdH1cblxuXHRcdC8vIENyZWF0ZSBpbm5lciB3aWRnZXQgKG11c3QgYmUgb3ZlcnJpZGRlbilcblx0XHRsZXQgd2lkZ2V0ID0gdGhpcy5fZ2VuZXJhdGVJbm5lcldpZGdldCgpO1xuXG5cdFx0Ly8gQXBwZW5kIGlubmVyIHdpZGdldFxuXHRcdCQodGhpcykuZmluZCgnLmlubmVyLXdpZGdldCcpLnByZXBlbmQod2lkZ2V0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUTyBCRSBPVkVSUklEREVOXG5cdCAqL1xuXHRfZ2VuZXJhdGVJbm5lcldpZGdldCgpXG5cdHtcblx0XHQvLyBTaG93IGFuIGVycm9yLCBzaG91bGQgYmUgb3ZlcnJpZGRlblxuXHRcdGNvbnNvbGUuZXJyb3IoYFVuYWJsZSB0byBjcmVhdGUgJHt0aGlzLl9kYXRhLnR5cGV9IGZvcm0gaXRlbSBmb3IgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgJHt0aGlzLmlkfWApO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldCBhdHRyaWJ1dGVzIG9uIHRoZSB3aWRnZXQgY29uZmlndXJhdGlvbiBvYmplY3QuXG5cdCAqL1xuXHRfc2V0V2lkZ2V0QXR0cmlidXRlcyhjb25maWcpXG5cdHtcblx0XHRjb25zdCBhdHRyaWJzID0gdGhpcy5fZGF0YS5hdHRyaWJ1dGVzO1xuXG5cdFx0aWYgKGF0dHJpYnMpXG5cdFx0e1xuXHRcdFx0Zm9yIChsZXQgYXR0ciBpbiBhdHRyaWJzKVxuXHRcdFx0e1xuXHRcdFx0XHRjb25maWdbYXR0cl0gPSBhdHRyaWJzW2F0dHJdO1xuXG5cdFx0XHRcdGlmIChhdHRyID09ICdwYXR0ZXJuJylcblx0XHRcdFx0XHRjb25maWdbJ2RhdGEtcGF0dGVybi1tc2cnXSA9ICdDb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMnO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTZXQgYWRkaXRpb25hbCBhdHRyaWJ1dGVzIG9uIHRoZSB3aWRnZXQgY29uZmlndXJhdGlvbiBvYmplY3QgdG8gcHJvcGVybHkgdmFsaWRhdGUgaW5wdXQuXG5cdCAqL1xuXHRfc2V0V2lkZ2V0VmFsaWRhdGlvbkF0dHJpYnV0ZXMoY29uZmlnKVxuXHR7XG5cdFx0Y29uc3QgdmFsID0gdGhpcy5fZGF0YS52YWxpZGF0b3I7XG5cblx0XHRpZiAodmFsICE9IG51bGwgJiYgdmFsICE9ICcnKVxuXHRcdHtcblx0XHRcdGlmICh2YWwgPT0gJ2lwJylcblx0XHRcdHtcblx0XHRcdFx0Y29uZmlnWydwYXR0ZXJuJ10gPSAnXigyNVswLTVdfDJbMC00XVswLTldfFswMV0/WzAtOV1bMC05XT8pXFwuKDI1WzAtNV18MlswLTRdWzAtOV18WzAxXT9bMC05XVswLTldPylcXC4oMjVbMC01XXwyWzAtNF1bMC05XXxbMDFdP1swLTldWzAtOV0/KVxcLigyNVswLTVdfDJbMC00XVswLTldfFswMV0/WzAtOV1bMC05XT8pJCc7XG5cdFx0XHRcdGNvbmZpZ1snZGF0YS1wYXR0ZXJuLW1zZyddID0gJ0ludmFsaWQgSVAgYWRkcmVzcyc7XG5cdFx0XHRcdGNvbmZpZ1sncmVxdWlyZWQnXSA9IHRydWU7XG5cdFx0XHRcdGNvbmZpZ1snZGF0YS1yZXF1aXJlZC1tc2cnXSA9ICdSZXF1aXJlZCc7XG5cdFx0XHR9XG5cblx0XHRcdGVsc2UgaWYgKHZhbCA9PSAnbm90TnVsbCcpXG5cdFx0XHR7XG5cdFx0XHRcdGNvbmZpZ1sncmVxdWlyZWQnXSA9IHRydWU7XG5cdFx0XHRcdGNvbmZpZ1snZGF0YS1yZXF1aXJlZC1tc2cnXSA9ICdSZXF1aXJlZCc7XG5cdFx0XHR9XG5cblx0XHRcdGVsc2UgaWYgKHZhbCA9PSAncHdkJylcblx0XHRcdHtcblx0XHRcdFx0Y29uZmlnWydwYXR0ZXJuJ10gPSAnXi57Nix9JCc7XG5cdFx0XHRcdGNvbmZpZ1snZGF0YS1wYXR0ZXJuLW1zZyddID0gJ01pbmltdW0gbGVuZ3RoOiA2IGNoYXJhY3RlcnMnO1xuXHRcdFx0fVxuXG5cdFx0XHRlbHNlIGlmICh2YWwgPT0gJ3Bvc051bScpXG5cdFx0XHR7XG5cdFx0XHRcdGNvbmZpZ1sncGF0dGVybiddID0gJ15bMC05XVxcZCokJztcblx0XHRcdFx0Y29uZmlnWydkYXRhLXBhdHRlcm4tbXNnJ10gPSAnTm9uLW5lZ2F0aXZlIG51bWJlciByZXF1aXJlZCc7XG5cdFx0XHR9XG5cblx0XHRcdGVsc2UgaWYgKHZhbCA9PSAnYW9pJylcblx0XHRcdHtcblx0XHRcdFx0Ly8gTm90aGluZyB0byBkb1xuXHRcdFx0XHQvLyBTZWUgS2VuZG8gdmFsaWRhdGlvbiBpbml0aWFsaXphdGlvbiBpbiBjb25maWctaW50ZXJmYWNlLWJ1aWxkZXIuanNcblx0XHRcdH1cblxuXHRcdFx0ZWxzZSBpZiAodmFsID09ICd1cmwnKVxuXHRcdFx0e1xuXHRcdFx0XHRjb25maWdbJ3R5cGUnXSA9ICd1cmwnO1xuXHRcdFx0XHRjb25maWdbJ2RhdGEtdXJsLW1zZyddID0gJ0ludmFsaWQgVVJMJztcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogSW5pdGlhbGl6ZSBmb3JtIGl0ZW0uXG5cdCAqXG5cdCAqIE5PVEU6IG11c3QgYmUgb3ZlcnJpZGRlbiBpZiBpbm5lciB3aWRnZXQgcmVxdWlyZXMgc3BlY2lhbCBpbml0aWFsaXphdGlvbiAoZm9yIGV4YW1wbGUgS2VuZG8gd2lkZ2V0cylcblx0ICovXG5cdF9pbml0aWFsaXplKClcblx0e1xuXHRcdC8vIFNldCB2YWx1ZVxuIFx0ICAgdGhpcy5fc2V0V2lkZ2V0VmFsdWUoKTtcblxuIFx0ICAgLy8gU2V0IGVkaXQgZW5hYmxlZFxuIFx0ICAgdGhpcy5fc2V0V2lkZ2V0RWRpdEVuYWJsZWQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUTyBCRSBPVkVSUklEREVOXG5cdCAqL1xuXHRfc2V0V2lkZ2V0VmFsdWUoKVxuXHR7XG5cdFx0Ly8gTm90aGluZyB0byBkbywgbXVzdCBiZSBvdmVycmlkZGVuXG5cdH1cblxuXHQvKipcblx0ICogVE8gQkUgT1ZFUlJJRERFTlxuXHQgKi9cblx0X3NldFdpZGdldEVkaXRFbmFibGVkKClcblx0e1xuXHRcdC8vIE5vdGhpbmcgdG8gZG8sIG11c3QgYmUgb3ZlcnJpZGRlblxuXHR9XG5cblx0LyoqXG5cdCAqIFRPIEJFIE9WRVJSSURERU5cblx0ICovXG5cdF9vblZhbHVlSW5wdXQoZSlcblx0e1xuXHRcdC8vIE5vdGhpbmcgdG8gZG8sIG11c3QgYmUgb3ZlcnJpZGRlblxuXHR9XG5cblx0X3RyaWdnZXJFdmVudCgpXG5cdHtcblx0XHRpZiAodGhpcy5fZGF0YS50cmlnZ2VyKVxuXHRcdHtcblx0XHRcdGxldCBldmVudCA9IG5ldyBDdXN0b21FdmVudCgndmFsdWUtc2V0Jywge2RldGFpbDogbnVsbCwgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZX0pO1xuXHRcdFx0dGhpcy5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcblx0XHR9XG5cdH1cbn1cblxuLy8gREVGSU5FIENPTVBPTkVOVFxuaWYgKCF3aW5kb3cuY3VzdG9tRWxlbWVudHMuZ2V0KCdjb25maWctZm9ybS1pdGVtJykpXG5cdHdpbmRvdy5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ2NvbmZpZy1mb3JtLWl0ZW0nLCBDb25maWdGb3JtSXRlbSk7XG4iLCJpbXBvcnQge0NvbmZpZ0Zvcm1JdGVtfSBmcm9tICcuL2NvbmZpZy1mb3JtLWl0ZW0nO1xuaW1wb3J0IHtDb25maWdMYWJlbH0gZnJvbSAnLi9jb25maWctbGFiZWwnO1xuaW1wb3J0IHtMaXN0SXRlbUVkaXRvcn0gZnJvbSAnLi93aWRnZXRzL2xpc3QtaXRlbS1lZGl0b3InO1xuXG5leHBvcnQgY2xhc3MgQ29uZmlnR3JpZCBleHRlbmRzIENvbmZpZ0Zvcm1JdGVtXG57XG5cdGNvbnN0cnVjdG9yKGNvbmZpZ1BhcmFtLCBlZGl0RW5hYmxlZCwgaW5EaWFsb2cpXG5cdHtcblx0ICAgIHN1cGVyKGNvbmZpZ1BhcmFtLCBlZGl0RW5hYmxlZCwgaW5EaWFsb2cpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZSB3aWRnZXQgdG8gcmVuZGVyIHRoZSBDb25maWdQYXJhbWV0ZXIuXG5cdCAqIEBvdmVycmlkZVxuXHQgKi9cblx0X2dlbmVyYXRlSW5uZXJXaWRnZXQoKVxuXHR7XG5cdFx0Ly8gQ3JlYXRlIG1haW4gd2lkZ2V0J3MgaHRtbFxuXHRcdHRoaXMuX3dpZGdldEh0bWwgPSAkKCc8ZGl2PicsIHtjbGFzczogJyd9KTtcblxuXHRcdC8vIFNldCBncmlkIHdpZGdldCBjb25maWd1cmF0aW9uXG5cdFx0bGV0IGdyaWRDb25maWcgPSB7XG5cdFx0XHRpZDogdGhpcy5fZGF0YS5uYW1lLFxuXHRcdFx0bmFtZTogdGhpcy5fZGF0YS5uYW1lLFxuXHRcdFx0Y2xhc3M6ICdsaW1pdGVkLWhlaWdodCcgKyAoIXRoaXMuX2RhdGEuZWRpdGFibGUgPyAnIG5vLWludGVyYWN0JyA6ICcnKVxuXHRcdH07XG5cblx0XHQvLyBBcHBlbmQgZ3JpZCB0byBtYWluIGh0bWw7IGdyaWQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gS2VuZG8gd2lkZ2V0IGR1cmluZyBpbml0aWFsaXphdGlvblxuXHRcdHRoaXMuX3dpZGdldEh0bWwuYXBwZW5kKCQoJzxkaXY+JywgZ3JpZENvbmZpZykpO1xuXG5cdFx0aWYgKHRoaXMuX2RhdGEuZWRpdGFibGUpXG5cdFx0e1xuXHRcdFx0Ly8gQlVUVE9OU1xuXG5cdFx0XHQvLyBDcmVhdGUgYnV0dG9ucyBjb250YWluZXJcblx0XHRcdGxldCBidXR0b25zID0gJCgnPGRpdj4nLCB7Y2xhc3M6ICdtdC0yIHRleHQtcmlnaHQnfSk7XG5cblx0XHRcdC8vIEFwcGVuZCBidXR0b25zIHRvIGNvbnRhaW5lclxuXHRcdFx0dGhpcy5fYWRkQnV0dG9uID0gJCgnPGJ1dHRvbj4nLCB7dHlwZTogJ2J1dHRvbicsIGNsYXNzOiAnay1idXR0b24gay1zZWNvbmRhcnknLCB0aXRsZTogJ0FkZCd9KS5hcHBlbmQoJCgnPGkgY2xhc3M9XCJmYXMgZmEtcGx1c1wiPjwvaT4nKSk7XG5cdFx0XHR0aGlzLl9lZGl0QnV0dG9uID0gJCgnPGJ1dHRvbj4nLCB7dHlwZTogJ2J1dHRvbicsIGNsYXNzOiAnay1idXR0b24gay1zZWNvbmRhcnkgbWwtMicsIHRpdGxlOiAnRWRpdCcsIGRpc2FibGVkOiB0cnVlfSkuYXBwZW5kKCQoJzxpIGNsYXNzPVwiZmFzIGZhLXBlblwiPjwvaT4nKSk7XG5cdFx0XHR0aGlzLl9yZW1vdmVCdXR0b24gPSAkKCc8YnV0dG9uPicsIHt0eXBlOiAnYnV0dG9uJywgY2xhc3M6ICdrLWJ1dHRvbiBrLXNlY29uZGFyeSBtbC0yJywgdGl0bGU6ICdSZW1vdmUnLCBkaXNhYmxlZDogdHJ1ZX0pLmFwcGVuZCgkKCc8aSBjbGFzcz1cImZhcyBmYS10aW1lc1wiPjwvaT4nKSk7XG5cblx0XHRcdGJ1dHRvbnMuYXBwZW5kKHRoaXMuX2FkZEJ1dHRvbik7XG5cdFx0XHRidXR0b25zLmFwcGVuZCh0aGlzLl9lZGl0QnV0dG9uKTtcblx0XHRcdGJ1dHRvbnMuYXBwZW5kKHRoaXMuX3JlbW92ZUJ1dHRvbik7XG5cblx0XHRcdC8vIEFwcGVuZCBidXR0b25zIGNvbnRhaW5lciB0byBtYWluIGh0bWxcblx0XHRcdHRoaXMuX3dpZGdldEh0bWwuYXBwZW5kKGJ1dHRvbnMpO1xuXG5cdFx0XHQvLyBDcmVhdGUgZWRpdCBkaWFsb2dcblx0XHRcdC8vIE5PVEU6IGRhdGEtZGlzbWlzcz1cIm1vZGFsXCIgb24gdGhlIGNsb3NlL2NhbmNlbCBidXR0b25zIHdhcyByZW1vdmVkIHRvIHdvcmsgYXJvdW5kIGFuIGlzc3VlIHdpdGggbmVzdGVkIG1vZGFscztcblx0XHRcdC8vIHRoZSBjdXN0b20gXCJkYXRhLWNhbmNlbFwiIGF0dHJpYnV0ZSBpcyB1c2VkIHRvIGFkZCBhIGN1c3RvbSBsaXN0ZW5lciB0byB0aGUgYnV0dG9uc1xuXHRcdFx0dGhpcy5fZWRpdERpYWxvZyA9ICQoYFxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwibW9kYWxcIiB0YWJpbmRleD1cIi0xXCIgcm9sZT1cImRpYWxvZ1wiIGFyaWEtbGFiZWxsZWRieT1cIm1vZGFsVGl0bGVcIiBhcmlhLWhpZGRlbj1cInRydWVcIiBkYXRhLWtleWJvYXJkPVwiZmFsc2VcIiBkYXRhLWJhY2tkcm9wPVwic3RhdGljXCI+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZyBtb2RhbC1kaWFsb2ctY2VudGVyZWRcIiByb2xlPVwiZG9jdW1lbnRcIj5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cblx0XHRcdFx0XHRcdFx0XHQ8aDUgY2xhc3M9XCJtb2RhbC10aXRsZSB0ZXh0LXByaW1hcnlcIiBpZD1cIm1vZGFsVGl0bGVcIj4ke3RoaXMuX2RhdGEubGFiZWx9PC9oNT5cblx0XHRcdFx0XHRcdFx0XHQ8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNsb3NlXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCIgZGF0YS1jYW5jZWw9XCJtb2RhbFwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0PHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JnRpbWVzOzwvc3Bhbj5cblx0XHRcdFx0XHRcdFx0XHQ8L2J1dHRvbj5cblx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5IGluLWZsb3ctaW52YWxpZC1tc2dcIj5cblxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlciBmbGV4LWNvbHVtblwiPlxuXHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJkLWZsZXggdy0xMDBcIj5cblx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJmbGV4LWdyb3ctMSB0ZXh0LWxlZnRcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJrLWJ1dHRvbiBrLXByaW1hcnlcIj4uLi48L2J1dHRvbj5cblx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImZsZXgtZ3Jvdy0xIHRleHQtcmlnaHRcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJrLWJ1dHRvbiBrLXNlY29uZGFyeVwiIGRhdGEtY2FuY2VsPVwibW9kYWxcIj5DYW5jZWw8L2J1dHRvbj5cblx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdGApO1xuXG5cdFx0XHQvLyBBZGQgbGlzdGVuZXIgdG8gZGlhbG9nIGhpZGUgZXZlbnRcblx0XHRcdHRoaXMuX2VkaXREaWFsb2cub24oJ2hpZGRlbi5icy5tb2RhbCcsICQucHJveHkodGhpcy5fb25FZGl0UGFuZWxIaWRkZW4sIHRoaXMpKTtcblxuXHRcdFx0Ly8gQWRkIGxpc3RlbmVyIHRvIG1haW4gYnV0dG9uIGNsaWNrIGV2ZW50XG5cdFx0XHQkKCdidXR0b24uay1wcmltYXJ5JywgdGhpcy5fZWRpdERpYWxvZykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vblN1Ym1pdEJ0Q2xpY2ssIHRoaXMpKTtcblxuXHRcdFx0Ly8gQWRkIGxpc3RlbmVyIHRvIGNsb3NlL2NhbmNlbCBidXR0b25zIGNsaWNrIGV2ZW50XG5cdFx0XHQkKCdidXR0b25bZGF0YS1jYW5jZWw9XCJtb2RhbFwiXScsIHRoaXMuX2VkaXREaWFsb2cpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25DYW5jZWxCdENsaWNrLCB0aGlzKSk7XG5cblx0XHRcdC8vIEFwcGVuZCBlZGl0IGRpYWxvZyB0byBtYWluIGh0bWxcblx0XHRcdHRoaXMuX3dpZGdldEh0bWwuYXBwZW5kKHRoaXMuX2VkaXREaWFsb2cpO1xuXHRcdH1cblxuXHRcdC8vIFJldHVybiBjb21wb25lbnRcblx0XHRyZXR1cm4gdGhpcy5fd2lkZ2V0SHRtbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbml0aWFsaXplIHdpZGdldC5cblx0ICogQG92ZXJyaWRlXG5cdCAqL1xuXHRfaW5pdGlhbGl6ZSgpXG5cdHtcblx0XHRsZXQgY29sdW1ucyA9IFtdO1xuXHRcdGZvciAobGV0IHN1YkNvbmZpZ1BhcmFtIG9mIHRoaXMuX2RhdGEuZGVmYXVsdExpc3RJdGVtKVxuXHRcdHtcblx0XHRcdGxldCBjb2wgPSB7XG5cdFx0XHRcdGZpZWxkOiBzdWJDb25maWdQYXJhbS5uYW1lLFxuXHRcdFx0XHR0aXRsZTogc3ViQ29uZmlnUGFyYW0ubGFiZWwsXG5cdFx0XHRcdHdpZHRoOiAxMjBcblx0XHRcdH1cblxuXHRcdFx0Ly8gRGlzcGxheSBWIG9yIFggZm9yIGJvb2xlYW5zXG5cdFx0XHRpZiAodHlwZW9mIHN1YkNvbmZpZ1BhcmFtLnZhbHVlID09PSAnYm9vbGVhbicpXG5cdFx0XHRcdGNvbC50ZW1wbGF0ZSA9IGAjPSAke3N1YkNvbmZpZ1BhcmFtLm5hbWV9ID8gJzxpIGNsYXNzPVwiZmFzIGZhLWNoZWNrXCI+PC9pPicgOiAnPGkgY2xhc3M9XCJmYXMgZmEtdGltZXNcIj48L2k+JyAjYDtcblxuXHRcdFx0Ly8gSGlkZSBwYXNzd29yZHNcblx0XHRcdGlmIChzdWJDb25maWdQYXJhbS50eXBlID09ICdUZXh0SW5wdXQnICYmIHN1YkNvbmZpZ1BhcmFtLmF0dHJpYnV0ZXMgIT0gbnVsbCAmJiBzdWJDb25maWdQYXJhbS5hdHRyaWJ1dGVzLnR5cGUgPT0gJ3Bhc3N3b3JkJylcblx0XHRcdFx0Y29sLnRlbXBsYXRlID0gYCM9ICfigKInLnJlcGVhdChkYXRhLiR7c3ViQ29uZmlnUGFyYW0ubmFtZX0ubGVuZ3RoKSAjYDtcblxuXHRcdFx0Y29sdW1ucy5wdXNoKGNvbCk7XG5cdFx0fVxuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBncmlkXG5cdFx0bGV0IGdyaWRIdG1sID0gdGhpcy5fd2lkZ2V0SHRtbC5maW5kKGAjJHskLmVzY2FwZVNlbGVjdG9yKHRoaXMuX2RhdGEubmFtZSl9YCk7XG5cblx0XHRncmlkSHRtbC5rZW5kb0dyaWQoe1xuXHRcdFx0cmVzaXphYmxlOiB0cnVlLFxuXHRcdFx0c2VsZWN0YWJsZTogdGhpcy5fZGF0YS5lZGl0YWJsZSA/ICdyb3cnIDogZmFsc2UsXG5cdFx0XHRjaGFuZ2U6ICQucHJveHkodGhpcy5fb25HcmlkU2VsZWN0aW9uQ2hhbmdlLCB0aGlzKSxcblx0XHRcdGNvbHVtbnM6IGNvbHVtbnMsXG5cdFx0XHRub1JlY29yZHM6IHtcblx0XHRcdFx0dGVtcGxhdGU6ICdObyBpdGVtcy4nXG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvLyBTYXZlIHJlZi4gdG8gd2lkZ2V0XG5cdFx0dGhpcy5fZ3JpZFdpZGdldCA9IGdyaWRIdG1sLmRhdGEoJ2tlbmRvR3JpZCcpO1xuXG5cdFx0Ly8gU2hvdyB0b290aXAgaWYgZ3JpZCdzIGNlbGwgY29udGVudCBleGNlZWRzIGNlbGwgd2lkdGggKGVsbGlwc2lzIGlzIGRpc3BsYXllZCBieSBLZW5kbyBHcmlkKVxuXHRcdGdyaWRIdG1sLmtlbmRvVG9vbHRpcCh7XG5cdFx0XHRmaWx0ZXI6ICd0ZCcsXG5cdFx0XHRzaG93OiBmdW5jdGlvbihlKSB7XG5cdFx0XHRcdC8vIE5ldmVyIHNob3cgdG9vbHRpcC4uLlxuXHRcdFx0XHR0aGlzLmNvbnRlbnQucGFyZW50KCkuY3NzKCd2aXNpYmlsaXR5JywgJ2hpZGRlbicpO1xuXG5cdFx0XHRcdC8vIC4uLnVubGVzcyBjb250ZW50IGlzIHJldHVybmVkIChzZWUgYmVsb3cpIGR1ZSB0byBjZWxsIHdpZHRoIGJlaW5nIGV4Y2VlZGVkXG5cdFx0XHRcdGlmICh0aGlzLmNvbnRlbnQudGV4dCgpICE9ICcnKVxuXHRcdFx0XHRcdHRoaXMuY29udGVudC5wYXJlbnQoKS5jc3MoJ3Zpc2liaWxpdHknLCAndmlzaWJsZScpO1xuXHRcdFx0fSxcblx0XHRcdGhpZGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR0aGlzLmNvbnRlbnQucGFyZW50KCkuY3NzKCd2aXNpYmlsaXR5JywgJ2hpZGRlbicpO1xuXHRcdFx0fSxcblx0XHRcdGNvbnRlbnQ6IGZ1bmN0aW9uKGUpIHtcblx0XHRcdFx0bGV0IGVsZW1lbnQgPSBlLnRhcmdldFswXTtcblx0XHRcdFx0aWYgKGVsZW1lbnQub2Zmc2V0V2lkdGggPCBlbGVtZW50LnNjcm9sbFdpZHRoKVxuXHRcdFx0XHRcdHJldHVybiBlLnRhcmdldC50ZXh0KCk7XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRyZXR1cm4gJyc7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvKlxuXHRcdC8vIEluaXRpYWxpemUgYnV0dG9uIHRvb2x0aXBzXG5cdFx0dGhpcy5fd2lkZ2V0SHRtbC5rZW5kb1Rvb2x0aXAoe1xuXHRcdFx0ZmlsdGVyOiAnYnV0dG9uJyxcblx0XHRcdGNvbnRlbnQ6IGZ1bmN0aW9uKGUpIHtcblx0XHRcdFx0cmV0dXJuIGA8ZGl2IGNsYXNzPVwiaGVscC10b29sdGlwXCI+JHtlLnRhcmdldC5kYXRhKCd0aXRsZScpfTwvZGl2PmA7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0Ki9cblxuXHRcdC8vIEFkZCBidXR0b24gbGlzdGVuZXJzXG5cdFx0aWYgKHRoaXMuX2RhdGEuZWRpdGFibGUpXG5cdFx0e1xuXHRcdFx0dGhpcy5fYWRkQnV0dG9uLmNsaWNrKCQucHJveHkodGhpcy5fb25BZGRDbGljaywgdGhpcykpO1xuXHRcdFx0dGhpcy5fZWRpdEJ1dHRvbi5jbGljaygkLnByb3h5KHRoaXMuX29uRWRpdENsaWNrLCB0aGlzKSk7XG5cdFx0XHR0aGlzLl9yZW1vdmVCdXR0b24uY2xpY2soJC5wcm94eSh0aGlzLl9vblJlbW92ZUNsaWNrLCB0aGlzKSk7XG5cdFx0fVxuXG5cdFx0Ly8gUHJvY2VlZCB3aXRoIGluaXRpYWxpemF0aW9uXG5cdFx0c3VwZXIuX2luaXRpYWxpemUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXQgd2lkZ2V0J3MgZGF0YXNvdXJjZS5cblx0ICogQG92ZXJyaWRlXG5cdCAqL1xuXHRfc2V0V2lkZ2V0VmFsdWUoKVxuXHR7XG5cdFx0bGV0IGRhdGFTb3VyY2UgPSBuZXcga2VuZG8uZGF0YS5EYXRhU291cmNlKHtcblx0XHRcdGRhdGE6IHRoaXMuX2RhdGEubGlzdFZhbHVlc1xuXHRcdH0pO1xuXG5cdFx0Ly8gUmVhZCBjdXJyZW50IGhvcml6b250YWwgc2Nyb2xsIHZhbHVlXG5cdFx0Y29uc3Qgc2Nyb2xsTGVmdCA9ICQoJy5rLWdyaWQtY29udGVudCcsIHRoaXMuX2dyaWRXaWRnZXQud3JhcHBlcikuc2Nyb2xsTGVmdCgpO1xuXG5cdFx0Ly8gQ2xlYXIgZ3JpZCBzZWxlY3Rpb24gaWYgYW55XG5cdFx0dGhpcy5fZ3JpZFdpZGdldC5jbGVhclNlbGVjdGlvbigpO1xuXG5cdFx0Ly8gU2V0IHVwZGF0ZWQgZ3JpZCdzIGRhdGFzb3VyY2Vcblx0XHR0aGlzLl9ncmlkV2lkZ2V0LnNldERhdGFTb3VyY2UoZGF0YVNvdXJjZSk7XG5cblx0XHQvLyBTZXQgaG9yaXpvbnRhbCBzY3JvbGxcblx0XHQkKCcuay1ncmlkLWNvbnRlbnQnLCB0aGlzLl9ncmlkV2lkZ2V0LndyYXBwZXIpLnNjcm9sbExlZnQoc2Nyb2xsTGVmdCk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0IHdpZGdldCdzIGRpc2FibGVkIHN0YXRlLlxuXHQgKiBAb3ZlcnJpZGVcblx0ICovXG5cdF9zZXRXaWRnZXRFZGl0RW5hYmxlZCgpXG5cdHtcblx0XHRpZiAodGhpcy5fZGF0YS5lZGl0YWJsZSlcblx0XHR7XG5cdFx0XHQvLyBEZXNlbGVjdCBpdGVtXG5cdFx0XHR0aGlzLl9ncmlkV2lkZ2V0LmNsZWFyU2VsZWN0aW9uKCk7XG5cblx0XHRcdC8vIEVuYWJsZS9kaXNhYmxlIGdyaWRcblx0XHRcdHRoaXMuX2dyaWRXaWRnZXQud3JhcHBlci5hdHRyKCdkaXNhYmxlZCcsICF0aGlzLl9lZGl0RW5hYmxlZCk7XG5cblx0XHRcdC8vIEVuYWJsZSBcIkFkZFwiIGJ1dHRvblxuXHRcdFx0aWYgKHRoaXMuX2VkaXRFbmFibGVkKVxuXHRcdFx0XHR0aGlzLl9hZGRCdXR0b24uYXR0cignZGlzYWJsZWQnLCBmYWxzZSk7XG5cblx0XHRcdC8vIERpc2FibGUgYWxsIGJ1dHRvbnNcblx0XHRcdGVsc2Vcblx0XHRcdHtcblx0XHRcdFx0dGhpcy5fYWRkQnV0dG9uLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSk7XG5cdFx0XHRcdHRoaXMuX2VkaXRCdXR0b24uYXR0cignZGlzYWJsZWQnLCB0cnVlKTtcblx0XHRcdFx0dGhpcy5fcmVtb3ZlQnV0dG9uLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0X29uR3JpZFNlbGVjdGlvbkNoYW5nZShlKVxuXHR7XG5cdFx0bGV0IHNlbGVjdGVkUm93cyA9IHRoaXMuX2dyaWRXaWRnZXQuc2VsZWN0KCk7XG5cdFx0bGV0IHNlbGVjdGVkRGF0YUl0ZW1zID0gW107XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHNlbGVjdGVkUm93cy5sZW5ndGg7IGkrKylcblx0XHR7XG5cdFx0XHRsZXQgZGF0YUl0ZW0gPSB0aGlzLl9ncmlkV2lkZ2V0LmRhdGFJdGVtKHNlbGVjdGVkUm93c1tpXSk7XG5cdFx0XHRzZWxlY3RlZERhdGFJdGVtcy5wdXNoKGRhdGFJdGVtKTtcblx0XHR9XG5cblx0XHQvLyBFbmFibGUvZGlzYWJsZSBlZGl0IGJ1dHRvblxuXHRcdGlmICh0aGlzLl9lZGl0QnV0dG9uKVxuXHRcdFx0dGhpcy5fZWRpdEJ1dHRvbi5wcm9wKCdkaXNhYmxlZCcsIHNlbGVjdGVkRGF0YUl0ZW1zLmxlbmd0aCA9PSAwKTtcblxuXHRcdC8vIEVuYWJsZS9kaXNhYmxlIHJlbW92ZSBidXR0b25cblx0XHRpZiAodGhpcy5fcmVtb3ZlQnV0dG9uKVxuXHRcdFx0dGhpcy5fcmVtb3ZlQnV0dG9uLnByb3AoJ2Rpc2FibGVkJywgc2VsZWN0ZWREYXRhSXRlbXMubGVuZ3RoID09IDApO1xuICAgIH1cblxuXHRfb25SZW1vdmVDbGljaygpXG5cdHtcblx0XHRsZXQgc2VsZWN0ZWRJbmRleCA9IHRoaXMuX2dyaWRXaWRnZXQuc2VsZWN0KCkuaW5kZXgoKTtcblxuXHRcdC8vIFJlbW92ZSBpdGVtIGZyb20gbGlzdFxuXHRcdHRoaXMuX2RhdGEucmVtb3ZlTGlzdEl0ZW0oc2VsZWN0ZWRJbmRleCk7XG5cblx0XHQvLyBSZWdlbmVyYXRlIGRhdGFncmlkJ3MgZGF0YXNvdXJjZVxuXHRcdHRoaXMuX3NldFdpZGdldFZhbHVlKCk7XG5cdH1cblxuXHRfb25BZGRDbGljaygpXG5cdHtcblx0XHQvLyBDbG9uZSBkZWZhdWx0IGl0ZW0gYW5kIGFkZCB0byBsaXN0XG5cdFx0bGV0IG5ld0xpc3RJdGVtID0gW107XG5cdFx0Zm9yIChsZXQgc3ViQ1Agb2YgdGhpcy5fZGF0YS5kZWZhdWx0TGlzdEl0ZW0pXG5cdFx0XHRuZXdMaXN0SXRlbS5wdXNoKHN1YkNQLmNsb25lKHRydWUpKTtcblxuXHRcdC8vIENyZWF0ZSBlZGl0IHBvcHVwXG5cdFx0dGhpcy5fb3BlbkVkaXRQYW5lbChuZXdMaXN0SXRlbSk7XG5cdH1cblxuXHRfb25FZGl0Q2xpY2soKVxuXHR7XG5cdFx0bGV0IHNlbGVjdGVkSW5kZXggPSB0aGlzLl9ncmlkV2lkZ2V0LnNlbGVjdCgpLmluZGV4KCk7XG5cblx0XHQvLyBDbG9uZSBzZWxlY3RlZCBpdGVtIGFuZCBhZGQgdG8gbGlzdFxuXHRcdGxldCBjbG9uZWRMaXN0SXRlbSA9IFtdO1xuXHRcdGZvciAobGV0IHN1YkNQIG9mIHRoaXMuX2RhdGEubGlzdEl0ZW1zW3NlbGVjdGVkSW5kZXhdKVxuXHRcdFx0Y2xvbmVkTGlzdEl0ZW0ucHVzaChzdWJDUC5jbG9uZSh0cnVlKSk7XG5cblx0XHQvLyBDcmVhdGUgZWRpdCBwb3B1cFxuXHRcdHRoaXMuX29wZW5FZGl0UGFuZWwoY2xvbmVkTGlzdEl0ZW0sIHNlbGVjdGVkSW5kZXgpO1xuXHR9XG5cblx0X29wZW5FZGl0UGFuZWwoc3ViQ29uZmlnUGFyYW1zQXJyYXksIGVkaXRJbmRleCA9IC0xKVxuXHR7XG5cdFx0Ly8gQ2hlY2sgaWYgdGhpcyBjb25maWd1cmF0aW9uIGl0ZW0gaXMgaW5zaWRlIGEgbW9kYWwgd2luZG93O1xuXHRcdC8vIGlmIHllcywgdGhlIGVkaXQgcGFuZWwgKHdoaWNoIGlzIGEgbW9kYWwgYXMgd2VsbCkgbXVzdCBiZSBjb25maWd1cmVkIHRvIHJlbW92ZSB0aGUgZGFyayBiYWNrZ3JvdW5kXG5cdFx0aWYgKCQodGhpcykucGFyZW50cygnLm1vZGFsJykubGVuZ3RoID4gMClcblx0XHRcdCQoJy5tb2RhbCcsICQodGhpcykpLmF0dHIoJ2RhdGEtYmFja2Ryb3AnLCBmYWxzZSk7XG5cblx0XHQvLyBDcmVhdGUgZGlhbG9nIGNvbnRlbnRcblx0XHR0aGlzLl9pdGVtRWRpdG9yID0gbmV3IExpc3RJdGVtRWRpdG9yKCk7XG5cdFx0dGhpcy5faXRlbUVkaXRvci5kYXRhID0gc3ViQ29uZmlnUGFyYW1zQXJyYXk7XG5cdFx0dGhpcy5faXRlbUVkaXRvci5pbmRleCA9IGVkaXRJbmRleDtcblxuXHRcdGxldCBpdGVtRWRpdG9yID0gJCh0aGlzLl9pdGVtRWRpdG9yKTtcblxuXHRcdC8vIEFwcGVuZCBjb250ZW50IHRvIGRpYWxvZ1xuXHRcdCQoJy5tb2RhbC1ib2R5JywgdGhpcy5fZWRpdERpYWxvZykuYXBwZW5kKGl0ZW1FZGl0b3IpO1xuXG5cdFx0Ly8gU2V0IGRpYWxvZyBtYWluIGJ1dHRvbiB0ZXh0XG5cdFx0JCgnYnV0dG9uLmstcHJpbWFyeScsIHRoaXMuX2VkaXREaWFsb2cpLmh0bWwoZWRpdEluZGV4ID4gLTEgPyAnPGkgY2xhc3M9XCJmYXMgZmEtcGVuIG1yLTFcIj48L2k+VXBkYXRlJyA6ICc8aSBjbGFzcz1cImZhcyBmYS1wbHVzIG1yLTFcIj48L2k+QWRkJyk7XG5cblx0XHQvLyBEaXNwbGF5IGRpYWxvZ1xuXHRcdHRoaXMuX2VkaXREaWFsb2cubW9kYWwoJ3Nob3cnKTtcblx0fVxuXG5cdF9vblN1Ym1pdEJ0Q2xpY2soKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2l0ZW1FZGl0b3IudmFsaWRhdGUoKSlcblx0XHR7XG5cdFx0XHRsZXQgZGF0YSA9IHRoaXMuX2l0ZW1FZGl0b3IuZGF0YTtcblx0XHRcdGxldCBpbmRleCA9IHRoaXMuX2l0ZW1FZGl0b3IuaW5kZXg7XG5cblx0XHRcdC8vIEhpZGUgbW9kYWxcblx0XHRcdHRoaXMuX2VkaXREaWFsb2cubW9kYWwoJ2hpZGUnKTtcblxuXHRcdFx0Ly8gQ29tcGxldGUgZWRpdGluZ1xuXHRcdFx0dGhpcy5fb25FZGl0Q29tcGxldGUoZGF0YSwgaW5kZXgpO1xuXHRcdH1cblx0fVxuXG5cdF9vbkNhbmNlbEJ0Q2xpY2soKVxuXHR7XG5cdFx0Ly8gSGlkZSBtb2RhbFxuXHRcdHRoaXMuX2VkaXREaWFsb2cubW9kYWwoJ2hpZGUnKTtcblx0fVxuXG5cdF9vbkVkaXRQYW5lbEhpZGRlbihlKVxuXHR7XG5cdFx0Ly8gUmVtb3ZlIGNvbnRlbnQgZnJvbSBkaWFsb2dcblx0XHR0aGlzLl9pdGVtRWRpdG9yLnJlbW92ZSgpO1xuXG5cdFx0Ly8gU2V0IGRpYWxvZyBtYWluIGJ1dHRvbiB0ZXh0XG5cdFx0JCgnYnV0dG9uLmstcHJpbWFyeScsIHRoaXMuX2VkaXREaWFsb2cpLmh0bWwoJy4uLicpO1xuXG5cdFx0dGhpcy5faXRlbUVkaXRvciA9IG51bGw7XG5cdH1cblxuXHRfb25FZGl0Q29tcGxldGUobGlzdEl0ZW0sIGVkaXRJbmRleClcblx0e1xuXHRcdC8vIEFuIGV4aXN0aW5nIGxpc3QgaXRlbSB3YXMgdXBkYXRlZFxuXHRcdGlmIChlZGl0SW5kZXggPiAtMSlcblx0XHRcdHRoaXMuX2RhdGEudXBkYXRlTGlzdEl0ZW0obGlzdEl0ZW0sIGVkaXRJbmRleCk7XG5cblx0XHQvLyBBIG5ldyBsaXN0IGl0ZW0gd2FzIGFkZGVkOyBhZGQgaXQgdG8gdGhlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyXG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5fZGF0YS5hZGRMaXN0SXRlbShsaXN0SXRlbSk7XG5cblx0XHQvLyBSZWdlbmVyYXRlIGRhdGFncmlkJ3MgZGF0YXNvdXJjZVxuXHRcdHRoaXMuX3NldFdpZGdldFZhbHVlKCk7XG5cdH1cbn1cblxuLy8gREVGSU5FIENPTVBPTkVOVFxuaWYgKCF3aW5kb3cuY3VzdG9tRWxlbWVudHMuZ2V0KCdjb25maWctZ3JpZCcpKVxuXHR3aW5kb3cuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdjb25maWctZ3JpZCcsIENvbmZpZ0dyaWQpO1xuIiwiZXhwb3J0IGNsYXNzIENvbmZpZ0xhYmVsIGV4dGVuZHMgSFRNTEVsZW1lbnRcbntcblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdCAgICBzdXBlcigpO1xuXG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywnY29uZmlnLWxhYmVsJyk7XG5cdH1cblxuXHRzZXQgdmFsdWUodmFsKVxuXHR7XG5cdFx0aWYgKHR5cGVvZiB2YWwgPT09ICdib29sZWFuJylcblx0XHRcdHRoaXMuaW5uZXJIVE1MID0gKHZhbCA/ICd0cnVlJyA6ICdmYWxzZScpO1xuXHRcdGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKVxuXHRcdFx0dGhpcy5pbm5lckhUTUwgPSAodmFsID8gdmFsIDogMCk7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5pbm5lckhUTUwgPSAodmFsICE9ICcnID8gdmFsIDogJyZtZGFzaDsnKTtcblx0fVxuXG5cdGdldCB2YWx1ZSgpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy50ZXh0Q29udGVudDtcblx0fVxufVxuXG4vLyBERUZJTkUgQ09NUE9ORU5UXG5pZiAoIXdpbmRvdy5jdXN0b21FbGVtZW50cy5nZXQoJ2NvbmZpZy1sYWJlbCcpKVxuXHR3aW5kb3cuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdjb25maWctbGFiZWwnLCBDb25maWdMYWJlbCk7XG4iLCJpbXBvcnQge0NvbmZpZ0Zvcm1JdGVtfSBmcm9tICcuL2NvbmZpZy1mb3JtLWl0ZW0nO1xuaW1wb3J0IHtDb25maWdMYWJlbH0gZnJvbSAnLi9jb25maWctbGFiZWwnO1xuXG5leHBvcnQgY2xhc3MgQ29uZmlnTnVtZXJpY1N0ZXBwZXIgZXh0ZW5kcyBDb25maWdGb3JtSXRlbVxue1xuXHRjb25zdHJ1Y3Rvcihjb25maWdQYXJhbSwgZWRpdEVuYWJsZWQsIGluRGlhbG9nKVxuXHR7XG5cdCAgICBzdXBlcihjb25maWdQYXJhbSwgZWRpdEVuYWJsZWQsIGluRGlhbG9nKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGUgd2lkZ2V0IHRvIHJlbmRlciB0aGUgQ29uZmlnUGFyYW1ldGVyIHZhbHVlLlxuXHQgKiBJZiBwYXJhbWV0ZXIgaXMgbm90IGVkaXRhYmxlLCBhIHNpbXBsZSBsYWJlbCBpcyB1c2VkLlxuXHQgKiBAb3ZlcnJpZGVcblx0ICovXG5cdF9nZW5lcmF0ZUlubmVyV2lkZ2V0KClcblx0e1xuXHRcdGlmICh0aGlzLl9kYXRhLmVkaXRhYmxlKVxuXHRcdHtcblx0XHRcdC8vIFNldCB3aWRnZXQgY29uZmlndXJhdGlvblxuXHRcdFx0bGV0IGNvbmZpZyA9IHtcblx0XHRcdFx0dHlwZTogJ251bWJlcicsXG5cdFx0XHRcdGNsYXNzOiAnZm9ybS1jb250cm9sJyxcblx0XHRcdFx0aWQ6IHRoaXMuX2RhdGEubmFtZSxcblx0XHRcdFx0bmFtZTogdGhpcy5fZGF0YS5uYW1lLFxuXHRcdFx0XHQnZGF0YS1yb2xlJzogJ251bWVyaWN0ZXh0Ym94Jyxcblx0XHRcdFx0J2RhdGEtcmVxdWlyZWQtbXNnJzogJ1JlcXVpcmVkJyxcblx0XHRcdFx0J2RhdGEtZm9ybWF0JzogJyMnLFxuXHRcdFx0XHRyZXF1aXJlZDogJ3JlcXVpcmVkJyxcblx0XHRcdH07XG5cblx0XHRcdC8vIFNldCB3aWRnZXQgYXR0cmlidXRlcyAoc2VlIHBhcmVudCBjbGFzcylcblx0XHRcdHRoaXMuX3NldFdpZGdldEF0dHJpYnV0ZXMoY29uZmlnKTtcblxuXHRcdFx0Ly8gU2V0IGFkZGl0aW9uYWwgd2lkZ2V0IGF0dHJpYnV0ZXMgYmFzZWQgb24gdmFsaWRhdGlvbiBydWxlcyAoc2VlIHBhcmVudCBjbGFzcylcblx0XHRcdHRoaXMuX3NldFdpZGdldFZhbGlkYXRpb25BdHRyaWJ1dGVzKGNvbmZpZyk7XG5cblx0XHRcdC8vIENyZWF0ZSB3aWRnZXQncyBodG1sXG5cdFx0XHR0aGlzLl93aWRnZXRIdG1sID0gJCgnPGlucHV0PicsIGNvbmZpZyk7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHRcdHRoaXMuX3dpZGdldEh0bWwgPSBuZXcgQ29uZmlnTGFiZWwoKTtcblxuXHRcdC8vIFJldHVybiBjb21wb25lbnRcblx0XHRyZXR1cm4gdGhpcy5fd2lkZ2V0SHRtbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbml0aWFsaXplIHdpZGdldC5cblx0ICogQG92ZXJyaWRlXG5cdCAqL1xuICAgX2luaXRpYWxpemUoKVxuICAge1xuXHQgICBpZiAodGhpcy5fZGF0YS5lZGl0YWJsZSlcblx0ICAge1xuXHRcdCAgIC8vIEluaXRpYWxpemUga2VuZG8gd2lkZ2V0XG5cdFx0ICAga2VuZG8uaW5pdCh0aGlzLl93aWRnZXRIdG1sKTtcblxuXHRcdCAgIC8vIFNhdmUgcmVmLiB0byB3aWRnZXRcblx0XHQgICB0aGlzLl9pbm5lcldpZGdldCA9IHRoaXMuX3dpZGdldEh0bWwuZGF0YSgna2VuZG9OdW1lcmljVGV4dEJveCcpO1xuXG5cdFx0ICAgLy8gRW5hYmxlIHZhbHVlIGNvbW1pdCBiaW5kaW5nXG5cdFx0ICAgdGhpcy5faW5uZXJXaWRnZXQuYmluZCgnY2hhbmdlJywgJC5wcm94eSh0aGlzLl9vblZhbHVlSW5wdXQsIHRoaXMpKTtcblx0ICAgfVxuXG5cdCAgIC8vIFByb2NlZWQgd2l0aCBpbml0aWFsaXphdGlvblxuXHQgICBzdXBlci5faW5pdGlhbGl6ZSgpO1xuICAgfVxuXG5cdC8qKlxuXHQgKiBTZXQgd2lkZ2V0J3MgdmFsdWUuXG5cdCAqIElmIHBhcmFtZXRlciBpcyBub3QgZWRpdGFibGUsIHRoZSBsYWJlbCB0ZXh0IGlzIHNldC5cblx0ICogQG92ZXJyaWRlXG5cdCAqL1xuXHRfc2V0V2lkZ2V0VmFsdWUoKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2RhdGEuZWRpdGFibGUpXG5cdFx0XHR0aGlzLl9pbm5lcldpZGdldC52YWx1ZSh0aGlzLl9kYXRhLnZhbHVlKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLl93aWRnZXRIdG1sLnZhbHVlID0gdGhpcy5fZGF0YS52YWx1ZTtcblxuXHRcdC8vIFRyaWdnZXIgZXZlbnRcblx0XHR0aGlzLl90cmlnZ2VyRXZlbnQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXQgd2lkZ2V0J3MgZGlzYWJsZWQgc3RhdGUuXG5cdCAqIEBvdmVycmlkZVxuXHQgKi9cblx0X3NldFdpZGdldEVkaXRFbmFibGVkKClcblx0e1xuXHRcdGlmICh0aGlzLl9kYXRhLmVkaXRhYmxlKVxuXHRcdFx0dGhpcy5faW5uZXJXaWRnZXQuZW5hYmxlKHRoaXMuX2VkaXRFbmFibGVkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBVcGRhdGUgQ29uZmlndXJhdGlvbiBQYXJhbWV0ZXIgdmFsdWUuXG5cdCAqIEBvdmVycmlkZVxuXHQgKi9cblx0X29uVmFsdWVJbnB1dChlKVxuXHR7XG5cdFx0Ly8gVXBkYXRlIENvbmZpZ3VyYXRpb24gUGFyYW1ldGVyIHRvIG5ldyB2YWx1ZVxuXHRcdHRoaXMuX2RhdGEudmFsdWUgPSBOdW1iZXIodGhpcy5faW5uZXJXaWRnZXQudmFsdWUoKSk7XG5cblx0XHQvLyBUcmlnZ2VyIGV2ZW50XG5cdFx0dGhpcy5fdHJpZ2dlckV2ZW50KCk7XG5cdH1cbn1cblxuLy8gREVGSU5FIENPTVBPTkVOVFxuaWYgKCF3aW5kb3cuY3VzdG9tRWxlbWVudHMuZ2V0KCdjb25maWctbnVtZXJpYy1zdGVwcGVyJykpXG5cdHdpbmRvdy5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ2NvbmZpZy1udW1lcmljLXN0ZXBwZXInLCBDb25maWdOdW1lcmljU3RlcHBlcik7XG4iLCJpbXBvcnQge0NvbmZpZ0Zvcm1JdGVtfSBmcm9tICcuL2NvbmZpZy1mb3JtLWl0ZW0nO1xuaW1wb3J0IHtDb25maWdMYWJlbH0gZnJvbSAnLi9jb25maWctbGFiZWwnO1xuXG5leHBvcnQgY2xhc3MgQ29uZmlnVGV4dElucHV0IGV4dGVuZHMgQ29uZmlnRm9ybUl0ZW1cbntcblx0Y29uc3RydWN0b3IoY29uZmlnUGFyYW0sIGVkaXRFbmFibGVkLCBpbkRpYWxvZylcblx0e1xuXHQgICAgc3VwZXIoY29uZmlnUGFyYW0sIGVkaXRFbmFibGVkLCBpbkRpYWxvZyk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlIHdpZGdldCB0byByZW5kZXIgdGhlIENvbmZpZ1BhcmFtZXRlciB2YWx1ZS5cblx0ICogSWYgcGFyYW1ldGVyIGlzIG5vdCBlZGl0YWJsZSwgYSBzaW1wbGUgbGFiZWwgaXMgdXNlZC5cblx0ICogQG92ZXJyaWRlXG5cdCAqL1xuXHRfZ2VuZXJhdGVJbm5lcldpZGdldCgpXG5cdHtcblx0XHRpZiAodGhpcy5fZGF0YS5lZGl0YWJsZSlcblx0XHR7XG5cdFx0XHQvLyBTZXQgd2lkZ2V0IGNvbmZpZ3VyYXRpb25cblx0XHRcdGxldCBjb25maWcgPSB7XG5cdFx0XHRcdHR5cGU6ICd0ZXh0Jyxcblx0XHRcdFx0Y2xhc3M6ICdmb3JtLWNvbnRyb2wgay10ZXh0Ym94Jyxcblx0XHRcdFx0aWQ6IHRoaXMuX2RhdGEubmFtZSxcblx0XHRcdFx0bmFtZTogdGhpcy5fZGF0YS5uYW1lLFxuXHRcdFx0XHRhdXRvY29tcGxldGU6ICdvZmYnLFxuXHRcdFx0fTtcblxuXHRcdFx0Ly8gU2V0IHdpZGdldCBhdHRyaWJ1dGVzXG5cdFx0XHR0aGlzLl9zZXRXaWRnZXRBdHRyaWJ1dGVzKGNvbmZpZyk7XG5cblx0XHRcdC8vIFNldCBhZGRpdGlvbmFsIHdpZGdldCBhdHRyaWJ1dGVzIGJhc2VkIG9uIHZhbGlkYXRpb24gcnVsZXNcblx0XHRcdHRoaXMuX3NldFdpZGdldFZhbGlkYXRpb25BdHRyaWJ1dGVzKGNvbmZpZyk7XG5cblx0XHRcdC8vIENyZWF0ZSB3aWRnZXQncyBodG1sXG5cdFx0XHR0aGlzLl93aWRnZXRIdG1sID0gJCgnPGlucHV0PicsIGNvbmZpZyk7XG5cblx0XHRcdC8vIEVuYWJsZSB2YWx1ZSBjb21taXQgYmluZGluZ1xuXHRcdFx0dGhpcy5fd2lkZ2V0SHRtbC5vbignY2hhbmdlJywgJC5wcm94eSh0aGlzLl9vblZhbHVlSW5wdXQsIHRoaXMpKTtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5fd2lkZ2V0SHRtbCA9IG5ldyBDb25maWdMYWJlbCgpO1xuXG5cdFx0Ly8gUmV0dXJuIGNvbXBvbmVudFxuXHRcdHJldHVybiB0aGlzLl93aWRnZXRIdG1sO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldCB3aWRnZXQncyB2YWx1ZS5cblx0ICogSWYgcGFyYW1ldGVyIGlzIG5vdCBlZGl0YWJsZSwgdGhlIGxhYmVsIHRleHQgaXMgc2V0LlxuXHQgKiBAb3ZlcnJpZGVcblx0ICovXG5cdF9zZXRXaWRnZXRWYWx1ZSgpXG5cdHtcblx0XHRpZiAodGhpcy5fZGF0YS5lZGl0YWJsZSlcblx0XHRcdHRoaXMuX3dpZGdldEh0bWwudmFsKHRoaXMuX2RhdGEudmFsdWUpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMuX3dpZGdldEh0bWwudmFsdWUgPSB0aGlzLl9kYXRhLnZhbHVlO1xuXG5cdFx0Ly8gVHJpZ2dlciBldmVudFxuXHRcdHRoaXMuX3RyaWdnZXJFdmVudCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldCB3aWRnZXQncyBkaXNhYmxlZCBzdGF0ZS5cblx0ICogQG92ZXJyaWRlXG5cdCAqL1xuXHRfc2V0V2lkZ2V0RWRpdEVuYWJsZWQoKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2RhdGEuZWRpdGFibGUpXG5cdFx0XHR0aGlzLl93aWRnZXRIdG1sLmF0dHIoJ2Rpc2FibGVkJywgIXRoaXMuX2VkaXRFbmFibGVkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBVcGRhdGUgQ29uZmlndXJhdGlvbiBQYXJhbWV0ZXIgdmFsdWUuXG5cdCAqIEBvdmVycmlkZVxuXHQgKi9cblx0X29uVmFsdWVJbnB1dChlKVxuXHR7XG5cdFx0Ly8gVXBkYXRlIENvbmZpZ3VyYXRpb24gUGFyYW1ldGVyIHRvIG5ldyB2YWx1ZVxuXHRcdHRoaXMuX2RhdGEudmFsdWUgPSB0aGlzLl93aWRnZXRIdG1sLnZhbCgpO1xuXG5cdFx0Ly8gVHJpZ2dlciBldmVudFxuXHRcdHRoaXMuX3RyaWdnZXJFdmVudCgpO1xuXHR9XG59XG5cbi8vIERFRklORSBDT01QT05FTlRcbmlmICghd2luZG93LmN1c3RvbUVsZW1lbnRzLmdldCgnY29uZmlnLXRleHQtaW5wdXQnKSlcblx0d2luZG93LmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnY29uZmlnLXRleHQtaW5wdXQnLCBDb25maWdUZXh0SW5wdXQpO1xuIiwiaW1wb3J0IHtDb25maWdGb3JtSXRlbX0gZnJvbSAnLi9jb25maWctZm9ybS1pdGVtJztcbmltcG9ydCB7Q29uZmlnTGFiZWx9IGZyb20gJy4vY29uZmlnLWxhYmVsJztcbmltcG9ydCB7VmVjdG9yM0RJbnB1dH0gZnJvbSAnLi93aWRnZXRzL3ZlY3Rvci0zZC1pbnB1dCc7XG5cbmV4cG9ydCBjbGFzcyBDb25maWdWZWN0b3IzRCBleHRlbmRzIENvbmZpZ0Zvcm1JdGVtXG57XG5cdGNvbnN0cnVjdG9yKGNvbmZpZ1BhcmFtLCBlZGl0RW5hYmxlZCwgaW5EaWFsb2cpXG5cdHtcblx0ICAgIHN1cGVyKGNvbmZpZ1BhcmFtLCBlZGl0RW5hYmxlZCwgaW5EaWFsb2cpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZSB3aWRnZXQgdG8gcmVuZGVyIHRoZSBDb25maWdQYXJhbWV0ZXIgdmFsdWUuXG5cdCAqIElmIHBhcmFtZXRlciBpcyBub3QgZWRpdGFibGUsIGEgc2ltcGxlIGxhYmVsIGlzIHVzZWQuXG5cdCAqIEBvdmVycmlkZVxuXHQgKi9cblx0X2dlbmVyYXRlSW5uZXJXaWRnZXQoKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2RhdGEuZWRpdGFibGUpXG5cdFx0e1xuXHRcdFx0Ly8gQ3JlYXRlIHdpZGdldCdzIGh0bWxcblx0XHRcdHRoaXMuX3dpZGdldEh0bWwgPSBuZXcgVmVjdG9yM0RJbnB1dCh0aGlzLl9kYXRhLm5hbWUsIHRoaXMuX2RhdGEudmFsaWRhdG9yID09ICdhb2knKTtcblxuXHRcdFx0Ly8gU2V0IHdpZGdldCBhdHRyaWJ1dGVzXG5cdFx0XHR0aGlzLl9zZXRXaWRnZXRBdHRyaWJ1dGVzKHRoaXMuX3dpZGdldEh0bWwpO1xuXG5cdFx0XHQvLyBFbmFibGUgdmFsdWUgY29tbWl0IGJpbmRpbmdcblx0XHRcdCQodGhpcy5fd2lkZ2V0SHRtbCkub24oJ2NoYW5nZScsICQucHJveHkodGhpcy5fb25WYWx1ZUlucHV0LCB0aGlzKSk7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHRcdHRoaXMuX3dpZGdldEh0bWwgPSBuZXcgQ29uZmlnTGFiZWwoKTtcblxuXHRcdC8vIFJldHVybiBjb21wb25lbnRcblx0XHRyZXR1cm4gdGhpcy5fd2lkZ2V0SHRtbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXQgd2lkZ2V0J3MgdmFsdWUuXG5cdCAqIElmIHBhcmFtZXRlciBpcyBub3QgZWRpdGFibGUsIHRoZSBsYWJlbCB0ZXh0IGlzIHNldC5cblx0ICogQG92ZXJyaWRlXG5cdCAqL1xuXHRfc2V0V2lkZ2V0VmFsdWUoKVxuXHR7XG5cdFx0dGhpcy5fd2lkZ2V0SHRtbC52YWx1ZSA9IHRoaXMuX2RhdGEudmFsdWU7XG5cblx0XHQvLyBUcmlnZ2VyIGV2ZW50XG5cdFx0dGhpcy5fdHJpZ2dlckV2ZW50KCk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0IHdpZGdldCdzIGRpc2FibGVkIHN0YXRlLlxuXHQgKiBAb3ZlcnJpZGVcblx0ICovXG5cdF9zZXRXaWRnZXRFZGl0RW5hYmxlZCgpXG5cdHtcblx0XHRpZiAodGhpcy5fZGF0YS5lZGl0YWJsZSlcblx0XHR7XG5cdFx0XHQkKHRoaXMuX3dpZGdldEh0bWwpLmF0dHIoJ2Rpc2FibGVkJywgIXRoaXMuX2VkaXRFbmFibGVkKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogVXBkYXRlIENvbmZpZ3VyYXRpb24gUGFyYW1ldGVyIHZhbHVlLlxuXHQgKiBAb3ZlcnJpZGVcblx0ICovXG5cdF9vblZhbHVlSW5wdXQoZSlcblx0e1xuXHRcdC8vIFVwZGF0ZSBDb25maWd1cmF0aW9uIFBhcmFtZXRlciB0byBuZXcgdmFsdWVcblx0XHR0aGlzLl9kYXRhLnZhbHVlID0gdGhpcy5fd2lkZ2V0SHRtbC52YWx1ZTtcblxuXHRcdC8vIFRyaWdnZXIgZXZlbnRcblx0XHR0aGlzLl90cmlnZ2VyRXZlbnQoKTtcblx0fVxufVxuXG4vLyBERUZJTkUgQ09NUE9ORU5UXG5pZiAoIXdpbmRvdy5jdXN0b21FbGVtZW50cy5nZXQoJ2NvbmZpZy12ZWN0b3ItM2QnKSlcblx0d2luZG93LmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnY29uZmlnLXZlY3Rvci0zZCcsIENvbmZpZ1ZlY3RvcjNEKTtcbiIsImltcG9ydCB7Q29uZmlnRm9ybUl0ZW1GYWN0b3J5fSBmcm9tICcuLi8uLi8uLi91dGlscy91aWJ1aWxkZXIvY29uZmlnLWZvcm0taXRlbS1mYWN0b3J5JztcblxuZXhwb3J0IGNsYXNzIExpc3RJdGVtRWRpdG9yIGV4dGVuZHMgSFRNTEVsZW1lbnRcbntcblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdCAgICBzdXBlcigpO1xuXHR9XG5cblx0c2V0IGRhdGEoc3ViQ29uZmlnUGFyYW1zQXJyYXkpXG5cdHtcblx0XHR0aGlzLl9kYXRhID0gc3ViQ29uZmlnUGFyYW1zQXJyYXk7XG5cblx0XHR0aGlzLl9idWlsZFZpZXcoKTtcblx0fVxuXG5cdGdldCBkYXRhKClcblx0e1xuXHRcdHJldHVybiB0aGlzLl9kYXRhO1xuXHR9XG5cblx0c2V0IGluZGV4KGluZGV4KVxuXHR7XG5cdFx0dGhpcy5faW5kZXggPSBpbmRleDtcblx0fVxuXG5cdGdldCBpbmRleCgpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5faW5kZXg7XG5cdH1cblxuXHRfYnVpbGRWaWV3KClcblx0e1xuXHRcdC8vIEdlbmVyYXRlIGNvbnRhaW5lciBmb3JtXG5cdFx0dGhpcy5fZm9ybSA9ICQoJzxmb3JtPicsIHt9KTtcblxuXHRcdC8vIEFwcGVuZCBmb3JtXG5cdFx0JCh0aGlzKS5hcHBlbmQodGhpcy5fZm9ybSk7XG5cblx0XHQvLyBHZW5lcmF0ZSBmb3JtIGZpZWxkc1xuXHRcdGZvciAobGV0IGNvbmZpZ1BhcmFtIG9mIHRoaXMuX2RhdGEpXG5cdFx0e1xuXHRcdFx0Ly8gQ3JlYXRlIGZvcm0gaXRlbVxuXHRcdFx0bGV0IGZvcm1JdGVtID0gQ29uZmlnRm9ybUl0ZW1GYWN0b3J5LmNyZWF0ZShjb25maWdQYXJhbSwgdHJ1ZSwgdHJ1ZSk7XG5cdFx0XHRmb3JtSXRlbS5kYXRhID0gY29uZmlnUGFyYW07XG5cblx0XHRcdC8vIEFkZCBmb3JtIGl0ZW0gdG8gZm9ybVxuXHRcdFx0dGhpcy5fZm9ybS5hcHBlbmQoZm9ybUl0ZW0pO1xuXHRcdH1cblxuXHRcdC8vIEluaXRpYWxpemUga2VuZG8gdmFsaWRhdGlvbiBvbiBmb3JtXG5cdFx0dGhpcy5fdmFsaWRhdG9yID0gdGhpcy5fZm9ybS5rZW5kb1ZhbGlkYXRvcih7XG5cdFx0XHR2YWxpZGF0ZU9uQmx1cjogdHJ1ZSxcblx0XHRcdHJ1bGVzOiB7XG5cdFx0XHRcdC8vIEFkZCBydWxlIHRvIHZhbGlkYXRlIEFPSSBmb3JtIGl0ZW1zP1xuXHRcdFx0XHQvLyAoc2VlOiBodHRwczovL2RlbW9zLnRlbGVyaWsuY29tL2tlbmRvLXVpL3ZhbGlkYXRvci9jdXN0b20tdmFsaWRhdGlvbilcblx0XHRcdFx0YW9pOiBmdW5jdGlvbiAoaW5wdXQpIHtcblx0XHRcdFx0XHRpZiAoaW5wdXQuaXMoJ1tkYXRhLWFvaS1tc2ddJykgJiYgaW5wdXQudmFsKCkgIT0gJycpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0aWYgKGlucHV0LnZhbCgpID09ICcwLDAsMCcpXG5cdFx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cblx0XHRcdH1cblx0XHR9KS5kYXRhKCdrZW5kb1ZhbGlkYXRvcicpO1xuXHR9XG5cblx0dmFsaWRhdGUoKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3ZhbGlkYXRvci52YWxpZGF0ZSgpO1xuXHR9XG59XG5cbi8vIERFRklORSBDT01QT05FTlRcbmlmICghd2luZG93LmN1c3RvbUVsZW1lbnRzLmdldCgnbGlzdC1pdGVtLWVkaXRvcicpKVxuXHR3aW5kb3cuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdsaXN0LWl0ZW0tZWRpdG9yJywgTGlzdEl0ZW1FZGl0b3IpO1xuIiwiZXhwb3J0IGNsYXNzIFZlY3RvcjNESW5wdXQgZXh0ZW5kcyBIVE1MRWxlbWVudFxue1xuXHRjb25zdHJ1Y3RvcihpZCwgaXNWYWxpZGFibGUpXG5cdHtcblx0ICAgIHN1cGVyKCk7XG5cblx0XHR0aGlzLmlkID0gaWQ7XG5cdFx0dGhpcy5uYW1lID0gaWQ7XG5cblx0XHR0aGlzLl9pc1ZhbGlkYWJsZSA9IGlzVmFsaWRhYmxlO1xuXG5cdFx0dGhpcy5faW5pdGlhbGl6ZSgpO1xuXHR9XG5cblx0c2V0IGVuYWJsZUNsZWFyKHZhbHVlKVxuXHR7XG5cdFx0aWYgKHZhbHVlKVxuXHRcdFx0dGhpcy5fY2xlYXJCdXR0b24uc2hvdygpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMuX2NsZWFyQnV0dG9uLmhpZGUoKTtcblx0fVxuXG5cdHNldCBhbGxvd05lZ2F0aXZlKHZhbHVlKVxuXHR7XG5cdFx0aWYgKHZhbHVlKVxuXHRcdHtcblx0XHRcdHRoaXMuX3dpZGdldFguc2V0T3B0aW9ucygge21pbjogbnVsbH0gKTtcblx0XHRcdHRoaXMuX3dpZGdldFkuc2V0T3B0aW9ucygge21pbjogbnVsbH0gKTtcblx0XHRcdHRoaXMuX3dpZGdldFouc2V0T3B0aW9ucygge21pbjogbnVsbH0gKTtcblx0XHR9XG5cdH1cblxuXHRzZXQgdmFsdWUodmFsKVxuXHR7XG5cdFx0dmFyIGNvb3JkcyA9IHZhbC5zcGxpdCgnLCcpO1xuXG5cdFx0aWYgKGNvb3Jkcy5sZW5ndGggPj0gMSlcblx0XHRcdHRoaXMuX3dpZGdldFgudmFsdWUoY29vcmRzWzBdKTtcblxuXHRcdGlmIChjb29yZHMubGVuZ3RoID49IDIpXG5cdFx0XHR0aGlzLl93aWRnZXRZLnZhbHVlKGNvb3Jkc1sxXSk7XG5cblx0XHRpZiAoY29vcmRzLmxlbmd0aCA+PSAzKVxuXHRcdFx0dGhpcy5fd2lkZ2V0Wi52YWx1ZShjb29yZHNbMl0pO1xuXG5cdFx0aWYgKHRoaXMuX2lzVmFsaWRhYmxlKVxuXHRcdFx0dGhpcy5faW5wdXRWYWwudmFsKHRoaXMudmFsdWUpO1xuXHR9XG5cblx0Z2V0IHZhbHVlKClcblx0e1xuXHRcdGlmICh0aGlzLl93aWRnZXRYLnZhbHVlKCkgPT0gbnVsbCAmJiB0aGlzLl93aWRnZXRZLnZhbHVlKCkgPT0gbnVsbCAmJiB0aGlzLl93aWRnZXRaLnZhbHVlKCkgPT0gbnVsbClcblx0XHRcdHJldHVybiAnJztcblx0XHRlbHNlXG5cdFx0XHRyZXR1cm4gdGhpcy5fd2lkZ2V0WC52YWx1ZSgpICsgJywnICsgdGhpcy5fd2lkZ2V0WS52YWx1ZSgpICsgJywnICsgdGhpcy5fd2lkZ2V0Wi52YWx1ZSgpO1xuXHR9XG5cblx0X2luaXRpYWxpemUoKVxuXHR7XG5cdFx0Ly8gR2VuZXJhdGUgY29udGFpbmVyIGZvcm1cblx0XHR0aGlzLl9jb250YWluZXIgPSAkKCc8ZGl2PicsIHtcblx0XHRcdGNsYXNzOiAnZm9ybS1pbmxpbmUnXG5cdFx0fSk7XG5cblx0XHQvLyBBcHBlbmQgY29udGFpbmVyXG5cdFx0JCh0aGlzKS5hcHBlbmQodGhpcy5fY29udGFpbmVyKTtcblxuXHRcdC8vIFNldCBpbnB1dHMgY29uZmlndXJhdGlvblxuXHRcdGxldCBjb25maWdIdG1sID0ge1xuXHRcdFx0dHlwZTogJ251bWJlcicsXG5cdFx0XHRjbGFzczogJ2Zvcm0tY29udHJvbCBzaG9ydC00Jyxcblx0XHR9O1xuXG5cdFx0Ly8gU2V0IHdpZGdldCBjb25maWd1cmF0aW9uXG5cdFx0bGV0IGNvbmZpZ1dpZGdldCA9IHtcblx0XHRcdG1pbjogMCxcblx0XHRcdHNwaW5uZXJzOiBmYWxzZSxcblx0XHRcdGZvcm1hdDogJyMuIyMjIyMjJyxcblx0XHRcdGRlY2ltYWxzOiA2LFxuXHRcdFx0cm91bmQ6IGZhbHNlLFxuXHRcdFx0c3Bpbm5lcnM6IGZhbHNlLFxuXHRcdFx0cmVzdHJpY3REZWNpbWFsczogZmFsc2UsXG5cdFx0XHRjaGFuZ2U6ICQucHJveHkodGhpcy5fb25DaGFuZ2UsIHRoaXMpXG5cdFx0fTtcblxuXHRcdC8vIENyZWF0ZSB3aWRnZXRzXG5cdFx0dGhpcy5faW5wdXRYID0gJCgnPGlucHV0PicsIGNvbmZpZ0h0bWwpO1xuXHRcdHRoaXMuX2NvbnRhaW5lci5hcHBlbmQodGhpcy5faW5wdXRYKTtcblx0XHR0aGlzLl93aWRnZXRYID0gdGhpcy5faW5wdXRYLmtlbmRvTnVtZXJpY1RleHRCb3goY29uZmlnV2lkZ2V0KS5kYXRhKCdrZW5kb051bWVyaWNUZXh0Qm94Jyk7XG5cblx0XHR0aGlzLl9jb250YWluZXIuYXBwZW5kKCc8c3BhbiBjbGFzcz1cInB4LTFcIj4sPC9zcGFuPicpO1xuXG5cdFx0dGhpcy5faW5wdXRZID0gJCgnPGlucHV0PicsIGNvbmZpZ0h0bWwpO1xuXHRcdHRoaXMuX2NvbnRhaW5lci5hcHBlbmQodGhpcy5faW5wdXRZKTtcblx0XHR0aGlzLl93aWRnZXRZID0gdGhpcy5faW5wdXRZLmtlbmRvTnVtZXJpY1RleHRCb3goY29uZmlnV2lkZ2V0KS5kYXRhKCdrZW5kb051bWVyaWNUZXh0Qm94Jyk7XG5cblx0XHR0aGlzLl9jb250YWluZXIuYXBwZW5kKCc8c3BhbiBjbGFzcz1cInB4LTFcIj4sPC9zcGFuPicpO1xuXG5cdFx0dGhpcy5faW5wdXRaID0gJCgnPGlucHV0PicsIGNvbmZpZ0h0bWwpO1xuXHRcdHRoaXMuX2NvbnRhaW5lci5hcHBlbmQodGhpcy5faW5wdXRaKTtcblx0XHR0aGlzLl93aWRnZXRaID0gdGhpcy5faW5wdXRaLmtlbmRvTnVtZXJpY1RleHRCb3goY29uZmlnV2lkZ2V0KS5kYXRhKCdrZW5kb051bWVyaWNUZXh0Qm94Jyk7XG5cblx0XHR0aGlzLl9jb250YWluZXIuYXBwZW5kKCc8c3BhbiBjbGFzcz1cInB4LTFcIj48L3NwYW4+Jyk7IC8vIEFkZGl0aW9uYWwgc3BhY2VyXG5cblx0XHQvLyBDcmVhdGUgaW52aXNpYmxlIGZpZWxkIHRvIGFwcGx5IG92ZXJhbGwgdmFsaWRhdGlvblxuXHRcdGlmICh0aGlzLl9pc1ZhbGlkYWJsZSlcblx0XHR7XG5cdFx0XHR0aGlzLl9pbnB1dFZhbCA9ICQoJzxpbnB1dD4nLCB7bmFtZTogYCR7dGhpcy5uYW1lfS1jdXN0b20tdmFsaWRhdGVgLCAnZGF0YS1hb2ktbXNnJzogJ1ZhbHVlcyBjYW5cXCd0IGFsbCBiZSAwJ30pO1xuXHRcdFx0dGhpcy5fY29udGFpbmVyLmFwcGVuZCh0aGlzLl9pbnB1dFZhbCk7XG5cdFx0XHR0aGlzLl9jb250YWluZXIuYXBwZW5kKGA8c3BhbiBjbGFzcz1cImstaW52YWxpZC1tc2dcIiBkYXRhLWZvcj1cIiR7dGhpcy5uYW1lfS1jdXN0b20tdmFsaWRhdGVcIj48L3NwYW4+YClcblx0XHRcdHRoaXMuX2lucHV0VmFsLmhpZGUoKTtcblx0XHR9XG5cblx0XHQvLyBDcmVhdGUgYW5kIGFwcGVuZCBDbGVhciBidXR0b25cblx0XHR0aGlzLl9jbGVhckJ1dHRvbiA9ICQoJzxidXR0b24+Jywge3R5cGU6ICdidXR0b24nLCBjbGFzczogJ2stYnV0dG9uIGstc2Vjb25kYXJ5IG15LTEnLCB0aXRsZTogJ0NsZWFyJ30pLmFwcGVuZCgkKCc8aSBjbGFzcz1cImZhcyBmYS10aW1lc1wiPjwvaT4nKSk7XG5cdFx0dGhpcy5fY2xlYXJCdXR0b24ub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vbkNsZWFyQ2xpY2ssIHRoaXMpKTtcblx0XHR0aGlzLl9jb250YWluZXIuYXBwZW5kKHRoaXMuX2NsZWFyQnV0dG9uKTtcblxuXHRcdC8vIEhpZGUgYnV0dG9uIGJ5IGRlZmF1bHRcblx0XHR0aGlzLl9jbGVhckJ1dHRvbi5oaWRlKCk7XG5cdH1cblxuXHRfb25DaGFuZ2UoKVxuXHR7XG5cdFx0Ly8gRW1wdHkgc3RyaW5ncyBhcmUgbm90IGFsbG93ZWRcblx0XHRpZiAodGhpcy5fd2lkZ2V0WC52YWx1ZSgpID09IG51bGwpXG5cdFx0XHR0aGlzLl93aWRnZXRYLnZhbHVlKDApO1xuXG5cdFx0aWYgKHRoaXMuX3dpZGdldFkudmFsdWUoKSA9PSBudWxsKVxuXHRcdFx0dGhpcy5fd2lkZ2V0WS52YWx1ZSgwKTtcblxuXHRcdGlmICh0aGlzLl93aWRnZXRaLnZhbHVlKCkgPT0gbnVsbClcblx0XHRcdHRoaXMuX3dpZGdldFoudmFsdWUoMCk7XG5cblx0XHR0aGlzLl9kaXNwYXRjaENvbW1pdCgpO1xuXHR9XG5cblx0X29uQ2xlYXJDbGljaygpXG5cdHtcblx0XHR0aGlzLl93aWRnZXRYLnZhbHVlKCcnKTtcblx0XHR0aGlzLl93aWRnZXRZLnZhbHVlKCcnKTtcblx0XHR0aGlzLl93aWRnZXRaLnZhbHVlKCcnKTtcblxuXHRcdHRoaXMuX2Rpc3BhdGNoQ29tbWl0KCk7XG5cdH1cblxuXHRfZGlzcGF0Y2hDb21taXQoKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2lzVmFsaWRhYmxlKVxuXHRcdFx0dGhpcy5faW5wdXRWYWwudmFsKHRoaXMudmFsdWUpO1xuXG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnY2hhbmdlJykpO1xuXHR9XG59XG5cbi8vIERFRklORSBDT01QT05FTlRcbmlmICghd2luZG93LmN1c3RvbUVsZW1lbnRzLmdldCgndmVjdG9yLTNkLWlucHV0JykpXG5cdHdpbmRvdy5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3ZlY3Rvci0zZC1pbnB1dCcsIFZlY3RvcjNESW5wdXQpO1xuIiwiaW1wb3J0IHtDb25maWdGb3JtSXRlbX0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy91aWJ1aWxkZXIvY29uZmlnLWZvcm0taXRlbSc7XG5cbmltcG9ydCB7Q29uZmlnTnVtZXJpY1N0ZXBwZXJ9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvdWlidWlsZGVyL2NvbmZpZy1udW1lcmljLXN0ZXBwZXInO1xuaW1wb3J0IHtDb25maWdUZXh0SW5wdXR9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvdWlidWlsZGVyL2NvbmZpZy10ZXh0LWlucHV0JztcbmltcG9ydCB7Q29uZmlnQ2hlY2tCb3h9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvdWlidWlsZGVyL2NvbmZpZy1jaGVjay1ib3gnO1xuaW1wb3J0IHtDb25maWdEcm9wRG93bkxpc3R9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvdWlidWlsZGVyL2NvbmZpZy1kcm9wLWRvd24tbGlzdCc7XG5pbXBvcnQge0NvbmZpZ0dyaWR9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvdWlidWlsZGVyL2NvbmZpZy1ncmlkJztcbmltcG9ydCB7Q29uZmlnRHVhbExpc3R9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvdWlidWlsZGVyL2NvbmZpZy1kdWFsLWxpc3QnO1xuaW1wb3J0IHtDb25maWdWZWN0b3IzRH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy91aWJ1aWxkZXIvY29uZmlnLXZlY3Rvci0zZCc7XG5cbmV4cG9ydCBjbGFzcyBDb25maWdGb3JtSXRlbUZhY3Rvcnlcbntcblx0c3RhdGljIGNyZWF0ZShjb25maWdQYXJhbSwgZWRpdEVuYWJsZWQsIGluRGlhbG9nID0gZmFsc2UpXG5cdHtcblx0XHRzd2l0Y2ggKGNvbmZpZ1BhcmFtLnR5cGUpXG5cdFx0e1xuXHRcdFx0Y2FzZSAnVGV4dElucHV0Jzpcblx0XHRcdFx0cmV0dXJuIG5ldyBDb25maWdUZXh0SW5wdXQoY29uZmlnUGFyYW0sIGVkaXRFbmFibGVkLCBpbkRpYWxvZyk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdDaGVja0JveCc6XG5cdFx0XHRcdHJldHVybiBuZXcgQ29uZmlnQ2hlY2tCb3goY29uZmlnUGFyYW0sIGVkaXRFbmFibGVkLCBpbkRpYWxvZyk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdOdW1lcmljU3RlcHBlcic6XG5cdFx0XHRcdHJldHVybiBuZXcgQ29uZmlnTnVtZXJpY1N0ZXBwZXIoY29uZmlnUGFyYW0sIGVkaXRFbmFibGVkLCBpbkRpYWxvZyk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdDb21ib0JveCc6XG5cdFx0XHRcdHJldHVybiBuZXcgQ29uZmlnRHJvcERvd25MaXN0KGNvbmZpZ1BhcmFtLCBlZGl0RW5hYmxlZCwgaW5EaWFsb2cpO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnRGF0YUdyaWQnOlxuXHRcdFx0XHRyZXR1cm4gbmV3IENvbmZpZ0dyaWQoY29uZmlnUGFyYW0sIGVkaXRFbmFibGVkLCBpbkRpYWxvZyk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdEdWFsTGlzdCc6XG5cdFx0XHRcdHJldHVybiBuZXcgQ29uZmlnRHVhbExpc3QoY29uZmlnUGFyYW0sIGVkaXRFbmFibGVkLCBpbkRpYWxvZyk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdWZWN0b3IzRCc6XG5cdFx0XHRcdHJldHVybiBuZXcgQ29uZmlnVmVjdG9yM0QoY29uZmlnUGFyYW0sIGVkaXRFbmFibGVkLCBpbkRpYWxvZyk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gbmV3IENvbmZpZ0Zvcm1JdGVtKGNvbmZpZ1BhcmFtLCBlZGl0RW5hYmxlZCwgaW5EaWFsb2cpOyAvLyBXaWxsIGxvZyBhbiBlcnJvciBmb3IgbWlzc2luZyBmb3JtIGl0ZW0gdHlwZVxuXHRcdH1cblx0fVxufVxuIiwiaW1wb3J0IHtDb25maWd1cmF0aW9uUGFyYW1ldGVyfSBmcm9tICcuL2NvbmZpZ3VyYXRpb24tcGFyYW1ldGVyJztcbmltcG9ydCB7Q29uZmlnRm9ybUl0ZW1GYWN0b3J5fSBmcm9tICcuL2NvbmZpZy1mb3JtLWl0ZW0tZmFjdG9yeSc7XG5cbmV4cG9ydCBjbGFzcyBDb25maWdJbnRlcmZhY2VCdWlsZGVyXG57XG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHRcdC8vIFNldCBzb21lIGNvbnN0YW50c1xuXHRcdHRoaXMuVEFCX1BSRUZJWCA9ICd0YWItJ1xuXHRcdHRoaXMuVEFCX1BBTkVfUFJFRklYID0gJ3RhYnBhbmUtJztcblx0XHR0aGlzLlNFUEFSQVRPUl9CRUZPUkUgPSAnYmVmb3JlJztcblx0XHR0aGlzLlNFUEFSQVRPUl9BRlRFUiA9ICdhZnRlcic7XG5cdH1cblxuXHRkdW1wKG1vZGlmaWVkT25seSA9IGZhbHNlKVxuXHR7XG5cdFx0bGV0IGR1bXBTdHIgPSAnJztcblxuXHRcdGZvciAobGV0IGNwIG9mIHRoaXMuX2NvbmZpZ1BhcmFtcylcblx0XHR7XG5cdFx0XHRpZiAobW9kaWZpZWRPbmx5KVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAoY3AuaXNNb2RpZmllZClcblx0XHRcdFx0XHRkdW1wU3RyICs9IGNwLnRvU3RyaW5nKCkgKyAnXFxuJztcblx0XHRcdH1cblx0XHRcdGVsc2Vcblx0XHRcdFx0ZHVtcFN0ciArPSBjcC50b1N0cmluZygpICsgJ1xcbic7XG5cdFx0fVxuXG5cdFx0Y29uc29sZS5sb2coZHVtcFN0cik7XG5cdH1cblxuXHRidWlsZEludGVyZmFjZShkYXRhLCBtYWluQ29udGFpbmVySWQsIGRpc2FibGVFZGl0ID0gZmFsc2UsIHRhYlN1ZmZpeCA9ICcnKVxuXHR7XG5cdFx0dGhpcy5fbWFpbkNvbnRhaW5lcklkID0gbWFpbkNvbnRhaW5lcklkO1xuXHRcdHRoaXMuX2NvbmZpZ1BhcmFtcyA9IG5ldyBBcnJheSgpO1xuXHRcdHRoaXMuX3ZhbGlkYXRvciA9IG51bGw7XG5cblx0XHRsZXQgaGFzTmV3Rm9ybUl0ZW0gPSBmYWxzZTtcblxuXHRcdC8vY29uc29sZS5sb2coZGF0YS5nZXREdW1wKCkpXG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEuc2l6ZSgpOyBpKyspXG5cdFx0e1xuXHRcdFx0Ly8gUEFSU0UgREFUQVxuXG5cdFx0XHRsZXQgY29uZmlnUGFyYW0gPSBDb25maWd1cmF0aW9uUGFyYW1ldGVyLmZyb21TZnNPYmplY3QoZGF0YS5nZXQoaSkpO1xuXHRcdFx0dGhpcy5fY29uZmlnUGFyYW1zLnB1c2goY29uZmlnUGFyYW0pO1xuXG5cdFx0XHQvLyBHZXQgdGFiIGFuZCB0YWIgcGFuZSBpZCBmcm9tIGdyb3VwIGlkXG5cdFx0XHRjb25zdCB0YWJJZCA9IHRoaXMuVEFCX1BSRUZJWCArIGNvbmZpZ1BhcmFtLmNhdGVnb3J5SWQgKyAodGFiU3VmZml4ID8gJ18nICsgdGFiU3VmZml4IDogJycpO1xuXHRcdFx0Y29uc3QgdGFiUGFuZUlkID0gdGhpcy5UQUJfUEFORV9QUkVGSVggKyBjb25maWdQYXJhbS5jYXRlZ29yeUlkICsgKHRhYlN1ZmZpeCA/ICdfJyArIHRhYlN1ZmZpeCA6ICcnKTtcblxuXHRcdFx0Ly8gQlVJTEQgSU5URVJGQUNFIDo6IFRBQlNcblxuXHRcdFx0Ly8gQ2hlY2sgaWYgYSB0YWIgc3BlY2lmaWMgZm9yIHRoaXMgZ3JvdXAgYWxyZWFkeSBleGlzdHMgaW5zaWRlIHRoZSBtYWluQ29udGFpbmVyOiBpZiBub3QsIGNyZWF0ZSBpdFxuXHRcdFx0Ly8gKGEgdGFiIGFscmVhZHkgZXhpc3RzIGlmIGl0IHdhcyBjcmVhdGVkIGluIGEgcHJldmlvdXMgbG9vcClcblx0XHRcdGxldCB0YWIgPSAkKGAjJHttYWluQ29udGFpbmVySWR9ID4gI3RhYnMgIyR7dGFiSWR9YCk7XG5cblx0XHRcdGlmICh0YWIubGVuZ3RoID09IDApXG5cdFx0XHR7XG5cdFx0XHRcdC8vIENyZWF0ZSB0YWIgZm9yIHRhYiBwYW5lXG5cdFx0XHRcdHRhYiA9ICQoJzxsaT4nLCB7Y2xhc3M6ICduYXYtaXRlbSd9KTtcblx0XHRcdFx0dGFiLmFwcGVuZCgkKCc8YT4nLCB7XG5cdFx0XHRcdFx0Y2xhc3M6ICduYXYtbGluaycgKyAoaSA9PSAwID8gJyBhY3RpdmUnIDogJycpLFxuXHRcdFx0XHRcdGlkOiB0YWJJZCxcblx0XHRcdFx0XHQnZGF0YS10b2dnbGUnOiAndGFiJyxcblx0XHRcdFx0XHRocmVmOiAnIycgKyB0YWJQYW5lSWQsXG5cdFx0XHRcdFx0cm9sZTogJ3RhYicsXG5cdFx0XHRcdFx0J2FyaWEtY29udHJvbHMnOiB0YWJQYW5lSWQsXG5cdFx0XHRcdFx0J2FyaWEtc2VsZWN0ZWQnOiAoaSA9PSAwID8gJ3RydWUnIDogJ2ZhbHNlJyksXG5cdFx0XHRcdFx0aHRtbDogY29uZmlnUGFyYW0uY2F0ZWdvcnksXG5cdFx0XHRcdH0pKTtcblxuXHRcdFx0XHQvLyBBZGQgdGFiIHRvIGNvbnRhaW5lclxuXHRcdFx0XHQkKGAjJHttYWluQ29udGFpbmVySWR9ID4gI3RhYnNgKS5hcHBlbmQodGFiKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQlVJTEQgSU5URVJGQUNFIDo6IFRBQiBQQU5FU1xuXG5cdFx0XHQvLyBDaGVjayBpZiBhIHRhYiBwYW5lIHNwZWNpZmljIGZvciB0aGlzIGdyb3VwIGFscmVhZHkgZXhpc3RzIGluc2lkZSB0aGUgbWFpbkNvbnRhaW5lcjogaWYgbm90LCBjcmVhdGUgaXRcblx0XHRcdC8vIChhIHRhYiBwYW5lIGFscmVhZHkgZXhpc3RzIGlmIGl0IHdhcyBjcmVhdGVkIGluIGEgcHJldmlvdXMgbG9vcCBvciBpZiBpdCBleGlzdHMgc3RhdGljYWxseSBpbiB0aGUgaHRtbCAtIGluIGNhc2UgaXQgaXMgbmVlZGVkIHRvIGFkZCBzb21lIHN0YXRpYyBjb250ZW50KVxuXHRcdFx0bGV0IHRhYlBhbmUgPSAkKGAjJHttYWluQ29udGFpbmVySWR9ID4gI3RhYlBhbmVscyA+ICMke3RhYlBhbmVJZH1gKTtcblxuXHRcdFx0aWYgKHRhYlBhbmUubGVuZ3RoID09IDApXG5cdFx0XHR7XG5cdFx0XHRcdC8vIENyZWF0ZSB0YWIgcGFuZVxuXHRcdFx0XHR0YWJQYW5lID0gJCgnPGRpdj4nLCB7XG5cdFx0XHRcdFx0Y2xhc3M6ICd0YWItcGFuZScgKyAoaSA9PSAwID8gJyBzaG93IGFjdGl2ZScgOiAnJyksXG5cdFx0XHRcdFx0aWQ6IHRhYlBhbmVJZCxcblx0XHRcdFx0XHRyb2xlOiAndGFicGFuZWwnLFxuXHRcdFx0XHRcdCdhcmlhLWxhYmVsbGVkYnknOiB0YWJJZCxcblx0XHRcdFx0XHQnZGF0YS1keW5hbWljJzogJ3RydWUnLFxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHQvLyBBZGQgdGFiIHBhbmUgdG8gY29udGFpbmVyXG5cdFx0XHRcdCQoYCMke21haW5Db250YWluZXJJZH0gPiAjdGFiUGFuZWxzYCkuYXBwZW5kKHRhYlBhbmUpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBCVUlMRCBJTlRFUkZBQ0UgOjogVEFCIFBBTkVTJyBGT1JNXG5cblx0XHRcdC8vIENoZWNrIGlmIGEgZm9ybSBhbHJlYWR5IGV4aXN0cyBpbnNpZGUgdGhlIHRhYiBwYW5lOiBpZiBub3QsIGNyZWF0ZSBpdFxuXHRcdFx0bGV0IGZvcm0gPSB0YWJQYW5lLmZpbmQoJ2Zvcm0nKTtcblxuXHRcdFx0aWYgKGZvcm0ubGVuZ3RoID09IDApXG5cdFx0XHR7XG5cdFx0XHRcdC8vIENyZWF0ZSBmb3JtXG5cdFx0XHRcdGZvcm0gPSAkKCc8Zm9ybT4nLCB7XG5cdFx0XHRcdFx0Y2xhc3M6ICcnLFxuXHRcdFx0XHRcdGF1dG9jb21wbGV0ZTogJ29mZidcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0Ly8gQ3JlYXRlIGFuIGlubmVyIGZpZWxkc2V0OyB0aGlzIG1pZ2h0IGJlIHVzZWZ1bCB0byBlYXNpbHkgZGlzYWJsZSB0aGUgd2hvbGUgZm9ybSBhdCBvbmNlIChhY3R1YWxseSB3ZSBkb24ndCB1c2UgaXQgYmVjYXVzZSBLZW5kbyB3aWRnZXRzIGFyZSBub3QgZGlzYWJsZWQgYXV0b21hdGljYWxseSlcblx0XHRcdFx0Zm9ybS5hcHBlbmQoXG5cdFx0XHRcdFx0JCgnPGZpZWxkc2V0PicsIHtcblx0XHRcdFx0XHRcdGNsYXNzOiAnJ1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0Ly8gQWRkIGZvcm0gdG8gdGFiIHBhbmVcblx0XHRcdFx0dGFiUGFuZS5wcmVwZW5kKGZvcm0pO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBHZXQgZmllbGRzZXQsIHdoaWNoIGlzIHRoZSBhY3R1YWwgZm9ybSBpdGVtcyBjb250YWluZXJcblx0XHRcdGxldCBmaWVsZHNldCA9IGZvcm0uZmluZCgnZmllbGRzZXQnKTtcblxuXHRcdFx0Ly8gQlVJTEQgSU5URVJGQUNFIDo6IFRBQiBQQU5FUycgRk9STSBJVEVNU1xuXG5cdFx0XHQvLyBDaGVjayBpZiBmb3JtIGl0ZW0gYWxyZWFkeSBleGlzdHMgaW4gZmllbGRzZXQ7IGlmIHllcywganVzdCB1cGRhdGUgaXRzIGRhdGFcblx0XHRcdGxldCBmb3JtSXRlbSA9IGZpZWxkc2V0LmZpbmQoYCNmb3JtLWl0ZW0tJHskLmVzY2FwZVNlbGVjdG9yKGNvbmZpZ1BhcmFtLm5hbWUpfWApO1xuXG5cdFx0XHRpZiAoZm9ybUl0ZW0ubGVuZ3RoID09IDApXG5cdFx0XHR7XG5cdFx0XHRcdGhhc05ld0Zvcm1JdGVtID0gdHJ1ZTtcblxuXHRcdFx0XHRmb3JtSXRlbSA9IENvbmZpZ0Zvcm1JdGVtRmFjdG9yeS5jcmVhdGUoY29uZmlnUGFyYW0sICFkaXNhYmxlRWRpdCk7XG5cblx0XHRcdFx0Ly8gQWRkIHNlcGFyYXRvciBiZWZvcmVcblx0XHRcdFx0aWYgKGNvbmZpZ1BhcmFtLnNlcGFyYXRvciAhPSBudWxsICYmIGNvbmZpZ1BhcmFtLnNlcGFyYXRvci5wb3MgPT0gJ2JlZm9yZScpXG5cdFx0XHRcdFx0ZmllbGRzZXQuYXBwZW5kKHRoaXMuX2J1aWxkU2VwYXJhdG9yKGNvbmZpZ1BhcmFtLnNlcGFyYXRvcikpO1xuXG5cdFx0XHRcdC8vIEFkZCBmb3JtIGl0ZW0gdG8gZm9ybVxuXHRcdFx0XHRmaWVsZHNldC5hcHBlbmQoZm9ybUl0ZW0pO1xuXG5cdFx0XHRcdC8vIEFkZCBzZXBhcmF0b3IgYWZ0ZXJcblx0XHRcdFx0aWYgKGNvbmZpZ1BhcmFtLnNlcGFyYXRvciAhPSBudWxsICYmIGNvbmZpZ1BhcmFtLnNlcGFyYXRvci5wb3MgPT0gJ2FmdGVyJylcblx0XHRcdFx0XHRmaWVsZHNldC5hcHBlbmQodGhpcy5fYnVpbGRTZXBhcmF0b3IoY29uZmlnUGFyYW0uc2VwYXJhdG9yKSk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlXG5cdFx0XHRcdGZvcm1JdGVtWzBdLmRhdGEgPSBjb25maWdQYXJhbTtcblx0XHR9XG5cblx0XHQvLyBBZGQgbGlzdGVuZXIgdG8gc2hvdyBoZWxwIHRvb2x0aXBzXG5cdFx0bGV0IGFsbFRhYlBhbmVzID0gJChgIyR7bWFpbkNvbnRhaW5lcklkfSA+ICN0YWJQYW5lbHMgPiBkaXYudGFiLXBhbmVgKTtcblx0XHRhbGxUYWJQYW5lcy5rZW5kb1Rvb2x0aXAoe1xuXHRcdFx0ZmlsdGVyOiAnaVt0aXRsZV0uaGVscCcsXG5cdFx0XHRwb3NpdGlvbjogJ3JpZ2h0Jyxcblx0XHRcdHdpZHRoOiAnMjUwcHgnLFxuXHRcdFx0Y29udGVudDogZnVuY3Rpb24oZSkge1xuXHRcdFx0XHRyZXR1cm4gYDxkaXYgY2xhc3M9XCJoZWxwLXRvb2x0aXBcIj4ke2UudGFyZ2V0LmRhdGEoJ3RpdGxlJyl9PC9kaXY+YDtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdC8vIEluaXRpYWxpemUga2VuZG8gdmFsaWRhdGlvbiBvbiBmb3JtcycgbWFpbiBjb250YWluZXJcblx0XHR0aGlzLl92YWxpZGF0b3IgPSAkKGAjJHttYWluQ29udGFpbmVySWR9YCkua2VuZG9WYWxpZGF0b3Ioe1xuXHRcdFx0dmFsaWRhdGVPbkJsdXI6IHRydWUsXG5cdFx0XHRydWxlczoge1xuXHRcdFx0XHQvLyBBZGQgcnVsZSB0byB2YWxpZGF0ZSBBT0kgZm9ybSBpdGVtc1xuXHRcdFx0XHQvLyAoc2VlOiBodHRwczovL2RlbW9zLnRlbGVyaWsuY29tL2tlbmRvLXVpL3ZhbGlkYXRvci9jdXN0b20tdmFsaWRhdGlvbilcblx0XHRcdFx0YW9pOiBmdW5jdGlvbiAoaW5wdXQpIHtcblx0XHRcdFx0XHRpZiAoaW5wdXQuaXMoJ1tkYXRhLWFvaS1tc2ddJykgJiYgaW5wdXQudmFsKCkgIT0gJycpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0aWYgKGlucHV0LnZhbCgpID09ICcwLDAsMCcpXG5cdFx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cblx0XHRcdH1cblx0XHR9KS5kYXRhKCdrZW5kb1ZhbGlkYXRvcicpO1xuXHR9XG5cblx0ZGVzdHJveUludGVyZmFjZSgpXG5cdHtcblx0XHQvLyBEZXN0cm95IGFsbCBLZW5kbyB3aWRnZXRzIGluIGZvcm1zXG5cdFx0a2VuZG8uZGVzdHJveSgkKGAjJHt0aGlzLl9tYWluQ29udGFpbmVySWR9ID4gI3RhYlBhbmVscyA+IGRpdi50YWItcGFuZSA+IGZvcm1gKSk7XG5cblx0XHQvLyBSZW1vdmUgYWxsIHRhYnNcblx0XHQkKGAjJHt0aGlzLl9tYWluQ29udGFpbmVySWR9ID4gI3RhYnNgKS5lbXB0eSgpO1xuXG5cdFx0Ly8gUmVtb3ZlIGR5bmFtaWMgdGFiIHBhbmVzICh0YWIgcGFuZXMgY3JlYXRlZCBieSBJbnRlcmZhY2UgQnVpbGRlcilcblx0XHQkKGAjJHt0aGlzLl9tYWluQ29udGFpbmVySWR9ID4gI3RhYlBhbmVscyA+IGRpdi50YWItcGFuZVtkYXRhLWR5bmFtaWM9XCJ0cnVlXCJdYCkucmVtb3ZlKCk7XG5cblx0XHQvLyBSZW1vdmUgZm9ybSBpbnNpZGUgc3RhdGljIHRhYiBwYW5lcyAocHJlZGVmaW5lZCB0YWIgcGFuZXMgaW4gaHRtbClcblx0XHQkKGAjJHt0aGlzLl9tYWluQ29udGFpbmVySWR9ID4gI3RhYlBhbmVscyA+IGRpdi50YWItcGFuZSA+IGZvcm1gKS5yZW1vdmUoKTtcblxuXHRcdC8vIFJlbW92ZSBcImFjdGl2ZVwiIGNsYXNzIGZyb20gc3RhdGljIHRhYiBwYW5lcyAob3RoZXJ3aXNlIHRoaXMgY2xhc3MgbWVzc2VzIHdpdGggdGhlIHRhYiBuYXZpZ2F0b3IgZnVuY3Rpb25pbmcpXG5cdFx0JChgIyR7dGhpcy5fbWFpbkNvbnRhaW5lcklkfSA+ICN0YWJQYW5lbHMgPiBkaXYudGFiLXBhbmVgKS5yZW1vdmVDbGFzcygnYWN0aXZlJyk7XG5cdH1cblxuXHRkaXNhYmxlSW50ZXJmYWNlKGRpc2FibGUpXG5cdHtcblx0XHQvLyBFbmFibGUvZGlzYWJsZSBhbGwgY29uZmlnIGZvcm0gaXRlbXNcblx0XHQkKGAjJHt0aGlzLl9tYWluQ29udGFpbmVySWR9ICpbaWRePSdmb3JtLWl0ZW0tJ11gKS5wcm9wKCdlZGl0RW5hYmxlZCcsICFkaXNhYmxlKTtcblx0fVxuXG5cdF9idWlsZFNlcGFyYXRvcihzZXBhcmF0b3IpXG5cdHtcblx0XHRpZiAoc2VwYXJhdG9yLnRleHQgPT0gbnVsbClcblx0XHRcdHJldHVybiAkKGA8aHIgY2xhc3M9XCJjb25maWctZm9ybS1zZXBhcmF0b3JcIj5gKTtcblxuXHRcdGVsc2Vcblx0XHRcdHJldHVybiAkKGA8bGFiZWwgY2xhc3M9XCJjb25maWctZm9ybS1zZXBhcmF0b3ItbGFiZWwgbWItM1wiPiR7c2VwYXJhdG9yLnRleHR9PC9sYWJlbD5gKTtcblx0fVxuXG5cdGdldENoYW5nZWREYXRhKClcblx0e1xuXHRcdGxldCBjaGFuZ2VzID0gbmV3IFNGUzJYLlNGU0FycmF5KCk7XG5cblx0XHRmb3IgKHZhciBjcCBvZiB0aGlzLl9jb25maWdQYXJhbXMpXG5cdFx0e1xuXHRcdFx0aWYgKGNwLmlzTW9kaWZpZWQpXG5cdFx0XHRcdGNoYW5nZXMuYWRkU0ZTT2JqZWN0KGNwLnRvU2ZzT2JqZWN0KCkpO1xuXHRcdH1cblxuXHRcdHJldHVybiBjaGFuZ2VzO1xuXHR9XG5cblx0cmVzZXRJc01vZGlmaWVkKClcblx0e1xuXHRcdGZvciAobGV0IGNwIG9mIHRoaXMuX2NvbmZpZ1BhcmFtcylcblx0XHR7XG5cdFx0XHRpZiAoY3AuaXNNb2RpZmllZClcblx0XHRcdFx0Y3AucmVzZXRJc01vZGlmaWVkKCk7XG5cdFx0fVxuXHR9XG5cblx0Y2hlY2tJc1ZhbGlkKClcblx0e1xuXHRcdHJldHVybiB0aGlzLl92YWxpZGF0b3IudmFsaWRhdGUoKTtcblx0fVxuXG5cdHJlc2V0VmFsaWRhdGlvbigpXG5cdHtcblx0XHR0aGlzLl92YWxpZGF0b3IuaGlkZU1lc3NhZ2VzKCk7XG5cblx0XHQvLyBUaGUgbWV0aG9kIGFib3ZlIGRvZXNuJ3QgcmVtb3ZlIHRoZSBrLWludmFsaWQgY2xhc3NlcyBhbmQgYXJpYS1pbnZhbGlkPVwidHJ1ZVwiIGF0dHJpYnV0ZXMgZnJvbSBpbnB1dHNcblx0XHQvLyBMZXQncyBkbyBpdCBtYW51YWxseVxuXHRcdCQoYCMke3RoaXMuX21haW5Db250YWluZXJJZH0gLmstaW52YWxpZGApLnJlbW92ZUNsYXNzKCdrLWludmFsaWQnKTtcblx0XHQkKGAjJHt0aGlzLl9tYWluQ29udGFpbmVySWR9IFthcmlhLWludmFsaWQ9XCJ0cnVlXCJdYCkucmVtb3ZlQXR0cignYXJpYS1pbnZhbGlkJyk7XG5cdH1cblxuXHRnZXRDb25maWdGb3JtSXRlbShjb25maWdQYXJhbU5hbWUpXG5cdHtcblx0XHRsZXQgZm9ybUl0ZW0gPSAkKGAjJHt0aGlzLl9tYWluQ29udGFpbmVySWR9YCkuZmluZChgI2Zvcm0taXRlbS0keyQuZXNjYXBlU2VsZWN0b3IoY29uZmlnUGFyYW1OYW1lKX1gKTtcblxuXHRcdGlmIChmb3JtSXRlbS5sZW5ndGggPiAwKVxuXHRcdFx0cmV0dXJuIGZvcm1JdGVtWzBdO1xuXHRcdGVsc2Vcblx0XHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0YWN0aXZhdGVGaXJzdFRhYlBhbmVsKClcblx0e1xuXHRcdGxldCBjb25maWdQYXJhbSA9IHRoaXMuX2NvbmZpZ1BhcmFtc1swXTtcblx0XHRjb25zdCB0YWJQYW5lSWQgPSB0aGlzLlRBQl9QQU5FX1BSRUZJWCArIGNvbmZpZ1BhcmFtLmNhdGVnb3J5SWQ7XG5cdFx0bGV0IHRhYlBhbmUgPSAkKGAjJHt0aGlzLl9tYWluQ29udGFpbmVySWR9ID4gI3RhYlBhbmVscyA+ICMke3RhYlBhbmVJZH1gKTtcblx0XHR0YWJQYW5lLmFkZENsYXNzKCdzaG93IGFjdGl2ZScpO1xuXHR9XG59XG4iLCJleHBvcnQgY2xhc3MgQ29uZmlndXJhdGlvblBhcmFtZXRlclxue1xuXHRzdGF0aWMgZnJvbVNmc09iamVjdChlbGVtZW50KVxuXHR7XG5cdFx0bGV0IGNwID0gbmV3IENvbmZpZ3VyYXRpb25QYXJhbWV0ZXIoKTtcblxuXHRcdC8vIFBhcnNlIGNvbW1vbiBkYXRhXG5cdFx0Y3AubmFtZSA9IGVsZW1lbnQuZ2V0VXRmU3RyaW5nKCduYW1lJyk7XG5cdFx0Y3AubGFiZWwgPSBlbGVtZW50LmdldFV0ZlN0cmluZygnbGFiZWwnKTtcblx0XHRjcC5jYXRlZ29yeSA9IGVsZW1lbnQuZ2V0VXRmU3RyaW5nKCdjYXRlZ29yeScpO1xuXHRcdGNwLnRvb2x0aXAgPSBlbGVtZW50LmdldFV0ZlN0cmluZygndG9vbHRpcCcpO1xuXHRcdGNwLnR5cGUgPSBlbGVtZW50LmdldFV0ZlN0cmluZygndHlwZScpO1xuXHRcdGNwLnZhbHVlID0gZWxlbWVudC5nZXQoJ3ZhbHVlJyk7XG5cdFx0Y3AudmFsaWRhdG9yID0gZWxlbWVudC5nZXRVdGZTdHJpbmcoJ3ZhbGlkYXRvcicpO1xuXHRcdGNwLmVkaXRhYmxlID0gKGVsZW1lbnQuY29udGFpbnNLZXkoJ2VkaXQnKSA/IGVsZW1lbnQuZ2V0Qm9vbCgnZWRpdCcpIDogdHJ1ZSk7XG5cdFx0Y3AudHJpZ2dlciA9IChlbGVtZW50LmNvbnRhaW5zS2V5KCd0cmlnZ2VyJykgPyBlbGVtZW50LmdldEJvb2woJ3RyaWdnZXInKSA6IGZhbHNlKTtcblx0XHRjcC50cmlnZ2VyRGF0YSA9IGVsZW1lbnQuZ2V0U0ZTQXJyYXkoJ3RyaWdnZXJEYXRhJyk7XG5cdFx0Y3AuY2xpZW50T25seSA9IChlbGVtZW50LmNvbnRhaW5zS2V5KCdjbGllbnRPbmx5JykgPyBlbGVtZW50LmdldEJvb2woJ2NsaWVudE9ubHknKSA6IGZhbHNlKTtcblx0XHRjcC5kYXRhUHJvdmlkZXIgPSBlbGVtZW50LmdldFV0ZlN0cmluZygnZGF0YVByb3ZpZGVyJyk7XG5cblx0XHQvLyBQYXJzZSBjb21wb25lbnQgc3BlY2lmaWMgYXR0cmlidXRlc1xuXHRcdGxldCB0bXBBdHRyaWJ1dGVzID0gZWxlbWVudC5nZXRTRlNPYmplY3QoJ2F0dHJpYnV0ZXMnKTtcblx0XHRpZiAodG1wQXR0cmlidXRlcyAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGxldCBhdHRyaWJ1dGVzID0ge307XG5cblx0XHRcdGxldCBrZXlzID0gdG1wQXR0cmlidXRlcy5nZXRLZXlzQXJyYXkoKTtcblx0XHRcdGZvciAobGV0IGtleSBvZiBrZXlzKVxuXHRcdFx0XHRhdHRyaWJ1dGVzW2tleV0gPSB0bXBBdHRyaWJ1dGVzLmdldChrZXkpO1xuXG5cdFx0XHRjcC5hdHRyaWJ1dGVzID0gYXR0cmlidXRlcztcblx0XHR9XG5cblx0XHQvLyBQYXJzZSBzZXBhcmF0b3Igc2V0dGluZ3Ncblx0XHRsZXQgdG1wU2VwYXJhdG9yID0gZWxlbWVudC5nZXRTRlNPYmplY3QoJ3NlcGFyYXRvcicpO1xuXHRcdGlmICh0bXBTZXBhcmF0b3IgIT0gbnVsbClcblx0XHR7XG5cdFx0XHRsZXQgc2VwYXJhdG9yID0ge307XG5cblx0XHRcdGxldCBrZXlzMSA9IHRtcFNlcGFyYXRvci5nZXRLZXlzQXJyYXkoKTtcblx0XHRcdGZvciAobGV0IGtleTEgb2Yga2V5czEpXG5cdFx0XHRcdHNlcGFyYXRvcltrZXkxXSA9IHRtcFNlcGFyYXRvci5nZXQoa2V5MSk7XG5cblx0XHRcdGNwLnNlcGFyYXRvciA9IHNlcGFyYXRvcjtcblx0XHR9XG5cblx0XHQvLyBQYXJzZSBkZWZhdWx0IGxpc3QgaXRlbVxuXHRcdGxldCB0bXBEZWZhdWx0TGlzdEl0ZW0gPSBlbGVtZW50LmdldFNGU0FycmF5KCdkZWZhdWx0TGlzdEl0ZW0nKTtcblx0XHRpZiAodG1wRGVmYXVsdExpc3RJdGVtICE9IG51bGwgJiYgdG1wRGVmYXVsdExpc3RJdGVtLnNpemUoKSA+IDApXG5cdFx0e1xuXHRcdFx0bGV0IGRlZmF1bHRMaXN0SXRlbSA9IFtdO1xuXG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHRtcERlZmF1bHRMaXN0SXRlbS5zaXplKCk7IGkrKylcblx0XHRcdFx0ZGVmYXVsdExpc3RJdGVtLnB1c2goQ29uZmlndXJhdGlvblBhcmFtZXRlci5mcm9tU2ZzT2JqZWN0KHRtcERlZmF1bHRMaXN0SXRlbS5nZXRTRlNPYmplY3QoaSkpKTtcblxuXHRcdFx0Y3AuZGVmYXVsdExpc3RJdGVtID0gZGVmYXVsdExpc3RJdGVtO1xuXG5cdFx0XHQvLyBQYXJzZSBsaXN0IHZhbHVlc1xuXHRcdFx0bGV0IGxpc3RWYWx1ZXMgPSBbXTtcblxuXHRcdFx0bGV0IHRtcExpc3RWYWx1ZXMgPSBlbGVtZW50LmdldFNGU0FycmF5KCdsaXN0VmFsdWVzJyk7XG5cdFx0XHRpZiAodG1wTGlzdFZhbHVlcyAhPSBudWxsICYmIHRtcExpc3RWYWx1ZXMuc2l6ZSgpID4gMClcblx0XHRcdHtcblx0XHRcdFx0Zm9yIChsZXQgdiA9IDA7IHYgPCB0bXBMaXN0VmFsdWVzLnNpemUoKTsgdisrKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IGxpc3RWYWx1ZU9iaiA9IHRtcExpc3RWYWx1ZXMuZ2V0U0ZTT2JqZWN0KHYpO1xuXHRcdFx0XHRcdGxldCBvYmogPSB7fTtcblxuXHRcdFx0XHRcdGxldCBrZXlzMiA9IGxpc3RWYWx1ZU9iai5nZXRLZXlzQXJyYXkoKTtcblx0XHRcdFx0XHRmb3IgKGxldCBrZXkyIG9mIGtleXMyKVxuXHRcdFx0XHRcdFx0b2JqW2tleTJdID0gbGlzdFZhbHVlT2JqLmdldChrZXkyKTtcblxuXHRcdFx0XHRcdGxpc3RWYWx1ZXMucHVzaChvYmopO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGNwLmxpc3RWYWx1ZXMgPSBsaXN0VmFsdWVzO1xuXG5cdFx0XHQvLyBJZiB3ZSBoYXZlIGEgbGlzdCwgb24gdGhlIHNlcnZlci1zaWRlIGl0ZW1zIGNvdWxkIGJlIHJlcHJlc2VudGVkIGJ5IGEgY2xhc3Ncblx0XHRcdGNwLmNsYXp6ID0gZWxlbWVudC5nZXRVdGZTdHJpbmcoJ2NsYXp6Jyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNwO1xuXHR9XG5cblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdFx0LyogQ09OU1RBTlRTICovXG5cdFx0dGhpcy5ERUZBVUxUX0NBVEVHT1JZX05BTUUgPSAnR2VuZXJhbCc7XG5cdFx0dGhpcy5ERUZBVUxUX0NBVEVHT1JZX0lEID0gJ2dlbmVyYWwnO1xuXG5cdFx0LyogUFVCTElDIFZBUlMgKi9cblxuXHRcdHRoaXMubmFtZSA9ICcnO1xuXHRcdHRoaXMubGFiZWwgPSAnJztcblx0XHR0aGlzLnRvb2x0aXAgPSAnJztcblx0XHR0aGlzLnR5cGUgPSBudWxsO1xuXHRcdHRoaXMudHJpZ2dlciA9IGZhbHNlO1xuXHRcdHRoaXMudHJpZ2dlckRhdGEgPSBudWxsO1xuXHRcdHRoaXMuY2xpZW50T25seSA9IGZhbHNlO1xuXHRcdHRoaXMuZWRpdGFibGUgPSB0cnVlO1xuXHRcdHRoaXMuYXR0cmlidXRlcyA9IG51bGw7XG5cdFx0dGhpcy5kYXRhUHJvdmlkZXIgPSBudWxsO1xuXG5cdFx0dGhpcy5zZXBhcmF0b3IgPSBudWxsO1x0XHRcdC8vIFBhcmFtZXRlciB1c2VkIHRvIGNyZWF0ZSBhIHNlcGFyYXRvciBiZWZvcmUgb3IgYWZ0ZXIgdGhlIGNvbmZpZyBwYXJhbWV0ZXJcblx0XHR0aGlzLmRlZmF1bHRMaXN0SXRlbSA9IG51bGw7XHRcdC8vIExpc3Qgb2Ygc3ViLUNvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzLCBlYWNoIGNvbnRhaW5pbmcgdGhlIGRlZmF1bHQgdmFsdWVzXG5cdFx0dGhpcy5jbGF6eiA9IG51bGw7XHRcdFx0XHQvLyBOYW1lIG9mIHRoZSBjbGFzcyByZXByZXNlbnRpbmcgdGhlIGxpc3QgaXRlbSAobm90IHVzZWQgaW4gY2FzZSBvZiBwcmltaXRldmUgZGF0YSB0eXBlcylcblxuXHRcdC8qIFBSSVZBVEUgVkFSUyAqL1xuXG5cdFx0dGhpcy5fY2F0ZWdvcnkgPSB0aGlzLkRFRkFVTFRfQ0FURUdPUllfTkFNRTtcblx0XHR0aGlzLl9jYXRlZ29yeUlkID0gdGhpcy5ERUZBVUxUX0NBVEVHT1JZX0lEO1xuXHRcdHRoaXMuX3ZhbHVlID0gbnVsbDtcblx0XHR0aGlzLl9pbml0aWFsVmFsdWUgPSBudWxsO1x0XHQvLyBTYXZlIHRoZSBpbml0aWFsIHZhbHVlIG9mIHRoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlciwgdG8gY2hlY2sgaWYgdGhlIHZhbHVlIHdhcyBtb2RpZmllZFxuXHRcdHRoaXMuX3ZhbGlkYXRvciA9IG51bGw7XG5cblx0XHR0aGlzLl9saXN0SXRlbXMgPSBbXTtcdFx0XHQvLyBBcnJheSBvZiBhcnJheXMgb2YgQ29uZmlndXJhdGlvblBhcmFtZXRlcnNcblx0XHR0aGlzLl9saXN0SXRlbXNDaGFuZ2VkID0gZmFsc2U7XHQvLyBGbGFnIHRvIGJlIHNldCBpbiBjYXNlIGEgbGlzdCBpdGVtIGlzIGFkZGVkIG9yIHJlbW92ZWRcblx0fVxuXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdC8vIEdFVFRFUlMgLyBTRVRURVJTXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0c2V0IGNhdGVnb3J5KHZhbClcblx0e1xuXHRcdGlmICh2YWwpXG5cdFx0e1xuXHRcdFx0dGhpcy5fY2F0ZWdvcnkgPSB2YWw7XG5cdFx0XHR0aGlzLl9zZXRJZEZyb21DYXRlZ29yeU5hbWUodGhpcy5fY2F0ZWdvcnkpO1xuXHRcdH1cblx0fVxuXG5cdGdldCBjYXRlZ29yeSgpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fY2F0ZWdvcnk7XG5cdH1cblxuXHRzZXQgdmFsdWUodmFsKVxuXHR7XG5cdFx0aWYgKHRoaXMuX3ZhbHVlICE9IHZhbClcblx0XHR7XG5cdFx0XHQvLyBJZiB2YWx1ZSBpcyBudWxsLCB0aGVuIHdlIGFyZSBzZXR0aW5nIHRoaXMgZm9yIHRoZSBmaXJzdCB0aW1lIGFuZFxuXHRcdFx0Ly8gd2Ugd2FudCB0byBzYXZlIHRoZSBpbml0aWFsIHZhbHVlLCB0byBjaGVjayBsYXRlciBpZiBpdCBoYXMgYmVlbiBtb2RpZmllZFxuXHRcdFx0aWYgKHRoaXMuX3ZhbHVlID09IG51bGwpXG5cdFx0XHRcdHRoaXMuX2luaXRpYWxWYWx1ZSA9IHZhbDtcblxuXHRcdFx0dGhpcy5fdmFsdWUgPSB2YWw7XG5cdFx0fVxuXHR9XG5cblx0Z2V0IHZhbHVlKClcblx0e1xuXHRcdHJldHVybiB0aGlzLl92YWx1ZTtcblx0fVxuXG5cdHNldCB2YWxpZGF0b3IodmFsKVxuXHR7XG5cdFx0aWYgKHZhbClcblx0XHRcdHRoaXMuX3ZhbGlkYXRvciA9IHZhbDtcblx0fVxuXG5cdGdldCB2YWxpZGF0b3IoKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3ZhbGlkYXRvcjtcblx0fVxuXG5cdC8qKlxuXHQgKiBBbiBhcnJheSBvZiBvYmplY3RzOyBlYWNoIG9iamVjdCBjb250YWlucyB0aGUgbmFtZS12YWx1ZSBwYWlycyB1c2VkIHRvXG5cdCAqIHBvcHVsYXRlIHRoZSBsaXN0IG9mIHN1Yi1jb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgYXJyYXlzLCBiYXNlZCBvbiBkZWZhdWx0TGlzdEl0ZW0uXG5cdCAqL1xuXHRzZXQgbGlzdFZhbHVlcyhhcnIpXG5cdHtcblx0XHR0aGlzLl9zZXRTdWJDb25maWd1cmF0aW9uUGFyYW1zKGFycik7XG5cdH1cblxuXHRnZXQgbGlzdFZhbHVlcygpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fZ2V0U3ViQ29uZmlndXJhdGlvblBhcmFtc1ZhbHVlcygpO1xuXHR9XG5cblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0Ly8gR0VUVEVSUyBPTkxZXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0Z2V0IGlzTW9kaWZpZWQoKVxuXHR7XG5cdFx0bGV0IF9pc01vZGlmaWVkID0gZmFsc2U7XG5cblx0XHQvLyBJZiB0aGUgcGFyYW1ldGVyIGlzIHVzZWQgb24gdGhlIGNsaWVudCBvbmx5IChmb3IgZXhhbXBsZSBpbiBhIGN1c3RvbSB0cmlnZ2VyKVxuXHRcdC8vIHRoZW4gd2UgbmV2ZXIgaGF2ZSB0byBjb25zaWRlciBpdCBhcyBtb2RpZmllZCwgdG8gcHJldmVudCBpdCBiZWluZyBzZW50IHRvIHRoZSBzZXJ2ZXJcblx0XHRpZiAoIXRoaXMuY2xpZW50T25seSlcblx0XHR7XG5cdFx0XHRpZiAodGhpcy5fdmFsdWUgIT0gdGhpcy5faW5pdGlhbFZhbHVlIHx8IHRoaXMuX2xpc3RJdGVtc0NoYW5nZWQpXG5cdFx0XHRcdF9pc01vZGlmaWVkID0gdHJ1ZTtcblx0XHRcdGVsc2Vcblx0XHRcdHtcblx0XHRcdFx0Ly8gQ2hlY2sgc3ViIHBhcmFtZXRlcnNcblx0XHRcdFx0b3V0ZXJMb29wOiBmb3IgKGxldCBsaXN0SXRlbSBvZiB0aGlzLl9saXN0SXRlbXMpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRmb3IgKGxldCBzdWJDUCBvZiBsaXN0SXRlbSlcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRpZiAoc3ViQ1AuaXNNb2RpZmllZClcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0X2lzTW9kaWZpZWQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRicmVhayBvdXRlckxvb3A7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIF9pc01vZGlmaWVkO1xuXHR9XG5cblx0Z2V0IGNhdGVnb3J5SWQoKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2NhdGVnb3J5SWQ7XG5cdH1cblxuXHRnZXQgbGlzdEl0ZW1zKClcblx0e1xuXHRcdHJldHVybiB0aGlzLl9saXN0SXRlbXM7XG5cdH1cblxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQvLyBQVUJMSUMgTUVUSE9EU1xuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdC8qKlxuXHQgKiBSZXR1cm4gYSBjbG9uZSBvZiB0aGlzIENvbmZpZ3VyYXRpb25QYXJhbWV0ZXIuXG5cdCAqL1xuXHRjbG9uZShjbG9uZVZhbHVlID0gZmFsc2UpXG5cdHtcblx0XHRsZXQgY3AgPSBuZXcgQ29uZmlndXJhdGlvblBhcmFtZXRlcigpO1xuXHRcdGNwLm5hbWUgPSB0aGlzLm5hbWU7XG5cdFx0Y3AubGFiZWwgPSB0aGlzLmxhYmVsO1xuXHRcdGNwLmNhdGVnb3J5ID0gdGhpcy5jYXRlZ29yeTtcblx0XHRjcC50b29sdGlwID0gdGhpcy50b29sdGlwO1xuXHRcdGNwLnR5cGUgPSB0aGlzLnR5cGU7XG5cdFx0Y3AudmFsaWRhdG9yID0gdGhpcy52YWxpZGF0b3I7XG5cdFx0Y3AudHJpZ2dlciA9IHRoaXMudHJpZ2dlcjtcblx0XHRjcC50cmlnZ2VyRGF0YSA9ICh0aGlzLnRyaWdnZXJEYXRhICE9IG51bGwgPyBTRlMyWC5TRlNBcnJheS5uZXdGcm9tQmluYXJ5RGF0YSh0aGlzLnRyaWdnZXJEYXRhLnRvQmluYXJ5KCkpIDogbnVsbCk7XG5cdFx0Y3AuY2xpZW50T25seSA9IHRoaXMuY2xpZW50T25seTtcblx0XHRjcC5kYXRhUHJvdmlkZXIgPSB0aGlzLmRhdGFQcm92aWRlcjtcblxuXHRcdGlmIChjbG9uZVZhbHVlKVxuXHRcdFx0Y3AudmFsdWUgPSB0aGlzLnZhbHVlO1xuXG5cdFx0aWYgKHRoaXMuYXR0cmlidXRlcyAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGNwLmF0dHJpYnV0ZXMgPSBuZXcgT2JqZWN0KCk7XG5cdFx0XHRmb3IgKGxldCBzMSBpbiB0aGlzLmF0dHJpYnV0ZXMpXG5cdFx0XHRcdGNwLmF0dHJpYnV0ZXNbczFdID0gdGhpcy5hdHRyaWJ1dGVzW3MxXTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5zZXBhcmF0b3IgIT0gbnVsbClcblx0XHR7XG5cdFx0XHRjcC5zZXBhcmF0b3IgPSBuZXcgT2JqZWN0KClcblx0XHRcdGZvciAobGV0IHMyIGluIHRoaXMuc2VwYXJhdG9yKVxuXHRcdFx0XHRjcC5zZXBhcmF0b3JbczJdID0gdGhpcy5zZXBhcmF0b3JbczJdO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLmRlZmF1bHRMaXN0SXRlbSAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGxldCBjbG9uZWREZWZhdWx0TGlzdEl0ZW1zID0gW107XG5cblx0XHRcdGZvciAobGV0IHN1YkNQIG9mIHRoaXMuZGVmYXVsdExpc3RJdGVtKVxuXHRcdFx0XHRjbG9uZWREZWZhdWx0TGlzdEl0ZW1zLnB1c2goc3ViQ1AuY2xvbmUoY2xvbmVWYWx1ZSkpO1xuXG5cdFx0XHRjcC5kZWZhdWx0TGlzdEl0ZW0gPSBjbG9uZWREZWZhdWx0TGlzdEl0ZW1zO1xuXHRcdH1cblxuXHRcdGNwLmxpc3RWYWx1ZXMgPSB0aGlzLmxpc3RWYWx1ZXM7IC8vIE5vIG5lZWQgdG8gY2xvbmUgdGhpcywgYXMgdGhlIGxpc3RWYWx1ZXMgc2V0dGVyIGFscmVhZHkgZG9lcyBpdFxuXHRcdGNwLmNsYXp6ID0gdGhpcy5jbGF6ejtcblxuXHRcdHJldHVybiBjcDtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXNldCBpbml0aWFsIHZhbHVlIGJ5IGNvcHlpbmcgdGhlIGN1cnJlbnQgdmFsdWUuXG5cdCAqL1xuXHRyZXNldElzTW9kaWZpZWQoKVxuXHR7XG5cdFx0dGhpcy5faW5pdGlhbFZhbHVlID0gdGhpcy5fdmFsdWU7XG5cblx0XHQvLyBSZXNldCBzdWItcGFyYW1ldGVyc1xuXHRcdGlmICh0aGlzLl9saXN0SXRlbXMgIT0gbnVsbClcblx0XHR7XG5cdFx0XHRmb3IgKGxldCBsaXN0SXRlbSBvZiB0aGlzLl9saXN0SXRlbXMpXG5cdFx0XHR7XG5cdFx0XHRcdGZvciAobGV0IHN1YkNQIG9mIGxpc3RJdGVtKVxuXHRcdFx0XHRcdHN1YkNQLnJlc2V0SXNNb2RpZmllZCgpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRoaXMuX2xpc3RJdGVtc0NoYW5nZWQgPSBmYWxzZTtcblx0fVxuXG5cdGFkZExpc3RJdGVtKG5ld0xpc3RJdGVtKVxuXHR7XG5cdFx0dGhpcy5fbGlzdEl0ZW1zLnB1c2gobmV3TGlzdEl0ZW0pO1xuXHRcdHRoaXMuX2xpc3RJdGVtc0NoYW5nZWQgPSB0cnVlO1xuXHR9XG5cblx0dXBkYXRlTGlzdEl0ZW0obGlzdEl0ZW0sIGl0ZW1JbmRleClcblx0e1xuXHRcdHRoaXMuX2xpc3RJdGVtc1tpdGVtSW5kZXhdID0gbGlzdEl0ZW07XG5cdFx0dGhpcy5fbGlzdEl0ZW1zQ2hhbmdlZCA9IHRydWU7XG5cdH1cblxuXHRyZW1vdmVMaXN0SXRlbShpdGVtSW5kZXgpXG5cdHtcblx0XHR0aGlzLl9saXN0SXRlbXMuc3BsaWNlKGl0ZW1JbmRleCwgMSk7XG5cdFx0dGhpcy5fbGlzdEl0ZW1zQ2hhbmdlZCA9IHRydWU7XG5cdH1cblxuXHR0b1Nmc09iamVjdCgpXG5cdHtcblx0XHRsZXQgb2JqID0gbmV3IFNGUzJYLlNGU09iamVjdCgpO1xuXG5cdFx0Ly8gU2V0IGNoYW5nZWQgc2V0dGluZyBuYW1lXG5cdFx0b2JqLnB1dFV0ZlN0cmluZygnbmFtZScsIHRoaXMubmFtZSk7XG5cblx0XHQvLyBTZXQgY2hhbmdlZCBzZXR0aW5nIGNsYXNzLCBpZiBhbnlcblx0XHRpZiAodGhpcy5jbGF6eiAhPSBudWxsKVxuXHRcdFx0b2JqLnB1dFV0ZlN0cmluZygnY2xhenonLCB0aGlzLmNsYXp6KTtcblxuXHRcdGlmICh0aGlzLnZhbHVlICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0Ly8gU2V0IGNoYW5nZWQgc2V0dGluZyB2YWx1ZVxuXHRcdFx0aWYgKHR5cGVvZiB0aGlzLnZhbHVlID09PSAnYm9vbGVhbicpXG5cdFx0XHRcdG9iai5wdXRCb29sKCd2YWx1ZScsIHRoaXMudmFsdWUpO1xuXHRcdFx0ZWxzZSBpZiAodHlwZW9mIHRoaXMudmFsdWUgPT09ICdudW1iZXInKVxuXHRcdFx0XHRvYmoucHV0SW50KCd2YWx1ZScsIHRoaXMudmFsdWUpO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRvYmoucHV0VGV4dCgndmFsdWUnLCB0aGlzLnZhbHVlKTtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdC8vIFNldCBjaGFuZ2VkIHNldHRpbmcgbGlzdCBvZiB2YWx1ZXNcblxuXHRcdFx0bGV0IGxpc3RJdGVtcyA9IG5ldyBTRlMyWC5TRlNBcnJheSgpO1xuXG5cdFx0XHRmb3IgKGxldCBhIG9mIHRoaXMuX2xpc3RJdGVtcylcblx0XHRcdHtcblx0XHRcdFx0aWYgKGEubGVuZ3RoID09IDEpIC8vIFdlIGhhdmUganVzdCBvbmUgc3ViIGNvbmZpZyBwYXJhbTsgbm8gbmVlZCB0byBwYXJzZSBpdCBjb21wbGl0ZWx5XG5cdFx0XHRcdHtcblx0XHRcdFx0XHQvLyBTaW1wbGUgbGlzdFxuXHRcdFx0XHRcdGxldCB0ZW1wT2JqID0gYVswXS50b1Nmc09iamVjdCgpO1xuXHRcdFx0XHRcdGxldCB3YSA9IHRlbXBPYmouZ2V0V3JhcHBlZEl0ZW0oJ3ZhbHVlJyk7XG5cdFx0XHRcdFx0bGlzdEl0ZW1zLmFkZCh3YS52YWx1ZSwgd2EudHlwZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Ly8gQ29tcGxleCBsaXN0XG5cblx0XHRcdFx0XHRsZXQgdmFsdWVzID0gbmV3IFNGUzJYLlNGU0FycmF5KCk7XG5cblx0XHRcdFx0XHRmb3IgKGxldCBzdWJDcCBvZiBhKVxuXHRcdFx0XHRcdFx0dmFsdWVzLmFkZFNGU09iamVjdChzdWJDcC50b1Nmc09iamVjdCgpKTtcblxuXHRcdFx0XHRcdGxpc3RJdGVtcy5hZGRTRlNBcnJheSh2YWx1ZXMpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdG9iai5wdXRTRlNBcnJheSgndmFsdWUnLCBsaXN0SXRlbXMpO1xuXHRcdH1cblxuXHRcdHJldHVybiBvYmo7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJuIGEgZGVzY3JpcHRpb24gb2YgdGhlIENvbmZpZ3VyYXRpb25QYXJhbWV0ZXIgaW5zdGFuY2UuXG5cdCAqL1xuXHR0b1N0cmluZygpXG5cdHtcblx0XHRsZXQgcyA9IGBgO1xuXHRcdHMgKz0gYENvbmZpZ3VyYXRpb24gcGFyYW1ldGVyOiAke3RoaXMubmFtZX1cXG5gO1xuXHRcdHMgKz0gYFxcdHR5cGU6ICR7dGhpcy50eXBlfVxcbmA7XG5cdFx0cyArPSBgXFx0bGFiZWw6ICR7dGhpcy5sYWJlbH1cXG5gO1xuXHRcdHMgKz0gYFxcdGNhdGVnb3J5IG5hbWU6ICR7dGhpcy5jYXRlZ29yeX1cXG5gO1xuXHRcdHMgKz0gYFxcdGNhdGVnb3J5IGlkOiAke3RoaXMuY2F0ZWdvcnlJZH1cXG5gO1xuXHRcdHMgKz0gYFxcdHRvb2x0aXA6ICR7dGhpcy50b29sdGlwfVxcbmA7XG5cdFx0cyArPSBgXFx0dmFsdWU6ICR7dGhpcy52YWx1ZX1cXG5gO1xuXHRcdHMgKz0gYFxcdHRyaWdnZXI6ICR7dGhpcy50cmlnZ2VyfVxcbmA7XG5cdFx0cyArPSBgXFx0dHJpZ2dlciBkYXRhOiAke3RoaXMudHJpZ2dlckRhdGF9XFxuYDtcblx0XHRzICs9IGBcXHRjbGllbnQgb25seTogJHt0aGlzLmNsaWVudE9ubHl9XFxuYDtcblx0XHRzICs9IGBcXHR2YWxpZGF0b3I6ICR7dGhpcy52YWxpZGF0b3J9XFxuYDtcblx0XHRzICs9IGBcXHRpcyBtb2RpZmllZDogJHt0aGlzLmlzTW9kaWZpZWR9XFxuYDtcblxuXHRcdGlmICh0aGlzLmF0dHJpYnV0ZXMgIT0gbnVsbClcblx0XHR7XG5cdFx0XHRzICs9IGBcXHRjb21wb25lbnQgYXR0cmlidXRlczpcXG5gO1xuXG5cdFx0XHRmb3IgKGxldCBzMSBpbiB0aGlzLmF0dHJpYnV0ZXMpXG5cdFx0XHRcdHMgKz0gYFxcdFxcdCR7czF9IC0tPiAke3RoaXMuYXR0cmlidXRlc1tzMV19XFxuYDtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5kYXRhUHJvdmlkZXIgIT0gbnVsbClcblx0XHRcdHMgKz0gYFxcdGRhdGEgcHJvdmlkZXI6ICR7dGhpcy5kYXRhUHJvdmlkZXJ9XFxuYDtcblxuXHRcdGlmICh0aGlzLnNlcGFyYXRvciAhPSBudWxsKVxuXHRcdHtcblx0XHRcdHMgKz0gYFxcdHNlcGFyYXRvcjpcXG5gO1xuXG5cdFx0XHRmb3IgKGxldCBzMiBpbiB0aGlzLnNlcGFyYXRvcilcblx0XHRcdFx0cyArPSBgXFx0XFx0JHtzMn0gLS0+ICR7dGhpcy5zZXBhcmF0b3JbczJdfVxcbmA7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuX2xpc3RJdGVtcyAhPSBudWxsICYmIHRoaXMuX2xpc3RJdGVtcy5sZW5ndGggPiAwKVxuXHRcdHtcblx0XHRcdHMgKz0gYFxcdCMgbGlzdCBpdGVtczogJHt0aGlzLl9saXN0SXRlbXMubGVuZ3RofVxcbmA7XG5cblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fbGlzdEl0ZW1zLmxlbmd0aDsgaSsrKVxuXHRcdFx0e1xuXHRcdFx0XHRzICs9IGBcXHRsaXN0IGl0ZW0gJHtpfSBzdWItcGFyYW1ldGVyczpcXG5gO1xuXHRcdFx0XHRmb3IgKGxldCBlID0gMDsgZSA8IHRoaXMuX2xpc3RJdGVtc1tpXS5sZW5ndGg7IGUrKylcblx0XHRcdFx0XHRzICs9IGBcXHRcXHQke3RoaXMuX2xpc3RJdGVtc1tpXVtlXS50b0NvbXBhY3RTdHJpbmcoKX1cXG5gO1xuXHRcdFx0fVxuXG5cdFx0XHRzICs9IGBcXHRjbGFzcyBuYW1lOiAke3RoaXMuY2xhenp9XFxuYDtcblx0XHR9XG5cblx0XHRyZXR1cm4gcztcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm4gYSBjb21wYWN0IGRlc2NyaXB0aW9uIG9mIHRoZSBDb25maWd1cmF0aW9uUGFyYW1ldGVyIGluc3RhbmNlLlxuXHQgKi9cblx0dG9Db21wYWN0U3RyaW5nKClcblx0e1xuXHRcdHJldHVybiBgQ29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgJyR7dGhpcy5uYW1lfSc6ICR7dGhpcy52YWx1ZX0gJHt0aGlzLmlzTW9kaWZpZWQgPyAnW1hdJyA6ICdbIF0nfWA7XG5cdH1cblxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQvLyBQUklWQVRFIE1FVEhPRFNcblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHQvKipcblx0ICogUmV0cmlldmUgdGhlIGNhdGVnb3J5IGlkIGZvcm0gdGhlIGNhdGVnb3J5IG5hbWUuXG5cdCAqIFNwYWNlcyBhbmQgaW52YWxpZCBjaGFyYWN0ZXJzIGFyZSByZW1vdmVkOyB3b3JkcyBhcmUgc2VwYXJhdGVkIHVzaW5nIGNhcGl0YWxzLlxuXHQgKi9cblx0X3NldElkRnJvbUNhdGVnb3J5TmFtZShjYXRlZ29yeU5hbWUpXG5cdHtcblx0XHR0aGlzLl9jYXRlZ29yeUlkID0gY2F0ZWdvcnlOYW1lO1xuXG5cdFx0Ly8gU3RyaXAgaW52YWxpZCBjaGFyYWN0ZXJzXG5cdFx0dmFyIHBhdHRlcm4gPSAvW14wLTlhLXpBLVpdL2c7XG5cdFx0dGhpcy5fY2F0ZWdvcnlJZCA9IHRoaXMuX2NhdGVnb3J5SWQucmVwbGFjZShwYXR0ZXJuLCAnICcpO1xuXG5cdFx0Ly8gQ2FwaXRhbGl6ZSB3b3Jkc1xuXHRcdHZhciB3b3JkcyA9IHRoaXMuX2NhdGVnb3J5SWQuc3BsaXQoJyAnKTtcblx0XHR0aGlzLl9jYXRlZ29yeUlkID0gJyc7XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHdvcmRzLmxlbmd0aDsgaSsrKVxuXHRcdHtcblx0XHRcdGxldCB3b3JkID0gd29yZHNbaV07XG5cdFx0XHRpZiAod29yZC5sZW5ndGggPiAwKVxuXHRcdFx0XHR0aGlzLl9jYXRlZ29yeUlkICs9IChpID4gMCA/IHdvcmQuc3Vic3RyKDAsMSkudG9VcHBlckNhc2UoKSA6IHdvcmQuc3Vic3RyKDAsMSkudG9Mb3dlckNhc2UoKSkgKyAod29yZC5sZW5ndGggPiAxID8gd29yZC5zdWJzdHIoMSkgOiBcIlwiKTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5fY2F0ZWdvcnlJZC5sZW5ndGggPT0gMClcblx0XHRcdHRoaXMuX2NhdGVnb3J5SWQgPSB0aGlzLkRFRkFVTFRfQ0FURUdPUllfSUQ7XG5cdH1cblxuXHRfc2V0U3ViQ29uZmlndXJhdGlvblBhcmFtcyhfbGlzdFZhbHVlcylcblx0e1xuXHRcdHRoaXMuX2xpc3RJdGVtcyA9IFtdO1xuXG5cdFx0Zm9yIChsZXQgb2JqIG9mIF9saXN0VmFsdWVzKVxuXHRcdHtcblx0XHRcdGxldCBsaXN0SXRlbSA9IFtdO1xuXG5cdFx0XHRmb3IgKGxldCBkZWZhdWx0Q1Agb2YgdGhpcy5kZWZhdWx0TGlzdEl0ZW0pXG5cdFx0XHR7XG5cdFx0XHRcdGxldCBzdWJDUCA9IGRlZmF1bHRDUC5jbG9uZShmYWxzZSk7XG5cdFx0XHRcdHN1YkNQLnZhbHVlID0gb2JqW3N1YkNQLm5hbWVdO1xuXG5cdFx0XHRcdGxpc3RJdGVtLnB1c2goc3ViQ1ApO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLl9saXN0SXRlbXMucHVzaChsaXN0SXRlbSk7XG5cdFx0fVxuXHR9XG5cblx0X2dldFN1YkNvbmZpZ3VyYXRpb25QYXJhbXNWYWx1ZXMoKVxuXHR7XG5cdFx0bGV0IF9saXN0VmFsdWVzID0gW107XG5cblx0XHRmb3IgKGxldCBsaXN0SXRlbSBvZiB0aGlzLl9saXN0SXRlbXMpXG5cdFx0e1xuXHRcdFx0bGV0IG9iaiA9IHt9O1xuXG5cdFx0XHRmb3IgKGxldCBzdWJDUCBvZiBsaXN0SXRlbSlcblx0XHRcdHtcblx0XHRcdFx0aWYgKHN1YkNQLnZhbHVlICE9IG51bGwpXG5cdFx0XHRcdFx0b2JqW3N1YkNQLm5hbWVdID0gc3ViQ1AudmFsdWU7XG5cdFx0XHR9XG5cblx0XHRcdF9saXN0VmFsdWVzLnB1c2gob2JqKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gX2xpc3RWYWx1ZXM7XG5cdH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7OztBQzVHQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7OztBQ3hIQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUN6TEE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FDeE9BO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUMzV0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDM0JBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FDL0dBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7OztBQ3pGQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7OztBQzdFQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FDN0VBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7OztBQzdKQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDaERBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7OztBQzdRQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QSIsInNvdXJjZVJvb3QiOiIifQ==
@@ -1223,6 +1223,7 @@ class ZoneMonitor extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModule"
1223
1223
  this.REQ_SET_USER_SETTINGS = 'setUserSettings';
1224
1224
  this.REQ_RELOAD_ZONE_EXT = 'reloadZoneExt';
1225
1225
  this.REQ_RELOAD_WORDS = 'reloadWords';
1226
+ this.REQ_DISCONNECT_USER = 'disconnUser';
1226
1227
  this.REQ_KICK_USER = 'kickUser';
1227
1228
  this.REQ_BAN_USER = 'banUser';
1228
1229
  this.REQ_GET_ROOM_CONFIG = 'getRoomConfig';
@@ -1508,6 +1509,7 @@ class ZoneMonitor extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModule"
1508
1509
  }).data('kendoNumericTextBox');
1509
1510
 
1510
1511
  // Add button click listeners
1512
+ $('#znm-disconnectBt').on('click', $.proxy(this._onDisconnectBtClick, this));
1511
1513
  $('#znm-kickBt').on('click', $.proxy(this._onKickBtClick, this));
1512
1514
  $('#znm-banBt').on('click', $.proxy(this._onBanBtClick, this));
1513
1515
 
@@ -1789,6 +1791,7 @@ class ZoneMonitor extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModule"
1789
1791
  $(window).off('resize');
1790
1792
  $('#znm-reloadWordsBt').off('click');
1791
1793
  $('#znm-reloadZoneExtBt').off('click');
1794
+ $('#znm-disconnectBt').off('click');
1792
1795
  $('#znm-kickBt').off('click');
1793
1796
  $('#znm-banBt').off('click');
1794
1797
 
@@ -1955,7 +1958,8 @@ class ZoneMonitor extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModule"
1955
1958
  // NPC
1956
1959
  const isNpc = data.getSFSObject('monitored').getBool('npc');
1957
1960
 
1958
- // Disable kick and ban buttons
1961
+ // Disable disconnect, kick and ban buttons
1962
+ $('#znm-disconnectBt').attr('disabled', isNpc);
1959
1963
  $('#znm-kickBt').attr('disabled', isNpc);
1960
1964
  $('#znm-banBt').attr('disabled', isNpc);
1961
1965
 
@@ -2622,6 +2626,19 @@ class ZoneMonitor extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModule"
2622
2626
  }
2623
2627
  }
2624
2628
 
2629
+ _onDisconnectBtClick()
2630
+ {
2631
+ if (this._monitoredType == this.MONITORED_TYPE_USER)
2632
+ {
2633
+ // Send request to extension
2634
+ let params = new SFS2X.SFSObject();
2635
+ params.putUtfString('zone', this._monitoredZone);
2636
+ params.putUtfString('user', this._monitoredName);
2637
+
2638
+ this.sendExtensionRequest(this.REQ_DISCONNECT_USER, params);
2639
+ }
2640
+ }
2641
+
2625
2642
  _onKickBtClick()
2626
2643
  {
2627
2644
  if (this._monitoredType == this.MONITORED_TYPE_USER)
@@ -3312,4 +3329,4 @@ class UserPropertiesData
3312
3329
  /***/ })
3313
3330
 
3314
3331
  }]);
3315
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXRzL2pzL2NvcmUvbW9kdWxlcy9tb2R1bGUtMTMuYnVuZGxlLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYXBwbGljYXRpb24vLi9zcmMvY29tcG9uZW50cy9jaGFydHMvY2hhcnQtdXRpbHMuanMiLCJ3ZWJwYWNrOi8vYXBwbGljYXRpb24vLi9zcmMvY29tcG9uZW50cy9jaGFydHMvdXNlci1jb3VudC1jaGFydC5qcyIsIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9jb21wb25lbnRzL21vZHVsZS1zcGVjaWZpYy9tYXRjaC1leHByZXNzaW9uLWJ1aWxkZXIuanMiLCJ3ZWJwYWNrOi8vYXBwbGljYXRpb24vLi9zcmMvY29tcG9uZW50cy9zaWRlYmFyLWxheW91dC5qcyIsIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9tb2R1bGVzL3pvbmUtbW9uaXRvci5qcyIsIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy91dGlscy9tYXRjaC1wcm9wZXJ0aWVzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Ynl0ZXNUb1NpemUsIGtCeXRlc1RvU2l6ZX0gZnJvbSAnLi4vLi4vdXRpbHMvdXRpbGl0aWVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZvcm1hdHRlZERhdGVUaW1lKGRhdGUsIGZvcm1hdCA9ICdkZCBNTU0gSEg6bW06c3MnKVxue1xuXHRyZXR1cm4ga2VuZG8udG9TdHJpbmcoZGF0ZSwgZm9ybWF0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJhc2ljU2hhcmVkVGVtcGxhdGUodmFsdWVGb3JtYXQgPSAnezB9Jykge1xuXHRyZXR1cm4ga2VuZG8udGVtcGxhdGUoYFxuXHRcdDxkaXYgY2xhc3M9XCJjaGFydC10b29sdGlwLWNhdGVnb3J5XCI+PHN0cm9uZz4jOiBjYXRlZ29yeSAjPC9zdHJvbmc+PC9kaXY+XG5cdFx0IyBmb3IgKHZhciBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkrKykgeyAjXG5cdFx0PGRpdj5cblx0XHRcdDxpIGNsYXNzPVwiZmFzIGZhLXNxdWFyZVwiIHN0eWxlPVwiY29sb3I6ICM6IHBvaW50c1tpXS5jb2xvciAjIFwiPjwvaT5cblx0XHRcdCM6IHBvaW50c1tpXS5zZXJpZXMubmFtZSMgOiAjOiBrZW5kby5mb3JtYXQoJyR7dmFsdWVGb3JtYXR9JywgcG9pbnRzW2ldLnZhbHVlKSAjXG5cdFx0PC9kaXY+XG5cdFx0IyB9ICNcblx0YCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNZW1vcnlTaGFyZWRUZW1wbGF0ZSgpIHtcblx0cmV0dXJuIGZ1bmN0aW9uKGRhdGFJdGVtKSB7XG5cdFx0ZGF0YUl0ZW0uYnl0ZXNUb1NpemUgPSBieXRlc1RvU2l6ZTsgLy8gUGFzcyBieXRlc1RvU2l6ZSB1dGlsaXR5IGZ1bmN0aW9uIHRvIHRlbXBsYXRlXG5cdFx0cmV0dXJuIGtlbmRvLnRlbXBsYXRlKGBcblx0XHRcdDxkaXYgY2xhc3M9XCJjaGFydC10b29sdGlwLWNhdGVnb3J5XCI+PHN0cm9uZz4jOiBjYXRlZ29yeSAjPC9zdHJvbmc+PC9kaXY+XG5cdFx0XHQjIGZvciAodmFyIGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKSB7ICNcblx0XHRcdDxkaXY+XG5cdFx0XHRcdDxpIGNsYXNzPVwiZmFzIGZhLXNxdWFyZVwiIHN0eWxlPVwiY29sb3I6ICM6IHBvaW50c1tpXS5jb2xvciAjIFwiPjwvaT5cblx0XHRcdFx0IzogcG9pbnRzW2ldLnNlcmllcy5uYW1lIyA6ICM6IGJ5dGVzVG9TaXplKHBvaW50c1tpXS52YWx1ZSkgI1xuXHRcdFx0PC9kaXY+XG5cdFx0XHQjIH0gI1xuXHRcdGApKGRhdGFJdGVtKTtcblx0fTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1lbW9yeVZhbHVlQXhpc0xhYmVsVGVtcGxhdGUoKSB7XG5cdHJldHVybiBmdW5jdGlvbihkYXRhSXRlbSkge1xuXHRcdGRhdGFJdGVtLmJ5dGVzVG9TaXplID0gYnl0ZXNUb1NpemU7IC8vIFBhc3MgYnl0ZXNUb1NpemUgdXRpbGl0eSBmdW5jdGlvbiB0byB0ZW1wbGF0ZVxuXHRcdHJldHVybiBrZW5kby50ZW1wbGF0ZShgXG5cdFx0XHQjOiBieXRlc1RvU2l6ZSh2YWx1ZSkgI1xuXHRcdGApKGRhdGFJdGVtKTtcblx0fTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE5ldHdvcmtTaGFyZWRUZW1wbGF0ZShjYXRlZ29yeUZvcm1hdCA9ICdkZCBNTU0gSEg6bW06c3MnKSB7XG5cdHJldHVybiBmdW5jdGlvbihkYXRhSXRlbSkge1xuXHRcdGRhdGFJdGVtLmtCeXRlc1RvU2l6ZSA9IGtCeXRlc1RvU2l6ZTsgLy8gUGFzcyBrQnl0ZXNUb1NpemUgdXRpbGl0eSBmdW5jdGlvbiB0byB0ZW1wbGF0ZVxuXHRcdHJldHVybiBrZW5kby50ZW1wbGF0ZShgXG5cdFx0XHQ8ZGl2IGNsYXNzPVwiY2hhcnQtdG9vbHRpcC1jYXRlZ29yeVwiPjxzdHJvbmc+Izoga2VuZG8udG9TdHJpbmcoY2F0ZWdvcnksICcke2NhdGVnb3J5Rm9ybWF0fScpICM8L3N0cm9uZz48L2Rpdj5cblx0XHRcdCMgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspIHsgI1xuXHRcdFx0PGRpdj5cblx0XHRcdFx0PGkgY2xhc3M9XCJmYXMgZmEtc3F1YXJlXCIgc3R5bGU9XCJjb2xvcjogIzogcG9pbnRzW2ldLmNvbG9yICMgXCI+PC9pPlxuXHRcdFx0XHQjOiBwb2ludHNbaV0uc2VyaWVzLm5hbWUjIDogIzoga0J5dGVzVG9TaXplKHBvaW50c1tpXS52YWx1ZSwgMSwgJycsICcvcycpICNcblx0XHRcdDwvZGl2PlxuXHRcdFx0IyB9ICNcblx0XHRgKShkYXRhSXRlbSk7XG5cdH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXROZXR3b3JrVmFsdWVBeGlzTGFiZWxUZW1wbGF0ZSgpIHtcblx0cmV0dXJuIGZ1bmN0aW9uKGRhdGFJdGVtKSB7XG5cdFx0ZGF0YUl0ZW0ua0J5dGVzVG9TaXplID0ga0J5dGVzVG9TaXplOyAvLyBQYXNzIGtCeXRlc1RvU2l6ZSB1dGlsaXR5IGZ1bmN0aW9uIHRvIHRlbXBsYXRlXG5cdFx0cmV0dXJuIGtlbmRvLnRlbXBsYXRlKGBcblx0XHRcdCM6IGtCeXRlc1RvU2l6ZSh2YWx1ZSwgMSwgJycsICcvcycpICNcblx0XHRgKShkYXRhSXRlbSk7XG5cdH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRVc2VyQ291bnRTaGFyZWRUZW1wbGF0ZShjYXRlZ29yeUZvcm1hdCA9ICdkZCBNTU0gSEg6bW06c3MnKSB7XG5cdHJldHVybiBmdW5jdGlvbihkYXRhSXRlbSkge1xuXHRcdHJldHVybiBrZW5kby50ZW1wbGF0ZShgXG5cdFx0XHQ8ZGl2IGNsYXNzPVwiY2hhcnQtdG9vbHRpcC1jYXRlZ29yeVwiPjxzdHJvbmc+Izoga2VuZG8udG9TdHJpbmcoY2F0ZWdvcnksICcke2NhdGVnb3J5Rm9ybWF0fScpICM8L3N0cm9uZz48L2Rpdj5cblx0XHRcdCMgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspIHsgI1xuXHRcdFx0PGRpdj5cblx0XHRcdFx0PGkgY2xhc3M9XCJmYXMgZmEtc3F1YXJlXCIgc3R5bGU9XCJjb2xvcjogIzogcG9pbnRzW2ldLmNvbG9yICMgXCI+PC9pPlxuXHRcdFx0XHQjOiBwb2ludHNbaV0uc2VyaWVzLm5hbWUjIDogIzogcG9pbnRzW2ldLnZhbHVlICNcblx0XHRcdDwvZGl2PlxuXHRcdFx0IyB9ICNcblx0XHRgKShkYXRhSXRlbSk7XG5cdH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUaW1lUmFuZ2VUb29sdGlwVGVtcGxhdGUoKSB7XG5cdHJldHVybiBmdW5jdGlvbihkYXRhSXRlbSkge1xuXHRcdGRhdGFJdGVtLmdldFRvb2x0aXBTdHJpbmcgPSBmdW5jdGlvbih2MSwgdjIpIHtcblx0XHRcdGlmICh2MSA9PSB2Milcblx0XHRcdHtcblx0XHRcdFx0aWYgKHYyID09IC0yNClcblx0XHRcdFx0XHR2MiA9IC0yMztcblxuXHRcdFx0XHR2MSA9IHYyIC0gMTtcblx0XHRcdH1cblxuXHRcdFx0bGV0IHN0YXJ0ID0gTWF0aC5hYnModjEpO1xuXHRcdFx0bGV0IGVuZCA9IE1hdGguYWJzKHYyKTtcblxuXHRcdFx0cmV0dXJuIGBGcm9tICR7c3RhcnR9IGhvdXIke3N0YXJ0ICE9IDEgPyAncycgOiAnJ30gYWdvIHRvICR7ZW5kID4gMCA/ICgndG8gJyArIGVuZCArICcgaG91cicgKyAoZW5kICE9IDEgPyAncycgOiAnJykgKyAnIGFnbycpIDogJ25vdyd9YDtcblx0XHR9OyAvLyBQYXNzIHV0aWxpdHkgZnVuY3Rpb24gdG8gdGVtcGxhdGVcblx0XHRyZXR1cm4ga2VuZG8udGVtcGxhdGUoYFxuXHRcdFx0IzogZ2V0VG9vbHRpcFN0cmluZyhzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kKSAjXG5cdFx0YCkoZGF0YUl0ZW0pO1xuXHR9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0V1JCeXRlc0xhYmVsVGVtcGxhdGUoKSB7XG5cdHJldHVybiBmdW5jdGlvbihkYXRhSXRlbSkge1xuXHRcdHJldHVybiBrZW5kby50ZW1wbGF0ZShgXG5cdFx0XHQjOiB2YWx1ZSAjICM6IGRhdGFJdGVtLnVuaXQgI1xuXHRcdGApKGRhdGFJdGVtKTtcblx0fTtcbn1cbiIsImltcG9ydCB7Z2V0VXNlckNvdW50U2hhcmVkVGVtcGxhdGV9IGZyb20gJy4vY2hhcnQtdXRpbHMnO1xuaW1wb3J0ICogYXMgbW9tZW50IGZyb20gJ21vbWVudCc7XG5cbmV4cG9ydCBjbGFzcyBVc2VyQ291bnRDaGFydCBleHRlbmRzIEhUTUxFbGVtZW50XG57XG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHQgICAgc3VwZXIoKTtcblxuXHRcdC8vIENyZWF0ZSBjaGFydCBodG1sXG5cdFx0bGV0IGNoYXJ0SHRtbCA9ICQoJzxkaXY+Jyk7XG5cdFx0JCh0aGlzKS5hcHBlbmQoY2hhcnRIdG1sKTtcblxuXHRcdC8vIEluaXRpYWxpemUgY2hhcnRcblx0XHR0aGlzLl9jaGFydFdpZGdldCA9IHRoaXMuX2luaXRDaGFydFdpZGdldChjaGFydEh0bWwpO1xuXHR9XG5cblx0X2luaXRDaGFydFdpZGdldChjaGFydEh0bWwpXG5cdHtcblx0XHRyZXR1cm4gY2hhcnRIdG1sLmtlbmRvQ2hhcnQoe1xuXHRcdFx0dHJhbnNpdGlvbnM6IGZhbHNlLFxuXHRcdFx0Y2hhcnRBcmVhOiB7XG5cdFx0XHRcdGhlaWdodDogMjcwLFxuXHRcdFx0XHRiYWNrZ3JvdW5kOiAndHJhbnNwYXJlbnQnXG5cdFx0XHR9LFxuXHQgICAgICAgIGxlZ2VuZDoge1xuXHQgICAgICAgICAgICB2aXNpYmxlOiBmYWxzZVxuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2VyaWVzRGVmYXVsdHM6IHtcblx0ICAgICAgICAgICAgdHlwZTogJ2FyZWEnLFxuXHQgICAgICAgICAgICBsYWJlbHM6IHtcblx0ICAgICAgICAgICAgICAgIHZpc2libGU6IGZhbHNlLFxuXHQgICAgICAgICAgICAgICAgZm9ybWF0OiAnezB9Jyxcblx0ICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ICd0cmFuc3BhcmVudCdcblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNlcmllczogW3tcblx0XHRcdFx0bmFtZTogJ1VzZXJzJyxcblx0ICAgICAgICAgICAgZmllbGQ6ICd1c2VycycsXG5cdCAgICAgICAgICAgIGNhdGVnb3J5RmllbGQ6ICd0aW1lJyxcblx0XHRcdFx0Y29sb3I6ICcjZmQ3ZDI0Jyxcblx0XHRcdFx0bGluZToge1xuXHRcdFx0XHRcdHdpZHRoOiAyXG5cdFx0XHRcdH1cblx0ICAgICAgICB9XSxcblx0ICAgICAgICB2YWx1ZUF4aXM6IHtcblx0ICAgICAgICAgICAgbGFiZWxzOiB7XG5cdCAgICAgICAgICAgICAgICBmb3JtYXQ6ICd7MH0nLFxuXHQgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICBsaW5lOiB7XG5cdCAgICAgICAgICAgICAgICB2aXNpYmxlOiBmYWxzZVxuXHQgICAgICAgICAgICB9LFxuXHRcdFx0XHRtaW46IDAsXG5cdCAgICAgICAgfSxcblx0ICAgICAgICBjYXRlZ29yeUF4aXM6IHtcblx0XHRcdFx0bWFqb3JHcmlkTGluZXM6IHtcblx0ICAgICAgICAgICAgICAgIHZpc2libGU6IHRydWUsXG5cdFx0XHRcdFx0c3RlcDogNjBcblx0ICAgICAgICAgICAgfSxcblx0XHRcdFx0bWFqb3JUaWNrczoge1xuXHRcdFx0XHRcdHZpc2libGU6IHRydWUsXG5cdFx0XHRcdFx0c3RlcDogNjBcblx0XHRcdFx0fSxcblx0XHRcdFx0bGFiZWxzOiB7XG5cdFx0XHRcdFx0dmlzaWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRzdGVwOiA2MFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRiYXNlVW5pdDogJ21pbnV0ZXMnLFxuXHRcdFx0XHR0eXBlOiAnZGF0ZScsXG5cdCAgICAgICAgfSxcblx0ICAgICAgICB0b29sdGlwOiB7XG5cdFx0XHRcdHNoYXJlZDogdHJ1ZSxcblx0ICAgICAgICAgICAgdmlzaWJsZTogdHJ1ZSxcblx0XHRcdFx0c2hhcmVkVGVtcGxhdGU6IGdldFVzZXJDb3VudFNoYXJlZFRlbXBsYXRlKCdkZCBNTU0gSEg6bW0nKSxcblx0XHRcdFx0YmFja2dyb3VuZDogJyNlNGU0ZTQnXG5cdCAgICAgICAgfVxuXHQgICAgfSkuZGF0YSgna2VuZG9DaGFydCcpO1xuXHR9XG5cblx0cmVkcmF3KClcblx0e1xuXHRcdHRoaXMuX2NoYXJ0V2lkZ2V0LnJlZHJhdygpO1xuXHR9XG5cblx0c2V0IHJhbmdlKHZhbHVlcylcblx0e1xuXHRcdHRoaXMuX3JhbmdlID0gdmFsdWVzO1xuXG5cdFx0dGhpcy5fdXBkYXRlWEF4aXNMaW1pdHMoKTtcblx0fVxuXG5cdGdldCByYW5nZSgpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fcmFuZ2U7XG5cdH1cblxuXHRhZGRIaXN0b3J5RW50cmllcyh1c2VyQ291bnREYXRhLCBzYW1wbGluZ1JhdGVTZWNvbmRzKVxuXHR7XG5cdFx0bGV0IGRhdGUgPSBuZXcgRGF0ZSgpO1xuXHRcdGxldCBzdGFydCA9IG1vbWVudChkYXRlKTtcblx0XHRzdGFydC5zdWJ0cmFjdCgoc2FtcGxpbmdSYXRlU2Vjb25kcyAqIHVzZXJDb3VudERhdGEubGVuZ3RoKSwgJ3MnKVxuXG5cdFx0bGV0IGRhdGFTb3VyY2UgPSBuZXcga2VuZG8uZGF0YS5EYXRhU291cmNlKCk7XG5cblx0XHRmb3IgKGxldCBpID0gMTsgaSA8IHVzZXJDb3VudERhdGEubGVuZ3RoOyBpKyspXG5cdFx0e1xuXHRcdFx0bGV0IGRhdGUgPSBzdGFydC5jbG9uZSgpO1xuXHRcdFx0ZGF0ZS5hZGQoaSAqIHNhbXBsaW5nUmF0ZVNlY29uZHMsICdzJyk7XG5cblx0XHRcdHRoaXMuYWRkRW50cnkodXNlckNvdW50RGF0YVtpXSwgZGF0YVNvdXJjZSwgZGF0ZS50b0RhdGUoKSwgZmFsc2UpO1xuXHRcdH1cblxuXHRcdC8vIEFzc2lnbiBkYXRhc291cmNlIHRvIGNoYXJ0XG5cdFx0dGhpcy5fY2hhcnRXaWRnZXQuc2V0RGF0YVNvdXJjZShkYXRhU291cmNlKTtcblxuXHRcdC8vIFVwZGF0ZSBheGlzXG5cdFx0dGhpcy5fdXBkYXRlWEF4aXNMaW1pdHMoKTtcblx0fVxuXG5cdGFkZEVudHJ5KHVzZXJDb3VudCwgZGF0YVNvdXJjZSA9IG51bGwsIGRhdGUgPSBudWxsLCB1cGRhdGVBeGlzID0gdHJ1ZSlcblx0e1xuXHRcdGlmIChkYXRlID09IG51bGwpXG5cdFx0XHRkYXRlID0gbmV3IERhdGUoKTtcblxuXHRcdGxldCBuZXdFbnRyeSA9IHtcblx0XHRcdHRpbWU6IGRhdGUsXG5cdFx0XHR1c2VyczogdXNlckNvdW50XG5cdFx0fTtcblxuXHRcdC8vIEFkZCBlbnRyeSB0byBkYXRhIHNvdXJjZVxuXHRcdGlmIChkYXRhU291cmNlID09IG51bGwpXG5cdFx0XHRkYXRhU291cmNlID0gdGhpcy5fZGF0YVNvdXJjZTtcblxuXHRcdGRhdGFTb3VyY2UuYWRkKG5ld0VudHJ5KTtcblxuXHRcdGlmICh1cGRhdGVBeGlzKVxuXHRcdFx0dGhpcy5fdXBkYXRlWEF4aXNMaW1pdHMoKTtcblx0fVxuXG5cdF91cGRhdGVYQXhpc0xpbWl0cygpXG5cdHtcblx0XHRsZXQgZHMgPSB0aGlzLl9kYXRhU291cmNlO1xuXG5cdFx0aWYgKGRzLnRvdGFsKCkgPiAwKVxuXHRcdHtcblx0XHRcdGNvbnN0IGNoYXJ0TWluaW11bSA9IG1vbWVudCh0aGlzLl9sYXN0RGF0ZSkuYWRkKHRoaXMuX3JhbmdlWzBdLCAnaCcpO1xuXHRcdFx0Y29uc3QgY2hhcnRNYXhpbXVtID0gbW9tZW50KHRoaXMuX2xhc3REYXRlKS5hZGQodGhpcy5fcmFuZ2VbMV0sICdoJyk7XG5cblx0XHRcdHRoaXMuX2NoYXJ0V2lkZ2V0Lm9wdGlvbnMuY2F0ZWdvcnlBeGlzLm1pbiA9IGNoYXJ0TWluaW11bS50b0RhdGUoKTtcblx0XHRcdHRoaXMuX2NoYXJ0V2lkZ2V0Lm9wdGlvbnMuY2F0ZWdvcnlBeGlzLm1heCA9IGNoYXJ0TWF4aW11bS50b0RhdGUoKTtcblxuXHRcdFx0dGhpcy5fY2hhcnRXaWRnZXQucmVkcmF3KCk7XG5cdFx0fVxuXHR9XG5cblx0Z2V0IF9kYXRhU291cmNlKClcblx0e1xuXHRcdHJldHVybiB0aGlzLl9jaGFydFdpZGdldC5kYXRhU291cmNlO1xuXHR9XG59XG5cbi8vIERFRklORSBDT01QT05FTlRcbmlmICghd2luZG93LmN1c3RvbUVsZW1lbnRzLmdldCgndXNlci1jb3VudC1jaGFydCcpKVxuXHR3aW5kb3cuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCd1c2VyLWNvdW50LWNoYXJ0JywgVXNlckNvdW50Q2hhcnQpO1xuIiwiZXhwb3J0IGNsYXNzIE1hdGNoRXhwcmVzc2lvbkJ1aWxkZXIgZXh0ZW5kcyBIVE1MRWxlbWVudFxue1xuXHRjb25zdHJ1Y3RvcigpXG5cdHtcblx0ICAgIHN1cGVyKCk7XG5cblx0XHR0aGlzLkVYUFJFU1NJT05fVVBEQVRFRF9FVkVOVCA9ICdleHByZXNzaW9uVXBkYXRlZCc7XG5cblx0XHR0aGlzLl9kaWFsb2cgPSAkKGBcblx0XHRcdDxkaXYgY2xhc3M9XCJtb2RhbFwiIGlkPVwibWF0Y2hFeHByQnVpbGRlck1vZGFsXCIgdGFiaW5kZXg9XCItMVwiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLWxhYmVsbGVkYnk9XCJtYXRjaEV4cHJCdWlsZGVyTW9kYWxUaXRsZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nIG1vZGFsLWRpYWxvZy1jZW50ZXJlZCBtb2RhbC1sZ1wiIHJvbGU9XCJkb2N1bWVudFwiPlxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XG5cdFx0XHRcdFx0XHRcdDxoNSBjbGFzcz1cIm1vZGFsLXRpdGxlIHRleHQtcHJpbWFyeVwiIGlkPVwibWF0Y2hFeHByQnVpbGRlck1vZGFsVGl0bGVcIj4uLi48L2g1PlxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwibW9kYWwtYm9keSBwLTBcIj5cblx0XHRcdFx0XHRcdFx0PGZvcm0gY2xhc3M9XCJiZy1jb2xvci1kZWZhdWx0IHAtM1wiPlxuXHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJkLWlubGluZS1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciByYWRpby1idXR0b24tZ3JvdXAgaW5saW5lLWZvcm0tZ3JvdXBzXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY3VzdG9tLWNvbnRyb2wgY3VzdG9tLXJhZGlvIGN1c3RvbS1jb250cm9sLWlubGluZSBtci0yXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxpbnB1dCB0eXBlPVwicmFkaW9cIiBpZD1cImFuZE9wZXJhdG9yUkJcIiBuYW1lPVwib3BlcmF0b3JSQkdcIiBjbGFzcz1cImN1c3RvbS1jb250cm9sLWlucHV0XCIgdmFsdWU9XCJBTkRcIiBjaGVja2VkIGRpc2FibGVkPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8bGFiZWwgY2xhc3M9XCJjdXN0b20tY29udHJvbC1sYWJlbFwiIGZvcj1cImFuZE9wZXJhdG9yUkJcIj5BTkQ8L2xhYmVsPlxuXHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY3VzdG9tLWNvbnRyb2wgY3VzdG9tLXJhZGlvIGN1c3RvbS1jb250cm9sLWlubGluZSBtci0yXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxpbnB1dCB0eXBlPVwicmFkaW9cIiBpZD1cIm9yT3BlcmF0b3JSQlwiIG5hbWU9XCJvcGVyYXRvclJCR1wiIGNsYXNzPVwiY3VzdG9tLWNvbnRyb2wtaW5wdXRcIiB2YWx1ZT1cIk9SXCIgZGlzYWJsZWQ+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxsYWJlbCBjbGFzcz1cImN1c3RvbS1jb250cm9sLWxhYmVsXCIgZm9yPVwib3JPcGVyYXRvclJCXCI+T1I8L2xhYmVsPlxuXHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImQtaW5saW5lLWJsb2NrXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiaW5saW5lLWZvcm0tZ3JvdXBzIG15LTFcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PGlucHV0IGlkPVwidmFyTmFtZUNCXCIvPlxuXHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiaW5saW5lLWZvcm0tZ3JvdXBzIG15LTFcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PGlucHV0IGlkPVwidHlwZUREXCIgY2xhc3M9XCJtYXRjaFR5cGVEcm9wZG93blwiLz5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PGlucHV0IGlkPVwiY29uZGl0aW9uRERcIiBjbGFzcz1cIm1hdGNoQ29uZGl0aW9uRHJvcGRvd25cIi8+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZC1pbmxpbmUgaW5saW5lLWZvcm0tZ3JvdXBzXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8aW5wdXQgaWQ9XCJ2YWx1ZUluXCIgY2xhc3M9XCJrLXRleHRib3ggbXQtMVwiIHBsYWNlaG9sZGVyPVwiVmFsdWVcIi8+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8YnV0dG9uIGlkPVwibWF0Y2hFeHByQWRkQnRcIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJrLWJ1dHRvbiBrLXNlY29uZGFyeSBtdC0xXCI+PGkgY2xhc3M9XCJmYXMgZmEtcGx1cyBtci0xXCI+PC9pPkFkZDwvYnV0dG9uPlxuXHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHQ8L2Zvcm0+XG5cblx0XHRcdFx0XHRcdFx0PGRpdiBpZD1cIm1hdGNoRXhwckdyaWRcIiBjbGFzcz1cIm0tM1wiPjwvZGl2PlxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyIGQtZmxleFwiPlxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZmxleC1ncm93LTEgdGV4dC1sZWZ0XCI+XG5cdFx0XHRcdFx0XHRcdFx0PGJ1dHRvbiBpZD1cIm1hdGNoRXhwckFwcGx5QnRcIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJrLWJ1dHRvbiBrLXByaW1hcnkgbXItMlwiPjxpIGNsYXNzPVwiZmFzIGZhLWNoZWNrLWNpcmNsZSBtci0xXCI+PC9pPkFwcGx5PC9idXR0b24+XG5cdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZmxleC1ncm93LTEgdGV4dC1yaWdodFwiPlxuXHRcdFx0XHRcdFx0XHRcdDxidXR0b24gaWQ9XCJtYXRjaEV4cHJSZW1vdmVCdFwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImstYnV0dG9uIGstc2Vjb25kYXJ5XCIgZGlzYWJsZWQ+PGkgY2xhc3M9XCJmYXMgZmEtbWludXMtY2lyY2xlIG1yLTFcIj48L2k+UmVtb3ZlIHNlbGVjdGVkPC9idXR0b24+XG5cdFx0XHRcdFx0XHRcdFx0PGJ1dHRvbiBpZD1cIm1hdGNoRXhwckNsZWFyQnRcIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJrLWJ1dHRvbiBrLXNlY29uZGFyeVwiPjxpIGNsYXNzPVwiZmFzIGZhLXRpbWVzLWNpcmNsZSBtci0xXCI+PC9pPkNsZWFyIGFsbDwvYnV0dG9uPlxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdDwvZGl2PlxuXHRcdGApO1xuXG5cdFx0JCgnI21hdGNoRXhwckFkZEJ0JywgdGhpcy5fZGlhbG9nKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uQWRkQnRDbGljaywgdGhpcykpO1xuXHRcdCQoJyNtYXRjaEV4cHJBcHBseUJ0JywgdGhpcy5fZGlhbG9nKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uQXBwbHlCdENsaWNrLCB0aGlzKSk7XG5cdFx0JCgnI21hdGNoRXhwclJlbW92ZUJ0JywgdGhpcy5fZGlhbG9nKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uUmVtb3ZlQnRDbGljaywgdGhpcykpO1xuXHRcdCQoJyNtYXRjaEV4cHJDbGVhckJ0JywgdGhpcy5fZGlhbG9nKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uQ2xlYXJCdENsaWNrLCB0aGlzKSk7XG5cblx0XHQvLyBJTklUSUFMSVpFIEZPUk0gSVRFTVNcblxuXHRcdHRoaXMuX3Zhck5hbWVDYiA9ICQoJyN2YXJOYW1lQ0InLCB0aGlzLl9kaWFsb2cpLmtlbmRvQ29tYm9Cb3goe1xuXHRcdFx0ZGF0YVRleHRGaWVsZDogJ2xhYmVsJyxcblx0XHRcdGRhdGFWYWx1ZUZpZWxkOiAndmFsdWUnLFxuXHRcdFx0cGxhY2Vob2xkZXI6ICdWYXJpYWJsZSBuYW1lJyxcblx0XHR9KS5kYXRhKCdrZW5kb0NvbWJvQm94Jyk7XG5cblx0XHQvLyBTZXQgdHlwZXMgZHJvcGRvd24gZGF0YSBzb3VyY2Vcblx0XHQvLyBOT1RFOiBpbiBvcmRlciB0byBhdm9pZCBYeHhNYXRjaCBvYmplY3RzIHRvIGJlIHdyYXBwZWQgYnkgS2VuZG8gZGF0YSBzb3VyY2UsIHdlIGhhdmUgdG8gcGFzcyB0aGVtIHVzaW5nIF8gcHJvcGVydHkgbmFtZXNcblx0XHRsZXQgdHlwZURTID0gW107XG5cblx0XHQvLyBCb29sZWFuIC0tLS0tLS0tLS0tLS0tLS1cblx0XHR0eXBlRFMucHVzaCh7XG5cdFx0XHRsYWJlbDogJ0Jvb2xlYW4nLFxuXHRcdFx0X3ZhbHVlOiBTRlMyWC5Cb29sTWF0Y2guRVFVQUxTLFxuXHRcdFx0Y29uZGl0aW9uczogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IFNGUzJYLkJvb2xNYXRjaC5FUVVBTFMuc3ltYm9sLFxuXHRcdFx0XHRcdF92YWx1ZTogU0ZTMlguQm9vbE1hdGNoLkVRVUFMUyxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiBTRlMyWC5Cb29sTWF0Y2guTk9UX0VRVUFMUy5zeW1ib2wsXG5cdFx0XHRcdFx0X3ZhbHVlOiBTRlMyWC5Cb29sTWF0Y2guTk9UX0VRVUFMUyxcblx0XHRcdFx0fVxuXHRcdFx0XVxuXHRcdH0pO1xuXG5cdFx0Ly8gTnVtYmVyIC0tLS0tLS0tLS0tLS0tLS1cblx0XHR0eXBlRFMucHVzaCh7XG5cdFx0XHRsYWJlbDogJ051bWJlcicsXG5cdFx0XHRfdmFsdWU6IFNGUzJYLk51bWJlck1hdGNoLkVRVUFMUyxcblx0XHRcdGNvbmRpdGlvbnM6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiBTRlMyWC5OdW1iZXJNYXRjaC5FUVVBTFMuc3ltYm9sLFxuXHRcdFx0XHRcdF92YWx1ZTogU0ZTMlguTnVtYmVyTWF0Y2guRVFVQUxTLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IFNGUzJYLk51bWJlck1hdGNoLk5PVF9FUVVBTFMuc3ltYm9sLFxuXHRcdFx0XHRcdF92YWx1ZTogU0ZTMlguTnVtYmVyTWF0Y2guTk9UX0VRVUFMUyxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiBTRlMyWC5OdW1iZXJNYXRjaC5HUkVBVEVSX1RIQU4uc3ltYm9sLFxuXHRcdFx0XHRcdF92YWx1ZTogU0ZTMlguTnVtYmVyTWF0Y2guR1JFQVRFUl9USEFOLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IFNGUzJYLk51bWJlck1hdGNoLkxFU1NfVEhBTi5zeW1ib2wsXG5cdFx0XHRcdFx0X3ZhbHVlOiBTRlMyWC5OdW1iZXJNYXRjaC5MRVNTX1RIQU4sXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogU0ZTMlguTnVtYmVyTWF0Y2guR1JFQVRFUl9USEFOX09SX0VRVUFMX1RPLnN5bWJvbCxcblx0XHRcdFx0XHRfdmFsdWU6IFNGUzJYLk51bWJlck1hdGNoLkdSRUFURVJfVEhBTl9PUl9FUVVBTF9UTyxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiBTRlMyWC5OdW1iZXJNYXRjaC5MRVNTX1RIQU5fT1JfRVFVQUxfVE8uc3ltYm9sLFxuXHRcdFx0XHRcdF92YWx1ZTogU0ZTMlguTnVtYmVyTWF0Y2guTEVTU19USEFOX09SX0VRVUFMX1RPLFxuXHRcdFx0XHR9XG5cdFx0XHRdXG5cdFx0fSk7XG5cblx0XHQvLyBTdHJpbmcgLS0tLS0tLS0tLS0tLS0tLVxuXHRcdHR5cGVEUy5wdXNoKHtcblx0XHRcdGxhYmVsOiAnU3RyaW5nJyxcblx0XHRcdF92YWx1ZTogU0ZTMlguU3RyaW5nTWF0Y2guRVFVQUxTLFxuXHRcdFx0Y29uZGl0aW9uczogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IFNGUzJYLlN0cmluZ01hdGNoLkVRVUFMUy5zeW1ib2wsXG5cdFx0XHRcdFx0X3ZhbHVlOiBTRlMyWC5TdHJpbmdNYXRjaC5FUVVBTFMsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogU0ZTMlguU3RyaW5nTWF0Y2guTk9UX0VRVUFMUy5zeW1ib2wsXG5cdFx0XHRcdFx0X3ZhbHVlOiBTRlMyWC5TdHJpbmdNYXRjaC5OT1RfRVFVQUxTLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IFNGUzJYLlN0cmluZ01hdGNoLkNPTlRBSU5TLnN5bWJvbCxcblx0XHRcdFx0XHRfdmFsdWU6IFNGUzJYLlN0cmluZ01hdGNoLkNPTlRBSU5TLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IFNGUzJYLlN0cmluZ01hdGNoLlNUQVJUU19XSVRILnN5bWJvbCxcblx0XHRcdFx0XHRfdmFsdWU6IFNGUzJYLlN0cmluZ01hdGNoLlNUQVJUU19XSVRILFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IFNGUzJYLlN0cmluZ01hdGNoLkVORFNfV0lUSC5zeW1ib2wsXG5cdFx0XHRcdFx0X3ZhbHVlOiBTRlMyWC5TdHJpbmdNYXRjaC5FTkRTX1dJVEgsXG5cdFx0XHRcdH1cblx0XHRcdF1cblx0XHR9KTtcblxuXHRcdHRoaXMuX3R5cGVEZCA9ICQoJyN0eXBlREQnLCB0aGlzLl9kaWFsb2cpLmtlbmRvRHJvcERvd25MaXN0KHtcblx0XHRcdGRhdGFTb3VyY2U6IHR5cGVEUyxcblx0XHRcdGRhdGFUZXh0RmllbGQ6ICdsYWJlbCcsXG5cdFx0XHRkYXRhVmFsdWVGaWVsZDogJ192YWx1ZScsXG5cdFx0XHRvcHRpb25MYWJlbDoge1xuXHRcdFx0XHRsYWJlbDogJ1R5cGUnLFxuXHRcdFx0XHRfdmFsdWU6ICcnXG5cdFx0XHR9LFxuXHRcdFx0b3B0aW9uTGFiZWxUZW1wbGF0ZTogJzxzcGFuIGNsYXNzPVwidGV4dC1tdXRlZFwiPiM6bGFiZWwjPC9zcGFuPicsXG5cdFx0XHRjaGFuZ2U6ICQucHJveHkoZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICh0aGlzLl90eXBlRGQgJiYgdGhpcy5fdHlwZURkLnNlbGVjdCgpKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IHNlbGVjdGVkVHlwZSA9IHRoaXMuX3R5cGVEZC5kYXRhSXRlbSh0aGlzLl90eXBlRGQuc2VsZWN0KCkpO1xuXHRcdFx0XHRcdHRoaXMuX2NvbmRpdGlvbkRkLnNldERhdGFTb3VyY2Uoc2VsZWN0ZWRUeXBlLmNvbmRpdGlvbnMpO1xuXHRcdFx0XHRcdHRoaXMuX2NvbmRpdGlvbkRkLnNlbGVjdCgxKTtcblx0XHRcdFx0fVxuXHRcdFx0fSwgdGhpcylcblx0XHR9KS5kYXRhKCdrZW5kb0Ryb3BEb3duTGlzdCcpO1xuXG5cdFx0dGhpcy5fY29uZGl0aW9uRGQgPSAkKCcjY29uZGl0aW9uREQnLCB0aGlzLl9kaWFsb2cpLmtlbmRvRHJvcERvd25MaXN0KHtcblx0XHRcdGRhdGFUZXh0RmllbGQ6ICdsYWJlbCcsXG5cdFx0XHRkYXRhVmFsdWVGaWVsZDogJ192YWx1ZScsXG5cdFx0XHRvcHRpb25MYWJlbDoge1xuXHRcdFx0XHRsYWJlbDogJ0NvbmRpdGlvbicsXG5cdFx0XHRcdF92YWx1ZTogJydcblx0XHRcdH0sXG5cdFx0XHRvcHRpb25MYWJlbFRlbXBsYXRlOiAnPHNwYW4gY2xhc3M9XCJ0ZXh0LW11dGVkXCI+IzpsYWJlbCM8L3NwYW4+Jyxcblx0XHR9KS5kYXRhKCdrZW5kb0Ryb3BEb3duTGlzdCcpO1xuXG5cdFx0dGhpcy5fdmFsdWVJbiA9ICQoJyN2YWx1ZUluJywgdGhpcy5fZGlhbG9nKTtcblxuXHRcdC8vIElOSVRJQUxJWkUgR1JJRFxuXG5cdFx0dGhpcy5fZ3JpZCA9ICQoJyNtYXRjaEV4cHJHcmlkJywgdGhpcy5fZGlhbG9nKS5rZW5kb0dyaWQoe1xuXHRcdFx0ZGF0YVNvdXJjZTogW10sXG5cdFx0XHRyZXNpemFibGU6IHRydWUsXG5cdFx0XHRzZWxlY3RhYmxlOiAncm93Jyxcblx0XHRcdGNoYW5nZTogJC5wcm94eSh0aGlzLl9vbkdyaWRTZWxlY3Rpb25DaGFuZ2UsIHRoaXMpLFxuXHRcdFx0bm9SZWNvcmRzOiB7XG5cdFx0XHRcdHRlbXBsYXRlOiAnTm8gZW50cmllcy4nXG5cdFx0XHR9LFxuXHRcdFx0Y29sdW1uczogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0ZmllbGQ6ICdvcGVyYXRvcicsXG5cdFx0XHRcdFx0dGl0bGU6ICdPcGVyYXRvcicsXG5cdFx0XHRcdFx0d2lkdGg6IDkwXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRmaWVsZDogJ2xhYmVsJyxcblx0XHRcdFx0XHR0aXRsZTogJ05hbWUnLFxuXHRcdFx0XHRcdHdpZHRoOiAxMjBcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGZpZWxkOiAndHlwZUxhYmVsJyxcblx0XHRcdFx0XHR0aXRsZTogJ1R5cGUnLFxuXHRcdFx0XHRcdHdpZHRoOiA4NVxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0ZmllbGQ6ICdzeW1ib2wnLFxuXHRcdFx0XHRcdHRpdGxlOiAnQ29uZGl0aW9uJyxcblx0XHRcdFx0XHR3aWR0aDogOTVcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGZpZWxkOiAndmFsdWUnLFxuXHRcdFx0XHRcdHRpdGxlOiAnVmFsdWUnLFxuXHRcdFx0XHRcdHdpZHRoOiAyMDBcblx0XHRcdFx0fSxcblx0XHRcdF1cblx0XHR9KS5kYXRhKCdrZW5kb0dyaWQnKTtcblx0fVxuXG5cdGdldCB0aXRsZSgpXG5cdHtcblx0XHRyZXR1cm4gJCgnI21hdGNoRXhwckJ1aWxkZXJNb2RhbFRpdGxlJywgdGhpcy5fZGlhbG9nKS50ZXh0KCk7XG5cdH1cblxuXHRzZXQgdGl0bGUodmFsdWUpXG5cdHtcblx0XHQkKCcjbWF0Y2hFeHByQnVpbGRlck1vZGFsVGl0bGUnLCB0aGlzLl9kaWFsb2cpLnRleHQodmFsdWUpO1xuXHR9XG5cblx0Z2V0IHByZWRlZmluZWRWYXJOYW1lcygpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fcHJlZGVmaW5lZFZhck5hbWVzO1xuXHR9XG5cblx0c2V0IHByZWRlZmluZWRWYXJOYW1lcyh2YWx1ZSlcblx0e1xuXHRcdHRoaXMuX3ByZWRlZmluZWRWYXJOYW1lcyA9IHZhbHVlO1xuXG5cdFx0dGhpcy5fdmFyTmFtZUNiLnNldERhdGFTb3VyY2UodmFsdWUpO1xuXHR9XG5cblx0Z2V0IGZpbHRlckV4cHJlc3Npb24oKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2ZpbHRlckV4cHJlc3Npb247XG5cdH1cblxuXHRzaG93KClcblx0e1xuXHRcdHRoaXMuX2RpYWxvZy5tb2RhbCh7XG5cdFx0XHRiYWNrZHJvcDogJ3N0YXRpYycsXG5cdFx0XHRrZXlib2FyZDogZmFsc2UsXG5cdFx0XHRzaG93OiB0cnVlXG5cdFx0fSk7XG5cdH1cblxuXHRfb25HcmlkU2VsZWN0aW9uQ2hhbmdlKClcblx0e1xuXHRcdGxldCBzZWxlY3RlZFJvd3MgPSB0aGlzLl9ncmlkLnNlbGVjdCgpO1xuXHRcdGxldCBzZWxlY3RlZERhdGFJdGVtcyA9IFtdO1xuXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3RlZFJvd3MubGVuZ3RoOyBpKyspXG5cdFx0e1xuXHRcdFx0bGV0IGRhdGFJdGVtID0gdGhpcy5fZ3JpZC5kYXRhSXRlbShzZWxlY3RlZFJvd3NbaV0pO1xuXHRcdFx0c2VsZWN0ZWREYXRhSXRlbXMucHVzaChkYXRhSXRlbSk7XG5cdFx0fVxuXG5cdFx0Ly8gRW5hYmxlL2Rpc2FibGUgcmVtb3ZlIGJ1dHRvblxuXHRcdCQoJyNtYXRjaEV4cHJSZW1vdmVCdCcsIHRoaXMuX2RpYWxvZykuYXR0cignZGlzYWJsZWQnLCBzZWxlY3RlZERhdGFJdGVtcy5sZW5ndGggPT0gMCk7XG5cdH1cblxuXHRfb25BZGRCdENsaWNrKClcblx0e1xuXHRcdGlmICh0aGlzLl92YXJOYW1lQ2IudmFsdWUoKSAhPSAnJyAmJiB0aGlzLl90eXBlRGQuc2VsZWN0KCkpXG5cdFx0e1xuXHRcdFx0Ly8gVmFyaWFibGUgbmFtZSBhbmQgbGFiZWxcblx0XHRcdGxldCB2YXJOYW1lLCB2YXJMYWJlbDtcblxuXHRcdFx0aWYgKHRoaXMuX3Zhck5hbWVDYi5zZWxlY3QoKSA+IC0xKVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgZGF0YUl0ZW0gPSB0aGlzLl92YXJOYW1lQ2IuZGF0YUl0ZW0odGhpcy5fdmFyTmFtZUNiLnNlbGVjdCgpKTtcblx0XHRcdFx0dmFyTmFtZSA9IGRhdGFJdGVtLnZhbHVlO1xuXHRcdFx0XHR2YXJMYWJlbCA9IGRhdGFJdGVtLmxhYmVsO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHR2YXJOYW1lID0gdmFyTGFiZWwgPSB0aGlzLl92YXJOYW1lQ2IudmFsdWUoKTtcblxuXHRcdFx0Ly8gVmFyaWFibGUgdHlwZSdzIGxhYmVsXG5cdFx0XHRsZXQgdHlwZUxhYmVsID0gdGhpcy5fdHlwZURkLmRhdGFJdGVtKHRoaXMuX3R5cGVEZC5zZWxlY3QoKSkubGFiZWw7XG5cblx0XHRcdC8vIE1hdGNoIGNvbmRpdGlvblxuXHRcdFx0bGV0IGNvbmRpdGlvbiA9IHRoaXMuX2NvbmRpdGlvbkRkLmRhdGFJdGVtKHRoaXMuX2NvbmRpdGlvbkRkLnNlbGVjdCgpKS5fdmFsdWU7XG5cblx0XHRcdC8vIEV4cHJlc3Npb24gb3BlcmF0b3Jcblx0XHRcdGxldCBvcGVyYXRvciA9IHRoaXMuX2dyaWQuZGF0YVNvdXJjZS50b3RhbCgpID4gMCA/ICQoJ2lucHV0W25hbWU9b3BlcmF0b3JSQkddOmNoZWNrZWQnLCB0aGlzLl9kaWFsb2cpLnZhbCgpIDogbnVsbDtcblxuXHRcdFx0Ly8gVmFyaWFibGUgdmFsdWVcblx0XHRcdGxldCB2YWwgPSB0aGlzLl92YWx1ZUluLnZhbCgpO1xuXHRcdFx0bGV0IHZhclZhbHVlO1xuXG5cdFx0XHRpZiAoY29uZGl0aW9uIGluc3RhbmNlb2YgU0ZTMlguQm9vbE1hdGNoKVxuXHRcdFx0XHR2YXJWYWx1ZSA9ICh2YWwgPT0gJ3RydWUnID8gdHJ1ZSA6IGZhbHNlKTtcblx0XHRcdGVsc2UgaWYgKGNvbmRpdGlvbiBpbnN0YW5jZW9mIFNGUzJYLk51bWJlck1hdGNoKVxuXHRcdFx0XHR2YXJWYWx1ZSA9IChpc05hTihOdW1iZXIodmFsKSkgPyAwIDogTnVtYmVyKHZhbCkpO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHR2YXJWYWx1ZSA9IHZhbDtcblxuXHRcdFx0Ly8gQWRkIGl0ZW0gdG8gZ3JpZFxuXHRcdFx0bGV0IGV4cHJQYXJ0ID0gdGhpcy5fZ2V0RXhwcmVzc2lvblBhcnQodmFyTGFiZWwsIHZhck5hbWUsIHZhclZhbHVlLCB0eXBlTGFiZWwsIGNvbmRpdGlvbiwgb3BlcmF0b3IpO1xuXHRcdFx0dGhpcy5fZ3JpZC5kYXRhU291cmNlLmFkZChleHByUGFydCk7XG5cblx0XHRcdC8vIFJlc2V0IGlucHV0c1xuXHRcdFx0dGhpcy5fdmFyTmFtZUNiLnZhbHVlKCcnKTtcblx0XHRcdHRoaXMuX3ZhbHVlSW4udmFsKCcnKTtcblxuXHRcdFx0Ly8gRW5hYmxlIG9wZXJhdG9yIHJhZGlvIGJ1dHRvbnNcblx0XHRcdHRoaXMuX2VuYWJsZU9wZXJhdG9yUmIodHJ1ZSk7XG5cdFx0fVxuXHR9XG5cblx0X29uQXBwbHlCdENsaWNrKClcblx0e1xuXHRcdC8vIEhpZGUgZGlhbG9nXG5cdFx0dGhpcy5fZGlhbG9nLm1vZGFsKCdoaWRlJyk7XG5cblx0XHQvLyBDbGVhciBncmlkIHNlbGVjdGlvblxuXHRcdHRoaXMuX2dyaWQuY2xlYXJTZWxlY3Rpb24oKTtcblxuXHRcdC8vIEJ1aWxkIGZpbmFsIG1hdGNoIGV4cHJlc3Npb25cblx0XHR0aGlzLl9maWx0ZXJFeHByZXNzaW9uID0gbnVsbDtcblxuXHRcdGlmICh0aGlzLl9ncmlkLmRhdGFTb3VyY2UudG90YWwoKSA+IDApXG5cdFx0e1xuXHRcdFx0bGV0IGV4cFBhcnQgPSB0aGlzLl9ncmlkLmRhdGFTb3VyY2UuYXQoMCk7XG5cdFx0XHR0aGlzLl9maWx0ZXJFeHByZXNzaW9uID0gbmV3IFNGUzJYLk1hdGNoRXhwcmVzc2lvbihleHBQYXJ0Lm5hbWUsIGV4cFBhcnQuX2NvbmRpdGlvbiwgZXhwUGFydC52YWx1ZSk7XG5cblx0XHRcdGZvciAobGV0IGkgPSAxOyBpIDwgdGhpcy5fZ3JpZC5kYXRhU291cmNlLnRvdGFsKCk7IGkrKylcblx0XHRcdHtcblx0XHRcdFx0ZXhwUGFydCA9IHRoaXMuX2dyaWQuZGF0YVNvdXJjZS5hdChpKTtcblxuXHRcdFx0XHRpZiAoZXhwUGFydC5vcGVyYXRvciA9PSBTRlMyWC5Mb2dpY09wZXJhdG9yLkFORC5pZClcblx0XHRcdFx0XHR0aGlzLl9maWx0ZXJFeHByZXNzaW9uID0gdGhpcy5fZmlsdGVyRXhwcmVzc2lvbi5hbmQoZXhwUGFydC5uYW1lLCBleHBQYXJ0Ll9jb25kaXRpb24sIGV4cFBhcnQudmFsdWUpO1xuXHRcdFx0XHRlbHNlIGlmIChleHBQYXJ0Lm9wZXJhdG9yID09IFNGUzJYLkxvZ2ljT3BlcmF0b3IuT1IuaWQpXG5cdFx0XHRcdFx0dGhpcy5fZmlsdGVyRXhwcmVzc2lvbiA9IHRoaXMuX2ZpbHRlckV4cHJlc3Npb24ub3IoZXhwUGFydC5uYW1lLCBleHBQYXJ0Ll9jb25kaXRpb24sIGV4cFBhcnQudmFsdWUpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEZpcmUgZXZlbnRcblx0XHRsZXQgZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KHRoaXMuRVhQUkVTU0lPTl9VUERBVEVEX0VWRU5ULCB7XG5cdFx0ICAgIFx0ZGV0YWlsOiBudWxsLFxuXHRcdFx0XHRidWJibGVzOiBmYWxzZSxcblx0XHRcdFx0Y2FuY2VsYWJsZTogZmFsc2Vcblx0XHRcdH0pO1xuXG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KGV2dCk7XG5cdH1cblxuXHRfb25SZW1vdmVCdENsaWNrKClcblx0e1xuXHRcdGxldCBkYXRhSXRlbSA9IHRoaXMuX2dyaWQuZGF0YUl0ZW0odGhpcy5fZ3JpZC5zZWxlY3QoKSk7XG5cdFx0dGhpcy5fZ3JpZC5kYXRhU291cmNlLnJlbW92ZShkYXRhSXRlbSk7XG5cblx0XHQvLyBDbGVhciBncmlkIHNlbGVjdGlvblxuXHRcdHRoaXMuX2dyaWQuY2xlYXJTZWxlY3Rpb24oKTtcblxuXHRcdGlmICh0aGlzLl9ncmlkLmRhdGFTb3VyY2UudG90YWwoKSA9PSAwKVxuXHRcdHtcblx0XHRcdC8vIERpc2FibGUgb3BlcmF0b3IgcmFkaW8gYnV0dG9uc1xuXHRcdFx0dGhpcy5fZW5hYmxlT3BlcmF0b3JSYihmYWxzZSk7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHQvLyBSZXNldCBvcGVyYXRvciBvbiBmaXJzdCBlbnRyeVxuXHRcdFx0dGhpcy5fZ3JpZC5kYXRhU291cmNlLmF0KDApLm9wZXJhdG9yID0gbnVsbDtcblx0XHRcdHRoaXMuX2dyaWQucmVmcmVzaCgpO1xuXHRcdH1cblx0fVxuXG5cdF9vbkNsZWFyQnRDbGljaygpXG5cdHtcblx0XHQvLyBSZXNldCBmb3JtXG5cdFx0JCgnI2FuZE9wZXJhdG9yUkInLCB0aGlzLl9kaWFsb2cpLmF0dHIoJ2NoZWNrZWQnLCB0cnVlKTtcblx0XHQkKCcjb3JPcGVyYXRvclJCJywgdGhpcy5fZGlhbG9nKS5hdHRyKCdjaGVja2VkJywgZmFsc2UpO1xuXHRcdHRoaXMuX2VuYWJsZU9wZXJhdG9yUmIoZmFsc2UpO1xuXG5cdFx0dGhpcy5fdmFyTmFtZUNiLnZhbHVlKCcnKTtcblx0XHR0aGlzLl90eXBlRGQuc2VsZWN0KDApO1xuXHRcdHRoaXMuX2NvbmRpdGlvbkRkLnNlbGVjdCgwKTtcblxuXHRcdHRoaXMuX3ZhbHVlSW4udmFsKCcnKTtcblxuXHRcdC8vIENsZWFyIGdyaWQgc2VsZWN0aW9uXG5cdFx0dGhpcy5fZ3JpZC5jbGVhclNlbGVjdGlvbigpO1xuXG5cdFx0Ly8gQ2xlYXIgdGFibGVcblx0XHR0aGlzLl9ncmlkLnNldERhdGFTb3VyY2UoW10pO1xuXHR9XG5cblx0X2dldEV4cHJlc3Npb25QYXJ0KHZhckxhYmVsLCB2YXJOYW1lLCB2YXJWYWx1ZSwgdHlwZUxhYmVsLCBjb25kaXRpb24sIG9wZXJhdG9yKVxuXHR7XG5cdFx0cmV0dXJuIHtcblx0XHRcdCdsYWJlbCc6IHZhckxhYmVsLFxuXHRcdFx0J25hbWUnOiB2YXJOYW1lLFxuXHRcdFx0J3ZhbHVlJzogdmFyVmFsdWUsXG5cdFx0XHQndHlwZUxhYmVsJzogdHlwZUxhYmVsLFxuXHRcdFx0J3N5bWJvbCc6IGNvbmRpdGlvbi5zeW1ib2wsXG5cdFx0XHQnb3BlcmF0b3InOiBvcGVyYXRvcixcblx0XHRcdCdfY29uZGl0aW9uJzogY29uZGl0aW9uLFxuXHRcdH07XG5cdH1cblxuXHRfZW5hYmxlT3BlcmF0b3JSYihlbmFibGUpXG5cdHtcblx0XHQkKCcjYW5kT3BlcmF0b3JSQicsIHRoaXMuX2RpYWxvZykuYXR0cignZGlzYWJsZWQnLCAhZW5hYmxlKTtcblx0XHQkKCcjb3JPcGVyYXRvclJCJywgdGhpcy5fZGlhbG9nKS5hdHRyKCdkaXNhYmxlZCcsICFlbmFibGUpO1xuXHR9XG59XG5cbi8vIERFRklORSBDT01QT05FTlRcbmlmICghd2luZG93LmN1c3RvbUVsZW1lbnRzLmdldCgnbWF0Y2gtZXhwcmVzc2lvbi1idWlsZGVyJykpXG5cdHdpbmRvdy5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ21hdGNoLWV4cHJlc3Npb24tYnVpbGRlcicsIE1hdGNoRXhwcmVzc2lvbkJ1aWxkZXIpO1xuIiwiZXhwb3J0IGNsYXNzIFNpZGViYXJMYXlvdXQgZXh0ZW5kcyBIVE1MRWxlbWVudFxue1xuXHRjb25zdHJ1Y3RvcigpXG5cdHtcblx0ICAgIHN1cGVyKCk7XG5cblx0XHQvLyBBdHRhY2ggYSBzaGFkb3cgcm9vdFxuXHRcdGNvbnN0IHNoYWRvd1Jvb3QgPSB0aGlzLmF0dGFjaFNoYWRvdyh7bW9kZTogJ29wZW4nfSk7XG5cdFx0c2hhZG93Um9vdC5pbm5lckhUTUwgPSBgXG5cdFx0XHQ8c3R5bGU+XG5cdFx0XHRcdDpob3N0IHtcblx0XHRcdFx0XHRkaXNwbGF5OiBmbGV4O1xuXHRcdFx0XHRcdGZsZXgtZGlyZWN0aW9uOiByb3c7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRAbWVkaWEgKG1heC13aWR0aDogNTc1Ljk4cHgpIHtcblx0XHRcdFx0XHQ6aG9zdCguc3BsaXQteHMpIDo6c2xvdHRlZCg6bm90KFthcmlhLXNlbGVjdGVkPVwidHJ1ZVwiXSkpIHtcblx0XHRcdFx0XHRcdGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcblx0XHRcdFx0ICAgIH1cblxuXHRcdFx0XHRcdDpob3N0KC5zcGxpdC14cykgOjpzbG90dGVkKFthcmlhLXNlbGVjdGVkPVwidHJ1ZVwiXSkge1xuXHRcdFx0XHRcdFx0ZmxleC1ncm93OiAxO1xuXHRcdFx0XHQgICAgfVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0QG1lZGlhIChtYXgtd2lkdGg6IDc2Ny45OHB4KSB7XG5cdFx0XHRcdFx0Omhvc3QoLnNwbGl0LXNtKSA6OnNsb3R0ZWQoOm5vdChbYXJpYS1zZWxlY3RlZD1cInRydWVcIl0pKSB7XG5cdFx0XHRcdFx0XHRkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG5cdFx0XHRcdCAgICB9XG5cblx0XHRcdFx0XHQ6aG9zdCguc3BsaXQtc20pIDo6c2xvdHRlZChbYXJpYS1zZWxlY3RlZD1cInRydWVcIl0pIHtcblx0XHRcdFx0XHRcdGZsZXgtZ3JvdzogMTtcblx0XHRcdFx0ICAgIH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdEBtZWRpYSAobWF4LXdpZHRoOiA5OTEuOThweCkge1xuXHRcdFx0XHRcdDpob3N0KC5zcGxpdC1tZCkgOjpzbG90dGVkKDpub3QoW2FyaWEtc2VsZWN0ZWQ9XCJ0cnVlXCJdKSkge1xuXHRcdFx0XHRcdFx0ZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xuXHRcdFx0XHQgICAgfVxuXG5cdFx0XHRcdFx0Omhvc3QoLnNwbGl0LW1kKSA6OnNsb3R0ZWQoW2FyaWEtc2VsZWN0ZWQ9XCJ0cnVlXCJdKSB7XG5cdFx0XHRcdFx0XHRmbGV4LWdyb3c6IDE7XG5cdFx0XHRcdCAgICB9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRAbWVkaWEgKG1heC13aWR0aDogMTE5OS45OHB4KSB7XG5cdFx0XHRcdFx0Omhvc3QoLnNwbGl0LWxnKSA6OnNsb3R0ZWQoOm5vdChbYXJpYS1zZWxlY3RlZD1cInRydWVcIl0pKSB7XG5cdFx0XHRcdFx0XHRkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG5cdFx0XHRcdCAgICB9XG5cblx0XHRcdFx0XHQ6aG9zdCguc3BsaXQtbGcpIDo6c2xvdHRlZChbYXJpYS1zZWxlY3RlZD1cInRydWVcIl0pIHtcblx0XHRcdFx0XHRcdGZsZXgtZ3JvdzogMTtcblx0XHRcdFx0ICAgIH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC5zaWRlLWNvbDo6c2xvdHRlZCgqKSB7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQubWFpbi1jb2w6OnNsb3R0ZWQoKikge1xuXHRcdFx0XHRcdGZsZXgtZ3JvdzogMTtcblx0XHRcdFx0fVxuXHRcdFx0PC9zdHlsZT5cblxuXHRcdFx0PHNsb3QgY2xhc3M9XCJzaWRlLWNvbFwiIG5hbWU9XCJzaWRlLWNvbHVtblwiPjwvc2xvdD5cblx0XHRcdDxzbG90IGNsYXNzPVwibWFpbi1jb2xcIiBuYW1lPVwibWFpbi1jb2x1bW5cIj48L3Nsb3Q+XG5cdFx0YDtcblxuXHRcdC8vIFNldCBpbml0aWFsIHNlbGVjdGlvblxuXHRcdHRoaXMuc2VsZWN0ZWRJbmRleCA9IDA7XG5cdH1cblxuXHRnZXQgc2VsZWN0ZWRQYW5lbCgpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fc2VsZWN0ZWRQYW5lbDtcblx0fVxuXG5cdHNldCBzZWxlY3RlZFBhbmVsKGVsZW1lbnQpIC8vICdzaWRlJyBvciAnbWFpbidcblx0e1xuXHRcdGlmIChlbGVtZW50ICE9IG51bGwgJiYgZWxlbWVudC5wYXJlbnROb2RlID09IHRoaXMpXG5cdFx0e1xuXHRcdFx0dGhpcy5fc2VsZWN0ZWRQYW5lbCA9IGVsZW1lbnQ7XG5cblx0XHRcdGZvciAobGV0IGVsZW1lbnQgb2YgdGhpcy5jaGlsZHJlbilcblx0XHRcdHtcblx0XHRcdFx0aWYgKGVsZW1lbnQgPT0gdGhpcy5fc2VsZWN0ZWRQYW5lbClcblx0XHRcdFx0XHRlbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1zZWxlY3RlZCcsICd0cnVlJyk7XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1zZWxlY3RlZCcpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0Y29uc29sZS5lcnJvcignRWxlbWVudCBpcyBub3QgYSBjaGlsZCBvZiBTaWRlYmFyTGF5b3V0Jyk7XG5cdFx0fVxuXHR9XG5cblx0Z2V0IHNlbGVjdGVkSW5kZXgoKVxuXHR7XG5cdFx0cmV0dXJuIEFycmF5LmZyb20odGhpcy5jaGlsZHJlbikuaW5kZXhPZih0aGlzLl9zZWxlY3RlZFBhbmVsKTtcblx0fVxuXG5cdHNldCBzZWxlY3RlZEluZGV4KGluZGV4KVxuXHR7XG5cdFx0aWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID4gMClcblx0XHR7XG5cdFx0XHRpZiAodGhpcy5jaGlsZHJlbltpbmRleF0gPT0gbnVsbClcblx0XHRcdHtcblx0XHRcdFx0Y29uc29sZS5lcnJvcignSW52YWxpZCBTaWRlYmFyTGF5b3V0IGluZGV4Jyk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0bGV0IGVsZW1lbnQgPSB0aGlzLmNoaWxkcmVuW2luZGV4XTtcblx0XHRcdHRoaXMuc2VsZWN0ZWRQYW5lbCA9IGVsZW1lbnQ7XG5cdFx0fVxuXHR9XG59XG5cbi8vIERFRklORSBDT01QT05FTlRcbmlmICghd2luZG93LmN1c3RvbUVsZW1lbnRzLmdldCgnc2lkZWJhci1sYXlvdXQnKSlcblx0d2luZG93LmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnc2lkZWJhci1sYXlvdXQnLCBTaWRlYmFyTGF5b3V0KTtcbiIsImltcG9ydCB7QmFzZU1vZHVsZX0gZnJvbSAnLi9iYXNlLW1vZHVsZSc7XG5pbXBvcnQge1NpZGViYXJMYXlvdXR9IGZyb20gJy4uL2NvbXBvbmVudHMvc2lkZWJhci1sYXlvdXQnO1xuaW1wb3J0IHtNYXRjaEV4cHJlc3Npb25CdWlsZGVyfSBmcm9tICcuLi9jb21wb25lbnRzL21vZHVsZS1zcGVjaWZpYy9tYXRjaC1leHByZXNzaW9uLWJ1aWxkZXInO1xuaW1wb3J0IHtDb25maWdJbnRlcmZhY2VCdWlsZGVyfSBmcm9tICcuLi91dGlscy91aWJ1aWxkZXIvY29uZmlnLWludGVyZmFjZS1idWlsZGVyJztcbmltcG9ydCB7Y2FwaXRhbGl6ZUZpcnN0LCBmaWx0ZXJDbGFzc05hbWUsIHJvdW5kVG9EZWNpbWFscywgc2NhbGVCeXRlc30gZnJvbSAnLi4vdXRpbHMvdXRpbGl0aWVzJztcbmltcG9ydCB7Um9vbVByb3BlcnRpZXNEYXRhLFVzZXJQcm9wZXJ0aWVzRGF0YX0gZnJvbSAnLi4vdXRpbHMvbWF0Y2gtcHJvcGVydGllcyc7XG5pbXBvcnQge1VzZXJDb3VudENoYXJ0fSBmcm9tICcuLi9jb21wb25lbnRzL2NoYXJ0cy91c2VyLWNvdW50LWNoYXJ0JztcbmltcG9ydCB7Z2V0VGltZVJhbmdlVG9vbHRpcFRlbXBsYXRlLCBnZXRXUkJ5dGVzTGFiZWxUZW1wbGF0ZX0gZnJvbSAnLi4vY29tcG9uZW50cy9jaGFydHMvY2hhcnQtdXRpbHMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBab25lTW9uaXRvciBleHRlbmRzIEJhc2VNb2R1bGVcbntcblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdCAgICBzdXBlcignem9uZU1vbml0b3InKTtcblxuXHRcdHRoaXMuTU9OSVRPUkVEX1RZUEVfWk9ORSA9ICd6b25lJztcblx0XHR0aGlzLk1PTklUT1JFRF9UWVBFX1JPT00gPSAncm9vbSc7XG5cdFx0dGhpcy5NT05JVE9SRURfVFlQRV9VU0VSID0gJ3VzZXInO1xuXG5cdFx0dGhpcy5BTllfTEFCRUwgPSAnW2FueV0nO1xuXHRcdHRoaXMuREVGQVVMVF9HUk9VUF9OQU1FID0gJ2RlZmF1bHQnO1xuXHRcdHRoaXMuTUFYX0VYVEVOU0lPTl9MT0dfU0laRSA9IDMwMDtcblx0XHR0aGlzLktJQ0tfQkFOX0RFRkFVTFRfREVMQVkgPSA1O1xuXG5cdFx0Ly8gT3V0Z29pbmcgcmVxdWVzdHNcblx0XHR0aGlzLlJFUV9HRVRfREFUQSA9ICdnZXREYXRhJztcblx0XHR0aGlzLlJFUV9TRVRfWk9ORV9TRVRUSU5HUyA9ICdzZXRab25lU2V0dGluZ3MnO1xuXHRcdHRoaXMuUkVRX1NFVF9ST09NX1NFVFRJTkdTID0gJ3NldFJvb21TZXR0aW5ncyc7XG5cdFx0dGhpcy5SRVFfU0VUX1VTRVJfU0VUVElOR1MgPSAnc2V0VXNlclNldHRpbmdzJztcblx0XHR0aGlzLlJFUV9SRUxPQURfWk9ORV9FWFQgPSAncmVsb2FkWm9uZUV4dCc7XG5cdFx0dGhpcy5SRVFfUkVMT0FEX1dPUkRTID0gJ3JlbG9hZFdvcmRzJztcblx0XHR0aGlzLlJFUV9LSUNLX1VTRVIgPSAna2lja1VzZXInO1xuXHRcdHRoaXMuUkVRX0JBTl9VU0VSID0gJ2JhblVzZXInO1xuXHRcdHRoaXMuUkVRX0dFVF9ST09NX0NPTkZJRyA9ICdnZXRSb29tQ29uZmlnJztcblx0XHR0aGlzLlJFUV9DUkVBVEVfUk9PTSA9ICdjcmVhdGVSb29tJztcblx0XHR0aGlzLlJFUV9SRU1PVkVfUk9PTSA9ICdyZW1vdmVSb29tJztcblx0XHR0aGlzLlJFUV9BRE1JTl9NU0cgPSAnYWRtaW5Nc2cnO1xuXG5cdFx0Ly8gSW5jb21pbmcgcmVzcG9uc2VzXG5cdFx0dGhpcy5SRVNQX0RBVEEgPSAnZGF0YSc7XG5cdFx0dGhpcy5SRVNQX1VORVhQRUNURURfRVJST1IgPSAndW5leHBFcnJvcic7XG5cdFx0dGhpcy5SRVNQX1VQREFURV9FUlJPUiA9ICd1cGRhdGVFcnJvcic7XG5cdFx0dGhpcy5SRVNQX1JPT01fQ09ORklHID0gJ3Jvb21Db25maWcnO1xuXHRcdHRoaXMuUkVTUF9ST09NX0NPTkZJR19FUlJPUiA9ICdyb29tQ29uZmlnRXJyJztcblx0XHR0aGlzLlJFU1BfUk9PTV9DUkVBVEVEID0gJ3Jvb21DcmVhdGVkJztcblx0XHR0aGlzLlJFU1BfUk9PTV9DUkVBVElPTl9FUlJPUiA9ICdyb29tRXJyb3InO1xuXHRcdHRoaXMuUkVTUF9MT0dfTUVTU0FHRVMgPSAnbG9nJzsgLy8gVGhpcyByZXNwb25zZSBkb2Vzbid0IGhhdmUgYSBjb3JyZXNwb25kaW5nIHJlcXVlc3QgYmVjYXVzZSBpdCBpcyBtYW5hZ2VkIGJ5IGEgc2VydmVyIGV2ZW50IGxpc3RlbmVyXG5cblx0XHR0aGlzLl9jdXJyZW50UmVxdWVzdElkID0gLTE7XG5cdH1cblxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQvLyBDT01NT04gTU9EVUxFIElOVEVSRkFDRSBNRVRIT0RTXG5cdC8vIFRoaXMgbWVtYmVycyBhcmUgdXNlZCBieSB0aGUgbWFpbiBjb250cm9sbGVyXG5cdC8vIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIG1vZHVsZSdzIGNvbnRyb2xsZXIuXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0aW5pdGlhbGl6ZShpZERhdGEsIHNoZWxsQ29udHJvbGxlcilcblx0e1xuXHRcdC8vIENhbGwgc3VwZXIgbWV0aG9kXG5cdFx0c3VwZXIuaW5pdGlhbGl6ZShpZERhdGEsIHNoZWxsQ29udHJvbGxlcik7XG5cblx0XHQvLyBTZXQgbW9uaXRvcmluZyBpbnRlcmZhY2Vcblx0XHR0aGlzLl9zZXRNb25pdG9yaW5nSW50ZXJmYWNlKCk7XG5cblx0XHQvLyBJbml0aWFsaXplIHByb2dyZXNzIGJhclxuXHRcdCQoJyN6bm0tcHJvZ3Jlc3NCYXInKS5rZW5kb1Byb2dyZXNzQmFyKHtcblx0XHRcdG1pbjogMCxcbiAgICAgICAgICAgIG1heDogMTAwLFxuXHRcdFx0dmFsdWU6IGZhbHNlLFxuICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJyxcbiAgICAgICAgICAgIGFuaW1hdGlvbjoge1xuICAgICAgICAgICAgICAgIGR1cmF0aW9uOiA0MDBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cblx0XHQvLyBMSVNUU1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBpbnRlcnZhbCBkcm9wZG93blxuXHRcdHRoaXMuX2ludGVydmFsRHJvcERvd24gPSAkKCcjem5tLWludGVydmFsREQnKS5rZW5kb0Ryb3BEb3duTGlzdCh7XG5cdFx0XHR2YWx1ZVRlbXBsYXRlOiAnPHNwYW4gY2xhc3M9XCJ0ZXh0LW11dGVkIHByLTFcIj5JbnRlcnZhbDo8L3NwYW4+PHNwYW4+IzpkYXRhLnRleHQjPC9zcGFuPicsXG5cdFx0XHRjaGFuZ2U6ICQucHJveHkodGhpcy5fb25VcGRhdGVJbnRlcnZhbENoYW5nZSwgdGhpcylcblx0XHR9KS5kYXRhKCdrZW5kb0Ryb3BEb3duTGlzdCcpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBwYW5lIGJhclxuXHRcdHRoaXMuX2FjY29yZGlvbiA9ICQoJyN6bm0tcGFuZWxiYXInKS5rZW5kb1BhbmVsQmFyKHtcbiAgICAgICAgICAgIGV4cGFuZE1vZGU6ICdzaW5nbGUnLFxuXHRcdFx0Y2hhbmdlOiAkLnByb3h5KHRoaXMuX29uRW50aXRpZXNQYW5lbENoYW5nZSwgdGhpcylcbiAgICAgICAgfSkuZGF0YSgna2VuZG9QYW5lbEJhcicpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBsaXN0c1xuXHRcdHRoaXMuX3pvbmVMaXN0Qm94ID0gJChcIiN6bm0tem9uZUxpc3RcIikua2VuZG9MaXN0Qm94KHtcblx0XHRcdHRlbXBsYXRlOiAnPGRpdj4jOmRhdGEubmFtZSMgKCM6ZGF0YS51c2VycyMpPC9kaXY+Jyxcblx0XHRcdGNoYW5nZTogJC5wcm94eSh0aGlzLl9vblpvbmVTZWxlY3RlZCwgdGhpcylcblx0XHR9KS5kYXRhKCdrZW5kb0xpc3RCb3gnKTtcblxuXHRcdHRoaXMuX3pvbmVMaXN0Qm94LndyYXBwZXIuZmluZCgnLmstbGlzdCcpLm9uKCdkYmxjbGljaycsICcuay1pdGVtJywgJC5wcm94eSh0aGlzLl9vbk1vbml0b3JTZWxlY3Rpb25CdENsaWNrLCB0aGlzKSk7XG5cblx0XHR0aGlzLl9yb29tTGlzdEJveCA9ICQoXCIjem5tLXJvb21MaXN0XCIpLmtlbmRvTGlzdEJveCh7XG5cdFx0XHR0ZW1wbGF0ZTogJzxkaXY+IzpkYXRhLm5hbWUjICgjOmRhdGEudXNlcnMjKTwvZGl2PicsXG5cdFx0XHRjaGFuZ2U6ICQucHJveHkodGhpcy5fb25Sb29tU2VsZWN0ZWQsIHRoaXMpXG5cdFx0fSkuZGF0YSgna2VuZG9MaXN0Qm94Jyk7XG5cblx0XHR0aGlzLl9yb29tTGlzdEJveC53cmFwcGVyLmZpbmQoJy5rLWxpc3QnKS5vbignZGJsY2xpY2snLCAnLmstaXRlbScsICQucHJveHkodGhpcy5fb25Nb25pdG9yU2VsZWN0aW9uQnRDbGljaywgdGhpcykpO1xuXG5cdFx0dGhpcy5fdXNlckxpc3RCb3ggPSAkKFwiI3pubS11c2VyTGlzdFwiKS5rZW5kb0xpc3RCb3goe1xuXHRcdFx0dGVtcGxhdGU6ICc8ZGl2PiM6ZGF0YS5uYW1lIzwvZGl2PicsXG5cdFx0XHRjaGFuZ2U6ICQucHJveHkodGhpcy5fb25Vc2VyU2VsZWN0ZWQsIHRoaXMpXG5cdFx0fSkuZGF0YSgna2VuZG9MaXN0Qm94Jyk7XG5cblx0XHR0aGlzLl91c2VyTGlzdEJveC53cmFwcGVyLmZpbmQoJy5rLWxpc3QnKS5vbignZGJsY2xpY2snLCAnLmstaXRlbScsICQucHJveHkodGhpcy5fb25Nb25pdG9yU2VsZWN0aW9uQnRDbGljaywgdGhpcykpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBSb29tIEdyb3VwcyBkcm9wZG93blxuXHRcdHRoaXMuX2dyb3Vwc0Ryb3BEb3duID0gJCgnI3pubS1yb29tR3JvdXBzREQnKS5rZW5kb0Ryb3BEb3duTGlzdCh7XG5cdFx0XHRkYXRhVGV4dEZpZWxkOiAnbGFiZWwnLFxuICBcdFx0XHRkYXRhVmFsdWVGaWVsZDogJ25hbWUnLFxuXHRcdFx0Y2hhbmdlOiAkLnByb3h5KHRoaXMuX29uR3JvdXBDaGFuZ2UsIHRoaXMpXG5cdFx0fSkuZGF0YSgna2VuZG9Ecm9wRG93bkxpc3QnKTtcblxuXHRcdC8vIEJ1aWxkIGluaXRpYWwgZ3JvdXBzIGxpc3Rcblx0XHR0aGlzLl9zZXRHcm91cHNEYXRhUHJvdmlkZXIobnVsbCk7XG5cblx0XHQvLyAvLyBDcmVhdGUgaW50ZXJmYWNlIGJ1aWxkZXIgaW5zdGFuY2VzXG5cdFx0dGhpcy5faW50ZXJmYWNlQnVpbGRlciA9IG5ldyBDb25maWdJbnRlcmZhY2VCdWlsZGVyKCk7XG5cdFx0dGhpcy5fcm9vbUNyZWF0aW9uSUJ1aWxkZXIgPSBuZXcgQ29uZmlnSW50ZXJmYWNlQnVpbGRlcigpO1xuXG5cdFx0Ly8gQWRkIGxpc3RlbmVyIHRvIHNob3cgbGltaXQgd2FybmluZyB0b29sdGlwc1xuXHRcdCQoJyN6bm0tcGFuZWxiYXInKS5rZW5kb1Rvb2x0aXAoe1xuXHRcdFx0ZmlsdGVyOiAnaVt0aXRsZV0ubGltaXQtd2FybmluZycsXG5cdFx0XHRwb3NpdGlvbjogJ3JpZ2h0Jyxcblx0XHRcdHdpZHRoOiAnMjUwcHgnLFxuXHRcdFx0Y29udGVudDogZnVuY3Rpb24oZSkge1xuXHRcdFx0XHRyZXR1cm4gYDxkaXYgY2xhc3M9XCJoZWxwLXRvb2x0aXBcIj4ke2UudGFyZ2V0LmRhdGEoJ3RpdGxlJyl9PC9kaXY+YDtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdC8vIFJPT00gQ1JFQVRJT04gUEFORUxcblxuXHRcdC8vIEFkZCBjbGljayBsaXN0ZW5lciB0byBDcmVhdGUgJiBSZW1vdmUgUm9vbSBidXR0b25zXG5cdFx0JCgnI3pubS1jcmVhdGVSb29tQnQnKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uQ3JlYXRlUm9vbUJ0Q2xpY2ssIHRoaXMpKTtcblx0XHQkKCcjem5tLXJlbW92ZVJvb21CdCcpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25SZW1vdmVSb29tQnRDbGljaywgdGhpcykpO1xuXG5cdFx0Ly8gQ29uZmlndXJlIHJvb20gY3JlYXRpb24gcGFuZWxcblx0XHQkKCcjem5tLWNyZWF0ZVJvb21Nb2RhbCcpLm1vZGFsKHtcblx0XHRcdGJhY2tkcm9wOiAnc3RhdGljJyxcblx0XHRcdGtleWJvYXJkOiBmYWxzZSxcblx0XHRcdHNob3c6IGZhbHNlLFxuXHRcdH0pO1xuXG5cdFx0Ly8gQWRkIGxpc3RlbmVyIGZvciByb29tIGNyZWF0aW9uIHBhbmVsJ3MgY3JlYXRlIGJ1dHRvbiBjbGlja1xuXHRcdCQoJyN6bm0tcm9vbUNyZWF0b3JDcmVhdGVCdCcpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25Sb29tQ3JlYXRvckNyZWF0ZUJ0Q2xpY2ssIHRoaXMpKTtcblxuXHRcdC8vIEFkZCBsaXN0ZW5lciBmb3Igcm9vbSBjcmVhdGlvbiBwYW5lbCBoaWRlXG5cdFx0JCgnI3pubS1jcmVhdGVSb29tTW9kYWwnKS5vbignaGlkZGVuLmJzLm1vZGFsJywgJC5wcm94eSh0aGlzLl9vbkNyZWF0ZVJvb21Nb2RhbEhpZGRlbiwgdGhpcykpO1xuXG5cdFx0Ly8gUk9PTSAmIFVTRVIgRklMVEVSSU5HIFBBTkVMU1xuXG5cdFx0Ly8gU2V0dXAgbWF0Y2ggZXhwcmVzc2lvbiBidWlsZGVyIHBhbmVsIGZvciByb29tc1xuXHRcdHRoaXMuX3Jvb21GaWx0ZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnem5tLXJvb21GaWx0ZXInKTtcblx0XHR0aGlzLl9yb29tRmlsdGVyLnRpdGxlID0gJ1Jvb20gRmlsdGVyIEV4cHJlc3Npb24gQnVpbGRlcic7XG5cdFx0dGhpcy5fcm9vbUZpbHRlci5wcmVkZWZpbmVkVmFyTmFtZXMgPSBSb29tUHJvcGVydGllc0RhdGEucHJvcGVydGllc0FycmF5O1xuXHRcdCQodGhpcy5fcm9vbUZpbHRlcikub24odGhpcy5fcm9vbUZpbHRlci5FWFBSRVNTSU9OX1VQREFURURfRVZFTlQsICQucHJveHkodGhpcy5fb25Sb29tRmlsdGVyVXBkYXRlZCwgdGhpcykpO1xuXG5cdFx0JCgnI3pubS1maWx0ZXJSb29tQnQnKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uU2hvd1Jvb21GaWx0ZXJCdENsaWNrLCB0aGlzKSk7XG5cdFx0JCgnI3pubS1hcHBseVJvb21GaWx0ZXJDQicpLm9uKCdjaGFuZ2UnLCAkLnByb3h5KHRoaXMuX29uQXBwbHlCdENoYW5nZSwgdGhpcykpO1xuXG5cdFx0Ly8gU2V0dXAgbWF0Y2ggZXhwcmVzc2lvbiBidWlsZGVyIHBhbmVsIGZvciB1c2Vyc1xuXHRcdHRoaXMuX3VzZXJGaWx0ZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnem5tLXVzZXJGaWx0ZXInKTtcblx0XHR0aGlzLl91c2VyRmlsdGVyLnRpdGxlID0gJ1VzZXIgRmlsdGVyIEV4cHJlc3Npb24gQnVpbGRlcic7XG5cdFx0dGhpcy5fdXNlckZpbHRlci5wcmVkZWZpbmVkVmFyTmFtZXMgPSBVc2VyUHJvcGVydGllc0RhdGEucHJvcGVydGllc0FycmF5O1xuXHRcdCQodGhpcy5fdXNlckZpbHRlcikub24odGhpcy5fdXNlckZpbHRlci5FWFBSRVNTSU9OX1VQREFURURfRVZFTlQsICQucHJveHkodGhpcy5fb25Vc2VyRmlsdGVyVXBkYXRlZCwgdGhpcykpO1xuXG5cdFx0JCgnI3pubS1maWx0ZXJVc2VyQnQnKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uU2hvd1VzZXJGaWx0ZXJCdENsaWNrLCB0aGlzKSk7XG5cdFx0JCgnI3pubS1hcHBseVVzZXJGaWx0ZXJDQicpLm9uKCdjaGFuZ2UnLCAkLnByb3h5KHRoaXMuX29uQXBwbHlCdENoYW5nZSwgdGhpcykpO1xuXG5cdFx0Ly8gTUFJTiBDT05UUk9MU1xuXG5cdFx0JCgnI3pubS1tb25pdG9yQnQnKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uTW9uaXRvclNlbGVjdGlvbkJ0Q2xpY2ssIHRoaXMpKTtcblx0XHQkKCcjem5tLXNlbmRNZXNzYWdlQnQnKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uU2VuZEFkbWluTXNnQnRDbGljaywgdGhpcykpO1xuXHRcdCQoJyN6bm0tbWVzc2FnZUluJykub24oJ2tleXVwJywgJC5wcm94eSh0aGlzLl9vblNlbmRBZG1pbk1zZ0luS2V5VXAsIHRoaXMpKTtcblxuXHRcdC8vIE1PTklUT1JJTkcgQ09OVFJPTFNcblxuXHRcdCQoJyN6bm0tY2xvc2VNb25pdG9yQnQnKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uQ2xvc2VNb25pdG9yQnRDbGljaywgdGhpcykpO1xuXHRcdCQoJyN6bm0tZWRpdEJ0Jykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vbkVkaXRCdENsaWNrLCB0aGlzKSk7XG5cdFx0JCgnI3pubS1jYW5jZWxCdCcpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25DYW5jZWxCdENsaWNrLCB0aGlzKSk7XG5cdFx0JCgnI3pubS1zdWJtaXRCdCcpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25TdWJtaXRCdENsaWNrLCB0aGlzKSk7XG5cblx0XHQvLyBIaWRlIGVkaXQgY29udHJvbHNcblx0XHQkKCcjem5tLWVkaXRDb250cm9scycpLmhpZGUoKTtcblxuXHRcdC8vIFpPTkUgTU9OSVRPUiAtLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRcdC8vIFNldCByZWZlcmVuY2UgdG8gdXNlciBjb3VudCBjaGFydFxuXHRcdHRoaXMuX3VzZXJDb3VudENoYXJ0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3pubS11c2VyQ291bnRDaGFydCcpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSB0aW1lIHJhbmdlIHNsaWRlclxuXHRcdHRoaXMuX3RpbWVTbGlkZXIgPSAkKCcjem5tLXRpbWVTbGlkZXInKS5rZW5kb1JhbmdlU2xpZGVyKHtcblx0XHRcdG1pbjogLTI0LFxuICAgICAgICAgICAgbWF4OiAwLFxuICAgICAgICAgICAgc21hbGxTdGVwOiAxLFxuICAgICAgICAgICAgbGFyZ2VTdGVwOiAwLFxuXHRcdFx0Y2hhbmdlOiAkLnByb3h5KHRoaXMuX29uVGltZVJhbmdlQ2hhbmdlLCB0aGlzKSxcblx0XHRcdHRvb2x0aXA6IHtcblx0XHRcdFx0dGVtcGxhdGU6IGdldFRpbWVSYW5nZVRvb2x0aXBUZW1wbGF0ZSgpXG5cdFx0XHR9LFxuXHRcdFx0bGVmdERyYWdIYW5kbGVUaXRsZTogJ0RyYWcnLFxuXHRcdFx0cmlnaHREcmFnSGFuZGxlVGl0bGU6ICdEcmFnJyxcblx0XHR9KS5kYXRhKCdrZW5kb1JhbmdlU2xpZGVyJyk7XG5cblx0XHQvLyBSZXNldCB0aW1lIHJhbmdlIG9uIHVzZXIgY291bnQgY2hhcnRcblx0XHR0aGlzLl9vblRpbWVSYW5nZUNoYW5nZSgpO1xuXG5cdFx0Ly8gQWRkIGJ1dHRvbiBjbGljayBsaXN0ZW5lcnNcblx0XHQkKCcjem5tLXJlbG9hZFdvcmRzQnQnKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uV29yZHNSZWxvYWRCdENsaWNrLCB0aGlzKSk7XG5cdFx0JCgnI3pubS1yZWxvYWRab25lRXh0QnQnKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uWm9uZUV4dFJlbG9hZEJ0Q2xpY2ssIHRoaXMpKTtcblxuXHRcdC8vIEluaXRpYWxpemUgZXh0ZW5zaW9uIGxvZyBncmlkXG5cdFx0dGhpcy5fem9uZUV4dExvZ0dyaWQgPSAkKCcjem5tLXpvbmVFeHRMb2dHcmlkJykua2VuZG9HcmlkKHtcblx0XHRcdGRhdGFTb3VyY2U6IFtdLFxuXHRcdFx0cmVzaXphYmxlOiB0cnVlLFxuXHRcdFx0c2VsZWN0YWJsZTogZmFsc2UsXG5cdFx0XHRub1JlY29yZHM6IHtcblx0XHRcdFx0dGVtcGxhdGU6ICdObyBlbnRyaWVzLidcblx0XHRcdH0sXG5cdFx0XHRjb2x1bW5zOiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRmaWVsZDogJ3RpbWVzdGFtcCcsXG5cdFx0XHRcdFx0dGl0bGU6ICdUaW1lc3RhbXAnLFxuXHRcdFx0XHRcdHdpZHRoOiAxODBcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGZpZWxkOiAnbGV2ZWwnLFxuXHRcdFx0XHRcdHRpdGxlOiAnTGV2ZWwnLFxuXHRcdFx0XHRcdHdpZHRoOiAxMDBcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGZpZWxkOiAnbWVzc2FnZScsXG5cdFx0XHRcdFx0dGl0bGU6ICdNZXNzYWdlJyxcblx0XHRcdFx0XHR3aWR0aDogNDAwXG5cdFx0XHRcdH0sXG5cdFx0XHRdLFxuXHRcdFx0ZGF0YUJvdW5kOiBmdW5jdGlvbigpIHtcblx0XHRcdCAgICB0aGlzLmNvbnRlbnQuc2Nyb2xsVG9wKHRoaXMudGJvZHkuaGVpZ2h0KCkpOyAvLyBTY3JvbGwgdG8gYm90dG9tXG5cdFx0XHR9XG5cdFx0fSkuZGF0YSgna2VuZG9HcmlkJyk7XG5cblx0XHQvLyBST09NIE1PTklUT1IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0XHQvLyBJbml0aWFsaXplIGV4dGVuc2lvbiBsb2cgZ3JpZFxuXHRcdHRoaXMuX3Jvb21FeHRMb2dHcmlkID0gJCgnI3pubS1yb29tRXh0TG9nR3JpZCcpLmtlbmRvR3JpZCh7XG5cdFx0XHRkYXRhU291cmNlOiBbXSxcblx0XHRcdHJlc2l6YWJsZTogdHJ1ZSxcblx0XHRcdHNlbGVjdGFibGU6IGZhbHNlLFxuXHRcdFx0bm9SZWNvcmRzOiB7XG5cdFx0XHRcdHRlbXBsYXRlOiAnTm8gZW50cmllcy4nXG5cdFx0XHR9LFxuXHRcdFx0Y29sdW1uczogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0ZmllbGQ6ICd0aW1lc3RhbXAnLFxuXHRcdFx0XHRcdHRpdGxlOiAnVGltZXN0YW1wJyxcblx0XHRcdFx0XHR3aWR0aDogMTgwXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRmaWVsZDogJ2xldmVsJyxcblx0XHRcdFx0XHR0aXRsZTogJ0xldmVsJyxcblx0XHRcdFx0XHR3aWR0aDogMTAwXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRmaWVsZDogJ21lc3NhZ2UnLFxuXHRcdFx0XHRcdHRpdGxlOiAnTWVzc2FnZScsXG5cdFx0XHRcdFx0d2lkdGg6IDQwMFxuXHRcdFx0XHR9LFxuXHRcdFx0XSxcblx0XHRcdGRhdGFCb3VuZDogZnVuY3Rpb24oKSB7XG5cdFx0XHQgICAgdGhpcy5jb250ZW50LnNjcm9sbFRvcCh0aGlzLnRib2R5LmhlaWdodCgpKTsgLy8gU2Nyb2xsIHRvIGJvdHRvbVxuXHRcdFx0fVxuXHRcdH0pLmRhdGEoJ2tlbmRvR3JpZCcpO1xuXG5cdFx0Ly8gVVNFUiBNT05JVE9SIC0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdFx0dGhpcy5fa2lja0RlbGF5SW4gPSAkKCcjem5tLWtpY2tEZWxheU5TJykua2VuZG9OdW1lcmljVGV4dEJveCh7XG5cdFx0ICAgIG1pbjogMCxcblx0XHQgICAgc3RlcDogMSxcblx0XHQgICAgZm9ybWF0OiAnIycsXG5cdFx0XHRwbGFjZWhvbGRlcjogJ0RlbGF5IChzKSdcblx0XHR9KS5kYXRhKCdrZW5kb051bWVyaWNUZXh0Qm94Jyk7XG5cblx0XHR0aGlzLl9iYW5Nb2RlRGQgPSAkKCcjem5tLWJhbk1vZGVERCcpLmtlbmRvRHJvcERvd25MaXN0KHtcblx0XHRcdGRhdGFTb3VyY2U6IFsnSVAnLCAnTkFNRSddLFxuXHRcdFx0YXV0b1dpZHRoOiB0cnVlLFxuXHRcdFx0b3B0aW9uTGFiZWw6IHtcblx0XHRcdFx0dGV4dDogJ01vZGUnXG5cdFx0XHR9LFxuXHRcdFx0b3B0aW9uTGFiZWxUZW1wbGF0ZTogJzxzcGFuIGNsYXNzPVwidGV4dC1tdXRlZFwiPiM6dGV4dCM8L3NwYW4+Jyxcblx0XHR9KS5kYXRhKCdrZW5kb0Ryb3BEb3duTGlzdCcpO1xuXG5cdFx0dGhpcy5fYmFuRHVyVW5pdERkID0gJCgnI3pubS1iYW5EdXJhdGlvblVuaXRERCcpLmtlbmRvRHJvcERvd25MaXN0KHtcblx0XHRcdGF1dG9XaWR0aDogdHJ1ZSxcblx0XHR9KS5kYXRhKCdrZW5kb0Ryb3BEb3duTGlzdCcpO1xuXG5cdFx0dGhpcy5fYmFuRHVyYXRpb25JbiA9ICQoJyN6bm0tYmFuRHVyYXRpb25OUycpLmtlbmRvTnVtZXJpY1RleHRCb3goe1xuXHRcdCAgICBtaW46IDEsXG5cdFx0ICAgIHN0ZXA6IDEsXG5cdFx0ICAgIGZvcm1hdDogJyMnLFxuXHRcdFx0cGxhY2Vob2xkZXI6ICdEdXJhdGlvbidcblx0XHR9KS5kYXRhKCdrZW5kb051bWVyaWNUZXh0Qm94Jyk7XG5cblx0XHR0aGlzLl9iYW5EZWxheUluID0gJCgnI3pubS1iYW5EZWxheU5TJykua2VuZG9OdW1lcmljVGV4dEJveCh7XG5cdFx0ICAgIG1pbjogMCxcblx0XHQgICAgc3RlcDogMSxcblx0XHQgICAgZm9ybWF0OiAnIycsXG5cdFx0XHRwbGFjZWhvbGRlcjogJ0RlbGF5IChzKSdcblx0XHR9KS5kYXRhKCdrZW5kb051bWVyaWNUZXh0Qm94Jyk7XG5cblx0XHQvLyBBZGQgYnV0dG9uIGNsaWNrIGxpc3RlbmVyc1xuXHRcdCQoJyN6bm0ta2lja0J0Jykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vbktpY2tCdENsaWNrLCB0aGlzKSk7XG5cdFx0JCgnI3pubS1iYW5CdCcpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25CYW5CdENsaWNrLCB0aGlzKSk7XG5cblx0XHQvLyBDaGFydHNcblxuXHRcdHRoaXMuX3BhY2tldFF1ZXVlQ2hhcnQgPSAkKCcjem5tLXBhY2tldFF1ZXVlQ2hhcnQnKS5rZW5kb0NoYXJ0KHtcblx0XHRcdHRyYW5zaXRpb25zOiBmYWxzZSxcblx0XHRcdGNoYXJ0QXJlYToge1xuXHRcdFx0XHRoZWlnaHQ6IDEwMFxuXHRcdFx0fSxcblx0ICAgICAgICBsZWdlbmQ6IHtcblx0ICAgICAgICAgICAgdmlzaWJsZTogZmFsc2Vcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNlcmllc0RlZmF1bHRzOiB7XG5cdCAgICAgICAgICAgIHR5cGU6ICdiYXInLFxuXHQgICAgICAgICAgICBsYWJlbHM6IHtcblx0ICAgICAgICAgICAgICAgIHZpc2libGU6IHRydWUsXG5cdCAgICAgICAgICAgICAgICBmb3JtYXQ6ICd7MH0lJyxcblx0ICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ICd0cmFuc3BhcmVudCcsXG5cdFx0XHRcdFx0cG9zaXRpb246ICdpbnNpZGVCYXNlJ1xuXHQgICAgICAgICAgICB9LFxuXHRcdFx0XHRnYXA6IC41LFxuXHRcdFx0XHRzcGFjaW5nOiAwLFxuXHRcdFx0XHRvdmVybGF5OiB7XG5cdFx0XHRcdFx0Z3JhZGllbnQ6ICdub25lJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRib3JkZXI6IHtcblx0XHRcdFx0XHR3aWR0aDogMFxuXHRcdFx0XHR9XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXJpZXM6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICdQYWNrZXQgcXVldWUnLFxuXHRcdCAgICAgICAgICAgIGZpZWxkOiAndmFsdWUnLFxuXHRcdCAgICAgICAgICAgIGNhdGVnb3J5RmllbGQ6ICdjYXRlZ29yeScsXG5cdFx0XHRcdFx0Y29sb3I6ICcjRkI3RDMzJ1xuXHRcdCAgICAgICAgfVxuXHRcdFx0XSxcblx0ICAgICAgICB2YWx1ZUF4aXM6IHtcblx0ICAgICAgICAgICAgbGFiZWxzOiB7XG5cdCAgICAgICAgICAgICAgICBmb3JtYXQ6ICd7MH0lJ1xuXHQgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICBsaW5lOiB7XG5cdCAgICAgICAgICAgICAgICB2aXNpYmxlOiBmYWxzZVxuXHQgICAgICAgICAgICB9LFxuXHRcdFx0XHRtaW46IDAsXG5cdCAgICBcdFx0bWF4OiAxMDBcblx0ICAgICAgICB9LFxuXHQgICAgICAgIGNhdGVnb3J5QXhpczoge1xuXHQgICAgICAgICAgICBtYWpvckdyaWRMaW5lczoge1xuXHQgICAgICAgICAgICAgICAgdmlzaWJsZTogZmFsc2Vcblx0ICAgICAgICAgICAgfSxcblx0XHRcdFx0bWFqb3JUaWNrczoge1xuXHRcdFx0XHRcdHZpc2libGU6IGZhbHNlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGxhYmVsczoge1xuXHRcdFx0XHRcdHZpc2libGU6IGZhbHNlXG5cdFx0XHRcdH1cblx0ICAgICAgICB9LFxuXHRcdFx0dG9vbHRpcDoge1xuXHRcdFx0XHR2aXNpYmxlOiBmYWxzZSxcblx0ICAgICAgICB9XG5cdCAgICB9KS5kYXRhKCdrZW5kb0NoYXJ0Jyk7XG5cblx0XHR0aGlzLl9kcm9wcGVkTXNnQ2hhcnQgPSAkKCcjem5tLWRyb3BwZWRNc2dDaGFydCcpLmtlbmRvQ2hhcnQoe1xuXHRcdFx0dHJhbnNpdGlvbnM6IGZhbHNlLFxuXHRcdFx0Y2hhcnRBcmVhOiB7XG5cdFx0XHRcdGhlaWdodDogMTAwXG5cdFx0XHR9LFxuXHQgICAgICAgIGxlZ2VuZDoge1xuXHQgICAgICAgICAgICB2aXNpYmxlOiBmYWxzZVxuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2VyaWVzRGVmYXVsdHM6IHtcblx0ICAgICAgICAgICAgdHlwZTogJ2JhcicsXG5cdCAgICAgICAgICAgIGxhYmVsczoge1xuXHQgICAgICAgICAgICAgICAgdmlzaWJsZTogdHJ1ZSxcblx0ICAgICAgICAgICAgICAgIGZvcm1hdDogJ3swfScsXG5cdCAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAndHJhbnNwYXJlbnQnLFxuXHRcdFx0XHRcdHBvc2l0aW9uOiAnaW5zaWRlQmFzZScsXG5cdCAgICAgICAgICAgIH0sXG5cdFx0XHRcdGdhcDogLjUsXG5cdFx0XHRcdHNwYWNpbmc6IDAsXG5cdFx0XHRcdG92ZXJsYXk6IHtcblx0XHRcdFx0XHRncmFkaWVudDogJ25vbmUnXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGJvcmRlcjoge1xuXHRcdFx0XHRcdHdpZHRoOiAwXG5cdFx0XHRcdH1cblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNlcmllczogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogJ0Ryb3BwZWQgbWVzc2FnZXMnLFxuXHRcdCAgICAgICAgICAgIGZpZWxkOiAndmFsdWUnLFxuXHRcdCAgICAgICAgICAgIGNhdGVnb3J5RmllbGQ6ICdjYXRlZ29yeScsXG5cdFx0XHRcdFx0Y29sb3I6ICcjRkI3RDMzJ1xuXHRcdCAgICAgICAgfVxuXHRcdFx0XSxcblx0ICAgICAgICB2YWx1ZUF4aXM6IHtcblx0ICAgICAgICAgICAgbGFiZWxzOiB7XG5cdCAgICAgICAgICAgICAgICBmb3JtYXQ6ICd7MH0nXG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIGxpbmU6IHtcblx0ICAgICAgICAgICAgICAgIHZpc2libGU6IGZhbHNlXG5cdCAgICAgICAgICAgIH0sXG5cdFx0XHRcdG1pbjogMCxcblx0ICAgICAgICB9LFxuXHQgICAgICAgIGNhdGVnb3J5QXhpczoge1xuXHQgICAgICAgICAgICBtYWpvckdyaWRMaW5lczoge1xuXHQgICAgICAgICAgICAgICAgdmlzaWJsZTogZmFsc2Vcblx0ICAgICAgICAgICAgfSxcblx0XHRcdFx0bWFqb3JUaWNrczoge1xuXHRcdFx0XHRcdHZpc2libGU6IGZhbHNlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGxhYmVsczoge1xuXHRcdFx0XHRcdHZpc2libGU6IGZhbHNlXG5cdFx0XHRcdH1cblx0ICAgICAgICB9LFxuXHRcdFx0dG9vbHRpcDoge1xuXHRcdFx0XHR2aXNpYmxlOiBmYWxzZSxcblx0ICAgICAgICB9XG5cdCAgICB9KS5kYXRhKCdrZW5kb0NoYXJ0Jyk7XG5cblx0XHR0aGlzLl93cml0dGVuRGF0YUNoYXJ0ID0gJCgnI3pubS13cml0dGVuRGF0YUNoYXJ0Jykua2VuZG9DaGFydCh7XG5cdFx0XHR0cmFuc2l0aW9uczogZmFsc2UsXG5cdFx0XHRjaGFydEFyZWE6IHtcblx0XHRcdFx0aGVpZ2h0OiAxMDBcblx0XHRcdH0sXG5cdCAgICAgICAgbGVnZW5kOiB7XG5cdCAgICAgICAgICAgIHZpc2libGU6IGZhbHNlXG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXJpZXNEZWZhdWx0czoge1xuXHQgICAgICAgICAgICB0eXBlOiAnYmFyJyxcblx0ICAgICAgICAgICAgbGFiZWxzOiB7XG5cdCAgICAgICAgICAgICAgICB2aXNpYmxlOiB0cnVlLFxuXHQgICAgICAgICAgICAgICAgZm9ybWF0OiAnezB9Jyxcblx0ICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ICd0cmFuc3BhcmVudCcsXG5cdFx0XHRcdFx0cG9zaXRpb246ICdpbnNpZGVCYXNlJyxcblx0XHRcdFx0XHR0ZW1wbGF0ZTogZ2V0V1JCeXRlc0xhYmVsVGVtcGxhdGUoKSxcblx0ICAgICAgICAgICAgfSxcblx0XHRcdFx0Z2FwOiAuNSxcblx0XHRcdFx0c3BhY2luZzogMCxcblx0XHRcdFx0b3ZlcmxheToge1xuXHRcdFx0XHRcdGdyYWRpZW50OiAnbm9uZSdcblx0XHRcdFx0fSxcblx0XHRcdFx0Ym9yZGVyOiB7XG5cdFx0XHRcdFx0d2lkdGg6IDBcblx0XHRcdFx0fVxuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2VyaWVzOiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnV3JpdHRlbiBkYXRhJyxcblx0XHQgICAgICAgICAgICBmaWVsZDogJ3ZhbHVlJyxcblx0XHQgICAgICAgICAgICBjYXRlZ29yeUZpZWxkOiAnY2F0ZWdvcnknLFxuXHRcdFx0XHRcdGNvbG9yOiAnI0ZCN0QzMydcblx0XHQgICAgICAgIH1cblx0XHRcdF0sXG5cdCAgICAgICAgdmFsdWVBeGlzOiB7XG5cdCAgICAgICAgICAgIGxhYmVsczoge1xuXHQgICAgICAgICAgICAgICAgZm9ybWF0OiAnezB9J1xuXHQgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICBsaW5lOiB7XG5cdCAgICAgICAgICAgICAgICB2aXNpYmxlOiBmYWxzZVxuXHQgICAgICAgICAgICB9LFxuXHRcdFx0XHRtaW46IDAsXG5cdCAgICAgICAgfSxcblx0ICAgICAgICBjYXRlZ29yeUF4aXM6IHtcblx0ICAgICAgICAgICAgbWFqb3JHcmlkTGluZXM6IHtcblx0ICAgICAgICAgICAgICAgIHZpc2libGU6IGZhbHNlXG5cdCAgICAgICAgICAgIH0sXG5cdFx0XHRcdG1ham9yVGlja3M6IHtcblx0XHRcdFx0XHR2aXNpYmxlOiBmYWxzZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRsYWJlbHM6IHtcblx0XHRcdFx0XHR2aXNpYmxlOiBmYWxzZVxuXHRcdFx0XHR9XG5cdCAgICAgICAgfSxcblx0XHRcdHRvb2x0aXA6IHtcblx0XHRcdFx0dmlzaWJsZTogZmFsc2UsXG5cdCAgICAgICAgfVxuXHQgICAgfSkuZGF0YSgna2VuZG9DaGFydCcpO1xuXG5cdFx0dGhpcy5fcmVhZERhdGFDaGFydCA9ICQoJyN6bm0tcmVhZERhdGFDaGFydCcpLmtlbmRvQ2hhcnQoe1xuXHRcdFx0dHJhbnNpdGlvbnM6IGZhbHNlLFxuXHRcdFx0Y2hhcnRBcmVhOiB7XG5cdFx0XHRcdGhlaWdodDogMTAwXG5cdFx0XHR9LFxuXHQgICAgICAgIGxlZ2VuZDoge1xuXHQgICAgICAgICAgICB2aXNpYmxlOiBmYWxzZVxuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2VyaWVzRGVmYXVsdHM6IHtcblx0ICAgICAgICAgICAgdHlwZTogJ2JhcicsXG5cdCAgICAgICAgICAgIGxhYmVsczoge1xuXHQgICAgICAgICAgICAgICAgdmlzaWJsZTogdHJ1ZSxcblx0ICAgICAgICAgICAgICAgIGZvcm1hdDogJ3swfScsXG5cdCAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAndHJhbnNwYXJlbnQnLFxuXHRcdFx0XHRcdHBvc2l0aW9uOiAnaW5zaWRlQmFzZScsXG5cdFx0XHRcdFx0dGVtcGxhdGU6IGdldFdSQnl0ZXNMYWJlbFRlbXBsYXRlKCksXG5cdCAgICAgICAgICAgIH0sXG5cdFx0XHRcdGdhcDogLjUsXG5cdFx0XHRcdHNwYWNpbmc6IDAsXG5cdFx0XHRcdG92ZXJsYXk6IHtcblx0XHRcdFx0XHRncmFkaWVudDogJ25vbmUnXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGJvcmRlcjoge1xuXHRcdFx0XHRcdHdpZHRoOiAwXG5cdFx0XHRcdH1cblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNlcmllczogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogJ1JlYWQgZGF0YScsXG5cdFx0ICAgICAgICAgICAgZmllbGQ6ICd2YWx1ZScsXG5cdFx0ICAgICAgICAgICAgY2F0ZWdvcnlGaWVsZDogJ2NhdGVnb3J5Jyxcblx0XHRcdFx0XHRjb2xvcjogJyNGQjdEMzMnXG5cdFx0ICAgICAgICB9XG5cdFx0XHRdLFxuXHQgICAgICAgIHZhbHVlQXhpczoge1xuXHQgICAgICAgICAgICBsYWJlbHM6IHtcblx0ICAgICAgICAgICAgICAgIGZvcm1hdDogJ3swfSdcblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgbGluZToge1xuXHQgICAgICAgICAgICAgICAgdmlzaWJsZTogZmFsc2Vcblx0ICAgICAgICAgICAgfSxcblx0XHRcdFx0bWluOiAwLFxuXHQgICAgICAgIH0sXG5cdCAgICAgICAgY2F0ZWdvcnlBeGlzOiB7XG5cdCAgICAgICAgICAgIG1ham9yR3JpZExpbmVzOiB7XG5cdCAgICAgICAgICAgICAgICB2aXNpYmxlOiBmYWxzZVxuXHQgICAgICAgICAgICB9LFxuXHRcdFx0XHRtYWpvclRpY2tzOiB7XG5cdFx0XHRcdFx0dmlzaWJsZTogZmFsc2Vcblx0XHRcdFx0fSxcblx0XHRcdFx0bGFiZWxzOiB7XG5cdFx0XHRcdFx0dmlzaWJsZTogZmFsc2Vcblx0XHRcdFx0fVxuXHQgICAgICAgIH0sXG5cdFx0XHR0b29sdGlwOiB7XG5cdFx0XHRcdHZpc2libGU6IGZhbHNlLFxuXHQgICAgICAgIH1cblx0ICAgIH0pLmRhdGEoJ2tlbmRvQ2hhcnQnKTtcblxuXHRcdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdFx0Ly8gQWRkIGxpc3RlbmVyIHRvIHJlZHJhdyBhbGwgY2hhcnRzIGluIGNhc2Ugb2Ygd2luZG93IHJlc2l6ZVxuXHRcdCQod2luZG93KS5vbigncmVzaXplJywgJC5wcm94eSh0aGlzLl9vbldpbmRvd1Jlc2l6ZSwgdGhpcykpO1xuXHRcdHRoaXMuX29uV2luZG93UmVzaXplKCk7IC8vIEFsc28gZG8gaXQgaW1tZWRpYXRlbHlcblxuXHRcdC8vIFJlcXVlc3QgZGF0YSB0byBzZXJ2ZXJcblx0XHR0aGlzLl9yZXF1ZXN0RGF0YSh0cnVlKTtcblx0fVxuXG5cdGRlc3Ryb3koKVxuXHR7XG5cdFx0Ly8gQ2FsbCBzdXBlciBtZXRob2Rcblx0XHRzdXBlci5kZXN0cm95KCk7XG5cblx0XHQvLyBDbG9zZSBtb25pdG9yaW5nXG5cdFx0dGhpcy5fb25DbG9zZU1vbml0b3JCdENsaWNrKCk7XG5cblx0XHQvLyBSZW1vdmUgZG91YmxlY2xpY2sgZXZlbnQgbGlzdGVuZXJzXG5cdFx0dGhpcy5fem9uZUxpc3RCb3gud3JhcHBlci5maW5kKCcuay1saXN0Jykub2ZmKCdkYmxjbGljaycpO1xuXHRcdHRoaXMuX3Jvb21MaXN0Qm94LndyYXBwZXIuZmluZCgnLmstbGlzdCcpLm9mZignZGJsY2xpY2snKTtcblx0XHR0aGlzLl91c2VyTGlzdEJveC53cmFwcGVyLmZpbmQoJy5rLWxpc3QnKS5vZmYoJ2RibGNsaWNrJyk7XG5cblx0XHQvLyBSZW1vdmUgb3RoZXIgZXZlbnQgbGlzdGVuZXJzXG5cdFx0JCgnI3pubS1jcmVhdGVSb29tQnQnKS5vZmYoJ2NsaWNrJyk7XG5cdFx0JCgnI3pubS1yZW1vdmVSb29tQnQnKS5vZmYoJ2NsaWNrJyk7XG5cdFx0JCgnI3pubS1yb29tQ3JlYXRvckNyZWF0ZUJ0Jykub2ZmKCdjbGljaycpO1xuXHRcdCQoJyN6bm0tZmlsdGVyUm9vbUJ0Jykub2ZmKCdjbGljaycpO1xuXHRcdCQoJyN6bm0tYXBwbHlSb29tRmlsdGVyQ0InKS5vZmYoJ2NoYW5nZScpO1xuXHRcdCQoJyN6bm0tZmlsdGVyVXNlckJ0Jykub2ZmKCdjbGljaycpO1xuXHRcdCQoJyN6bm0tYXBwbHlVc2VyRmlsdGVyQ0InKS5vZmYoJ2NoYW5nZScpO1xuXHRcdCQoJyN6bm0tbW9uaXRvckJ0Jykub2ZmKCdjbGljaycpO1xuXHRcdCQoJyN6bm0tc2VuZE1lc3NhZ2VCdCcpLm9mZignY2xpY2snKTtcblx0XHQkKCcjem5tLW1lc3NhZ2VJbicpLm9mZigna2V5dXAnKTtcblx0XHQkKCcjem5tLWNsb3NlTW9uaXRvckJ0Jykub2ZmKCdjbGljaycpO1xuXHRcdCQoJyN6bm0tZWRpdEJ0Jykub2ZmKCdjbGljaycpO1xuXHRcdCQoJyN6bm0tY2FuY2VsQnQnKS5vZmYoJ2NsaWNrJyk7XG5cdFx0JCgnI3pubS1zdWJtaXRCdCcpLm9mZignY2xpY2snKTtcblx0XHQkKHdpbmRvdykub2ZmKCdyZXNpemUnKTtcblx0XHQkKCcjem5tLXJlbG9hZFdvcmRzQnQnKS5vZmYoJ2NsaWNrJyk7XG5cdFx0JCgnI3pubS1yZWxvYWRab25lRXh0QnQnKS5vZmYoJ2NsaWNrJyk7XG5cdFx0JCgnI3pubS1raWNrQnQnKS5vZmYoJ2NsaWNrJyk7XG5cdFx0JCgnI3pubS1iYW5CdCcpLm9mZignY2xpY2snKTtcblxuXHRcdC8vIENsZWFyIHJlcXVlc3Qgc2NoZWR1bGluZ1xuXHRcdGNsZWFyVGltZW91dCh0aGlzLl9yZXF1ZXN0VGltZXIpO1xuXG5cdFx0Ly8gSGlkZSByb29tIGNyZWF0aW9uIHBhbmVsXG5cdFx0JCgnI3pubS1jcmVhdGVSb29tTW9kYWwnKS5tb2RhbCgnaGlkZScpO1xuXG5cdFx0Ly8gUmVtb3ZlIHJvb20gY3JlYXRpb24gcGFuZWwgbGlzdGVuZXJcblx0XHQkKCcjem5tLWNyZWF0ZVJvb21Nb2RhbCcpLm9mZignaGlkZGVuLmJzLm1vZGFsJyk7XG5cblx0XHQvLyBSZW1vdmUgZmlsdGVyIHBhbmVscyBsaXN0ZW5lcnNcblx0XHQkKHRoaXMuX3Jvb21GaWx0ZXIpLm9mZih0aGlzLl9yb29tRmlsdGVyLkVYUFJFU1NJT05fVVBEQVRFRF9FVkVOVCk7XG5cdFx0JCh0aGlzLl91c2VyRmlsdGVyKS5vZmYodGhpcy5fdXNlckZpbHRlci5FWFBSRVNTSU9OX1VQREFURURfRVZFTlQpO1xuXHR9XG5cblx0b25FeHRlbnNpb25Db21tYW5kKGNvbW1hbmQsIGRhdGEpXG5cdHtcblx0XHQvLyBEYXRhIHJlY2VpdmVkXG5cdFx0aWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX0RBVEEpXG5cdFx0e1xuXHRcdFx0Ly8gV2UgaGF2ZSB0byBjaGVjayBpZiB0aGUgcmVzcG9uc2UgaWQgY29ycmVzcG9uZHMgdG8gdGhlIGN1cnJlbnQgcmVxdWVzdCBpZDtcblx0XHRcdC8vIGlmIG5vdCwgdGhlIHJlc3BvbnNlIGlzIGRpc2NhcmRlZCBhcyBpdCByZWZlcnMgdG8gYW4gb3V0ZGF0ZXQgcmVxdWVzdFxuXHRcdFx0Y29uc3QgcmVzcG9uc2VJZCA9IGRhdGEuZ2V0SW50KCdpZCcpO1xuXG5cdFx0XHRpZiAocmVzcG9uc2VJZCA9PSB0aGlzLl9jdXJyZW50UmVxdWVzdElkKVxuXHRcdFx0e1xuXHRcdFx0XHQvLyAtLS0gWk9ORVMgTElTVCAtLS1cblx0XHRcdFx0aWYgKGRhdGEuY29udGFpbnNLZXkoJ3pvbmVzJykpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0aGlzLl9zZXRab25lc0RhdGFQcm92aWRlcihkYXRhLmdldFNGU0FycmF5KCd6b25lcycpKTtcblxuXHRcdFx0XHRcdGlmICh0aGlzLl9zZWxlY3RlZFpvbmUpXG5cdFx0XHRcdFx0XHR0aGlzLl9zZXRTY29wZUxhYmVsKCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyAtLS0gUk9PTVMgTElTVCAtLS1cblx0XHRcdFx0aWYgKGRhdGEuY29udGFpbnNLZXkoJ3Jvb21zJykpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0aGlzLl9zZXRHcm91cHNEYXRhUHJvdmlkZXIoZGF0YS5nZXRVdGZTdHJpbmdBcnJheSgnZ3JvdXBzJykpO1xuXG5cdFx0XHRcdFx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdFx0XHRcdFx0Ly8gSWYgYSBudWxsIHJvb21zIGxpc3QgaXMgcmV0dXJuZWQsIHRoZSB6b25lIG11c3QgaGF2ZSBiZWVuIGRlbGV0ZWQhXG5cdFx0XHRcdFx0aWYgKCFkYXRhLmlzTnVsbCgncm9vbXMnKSlcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHR0aGlzLl9zZXRSb29tc0RhdGFQcm92aWRlcihkYXRhLmdldFNGU0FycmF5KCdyb29tcycpKTtcblxuXHRcdFx0XHRcdFx0aWYgKCF0aGlzLl9zZWxlY3RlZFJvb20pXG5cdFx0XHRcdFx0XHRcdHRoaXMuX3NldFNjb3BlTGFiZWwoKTtcblxuXHRcdFx0XHRcdFx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdFx0XHRcdFx0XHQvLyBTaG93IHdhcm5pbmcgaWYgdGhlIHJvb21zIGxpc3QgZXhjZWVkcyB0aGUgc2VydmVyLXNpZGUgbGltaXRcblx0XHRcdFx0XHRcdGlmIChkYXRhLmNvbnRhaW5zS2V5KCdyU2l6ZScpKVxuXHRcdFx0XHRcdFx0XHR0aGlzLl9zaG93TGltaXRFeGNlZWRlZFdhcm5pbmcoJCgnI3pubS1yb29tTGlzdFdhcm5pbmcnKSwgJ1RoZSByZWNlaXZlZCBsaXN0IGlzIGluY29tcGxldGUsIGJlY2F1c2UgaXRzIHNpemUgKCcgKyBkYXRhLmdldEludCgnclNpemUnKSArICcgUm9vbXMpIGV4Y2VlZGVkIHRoaXMgY2xpZW50XFwncyBsaW1pdCBvZiAnICsgZGF0YS5nZXRJbnQoJ3JMaW1pdCcpICsgJzsgeW91IHNob3VsZCByZWZpbmUgeW91ciBzZWFyY2gnKTtcblx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0dGhpcy5fc2hvd0xpbWl0RXhjZWVkZWRXYXJuaW5nKCQoJyN6bm0tcm9vbUxpc3RXYXJuaW5nJyksICcnKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGlmICh0aGlzLl9hY3RpdmVQYW5lbFR5cGUgPT0gJ3Jvb20nKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0aGlzLl9hY2NvcmRpb24uc2VsZWN0KCdbZGF0YS1pdGVtLXR5cGU9XCJ6b25lXCJdJyk7XG5cdFx0XHRcdFx0XHRcdHRoaXMuX2FjY29yZGlvbi5leHBhbmQoJ1tkYXRhLWl0ZW0tdHlwZT1cInpvbmVcIl0nKTtcblx0XHRcdFx0XHRcdFx0dGhpcy5fb25ab25lU2VsZWN0ZWQoKTtcblx0XHRcdFx0XHRcdFx0dGhpcy5fb25FbnRpdGllc1BhbmVsQ2hhbmdlKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gLS0tIFVTRVJTIExJU1QgLS0tXG5cdFx0XHRcdGlmIChkYXRhLmNvbnRhaW5zS2V5KCd1c2VycycpKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Ly8gSWYgYSBudWxsIHVzZXJzIGxpc3QgaXMgcmV0dXJuZWQsIHRoZSByb29tIG11c3QgaGF2ZSBiZWVuIGRlbGV0ZWQhXG5cdFx0XHRcdFx0aWYgKCFkYXRhLmlzTnVsbCgndXNlcnMnKSlcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHR0aGlzLl9zZXRVc2Vyc0RhdGFQcm92aWRlcihkYXRhLmdldFNGU0FycmF5KCd1c2VycycpKTtcblxuXHRcdFx0XHRcdFx0Ly8gU2hvdyB3YXJuaW5nIGlmIHRoZSB1c2VycyBsaXN0IGV4Y2VlZHMgdGhlIHNlcnZlci1zaWRlIGxpbWl0XG5cdFx0XHRcdFx0XHRpZiAoZGF0YS5jb250YWluc0tleSgndVNpemUnKSlcblx0XHRcdFx0XHRcdFx0dGhpcy5fc2hvd0xpbWl0RXhjZWVkZWRXYXJuaW5nKCQoJyN6bm0tdXNlckxpc3RXYXJuaW5nJyksICdUaGUgcmVjZWl2ZWQgbGlzdCBpcyBpbmNvbXBsZXRlLCBiZWNhdXNlIGl0cyBzaXplICgnICsgZGF0YS5nZXRJbnQoJ3VTaXplJykgKyAnIHVzZXJzKSBleGNlZWRzIHRoaXMgY2xpZW50XFwncyBsaW1pdCBvZiAnICsgZGF0YS5nZXRJbnQoJ3VMaW1pdCcpICsgJzsgeW91IHNob3VsZCByZWZpbmUgeW91ciBzZWFyY2gnKTtcblx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0dGhpcy5fc2hvd0xpbWl0RXhjZWVkZWRXYXJuaW5nKCQoJyN6bm0tdXNlckxpc3RXYXJuaW5nJyksICcnKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGlmICh0aGlzLl9hY3RpdmVQYW5lbFR5cGUgPT0gJ3VzZXInKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0aGlzLl9hY2NvcmRpb24uc2VsZWN0KCdbZGF0YS1pdGVtLXR5cGU9XCJyb29tXCJdJyk7XG5cdFx0XHRcdFx0XHRcdHRoaXMuX2FjY29yZGlvbi5leHBhbmQoJ1tkYXRhLWl0ZW0tdHlwZT1cInJvb21cIl0nKTtcblx0XHRcdFx0XHRcdFx0dGhpcy5fb25Sb29tU2VsZWN0ZWQoKTtcblx0XHRcdFx0XHRcdFx0dGhpcy5fb25FbnRpdGllc1BhbmVsQ2hhbmdlKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gLS0tIE1PTklUT1JFRCBEQVRBIC0tLVxuXHRcdFx0XHRpZiAoZGF0YS5jb250YWluc0tleSgnbW9uaXRvcmVkJykpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRjb25zdCB6b25lID0gZGF0YS5nZXRTRlNPYmplY3QoJ21vbml0b3JlZCcpLmdldFV0ZlN0cmluZygnem9uZScpO1xuXHRcdFx0XHRcdGNvbnN0IHR5cGUgPSBkYXRhLmdldFNGU09iamVjdCgnbW9uaXRvcmVkJykuZ2V0VXRmU3RyaW5nKCd0eXBlJyk7XG5cdFx0XHRcdFx0Y29uc3QgbmFtZSA9IGRhdGEuZ2V0U0ZTT2JqZWN0KCdtb25pdG9yZWQnKS5nZXRVdGZTdHJpbmcoJ25hbWUnKTtcblxuXHRcdFx0XHRcdGlmICh6b25lID09IHRoaXMuX21vbml0b3JlZFpvbmUgJiYgdHlwZSA9PSB0aGlzLl9tb25pdG9yZWRUeXBlICYmIG5hbWUgPT0gdGhpcy5fbW9uaXRvcmVkTmFtZSlcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRpZiAoIWRhdGEuZ2V0U0ZTT2JqZWN0KCdtb25pdG9yZWQnKS5pc051bGwoJ3BhcmFtcycpKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRjb25zdCBwYXJhbXMgPSBkYXRhLmdldFNGU09iamVjdCgnbW9uaXRvcmVkJykuZ2V0U0ZTQXJyYXkoJ3BhcmFtcycpO1xuXG5cdFx0XHRcdFx0XHRcdHRoaXMuX3NldE1vbml0b3JpbmdJbnRlcmZhY2UoKTtcblxuXHRcdFx0XHRcdFx0XHQvLyBCdWlsZCBpbnRlcmZhY2Vcblx0XHRcdFx0XHRcdFx0aWYgKCF0aGlzLl9pc0VkaXRpbmcpXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLl9pbnRlcmZhY2VCdWlsZGVyLmJ1aWxkSW50ZXJmYWNlKHBhcmFtcywgYHpubS0ke3RoaXMuX21vbml0b3JlZFR5cGV9VGFiTmF2aWdhdG9yYCwgdHJ1ZSk7XG5cblx0XHRcdFx0XHRcdFx0XHRpZiAoIXRoaXMuX3NraXBJbml0VGFicylcblx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHQkKGAjem5tLSR7dGhpcy5fbW9uaXRvcmVkVHlwZX1UYWJOYXZpZ2F0b3IgI3RhYnNgKS5zY3JvbGxpbmdUYWJzKHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ym9vdHN0cmFwVmVyc2lvbjogNCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0c2Nyb2xsVG9UYWJFZGdlOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRlbmFibGVTd2lwaW5nOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRkaXNhYmxlU2Nyb2xsQXJyb3dzT25GdWxseVNjcm9sbGVkOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRjc3NDbGFzc0xlZnRBcnJvdzogJ2ZhIGZhLWNoZXZyb24tbGVmdCcsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNzc0NsYXNzUmlnaHRBcnJvdzogJ2ZhIGZhLWNoZXZyb24tcmlnaHQnXG5cdFx0XHRcdFx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5fc2tpcEluaXRUYWJzID0gdHJ1ZTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gU2V0IGZpcnN0IHRhYiBwYW5lbCBhcyBhY3RpdmVcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuX2ludGVyZmFjZUJ1aWxkZXIuYWN0aXZhdGVGaXJzdFRhYlBhbmVsKCk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdC8vIFJlZHJhdyB0aW1lIHJhbmdlIHNsaWRlciB0byBzZXQgaXRzIHdpZHRoXG5cdFx0XHRcdFx0XHRcdFx0XHR0aGlzLl90aW1lU2xpZGVyLnJlc2l6ZSgpO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBBZGQgbGlzdGVuZXIgdG8gcmVkcmF3IGFsbCBjaGFydHMgb24gdGFiIGNoYW5nZVxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gKHRvIHdvcmsgYXJvdW5kIGFuIGlzc3VlIHdpdGggdGhlIGNoYXJ0IHJlc2l6aW5nIHRvIGRlZmF1bHQgd2lkdGggd2hlbiBwYW5lIGlzIGhpZGRlbilcblx0XHRcdFx0XHRcdFx0XHRcdCQoJ2FbZGF0YS10b2dnbGU9XCJ0YWJcIl0nKS5vbignc2hvd24uYnMudGFiJywgJC5wcm94eSh0aGlzLl9vbldpbmRvd1Jlc2l6ZSwgdGhpcykpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdC8vIERpc2FibGUgY2F0ZWdvcmllc1xuXHRcdFx0XHRcdFx0XHRsZXQgZGlzYWJsZWRDYXQgPSAoZGF0YS5nZXRTRlNPYmplY3QoJ21vbml0b3JlZCcpLmNvbnRhaW5zS2V5KCdleGNsdWRlJykgPyBkYXRhLmdldFNGU09iamVjdCgnbW9uaXRvcmVkJykuZ2V0VXRmU3RyaW5nQXJyYXkoJ2V4Y2x1ZGUnKSA6IFtdKTtcblxuXHRcdFx0XHRcdFx0XHRmb3IgKGxldCBjYXQgb2YgZGlzYWJsZWRDYXQpXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRsZXQgbmF2TGluayA9ICQoYCN6bm0tJHt0aGlzLl9tb25pdG9yZWRUeXBlfVRhYk5hdmlnYXRvciAjdGFicyAjdGFiLSR7Y2F0fWApO1xuXG5cdFx0XHRcdFx0XHRcdFx0bmF2TGluay5hZGRDbGFzcygnZGlzYWJsZWQnKTtcblx0XHRcdFx0XHRcdFx0XHRuYXZMaW5rLmF0dHIoJ3RhYmluZGV4JywgLTEpO1xuXHRcdFx0XHRcdFx0XHRcdG5hdkxpbmsuYXR0cignYXJpYS1kaXNhYmxlZCcsIHRydWUpO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuX21vbml0b3JlZFR5cGUgPT0gdGhpcy5NT05JVE9SRURfVFlQRV9aT05FKVxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuX3Nob3dab25lVHJhZmZpY0RhdGEoZGF0YS5nZXRTRlNPYmplY3QoJ21vbml0b3JlZCcpLmdldFNGU09iamVjdCgndHJhZmZpYycpKTtcblxuXHRcdFx0XHRcdFx0XHRpZiAodGhpcy5fbW9uaXRvcmVkVHlwZSA9PSB0aGlzLk1PTklUT1JFRF9UWVBFX1VTRVIpXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHQvLyBTdGF0c1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuX3Nob3dVc2VyU3RhdHNEYXRhKGRhdGEuZ2V0U0ZTT2JqZWN0KCdtb25pdG9yZWQnKS5nZXRTRlNPYmplY3QoJ3N0YXRzJykpO1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gTlBDXG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgaXNOcGMgPSBkYXRhLmdldFNGU09iamVjdCgnbW9uaXRvcmVkJykuZ2V0Qm9vbCgnbnBjJyk7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBEaXNhYmxlIGtpY2sgYW5kIGJhbiBidXR0b25zXG5cdFx0XHRcdFx0XHRcdFx0JCgnI3pubS1raWNrQnQnKS5hdHRyKCdkaXNhYmxlZCcsIGlzTnBjKTtcblx0XHRcdFx0XHRcdFx0XHQkKCcjem5tLWJhbkJ0JykuYXR0cignZGlzYWJsZWQnLCBpc05wYyk7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBHZW8tbG9jYXRpb25cblx0XHRcdFx0XHRcdFx0XHRjb25zdCBnZW9Mb2NEYXRhID0gZGF0YS5nZXRTRlNPYmplY3QoJ21vbml0b3JlZCcpLmdldFNGU09iamVjdCgnZ2VvTG9jJyk7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5fc2V0R2VvTG9jYXRpb25VSShnZW9Mb2NEYXRhKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHQvLyBTaG93IGFsZXJ0XG5cdFx0XHRcdFx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dTaW1wbGVBbGVydChgVGhlICR7Y2FwaXRhbGl6ZUZpcnN0KHRoaXMuX21vbml0b3JlZFR5cGUpfSBiZWluZyBtb25pdG9yZWQgaXMgbm8gbW9yZSBhdmFpbGFibGUgb24gdGhlIHNlcnZlciwgcGxlYXNlIHNlbGVjdCBhbm90aGVyIG9uZS5gLCBmYWxzZSk7XG5cblx0XHRcdFx0XHRcdFx0Ly8gQ2FuY2VsIG1vbml0b3Jpbmdcblx0XHRcdFx0XHRcdFx0dGhpcy5fb25DbG9zZU1vbml0b3JCdENsaWNrKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0ZWxzZSBpZiAoY29tbWFuZCA9PSB0aGlzLlJFU1BfVVBEQVRFX0VSUk9SKVxuXHRcdHtcblx0XHRcdGlmIChkYXRhLmdldFV0ZlN0cmluZygnem9uZScpID09IHRoaXMuX21vbml0b3JlZFpvbmVcblx0XHRcdFx0JiYgZGF0YS5nZXRVdGZTdHJpbmcoJ3R5cGUnKSA9PSAgdGhpcy5fbW9uaXRvcmVkVHlwZVxuXHRcdFx0XHQmJiBkYXRhLmdldFV0ZlN0cmluZygnbmFtZScpID09ICB0aGlzLl9tb25pdG9yZWROYW1lKVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBTaG93IGFsZXJ0XG5cdFx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dTaW1wbGVBbGVydChgVW5hYmxlIHRvIHVwZGF0ZSAke2NhcGl0YWxpemVGaXJzdCh0aGlzLl9tb25pdG9yZWRUeXBlKX0gc2V0dGluZ3M7IHRoZSBmb2xsb3dpbmcgZXJyb3Igd2FzIHJlcG9ydGVkOiAke2RhdGEuZ2V0VXRmU3RyaW5nKCdtZXNzYWdlJyl9LmApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGVsc2UgaWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX1JPT01fQ09ORklHKVxuXHRcdHtcblx0XHRcdC8vIFJlLWVuYWJsZSBDcmVhdGUgYnV0dG9uXG5cdFx0XHQkKCcjem5tLWNyZWF0ZVJvb21CdCcpLmF0dHIoJ2Rpc2FibGVkJywgZmFsc2UpO1xuXG5cdFx0XHQvLyBTaG93IFJvb20gY3JlYXRpb24gcGFuZWxcblx0XHRcdHRoaXMuX3Nob3dSb29tQ3JlYXRpb25QYW5lbChkYXRhLmdldFNGU0FycmF5KCdzZXR0aW5ncycpKTtcblx0XHR9XG5cblx0XHRlbHNlIGlmIChjb21tYW5kID09IHRoaXMuUkVTUF9ST09NX0NPTkZJR19FUlJPUilcblx0XHR7XG5cdFx0XHQvLyBSZS1lbmFibGUgQ3JlYXRlIGJ1dHRvblxuXHRcdFx0JCgnI3pubS1jcmVhdGVSb29tQnQnKS5hdHRyKCdkaXNhYmxlZCcsIGZhbHNlKTtcblxuXHRcdFx0Ly8gU2hvdyBhbiBhbGVydFxuXHRcdFx0dGhpcy5zaGVsbEN0cmwuc2hvd1NpbXBsZUFsZXJ0KGRhdGEuZ2V0VXRmU3RyaW5nKCdlcnJvcicpKTtcblx0XHR9XG5cblx0XHRlbHNlIGlmIChjb21tYW5kID09IHRoaXMuUkVTUF9ST09NX0NSRUFURUQpXG5cdFx0e1xuXHRcdFx0Ly8gUmUtZW5hYmxlIHJvb20gY3JlYXRpb24gcGFuZWxcblx0XHRcdHRoaXMuX2VuYWJsZUNyZWF0ZVJvb21QYW5lbCh0cnVlKTtcblxuXHRcdFx0Ly8gSGlkZSByb29tIGNyZWF0aW9uIHBhbmVsXG5cdFx0XHQkKCcjem5tLWNyZWF0ZVJvb21Nb2RhbCcpLm1vZGFsKCdoaWRlJyk7XG5cblx0XHRcdC8vIFVwZGF0ZSByb29tcyBsaXN0XG5cdFx0XHR0aGlzLl9yZXF1ZXN0RGF0YSh0cnVlKTtcblx0XHR9XG5cblx0XHRlbHNlIGlmIChjb21tYW5kID09IHRoaXMuUkVTUF9ST09NX0NSRUFUSU9OX0VSUk9SKVxuXHRcdHtcblx0XHRcdC8vIERpc3BsYXkgZXJyb3IgbWVzc2FnZVxuXHRcdFx0JCgnI3pubS1jcmVhdGVSb29tRXJyb3InKS50ZXh0KGRhdGEuZ2V0VXRmU3RyaW5nKCdlcnJvcicpKTtcblx0XHRcdCQoJyN6bm0tY3JlYXRlUm9vbUVycm9yJykuc2hvdygpO1xuXG5cdFx0XHQvLyBSZS1lbmFibGUgcm9vbSBjcmVhdGlvbiBwYW5lbFxuXHRcdFx0dGhpcy5fZW5hYmxlQ3JlYXRlUm9vbVBhbmVsKHRydWUpO1xuXHRcdH1cblxuXHRcdC8vIFVuZXhwZWN0ZWQgZXJyb3IgcmVjZWl2ZWRcblx0XHQvLyBUaGlzIGVycm9yIGlzIHJldHVybmVkIGluIGNhc2Ugc29tZXRoaW5nIHdlbnQgd3Jvbmcgd2hlbiByZXRyaWV2aW5nIHRoZSBtb25pdG9yZWQgZW50aXR5IHBhcmFtZXRlcnMsXG5cdFx0Ly8gc28gd2UgaGF2ZSB0byBzdG9wIHJlcXVlc3RpbmcgdGhlIHNhbWUgZW50aXR5XG5cdFx0ZWxzZSBpZiAoY29tbWFuZCA9PSB0aGlzLlJFU1BfVU5FWFBFQ1RFRF9FUlJPUilcblx0XHR7XG5cdFx0XHQvLyBDYW5jZWwgbW9uaXRvcmluZ1xuXHRcdFx0dGhpcy5fb25DbG9zZU1vbml0b3JCdENsaWNrKCk7XG5cblx0XHRcdC8vIFNob3cgYW4gYWxlcnRcblx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dTaW1wbGVBbGVydChkYXRhLmdldFV0ZlN0cmluZygnZXJyb3InKSk7XG5cdFx0fVxuXG5cdFx0Ly8gRXh0ZW5zaW9uIChab25lIG9yIFJvb20pIGxvZyBtZXNzYWdlcyByZWNlaXZlZFxuXHRcdGVsc2UgaWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX0xPR19NRVNTQUdFUylcblx0XHR7XG5cdFx0XHRsZXQgbG9nRW50cmllcyA9IGRhdGEuZ2V0U0ZTQXJyYXkoJ2VudHJpZXMnKTtcblxuXHRcdFx0Zm9yIChsZXQgZSA9IDA7IGUgPCBsb2dFbnRyaWVzLnNpemUoKTsgZSsrKVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgbG9nRW50cnkgPSBsb2dFbnRyaWVzLmdldFNGU09iamVjdChlKTtcblxuXHRcdFx0XHRjb25zdCBsb2dab25lID0gbG9nRW50cnkuZ2V0VXRmU3RyaW5nKCd6b25lJyk7XG5cdFx0XHRcdGNvbnN0IGxvZ1Jvb20gPSBsb2dFbnRyeS5nZXRVdGZTdHJpbmcoJ3Jvb20nKTtcblxuXHRcdFx0XHQvLyBDaGVjayBpZiB0aGUgem9uZSBpcyBjdXJyZW50bHkgbW9uaXRvcmVkXG5cdFx0XHRcdGlmICh0aGlzLl9tb25pdG9yZWRab25lID09IGxvZ1pvbmUpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHQvLyBjb25zb2xlLmxvZyhsb2dFbnRyeS5nZXRMb25nKCd0aW1lJykpXG5cdFx0XHRcdFx0Ly8gY29uc29sZS5sb2cobmV3IERhdGUobG9nRW50cnkuZ2V0TG9uZygndGltZScpKVxuXG5cdFx0XHRcdFx0bGV0IGVsZSA9IHtcblx0XHRcdFx0XHRcdHRpbWVzdGFtcDoga2VuZG8udG9TdHJpbmcobmV3IERhdGUobG9nRW50cnkuZ2V0TG9uZygndGltZScpKSwgJ2RkL01NL3l5eXkgSEg6bW06c3MnKSxcblx0XHRcdFx0XHRcdGxldmVsOiBsb2dFbnRyeS5nZXRVdGZTdHJpbmcoJ2xldmVsJyksXG5cdFx0XHRcdFx0XHRtZXNzYWdlOiBsb2dFbnRyeS5nZXRVdGZTdHJpbmcoJ21zZycpLFxuXHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRpZiAodGhpcy5fbW9uaXRvcmVkVHlwZSA9PSB0aGlzLk1PTklUT1JFRF9UWVBFX1pPTkUgJiYgbG9nUm9vbSA9PSAnJylcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHQvLyBBZGQgdG8gem9uZSBleHRlbnNpb24gbG9nXG5cdFx0XHRcdFx0XHR0aGlzLl9hZGRMb2dFbnRyeVRvR3JpZCh0aGlzLl96b25lRXh0TG9nR3JpZCwgZWxlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGlmICh0aGlzLl9tb25pdG9yZWRUeXBlID09IHRoaXMuTU9OSVRPUkVEX1RZUEVfUk9PTSAmJiB0aGlzLl9tb25pdG9yZWROYW1lID09IGxvZ1Jvb20pXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdC8vIEFkZCB0byByb29tIGV4dGVuc2lvbiBsb2dcblx0XHRcdFx0XHRcdFx0dGhpcy5fYWRkTG9nRW50cnlUb0dyaWQodGhpcy5fcm9vbUV4dExvZ0dyaWQsIGVsZSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0Ly8gVUkgRVZFTlQgTElTVEVORVJTXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0X29uVXBkYXRlSW50ZXJ2YWxDaGFuZ2UoKVxuXHR7XG5cdFx0Ly8gUmVxdWVzdCBkYXRhIHRvIHNlcnZlclxuXHRcdHRoaXMuX3JlcXVlc3REYXRhKGZhbHNlKTtcblx0fVxuXG5cdF9vbkVudGl0aWVzUGFuZWxDaGFuZ2UoKVxuXHR7XG5cdFx0Ly8gU2V0IG1haW4gY29udHJvbHMgc3RhdGVcblx0XHR0aGlzLl9zZXRNYWluQ29udHJvbHNFbmFibGVkKCk7XG5cblx0XHQvLyBSZXF1ZXN0IGRhdGEgdG8gc2VydmVyXG5cdFx0dGhpcy5fcmVxdWVzdERhdGEodHJ1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogVXBkYXRlIHRoZSBTY29wZSBsYWJlbCBpbiB0aGUgUm9vbXMgcGFuZWwuXG5cdCAqL1xuXHRfb25ab25lU2VsZWN0ZWQoKVxuXHR7XG5cdFx0Ly8gQ2xlYXIgUm9vbSBhbmQgVXNlciBsaXN0c1xuXHRcdHRoaXMuX3Jlc2V0Um9vbUxpc3QoKTtcblx0XHR0aGlzLl9yZXNldFVzZXJMaXN0KCk7XG5cblx0XHQvLyBTZXQgc2NvcGUgbGFiZWxcblx0XHR0aGlzLl9zZXRTY29wZUxhYmVsKCk7XG5cblx0XHQvLyBFbmFibGUvZGlzYWJsZSBSb29tIGFuZCBVc2VyIHRvb2xzXG5cdFx0Y29uc3QgZGlzYWJsZWQgPSB0aGlzLl9zZWxlY3RlZFpvbmUgPT0gdW5kZWZpbmVkO1xuXG5cdFx0Ly8gKE5PVEU6IHRoaXMgZW5hYmxlcy9kaXNhYmxlcyB3aG9sZSBmaWVsZHNldDsgdGhpcyBkb2Vzbid0IGFmZmVjdCBLZW5kbyBEcm9wRG93biwgc28gd2UgaGF2ZSB0byBkbyBpdCBtYW51YWxseSlcblx0XHQkKCcjcm9vbVRvb2xzJykuYXR0cignZGlzYWJsZWQnLCBkaXNhYmxlZCk7XG5cdFx0JCgnI3VzZXJUb29scycpLmF0dHIoJ2Rpc2FibGVkJywgZGlzYWJsZWQpO1xuXG5cdFx0dGhpcy5fZ3JvdXBzRHJvcERvd24uZW5hYmxlKCFkaXNhYmxlZCk7XG5cblx0XHQvLyBTZXQgbWFpbiBjb250cm9scyBzdGF0ZVxuXHRcdHRoaXMuX3NldE1haW5Db250cm9sc0VuYWJsZWQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBVcGRhdGUgdGhlIFNjb3BlIGxhYmVsIGluIHRoZSBVc2VycyBwYW5lbC5cblx0ICovXG5cdF9vblJvb21TZWxlY3RlZCgpXG5cdHtcblx0XHQvLyBDbGVhciBVc2VyIGxpc3Rcblx0XHR0aGlzLl9yZXNldFVzZXJMaXN0KCk7XG5cblx0XHQvLyBTZXQgc2NvcGUgbGFiZWxcblx0XHR0aGlzLl9zZXRTY29wZUxhYmVsKCk7XG5cblx0XHQvLyBFbmFibGUgUmVtb3ZlIGJ1dHRvblxuXHRcdCQoJyN6bm0tcmVtb3ZlUm9vbUJ0JykuYXR0cignZGlzYWJsZWQnLCB0aGlzLl9zZWxlY3RlZFJvb20gPT0gdW5kZWZpbmVkKTtcblxuXHRcdC8vIFNldCBtYWluIGNvbnRyb2xzIHN0YXRlXG5cdFx0dGhpcy5fc2V0TWFpbkNvbnRyb2xzRW5hYmxlZCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFVwZGF0ZSB0aGUgc2NvcGUgbGFiZWwgaW4gdGhlIFVzZXJzIHBhbmVsLlxuXHQgKi9cblx0X29uR3JvdXBDaGFuZ2UoKVxuXHR7XG5cdFx0Ly8gQ2xlYXIgUm9vbSBhbmQgVXNlciBsaXN0c1xuXHRcdHRoaXMuX3Jlc2V0Um9vbUxpc3QoKTtcblx0XHR0aGlzLl9yZXNldFVzZXJMaXN0KCk7XG5cblx0XHQvLyBTZXQgc2NvcGUgbGFiZWxcblx0XHR0aGlzLl9zZXRTY29wZUxhYmVsKCk7XG5cblx0XHQvLyBSZXF1ZXN0IGRhdGEgdG8gc2VydmVyXG5cdFx0dGhpcy5fcmVxdWVzdERhdGEodHJ1ZSk7XG5cblx0XHQvLyBTZXQgbWFpbiBjb250cm9scyBzdGF0ZVxuXHRcdHRoaXMuX3NldE1haW5Db250cm9sc0VuYWJsZWQoKTtcblx0fVxuXG5cdF9vblVzZXJTZWxlY3RlZCgpXG5cdHtcblx0XHQvLyBTZXQgbWFpbiBjb250cm9scyBzdGF0ZVxuXHRcdHRoaXMuX3NldE1haW5Db250cm9sc0VuYWJsZWQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTaG93IHJvb20gY3JlYXRpb24gcGFuZWwuXG5cdCAqL1xuXHRfb25DcmVhdGVSb29tQnRDbGljaygpXG5cdHtcblx0XHQvLyBEaXNhYmxlIENyZWF0ZSBidXR0b25cblx0XHQkKCcjem5tLWNyZWF0ZVJvb21CdCcpLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSk7XG5cblx0XHQvLyBSZXF1ZXN0IGRlZmF1bHQgcm9vbSBzZXR0aW5ncyB0byBleHRlbnNpb25cblx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX0dFVF9ST09NX0NPTkZJRyk7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlIGV4aXN0aW5nIHJvb20uXG5cdCAqL1xuXHRfb25SZW1vdmVSb29tQnRDbGljaygpXG5cdHtcblx0XHR0aGlzLnNoZWxsQ3RybC5zaG93Q29uZmlybVdhcm5pbmcoJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byByZW1vdmUgdGhlIHNlbGVjdGVkIFJvb20/JywgJC5wcm94eSh0aGlzLl9vblJlbW92ZVJlbW92ZUNvbmZpcm0sIHRoaXMpKTtcblx0fVxuXG5cdF9vblJlbW92ZVJlbW92ZUNvbmZpcm0oKVxuXHR7XG5cdFx0Y29uc3Qgc2VsZWN0ZWRab25lID0gdGhpcy5fem9uZUxpc3RCb3guZGF0YUl0ZW0odGhpcy5fem9uZUxpc3RCb3guc2VsZWN0KCkpO1xuXHRcdGxldCBzZWxlY3RlZFJvb20gPSB0aGlzLl9yb29tTGlzdEJveC5kYXRhSXRlbSh0aGlzLl9yb29tTGlzdEJveC5zZWxlY3QoKSk7XG5cblx0XHRpZiAoc2VsZWN0ZWRSb29tKVxuXHRcdHtcblx0XHRcdC8vIFNlbmQgcmVxdWVzdCB0byBzZXJ2ZXJcblx0XHRcdGxldCBwYXJhbXMgPSBuZXcgU0ZTMlguU0ZTT2JqZWN0KCk7XG5cdFx0XHRwYXJhbXMucHV0VXRmU3RyaW5nKCd6b25lJywgc2VsZWN0ZWRab25lLm5hbWUpO1xuXHRcdFx0cGFyYW1zLnB1dFV0ZlN0cmluZygncm9vbScsIHNlbGVjdGVkUm9vbS5uYW1lKTtcblxuXHRcdFx0dGhpcy5zZW5kRXh0ZW5zaW9uUmVxdWVzdCh0aGlzLlJFUV9SRU1PVkVfUk9PTSwgcGFyYW1zKTtcblxuXHRcdFx0Ly8gUmVxdWVzdCBkYXRhIHRvIHNlcnZlciB0byB1cGRhdGUgdGhlIHJvb21zIGxpc3Rcblx0XHRcdHRoaXMuX3JlcXVlc3REYXRhKHRydWUpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmUgY29udGVudCBvZiByb29tIGNyZWF0aW9uIHBhbmVsLlxuXHQgKi9cblx0X29uQ3JlYXRlUm9vbU1vZGFsSGlkZGVuKGUpXG5cdHtcblx0XHQvLyBJZiBhIG5lc3RlZCBtb2RhbCBpcyBvcGVuZWQsIGl0cyBjbG9zaW5nIGNhdXNlcyB0aGUgcGFyZW50IG1vZGFsIHRvIGJlIGNsb3NlZCB0b28gKEJvb3RzdHJhcCBkb2Vzbid0IHN1cHBvcnQgbmVzdGVkIG1vZGFscylcblx0XHQvLyBBcyBhIHdvcmthcm91bmQsIGhlcmUgd2UgcmVzZXQgdGhlIGNzcyBjbGFzcyAnbW9kYWwtb3Blbicgd2hlbiB0aGUgbmVzdGVkIG1vZGFsIGlzIGNsb3NlZCBhbmQgc2tpcCBldmVyeXRoaW5nIGVsc2Vcblx0XHQvLyBJbiBhZGRpdGlvbiB3ZSBoYWQgdG8gdXNlIGEgY3VzdG9tIGxpc3RlbmVyIG9uIHRoZSBjbG9zZS9jYW5jZWwgYnV0dG9ucyBvZiB0aGUgbmVzdGVkIG1vZGFsIChzZWUgY29uZmlnLWdyaWQuanMgZm9yIGV4YW1wbGUpXG5cdFx0aWYgKGUudGFyZ2V0ICE9PSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnem5tLWNyZWF0ZVJvb21Nb2RhbCcpKVxuXHRcdHtcblx0XHRcdCQoJ2JvZHknKS5hZGRDbGFzcygnbW9kYWwtb3BlbicpXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gRGVzdHJveSBzY3JvbGxpbmcgdGFicyBpbiByb29tIGNyZWF0aW9uIHBhbmVsXG5cdFx0JCgnI3pubS1yb29tQ3JlYXRvclRhYk5hdiAjdGFicycpLnNjcm9sbGluZ1RhYnMoJ2Rlc3Ryb3knKTtcblxuXHRcdC8vIFJlbW92ZSBhbGwgdGFiIG5hdmlnYXRvciBjb250ZW50XG5cdFx0dGhpcy5fcm9vbUNyZWF0aW9uSUJ1aWxkZXIuZGVzdHJveUludGVyZmFjZSgpO1xuXG5cdFx0Ly8gUmVtb3ZlIGxpc3RlbmVyIGZvciBjdXN0b20gYWN0aW9ucyB0cmlnZ2VyZWQgYnkgY29uZmlndXJhdGlvbiBpbnRlcmZhY2Vcblx0XHQkKCcjem5tLXJvb21DcmVhdG9yVGFiTmF2Jykub2ZmKCd2YWx1ZS1zZXQnKTtcblxuXHRcdC8vIFJlc2V0IGFuZCBoaWRlIGVycm9yIG1lc3NhZ2Vcblx0XHR0aGlzLl9yZXNldFJvb21DcmVhdGlvbkVycm9yKCk7XG5cdH1cblxuXHRfb25Db25maWdWYWx1ZVNldChlKSAvLyBTQU1FIE1FVEhPRCBEVVBMSUNBVEVEIElOIHpvbmUtY29uZmlndXJhdG9yLmpzXG5cdHtcblx0XHRjb25zdCBjb25maWdQYXJhbSA9IGUudGFyZ2V0LmRhdGE7XG5cblx0XHQvLyBIYW5kbGUgZXh0ZW5zaW9uIG5hbWUvdHlwZSBkcm9wZG93bnMgdXBkYXRlIGFuZCB1cGRhdGUgdGhlIG1haW4gY2xhc3MgZHJvcGRvd24gZGF0YXNvdXJjZSBhY2NvcmRpbmdseVxuXHRcdGlmIChjb25maWdQYXJhbS5uYW1lID09ICdleHRlbnNpb24ubmFtZScgfHwgY29uZmlnUGFyYW0ubmFtZSA9PSAnZXh0ZW5zaW9uLnR5cGUnIHx8IGNvbmZpZ1BhcmFtLm5hbWUgPT0gJ2V4dGVuc2lvbi5maWx0ZXJDbGFzcycpXG5cdFx0e1xuXHRcdFx0Ly8gQWxsIGludm9sdmVkIENvbmZpZ0Zvcm1JdGVtcyBtdXN0IGJlIGF2YWlsYWJsZSBhbmQgaW5pdGlhbGl6ZWQgdG8gcHJvY2VlZFxuXHRcdFx0Y29uc3QgbmFtZUZvcm1JdGVtID0gdGhpcy5fcm9vbUNyZWF0aW9uSUJ1aWxkZXIuZ2V0Q29uZmlnRm9ybUl0ZW0oJ2V4dGVuc2lvbi5uYW1lJyk7XG5cdFx0XHRjb25zdCB0eXBlRm9ybUl0ZW0gPSB0aGlzLl9yb29tQ3JlYXRpb25JQnVpbGRlci5nZXRDb25maWdGb3JtSXRlbSgnZXh0ZW5zaW9uLnR5cGUnKTtcblx0XHRcdGNvbnN0IGNsYXNzRm9ybUl0ZW0gPSB0aGlzLl9yb29tQ3JlYXRpb25JQnVpbGRlci5nZXRDb25maWdGb3JtSXRlbSgnZXh0ZW5zaW9uLmZpbGUnKTtcblx0XHRcdGNvbnN0IGZpbHRlckZvcm1JdGVtID0gdGhpcy5fcm9vbUNyZWF0aW9uSUJ1aWxkZXIuZ2V0Q29uZmlnRm9ybUl0ZW0oJ2V4dGVuc2lvbi5maWx0ZXJDbGFzcycpO1xuXG5cdFx0XHRpZiAobmFtZUZvcm1JdGVtICE9IG51bGwgJiYgdHlwZUZvcm1JdGVtICE9IG51bGwgJiYgY2xhc3NGb3JtSXRlbSAhPSBudWxsICYmIGZpbHRlckZvcm1JdGVtICE9IG51bGwpXG5cdFx0XHR7XG5cdFx0XHRcdGNvbnN0IHNvdXJjZSA9IG5hbWVGb3JtSXRlbS5kYXRhO1xuXHRcdFx0XHRsZXQgY2xhc3Nlc0xpc3QgPSBbXTtcblxuXHRcdFx0XHRsZXQgZGF0YSA9IHNvdXJjZS50cmlnZ2VyRGF0YTtcblx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLnNpemUoKTsgaSsrKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IGV4dCA9IGRhdGEuZ2V0U0ZTT2JqZWN0KGkpO1xuXG5cdFx0XHRcdFx0aWYgKGV4dC5nZXRVdGZTdHJpbmcoJ25hbWUnKSA9PSBuYW1lRm9ybUl0ZW0uZGF0YS52YWx1ZSAmJiBleHQuZ2V0VXRmU3RyaW5nKCd0eXBlJykgPT0gdHlwZUZvcm1JdGVtLmRhdGEudmFsdWUpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IGNsYXNzZXMgPSBleHQuZ2V0VXRmU3RyaW5nKCdjbGFzc2VzU3RyaW5nJykuc3BsaXQoJywnKTtcblxuXHRcdFx0XHRcdFx0aWYgKGZpbHRlckZvcm1JdGVtLmRhdGEudmFsdWUgPT0gdHJ1ZSlcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bGV0IGZpbHRlcmVkQ2xhc3NlcyA9IGNsYXNzZXMuZmlsdGVyKGZpbHRlckNsYXNzTmFtZSk7XG5cdFx0XHRcdFx0XHRcdGNsYXNzZXMgPSBmaWx0ZXJlZENsYXNzZXM7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGNsYXNzZXNMaXN0ID0gY2xhc3Nlc0xpc3QuY29uY2F0KGNsYXNzZXMpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGxldCBjdXJyZW50Q2xhc3MgPSBjbGFzc0Zvcm1JdGVtLmRhdGEudmFsdWU7XG5cblx0XHRcdFx0Ly8gSWYgdGhlIGNsYXNzZXMgbGlzdCBkb2Vzbid0IGNvbnRhaW4gdGhlIGN1cnJlbnQgdmFsdWUsIGNyZWF0ZSBhbiBlbXB0eSBlbnRyeSBhbmQgcmVzZXQgdGhlIHZhbHVlXG5cdFx0XHRcdGlmIChjbGFzc2VzTGlzdC5pbmRleE9mKGN1cnJlbnRDbGFzcykgPCAwKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0aWYgKGNsYXNzZXNMaXN0Lmxlbmd0aCA9PSAwKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGNsYXNzZXNMaXN0LnB1c2goJycpO1xuXHRcdFx0XHRcdFx0Y3VycmVudENsYXNzID0gJyc7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdGN1cnJlbnRDbGFzcyA9IGNsYXNzZXNMaXN0WzBdO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0bGV0IG1haW5DbGFzc0Ryb3BEb3duID0gY2xhc3NGb3JtSXRlbS5faW5uZXJXaWRnZXQ7XG5cdFx0XHRcdG1haW5DbGFzc0Ryb3BEb3duLnNldERhdGFTb3VyY2UoY2xhc3Nlc0xpc3QpO1xuXG5cdFx0XHRcdGNsYXNzRm9ybUl0ZW0uZGF0YS52YWx1ZSA9IGN1cnJlbnRDbGFzcztcblx0XHRcdFx0Y2xhc3NGb3JtSXRlbS5fc2V0V2lkZ2V0VmFsdWUoKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRfb25Sb29tQ3JlYXRvckNyZWF0ZUJ0Q2xpY2soKVxuXHR7XG5cdFx0Ly8gUmVzZXQgYW5kIGhpZGUgZXJyb3IgbWVzc2FnZVxuXHRcdHRoaXMuX3Jlc2V0Um9vbUNyZWF0aW9uRXJyb3IoKTtcblxuXHRcdC8vIENoZWNrIHZhbGlkaXR5XG5cdFx0aWYgKHRoaXMuX3Jvb21DcmVhdGlvbklCdWlsZGVyLmNoZWNrSXNWYWxpZCgpKVxuXHRcdHtcblx0XHRcdGxldCBjaGFuZ2VzID0gdGhpcy5fcm9vbUNyZWF0aW9uSUJ1aWxkZXIuZ2V0Q2hhbmdlZERhdGEoKTtcblxuXHRcdFx0aWYgKGNoYW5nZXMuc2l6ZSgpID4gMClcblx0XHRcdHtcblx0XHRcdFx0Ly8gQ2hlY2sgdGhlIHJvb20gbmFtZSBhZ2FpbnN0IHRoZSByb29tcyBsaXN0IChkdXBsaWNhdGUgbmFtZXMgbm90IGFsbG93ZWQhKVxuXHRcdFx0XHRpZiAodHJ1ZSkvL3RoaXMuX3ZhbGlkYXRlTmV3Um9vbU5hbWUoY2hhbmdlcykpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHQvLyBEaXNhYmxlIHJvb20gY3JlYXRpb24gcGFuZWxcblx0XHRcdFx0XHR0aGlzLl9lbmFibGVDcmVhdGVSb29tUGFuZWwoZmFsc2UpO1xuXG5cdFx0XHRcdFx0Ly8gU2VuZCBzZXR0aW5ncyB0byBzZXJ2ZXIgaW5zdGFuY2Vcblx0XHRcdFx0XHRsZXQgcGFyYW1zID0gbmV3IFNGUzJYLlNGU09iamVjdCgpO1xuXHRcdFx0XHRcdHBhcmFtcy5wdXRTRlNBcnJheSgnc2V0dGluZ3MnLCBjaGFuZ2VzKTtcblx0XHRcdFx0XHRwYXJhbXMucHV0VXRmU3RyaW5nKCd6TmFtZScsIHRoaXMuX3pvbmVMaXN0Qm94LmRhdGFJdGVtKHRoaXMuX3pvbmVMaXN0Qm94LnNlbGVjdCgpKS5uYW1lKTtcblx0XHRcdFx0XHRwYXJhbXMucHV0Qm9vbCgnbm90aWZ5JywgJCgnI3pubS1ub3RpZnlDbGllbnRzQ0InKS5wcm9wKCdjaGVja2VkJykpO1xuXG5cdFx0XHRcdFx0Ly8gU2VuZCBzZXR0aW5ncyB0byBleHRlbnNpb25cblx0XHRcdFx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX0NSRUFURV9ST09NLCBwYXJhbXMpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0e1xuXHRcdFx0XHRcdC8vIFNob3cgYWxlcnRcblx0XHRcdFx0XHR0aGlzLnNoZWxsQ3RybC5zaG93U2ltcGxlQWxlcnQoJ1VuYWJsZSB0byBzdWJtaXQgY29uZmlndXJhdGlvbiBiZWNhdXNlIHRoZSBSb29tIG5hbWUgYWxyZWFkeSBleGlzdHM7IGR1cGxpY2F0ZSBuYW1lcyBhcmUgbm90IGFsbG93ZWQuJywgdHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdC8vIFNob3cgYWxlcnRcblx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dTaW1wbGVBbGVydCgnVW5hYmxlIHRvIHN1Ym1pdCBSb29tIGNvbmZpZ3VyYXRpb24gZHVlIHRvIGFuIGludmFsaWQgdmFsdWU7IHBsZWFzZSB2ZXJpZnkgdGhlIGhpZ2hsaWdodGVkIGZvcm0gZmllbGRzIGluIGFsbCB0YWJzLicsIHRydWUpO1xuXHRcdH1cblx0fVxuXG5cdF9vblNob3dSb29tRmlsdGVyQnRDbGljaygpXG5cdHtcblx0XHR0aGlzLl9yb29tRmlsdGVyLnNob3coKTtcblx0fVxuXG5cdF9vblNob3dVc2VyRmlsdGVyQnRDbGljaygpXG5cdHtcblx0XHR0aGlzLl91c2VyRmlsdGVyLnNob3coKTtcblx0fVxuXG5cdF9vbkFwcGx5QnRDaGFuZ2UoKVxuXHR7XG5cdFx0Ly8gUmVxdWVzdCBkYXRhIHRvIHNlcnZlclxuXHRcdHRoaXMuX3JlcXVlc3REYXRhKHRydWUpO1xuXHR9XG5cblx0X29uUm9vbUZpbHRlclVwZGF0ZWQoKVxuXHR7XG5cdFx0Ly8gRW5hYmxlL2Rpc2FibGUgXCJBcHBseVwiIGNoZWNrYm94XG5cdFx0JCgnI3pubS1hcHBseVJvb21GaWx0ZXJDQicpLmF0dHIoJ2Rpc2FibGVkJywgdGhpcy5fcm9vbUZpbHRlci5maWx0ZXJFeHByZXNzaW9uID09IG51bGwpO1xuXG5cdFx0Ly8gUmVxdWVzdCBkYXRhIHRvIHNlcnZlclxuXHRcdHRoaXMuX3JlcXVlc3REYXRhKHRydWUpO1xuXHR9XG5cblx0X29uVXNlckZpbHRlclVwZGF0ZWQoKVxuXHR7XG5cdFx0Ly8gRW5hYmxlL2Rpc2FibGUgXCJBcHBseVwiIGNoZWNrYm94XG5cdFx0JCgnI3pubS1hcHBseVVzZXJGaWx0ZXJDQicpLmF0dHIoJ2Rpc2FibGVkJywgdGhpcy5fdXNlckZpbHRlci5maWx0ZXJFeHByZXNzaW9uID09IG51bGwpO1xuXG5cdFx0Ly8gUmVxdWVzdCBkYXRhIHRvIHNlcnZlclxuXHRcdHRoaXMuX3JlcXVlc3REYXRhKHRydWUpO1xuXHR9XG5cblx0X29uTW9uaXRvclNlbGVjdGlvbkJ0Q2xpY2soKVxuXHR7XG5cdFx0aWYgKHRoaXMuX3NlbGVjdGVkWm9uZSlcblx0XHR7XG5cdFx0XHQvLyBDYW5jZWwgcHJldmlvdXMgbW9uaXRvcmluZ1xuXHRcdFx0dGhpcy5fb25DbG9zZU1vbml0b3JCdENsaWNrKCk7XG5cblx0XHRcdGxldCBnZXRab25lVXNlckNvdW50SGlzdG9yeSA9IGZhbHNlO1xuXG5cdFx0XHR0aGlzLl9tb25pdG9yZWRab25lID0gdGhpcy5fc2VsZWN0ZWRab25lLm5hbWU7XG5cblx0XHRcdC8vIFpvbmUgbXVzdCBiZSBtb25pdG9yZWRcblx0XHRcdGlmICh0aGlzLl9hY3RpdmVQYW5lbFR5cGUgPT0gJ3pvbmUnKVxuXHRcdFx0e1xuXHRcdFx0XHR0aGlzLl9tb25pdG9yZWRUeXBlID0gdGhpcy5NT05JVE9SRURfVFlQRV9aT05FO1xuXHRcdFx0XHR0aGlzLl9tb25pdG9yZWROYW1lID0gdGhpcy5fbW9uaXRvcmVkWm9uZTtcblxuXHRcdFx0XHRnZXRab25lVXNlckNvdW50SGlzdG9yeSA9IHRydWU7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJvb20gbXVzdCBiZSBtb25pdG9yZWRcblx0XHRcdGlmICh0aGlzLl9hY3RpdmVQYW5lbFR5cGUgPT0gJ3Jvb20nICYmIHRoaXMuX3NlbGVjdGVkUm9vbSAhPSB1bmRlZmluZWQpXG5cdFx0XHR7XG5cdFx0XHRcdHRoaXMuX21vbml0b3JlZFR5cGUgPSB0aGlzLk1PTklUT1JFRF9UWVBFX1JPT007XG5cdFx0XHRcdHRoaXMuX21vbml0b3JlZE5hbWUgPSB0aGlzLl9zZWxlY3RlZFJvb20ubmFtZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVXNlciBtdXN0IGJlIG1vbml0b3JlZFxuXHRcdFx0aWYgKHRoaXMuX2FjdGl2ZVBhbmVsVHlwZSA9PSAndXNlcicgJiYgdGhpcy5fc2VsZWN0ZWRVc2VyICE9IHVuZGVmaW5lZClcblx0XHRcdHtcblx0XHRcdFx0dGhpcy5fbW9uaXRvcmVkVHlwZSA9IHRoaXMuTU9OSVRPUkVEX1RZUEVfVVNFUjtcblx0XHRcdFx0dGhpcy5fbW9uaXRvcmVkTmFtZSA9IHRoaXMuX3NlbGVjdGVkVXNlci5uYW1lO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTaG93IGxvYWRpbmcgYmFyXG5cdFx0XHR0aGlzLl9zd2l0Y2hWaWV3KCd6bm0tbG9hZGluZycpO1xuXG5cdFx0XHQvLyBSZXF1ZXN0IGRhdGEgdG8gc2VydmVyXG5cdFx0XHR0aGlzLl9yZXF1ZXN0RGF0YSh0cnVlLCBnZXRab25lVXNlckNvdW50SGlzdG9yeSk7XG5cdFx0fVxuXHR9XG5cblx0X29uU2VuZEFkbWluTXNnSW5LZXlVcChldmVudClcblx0e1xuXHRcdGlmIChldmVudC5rZXkgIT09ICdFbnRlcicpXG5cdFx0XHRyZXR1cm47XG5cblx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdHRoaXMuX29uU2VuZEFkbWluTXNnQnRDbGljaygpO1xuXHR9XG5cblx0X29uU2VuZEFkbWluTXNnQnRDbGljaygpXG5cdHtcblx0XHRpZiAodGhpcy5fc2VsZWN0ZWRab25lICYmICQoJyN6bm0tbWVzc2FnZUluJykudmFsKCkgIT0gJycpXG5cdFx0e1xuXHRcdFx0Ly8gQnVpbGQgcmVxdWVzdCBwYXJhbWV0ZXJzXG5cdFx0XHRsZXQgcGFyYW1zID0gbmV3IFNGUzJYLlNGU09iamVjdCgpO1xuXG5cdFx0XHQvLyBBbHdheXMgaW5jbHVkZSB6b25lXG5cdFx0XHRwYXJhbXMucHV0VXRmU3RyaW5nKCd6b25lJywgdGhpcy5fc2VsZWN0ZWRab25lLm5hbWUpO1xuXG5cdFx0XHQvLyBTZW5kIG1lc3NhZ2UgdG8gcm9vbT9cblx0XHRcdGlmICh0aGlzLl9hY3RpdmVQYW5lbFR5cGUgPT0gJ3Jvb20nICYmIHRoaXMuX3NlbGVjdGVkUm9vbSAhPSB1bmRlZmluZWQpXG5cdFx0XHRcdHBhcmFtcy5wdXRVdGZTdHJpbmcoJ3Jvb20nLCB0aGlzLl9zZWxlY3RlZFJvb20ubmFtZSk7XG5cblx0XHRcdC8vIFNlbmQgbWVzc2FnZSB0byB1c2VyP1xuXHRcdFx0aWYgKHRoaXMuX2FjdGl2ZVBhbmVsVHlwZSA9PSAndXNlcicgJiYgdGhpcy5fc2VsZWN0ZWRVc2VyICE9IHVuZGVmaW5lZClcblx0XHRcdFx0cGFyYW1zLnB1dFV0ZlN0cmluZygndXNlcicsIHRoaXMuX3NlbGVjdGVkVXNlci5uYW1lKTtcblxuXHRcdFx0Ly8gQWRkIG1lc3NhZ2Vcblx0XHRcdHBhcmFtcy5wdXRVdGZTdHJpbmcoJ21zZycsICQoJyN6bm0tbWVzc2FnZUluJykudmFsKCkpO1xuXG5cdFx0XHQvLyBTZW5kIHJlcXVlc3QgdG8gZXh0ZW5zaW9uXG5cdFx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX0FETUlOX01TRywgcGFyYW1zKTtcblxuXHRcdFx0Ly8gQ2xlYXIgdGV4dCBpbnB1dFxuXHRcdFx0JCgnI3pubS1tZXNzYWdlSW4nKS52YWwoJycpO1xuXHRcdH1cblx0fVxuXG5cdF9vbkNsb3NlTW9uaXRvckJ0Q2xpY2soKVxuXHR7XG5cdFx0Ly8gU2F2ZSByZWYuIGZvciBsYXRlciB1c2FnZVxuXHRcdGNvbnN0IG1vbml0b3JlZFR5cGUgPSB0aGlzLl9tb25pdG9yZWRUeXBlO1xuXG5cdFx0dGhpcy5fbW9uaXRvcmVkWm9uZSA9IG51bGw7XG5cdFx0dGhpcy5fbW9uaXRvcmVkVHlwZSA9IG51bGw7XG5cdFx0dGhpcy5fbW9uaXRvcmVkTmFtZSA9IG51bGw7XG5cblx0XHQvLyBDbGVhciBnZW9sb2NhdGlvbiBVSVxuXHRcdHRoaXMuX2NsZWFyR2VvTG9jYXRpb25VSSgpO1xuXG5cdFx0Ly8gQ2xlYXIgbG9nIGRhdGFncmlkcyBkYXRhcHJvdmlkZXJzXG5cdFx0Ly8gTk9URTogYSB0cnktY2F0Y2ggaXMgdXNlZCBoZXJlIGJlY2F1c2UsIGZvciBhbiB1bmtub3duIHJlYXNvbiwgS2VuZG8gaXMgdGhyb3dpbmcgYW4gZXJyb3Igd2hlbiByZXNldHRpbmcgdGhlIGRhdGEgc291cmNlcyB3aGVuIHRoZSBtb2R1bGUgaXMgZGVzdHJveWVkXG5cdFx0dHJ5XG5cdFx0e1xuXHRcdFx0dGhpcy5fem9uZUV4dExvZ0dyaWQuc2V0RGF0YVNvdXJjZShbXSk7XG5cdFx0XHR0aGlzLl9yb29tRXh0TG9nR3JpZC5zZXREYXRhU291cmNlKFtdKTtcblx0XHR9XG5cdFx0Y2F0Y2ggKGUpIHsgLyogSWdub3JlICovIH1cblxuXHRcdC8vIExlYXZlIGVkaXQgbW9kZVxuXHRcdHRoaXMuX29uQ2FuY2VsQnRDbGljaygpO1xuXG5cdFx0Ly8gUmVhcnJhbmdlIG1vbml0b3JpbmcgaW50ZXJmYWNlXG5cdFx0dGhpcy5fc2V0TW9uaXRvcmluZ0ludGVyZmFjZSgpO1xuXG5cdFx0Ly8gQ2xlYXIgdGFiIG5hdmlnYXRvclxuXHRcdHRoaXMuX2NsZWFyVGFicyhtb25pdG9yZWRUeXBlKTtcblx0fVxuXG5cdF9vbkVkaXRCdENsaWNrKClcblx0e1xuXHRcdGlmICghdGhpcy5faXNFZGl0aW5nKVxuXHRcdHtcblx0XHRcdC8vIFNob3cgZWRpdCBjb250cm9sc1xuXHRcdFx0JCgnI3pubS1lZGl0Q29udHJvbHMnKS5zaG93KCk7XG5cblx0XHRcdC8vIEhpZGUgZWRpdCBidXR0b25cblx0XHRcdCQoJyN6bm0tZWRpdEJ0JykuaGlkZSgpO1xuXG5cdFx0XHQvLyBFbmFibGUgZWRpdGFibGUgZmllbGRzXG5cdFx0XHR0aGlzLl9pbnRlcmZhY2VCdWlsZGVyLmRpc2FibGVJbnRlcmZhY2UoZmFsc2UpO1xuXG5cdFx0XHR0aGlzLl9pc0VkaXRNb2RlID0gdHJ1ZTtcblx0XHR9XG5cdH1cblxuXHRfb25DYW5jZWxCdENsaWNrKClcblx0e1xuXHRcdGlmICh0aGlzLl9pc0VkaXRpbmcpXG5cdFx0e1xuXHRcdFx0Ly8gSGlkZSBlZGl0IGNvbnRyb2xzXG5cdFx0XHQkKCcjem5tLWVkaXRDb250cm9scycpLmhpZGUoKTtcblxuXHRcdFx0Ly8gU2hvdyBlZGl0IGJ1dHRvblxuXHRcdFx0JCgnI3pubS1lZGl0QnQnKS5zaG93KCk7XG5cblx0XHRcdC8vIERpc2FibGUgZWRpdGFibGUgZmllbGRzXG5cdFx0XHR0aGlzLl9pbnRlcmZhY2VCdWlsZGVyLmRpc2FibGVJbnRlcmZhY2UodHJ1ZSk7XG5cblx0XHRcdHRoaXMuX2lzRWRpdE1vZGUgPSBmYWxzZTtcblxuXHRcdFx0Ly8gSGlkZSB2YWxpZGF0aW9uIG1lc3NhZ2VzXG5cdFx0XHR0aGlzLl9pbnRlcmZhY2VCdWlsZGVyLnJlc2V0VmFsaWRhdGlvbigpO1xuXG5cdFx0XHQvLyBSZXF1ZXN0IGRhdGEgdG8gdXBkYXRlIGludGVyZmFjZSAodXBkYXRpbmcgc3VzcGVuZGVkIGluIGVkaXQgbW9kZSlcblx0XHRcdHRoaXMuX3JlcXVlc3REYXRhKHRydWUpO1xuXHRcdH1cblx0fVxuXG5cdF9vblN1Ym1pdEJ0Q2xpY2soKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2lzRWRpdGluZylcblx0XHR7XG5cdFx0XHQvLyBDaGVjayB2YWxpZGl0eVxuXHRcdFx0aWYgKHRoaXMuX2ludGVyZmFjZUJ1aWxkZXIuY2hlY2tJc1ZhbGlkKCkpXG5cdFx0XHR7XG5cdFx0XHRcdGxldCBjaGFuZ2VzID0gdGhpcy5faW50ZXJmYWNlQnVpbGRlci5nZXRDaGFuZ2VkRGF0YSgpO1xuXG5cdFx0XHRcdGlmIChjaGFuZ2VzLnNpemUoKSA+IDApXG5cdFx0XHRcdHtcblx0XHRcdFx0XHQvL2NvbnNvbGUubG9nKGNoYW5nZXMuZ2V0RHVtcCgpKVxuXG5cdFx0XHRcdFx0Ly8gU2VuZCBzZXR0aW5ncyB0byBzZXJ2ZXIgaW5zdGFuY2Vcblx0XHRcdFx0XHRsZXQgcGFyYW1zID0gbmV3IFNGUzJYLlNGU09iamVjdCgpO1xuXHRcdFx0XHRcdHBhcmFtcy5wdXRTRlNBcnJheSgnc2V0dGluZ3MnLCBjaGFuZ2VzKTtcblx0XHRcdFx0XHRwYXJhbXMucHV0VXRmU3RyaW5nKCd6b25lJywgdGhpcy5fbW9uaXRvcmVkWm9uZSk7XG5cblx0XHRcdFx0XHRpZiAodGhpcy5fbW9uaXRvcmVkVHlwZSA9PSB0aGlzLk1PTklUT1JFRF9UWVBFX1JPT00pXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0Ly8gU3VibWl0IHJvb20gc2V0dGluZ3Ncblx0XHRcdFx0XHRcdHBhcmFtcy5wdXRVdGZTdHJpbmcoJ3Jvb20nLCB0aGlzLl9tb25pdG9yZWROYW1lKTtcblx0XHRcdFx0XHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfU0VUX1JPT01fU0VUVElOR1MsIHBhcmFtcyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGVsc2UgaWYgKHRoaXMuX21vbml0b3JlZFR5cGUgPT0gdGhpcy5NT05JVE9SRURfVFlQRV9VU0VSKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdC8vIFN1Ym1pdCB1c2VyIHNldHRpbmdzXG5cdFx0XHRcdFx0XHRwYXJhbXMucHV0VXRmU3RyaW5nKCd1c2VyJywgdGhpcy5fbW9uaXRvcmVkTmFtZSk7XG5cdFx0XHRcdFx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX1NFVF9VU0VSX1NFVFRJTkdTLCBwYXJhbXMpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0Ly8gU3VibWl0IHpvbmUgc2V0dGluZ3Ncblx0XHRcdFx0XHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfU0VUX1pPTkVfU0VUVElOR1MsIHBhcmFtcyk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gTGVhdmUgZWRpdCBtb2RlXG5cdFx0XHRcdFx0dGhpcy5fb25DYW5jZWxCdENsaWNrKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGVsc2Vcblx0XHRcdHtcblx0XHRcdFx0Ly8gU2hvdyBhbGVydFxuXHRcdFx0XHR0aGlzLnNoZWxsQ3RybC5zaG93U2ltcGxlQWxlcnQoJ1VuYWJsZSB0byBzdWJtaXQgY2hhbmdlcyBkdWUgdG8gYW4gaW52YWxpZCB2YWx1ZTsgcGxlYXNlIHZlcmlmeSB0aGUgaGlnaGxpZ2h0ZWQgZm9ybSBmaWVsZHMgaW4gYWxsIHRhYnMuJywgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0X29uVGltZVJhbmdlQ2hhbmdlKClcblx0e1xuXHRcdGxldCB2YWx1ZXMgPSB0aGlzLl90aW1lU2xpZGVyLnZhbHVlKCk7XG5cblx0XHRpZiAodmFsdWVzWzBdID09IHZhbHVlc1sxXSlcblx0XHR7XG5cdFx0XHRpZiAodmFsdWVzWzFdID09IC0yNClcblx0XHRcdFx0dmFsdWVzWzFdID0gLTIzO1xuXG5cdFx0XHR2YWx1ZXNbMF0gPSB2YWx1ZXNbMV0gLSAxO1xuXG5cdFx0XHQvLyBSZXNldCB0aGUgdGltZSByYW5nZSBzbGlkZXIgdmFsdWUgKHdlIG5lZWQgdG8gdXNlIHNldFRpbWVvdXRcblx0XHRcdC8vIGJhY2F1c2UgZG9pbmcgaXQgaW4gdGhlIGNoYW5nZSBldmVudCBsaXN0ZW5lciBkb2Vzbid0IHJlZHJhdyB0aGUgc2xpZGVyKVxuXHRcdFx0c2V0VGltZW91dCgkLnByb3h5KCBmdW5jdGlvbih2YWx1ZXMpIHsgdGhpcy5fdGltZVNsaWRlci52YWx1ZSh2YWx1ZXMpOyB9LCB0aGlzKSwgMTAsIHZhbHVlcyk7XG5cdFx0fVxuXG5cdFx0dGhpcy5fdXNlckNvdW50Q2hhcnQucmFuZ2UgPSB2YWx1ZXM7XG5cdH1cblxuXHRfb25XaW5kb3dSZXNpemUoKVxuXHR7XG5cdFx0Ly8gUmVkcmF3IGNoYXJ0c1xuXHRcdHRoaXMuX3VzZXJDb3VudENoYXJ0LnJlZHJhdygpO1xuXHRcdHRoaXMuX3BhY2tldFF1ZXVlQ2hhcnQucmVkcmF3KCk7XG5cdFx0dGhpcy5fZHJvcHBlZE1zZ0NoYXJ0LnJlZHJhdygpO1xuXHRcdHRoaXMuX3dyaXR0ZW5EYXRhQ2hhcnQucmVkcmF3KCk7XG5cdFx0dGhpcy5fcmVhZERhdGFDaGFydC5yZWRyYXcoKTtcblxuXHRcdC8vIFJlZHJhdyB0aW1lIHJhbmdlIHNsaWRlclxuXHRcdHRoaXMuX3RpbWVTbGlkZXIucmVzaXplKCk7XG5cdH1cblxuXHRfb25Xb3Jkc1JlbG9hZEJ0Q2xpY2soKVxuXHR7XG5cdFx0aWYgKHRoaXMuX21vbml0b3JlZFR5cGUgPT0gdGhpcy5NT05JVE9SRURfVFlQRV9aT05FKVxuXHRcdHtcblx0XHRcdC8vIFNlbmQgcmVxdWVzdCB0byBleHRlbnNpb25cblx0XHRcdGxldCBwYXJhbXMgPSBuZXcgU0ZTMlguU0ZTT2JqZWN0KCk7XG5cdFx0XHRwYXJhbXMucHV0VXRmU3RyaW5nKCd6b25lJywgdGhpcy5fbW9uaXRvcmVkTmFtZSk7XG5cblx0XHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfUkVMT0FEX1dPUkRTLCBwYXJhbXMpO1xuXHRcdH1cblx0fVxuXG5cdF9vblpvbmVFeHRSZWxvYWRCdENsaWNrKClcblx0e1xuXHRcdGlmICh0aGlzLl9tb25pdG9yZWRUeXBlID09IHRoaXMuTU9OSVRPUkVEX1RZUEVfWk9ORSlcblx0XHR7XG5cdFx0XHQvLyBTZW5kIHJlcXVlc3QgdG8gZXh0ZW5zaW9uXG5cdFx0XHRsZXQgcGFyYW1zID0gbmV3IFNGUzJYLlNGU09iamVjdCgpO1xuXHRcdFx0cGFyYW1zLnB1dFV0ZlN0cmluZygnem9uZScsIHRoaXMuX21vbml0b3JlZE5hbWUpO1xuXG5cdFx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX1JFTE9BRF9aT05FX0VYVCwgcGFyYW1zKTtcblx0XHR9XG5cdH1cblxuXHRfb25LaWNrQnRDbGljaygpXG5cdHtcblx0XHRpZiAodGhpcy5fbW9uaXRvcmVkVHlwZSA9PSB0aGlzLk1PTklUT1JFRF9UWVBFX1VTRVIpXG5cdFx0e1xuXHRcdFx0Ly8gU2VuZCByZXF1ZXN0IHRvIGV4dGVuc2lvblxuXHRcdFx0bGV0IHBhcmFtcyA9IG5ldyBTRlMyWC5TRlNPYmplY3QoKTtcblx0XHRcdHBhcmFtcy5wdXRVdGZTdHJpbmcoJ3pvbmUnLCB0aGlzLl9tb25pdG9yZWRab25lKTtcblx0XHRcdHBhcmFtcy5wdXRVdGZTdHJpbmcoJ3VzZXInLCB0aGlzLl9tb25pdG9yZWROYW1lKTtcblx0XHRcdHBhcmFtcy5wdXRVdGZTdHJpbmcoJ21zZycsICQoJyN6bm0ta2lja01zZ0luJykudmFsKCkpO1xuXHRcdFx0cGFyYW1zLnB1dEludCgnZGVsYXknLCAodGhpcy5fa2lja0RlbGF5SW4udmFsdWUoKSAhPSBudWxsID8gTnVtYmVyKHRoaXMuX2tpY2tEZWxheUluLnZhbHVlKCkpIDogdGhpcy5LSUNLX0JBTl9ERUZBVUxUX0RFTEFZKSk7XG5cblx0XHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfS0lDS19VU0VSLCBwYXJhbXMpO1xuXG5cdFx0XHQvLyBSZXNldCBtZXNzYWdlXG5cdFx0XHQkKCcjem5tLWtpY2tNc2dJbicpLnZhbCgnJyk7XG5cdFx0fVxuXHR9XG5cblx0X29uQmFuQnRDbGljaygpXG5cdHtcblx0XHRpZiAodGhpcy5fbW9uaXRvcmVkVHlwZSA9PSB0aGlzLk1PTklUT1JFRF9UWVBFX1VTRVIpXG5cdFx0e1xuXHRcdFx0Ly8gU2VuZCByZXF1ZXN0IHRvIGV4dGVuc2lvblxuXHRcdFx0bGV0IHBhcmFtcyA9IG5ldyBTRlMyWC5TRlNPYmplY3QoKTtcblx0XHRcdHBhcmFtcy5wdXRVdGZTdHJpbmcoJ3pvbmUnLCB0aGlzLl9tb25pdG9yZWRab25lKTtcblx0XHRcdHBhcmFtcy5wdXRVdGZTdHJpbmcoJ3VzZXInLCB0aGlzLl9tb25pdG9yZWROYW1lKTtcblx0XHRcdHBhcmFtcy5wdXRVdGZTdHJpbmcoJ21zZycsICQoJyN6bm0tYmFuTXNnSW4nKS52YWwoKSk7XG5cdFx0XHRwYXJhbXMucHV0VXRmU3RyaW5nKCdtb2RlJywgdGhpcy5fYmFuTW9kZURkLnNlbGVjdCgpID4gMCA/IHRoaXMuX2Jhbk1vZGVEZC52YWx1ZSgpIDogJ05BTUUnKTtcblx0XHRcdHBhcmFtcy5wdXRJbnQoJ2RlbGF5JywgKHRoaXMuX2JhbkRlbGF5SW4udmFsdWUoKSAhPSBudWxsID8gTnVtYmVyKHRoaXMuX2JhbkRlbGF5SW4udmFsdWUoKSkgOiB0aGlzLktJQ0tfQkFOX0RFRkFVTFRfREVMQVkpKTtcblxuXHRcdFx0bGV0IGR1cmF0aW9uID0gdGhpcy5fYmFuRHVyYXRpb25Jbi52YWx1ZSgpICE9IG51bGwgPyBOdW1iZXIodGhpcy5fYmFuRHVyYXRpb25Jbi52YWx1ZSgpKSA6IDE7XG5cblx0XHRcdGlmICh0aGlzLl9iYW5EdXJVbml0RGQudmFsdWUoKSA9PSAnaG91cnMnKVxuXHRcdFx0XHRkdXJhdGlvbiA9IGR1cmF0aW9uICogNjA7XG5cdFx0XHRlbHNlIGlmICh0aGlzLl9iYW5EdXJVbml0RGQudmFsdWUoKSA9PSAnZGF5cycpXG5cdFx0XHRcdGR1cmF0aW9uID0gZHVyYXRpb24gKiA2MCAqIDI0O1xuXG5cdFx0XHRwYXJhbXMucHV0SW50KCdkdXJhdGlvbicsIGR1cmF0aW9uKTtcblxuXHRcdFx0dGhpcy5zZW5kRXh0ZW5zaW9uUmVxdWVzdCh0aGlzLlJFUV9CQU5fVVNFUiwgcGFyYW1zKTtcblxuXHRcdFx0Ly8gUmVzZXQgbWVzc2FnZVxuXHRcdFx0JCgnI3pubS1iYW5Nc2dJbicpLnZhbCgnJyk7XG5cdFx0fVxuXHR9XG5cblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0Ly8gUFJJVkFURSBNRVRIT0RTXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0X3NldE1vbml0b3JpbmdJbnRlcmZhY2UoKVxuXHR7XG5cdFx0Y29uc3QgZW5hYmxlZCA9ICh0aGlzLl9tb25pdG9yZWRUeXBlICE9IG51bGwgJiYgdGhpcy5fbW9uaXRvcmVkTmFtZSAhPSBudWxsKTtcblxuXHRcdC8vIFNob3cvaGlkZSBoZWFkZXIgYW5kIGZvb3RlclxuXHRcdGlmIChlbmFibGVkKVxuXHRcdHtcblx0XHRcdHRoaXMuX3N3aXRjaFZpZXcoYHpubS0ke3RoaXMuX21vbml0b3JlZFR5cGV9TW9uaXRvcmApO1xuXG5cdFx0XHQvLyBIZWFkZXIgdGl0bGVcblx0XHRcdGxldCB0aXRsZSA9ICdOb3cgbW9uaXRvcmluZyAnO1xuXG5cdFx0XHRpZiAodGhpcy5fbW9uaXRvcmVkVHlwZSA9PSB0aGlzLk1PTklUT1JFRF9UWVBFX1VTRVIpXG5cdFx0XHRcdHRpdGxlICs9IGBVc2VyOiA8c3Ryb25nPiR7dGhpcy5fbW9uaXRvcmVkTmFtZX08L3N0cm9uZz4gKFpvbmU6ICR7dGhpcy5fbW9uaXRvcmVkWm9uZX0pYDtcblx0XHRcdGVsc2UgaWYgKHRoaXMuX21vbml0b3JlZFR5cGUgPT0gdGhpcy5NT05JVE9SRURfVFlQRV9ST09NKVxuXHRcdFx0XHR0aXRsZSArPSBgUm9vbTogPHN0cm9uZz4ke3RoaXMuX21vbml0b3JlZE5hbWV9PC9zdHJvbmc+IChab25lOiAke3RoaXMuX21vbml0b3JlZFpvbmV9KWA7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHRpdGxlICs9IGBab25lOiA8c3Ryb25nPiR7dGhpcy5fbW9uaXRvcmVkWm9uZX08L3N0cm9uZz5gO1xuXG5cdFx0XHQkKCcjem5tLW1vbml0b3JlZEhlYWRlcicpLmh0bWwodGl0bGUpO1xuXHRcdFx0JCgnI3pubS1tb25pdG9yZWRGb290ZXInKS5zaG93KCk7XG5cblx0XHRcdC8vIFNob3cgcGFuZWxcblx0XHRcdHRoaXMuX3N3aXRjaFBhbmVsKCd6bm0tbWFpblBhbmVsJyk7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHR0aGlzLl9zd2l0Y2hWaWV3KCd6bm0tc2VsZWN0Jyk7XG5cblx0XHRcdCQoJyN6bm0tbW9uaXRvcmVkSGVhZGVyJykuaHRtbCgnJyk7XG5cdFx0XHQkKCcjem5tLW1vbml0b3JlZEZvb3RlcicpLmhpZGUoKTtcblxuXHRcdFx0Ly8gU2hvdyBwYW5lbFxuXHRcdFx0dGhpcy5fc3dpdGNoUGFuZWwoJ3pubS1zaWRlYmFyUGFuZWwnKTtcblx0XHR9XG5cdH1cblxuXHRfc3dpdGNoVmlldyh2aWV3SWQpXG5cdHtcblx0XHRkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnem5tLXZpZXdzdGFjaycpLnNlbGVjdGVkRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHZpZXdJZCk7XG5cdH1cblxuXHRfc3dpdGNoUGFuZWwocGFuZWxJZClcblx0e1xuXHRcdGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd6bm0tdmlldycpLnNlbGVjdGVkUGFuZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChwYW5lbElkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBCdWlsZCB0aGUgcG9sbGluZyByZXF1ZXN0IHRvIGJlIHNlbnQgdG8gdGhlIHNlcnZlciwgYmFzZWQgb24gdGhlIHNlbGVjdGlvbnMgYW5kIG90aGVyIHNldHRpbmdzIGluIHRoZSBhY2NvcmRpb24uXG5cdCAqL1xuXHRfcmVxdWVzdERhdGEobmV3SWQgPSBmYWxzZSwgZ2V0Wm9uZVVzZXJDb3VudEhpc3RvcnkgPSBmYWxzZSlcblx0e1xuXHRcdC8vIENsZWFyIHByZXZpb3VzIHJlcXVlc3Qgc2NoZWR1bGluZ1xuXHRcdGNsZWFyVGltZW91dCh0aGlzLl9yZXF1ZXN0VGltZXIpO1xuXG5cdFx0Ly8gQ2hlY2sgaWYgY29ubmVjdGlvbiBpcyBzdGlsbCBhdmFpbGFibGVcblx0XHRpZiAodGhpcy5zbWFydEZveC5pc0Nvbm5lY3RlZClcblx0XHR7XG5cdFx0XHRpZiAobmV3SWQpXG5cdFx0XHRcdHRoaXMuX2N1cnJlbnRSZXF1ZXN0SWQrKztcblxuXHRcdFx0Ly8gQnVpbGQgcmVxdWVzdCBwYXJhbWV0ZXJzXG5cdFx0XHRsZXQgcGFyYW1zID0gbmV3IFNGUzJYLlNGU09iamVjdCgpO1xuXG5cdFx0XHQvLyBUaGUgdXBkYXRlZCB6b25lcy9yb29tcy91c2VycyBsaXN0cyBhcmUgcmVxdWVzdGVkIGlmIHRoZSBjb3JyZXNwb25kaW5nIHBhbmVsIGlzIGRpc3BsYXllZCBvbmx5XG5cdFx0XHRjb25zdCBnZXRab25lcyA9ICh0aGlzLl9hY3RpdmVQYW5lbFR5cGUgPT0gJ3pvbmUnKTtcblx0XHRcdGNvbnN0IGdldFJvb21zID0gKHRoaXMuX2FjdGl2ZVBhbmVsVHlwZSA9PSAncm9vbScgJiYgdGhpcy5fc2VsZWN0ZWRab25lICE9IHVuZGVmaW5lZCk7XG5cdFx0XHRjb25zdCBnZXRVc2VycyA9ICh0aGlzLl9hY3RpdmVQYW5lbFR5cGUgPT0gJ3VzZXInICYmIHRoaXMuX3NlbGVjdGVkWm9uZSAhPSB1bmRlZmluZWQpO1xuXG5cdFx0XHQvLyAtLS0gWk9ORVMgLS0tXG5cdFx0XHRwYXJhbXMucHV0Qm9vbCgnem9uZXMnLCBnZXRab25lcyk7XG5cblx0XHRcdC8vIFJPT01TICYgVVNFUlNcblx0XHRcdGlmIChnZXRSb29tcyB8fCBnZXRVc2Vycylcblx0XHRcdHtcblx0XHRcdFx0Ly8gQ29tbW9uIGZpbHRlcmluZyBwYXJhbXM6XG5cblx0XHRcdFx0Ly8gYSkgem9uZSBuYW1lXG5cdFx0XHRcdHBhcmFtcy5wdXRVdGZTdHJpbmcoJ3pvbmUnLCB0aGlzLl9zZWxlY3RlZFpvbmUubmFtZSk7XG5cblx0XHRcdFx0Ly8gYikgZ3JvdXAgbmFtZVxuXHRcdFx0XHRwYXJhbXMucHV0VXRmU3RyaW5nKCdncm91cCcsIHRoaXMuX3NlbGVjdGVkR3JvdXAubmFtZSk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJPT01TXG5cdFx0XHRwYXJhbXMucHV0Qm9vbCgncm9vbXMnLCBnZXRSb29tcyk7XG5cdFx0XHRpZiAoZ2V0Um9vbXMpXG5cdFx0XHR7XG5cdFx0XHRcdC8vIEZpbHRlcmluZyBwYXJhbXM6XG5cblx0XHRcdFx0Ly8gYykgYWR2YW5jZWQgZmlsdGVyaW5nIHBhcmFtc1xuXHRcdFx0XHRpZiAoJCgnI3pubS1hcHBseVJvb21GaWx0ZXJDQicpLnByb3AoJ2NoZWNrZWQnKSAmJiB0aGlzLl9yb29tRmlsdGVyLmZpbHRlckV4cHJlc3Npb24gIT0gbnVsbClcblx0XHRcdFx0XHRwYXJhbXMucHV0U0ZTQXJyYXkoJ3JGaWx0ZXInLCB0aGlzLl9yb29tRmlsdGVyLmZpbHRlckV4cHJlc3Npb24udG9TRlNBcnJheSgpKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVVNFUlNcblx0XHRcdHBhcmFtcy5wdXRCb29sKCd1c2VycycsIGdldFVzZXJzKTtcblx0XHRcdGlmIChnZXRVc2Vycylcblx0XHRcdHtcblx0XHRcdFx0Ly8gRmlsdGVyaW5nIHBhcmFtczpcblxuXHRcdFx0XHQvLyBjKSByb29tIG5hbWVcblx0XHRcdFx0aWYgKHRoaXMuX3NlbGVjdGVkUm9vbSlcblx0XHRcdFx0XHRwYXJhbXMucHV0VXRmU3RyaW5nKCdyb29tJywgdGhpcy5fc2VsZWN0ZWRSb29tLm5hbWUpO1xuXG5cdFx0XHRcdC8vIGQpIGFkdmFuY2VkIGZpbHRlcmluZyBwYXJhbXNcblx0XHRcdFx0aWYgKCQoJyN6bm0tYXBwbHlVc2VyRmlsdGVyQ0InKS5wcm9wKCdjaGVja2VkJykgJiYgdGhpcy5fdXNlckZpbHRlci5maWx0ZXJFeHByZXNzaW9uICE9IG51bGwpXG5cdFx0XHRcdFx0cGFyYW1zLnB1dFNGU0FycmF5KCd1RmlsdGVyJywgdGhpcy5fdXNlckZpbHRlci5maWx0ZXJFeHByZXNzaW9uLnRvU0ZTQXJyYXkoKSk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIC0tLSBDVVJSRU5UTFkgTU9OSVRPUkVEIERBVEEgLS0tXG5cdFx0XHRpZiAodGhpcy5fbW9uaXRvcmVkVHlwZSAhPSBudWxsICYmIHRoaXMuX21vbml0b3JlZE5hbWUgIT0gbnVsbClcblx0XHRcdHtcblx0XHRcdFx0bGV0IG1vbml0b3JlZE9iaiA9IHRoaXMuX2dldEJhc2ljTW9uaXRvcmVkT2JqZWN0KCk7XG5cblx0XHRcdFx0aWYgKHRoaXMuX21vbml0b3JlZFR5cGUgPT0gdGhpcy5NT05JVE9SRURfVFlQRV9aT05FKVxuXHRcdFx0XHRcdG1vbml0b3JlZE9iai5wdXRCb29sKCd1YycsIGdldFpvbmVVc2VyQ291bnRIaXN0b3J5KTtcblxuXHRcdFx0XHRwYXJhbXMucHV0U0ZTT2JqZWN0KCdtb25pdG9yZWQnLCBtb25pdG9yZWRPYmopO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTZXQgcmVxdWVzdCBpZDsgd2hlbiBhIHJlc3BvbnNlIGlzIHJlY2VpdmVkLCB3ZSBjaGVjayBpdHMgaWQgbWF0Y2hlcyB0aGUgY3VycmVudCByZXF1ZXN0IGlkOiBpZiBub3QsIHRoZSByZXNwb25zZSBpcyBkaXNjYXJkZWRcblx0XHRcdHBhcmFtcy5wdXRJbnQoJ2lkJywgdGhpcy5fY3VycmVudFJlcXVlc3RJZCk7XG5cblx0XHRcdC8vIFNlbmQgcmVxdWVzdCB0byBleHRlbnNpb25cblx0XHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfR0VUX0RBVEEsIHBhcmFtcyk7XG5cblx0XHRcdC8vIFNjaGVkdWxlIG5leHQgcmVxdWVzdFxuXHRcdFx0dGhpcy5fcmVxdWVzdFRpbWVyID0gc2V0VGltZW91dCgkLnByb3h5KHRoaXMuX3JlcXVlc3REYXRhLCB0aGlzKSwgTnVtYmVyKHRoaXMuX2ludGVydmFsRHJvcERvd24udmFsdWUoKSkgKiAxMDAwKTtcblx0XHR9XG5cdH1cblxuXHRfZ2V0QmFzaWNNb25pdG9yZWRPYmplY3QoKVxuXHR7XG5cdFx0bGV0IG1vbml0b3JlZE9iaiA9IG5ldyBTRlMyWC5TRlNPYmplY3QoKTtcblxuXHRcdG1vbml0b3JlZE9iai5wdXRVdGZTdHJpbmcoJ3pvbmUnLCB0aGlzLl9tb25pdG9yZWRab25lKTtcblx0XHRtb25pdG9yZWRPYmoucHV0VXRmU3RyaW5nKCd0eXBlJywgdGhpcy5fbW9uaXRvcmVkVHlwZSk7XG5cdFx0bW9uaXRvcmVkT2JqLnB1dFV0ZlN0cmluZygnbmFtZScsIHRoaXMuX21vbml0b3JlZE5hbWUpO1xuXG5cdFx0cmV0dXJuIG1vbml0b3JlZE9iajtcblx0fVxuXG5cdF9zZXRab25lc0RhdGFQcm92aWRlcih6b25lc0RhdGEpXG5cdHtcblx0XHR0aGlzLl9zZXRMaXN0RGF0YVByb3ZpZGVyKHRoaXMuX3pvbmVMaXN0Qm94LCB6b25lc0RhdGEsIHRydWUpO1xuXHR9XG5cblx0X3NldFJvb21zRGF0YVByb3ZpZGVyKHJvb21zRGF0YSlcblx0e1xuXHRcdHRoaXMuX3NldExpc3REYXRhUHJvdmlkZXIodGhpcy5fcm9vbUxpc3RCb3gsIHJvb21zRGF0YSwgdHJ1ZSk7XG5cblx0XHQvLyBTZXQgUmVtb3ZlIGJ1dHRvbiBzdGF0ZVxuXHRcdCQoJyN6bm0tcmVtb3ZlUm9vbUJ0JykuYXR0cignZGlzYWJsZWQnLCB0aGlzLl9zZWxlY3RlZFJvb20gPT0gdW5kZWZpbmVkKTtcblx0fVxuXG5cdF9zZXRVc2Vyc0RhdGFQcm92aWRlcih1c2Vyc0RhdGEpXG5cdHtcblx0XHR0aGlzLl9zZXRMaXN0RGF0YVByb3ZpZGVyKHRoaXMuX3VzZXJMaXN0Qm94LCB1c2Vyc0RhdGEpO1xuXHR9XG5cblx0X3NldExpc3REYXRhUHJvdmlkZXIobGlzdFdpZGdldCwgbGlzdERhdGEsIGNvdW50VXNlcnMgPSBmYWxzZSlcblx0e1xuXHRcdC8vIFNhdmUgcmVmZXJlbmNlIHRvIHNlbGVjdGVkIGl0ZW0gbmFtZVxuXHRcdC8vIE5PVEU6IGFzIHdlIGFyZSBzdWJzdGl0dXRpbmcgdGhlIHdob2xlIGRhdGEgc291cmNlLCB3ZSBuZWVkIGl0IHRvIHJlLXNlbGVjdCB0aGUgc2FtZSBpdGVtIGFmdGVyIHVwZGF0ZVxuXHRcdGxldCBzZWxlY3RlZERhdGFJdGVtID0gbGlzdFdpZGdldC5kYXRhSXRlbShsaXN0V2lkZ2V0LnNlbGVjdCgpKTtcblx0XHRsZXQgc2VsZWN0ZWREYXRhSXRlbU5hbWUgPSBzZWxlY3RlZERhdGFJdGVtID8gc2VsZWN0ZWREYXRhSXRlbS5uYW1lIDogbnVsbDtcblxuXHRcdGxldCBkYXRhQXJyYXkgPSBbXTtcblxuXHRcdC8vIENvbnZlcnQgZGF0YSBjb21pbmcgZnJvbSBzZXJ2ZXJcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGxpc3REYXRhLnNpemUoKTsgaSsrKVxuXHRcdHtcblx0XHRcdGxldCBpdGVtRGF0YSA9IGxpc3REYXRhLmdldFNGU09iamVjdChpKTtcblxuXHRcdFx0bGV0IGl0ZW0gPSB7fTtcblx0XHRcdGl0ZW0ubmFtZSA9IGl0ZW1EYXRhLmdldFV0ZlN0cmluZygnbmFtZScpO1xuXG5cdFx0XHRpZiAoY291bnRVc2Vycylcblx0XHRcdFx0aXRlbS51c2VycyA9IGl0ZW1EYXRhLmdldEludCgndXNlcnMnKTtcblxuXHRcdFx0ZGF0YUFycmF5LnB1c2goaXRlbSk7XG5cdFx0fVxuXG5cdFx0Ly8gQ3JlYXRlIG5ldyBkYXRhIHNvdXJjZVxuXHRcdGxldCBsaXN0RFMgPSBuZXcga2VuZG8uZGF0YS5EYXRhU291cmNlKHtcblx0XHRcdGRhdGE6IGRhdGFBcnJheSxcblx0XHRcdHNjaGVtYToge1xuXHRcdFx0XHRtb2RlbDoge1xuXHRcdFx0XHRcdGlkOiAnbmFtZSdcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdHNvcnQ6IHtcblx0XHRcdFx0ZmllbGQ6ICduYW1lJyxcblx0XHRcdFx0ZGlyOiAnYXNjJ1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0Ly8gQXNzaWduIGRhdGEgc291cmNlIHRvIGxpc3Rcblx0XHRsaXN0V2lkZ2V0LnNldERhdGFTb3VyY2UobGlzdERTKTtcblxuXHRcdC8vIFNlbGVjdCBhZ2FpbiBwcmV2aW91c2x5IHNlbGVjdGVkIGl0ZW1cblx0XHRpZiAoc2VsZWN0ZWREYXRhSXRlbU5hbWUgIT0gbnVsbClcblx0XHR7XG5cdFx0XHRzZWxlY3RlZERhdGFJdGVtID0gbGlzdERTLmdldChzZWxlY3RlZERhdGFJdGVtTmFtZSk7XG5cblx0XHRcdGlmIChzZWxlY3RlZERhdGFJdGVtKVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgc2VsZWN0ZWRFbGVtZW50ID0gbGlzdFdpZGdldC53cmFwcGVyLmZpbmQoJ1tkYXRhLXVpZD1cIicgKyBzZWxlY3RlZERhdGFJdGVtLnVpZCArICdcIl0nKTtcblx0XHRcdFx0bGlzdFdpZGdldC5zZWxlY3Qoc2VsZWN0ZWRFbGVtZW50KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBSZXNldCBtYWluIGNvbnRyb2wgc3RhdGVcblx0XHR0aGlzLl9zZXRNYWluQ29udHJvbHNFbmFibGVkKCk7XG5cdH1cblxuXHRfc2V0R3JvdXBzRGF0YVByb3ZpZGVyKGdyb3Vwc0RhdGEpXG5cdHtcblx0XHQvLyBDcmVhdGUgR3JvdXBzIGFycmF5LCBhZGRpbmcgY29tbW9uIGVudHJpZXNcblx0XHRsZXQgZ3JvdXBzQXJyYXkgPSBbXG5cdFx0XHR0aGlzLl9nZXRHcm91cE9iaignJywgdGhpcy5BTllfTEFCRUwpLFxuXHRcdFx0dGhpcy5fZ2V0R3JvdXBPYmoodGhpcy5ERUZBVUxUX0dST1VQX05BTUUpXG5cdFx0XTtcblxuXHRcdC8vIFNhdmUgcmVmZXJlbmNlIHRvIHNlbGVjdGVkIGdyb3VwIG5hbWVcblx0XHQvLyBOT1RFOiBhcyB3ZSBhcmUgc3Vic3RpdHV0aW5nIHRoZSB3aG9sZSBkYXRhIHNvdXJjZSwgd2UgbmVlZCBpdCB0byByZS1zZWxlY3QgdGhlIHNhbWUgaXRlbSBhZnRlciB1cGRhdGVcblx0XHRsZXQgc2VsZWN0ZWREYXRhSXRlbSA9IHRoaXMuX3NlbGVjdGVkR3JvdXA7XG5cdFx0bGV0IHNlbGVjdGVkRGF0YUl0ZW1OYW1lID0gc2VsZWN0ZWREYXRhSXRlbSA/IHNlbGVjdGVkRGF0YUl0ZW0ubmFtZSA6IG51bGw7XG5cblx0XHRpZiAoZ3JvdXBzRGF0YSAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgZ3JvdXBzRGF0YS5sZW5ndGg7IGkrKylcblx0XHRcdHtcblx0XHRcdFx0aWYgKGdyb3Vwc0RhdGFbaV0gIT0gdGhpcy5ERUZBVUxUX0dST1VQX05BTUUpIC8vIERlZmF1bHQgZ3JvdXAgd2FzIGFkZGVkIGJlZm9yZVxuXHRcdFx0XHRcdGdyb3Vwc0FycmF5LnB1c2godGhpcy5fZ2V0R3JvdXBPYmooZ3JvdXBzRGF0YVtpXSkpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIENyZWF0ZSBuZXcgZGF0YSBzb3VyY2Vcblx0XHRsZXQgZ3JvdXBEUyA9IG5ldyBrZW5kby5kYXRhLkRhdGFTb3VyY2Uoe1xuXHRcdFx0ZGF0YTogZ3JvdXBzQXJyYXksXG5cdFx0XHRzY2hlbWE6IHtcblx0XHRcdFx0bW9kZWw6IHtcblx0XHRcdFx0XHRpZDogJ25hbWUnXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdC8vIEFzc2lnbiBkYXRhIHNvdXJjZSB0byBkcm9wZG93blxuXHRcdHRoaXMuX2dyb3Vwc0Ryb3BEb3duLnNldERhdGFTb3VyY2UoZ3JvdXBEUyk7XG5cblx0XHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0XHQvLyBTZWxlY3QgcHJldmlvdXNseSBzZWxlY3RlZCBpdGVtXG5cdFx0c2VsZWN0ZWREYXRhSXRlbSA9IGdyb3VwRFMuZ2V0KHNlbGVjdGVkRGF0YUl0ZW1OYW1lKTtcblxuXHRcdC8vIElmIGdyb3VwIGlzIG5vdCBmb3VuZCwgc2VsZWN0IHRoZSBkZWZhdWx0IG9uZVxuXHRcdGlmIChzZWxlY3RlZERhdGFJdGVtID09IHVuZGVmaW5lZClcblx0XHRcdHNlbGVjdGVkRGF0YUl0ZW0gPSBncm91cERTLmdldCh0aGlzLkRFRkFVTFRfR1JPVVBfTkFNRSk7XG5cblx0XHR0aGlzLl9ncm91cHNEcm9wRG93bi5zZWxlY3QoZnVuY3Rpb24oZGF0YUl0ZW0pIHtcblx0XHRcdHJldHVybiBkYXRhSXRlbS5uYW1lID09PSBzZWxlY3RlZERhdGFJdGVtLm5hbWU7XG5cdFx0fSk7XG5cdH1cblxuXHRfZ2V0R3JvdXBPYmoobmFtZSwgbGFiZWwgPSBudWxsKVxuXHR7XG5cdFx0cmV0dXJuIHtcblx0XHRcdG5hbWU6IG5hbWUsXG5cdFx0XHRsYWJlbDogKGxhYmVsICE9IG51bGwgPyBsYWJlbCA6IG5hbWUpXG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFVwZGF0ZSB0aGUgU2NvcGUgbGFiZWwgaW4gdGhlIFJvb21zIHBhbmVsIGFuZCBpbiB0aGUgVXNlcnMgcGFuZWwuXG5cdCAqL1xuXHRfc2V0U2NvcGVMYWJlbCgpXG5cdHtcblx0XHRsZXQgcm9vbVNjb3BlID0gJyc7XG5cdFx0bGV0IHVzZXJTY29wZSA9ICcnO1xuXG5cdFx0aWYgKHRoaXMuX3NlbGVjdGVkWm9uZSlcblx0XHR7XG5cdFx0XHRsZXQgem9uZU5hbWUgPSB0aGlzLl9zZWxlY3RlZFpvbmUubmFtZTtcblx0XHRcdHJvb21TY29wZSA9IHRoaXMuX2dldFNjb3BlTGFiZWxQYXJ0KCdab25lOicsIHpvbmVOYW1lKTtcblxuXHRcdFx0bGV0IHNlbGVjdGVkR3JvdXAgPSB0aGlzLl9zZWxlY3RlZEdyb3VwO1xuXHRcdFx0bGV0IGdyb3VwTmFtZSA9IChzZWxlY3RlZEdyb3VwICYmIHNlbGVjdGVkR3JvdXAubmFtZSAhPSAnJykgPyBzZWxlY3RlZEdyb3VwLm5hbWUgOiB0aGlzLkFOWV9MQUJFTDtcblx0XHRcdGxldCByb29tTmFtZSA9ICh0aGlzLl9zZWxlY3RlZFJvb20pID8gdGhpcy5fc2VsZWN0ZWRSb29tLm5hbWUgOiB0aGlzLkFOWV9MQUJFTDtcblxuXHRcdFx0dXNlclNjb3BlID0gdGhpcy5fZ2V0U2NvcGVMYWJlbFBhcnQoJ1pvbmU6Jywgem9uZU5hbWUpICsgJzxicj4nICsgdGhpcy5fZ2V0U2NvcGVMYWJlbFBhcnQoJ0dyb3VwOicsIGdyb3VwTmFtZSkgKyAnPGJyPicgKyB0aGlzLl9nZXRTY29wZUxhYmVsUGFydCgnUm9vbTonLCByb29tTmFtZSk7XG5cdFx0fVxuXG5cdFx0JCgnI3pubS1yb29tU2NvcGVMYicpLmh0bWwocm9vbVNjb3BlKTtcblx0XHQkKCcjem5tLXVzZXJTY29wZUxiJykuaHRtbCh1c2VyU2NvcGUpO1xuXHR9XG5cblx0X2dldFNjb3BlTGFiZWxQYXJ0KGxhYmVsLCB0ZXh0KVxuXHR7XG5cdFx0cmV0dXJuIGA8c3BhbiBjbGFzcz1cInRleHQtbXV0ZWRcIj4ke2xhYmVsfTwvc3Bhbj4gPHNwYW4+JHt0ZXh0fTwvc3Bhbj5gO1xuXHR9XG5cblx0X3Jlc2V0Um9vbUxpc3QoKVxuXHR7XG5cdFx0dGhpcy5fcm9vbUxpc3RCb3guc2V0RGF0YVNvdXJjZShbXSk7XG5cblx0XHQvLyBBbHNvIGRpc2FibGUgUmVtb3ZlIGJ1dHRvblxuXHRcdCQoJyN6bm0tcmVtb3ZlUm9vbUJ0JykuYXR0cignZGlzYWJsZWQnLCB0cnVlKTtcblx0fVxuXG5cdF9yZXNldFVzZXJMaXN0KClcblx0e1xuXHRcdHRoaXMuX3VzZXJMaXN0Qm94LnNldERhdGFTb3VyY2UoW10pO1xuXHR9XG5cblx0X3NldE1haW5Db250cm9sc0VuYWJsZWQoKVxuXHR7XG5cdFx0bGV0IGVuYWJsZWQgPSAodGhpcy5fYWN0aXZlUGFuZWxUeXBlID09ICd6b25lJyAmJiB0aGlzLl9zZWxlY3RlZFpvbmUgIT0gdW5kZWZpbmVkKVxuXHRcdFx0XHRcdHx8ICh0aGlzLl9hY3RpdmVQYW5lbFR5cGUgPT0gJ3Jvb20nICYmIHRoaXMuX3NlbGVjdGVkUm9vbSAhPSB1bmRlZmluZWQpXG5cdFx0XHRcdFx0fHwgKHRoaXMuX2FjdGl2ZVBhbmVsVHlwZSA9PSAndXNlcicgJiYgdGhpcy5fc2VsZWN0ZWRVc2VyICE9IHVuZGVmaW5lZCk7XG5cblx0XHQkKCcjem5tLW1haW5Db250cm9scycpLmF0dHIoJ2Rpc2FibGVkJywgIWVuYWJsZWQpO1xuXG5cdFx0JCgnI3pubS1tb25pdG9yVGFyZ2V0TGInKS50ZXh0KGVuYWJsZWQgPyBjYXBpdGFsaXplRmlyc3QodGhpcy5fYWN0aXZlUGFuZWxUeXBlKSA6ICdzZWxlY3Rpb24nKTtcblx0XHQkKCcjem5tLW1lc3NhZ2VJbicpLmF0dHIoJ3BsYWNlaG9sZGVyJywgJ01lc3NhZ2UgdG8gJyArIChlbmFibGVkID8gY2FwaXRhbGl6ZUZpcnN0KHRoaXMuX2FjdGl2ZVBhbmVsVHlwZSkgOiAnc2VsZWN0aW9uJykpO1xuXHR9XG5cblx0X3Nob3dMaW1pdEV4Y2VlZGVkV2FybmluZyhpY29uLCB0aXRsZSlcblx0e1xuXHRcdGljb24uYXR0cigndGl0bGUnLCB0aXRsZSk7XG5cblx0XHRpZiAodGl0bGUgIT0gJycpXG5cdFx0XHRpY29uLnJlbW92ZUNsYXNzKCdoaWRkZW4nKTtcblx0XHRlbHNlXG5cdFx0XHRpY29uLmFkZENsYXNzKCdoaWRkZW4nKTtcblx0fVxuXG5cdF9zaG93Um9vbUNyZWF0aW9uUGFuZWwocm9vbVNldHRpbmdzKVxuXHR7XG5cdFx0Ly8gQnVpbGQgdXNlciBpbnRlcmZhY2UgYmFzZWQgb24gcGFzc2VkIGRhdGFcblx0XHR0aGlzLl9yb29tQ3JlYXRpb25JQnVpbGRlci5idWlsZEludGVyZmFjZShyb29tU2V0dGluZ3MsICd6bm0tcm9vbUNyZWF0b3JUYWJOYXYnLCBmYWxzZSwgJ3JjJyk7XG5cblx0XHQvLyBFbmFibGUgc2Nyb2xsaW5nIHRhYnNcblx0XHQkKCcjem5tLXJvb21DcmVhdG9yVGFiTmF2ID4gI3RhYnMnKS5zY3JvbGxpbmdUYWJzKHtcblx0XHRcdGJvb3RzdHJhcFZlcnNpb246IDQsXG5cdFx0XHRzY3JvbGxUb1RhYkVkZ2U6IHRydWUsXG5cdFx0XHRlbmFibGVTd2lwaW5nOiB0cnVlLFxuXHRcdFx0ZGlzYWJsZVNjcm9sbEFycm93c09uRnVsbHlTY3JvbGxlZDogdHJ1ZSxcblx0XHRcdGNzc0NsYXNzTGVmdEFycm93OiAnZmEgZmEtY2hldnJvbi1sZWZ0Jyxcblx0XHRcdGNzc0NsYXNzUmlnaHRBcnJvdzogJ2ZhIGZhLWNoZXZyb24tcmlnaHQnXG5cdFx0fSk7XG5cblx0XHQvLyBSZXNldCBOb3RpZnkgY2xpZW50cyBjaGVja2JveFxuXHRcdCQoJyN6bm0tbm90aWZ5Q2xpZW50c0NCJykucHJvcCgnY2hlY2tlZCcsIHRydWUpO1xuXG5cdFx0Ly8gU2V0IGxpc3RlbmVyIGZvciBjdXN0b20gYWN0aW9ucyB0cmlnZ2VyZWQgYnkgY29uZmlndXJhdGlvbiBpbnRlcmZhY2Vcblx0XHQkKCcjem5tLXJvb21DcmVhdG9yVGFiTmF2Jykub24oJ3ZhbHVlLXNldCcsICQucHJveHkodGhpcy5fb25Db25maWdWYWx1ZVNldCwgdGhpcykpO1xuXG5cdFx0Ly8gRGlzcGxheSBwYW5lbFxuXHRcdCQoJyN6bm0tY3JlYXRlUm9vbU1vZGFsJykubW9kYWwoJ3Nob3cnKTtcblxuXHRcdC8vIFJlc2V0IGFuZCBoaWRlIGVycm9yIG1lc3NhZ2Vcblx0XHR0aGlzLl9yZXNldFJvb21DcmVhdGlvbkVycm9yKCk7XG5cdH1cblxuXHRfcmVzZXRSb29tQ3JlYXRpb25FcnJvcigpXG5cdHtcblx0XHQvLyBSZXNldCBhbmQgaGlkZSBlcnJvciBtZXNzYWdlXG5cdFx0JCgnI3pubS1jcmVhdGVSb29tRXJyb3InKS50ZXh0KCcnKTtcblx0XHQkKCcjem5tLWNyZWF0ZVJvb21FcnJvcicpLmhpZGUoKTtcblx0fVxuXG5cdF92YWxpZGF0ZU5ld1Jvb21OYW1lKGNoYW5nZXMpXG5cdHtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGNoYW5nZXMuc2l6ZSgpOyBpKyspXG5cdFx0e1xuXHRcdFx0Y29uc3Qgc2V0dGluZyA9IGNoYW5nZXMuZ2V0U0ZTT2JqZWN0KGkpO1xuXG5cdFx0XHRpZiAoc2V0dGluZy5jb250YWluc0tleSgnbmFtZScpICYmIHNldHRpbmcuZ2V0VXRmU3RyaW5nKCduYW1lJykgPT0gJ25hbWUnKVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBHZXQgbmFtZSB2YWx1ZVxuXHRcdFx0XHRjb25zdCBuYW1lID0gc2V0dGluZy5nZXRUZXh0KCd2YWx1ZScpO1xuXG5cdFx0XHRcdC8vIEdldCBkYXRhIHNvdXJjZVxuXHRcdFx0XHRjb25zdCBkcyA9IHRoaXMuX3Jvb21MaXN0Qm94LmRhdGFTb3VyY2UuZGF0YSgpO1xuXG5cdFx0XHRcdC8vIENoZWNrIGlmIG5hbWUgZXhpc3RzIGluIGRhdGEgc291cmNlXG5cdFx0XHRcdGZvciAobGV0IGogPSAwOyBqIDwgZHMubGVuZ3RoOyBqKyspXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRpZiAoZHNbal0ubmFtZSA9PSBuYW1lKVxuXHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRfZW5hYmxlQ3JlYXRlUm9vbVBhbmVsKGVuYWJsZSlcblx0e1xuXHRcdGxldCBtb2RhbEVsZW1lbnQgPSAkKCcjem5tLWNyZWF0ZVJvb21Nb2RhbCcpO1xuXG5cdFx0Ly8gRW5hYmxlIG1vZGFsIGNsb3NlIGJ1dHRvbnNcblx0XHQkKCdidXR0b25bZGF0YS1kaXNtaXNzPVwibW9kYWxcIl0nLCBtb2RhbEVsZW1lbnQpLmF0dHIoJ2Rpc2FibGVkJywgIWVuYWJsZSk7XG5cblx0XHQvLyBFbmFibGUgY3JlYXRlIGJ1dHRvblxuXHRcdCQoJyN6bm0tcm9vbUNyZWF0b3JDcmVhdGVCdCcsIG1vZGFsRWxlbWVudCkuYXR0cignZGlzYWJsZWQnLCAhZW5hYmxlKTtcblxuXHRcdC8vIEVuYWJsZSBjaGVja2JveFxuXHRcdCQoJyN6bm0tbm90aWZ5Q2xpZW50c0NCJywgbW9kYWxFbGVtZW50KS5hdHRyKCdkaXNhYmxlZCcsICFlbmFibGUpO1xuXG5cdFx0Ly8gRW5hYmxlIGNvbmZpZ3VyYXRpb24gaW50ZXJmYWNlXG5cdFx0dGhpcy5fcm9vbUNyZWF0aW9uSUJ1aWxkZXIuZGlzYWJsZUludGVyZmFjZSghZW5hYmxlKTtcblx0fVxuXG5cdF9jbGVhclRhYnMobW9uaXRvcmVkVHlwZSlcblx0e1xuXHRcdC8vIERlc3Ryb3kgc2Nyb2xsaW5nIHRhYnNcblx0XHQkKGAjem5tLSR7bW9uaXRvcmVkVHlwZX1UYWJOYXZpZ2F0b3IgI3RhYnNgKS5zY3JvbGxpbmdUYWJzKCdkZXN0cm95Jyk7XG5cblx0XHQvLyBSZW1vdmUgYWxsIHRhYiBuYXZpZ2F0b3IgY29udGVudFxuXHRcdHRoaXMuX2ludGVyZmFjZUJ1aWxkZXIuZGVzdHJveUludGVyZmFjZSgpO1xuXG5cdFx0Ly8gU2V0IGFsbCB0YWIgcGFuZWxzIGFzIGluYWN0aXZlXG5cdFx0JChgI3pubS0ke21vbml0b3JlZFR5cGV9VGFiTmF2aWdhdG9yICN0YWJQYW5lbHMgLnRhYi1wYW5lYCkucmVtb3ZlQ2xhc3MoJ3Nob3cgYWN0aXZlJyk7XG5cblx0XHQvLyBSZW1vdmUgdGFiIGNoYW5nZSBldmVudCBsaXN0ZW5lclxuXHRcdCQoJ2FbZGF0YS10b2dnbGU9XCJ0YWJcIl0nKS5vZmYoJ3Nob3duLmJzLnRhYicpO1xuXG5cdFx0dGhpcy5fc2tpcEluaXRUYWJzID0gZmFsc2U7XG5cdH1cblxuXHRfc2hvd1pvbmVUcmFmZmljRGF0YShkYXRhKVxuXHR7XG5cdFx0Ly8gQnVpbGQgdXNlciBjb3VudCBtb25pdG9yIGhpc3Rvcnlcblx0XHRpZiAoZGF0YS5jb250YWluc0tleSgnaGlzdG9yeScpKVxuXHRcdHtcblx0XHRcdGxldCB1c2VyQ291bnREYXRhID0gZGF0YS5nZXRJbnRBcnJheSgnaGlzdG9yeScpO1xuXHRcdFx0bGV0IHNhbXBsaW5nUmF0ZU1pbnMgPSBkYXRhLmdldEludCgncmF0ZScpO1xuXG5cdFx0XHR0aGlzLl91c2VyQ291bnRDaGFydC5hZGRIaXN0b3J5RW50cmllcyh1c2VyQ291bnREYXRhLCBzYW1wbGluZ1JhdGVNaW5zICogNjApO1xuXHRcdH1cblxuXHRcdC8vIEFkZCBsYXN0IHVzZXIgY291bnQgdmFsdWVcblx0XHR0aGlzLl91c2VyQ291bnRDaGFydC5hZGRFbnRyeShkYXRhLmdldEludCgnY3VycmVudCcpKTtcblx0fVxuXG5cdF9hZGRMb2dFbnRyeVRvR3JpZChncmlkLCBpdGVtKVxuXHR7XG5cdFx0bGV0IGRzID0gZ3JpZC5kYXRhU291cmNlO1xuXG5cdFx0Ly8gQ2hlY2sgaXRlbXMgbGltaXRcblx0XHRpZiAoZHMudG90YWwoKSA9PSB0aGlzLk1BWF9FWFRFTlNJT05fTE9HX1NJWkUpXG5cdFx0XHRkcy5yZW1vdmUoZHMuYXQoMCkpO1xuXG5cdFx0ZHMuYWRkKGl0ZW0pO1xuXHR9XG5cblx0X3Nob3dVc2VyU3RhdHNEYXRhKGRhdGEpXG5cdHtcblx0XHQvLyBQYWNrZXQgcXVldWUgZmlsbGluZyAlXG5cdFx0bGV0IHBhY2tldFF1ZXVlID0gcm91bmRUb0RlY2ltYWxzKGRhdGEuZ2V0RmxvYXQoJ3BhY2tldCcpLCAyKTtcblx0XHR0aGlzLl9wYWNrZXRRdWV1ZUNoYXJ0LnNldERhdGFTb3VyY2UoW3tjYXRlZ29yeTogJ1F1ZXVlJywgdmFsdWU6IHBhY2tldFF1ZXVlfV0pO1xuXG5cdFx0Ly8gRHJvcHBlZCBtZXNzYWdlc1xuXHRcdGxldCBkcm9wcGVkTXNnID0gZGF0YS5nZXRJbnQoJ2Ryb3BwZWQnKTtcblx0XHR0aGlzLl9kcm9wcGVkTXNnQ2hhcnQuc2V0RGF0YVNvdXJjZShbe2NhdGVnb3J5OiAnRHJvcHBlZCcsIHZhbHVlOiBkcm9wcGVkTXNnfV0pO1xuXG5cdFx0Ly8gV3JpdHRlbiBkYXRhIGFtb3VudFxuXHRcdGxldCB3cml0dGVuRGF0YU9iaiA9IHNjYWxlQnl0ZXMoZGF0YS5nZXRMb25nKCd3Qnl0ZXMnKSwgMik7XG5cdFx0dGhpcy5fd3JpdHRlbkRhdGFDaGFydC5zZXREYXRhU291cmNlKFt7Y2F0ZWdvcnk6ICdXcml0dGVuJywgdmFsdWU6IHdyaXR0ZW5EYXRhT2JqLnZhbHVlLCB1bml0OiB3cml0dGVuRGF0YU9iai51bml0fV0pO1xuXG5cdFx0Ly8gUmVhZCBkYXRhIGFtb3VudFxuXHRcdGxldCByZWFkRGF0YU9iaiA9IHNjYWxlQnl0ZXMoZGF0YS5nZXRMb25nKCdyQnl0ZXMnKSwgMik7XG5cdFx0dGhpcy5fcmVhZERhdGFDaGFydC5zZXREYXRhU291cmNlKFt7Y2F0ZWdvcnk6ICdSZWFkJywgdmFsdWU6IHJlYWREYXRhT2JqLnZhbHVlLCB1bml0OiByZWFkRGF0YU9iai51bml0fV0pO1xuXHR9XG5cblx0X3NldEdlb0xvY2F0aW9uVUkoZ2VvTG9jRGF0YSlcblx0e1xuXHRcdGNvbnN0IGxvY2F0aW9uID0gZ2VvTG9jRGF0YS5nZXRVdGZTdHJpbmcoJ2xvY2F0aW9uJyk7XG5cdFx0Y29uc3QgZXJyb3IgPSBnZW9Mb2NEYXRhLmdldFV0ZlN0cmluZygnZXJyb3InKTtcblx0XHRjb25zdCBsYXRpdHVkZSA9IGdlb0xvY0RhdGEuZ2V0VXRmU3RyaW5nKCdsYXRpdHVkZScpO1xuXHRcdGNvbnN0IGxvbmdpdHVkZSA9IGdlb0xvY0RhdGEuZ2V0VXRmU3RyaW5nKCdsb25naXR1ZGUnKTtcblxuXHRcdC8vIFNob3cgbG9jYXRpb25cblx0XHQkKCcjem5tLWdlb0xvY2F0aW9uTGInKS50ZXh0KGxvY2F0aW9uKTtcblxuXHRcdC8vIExvZyBlcnJvclxuXHRcdGlmIChlcnJvciAhPSAnJylcblx0XHRcdHRoaXMuc2hlbGxDdHJsLmxvZ01lc3NhZ2UoZXJyb3IsICd3YXJuJyk7XG5cblx0XHQvLyBFbmFibGUvZGlzYWJsZSBTaG93IG1hcCBidXR0b25cblx0XHRpZiAobGF0aXR1ZGUgIT0gJycgJiYgbG9uZ2l0dWRlICE9ICcnKVxuXHRcdHtcblx0XHRcdCQoJyN6bm0tc2hvd01hcEJ0JykuYXR0cignZGlzYWJsZWQnLCBmYWxzZSk7XG5cblx0XHRcdGNvbnN0IHVybCA9IGBodHRwczovL3d3dy5nb29nbGUuY29tL21hcHMvc2VhcmNoLz9hcGk9MSZxdWVyeT0ke051bWJlcihsYXRpdHVkZSkgKyAnLCcgKyBOdW1iZXIobG9uZ2l0dWRlKX1gO1xuXHRcdFx0JCgnI3pubS1zaG93TWFwQnQnKS5hdHRyKCdocmVmJywgdXJsKTtcblx0XHR9XG5cdH1cblxuXHRfY2xlYXJHZW9Mb2NhdGlvblVJKClcblx0e1xuXHRcdCQoJyN6bm0tZ2VvTG9jYXRpb25MYicpLnRleHQoJycpO1xuXHRcdCQoJyN6bm0tc2hvd01hcEJ0JykuYXR0cignZGlzYWJsZWQnLCB0cnVlKTtcblx0XHQkKCcjem5tLXNob3dNYXBCdCcpLmF0dHIoJ2hyZWYnLCAnIycpO1xuXHR9XG5cblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0Ly8gUFJJVkFURSBHRVRURVJTXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0Z2V0IF9hY3RpdmVQYW5lbFR5cGUoKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2FjY29yZGlvbi5zZWxlY3QoKS5kYXRhKCdpdGVtVHlwZScpO1xuXHR9XG5cblx0Z2V0IF9zZWxlY3RlZFpvbmUoKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3pvbmVMaXN0Qm94LmRhdGFJdGVtKHRoaXMuX3pvbmVMaXN0Qm94LnNlbGVjdCgpKTtcblx0fVxuXG5cdGdldCBfc2VsZWN0ZWRHcm91cCgpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fZ3JvdXBzRHJvcERvd24uZGF0YUl0ZW0odGhpcy5fZ3JvdXBzRHJvcERvd24uc2VsZWN0KCkpO1xuXHR9XG5cblx0Z2V0IF9zZWxlY3RlZFJvb20oKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3Jvb21MaXN0Qm94LmRhdGFJdGVtKHRoaXMuX3Jvb21MaXN0Qm94LnNlbGVjdCgpKTtcblx0fVxuXG5cdGdldCBfc2VsZWN0ZWRVc2VyKClcblx0e1xuXHRcdHJldHVybiB0aGlzLl91c2VyTGlzdEJveC5kYXRhSXRlbSh0aGlzLl91c2VyTGlzdEJveC5zZWxlY3QoKSk7XG5cdH1cblxuXHRnZXQgX2lzRWRpdGluZygpXG5cdHtcblx0XHRyZXR1cm4gKHRoaXMuX21vbml0b3JlZFR5cGUgIT0gbnVsbCAmJiB0aGlzLl9tb25pdG9yZWROYW1lICE9IG51bGwgJiYgdGhpcy5faXNFZGl0TW9kZSk7XG5cdH1cbn1cbiIsImV4cG9ydCBjbGFzcyBSb29tUHJvcGVydGllc0RhdGFcbntcblx0c3RhdGljIGdldCBMQUJFTFMoKSB7XG5cdFx0bGV0IG1hcCA9IG5ldyBNYXAoKTtcblxuXHRcdG1hcC5zZXQoU0ZTMlguUm9vbVByb3BlcnRpZXMuTkFNRSwgJ25hbWUnKTtcblx0XHRtYXAuc2V0KFNGUzJYLlJvb21Qcm9wZXJ0aWVzLkdST1VQX0lELCAnZ3JvdXBJZCcpO1xuXHRcdG1hcC5zZXQoU0ZTMlguUm9vbVByb3BlcnRpZXMuTUFYX1VTRVJTLCAnbWF4VXNlcnMnKTtcblx0XHRtYXAuc2V0KFNGUzJYLlJvb21Qcm9wZXJ0aWVzLk1BWF9TUEVDVEFUT1JTLCAnbWF4U3BlY3RhdG9ycycpO1xuXHRcdG1hcC5zZXQoU0ZTMlguUm9vbVByb3BlcnRpZXMuVVNFUl9DT1VOVCwgJ3VzZXJDb3VudCcpO1xuXHRcdG1hcC5zZXQoU0ZTMlguUm9vbVByb3BlcnRpZXMuU1BFQ1RBVE9SX0NPVU5ULCAnc3BlY3RhdG9yQ291bnQnKTtcblx0XHRtYXAuc2V0KFNGUzJYLlJvb21Qcm9wZXJ0aWVzLklTX0dBTUUsICdpc0dhbWUnKTtcblx0XHRtYXAuc2V0KFNGUzJYLlJvb21Qcm9wZXJ0aWVzLklTX1BSSVZBVEUsICdpc1ByaXZhdGUnKTtcblx0XHRtYXAuc2V0KFNGUzJYLlJvb21Qcm9wZXJ0aWVzLkhBU19GUkVFX1BMQVlFUl9TTE9UUywgJ2hhc0ZyZWVQbGF5ZXJTbG90cycpO1xuXHRcdG1hcC5zZXQoU0ZTMlguUm9vbVByb3BlcnRpZXMuSVNfVFlQRV9TRlNHQU1FLCAnaXNTRlNHYW1lVHlwZScpO1xuXG5cdFx0cmV0dXJuIG1hcDtcblx0fVxuXG5cdHN0YXRpYyBnZXRMYWJlbChwcm9wTmFtZSlcblx0e1xuXHRcdHJldHVybiAnUm9vbS4nICsgUm9vbVByb3BlcnRpZXNEYXRhLkxBQkVMUy5nZXQocHJvcE5hbWUpO1xuXHR9XG5cblx0c3RhdGljIGdldCBwcm9wZXJ0aWVzQXJyYXkoKVxuXHR7XG5cdFx0Y29uc3QgYXJyID0gW107XG5cblx0XHRmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBSb29tUHJvcGVydGllc0RhdGEuTEFCRUxTLmVudHJpZXMoKSlcblx0XHR7XG5cdFx0XHRhcnIucHVzaCh7XG5cdFx0XHRcdGxhYmVsOiBSb29tUHJvcGVydGllc0RhdGEuZ2V0TGFiZWwoa2V5KSxcblx0XHRcdFx0dmFsdWU6IGtleVxuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGFycjtcblx0fVxufVxuXG5leHBvcnQgY2xhc3MgVXNlclByb3BlcnRpZXNEYXRhXG57XG5cdHN0YXRpYyBnZXQgTEFCRUxTKCkge1xuXHRcdGxldCBtYXAgPSBuZXcgTWFwKCk7XG5cblx0XHRtYXAuc2V0KFNGUzJYLlVzZXJQcm9wZXJ0aWVzLk5BTUUsICduYW1lJyk7XG5cdFx0bWFwLnNldChTRlMyWC5Vc2VyUHJvcGVydGllcy5JU19QTEFZRVIsICdpc1BsYXllcicpO1xuXHRcdG1hcC5zZXQoU0ZTMlguVXNlclByb3BlcnRpZXMuSVNfU1BFQ1RBVE9SLCAnaXNTcGVjdGF0b3InKTtcblx0XHRtYXAuc2V0KFNGUzJYLlVzZXJQcm9wZXJ0aWVzLklTX05QQywgJ2lzTlBDJyk7XG5cdFx0bWFwLnNldChTRlMyWC5Vc2VyUHJvcGVydGllcy5QUklWSUxFR0VfSUQsICdwcml2aWxlZ2VJZCcpO1xuXG5cdFx0cmV0dXJuIG1hcDtcblx0fVxuXG5cdHN0YXRpYyBnZXRMYWJlbChwcm9wTmFtZSlcblx0e1xuXHRcdHJldHVybiAnVXNlci4nICsgVXNlclByb3BlcnRpZXNEYXRhLkxBQkVMUy5nZXQocHJvcE5hbWUpO1xuXHR9XG5cblx0c3RhdGljIGdldCBwcm9wZXJ0aWVzQXJyYXkoKVxuXHR7XG5cdFx0Y29uc3QgYXJyID0gW107XG5cblx0XHRmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBVc2VyUHJvcGVydGllc0RhdGEuTEFCRUxTLmVudHJpZXMoKSlcblx0XHR7XG5cdFx0XHRhcnIucHVzaCh7XG5cdFx0XHRcdGxhYmVsOiBVc2VyUHJvcGVydGllc0RhdGEuZ2V0TGFiZWwoa2V5KSxcblx0XHRcdFx0dmFsdWU6IGtleVxuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGFycjtcblx0fVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQzdHQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUNuS0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUN0YUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQ3ZIQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7OztBQzMrREE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QSIsInNvdXJjZVJvb3QiOiIifQ==
3332
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXRzL2pzL2NvcmUvbW9kdWxlcy9tb2R1bGUtMTMuYnVuZGxlLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYXBwbGljYXRpb24vLi9zcmMvY29tcG9uZW50cy9jaGFydHMvY2hhcnQtdXRpbHMuanMiLCJ3ZWJwYWNrOi8vYXBwbGljYXRpb24vLi9zcmMvY29tcG9uZW50cy9jaGFydHMvdXNlci1jb3VudC1jaGFydC5qcyIsIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9jb21wb25lbnRzL21vZHVsZS1zcGVjaWZpYy9tYXRjaC1leHByZXNzaW9uLWJ1aWxkZXIuanMiLCJ3ZWJwYWNrOi8vYXBwbGljYXRpb24vLi9zcmMvY29tcG9uZW50cy9zaWRlYmFyLWxheW91dC5qcyIsIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9tb2R1bGVzL3pvbmUtbW9uaXRvci5qcyIsIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy91dGlscy9tYXRjaC1wcm9wZXJ0aWVzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Ynl0ZXNUb1NpemUsIGtCeXRlc1RvU2l6ZX0gZnJvbSAnLi4vLi4vdXRpbHMvdXRpbGl0aWVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZvcm1hdHRlZERhdGVUaW1lKGRhdGUsIGZvcm1hdCA9ICdkZCBNTU0gSEg6bW06c3MnKVxue1xuXHRyZXR1cm4ga2VuZG8udG9TdHJpbmcoZGF0ZSwgZm9ybWF0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJhc2ljU2hhcmVkVGVtcGxhdGUodmFsdWVGb3JtYXQgPSAnezB9Jykge1xuXHRyZXR1cm4ga2VuZG8udGVtcGxhdGUoYFxuXHRcdDxkaXYgY2xhc3M9XCJjaGFydC10b29sdGlwLWNhdGVnb3J5XCI+PHN0cm9uZz4jOiBjYXRlZ29yeSAjPC9zdHJvbmc+PC9kaXY+XG5cdFx0IyBmb3IgKHZhciBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkrKykgeyAjXG5cdFx0PGRpdj5cblx0XHRcdDxpIGNsYXNzPVwiZmFzIGZhLXNxdWFyZVwiIHN0eWxlPVwiY29sb3I6ICM6IHBvaW50c1tpXS5jb2xvciAjIFwiPjwvaT5cblx0XHRcdCM6IHBvaW50c1tpXS5zZXJpZXMubmFtZSMgOiAjOiBrZW5kby5mb3JtYXQoJyR7dmFsdWVGb3JtYXR9JywgcG9pbnRzW2ldLnZhbHVlKSAjXG5cdFx0PC9kaXY+XG5cdFx0IyB9ICNcblx0YCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNZW1vcnlTaGFyZWRUZW1wbGF0ZSgpIHtcblx0cmV0dXJuIGZ1bmN0aW9uKGRhdGFJdGVtKSB7XG5cdFx0ZGF0YUl0ZW0uYnl0ZXNUb1NpemUgPSBieXRlc1RvU2l6ZTsgLy8gUGFzcyBieXRlc1RvU2l6ZSB1dGlsaXR5IGZ1bmN0aW9uIHRvIHRlbXBsYXRlXG5cdFx0cmV0dXJuIGtlbmRvLnRlbXBsYXRlKGBcblx0XHRcdDxkaXYgY2xhc3M9XCJjaGFydC10b29sdGlwLWNhdGVnb3J5XCI+PHN0cm9uZz4jOiBjYXRlZ29yeSAjPC9zdHJvbmc+PC9kaXY+XG5cdFx0XHQjIGZvciAodmFyIGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKSB7ICNcblx0XHRcdDxkaXY+XG5cdFx0XHRcdDxpIGNsYXNzPVwiZmFzIGZhLXNxdWFyZVwiIHN0eWxlPVwiY29sb3I6ICM6IHBvaW50c1tpXS5jb2xvciAjIFwiPjwvaT5cblx0XHRcdFx0IzogcG9pbnRzW2ldLnNlcmllcy5uYW1lIyA6ICM6IGJ5dGVzVG9TaXplKHBvaW50c1tpXS52YWx1ZSkgI1xuXHRcdFx0PC9kaXY+XG5cdFx0XHQjIH0gI1xuXHRcdGApKGRhdGFJdGVtKTtcblx0fTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1lbW9yeVZhbHVlQXhpc0xhYmVsVGVtcGxhdGUoKSB7XG5cdHJldHVybiBmdW5jdGlvbihkYXRhSXRlbSkge1xuXHRcdGRhdGFJdGVtLmJ5dGVzVG9TaXplID0gYnl0ZXNUb1NpemU7IC8vIFBhc3MgYnl0ZXNUb1NpemUgdXRpbGl0eSBmdW5jdGlvbiB0byB0ZW1wbGF0ZVxuXHRcdHJldHVybiBrZW5kby50ZW1wbGF0ZShgXG5cdFx0XHQjOiBieXRlc1RvU2l6ZSh2YWx1ZSkgI1xuXHRcdGApKGRhdGFJdGVtKTtcblx0fTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE5ldHdvcmtTaGFyZWRUZW1wbGF0ZShjYXRlZ29yeUZvcm1hdCA9ICdkZCBNTU0gSEg6bW06c3MnKSB7XG5cdHJldHVybiBmdW5jdGlvbihkYXRhSXRlbSkge1xuXHRcdGRhdGFJdGVtLmtCeXRlc1RvU2l6ZSA9IGtCeXRlc1RvU2l6ZTsgLy8gUGFzcyBrQnl0ZXNUb1NpemUgdXRpbGl0eSBmdW5jdGlvbiB0byB0ZW1wbGF0ZVxuXHRcdHJldHVybiBrZW5kby50ZW1wbGF0ZShgXG5cdFx0XHQ8ZGl2IGNsYXNzPVwiY2hhcnQtdG9vbHRpcC1jYXRlZ29yeVwiPjxzdHJvbmc+Izoga2VuZG8udG9TdHJpbmcoY2F0ZWdvcnksICcke2NhdGVnb3J5Rm9ybWF0fScpICM8L3N0cm9uZz48L2Rpdj5cblx0XHRcdCMgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspIHsgI1xuXHRcdFx0PGRpdj5cblx0XHRcdFx0PGkgY2xhc3M9XCJmYXMgZmEtc3F1YXJlXCIgc3R5bGU9XCJjb2xvcjogIzogcG9pbnRzW2ldLmNvbG9yICMgXCI+PC9pPlxuXHRcdFx0XHQjOiBwb2ludHNbaV0uc2VyaWVzLm5hbWUjIDogIzoga0J5dGVzVG9TaXplKHBvaW50c1tpXS52YWx1ZSwgMSwgJycsICcvcycpICNcblx0XHRcdDwvZGl2PlxuXHRcdFx0IyB9ICNcblx0XHRgKShkYXRhSXRlbSk7XG5cdH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXROZXR3b3JrVmFsdWVBeGlzTGFiZWxUZW1wbGF0ZSgpIHtcblx0cmV0dXJuIGZ1bmN0aW9uKGRhdGFJdGVtKSB7XG5cdFx0ZGF0YUl0ZW0ua0J5dGVzVG9TaXplID0ga0J5dGVzVG9TaXplOyAvLyBQYXNzIGtCeXRlc1RvU2l6ZSB1dGlsaXR5IGZ1bmN0aW9uIHRvIHRlbXBsYXRlXG5cdFx0cmV0dXJuIGtlbmRvLnRlbXBsYXRlKGBcblx0XHRcdCM6IGtCeXRlc1RvU2l6ZSh2YWx1ZSwgMSwgJycsICcvcycpICNcblx0XHRgKShkYXRhSXRlbSk7XG5cdH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRVc2VyQ291bnRTaGFyZWRUZW1wbGF0ZShjYXRlZ29yeUZvcm1hdCA9ICdkZCBNTU0gSEg6bW06c3MnKSB7XG5cdHJldHVybiBmdW5jdGlvbihkYXRhSXRlbSkge1xuXHRcdHJldHVybiBrZW5kby50ZW1wbGF0ZShgXG5cdFx0XHQ8ZGl2IGNsYXNzPVwiY2hhcnQtdG9vbHRpcC1jYXRlZ29yeVwiPjxzdHJvbmc+Izoga2VuZG8udG9TdHJpbmcoY2F0ZWdvcnksICcke2NhdGVnb3J5Rm9ybWF0fScpICM8L3N0cm9uZz48L2Rpdj5cblx0XHRcdCMgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspIHsgI1xuXHRcdFx0PGRpdj5cblx0XHRcdFx0PGkgY2xhc3M9XCJmYXMgZmEtc3F1YXJlXCIgc3R5bGU9XCJjb2xvcjogIzogcG9pbnRzW2ldLmNvbG9yICMgXCI+PC9pPlxuXHRcdFx0XHQjOiBwb2ludHNbaV0uc2VyaWVzLm5hbWUjIDogIzogcG9pbnRzW2ldLnZhbHVlICNcblx0XHRcdDwvZGl2PlxuXHRcdFx0IyB9ICNcblx0XHRgKShkYXRhSXRlbSk7XG5cdH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUaW1lUmFuZ2VUb29sdGlwVGVtcGxhdGUoKSB7XG5cdHJldHVybiBmdW5jdGlvbihkYXRhSXRlbSkge1xuXHRcdGRhdGFJdGVtLmdldFRvb2x0aXBTdHJpbmcgPSBmdW5jdGlvbih2MSwgdjIpIHtcblx0XHRcdGlmICh2MSA9PSB2Milcblx0XHRcdHtcblx0XHRcdFx0aWYgKHYyID09IC0yNClcblx0XHRcdFx0XHR2MiA9IC0yMztcblxuXHRcdFx0XHR2MSA9IHYyIC0gMTtcblx0XHRcdH1cblxuXHRcdFx0bGV0IHN0YXJ0ID0gTWF0aC5hYnModjEpO1xuXHRcdFx0bGV0IGVuZCA9IE1hdGguYWJzKHYyKTtcblxuXHRcdFx0cmV0dXJuIGBGcm9tICR7c3RhcnR9IGhvdXIke3N0YXJ0ICE9IDEgPyAncycgOiAnJ30gYWdvIHRvICR7ZW5kID4gMCA/ICgndG8gJyArIGVuZCArICcgaG91cicgKyAoZW5kICE9IDEgPyAncycgOiAnJykgKyAnIGFnbycpIDogJ25vdyd9YDtcblx0XHR9OyAvLyBQYXNzIHV0aWxpdHkgZnVuY3Rpb24gdG8gdGVtcGxhdGVcblx0XHRyZXR1cm4ga2VuZG8udGVtcGxhdGUoYFxuXHRcdFx0IzogZ2V0VG9vbHRpcFN0cmluZyhzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kKSAjXG5cdFx0YCkoZGF0YUl0ZW0pO1xuXHR9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0V1JCeXRlc0xhYmVsVGVtcGxhdGUoKSB7XG5cdHJldHVybiBmdW5jdGlvbihkYXRhSXRlbSkge1xuXHRcdHJldHVybiBrZW5kby50ZW1wbGF0ZShgXG5cdFx0XHQjOiB2YWx1ZSAjICM6IGRhdGFJdGVtLnVuaXQgI1xuXHRcdGApKGRhdGFJdGVtKTtcblx0fTtcbn1cbiIsImltcG9ydCB7Z2V0VXNlckNvdW50U2hhcmVkVGVtcGxhdGV9IGZyb20gJy4vY2hhcnQtdXRpbHMnO1xuaW1wb3J0ICogYXMgbW9tZW50IGZyb20gJ21vbWVudCc7XG5cbmV4cG9ydCBjbGFzcyBVc2VyQ291bnRDaGFydCBleHRlbmRzIEhUTUxFbGVtZW50XG57XG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHQgICAgc3VwZXIoKTtcblxuXHRcdC8vIENyZWF0ZSBjaGFydCBodG1sXG5cdFx0bGV0IGNoYXJ0SHRtbCA9ICQoJzxkaXY+Jyk7XG5cdFx0JCh0aGlzKS5hcHBlbmQoY2hhcnRIdG1sKTtcblxuXHRcdC8vIEluaXRpYWxpemUgY2hhcnRcblx0XHR0aGlzLl9jaGFydFdpZGdldCA9IHRoaXMuX2luaXRDaGFydFdpZGdldChjaGFydEh0bWwpO1xuXHR9XG5cblx0X2luaXRDaGFydFdpZGdldChjaGFydEh0bWwpXG5cdHtcblx0XHRyZXR1cm4gY2hhcnRIdG1sLmtlbmRvQ2hhcnQoe1xuXHRcdFx0dHJhbnNpdGlvbnM6IGZhbHNlLFxuXHRcdFx0Y2hhcnRBcmVhOiB7XG5cdFx0XHRcdGhlaWdodDogMjcwLFxuXHRcdFx0XHRiYWNrZ3JvdW5kOiAndHJhbnNwYXJlbnQnXG5cdFx0XHR9LFxuXHQgICAgICAgIGxlZ2VuZDoge1xuXHQgICAgICAgICAgICB2aXNpYmxlOiBmYWxzZVxuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2VyaWVzRGVmYXVsdHM6IHtcblx0ICAgICAgICAgICAgdHlwZTogJ2FyZWEnLFxuXHQgICAgICAgICAgICBsYWJlbHM6IHtcblx0ICAgICAgICAgICAgICAgIHZpc2libGU6IGZhbHNlLFxuXHQgICAgICAgICAgICAgICAgZm9ybWF0OiAnezB9Jyxcblx0ICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ICd0cmFuc3BhcmVudCdcblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNlcmllczogW3tcblx0XHRcdFx0bmFtZTogJ1VzZXJzJyxcblx0ICAgICAgICAgICAgZmllbGQ6ICd1c2VycycsXG5cdCAgICAgICAgICAgIGNhdGVnb3J5RmllbGQ6ICd0aW1lJyxcblx0XHRcdFx0Y29sb3I6ICcjZmQ3ZDI0Jyxcblx0XHRcdFx0bGluZToge1xuXHRcdFx0XHRcdHdpZHRoOiAyXG5cdFx0XHRcdH1cblx0ICAgICAgICB9XSxcblx0ICAgICAgICB2YWx1ZUF4aXM6IHtcblx0ICAgICAgICAgICAgbGFiZWxzOiB7XG5cdCAgICAgICAgICAgICAgICBmb3JtYXQ6ICd7MH0nLFxuXHQgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICBsaW5lOiB7XG5cdCAgICAgICAgICAgICAgICB2aXNpYmxlOiBmYWxzZVxuXHQgICAgICAgICAgICB9LFxuXHRcdFx0XHRtaW46IDAsXG5cdCAgICAgICAgfSxcblx0ICAgICAgICBjYXRlZ29yeUF4aXM6IHtcblx0XHRcdFx0bWFqb3JHcmlkTGluZXM6IHtcblx0ICAgICAgICAgICAgICAgIHZpc2libGU6IHRydWUsXG5cdFx0XHRcdFx0c3RlcDogNjBcblx0ICAgICAgICAgICAgfSxcblx0XHRcdFx0bWFqb3JUaWNrczoge1xuXHRcdFx0XHRcdHZpc2libGU6IHRydWUsXG5cdFx0XHRcdFx0c3RlcDogNjBcblx0XHRcdFx0fSxcblx0XHRcdFx0bGFiZWxzOiB7XG5cdFx0XHRcdFx0dmlzaWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRzdGVwOiA2MFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRiYXNlVW5pdDogJ21pbnV0ZXMnLFxuXHRcdFx0XHR0eXBlOiAnZGF0ZScsXG5cdCAgICAgICAgfSxcblx0ICAgICAgICB0b29sdGlwOiB7XG5cdFx0XHRcdHNoYXJlZDogdHJ1ZSxcblx0ICAgICAgICAgICAgdmlzaWJsZTogdHJ1ZSxcblx0XHRcdFx0c2hhcmVkVGVtcGxhdGU6IGdldFVzZXJDb3VudFNoYXJlZFRlbXBsYXRlKCdkZCBNTU0gSEg6bW0nKSxcblx0XHRcdFx0YmFja2dyb3VuZDogJyNlNGU0ZTQnXG5cdCAgICAgICAgfVxuXHQgICAgfSkuZGF0YSgna2VuZG9DaGFydCcpO1xuXHR9XG5cblx0cmVkcmF3KClcblx0e1xuXHRcdHRoaXMuX2NoYXJ0V2lkZ2V0LnJlZHJhdygpO1xuXHR9XG5cblx0c2V0IHJhbmdlKHZhbHVlcylcblx0e1xuXHRcdHRoaXMuX3JhbmdlID0gdmFsdWVzO1xuXG5cdFx0dGhpcy5fdXBkYXRlWEF4aXNMaW1pdHMoKTtcblx0fVxuXG5cdGdldCByYW5nZSgpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fcmFuZ2U7XG5cdH1cblxuXHRhZGRIaXN0b3J5RW50cmllcyh1c2VyQ291bnREYXRhLCBzYW1wbGluZ1JhdGVTZWNvbmRzKVxuXHR7XG5cdFx0bGV0IGRhdGUgPSBuZXcgRGF0ZSgpO1xuXHRcdGxldCBzdGFydCA9IG1vbWVudChkYXRlKTtcblx0XHRzdGFydC5zdWJ0cmFjdCgoc2FtcGxpbmdSYXRlU2Vjb25kcyAqIHVzZXJDb3VudERhdGEubGVuZ3RoKSwgJ3MnKVxuXG5cdFx0bGV0IGRhdGFTb3VyY2UgPSBuZXcga2VuZG8uZGF0YS5EYXRhU291cmNlKCk7XG5cblx0XHRmb3IgKGxldCBpID0gMTsgaSA8IHVzZXJDb3VudERhdGEubGVuZ3RoOyBpKyspXG5cdFx0e1xuXHRcdFx0bGV0IGRhdGUgPSBzdGFydC5jbG9uZSgpO1xuXHRcdFx0ZGF0ZS5hZGQoaSAqIHNhbXBsaW5nUmF0ZVNlY29uZHMsICdzJyk7XG5cblx0XHRcdHRoaXMuYWRkRW50cnkodXNlckNvdW50RGF0YVtpXSwgZGF0YVNvdXJjZSwgZGF0ZS50b0RhdGUoKSwgZmFsc2UpO1xuXHRcdH1cblxuXHRcdC8vIEFzc2lnbiBkYXRhc291cmNlIHRvIGNoYXJ0XG5cdFx0dGhpcy5fY2hhcnRXaWRnZXQuc2V0RGF0YVNvdXJjZShkYXRhU291cmNlKTtcblxuXHRcdC8vIFVwZGF0ZSBheGlzXG5cdFx0dGhpcy5fdXBkYXRlWEF4aXNMaW1pdHMoKTtcblx0fVxuXG5cdGFkZEVudHJ5KHVzZXJDb3VudCwgZGF0YVNvdXJjZSA9IG51bGwsIGRhdGUgPSBudWxsLCB1cGRhdGVBeGlzID0gdHJ1ZSlcblx0e1xuXHRcdGlmIChkYXRlID09IG51bGwpXG5cdFx0XHRkYXRlID0gbmV3IERhdGUoKTtcblxuXHRcdGxldCBuZXdFbnRyeSA9IHtcblx0XHRcdHRpbWU6IGRhdGUsXG5cdFx0XHR1c2VyczogdXNlckNvdW50XG5cdFx0fTtcblxuXHRcdC8vIEFkZCBlbnRyeSB0byBkYXRhIHNvdXJjZVxuXHRcdGlmIChkYXRhU291cmNlID09IG51bGwpXG5cdFx0XHRkYXRhU291cmNlID0gdGhpcy5fZGF0YVNvdXJjZTtcblxuXHRcdGRhdGFTb3VyY2UuYWRkKG5ld0VudHJ5KTtcblxuXHRcdGlmICh1cGRhdGVBeGlzKVxuXHRcdFx0dGhpcy5fdXBkYXRlWEF4aXNMaW1pdHMoKTtcblx0fVxuXG5cdF91cGRhdGVYQXhpc0xpbWl0cygpXG5cdHtcblx0XHRsZXQgZHMgPSB0aGlzLl9kYXRhU291cmNlO1xuXG5cdFx0aWYgKGRzLnRvdGFsKCkgPiAwKVxuXHRcdHtcblx0XHRcdGNvbnN0IGNoYXJ0TWluaW11bSA9IG1vbWVudCh0aGlzLl9sYXN0RGF0ZSkuYWRkKHRoaXMuX3JhbmdlWzBdLCAnaCcpO1xuXHRcdFx0Y29uc3QgY2hhcnRNYXhpbXVtID0gbW9tZW50KHRoaXMuX2xhc3REYXRlKS5hZGQodGhpcy5fcmFuZ2VbMV0sICdoJyk7XG5cblx0XHRcdHRoaXMuX2NoYXJ0V2lkZ2V0Lm9wdGlvbnMuY2F0ZWdvcnlBeGlzLm1pbiA9IGNoYXJ0TWluaW11bS50b0RhdGUoKTtcblx0XHRcdHRoaXMuX2NoYXJ0V2lkZ2V0Lm9wdGlvbnMuY2F0ZWdvcnlBeGlzLm1heCA9IGNoYXJ0TWF4aW11bS50b0RhdGUoKTtcblxuXHRcdFx0dGhpcy5fY2hhcnRXaWRnZXQucmVkcmF3KCk7XG5cdFx0fVxuXHR9XG5cblx0Z2V0IF9kYXRhU291cmNlKClcblx0e1xuXHRcdHJldHVybiB0aGlzLl9jaGFydFdpZGdldC5kYXRhU291cmNlO1xuXHR9XG59XG5cbi8vIERFRklORSBDT01QT05FTlRcbmlmICghd2luZG93LmN1c3RvbUVsZW1lbnRzLmdldCgndXNlci1jb3VudC1jaGFydCcpKVxuXHR3aW5kb3cuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCd1c2VyLWNvdW50LWNoYXJ0JywgVXNlckNvdW50Q2hhcnQpO1xuIiwiZXhwb3J0IGNsYXNzIE1hdGNoRXhwcmVzc2lvbkJ1aWxkZXIgZXh0ZW5kcyBIVE1MRWxlbWVudFxue1xuXHRjb25zdHJ1Y3RvcigpXG5cdHtcblx0ICAgIHN1cGVyKCk7XG5cblx0XHR0aGlzLkVYUFJFU1NJT05fVVBEQVRFRF9FVkVOVCA9ICdleHByZXNzaW9uVXBkYXRlZCc7XG5cblx0XHR0aGlzLl9kaWFsb2cgPSAkKGBcblx0XHRcdDxkaXYgY2xhc3M9XCJtb2RhbFwiIGlkPVwibWF0Y2hFeHByQnVpbGRlck1vZGFsXCIgdGFiaW5kZXg9XCItMVwiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLWxhYmVsbGVkYnk9XCJtYXRjaEV4cHJCdWlsZGVyTW9kYWxUaXRsZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nIG1vZGFsLWRpYWxvZy1jZW50ZXJlZCBtb2RhbC1sZ1wiIHJvbGU9XCJkb2N1bWVudFwiPlxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XG5cdFx0XHRcdFx0XHRcdDxoNSBjbGFzcz1cIm1vZGFsLXRpdGxlIHRleHQtcHJpbWFyeVwiIGlkPVwibWF0Y2hFeHByQnVpbGRlck1vZGFsVGl0bGVcIj4uLi48L2g1PlxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwibW9kYWwtYm9keSBwLTBcIj5cblx0XHRcdFx0XHRcdFx0PGZvcm0gY2xhc3M9XCJiZy1jb2xvci1kZWZhdWx0IHAtM1wiPlxuXHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJkLWlubGluZS1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciByYWRpby1idXR0b24tZ3JvdXAgaW5saW5lLWZvcm0tZ3JvdXBzXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY3VzdG9tLWNvbnRyb2wgY3VzdG9tLXJhZGlvIGN1c3RvbS1jb250cm9sLWlubGluZSBtci0yXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxpbnB1dCB0eXBlPVwicmFkaW9cIiBpZD1cImFuZE9wZXJhdG9yUkJcIiBuYW1lPVwib3BlcmF0b3JSQkdcIiBjbGFzcz1cImN1c3RvbS1jb250cm9sLWlucHV0XCIgdmFsdWU9XCJBTkRcIiBjaGVja2VkIGRpc2FibGVkPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8bGFiZWwgY2xhc3M9XCJjdXN0b20tY29udHJvbC1sYWJlbFwiIGZvcj1cImFuZE9wZXJhdG9yUkJcIj5BTkQ8L2xhYmVsPlxuXHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY3VzdG9tLWNvbnRyb2wgY3VzdG9tLXJhZGlvIGN1c3RvbS1jb250cm9sLWlubGluZSBtci0yXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxpbnB1dCB0eXBlPVwicmFkaW9cIiBpZD1cIm9yT3BlcmF0b3JSQlwiIG5hbWU9XCJvcGVyYXRvclJCR1wiIGNsYXNzPVwiY3VzdG9tLWNvbnRyb2wtaW5wdXRcIiB2YWx1ZT1cIk9SXCIgZGlzYWJsZWQ+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxsYWJlbCBjbGFzcz1cImN1c3RvbS1jb250cm9sLWxhYmVsXCIgZm9yPVwib3JPcGVyYXRvclJCXCI+T1I8L2xhYmVsPlxuXHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImQtaW5saW5lLWJsb2NrXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiaW5saW5lLWZvcm0tZ3JvdXBzIG15LTFcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PGlucHV0IGlkPVwidmFyTmFtZUNCXCIvPlxuXHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiaW5saW5lLWZvcm0tZ3JvdXBzIG15LTFcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PGlucHV0IGlkPVwidHlwZUREXCIgY2xhc3M9XCJtYXRjaFR5cGVEcm9wZG93blwiLz5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PGlucHV0IGlkPVwiY29uZGl0aW9uRERcIiBjbGFzcz1cIm1hdGNoQ29uZGl0aW9uRHJvcGRvd25cIi8+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZC1pbmxpbmUgaW5saW5lLWZvcm0tZ3JvdXBzXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8aW5wdXQgaWQ9XCJ2YWx1ZUluXCIgY2xhc3M9XCJrLXRleHRib3ggbXQtMVwiIHBsYWNlaG9sZGVyPVwiVmFsdWVcIi8+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8YnV0dG9uIGlkPVwibWF0Y2hFeHByQWRkQnRcIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJrLWJ1dHRvbiBrLXNlY29uZGFyeSBtdC0xXCI+PGkgY2xhc3M9XCJmYXMgZmEtcGx1cyBtci0xXCI+PC9pPkFkZDwvYnV0dG9uPlxuXHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHQ8L2Zvcm0+XG5cblx0XHRcdFx0XHRcdFx0PGRpdiBpZD1cIm1hdGNoRXhwckdyaWRcIiBjbGFzcz1cIm0tM1wiPjwvZGl2PlxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyIGQtZmxleFwiPlxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZmxleC1ncm93LTEgdGV4dC1sZWZ0XCI+XG5cdFx0XHRcdFx0XHRcdFx0PGJ1dHRvbiBpZD1cIm1hdGNoRXhwckFwcGx5QnRcIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJrLWJ1dHRvbiBrLXByaW1hcnkgbXItMlwiPjxpIGNsYXNzPVwiZmFzIGZhLWNoZWNrLWNpcmNsZSBtci0xXCI+PC9pPkFwcGx5PC9idXR0b24+XG5cdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZmxleC1ncm93LTEgdGV4dC1yaWdodFwiPlxuXHRcdFx0XHRcdFx0XHRcdDxidXR0b24gaWQ9XCJtYXRjaEV4cHJSZW1vdmVCdFwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImstYnV0dG9uIGstc2Vjb25kYXJ5XCIgZGlzYWJsZWQ+PGkgY2xhc3M9XCJmYXMgZmEtbWludXMtY2lyY2xlIG1yLTFcIj48L2k+UmVtb3ZlIHNlbGVjdGVkPC9idXR0b24+XG5cdFx0XHRcdFx0XHRcdFx0PGJ1dHRvbiBpZD1cIm1hdGNoRXhwckNsZWFyQnRcIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJrLWJ1dHRvbiBrLXNlY29uZGFyeVwiPjxpIGNsYXNzPVwiZmFzIGZhLXRpbWVzLWNpcmNsZSBtci0xXCI+PC9pPkNsZWFyIGFsbDwvYnV0dG9uPlxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdDwvZGl2PlxuXHRcdGApO1xuXG5cdFx0JCgnI21hdGNoRXhwckFkZEJ0JywgdGhpcy5fZGlhbG9nKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uQWRkQnRDbGljaywgdGhpcykpO1xuXHRcdCQoJyNtYXRjaEV4cHJBcHBseUJ0JywgdGhpcy5fZGlhbG9nKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uQXBwbHlCdENsaWNrLCB0aGlzKSk7XG5cdFx0JCgnI21hdGNoRXhwclJlbW92ZUJ0JywgdGhpcy5fZGlhbG9nKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uUmVtb3ZlQnRDbGljaywgdGhpcykpO1xuXHRcdCQoJyNtYXRjaEV4cHJDbGVhckJ0JywgdGhpcy5fZGlhbG9nKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uQ2xlYXJCdENsaWNrLCB0aGlzKSk7XG5cblx0XHQvLyBJTklUSUFMSVpFIEZPUk0gSVRFTVNcblxuXHRcdHRoaXMuX3Zhck5hbWVDYiA9ICQoJyN2YXJOYW1lQ0InLCB0aGlzLl9kaWFsb2cpLmtlbmRvQ29tYm9Cb3goe1xuXHRcdFx0ZGF0YVRleHRGaWVsZDogJ2xhYmVsJyxcblx0XHRcdGRhdGFWYWx1ZUZpZWxkOiAndmFsdWUnLFxuXHRcdFx0cGxhY2Vob2xkZXI6ICdWYXJpYWJsZSBuYW1lJyxcblx0XHR9KS5kYXRhKCdrZW5kb0NvbWJvQm94Jyk7XG5cblx0XHQvLyBTZXQgdHlwZXMgZHJvcGRvd24gZGF0YSBzb3VyY2Vcblx0XHQvLyBOT1RFOiBpbiBvcmRlciB0byBhdm9pZCBYeHhNYXRjaCBvYmplY3RzIHRvIGJlIHdyYXBwZWQgYnkgS2VuZG8gZGF0YSBzb3VyY2UsIHdlIGhhdmUgdG8gcGFzcyB0aGVtIHVzaW5nIF8gcHJvcGVydHkgbmFtZXNcblx0XHRsZXQgdHlwZURTID0gW107XG5cblx0XHQvLyBCb29sZWFuIC0tLS0tLS0tLS0tLS0tLS1cblx0XHR0eXBlRFMucHVzaCh7XG5cdFx0XHRsYWJlbDogJ0Jvb2xlYW4nLFxuXHRcdFx0X3ZhbHVlOiBTRlMyWC5Cb29sTWF0Y2guRVFVQUxTLFxuXHRcdFx0Y29uZGl0aW9uczogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IFNGUzJYLkJvb2xNYXRjaC5FUVVBTFMuc3ltYm9sLFxuXHRcdFx0XHRcdF92YWx1ZTogU0ZTMlguQm9vbE1hdGNoLkVRVUFMUyxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiBTRlMyWC5Cb29sTWF0Y2guTk9UX0VRVUFMUy5zeW1ib2wsXG5cdFx0XHRcdFx0X3ZhbHVlOiBTRlMyWC5Cb29sTWF0Y2guTk9UX0VRVUFMUyxcblx0XHRcdFx0fVxuXHRcdFx0XVxuXHRcdH0pO1xuXG5cdFx0Ly8gTnVtYmVyIC0tLS0tLS0tLS0tLS0tLS1cblx0XHR0eXBlRFMucHVzaCh7XG5cdFx0XHRsYWJlbDogJ051bWJlcicsXG5cdFx0XHRfdmFsdWU6IFNGUzJYLk51bWJlck1hdGNoLkVRVUFMUyxcblx0XHRcdGNvbmRpdGlvbnM6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiBTRlMyWC5OdW1iZXJNYXRjaC5FUVVBTFMuc3ltYm9sLFxuXHRcdFx0XHRcdF92YWx1ZTogU0ZTMlguTnVtYmVyTWF0Y2guRVFVQUxTLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IFNGUzJYLk51bWJlck1hdGNoLk5PVF9FUVVBTFMuc3ltYm9sLFxuXHRcdFx0XHRcdF92YWx1ZTogU0ZTMlguTnVtYmVyTWF0Y2guTk9UX0VRVUFMUyxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiBTRlMyWC5OdW1iZXJNYXRjaC5HUkVBVEVSX1RIQU4uc3ltYm9sLFxuXHRcdFx0XHRcdF92YWx1ZTogU0ZTMlguTnVtYmVyTWF0Y2guR1JFQVRFUl9USEFOLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IFNGUzJYLk51bWJlck1hdGNoLkxFU1NfVEhBTi5zeW1ib2wsXG5cdFx0XHRcdFx0X3ZhbHVlOiBTRlMyWC5OdW1iZXJNYXRjaC5MRVNTX1RIQU4sXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogU0ZTMlguTnVtYmVyTWF0Y2guR1JFQVRFUl9USEFOX09SX0VRVUFMX1RPLnN5bWJvbCxcblx0XHRcdFx0XHRfdmFsdWU6IFNGUzJYLk51bWJlck1hdGNoLkdSRUFURVJfVEhBTl9PUl9FUVVBTF9UTyxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiBTRlMyWC5OdW1iZXJNYXRjaC5MRVNTX1RIQU5fT1JfRVFVQUxfVE8uc3ltYm9sLFxuXHRcdFx0XHRcdF92YWx1ZTogU0ZTMlguTnVtYmVyTWF0Y2guTEVTU19USEFOX09SX0VRVUFMX1RPLFxuXHRcdFx0XHR9XG5cdFx0XHRdXG5cdFx0fSk7XG5cblx0XHQvLyBTdHJpbmcgLS0tLS0tLS0tLS0tLS0tLVxuXHRcdHR5cGVEUy5wdXNoKHtcblx0XHRcdGxhYmVsOiAnU3RyaW5nJyxcblx0XHRcdF92YWx1ZTogU0ZTMlguU3RyaW5nTWF0Y2guRVFVQUxTLFxuXHRcdFx0Y29uZGl0aW9uczogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IFNGUzJYLlN0cmluZ01hdGNoLkVRVUFMUy5zeW1ib2wsXG5cdFx0XHRcdFx0X3ZhbHVlOiBTRlMyWC5TdHJpbmdNYXRjaC5FUVVBTFMsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogU0ZTMlguU3RyaW5nTWF0Y2guTk9UX0VRVUFMUy5zeW1ib2wsXG5cdFx0XHRcdFx0X3ZhbHVlOiBTRlMyWC5TdHJpbmdNYXRjaC5OT1RfRVFVQUxTLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IFNGUzJYLlN0cmluZ01hdGNoLkNPTlRBSU5TLnN5bWJvbCxcblx0XHRcdFx0XHRfdmFsdWU6IFNGUzJYLlN0cmluZ01hdGNoLkNPTlRBSU5TLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IFNGUzJYLlN0cmluZ01hdGNoLlNUQVJUU19XSVRILnN5bWJvbCxcblx0XHRcdFx0XHRfdmFsdWU6IFNGUzJYLlN0cmluZ01hdGNoLlNUQVJUU19XSVRILFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IFNGUzJYLlN0cmluZ01hdGNoLkVORFNfV0lUSC5zeW1ib2wsXG5cdFx0XHRcdFx0X3ZhbHVlOiBTRlMyWC5TdHJpbmdNYXRjaC5FTkRTX1dJVEgsXG5cdFx0XHRcdH1cblx0XHRcdF1cblx0XHR9KTtcblxuXHRcdHRoaXMuX3R5cGVEZCA9ICQoJyN0eXBlREQnLCB0aGlzLl9kaWFsb2cpLmtlbmRvRHJvcERvd25MaXN0KHtcblx0XHRcdGRhdGFTb3VyY2U6IHR5cGVEUyxcblx0XHRcdGRhdGFUZXh0RmllbGQ6ICdsYWJlbCcsXG5cdFx0XHRkYXRhVmFsdWVGaWVsZDogJ192YWx1ZScsXG5cdFx0XHRvcHRpb25MYWJlbDoge1xuXHRcdFx0XHRsYWJlbDogJ1R5cGUnLFxuXHRcdFx0XHRfdmFsdWU6ICcnXG5cdFx0XHR9LFxuXHRcdFx0b3B0aW9uTGFiZWxUZW1wbGF0ZTogJzxzcGFuIGNsYXNzPVwidGV4dC1tdXRlZFwiPiM6bGFiZWwjPC9zcGFuPicsXG5cdFx0XHRjaGFuZ2U6ICQucHJveHkoZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICh0aGlzLl90eXBlRGQgJiYgdGhpcy5fdHlwZURkLnNlbGVjdCgpKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IHNlbGVjdGVkVHlwZSA9IHRoaXMuX3R5cGVEZC5kYXRhSXRlbSh0aGlzLl90eXBlRGQuc2VsZWN0KCkpO1xuXHRcdFx0XHRcdHRoaXMuX2NvbmRpdGlvbkRkLnNldERhdGFTb3VyY2Uoc2VsZWN0ZWRUeXBlLmNvbmRpdGlvbnMpO1xuXHRcdFx0XHRcdHRoaXMuX2NvbmRpdGlvbkRkLnNlbGVjdCgxKTtcblx0XHRcdFx0fVxuXHRcdFx0fSwgdGhpcylcblx0XHR9KS5kYXRhKCdrZW5kb0Ryb3BEb3duTGlzdCcpO1xuXG5cdFx0dGhpcy5fY29uZGl0aW9uRGQgPSAkKCcjY29uZGl0aW9uREQnLCB0aGlzLl9kaWFsb2cpLmtlbmRvRHJvcERvd25MaXN0KHtcblx0XHRcdGRhdGFUZXh0RmllbGQ6ICdsYWJlbCcsXG5cdFx0XHRkYXRhVmFsdWVGaWVsZDogJ192YWx1ZScsXG5cdFx0XHRvcHRpb25MYWJlbDoge1xuXHRcdFx0XHRsYWJlbDogJ0NvbmRpdGlvbicsXG5cdFx0XHRcdF92YWx1ZTogJydcblx0XHRcdH0sXG5cdFx0XHRvcHRpb25MYWJlbFRlbXBsYXRlOiAnPHNwYW4gY2xhc3M9XCJ0ZXh0LW11dGVkXCI+IzpsYWJlbCM8L3NwYW4+Jyxcblx0XHR9KS5kYXRhKCdrZW5kb0Ryb3BEb3duTGlzdCcpO1xuXG5cdFx0dGhpcy5fdmFsdWVJbiA9ICQoJyN2YWx1ZUluJywgdGhpcy5fZGlhbG9nKTtcblxuXHRcdC8vIElOSVRJQUxJWkUgR1JJRFxuXG5cdFx0dGhpcy5fZ3JpZCA9ICQoJyNtYXRjaEV4cHJHcmlkJywgdGhpcy5fZGlhbG9nKS5rZW5kb0dyaWQoe1xuXHRcdFx0ZGF0YVNvdXJjZTogW10sXG5cdFx0XHRyZXNpemFibGU6IHRydWUsXG5cdFx0XHRzZWxlY3RhYmxlOiAncm93Jyxcblx0XHRcdGNoYW5nZTogJC5wcm94eSh0aGlzLl9vbkdyaWRTZWxlY3Rpb25DaGFuZ2UsIHRoaXMpLFxuXHRcdFx0bm9SZWNvcmRzOiB7XG5cdFx0XHRcdHRlbXBsYXRlOiAnTm8gZW50cmllcy4nXG5cdFx0XHR9LFxuXHRcdFx0Y29sdW1uczogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0ZmllbGQ6ICdvcGVyYXRvcicsXG5cdFx0XHRcdFx0dGl0bGU6ICdPcGVyYXRvcicsXG5cdFx0XHRcdFx0d2lkdGg6IDkwXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRmaWVsZDogJ2xhYmVsJyxcblx0XHRcdFx0XHR0aXRsZTogJ05hbWUnLFxuXHRcdFx0XHRcdHdpZHRoOiAxMjBcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGZpZWxkOiAndHlwZUxhYmVsJyxcblx0XHRcdFx0XHR0aXRsZTogJ1R5cGUnLFxuXHRcdFx0XHRcdHdpZHRoOiA4NVxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0ZmllbGQ6ICdzeW1ib2wnLFxuXHRcdFx0XHRcdHRpdGxlOiAnQ29uZGl0aW9uJyxcblx0XHRcdFx0XHR3aWR0aDogOTVcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGZpZWxkOiAndmFsdWUnLFxuXHRcdFx0XHRcdHRpdGxlOiAnVmFsdWUnLFxuXHRcdFx0XHRcdHdpZHRoOiAyMDBcblx0XHRcdFx0fSxcblx0XHRcdF1cblx0XHR9KS5kYXRhKCdrZW5kb0dyaWQnKTtcblx0fVxuXG5cdGdldCB0aXRsZSgpXG5cdHtcblx0XHRyZXR1cm4gJCgnI21hdGNoRXhwckJ1aWxkZXJNb2RhbFRpdGxlJywgdGhpcy5fZGlhbG9nKS50ZXh0KCk7XG5cdH1cblxuXHRzZXQgdGl0bGUodmFsdWUpXG5cdHtcblx0XHQkKCcjbWF0Y2hFeHByQnVpbGRlck1vZGFsVGl0bGUnLCB0aGlzLl9kaWFsb2cpLnRleHQodmFsdWUpO1xuXHR9XG5cblx0Z2V0IHByZWRlZmluZWRWYXJOYW1lcygpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fcHJlZGVmaW5lZFZhck5hbWVzO1xuXHR9XG5cblx0c2V0IHByZWRlZmluZWRWYXJOYW1lcyh2YWx1ZSlcblx0e1xuXHRcdHRoaXMuX3ByZWRlZmluZWRWYXJOYW1lcyA9IHZhbHVlO1xuXG5cdFx0dGhpcy5fdmFyTmFtZUNiLnNldERhdGFTb3VyY2UodmFsdWUpO1xuXHR9XG5cblx0Z2V0IGZpbHRlckV4cHJlc3Npb24oKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2ZpbHRlckV4cHJlc3Npb247XG5cdH1cblxuXHRzaG93KClcblx0e1xuXHRcdHRoaXMuX2RpYWxvZy5tb2RhbCh7XG5cdFx0XHRiYWNrZHJvcDogJ3N0YXRpYycsXG5cdFx0XHRrZXlib2FyZDogZmFsc2UsXG5cdFx0XHRzaG93OiB0cnVlXG5cdFx0fSk7XG5cdH1cblxuXHRfb25HcmlkU2VsZWN0aW9uQ2hhbmdlKClcblx0e1xuXHRcdGxldCBzZWxlY3RlZFJvd3MgPSB0aGlzLl9ncmlkLnNlbGVjdCgpO1xuXHRcdGxldCBzZWxlY3RlZERhdGFJdGVtcyA9IFtdO1xuXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3RlZFJvd3MubGVuZ3RoOyBpKyspXG5cdFx0e1xuXHRcdFx0bGV0IGRhdGFJdGVtID0gdGhpcy5fZ3JpZC5kYXRhSXRlbShzZWxlY3RlZFJvd3NbaV0pO1xuXHRcdFx0c2VsZWN0ZWREYXRhSXRlbXMucHVzaChkYXRhSXRlbSk7XG5cdFx0fVxuXG5cdFx0Ly8gRW5hYmxlL2Rpc2FibGUgcmVtb3ZlIGJ1dHRvblxuXHRcdCQoJyNtYXRjaEV4cHJSZW1vdmVCdCcsIHRoaXMuX2RpYWxvZykuYXR0cignZGlzYWJsZWQnLCBzZWxlY3RlZERhdGFJdGVtcy5sZW5ndGggPT0gMCk7XG5cdH1cblxuXHRfb25BZGRCdENsaWNrKClcblx0e1xuXHRcdGlmICh0aGlzLl92YXJOYW1lQ2IudmFsdWUoKSAhPSAnJyAmJiB0aGlzLl90eXBlRGQuc2VsZWN0KCkpXG5cdFx0e1xuXHRcdFx0Ly8gVmFyaWFibGUgbmFtZSBhbmQgbGFiZWxcblx0XHRcdGxldCB2YXJOYW1lLCB2YXJMYWJlbDtcblxuXHRcdFx0aWYgKHRoaXMuX3Zhck5hbWVDYi5zZWxlY3QoKSA+IC0xKVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgZGF0YUl0ZW0gPSB0aGlzLl92YXJOYW1lQ2IuZGF0YUl0ZW0odGhpcy5fdmFyTmFtZUNiLnNlbGVjdCgpKTtcblx0XHRcdFx0dmFyTmFtZSA9IGRhdGFJdGVtLnZhbHVlO1xuXHRcdFx0XHR2YXJMYWJlbCA9IGRhdGFJdGVtLmxhYmVsO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHR2YXJOYW1lID0gdmFyTGFiZWwgPSB0aGlzLl92YXJOYW1lQ2IudmFsdWUoKTtcblxuXHRcdFx0Ly8gVmFyaWFibGUgdHlwZSdzIGxhYmVsXG5cdFx0XHRsZXQgdHlwZUxhYmVsID0gdGhpcy5fdHlwZURkLmRhdGFJdGVtKHRoaXMuX3R5cGVEZC5zZWxlY3QoKSkubGFiZWw7XG5cblx0XHRcdC8vIE1hdGNoIGNvbmRpdGlvblxuXHRcdFx0bGV0IGNvbmRpdGlvbiA9IHRoaXMuX2NvbmRpdGlvbkRkLmRhdGFJdGVtKHRoaXMuX2NvbmRpdGlvbkRkLnNlbGVjdCgpKS5fdmFsdWU7XG5cblx0XHRcdC8vIEV4cHJlc3Npb24gb3BlcmF0b3Jcblx0XHRcdGxldCBvcGVyYXRvciA9IHRoaXMuX2dyaWQuZGF0YVNvdXJjZS50b3RhbCgpID4gMCA/ICQoJ2lucHV0W25hbWU9b3BlcmF0b3JSQkddOmNoZWNrZWQnLCB0aGlzLl9kaWFsb2cpLnZhbCgpIDogbnVsbDtcblxuXHRcdFx0Ly8gVmFyaWFibGUgdmFsdWVcblx0XHRcdGxldCB2YWwgPSB0aGlzLl92YWx1ZUluLnZhbCgpO1xuXHRcdFx0bGV0IHZhclZhbHVlO1xuXG5cdFx0XHRpZiAoY29uZGl0aW9uIGluc3RhbmNlb2YgU0ZTMlguQm9vbE1hdGNoKVxuXHRcdFx0XHR2YXJWYWx1ZSA9ICh2YWwgPT0gJ3RydWUnID8gdHJ1ZSA6IGZhbHNlKTtcblx0XHRcdGVsc2UgaWYgKGNvbmRpdGlvbiBpbnN0YW5jZW9mIFNGUzJYLk51bWJlck1hdGNoKVxuXHRcdFx0XHR2YXJWYWx1ZSA9IChpc05hTihOdW1iZXIodmFsKSkgPyAwIDogTnVtYmVyKHZhbCkpO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHR2YXJWYWx1ZSA9IHZhbDtcblxuXHRcdFx0Ly8gQWRkIGl0ZW0gdG8gZ3JpZFxuXHRcdFx0bGV0IGV4cHJQYXJ0ID0gdGhpcy5fZ2V0RXhwcmVzc2lvblBhcnQodmFyTGFiZWwsIHZhck5hbWUsIHZhclZhbHVlLCB0eXBlTGFiZWwsIGNvbmRpdGlvbiwgb3BlcmF0b3IpO1xuXHRcdFx0dGhpcy5fZ3JpZC5kYXRhU291cmNlLmFkZChleHByUGFydCk7XG5cblx0XHRcdC8vIFJlc2V0IGlucHV0c1xuXHRcdFx0dGhpcy5fdmFyTmFtZUNiLnZhbHVlKCcnKTtcblx0XHRcdHRoaXMuX3ZhbHVlSW4udmFsKCcnKTtcblxuXHRcdFx0Ly8gRW5hYmxlIG9wZXJhdG9yIHJhZGlvIGJ1dHRvbnNcblx0XHRcdHRoaXMuX2VuYWJsZU9wZXJhdG9yUmIodHJ1ZSk7XG5cdFx0fVxuXHR9XG5cblx0X29uQXBwbHlCdENsaWNrKClcblx0e1xuXHRcdC8vIEhpZGUgZGlhbG9nXG5cdFx0dGhpcy5fZGlhbG9nLm1vZGFsKCdoaWRlJyk7XG5cblx0XHQvLyBDbGVhciBncmlkIHNlbGVjdGlvblxuXHRcdHRoaXMuX2dyaWQuY2xlYXJTZWxlY3Rpb24oKTtcblxuXHRcdC8vIEJ1aWxkIGZpbmFsIG1hdGNoIGV4cHJlc3Npb25cblx0XHR0aGlzLl9maWx0ZXJFeHByZXNzaW9uID0gbnVsbDtcblxuXHRcdGlmICh0aGlzLl9ncmlkLmRhdGFTb3VyY2UudG90YWwoKSA+IDApXG5cdFx0e1xuXHRcdFx0bGV0IGV4cFBhcnQgPSB0aGlzLl9ncmlkLmRhdGFTb3VyY2UuYXQoMCk7XG5cdFx0XHR0aGlzLl9maWx0ZXJFeHByZXNzaW9uID0gbmV3IFNGUzJYLk1hdGNoRXhwcmVzc2lvbihleHBQYXJ0Lm5hbWUsIGV4cFBhcnQuX2NvbmRpdGlvbiwgZXhwUGFydC52YWx1ZSk7XG5cblx0XHRcdGZvciAobGV0IGkgPSAxOyBpIDwgdGhpcy5fZ3JpZC5kYXRhU291cmNlLnRvdGFsKCk7IGkrKylcblx0XHRcdHtcblx0XHRcdFx0ZXhwUGFydCA9IHRoaXMuX2dyaWQuZGF0YVNvdXJjZS5hdChpKTtcblxuXHRcdFx0XHRpZiAoZXhwUGFydC5vcGVyYXRvciA9PSBTRlMyWC5Mb2dpY09wZXJhdG9yLkFORC5pZClcblx0XHRcdFx0XHR0aGlzLl9maWx0ZXJFeHByZXNzaW9uID0gdGhpcy5fZmlsdGVyRXhwcmVzc2lvbi5hbmQoZXhwUGFydC5uYW1lLCBleHBQYXJ0Ll9jb25kaXRpb24sIGV4cFBhcnQudmFsdWUpO1xuXHRcdFx0XHRlbHNlIGlmIChleHBQYXJ0Lm9wZXJhdG9yID09IFNGUzJYLkxvZ2ljT3BlcmF0b3IuT1IuaWQpXG5cdFx0XHRcdFx0dGhpcy5fZmlsdGVyRXhwcmVzc2lvbiA9IHRoaXMuX2ZpbHRlckV4cHJlc3Npb24ub3IoZXhwUGFydC5uYW1lLCBleHBQYXJ0Ll9jb25kaXRpb24sIGV4cFBhcnQudmFsdWUpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEZpcmUgZXZlbnRcblx0XHRsZXQgZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KHRoaXMuRVhQUkVTU0lPTl9VUERBVEVEX0VWRU5ULCB7XG5cdFx0ICAgIFx0ZGV0YWlsOiBudWxsLFxuXHRcdFx0XHRidWJibGVzOiBmYWxzZSxcblx0XHRcdFx0Y2FuY2VsYWJsZTogZmFsc2Vcblx0XHRcdH0pO1xuXG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KGV2dCk7XG5cdH1cblxuXHRfb25SZW1vdmVCdENsaWNrKClcblx0e1xuXHRcdGxldCBkYXRhSXRlbSA9IHRoaXMuX2dyaWQuZGF0YUl0ZW0odGhpcy5fZ3JpZC5zZWxlY3QoKSk7XG5cdFx0dGhpcy5fZ3JpZC5kYXRhU291cmNlLnJlbW92ZShkYXRhSXRlbSk7XG5cblx0XHQvLyBDbGVhciBncmlkIHNlbGVjdGlvblxuXHRcdHRoaXMuX2dyaWQuY2xlYXJTZWxlY3Rpb24oKTtcblxuXHRcdGlmICh0aGlzLl9ncmlkLmRhdGFTb3VyY2UudG90YWwoKSA9PSAwKVxuXHRcdHtcblx0XHRcdC8vIERpc2FibGUgb3BlcmF0b3IgcmFkaW8gYnV0dG9uc1xuXHRcdFx0dGhpcy5fZW5hYmxlT3BlcmF0b3JSYihmYWxzZSk7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHQvLyBSZXNldCBvcGVyYXRvciBvbiBmaXJzdCBlbnRyeVxuXHRcdFx0dGhpcy5fZ3JpZC5kYXRhU291cmNlLmF0KDApLm9wZXJhdG9yID0gbnVsbDtcblx0XHRcdHRoaXMuX2dyaWQucmVmcmVzaCgpO1xuXHRcdH1cblx0fVxuXG5cdF9vbkNsZWFyQnRDbGljaygpXG5cdHtcblx0XHQvLyBSZXNldCBmb3JtXG5cdFx0JCgnI2FuZE9wZXJhdG9yUkInLCB0aGlzLl9kaWFsb2cpLmF0dHIoJ2NoZWNrZWQnLCB0cnVlKTtcblx0XHQkKCcjb3JPcGVyYXRvclJCJywgdGhpcy5fZGlhbG9nKS5hdHRyKCdjaGVja2VkJywgZmFsc2UpO1xuXHRcdHRoaXMuX2VuYWJsZU9wZXJhdG9yUmIoZmFsc2UpO1xuXG5cdFx0dGhpcy5fdmFyTmFtZUNiLnZhbHVlKCcnKTtcblx0XHR0aGlzLl90eXBlRGQuc2VsZWN0KDApO1xuXHRcdHRoaXMuX2NvbmRpdGlvbkRkLnNlbGVjdCgwKTtcblxuXHRcdHRoaXMuX3ZhbHVlSW4udmFsKCcnKTtcblxuXHRcdC8vIENsZWFyIGdyaWQgc2VsZWN0aW9uXG5cdFx0dGhpcy5fZ3JpZC5jbGVhclNlbGVjdGlvbigpO1xuXG5cdFx0Ly8gQ2xlYXIgdGFibGVcblx0XHR0aGlzLl9ncmlkLnNldERhdGFTb3VyY2UoW10pO1xuXHR9XG5cblx0X2dldEV4cHJlc3Npb25QYXJ0KHZhckxhYmVsLCB2YXJOYW1lLCB2YXJWYWx1ZSwgdHlwZUxhYmVsLCBjb25kaXRpb24sIG9wZXJhdG9yKVxuXHR7XG5cdFx0cmV0dXJuIHtcblx0XHRcdCdsYWJlbCc6IHZhckxhYmVsLFxuXHRcdFx0J25hbWUnOiB2YXJOYW1lLFxuXHRcdFx0J3ZhbHVlJzogdmFyVmFsdWUsXG5cdFx0XHQndHlwZUxhYmVsJzogdHlwZUxhYmVsLFxuXHRcdFx0J3N5bWJvbCc6IGNvbmRpdGlvbi5zeW1ib2wsXG5cdFx0XHQnb3BlcmF0b3InOiBvcGVyYXRvcixcblx0XHRcdCdfY29uZGl0aW9uJzogY29uZGl0aW9uLFxuXHRcdH07XG5cdH1cblxuXHRfZW5hYmxlT3BlcmF0b3JSYihlbmFibGUpXG5cdHtcblx0XHQkKCcjYW5kT3BlcmF0b3JSQicsIHRoaXMuX2RpYWxvZykuYXR0cignZGlzYWJsZWQnLCAhZW5hYmxlKTtcblx0XHQkKCcjb3JPcGVyYXRvclJCJywgdGhpcy5fZGlhbG9nKS5hdHRyKCdkaXNhYmxlZCcsICFlbmFibGUpO1xuXHR9XG59XG5cbi8vIERFRklORSBDT01QT05FTlRcbmlmICghd2luZG93LmN1c3RvbUVsZW1lbnRzLmdldCgnbWF0Y2gtZXhwcmVzc2lvbi1idWlsZGVyJykpXG5cdHdpbmRvdy5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ21hdGNoLWV4cHJlc3Npb24tYnVpbGRlcicsIE1hdGNoRXhwcmVzc2lvbkJ1aWxkZXIpO1xuIiwiZXhwb3J0IGNsYXNzIFNpZGViYXJMYXlvdXQgZXh0ZW5kcyBIVE1MRWxlbWVudFxue1xuXHRjb25zdHJ1Y3RvcigpXG5cdHtcblx0ICAgIHN1cGVyKCk7XG5cblx0XHQvLyBBdHRhY2ggYSBzaGFkb3cgcm9vdFxuXHRcdGNvbnN0IHNoYWRvd1Jvb3QgPSB0aGlzLmF0dGFjaFNoYWRvdyh7bW9kZTogJ29wZW4nfSk7XG5cdFx0c2hhZG93Um9vdC5pbm5lckhUTUwgPSBgXG5cdFx0XHQ8c3R5bGU+XG5cdFx0XHRcdDpob3N0IHtcblx0XHRcdFx0XHRkaXNwbGF5OiBmbGV4O1xuXHRcdFx0XHRcdGZsZXgtZGlyZWN0aW9uOiByb3c7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRAbWVkaWEgKG1heC13aWR0aDogNTc1Ljk4cHgpIHtcblx0XHRcdFx0XHQ6aG9zdCguc3BsaXQteHMpIDo6c2xvdHRlZCg6bm90KFthcmlhLXNlbGVjdGVkPVwidHJ1ZVwiXSkpIHtcblx0XHRcdFx0XHRcdGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcblx0XHRcdFx0ICAgIH1cblxuXHRcdFx0XHRcdDpob3N0KC5zcGxpdC14cykgOjpzbG90dGVkKFthcmlhLXNlbGVjdGVkPVwidHJ1ZVwiXSkge1xuXHRcdFx0XHRcdFx0ZmxleC1ncm93OiAxO1xuXHRcdFx0XHQgICAgfVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0QG1lZGlhIChtYXgtd2lkdGg6IDc2Ny45OHB4KSB7XG5cdFx0XHRcdFx0Omhvc3QoLnNwbGl0LXNtKSA6OnNsb3R0ZWQoOm5vdChbYXJpYS1zZWxlY3RlZD1cInRydWVcIl0pKSB7XG5cdFx0XHRcdFx0XHRkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG5cdFx0XHRcdCAgICB9XG5cblx0XHRcdFx0XHQ6aG9zdCguc3BsaXQtc20pIDo6c2xvdHRlZChbYXJpYS1zZWxlY3RlZD1cInRydWVcIl0pIHtcblx0XHRcdFx0XHRcdGZsZXgtZ3JvdzogMTtcblx0XHRcdFx0ICAgIH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdEBtZWRpYSAobWF4LXdpZHRoOiA5OTEuOThweCkge1xuXHRcdFx0XHRcdDpob3N0KC5zcGxpdC1tZCkgOjpzbG90dGVkKDpub3QoW2FyaWEtc2VsZWN0ZWQ9XCJ0cnVlXCJdKSkge1xuXHRcdFx0XHRcdFx0ZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xuXHRcdFx0XHQgICAgfVxuXG5cdFx0XHRcdFx0Omhvc3QoLnNwbGl0LW1kKSA6OnNsb3R0ZWQoW2FyaWEtc2VsZWN0ZWQ9XCJ0cnVlXCJdKSB7XG5cdFx0XHRcdFx0XHRmbGV4LWdyb3c6IDE7XG5cdFx0XHRcdCAgICB9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRAbWVkaWEgKG1heC13aWR0aDogMTE5OS45OHB4KSB7XG5cdFx0XHRcdFx0Omhvc3QoLnNwbGl0LWxnKSA6OnNsb3R0ZWQoOm5vdChbYXJpYS1zZWxlY3RlZD1cInRydWVcIl0pKSB7XG5cdFx0XHRcdFx0XHRkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG5cdFx0XHRcdCAgICB9XG5cblx0XHRcdFx0XHQ6aG9zdCguc3BsaXQtbGcpIDo6c2xvdHRlZChbYXJpYS1zZWxlY3RlZD1cInRydWVcIl0pIHtcblx0XHRcdFx0XHRcdGZsZXgtZ3JvdzogMTtcblx0XHRcdFx0ICAgIH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC5zaWRlLWNvbDo6c2xvdHRlZCgqKSB7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQubWFpbi1jb2w6OnNsb3R0ZWQoKikge1xuXHRcdFx0XHRcdGZsZXgtZ3JvdzogMTtcblx0XHRcdFx0fVxuXHRcdFx0PC9zdHlsZT5cblxuXHRcdFx0PHNsb3QgY2xhc3M9XCJzaWRlLWNvbFwiIG5hbWU9XCJzaWRlLWNvbHVtblwiPjwvc2xvdD5cblx0XHRcdDxzbG90IGNsYXNzPVwibWFpbi1jb2xcIiBuYW1lPVwibWFpbi1jb2x1bW5cIj48L3Nsb3Q+XG5cdFx0YDtcblxuXHRcdC8vIFNldCBpbml0aWFsIHNlbGVjdGlvblxuXHRcdHRoaXMuc2VsZWN0ZWRJbmRleCA9IDA7XG5cdH1cblxuXHRnZXQgc2VsZWN0ZWRQYW5lbCgpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fc2VsZWN0ZWRQYW5lbDtcblx0fVxuXG5cdHNldCBzZWxlY3RlZFBhbmVsKGVsZW1lbnQpIC8vICdzaWRlJyBvciAnbWFpbidcblx0e1xuXHRcdGlmIChlbGVtZW50ICE9IG51bGwgJiYgZWxlbWVudC5wYXJlbnROb2RlID09IHRoaXMpXG5cdFx0e1xuXHRcdFx0dGhpcy5fc2VsZWN0ZWRQYW5lbCA9IGVsZW1lbnQ7XG5cblx0XHRcdGZvciAobGV0IGVsZW1lbnQgb2YgdGhpcy5jaGlsZHJlbilcblx0XHRcdHtcblx0XHRcdFx0aWYgKGVsZW1lbnQgPT0gdGhpcy5fc2VsZWN0ZWRQYW5lbClcblx0XHRcdFx0XHRlbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1zZWxlY3RlZCcsICd0cnVlJyk7XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1zZWxlY3RlZCcpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0Y29uc29sZS5lcnJvcignRWxlbWVudCBpcyBub3QgYSBjaGlsZCBvZiBTaWRlYmFyTGF5b3V0Jyk7XG5cdFx0fVxuXHR9XG5cblx0Z2V0IHNlbGVjdGVkSW5kZXgoKVxuXHR7XG5cdFx0cmV0dXJuIEFycmF5LmZyb20odGhpcy5jaGlsZHJlbikuaW5kZXhPZih0aGlzLl9zZWxlY3RlZFBhbmVsKTtcblx0fVxuXG5cdHNldCBzZWxlY3RlZEluZGV4KGluZGV4KVxuXHR7XG5cdFx0aWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID4gMClcblx0XHR7XG5cdFx0XHRpZiAodGhpcy5jaGlsZHJlbltpbmRleF0gPT0gbnVsbClcblx0XHRcdHtcblx0XHRcdFx0Y29uc29sZS5lcnJvcignSW52YWxpZCBTaWRlYmFyTGF5b3V0IGluZGV4Jyk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0bGV0IGVsZW1lbnQgPSB0aGlzLmNoaWxkcmVuW2luZGV4XTtcblx0XHRcdHRoaXMuc2VsZWN0ZWRQYW5lbCA9IGVsZW1lbnQ7XG5cdFx0fVxuXHR9XG59XG5cbi8vIERFRklORSBDT01QT05FTlRcbmlmICghd2luZG93LmN1c3RvbUVsZW1lbnRzLmdldCgnc2lkZWJhci1sYXlvdXQnKSlcblx0d2luZG93LmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnc2lkZWJhci1sYXlvdXQnLCBTaWRlYmFyTGF5b3V0KTtcbiIsImltcG9ydCB7QmFzZU1vZHVsZX0gZnJvbSAnLi9iYXNlLW1vZHVsZSc7XG5pbXBvcnQge1NpZGViYXJMYXlvdXR9IGZyb20gJy4uL2NvbXBvbmVudHMvc2lkZWJhci1sYXlvdXQnO1xuaW1wb3J0IHtNYXRjaEV4cHJlc3Npb25CdWlsZGVyfSBmcm9tICcuLi9jb21wb25lbnRzL21vZHVsZS1zcGVjaWZpYy9tYXRjaC1leHByZXNzaW9uLWJ1aWxkZXInO1xuaW1wb3J0IHtDb25maWdJbnRlcmZhY2VCdWlsZGVyfSBmcm9tICcuLi91dGlscy91aWJ1aWxkZXIvY29uZmlnLWludGVyZmFjZS1idWlsZGVyJztcbmltcG9ydCB7Y2FwaXRhbGl6ZUZpcnN0LCBmaWx0ZXJDbGFzc05hbWUsIHJvdW5kVG9EZWNpbWFscywgc2NhbGVCeXRlc30gZnJvbSAnLi4vdXRpbHMvdXRpbGl0aWVzJztcbmltcG9ydCB7Um9vbVByb3BlcnRpZXNEYXRhLFVzZXJQcm9wZXJ0aWVzRGF0YX0gZnJvbSAnLi4vdXRpbHMvbWF0Y2gtcHJvcGVydGllcyc7XG5pbXBvcnQge1VzZXJDb3VudENoYXJ0fSBmcm9tICcuLi9jb21wb25lbnRzL2NoYXJ0cy91c2VyLWNvdW50LWNoYXJ0JztcbmltcG9ydCB7Z2V0VGltZVJhbmdlVG9vbHRpcFRlbXBsYXRlLCBnZXRXUkJ5dGVzTGFiZWxUZW1wbGF0ZX0gZnJvbSAnLi4vY29tcG9uZW50cy9jaGFydHMvY2hhcnQtdXRpbHMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBab25lTW9uaXRvciBleHRlbmRzIEJhc2VNb2R1bGVcbntcblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdCAgICBzdXBlcignem9uZU1vbml0b3InKTtcblxuXHRcdHRoaXMuTU9OSVRPUkVEX1RZUEVfWk9ORSA9ICd6b25lJztcblx0XHR0aGlzLk1PTklUT1JFRF9UWVBFX1JPT00gPSAncm9vbSc7XG5cdFx0dGhpcy5NT05JVE9SRURfVFlQRV9VU0VSID0gJ3VzZXInO1xuXG5cdFx0dGhpcy5BTllfTEFCRUwgPSAnW2FueV0nO1xuXHRcdHRoaXMuREVGQVVMVF9HUk9VUF9OQU1FID0gJ2RlZmF1bHQnO1xuXHRcdHRoaXMuTUFYX0VYVEVOU0lPTl9MT0dfU0laRSA9IDMwMDtcblx0XHR0aGlzLktJQ0tfQkFOX0RFRkFVTFRfREVMQVkgPSA1O1xuXG5cdFx0Ly8gT3V0Z29pbmcgcmVxdWVzdHNcblx0XHR0aGlzLlJFUV9HRVRfREFUQSA9ICdnZXREYXRhJztcblx0XHR0aGlzLlJFUV9TRVRfWk9ORV9TRVRUSU5HUyA9ICdzZXRab25lU2V0dGluZ3MnO1xuXHRcdHRoaXMuUkVRX1NFVF9ST09NX1NFVFRJTkdTID0gJ3NldFJvb21TZXR0aW5ncyc7XG5cdFx0dGhpcy5SRVFfU0VUX1VTRVJfU0VUVElOR1MgPSAnc2V0VXNlclNldHRpbmdzJztcblx0XHR0aGlzLlJFUV9SRUxPQURfWk9ORV9FWFQgPSAncmVsb2FkWm9uZUV4dCc7XG5cdFx0dGhpcy5SRVFfUkVMT0FEX1dPUkRTID0gJ3JlbG9hZFdvcmRzJztcblx0XHR0aGlzLlJFUV9ESVNDT05ORUNUX1VTRVIgPSAnZGlzY29ublVzZXInO1xuXHRcdHRoaXMuUkVRX0tJQ0tfVVNFUiA9ICdraWNrVXNlcic7XG5cdFx0dGhpcy5SRVFfQkFOX1VTRVIgPSAnYmFuVXNlcic7XG5cdFx0dGhpcy5SRVFfR0VUX1JPT01fQ09ORklHID0gJ2dldFJvb21Db25maWcnO1xuXHRcdHRoaXMuUkVRX0NSRUFURV9ST09NID0gJ2NyZWF0ZVJvb20nO1xuXHRcdHRoaXMuUkVRX1JFTU9WRV9ST09NID0gJ3JlbW92ZVJvb20nO1xuXHRcdHRoaXMuUkVRX0FETUlOX01TRyA9ICdhZG1pbk1zZyc7XG5cblx0XHQvLyBJbmNvbWluZyByZXNwb25zZXNcblx0XHR0aGlzLlJFU1BfREFUQSA9ICdkYXRhJztcblx0XHR0aGlzLlJFU1BfVU5FWFBFQ1RFRF9FUlJPUiA9ICd1bmV4cEVycm9yJztcblx0XHR0aGlzLlJFU1BfVVBEQVRFX0VSUk9SID0gJ3VwZGF0ZUVycm9yJztcblx0XHR0aGlzLlJFU1BfUk9PTV9DT05GSUcgPSAncm9vbUNvbmZpZyc7XG5cdFx0dGhpcy5SRVNQX1JPT01fQ09ORklHX0VSUk9SID0gJ3Jvb21Db25maWdFcnInO1xuXHRcdHRoaXMuUkVTUF9ST09NX0NSRUFURUQgPSAncm9vbUNyZWF0ZWQnO1xuXHRcdHRoaXMuUkVTUF9ST09NX0NSRUFUSU9OX0VSUk9SID0gJ3Jvb21FcnJvcic7XG5cdFx0dGhpcy5SRVNQX0xPR19NRVNTQUdFUyA9ICdsb2cnOyAvLyBUaGlzIHJlc3BvbnNlIGRvZXNuJ3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgcmVxdWVzdCBiZWNhdXNlIGl0IGlzIG1hbmFnZWQgYnkgYSBzZXJ2ZXIgZXZlbnQgbGlzdGVuZXJcblxuXHRcdHRoaXMuX2N1cnJlbnRSZXF1ZXN0SWQgPSAtMTtcblx0fVxuXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdC8vIENPTU1PTiBNT0RVTEUgSU5URVJGQUNFIE1FVEhPRFNcblx0Ly8gVGhpcyBtZW1iZXJzIGFyZSB1c2VkIGJ5IHRoZSBtYWluIGNvbnRyb2xsZXJcblx0Ly8gdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgbW9kdWxlJ3MgY29udHJvbGxlci5cblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRpbml0aWFsaXplKGlkRGF0YSwgc2hlbGxDb250cm9sbGVyKVxuXHR7XG5cdFx0Ly8gQ2FsbCBzdXBlciBtZXRob2Rcblx0XHRzdXBlci5pbml0aWFsaXplKGlkRGF0YSwgc2hlbGxDb250cm9sbGVyKTtcblxuXHRcdC8vIFNldCBtb25pdG9yaW5nIGludGVyZmFjZVxuXHRcdHRoaXMuX3NldE1vbml0b3JpbmdJbnRlcmZhY2UoKTtcblxuXHRcdC8vIEluaXRpYWxpemUgcHJvZ3Jlc3MgYmFyXG5cdFx0JCgnI3pubS1wcm9ncmVzc0JhcicpLmtlbmRvUHJvZ3Jlc3NCYXIoe1xuXHRcdFx0bWluOiAwLFxuICAgICAgICAgICAgbWF4OiAxMDAsXG5cdFx0XHR2YWx1ZTogZmFsc2UsXG4gICAgICAgICAgICB0eXBlOiAndmFsdWUnLFxuICAgICAgICAgICAgYW5pbWF0aW9uOiB7XG4gICAgICAgICAgICAgICAgZHVyYXRpb246IDQwMFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuXHRcdC8vIExJU1RTXG5cblx0XHQvLyBJbml0aWFsaXplIGludGVydmFsIGRyb3Bkb3duXG5cdFx0dGhpcy5faW50ZXJ2YWxEcm9wRG93biA9ICQoJyN6bm0taW50ZXJ2YWxERCcpLmtlbmRvRHJvcERvd25MaXN0KHtcblx0XHRcdHZhbHVlVGVtcGxhdGU6ICc8c3BhbiBjbGFzcz1cInRleHQtbXV0ZWQgcHItMVwiPkludGVydmFsOjwvc3Bhbj48c3Bhbj4jOmRhdGEudGV4dCM8L3NwYW4+Jyxcblx0XHRcdGNoYW5nZTogJC5wcm94eSh0aGlzLl9vblVwZGF0ZUludGVydmFsQ2hhbmdlLCB0aGlzKVxuXHRcdH0pLmRhdGEoJ2tlbmRvRHJvcERvd25MaXN0Jyk7XG5cblx0XHQvLyBJbml0aWFsaXplIHBhbmUgYmFyXG5cdFx0dGhpcy5fYWNjb3JkaW9uID0gJCgnI3pubS1wYW5lbGJhcicpLmtlbmRvUGFuZWxCYXIoe1xuICAgICAgICAgICAgZXhwYW5kTW9kZTogJ3NpbmdsZScsXG5cdFx0XHRjaGFuZ2U6ICQucHJveHkodGhpcy5fb25FbnRpdGllc1BhbmVsQ2hhbmdlLCB0aGlzKVxuICAgICAgICB9KS5kYXRhKCdrZW5kb1BhbmVsQmFyJyk7XG5cblx0XHQvLyBJbml0aWFsaXplIGxpc3RzXG5cdFx0dGhpcy5fem9uZUxpc3RCb3ggPSAkKFwiI3pubS16b25lTGlzdFwiKS5rZW5kb0xpc3RCb3goe1xuXHRcdFx0dGVtcGxhdGU6ICc8ZGl2PiM6ZGF0YS5uYW1lIyAoIzpkYXRhLnVzZXJzIyk8L2Rpdj4nLFxuXHRcdFx0Y2hhbmdlOiAkLnByb3h5KHRoaXMuX29uWm9uZVNlbGVjdGVkLCB0aGlzKVxuXHRcdH0pLmRhdGEoJ2tlbmRvTGlzdEJveCcpO1xuXG5cdFx0dGhpcy5fem9uZUxpc3RCb3gud3JhcHBlci5maW5kKCcuay1saXN0Jykub24oJ2RibGNsaWNrJywgJy5rLWl0ZW0nLCAkLnByb3h5KHRoaXMuX29uTW9uaXRvclNlbGVjdGlvbkJ0Q2xpY2ssIHRoaXMpKTtcblxuXHRcdHRoaXMuX3Jvb21MaXN0Qm94ID0gJChcIiN6bm0tcm9vbUxpc3RcIikua2VuZG9MaXN0Qm94KHtcblx0XHRcdHRlbXBsYXRlOiAnPGRpdj4jOmRhdGEubmFtZSMgKCM6ZGF0YS51c2VycyMpPC9kaXY+Jyxcblx0XHRcdGNoYW5nZTogJC5wcm94eSh0aGlzLl9vblJvb21TZWxlY3RlZCwgdGhpcylcblx0XHR9KS5kYXRhKCdrZW5kb0xpc3RCb3gnKTtcblxuXHRcdHRoaXMuX3Jvb21MaXN0Qm94LndyYXBwZXIuZmluZCgnLmstbGlzdCcpLm9uKCdkYmxjbGljaycsICcuay1pdGVtJywgJC5wcm94eSh0aGlzLl9vbk1vbml0b3JTZWxlY3Rpb25CdENsaWNrLCB0aGlzKSk7XG5cblx0XHR0aGlzLl91c2VyTGlzdEJveCA9ICQoXCIjem5tLXVzZXJMaXN0XCIpLmtlbmRvTGlzdEJveCh7XG5cdFx0XHR0ZW1wbGF0ZTogJzxkaXY+IzpkYXRhLm5hbWUjPC9kaXY+Jyxcblx0XHRcdGNoYW5nZTogJC5wcm94eSh0aGlzLl9vblVzZXJTZWxlY3RlZCwgdGhpcylcblx0XHR9KS5kYXRhKCdrZW5kb0xpc3RCb3gnKTtcblxuXHRcdHRoaXMuX3VzZXJMaXN0Qm94LndyYXBwZXIuZmluZCgnLmstbGlzdCcpLm9uKCdkYmxjbGljaycsICcuay1pdGVtJywgJC5wcm94eSh0aGlzLl9vbk1vbml0b3JTZWxlY3Rpb25CdENsaWNrLCB0aGlzKSk7XG5cblx0XHQvLyBJbml0aWFsaXplIFJvb20gR3JvdXBzIGRyb3Bkb3duXG5cdFx0dGhpcy5fZ3JvdXBzRHJvcERvd24gPSAkKCcjem5tLXJvb21Hcm91cHNERCcpLmtlbmRvRHJvcERvd25MaXN0KHtcblx0XHRcdGRhdGFUZXh0RmllbGQ6ICdsYWJlbCcsXG4gIFx0XHRcdGRhdGFWYWx1ZUZpZWxkOiAnbmFtZScsXG5cdFx0XHRjaGFuZ2U6ICQucHJveHkodGhpcy5fb25Hcm91cENoYW5nZSwgdGhpcylcblx0XHR9KS5kYXRhKCdrZW5kb0Ryb3BEb3duTGlzdCcpO1xuXG5cdFx0Ly8gQnVpbGQgaW5pdGlhbCBncm91cHMgbGlzdFxuXHRcdHRoaXMuX3NldEdyb3Vwc0RhdGFQcm92aWRlcihudWxsKTtcblxuXHRcdC8vIC8vIENyZWF0ZSBpbnRlcmZhY2UgYnVpbGRlciBpbnN0YW5jZXNcblx0XHR0aGlzLl9pbnRlcmZhY2VCdWlsZGVyID0gbmV3IENvbmZpZ0ludGVyZmFjZUJ1aWxkZXIoKTtcblx0XHR0aGlzLl9yb29tQ3JlYXRpb25JQnVpbGRlciA9IG5ldyBDb25maWdJbnRlcmZhY2VCdWlsZGVyKCk7XG5cblx0XHQvLyBBZGQgbGlzdGVuZXIgdG8gc2hvdyBsaW1pdCB3YXJuaW5nIHRvb2x0aXBzXG5cdFx0JCgnI3pubS1wYW5lbGJhcicpLmtlbmRvVG9vbHRpcCh7XG5cdFx0XHRmaWx0ZXI6ICdpW3RpdGxlXS5saW1pdC13YXJuaW5nJyxcblx0XHRcdHBvc2l0aW9uOiAncmlnaHQnLFxuXHRcdFx0d2lkdGg6ICcyNTBweCcsXG5cdFx0XHRjb250ZW50OiBmdW5jdGlvbihlKSB7XG5cdFx0XHRcdHJldHVybiBgPGRpdiBjbGFzcz1cImhlbHAtdG9vbHRpcFwiPiR7ZS50YXJnZXQuZGF0YSgndGl0bGUnKX08L2Rpdj5gO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0Ly8gUk9PTSBDUkVBVElPTiBQQU5FTFxuXG5cdFx0Ly8gQWRkIGNsaWNrIGxpc3RlbmVyIHRvIENyZWF0ZSAmIFJlbW92ZSBSb29tIGJ1dHRvbnNcblx0XHQkKCcjem5tLWNyZWF0ZVJvb21CdCcpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25DcmVhdGVSb29tQnRDbGljaywgdGhpcykpO1xuXHRcdCQoJyN6bm0tcmVtb3ZlUm9vbUJ0Jykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vblJlbW92ZVJvb21CdENsaWNrLCB0aGlzKSk7XG5cblx0XHQvLyBDb25maWd1cmUgcm9vbSBjcmVhdGlvbiBwYW5lbFxuXHRcdCQoJyN6bm0tY3JlYXRlUm9vbU1vZGFsJykubW9kYWwoe1xuXHRcdFx0YmFja2Ryb3A6ICdzdGF0aWMnLFxuXHRcdFx0a2V5Ym9hcmQ6IGZhbHNlLFxuXHRcdFx0c2hvdzogZmFsc2UsXG5cdFx0fSk7XG5cblx0XHQvLyBBZGQgbGlzdGVuZXIgZm9yIHJvb20gY3JlYXRpb24gcGFuZWwncyBjcmVhdGUgYnV0dG9uIGNsaWNrXG5cdFx0JCgnI3pubS1yb29tQ3JlYXRvckNyZWF0ZUJ0Jykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vblJvb21DcmVhdG9yQ3JlYXRlQnRDbGljaywgdGhpcykpO1xuXG5cdFx0Ly8gQWRkIGxpc3RlbmVyIGZvciByb29tIGNyZWF0aW9uIHBhbmVsIGhpZGVcblx0XHQkKCcjem5tLWNyZWF0ZVJvb21Nb2RhbCcpLm9uKCdoaWRkZW4uYnMubW9kYWwnLCAkLnByb3h5KHRoaXMuX29uQ3JlYXRlUm9vbU1vZGFsSGlkZGVuLCB0aGlzKSk7XG5cblx0XHQvLyBST09NICYgVVNFUiBGSUxURVJJTkcgUEFORUxTXG5cblx0XHQvLyBTZXR1cCBtYXRjaCBleHByZXNzaW9uIGJ1aWxkZXIgcGFuZWwgZm9yIHJvb21zXG5cdFx0dGhpcy5fcm9vbUZpbHRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd6bm0tcm9vbUZpbHRlcicpO1xuXHRcdHRoaXMuX3Jvb21GaWx0ZXIudGl0bGUgPSAnUm9vbSBGaWx0ZXIgRXhwcmVzc2lvbiBCdWlsZGVyJztcblx0XHR0aGlzLl9yb29tRmlsdGVyLnByZWRlZmluZWRWYXJOYW1lcyA9IFJvb21Qcm9wZXJ0aWVzRGF0YS5wcm9wZXJ0aWVzQXJyYXk7XG5cdFx0JCh0aGlzLl9yb29tRmlsdGVyKS5vbih0aGlzLl9yb29tRmlsdGVyLkVYUFJFU1NJT05fVVBEQVRFRF9FVkVOVCwgJC5wcm94eSh0aGlzLl9vblJvb21GaWx0ZXJVcGRhdGVkLCB0aGlzKSk7XG5cblx0XHQkKCcjem5tLWZpbHRlclJvb21CdCcpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25TaG93Um9vbUZpbHRlckJ0Q2xpY2ssIHRoaXMpKTtcblx0XHQkKCcjem5tLWFwcGx5Um9vbUZpbHRlckNCJykub24oJ2NoYW5nZScsICQucHJveHkodGhpcy5fb25BcHBseUJ0Q2hhbmdlLCB0aGlzKSk7XG5cblx0XHQvLyBTZXR1cCBtYXRjaCBleHByZXNzaW9uIGJ1aWxkZXIgcGFuZWwgZm9yIHVzZXJzXG5cdFx0dGhpcy5fdXNlckZpbHRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd6bm0tdXNlckZpbHRlcicpO1xuXHRcdHRoaXMuX3VzZXJGaWx0ZXIudGl0bGUgPSAnVXNlciBGaWx0ZXIgRXhwcmVzc2lvbiBCdWlsZGVyJztcblx0XHR0aGlzLl91c2VyRmlsdGVyLnByZWRlZmluZWRWYXJOYW1lcyA9IFVzZXJQcm9wZXJ0aWVzRGF0YS5wcm9wZXJ0aWVzQXJyYXk7XG5cdFx0JCh0aGlzLl91c2VyRmlsdGVyKS5vbih0aGlzLl91c2VyRmlsdGVyLkVYUFJFU1NJT05fVVBEQVRFRF9FVkVOVCwgJC5wcm94eSh0aGlzLl9vblVzZXJGaWx0ZXJVcGRhdGVkLCB0aGlzKSk7XG5cblx0XHQkKCcjem5tLWZpbHRlclVzZXJCdCcpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25TaG93VXNlckZpbHRlckJ0Q2xpY2ssIHRoaXMpKTtcblx0XHQkKCcjem5tLWFwcGx5VXNlckZpbHRlckNCJykub24oJ2NoYW5nZScsICQucHJveHkodGhpcy5fb25BcHBseUJ0Q2hhbmdlLCB0aGlzKSk7XG5cblx0XHQvLyBNQUlOIENPTlRST0xTXG5cblx0XHQkKCcjem5tLW1vbml0b3JCdCcpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25Nb25pdG9yU2VsZWN0aW9uQnRDbGljaywgdGhpcykpO1xuXHRcdCQoJyN6bm0tc2VuZE1lc3NhZ2VCdCcpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25TZW5kQWRtaW5Nc2dCdENsaWNrLCB0aGlzKSk7XG5cdFx0JCgnI3pubS1tZXNzYWdlSW4nKS5vbigna2V5dXAnLCAkLnByb3h5KHRoaXMuX29uU2VuZEFkbWluTXNnSW5LZXlVcCwgdGhpcykpO1xuXG5cdFx0Ly8gTU9OSVRPUklORyBDT05UUk9MU1xuXG5cdFx0JCgnI3pubS1jbG9zZU1vbml0b3JCdCcpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25DbG9zZU1vbml0b3JCdENsaWNrLCB0aGlzKSk7XG5cdFx0JCgnI3pubS1lZGl0QnQnKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uRWRpdEJ0Q2xpY2ssIHRoaXMpKTtcblx0XHQkKCcjem5tLWNhbmNlbEJ0Jykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vbkNhbmNlbEJ0Q2xpY2ssIHRoaXMpKTtcblx0XHQkKCcjem5tLXN1Ym1pdEJ0Jykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vblN1Ym1pdEJ0Q2xpY2ssIHRoaXMpKTtcblxuXHRcdC8vIEhpZGUgZWRpdCBjb250cm9sc1xuXHRcdCQoJyN6bm0tZWRpdENvbnRyb2xzJykuaGlkZSgpO1xuXG5cdFx0Ly8gWk9ORSBNT05JVE9SIC0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdFx0Ly8gU2V0IHJlZmVyZW5jZSB0byB1c2VyIGNvdW50IGNoYXJ0XG5cdFx0dGhpcy5fdXNlckNvdW50Q2hhcnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnem5tLXVzZXJDb3VudENoYXJ0Jyk7XG5cblx0XHQvLyBJbml0aWFsaXplIHRpbWUgcmFuZ2Ugc2xpZGVyXG5cdFx0dGhpcy5fdGltZVNsaWRlciA9ICQoJyN6bm0tdGltZVNsaWRlcicpLmtlbmRvUmFuZ2VTbGlkZXIoe1xuXHRcdFx0bWluOiAtMjQsXG4gICAgICAgICAgICBtYXg6IDAsXG4gICAgICAgICAgICBzbWFsbFN0ZXA6IDEsXG4gICAgICAgICAgICBsYXJnZVN0ZXA6IDAsXG5cdFx0XHRjaGFuZ2U6ICQucHJveHkodGhpcy5fb25UaW1lUmFuZ2VDaGFuZ2UsIHRoaXMpLFxuXHRcdFx0dG9vbHRpcDoge1xuXHRcdFx0XHR0ZW1wbGF0ZTogZ2V0VGltZVJhbmdlVG9vbHRpcFRlbXBsYXRlKClcblx0XHRcdH0sXG5cdFx0XHRsZWZ0RHJhZ0hhbmRsZVRpdGxlOiAnRHJhZycsXG5cdFx0XHRyaWdodERyYWdIYW5kbGVUaXRsZTogJ0RyYWcnLFxuXHRcdH0pLmRhdGEoJ2tlbmRvUmFuZ2VTbGlkZXInKTtcblxuXHRcdC8vIFJlc2V0IHRpbWUgcmFuZ2Ugb24gdXNlciBjb3VudCBjaGFydFxuXHRcdHRoaXMuX29uVGltZVJhbmdlQ2hhbmdlKCk7XG5cblx0XHQvLyBBZGQgYnV0dG9uIGNsaWNrIGxpc3RlbmVyc1xuXHRcdCQoJyN6bm0tcmVsb2FkV29yZHNCdCcpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25Xb3Jkc1JlbG9hZEJ0Q2xpY2ssIHRoaXMpKTtcblx0XHQkKCcjem5tLXJlbG9hZFpvbmVFeHRCdCcpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25ab25lRXh0UmVsb2FkQnRDbGljaywgdGhpcykpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBleHRlbnNpb24gbG9nIGdyaWRcblx0XHR0aGlzLl96b25lRXh0TG9nR3JpZCA9ICQoJyN6bm0tem9uZUV4dExvZ0dyaWQnKS5rZW5kb0dyaWQoe1xuXHRcdFx0ZGF0YVNvdXJjZTogW10sXG5cdFx0XHRyZXNpemFibGU6IHRydWUsXG5cdFx0XHRzZWxlY3RhYmxlOiBmYWxzZSxcblx0XHRcdG5vUmVjb3Jkczoge1xuXHRcdFx0XHR0ZW1wbGF0ZTogJ05vIGVudHJpZXMuJ1xuXHRcdFx0fSxcblx0XHRcdGNvbHVtbnM6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGZpZWxkOiAndGltZXN0YW1wJyxcblx0XHRcdFx0XHR0aXRsZTogJ1RpbWVzdGFtcCcsXG5cdFx0XHRcdFx0d2lkdGg6IDE4MFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0ZmllbGQ6ICdsZXZlbCcsXG5cdFx0XHRcdFx0dGl0bGU6ICdMZXZlbCcsXG5cdFx0XHRcdFx0d2lkdGg6IDEwMFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0ZmllbGQ6ICdtZXNzYWdlJyxcblx0XHRcdFx0XHR0aXRsZTogJ01lc3NhZ2UnLFxuXHRcdFx0XHRcdHdpZHRoOiA0MDBcblx0XHRcdFx0fSxcblx0XHRcdF0sXG5cdFx0XHRkYXRhQm91bmQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0ICAgIHRoaXMuY29udGVudC5zY3JvbGxUb3AodGhpcy50Ym9keS5oZWlnaHQoKSk7IC8vIFNjcm9sbCB0byBib3R0b21cblx0XHRcdH1cblx0XHR9KS5kYXRhKCdrZW5kb0dyaWQnKTtcblxuXHRcdC8vIFJPT00gTU9OSVRPUiAtLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRcdC8vIEluaXRpYWxpemUgZXh0ZW5zaW9uIGxvZyBncmlkXG5cdFx0dGhpcy5fcm9vbUV4dExvZ0dyaWQgPSAkKCcjem5tLXJvb21FeHRMb2dHcmlkJykua2VuZG9HcmlkKHtcblx0XHRcdGRhdGFTb3VyY2U6IFtdLFxuXHRcdFx0cmVzaXphYmxlOiB0cnVlLFxuXHRcdFx0c2VsZWN0YWJsZTogZmFsc2UsXG5cdFx0XHRub1JlY29yZHM6IHtcblx0XHRcdFx0dGVtcGxhdGU6ICdObyBlbnRyaWVzLidcblx0XHRcdH0sXG5cdFx0XHRjb2x1bW5zOiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRmaWVsZDogJ3RpbWVzdGFtcCcsXG5cdFx0XHRcdFx0dGl0bGU6ICdUaW1lc3RhbXAnLFxuXHRcdFx0XHRcdHdpZHRoOiAxODBcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGZpZWxkOiAnbGV2ZWwnLFxuXHRcdFx0XHRcdHRpdGxlOiAnTGV2ZWwnLFxuXHRcdFx0XHRcdHdpZHRoOiAxMDBcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGZpZWxkOiAnbWVzc2FnZScsXG5cdFx0XHRcdFx0dGl0bGU6ICdNZXNzYWdlJyxcblx0XHRcdFx0XHR3aWR0aDogNDAwXG5cdFx0XHRcdH0sXG5cdFx0XHRdLFxuXHRcdFx0ZGF0YUJvdW5kOiBmdW5jdGlvbigpIHtcblx0XHRcdCAgICB0aGlzLmNvbnRlbnQuc2Nyb2xsVG9wKHRoaXMudGJvZHkuaGVpZ2h0KCkpOyAvLyBTY3JvbGwgdG8gYm90dG9tXG5cdFx0XHR9XG5cdFx0fSkuZGF0YSgna2VuZG9HcmlkJyk7XG5cblx0XHQvLyBVU0VSIE1PTklUT1IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0XHR0aGlzLl9raWNrRGVsYXlJbiA9ICQoJyN6bm0ta2lja0RlbGF5TlMnKS5rZW5kb051bWVyaWNUZXh0Qm94KHtcblx0XHQgICAgbWluOiAwLFxuXHRcdCAgICBzdGVwOiAxLFxuXHRcdCAgICBmb3JtYXQ6ICcjJyxcblx0XHRcdHBsYWNlaG9sZGVyOiAnRGVsYXkgKHMpJ1xuXHRcdH0pLmRhdGEoJ2tlbmRvTnVtZXJpY1RleHRCb3gnKTtcblxuXHRcdHRoaXMuX2Jhbk1vZGVEZCA9ICQoJyN6bm0tYmFuTW9kZUREJykua2VuZG9Ecm9wRG93bkxpc3Qoe1xuXHRcdFx0ZGF0YVNvdXJjZTogWydJUCcsICdOQU1FJ10sXG5cdFx0XHRhdXRvV2lkdGg6IHRydWUsXG5cdFx0XHRvcHRpb25MYWJlbDoge1xuXHRcdFx0XHR0ZXh0OiAnTW9kZSdcblx0XHRcdH0sXG5cdFx0XHRvcHRpb25MYWJlbFRlbXBsYXRlOiAnPHNwYW4gY2xhc3M9XCJ0ZXh0LW11dGVkXCI+Izp0ZXh0Izwvc3Bhbj4nLFxuXHRcdH0pLmRhdGEoJ2tlbmRvRHJvcERvd25MaXN0Jyk7XG5cblx0XHR0aGlzLl9iYW5EdXJVbml0RGQgPSAkKCcjem5tLWJhbkR1cmF0aW9uVW5pdEREJykua2VuZG9Ecm9wRG93bkxpc3Qoe1xuXHRcdFx0YXV0b1dpZHRoOiB0cnVlLFxuXHRcdH0pLmRhdGEoJ2tlbmRvRHJvcERvd25MaXN0Jyk7XG5cblx0XHR0aGlzLl9iYW5EdXJhdGlvbkluID0gJCgnI3pubS1iYW5EdXJhdGlvbk5TJykua2VuZG9OdW1lcmljVGV4dEJveCh7XG5cdFx0ICAgIG1pbjogMSxcblx0XHQgICAgc3RlcDogMSxcblx0XHQgICAgZm9ybWF0OiAnIycsXG5cdFx0XHRwbGFjZWhvbGRlcjogJ0R1cmF0aW9uJ1xuXHRcdH0pLmRhdGEoJ2tlbmRvTnVtZXJpY1RleHRCb3gnKTtcblxuXHRcdHRoaXMuX2JhbkRlbGF5SW4gPSAkKCcjem5tLWJhbkRlbGF5TlMnKS5rZW5kb051bWVyaWNUZXh0Qm94KHtcblx0XHQgICAgbWluOiAwLFxuXHRcdCAgICBzdGVwOiAxLFxuXHRcdCAgICBmb3JtYXQ6ICcjJyxcblx0XHRcdHBsYWNlaG9sZGVyOiAnRGVsYXkgKHMpJ1xuXHRcdH0pLmRhdGEoJ2tlbmRvTnVtZXJpY1RleHRCb3gnKTtcblxuXHRcdC8vIEFkZCBidXR0b24gY2xpY2sgbGlzdGVuZXJzXG5cdFx0JCgnI3pubS1kaXNjb25uZWN0QnQnKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uRGlzY29ubmVjdEJ0Q2xpY2ssIHRoaXMpKTtcblx0XHQkKCcjem5tLWtpY2tCdCcpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25LaWNrQnRDbGljaywgdGhpcykpO1xuXHRcdCQoJyN6bm0tYmFuQnQnKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uQmFuQnRDbGljaywgdGhpcykpO1xuXG5cdFx0Ly8gQ2hhcnRzXG5cblx0XHR0aGlzLl9wYWNrZXRRdWV1ZUNoYXJ0ID0gJCgnI3pubS1wYWNrZXRRdWV1ZUNoYXJ0Jykua2VuZG9DaGFydCh7XG5cdFx0XHR0cmFuc2l0aW9uczogZmFsc2UsXG5cdFx0XHRjaGFydEFyZWE6IHtcblx0XHRcdFx0aGVpZ2h0OiAxMDBcblx0XHRcdH0sXG5cdCAgICAgICAgbGVnZW5kOiB7XG5cdCAgICAgICAgICAgIHZpc2libGU6IGZhbHNlXG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXJpZXNEZWZhdWx0czoge1xuXHQgICAgICAgICAgICB0eXBlOiAnYmFyJyxcblx0ICAgICAgICAgICAgbGFiZWxzOiB7XG5cdCAgICAgICAgICAgICAgICB2aXNpYmxlOiB0cnVlLFxuXHQgICAgICAgICAgICAgICAgZm9ybWF0OiAnezB9JScsXG5cdCAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAndHJhbnNwYXJlbnQnLFxuXHRcdFx0XHRcdHBvc2l0aW9uOiAnaW5zaWRlQmFzZSdcblx0ICAgICAgICAgICAgfSxcblx0XHRcdFx0Z2FwOiAuNSxcblx0XHRcdFx0c3BhY2luZzogMCxcblx0XHRcdFx0b3ZlcmxheToge1xuXHRcdFx0XHRcdGdyYWRpZW50OiAnbm9uZSdcblx0XHRcdFx0fSxcblx0XHRcdFx0Ym9yZGVyOiB7XG5cdFx0XHRcdFx0d2lkdGg6IDBcblx0XHRcdFx0fVxuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2VyaWVzOiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnUGFja2V0IHF1ZXVlJyxcblx0XHQgICAgICAgICAgICBmaWVsZDogJ3ZhbHVlJyxcblx0XHQgICAgICAgICAgICBjYXRlZ29yeUZpZWxkOiAnY2F0ZWdvcnknLFxuXHRcdFx0XHRcdGNvbG9yOiAnI0ZCN0QzMydcblx0XHQgICAgICAgIH1cblx0XHRcdF0sXG5cdCAgICAgICAgdmFsdWVBeGlzOiB7XG5cdCAgICAgICAgICAgIGxhYmVsczoge1xuXHQgICAgICAgICAgICAgICAgZm9ybWF0OiAnezB9JSdcblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgbGluZToge1xuXHQgICAgICAgICAgICAgICAgdmlzaWJsZTogZmFsc2Vcblx0ICAgICAgICAgICAgfSxcblx0XHRcdFx0bWluOiAwLFxuXHQgICAgXHRcdG1heDogMTAwXG5cdCAgICAgICAgfSxcblx0ICAgICAgICBjYXRlZ29yeUF4aXM6IHtcblx0ICAgICAgICAgICAgbWFqb3JHcmlkTGluZXM6IHtcblx0ICAgICAgICAgICAgICAgIHZpc2libGU6IGZhbHNlXG5cdCAgICAgICAgICAgIH0sXG5cdFx0XHRcdG1ham9yVGlja3M6IHtcblx0XHRcdFx0XHR2aXNpYmxlOiBmYWxzZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRsYWJlbHM6IHtcblx0XHRcdFx0XHR2aXNpYmxlOiBmYWxzZVxuXHRcdFx0XHR9XG5cdCAgICAgICAgfSxcblx0XHRcdHRvb2x0aXA6IHtcblx0XHRcdFx0dmlzaWJsZTogZmFsc2UsXG5cdCAgICAgICAgfVxuXHQgICAgfSkuZGF0YSgna2VuZG9DaGFydCcpO1xuXG5cdFx0dGhpcy5fZHJvcHBlZE1zZ0NoYXJ0ID0gJCgnI3pubS1kcm9wcGVkTXNnQ2hhcnQnKS5rZW5kb0NoYXJ0KHtcblx0XHRcdHRyYW5zaXRpb25zOiBmYWxzZSxcblx0XHRcdGNoYXJ0QXJlYToge1xuXHRcdFx0XHRoZWlnaHQ6IDEwMFxuXHRcdFx0fSxcblx0ICAgICAgICBsZWdlbmQ6IHtcblx0ICAgICAgICAgICAgdmlzaWJsZTogZmFsc2Vcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNlcmllc0RlZmF1bHRzOiB7XG5cdCAgICAgICAgICAgIHR5cGU6ICdiYXInLFxuXHQgICAgICAgICAgICBsYWJlbHM6IHtcblx0ICAgICAgICAgICAgICAgIHZpc2libGU6IHRydWUsXG5cdCAgICAgICAgICAgICAgICBmb3JtYXQ6ICd7MH0nLFxuXHQgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogJ3RyYW5zcGFyZW50Jyxcblx0XHRcdFx0XHRwb3NpdGlvbjogJ2luc2lkZUJhc2UnLFxuXHQgICAgICAgICAgICB9LFxuXHRcdFx0XHRnYXA6IC41LFxuXHRcdFx0XHRzcGFjaW5nOiAwLFxuXHRcdFx0XHRvdmVybGF5OiB7XG5cdFx0XHRcdFx0Z3JhZGllbnQ6ICdub25lJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRib3JkZXI6IHtcblx0XHRcdFx0XHR3aWR0aDogMFxuXHRcdFx0XHR9XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXJpZXM6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICdEcm9wcGVkIG1lc3NhZ2VzJyxcblx0XHQgICAgICAgICAgICBmaWVsZDogJ3ZhbHVlJyxcblx0XHQgICAgICAgICAgICBjYXRlZ29yeUZpZWxkOiAnY2F0ZWdvcnknLFxuXHRcdFx0XHRcdGNvbG9yOiAnI0ZCN0QzMydcblx0XHQgICAgICAgIH1cblx0XHRcdF0sXG5cdCAgICAgICAgdmFsdWVBeGlzOiB7XG5cdCAgICAgICAgICAgIGxhYmVsczoge1xuXHQgICAgICAgICAgICAgICAgZm9ybWF0OiAnezB9J1xuXHQgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICBsaW5lOiB7XG5cdCAgICAgICAgICAgICAgICB2aXNpYmxlOiBmYWxzZVxuXHQgICAgICAgICAgICB9LFxuXHRcdFx0XHRtaW46IDAsXG5cdCAgICAgICAgfSxcblx0ICAgICAgICBjYXRlZ29yeUF4aXM6IHtcblx0ICAgICAgICAgICAgbWFqb3JHcmlkTGluZXM6IHtcblx0ICAgICAgICAgICAgICAgIHZpc2libGU6IGZhbHNlXG5cdCAgICAgICAgICAgIH0sXG5cdFx0XHRcdG1ham9yVGlja3M6IHtcblx0XHRcdFx0XHR2aXNpYmxlOiBmYWxzZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRsYWJlbHM6IHtcblx0XHRcdFx0XHR2aXNpYmxlOiBmYWxzZVxuXHRcdFx0XHR9XG5cdCAgICAgICAgfSxcblx0XHRcdHRvb2x0aXA6IHtcblx0XHRcdFx0dmlzaWJsZTogZmFsc2UsXG5cdCAgICAgICAgfVxuXHQgICAgfSkuZGF0YSgna2VuZG9DaGFydCcpO1xuXG5cdFx0dGhpcy5fd3JpdHRlbkRhdGFDaGFydCA9ICQoJyN6bm0td3JpdHRlbkRhdGFDaGFydCcpLmtlbmRvQ2hhcnQoe1xuXHRcdFx0dHJhbnNpdGlvbnM6IGZhbHNlLFxuXHRcdFx0Y2hhcnRBcmVhOiB7XG5cdFx0XHRcdGhlaWdodDogMTAwXG5cdFx0XHR9LFxuXHQgICAgICAgIGxlZ2VuZDoge1xuXHQgICAgICAgICAgICB2aXNpYmxlOiBmYWxzZVxuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2VyaWVzRGVmYXVsdHM6IHtcblx0ICAgICAgICAgICAgdHlwZTogJ2JhcicsXG5cdCAgICAgICAgICAgIGxhYmVsczoge1xuXHQgICAgICAgICAgICAgICAgdmlzaWJsZTogdHJ1ZSxcblx0ICAgICAgICAgICAgICAgIGZvcm1hdDogJ3swfScsXG5cdCAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAndHJhbnNwYXJlbnQnLFxuXHRcdFx0XHRcdHBvc2l0aW9uOiAnaW5zaWRlQmFzZScsXG5cdFx0XHRcdFx0dGVtcGxhdGU6IGdldFdSQnl0ZXNMYWJlbFRlbXBsYXRlKCksXG5cdCAgICAgICAgICAgIH0sXG5cdFx0XHRcdGdhcDogLjUsXG5cdFx0XHRcdHNwYWNpbmc6IDAsXG5cdFx0XHRcdG92ZXJsYXk6IHtcblx0XHRcdFx0XHRncmFkaWVudDogJ25vbmUnXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGJvcmRlcjoge1xuXHRcdFx0XHRcdHdpZHRoOiAwXG5cdFx0XHRcdH1cblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNlcmllczogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogJ1dyaXR0ZW4gZGF0YScsXG5cdFx0ICAgICAgICAgICAgZmllbGQ6ICd2YWx1ZScsXG5cdFx0ICAgICAgICAgICAgY2F0ZWdvcnlGaWVsZDogJ2NhdGVnb3J5Jyxcblx0XHRcdFx0XHRjb2xvcjogJyNGQjdEMzMnXG5cdFx0ICAgICAgICB9XG5cdFx0XHRdLFxuXHQgICAgICAgIHZhbHVlQXhpczoge1xuXHQgICAgICAgICAgICBsYWJlbHM6IHtcblx0ICAgICAgICAgICAgICAgIGZvcm1hdDogJ3swfSdcblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgbGluZToge1xuXHQgICAgICAgICAgICAgICAgdmlzaWJsZTogZmFsc2Vcblx0ICAgICAgICAgICAgfSxcblx0XHRcdFx0bWluOiAwLFxuXHQgICAgICAgIH0sXG5cdCAgICAgICAgY2F0ZWdvcnlBeGlzOiB7XG5cdCAgICAgICAgICAgIG1ham9yR3JpZExpbmVzOiB7XG5cdCAgICAgICAgICAgICAgICB2aXNpYmxlOiBmYWxzZVxuXHQgICAgICAgICAgICB9LFxuXHRcdFx0XHRtYWpvclRpY2tzOiB7XG5cdFx0XHRcdFx0dmlzaWJsZTogZmFsc2Vcblx0XHRcdFx0fSxcblx0XHRcdFx0bGFiZWxzOiB7XG5cdFx0XHRcdFx0dmlzaWJsZTogZmFsc2Vcblx0XHRcdFx0fVxuXHQgICAgICAgIH0sXG5cdFx0XHR0b29sdGlwOiB7XG5cdFx0XHRcdHZpc2libGU6IGZhbHNlLFxuXHQgICAgICAgIH1cblx0ICAgIH0pLmRhdGEoJ2tlbmRvQ2hhcnQnKTtcblxuXHRcdHRoaXMuX3JlYWREYXRhQ2hhcnQgPSAkKCcjem5tLXJlYWREYXRhQ2hhcnQnKS5rZW5kb0NoYXJ0KHtcblx0XHRcdHRyYW5zaXRpb25zOiBmYWxzZSxcblx0XHRcdGNoYXJ0QXJlYToge1xuXHRcdFx0XHRoZWlnaHQ6IDEwMFxuXHRcdFx0fSxcblx0ICAgICAgICBsZWdlbmQ6IHtcblx0ICAgICAgICAgICAgdmlzaWJsZTogZmFsc2Vcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNlcmllc0RlZmF1bHRzOiB7XG5cdCAgICAgICAgICAgIHR5cGU6ICdiYXInLFxuXHQgICAgICAgICAgICBsYWJlbHM6IHtcblx0ICAgICAgICAgICAgICAgIHZpc2libGU6IHRydWUsXG5cdCAgICAgICAgICAgICAgICBmb3JtYXQ6ICd7MH0nLFxuXHQgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogJ3RyYW5zcGFyZW50Jyxcblx0XHRcdFx0XHRwb3NpdGlvbjogJ2luc2lkZUJhc2UnLFxuXHRcdFx0XHRcdHRlbXBsYXRlOiBnZXRXUkJ5dGVzTGFiZWxUZW1wbGF0ZSgpLFxuXHQgICAgICAgICAgICB9LFxuXHRcdFx0XHRnYXA6IC41LFxuXHRcdFx0XHRzcGFjaW5nOiAwLFxuXHRcdFx0XHRvdmVybGF5OiB7XG5cdFx0XHRcdFx0Z3JhZGllbnQ6ICdub25lJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRib3JkZXI6IHtcblx0XHRcdFx0XHR3aWR0aDogMFxuXHRcdFx0XHR9XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXJpZXM6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICdSZWFkIGRhdGEnLFxuXHRcdCAgICAgICAgICAgIGZpZWxkOiAndmFsdWUnLFxuXHRcdCAgICAgICAgICAgIGNhdGVnb3J5RmllbGQ6ICdjYXRlZ29yeScsXG5cdFx0XHRcdFx0Y29sb3I6ICcjRkI3RDMzJ1xuXHRcdCAgICAgICAgfVxuXHRcdFx0XSxcblx0ICAgICAgICB2YWx1ZUF4aXM6IHtcblx0ICAgICAgICAgICAgbGFiZWxzOiB7XG5cdCAgICAgICAgICAgICAgICBmb3JtYXQ6ICd7MH0nXG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIGxpbmU6IHtcblx0ICAgICAgICAgICAgICAgIHZpc2libGU6IGZhbHNlXG5cdCAgICAgICAgICAgIH0sXG5cdFx0XHRcdG1pbjogMCxcblx0ICAgICAgICB9LFxuXHQgICAgICAgIGNhdGVnb3J5QXhpczoge1xuXHQgICAgICAgICAgICBtYWpvckdyaWRMaW5lczoge1xuXHQgICAgICAgICAgICAgICAgdmlzaWJsZTogZmFsc2Vcblx0ICAgICAgICAgICAgfSxcblx0XHRcdFx0bWFqb3JUaWNrczoge1xuXHRcdFx0XHRcdHZpc2libGU6IGZhbHNlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGxhYmVsczoge1xuXHRcdFx0XHRcdHZpc2libGU6IGZhbHNlXG5cdFx0XHRcdH1cblx0ICAgICAgICB9LFxuXHRcdFx0dG9vbHRpcDoge1xuXHRcdFx0XHR2aXNpYmxlOiBmYWxzZSxcblx0ICAgICAgICB9XG5cdCAgICB9KS5kYXRhKCdrZW5kb0NoYXJ0Jyk7XG5cblx0XHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRcdC8vIEFkZCBsaXN0ZW5lciB0byByZWRyYXcgYWxsIGNoYXJ0cyBpbiBjYXNlIG9mIHdpbmRvdyByZXNpemVcblx0XHQkKHdpbmRvdykub24oJ3Jlc2l6ZScsICQucHJveHkodGhpcy5fb25XaW5kb3dSZXNpemUsIHRoaXMpKTtcblx0XHR0aGlzLl9vbldpbmRvd1Jlc2l6ZSgpOyAvLyBBbHNvIGRvIGl0IGltbWVkaWF0ZWx5XG5cblx0XHQvLyBSZXF1ZXN0IGRhdGEgdG8gc2VydmVyXG5cdFx0dGhpcy5fcmVxdWVzdERhdGEodHJ1ZSk7XG5cdH1cblxuXHRkZXN0cm95KClcblx0e1xuXHRcdC8vIENhbGwgc3VwZXIgbWV0aG9kXG5cdFx0c3VwZXIuZGVzdHJveSgpO1xuXG5cdFx0Ly8gQ2xvc2UgbW9uaXRvcmluZ1xuXHRcdHRoaXMuX29uQ2xvc2VNb25pdG9yQnRDbGljaygpO1xuXG5cdFx0Ly8gUmVtb3ZlIGRvdWJsZWNsaWNrIGV2ZW50IGxpc3RlbmVyc1xuXHRcdHRoaXMuX3pvbmVMaXN0Qm94LndyYXBwZXIuZmluZCgnLmstbGlzdCcpLm9mZignZGJsY2xpY2snKTtcblx0XHR0aGlzLl9yb29tTGlzdEJveC53cmFwcGVyLmZpbmQoJy5rLWxpc3QnKS5vZmYoJ2RibGNsaWNrJyk7XG5cdFx0dGhpcy5fdXNlckxpc3RCb3gud3JhcHBlci5maW5kKCcuay1saXN0Jykub2ZmKCdkYmxjbGljaycpO1xuXG5cdFx0Ly8gUmVtb3ZlIG90aGVyIGV2ZW50IGxpc3RlbmVyc1xuXHRcdCQoJyN6bm0tY3JlYXRlUm9vbUJ0Jykub2ZmKCdjbGljaycpO1xuXHRcdCQoJyN6bm0tcmVtb3ZlUm9vbUJ0Jykub2ZmKCdjbGljaycpO1xuXHRcdCQoJyN6bm0tcm9vbUNyZWF0b3JDcmVhdGVCdCcpLm9mZignY2xpY2snKTtcblx0XHQkKCcjem5tLWZpbHRlclJvb21CdCcpLm9mZignY2xpY2snKTtcblx0XHQkKCcjem5tLWFwcGx5Um9vbUZpbHRlckNCJykub2ZmKCdjaGFuZ2UnKTtcblx0XHQkKCcjem5tLWZpbHRlclVzZXJCdCcpLm9mZignY2xpY2snKTtcblx0XHQkKCcjem5tLWFwcGx5VXNlckZpbHRlckNCJykub2ZmKCdjaGFuZ2UnKTtcblx0XHQkKCcjem5tLW1vbml0b3JCdCcpLm9mZignY2xpY2snKTtcblx0XHQkKCcjem5tLXNlbmRNZXNzYWdlQnQnKS5vZmYoJ2NsaWNrJyk7XG5cdFx0JCgnI3pubS1tZXNzYWdlSW4nKS5vZmYoJ2tleXVwJyk7XG5cdFx0JCgnI3pubS1jbG9zZU1vbml0b3JCdCcpLm9mZignY2xpY2snKTtcblx0XHQkKCcjem5tLWVkaXRCdCcpLm9mZignY2xpY2snKTtcblx0XHQkKCcjem5tLWNhbmNlbEJ0Jykub2ZmKCdjbGljaycpO1xuXHRcdCQoJyN6bm0tc3VibWl0QnQnKS5vZmYoJ2NsaWNrJyk7XG5cdFx0JCh3aW5kb3cpLm9mZigncmVzaXplJyk7XG5cdFx0JCgnI3pubS1yZWxvYWRXb3Jkc0J0Jykub2ZmKCdjbGljaycpO1xuXHRcdCQoJyN6bm0tcmVsb2FkWm9uZUV4dEJ0Jykub2ZmKCdjbGljaycpO1xuXHRcdCQoJyN6bm0tZGlzY29ubmVjdEJ0Jykub2ZmKCdjbGljaycpO1xuXHRcdCQoJyN6bm0ta2lja0J0Jykub2ZmKCdjbGljaycpO1xuXHRcdCQoJyN6bm0tYmFuQnQnKS5vZmYoJ2NsaWNrJyk7XG5cblx0XHQvLyBDbGVhciByZXF1ZXN0IHNjaGVkdWxpbmdcblx0XHRjbGVhclRpbWVvdXQodGhpcy5fcmVxdWVzdFRpbWVyKTtcblxuXHRcdC8vIEhpZGUgcm9vbSBjcmVhdGlvbiBwYW5lbFxuXHRcdCQoJyN6bm0tY3JlYXRlUm9vbU1vZGFsJykubW9kYWwoJ2hpZGUnKTtcblxuXHRcdC8vIFJlbW92ZSByb29tIGNyZWF0aW9uIHBhbmVsIGxpc3RlbmVyXG5cdFx0JCgnI3pubS1jcmVhdGVSb29tTW9kYWwnKS5vZmYoJ2hpZGRlbi5icy5tb2RhbCcpO1xuXG5cdFx0Ly8gUmVtb3ZlIGZpbHRlciBwYW5lbHMgbGlzdGVuZXJzXG5cdFx0JCh0aGlzLl9yb29tRmlsdGVyKS5vZmYodGhpcy5fcm9vbUZpbHRlci5FWFBSRVNTSU9OX1VQREFURURfRVZFTlQpO1xuXHRcdCQodGhpcy5fdXNlckZpbHRlcikub2ZmKHRoaXMuX3VzZXJGaWx0ZXIuRVhQUkVTU0lPTl9VUERBVEVEX0VWRU5UKTtcblx0fVxuXG5cdG9uRXh0ZW5zaW9uQ29tbWFuZChjb21tYW5kLCBkYXRhKVxuXHR7XG5cdFx0Ly8gRGF0YSByZWNlaXZlZFxuXHRcdGlmIChjb21tYW5kID09IHRoaXMuUkVTUF9EQVRBKVxuXHRcdHtcblx0XHRcdC8vIFdlIGhhdmUgdG8gY2hlY2sgaWYgdGhlIHJlc3BvbnNlIGlkIGNvcnJlc3BvbmRzIHRvIHRoZSBjdXJyZW50IHJlcXVlc3QgaWQ7XG5cdFx0XHQvLyBpZiBub3QsIHRoZSByZXNwb25zZSBpcyBkaXNjYXJkZWQgYXMgaXQgcmVmZXJzIHRvIGFuIG91dGRhdGV0IHJlcXVlc3Rcblx0XHRcdGNvbnN0IHJlc3BvbnNlSWQgPSBkYXRhLmdldEludCgnaWQnKTtcblxuXHRcdFx0aWYgKHJlc3BvbnNlSWQgPT0gdGhpcy5fY3VycmVudFJlcXVlc3RJZClcblx0XHRcdHtcblx0XHRcdFx0Ly8gLS0tIFpPTkVTIExJU1QgLS0tXG5cdFx0XHRcdGlmIChkYXRhLmNvbnRhaW5zS2V5KCd6b25lcycpKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGhpcy5fc2V0Wm9uZXNEYXRhUHJvdmlkZXIoZGF0YS5nZXRTRlNBcnJheSgnem9uZXMnKSk7XG5cblx0XHRcdFx0XHRpZiAodGhpcy5fc2VsZWN0ZWRab25lKVxuXHRcdFx0XHRcdFx0dGhpcy5fc2V0U2NvcGVMYWJlbCgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gLS0tIFJPT01TIExJU1QgLS0tXG5cdFx0XHRcdGlmIChkYXRhLmNvbnRhaW5zS2V5KCdyb29tcycpKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGhpcy5fc2V0R3JvdXBzRGF0YVByb3ZpZGVyKGRhdGEuZ2V0VXRmU3RyaW5nQXJyYXkoJ2dyb3VwcycpKTtcblxuXHRcdFx0XHRcdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRcdFx0XHRcdC8vIElmIGEgbnVsbCByb29tcyBsaXN0IGlzIHJldHVybmVkLCB0aGUgem9uZSBtdXN0IGhhdmUgYmVlbiBkZWxldGVkIVxuXHRcdFx0XHRcdGlmICghZGF0YS5pc051bGwoJ3Jvb21zJykpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0dGhpcy5fc2V0Um9vbXNEYXRhUHJvdmlkZXIoZGF0YS5nZXRTRlNBcnJheSgncm9vbXMnKSk7XG5cblx0XHRcdFx0XHRcdGlmICghdGhpcy5fc2VsZWN0ZWRSb29tKVxuXHRcdFx0XHRcdFx0XHR0aGlzLl9zZXRTY29wZUxhYmVsKCk7XG5cblx0XHRcdFx0XHRcdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRcdFx0XHRcdFx0Ly8gU2hvdyB3YXJuaW5nIGlmIHRoZSByb29tcyBsaXN0IGV4Y2VlZHMgdGhlIHNlcnZlci1zaWRlIGxpbWl0XG5cdFx0XHRcdFx0XHRpZiAoZGF0YS5jb250YWluc0tleSgnclNpemUnKSlcblx0XHRcdFx0XHRcdFx0dGhpcy5fc2hvd0xpbWl0RXhjZWVkZWRXYXJuaW5nKCQoJyN6bm0tcm9vbUxpc3RXYXJuaW5nJyksICdUaGUgcmVjZWl2ZWQgbGlzdCBpcyBpbmNvbXBsZXRlLCBiZWNhdXNlIGl0cyBzaXplICgnICsgZGF0YS5nZXRJbnQoJ3JTaXplJykgKyAnIFJvb21zKSBleGNlZWRlZCB0aGlzIGNsaWVudFxcJ3MgbGltaXQgb2YgJyArIGRhdGEuZ2V0SW50KCdyTGltaXQnKSArICc7IHlvdSBzaG91bGQgcmVmaW5lIHlvdXIgc2VhcmNoJyk7XG5cdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdHRoaXMuX3Nob3dMaW1pdEV4Y2VlZGVkV2FybmluZygkKCcjem5tLXJvb21MaXN0V2FybmluZycpLCAnJyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRpZiAodGhpcy5fYWN0aXZlUGFuZWxUeXBlID09ICdyb29tJylcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dGhpcy5fYWNjb3JkaW9uLnNlbGVjdCgnW2RhdGEtaXRlbS10eXBlPVwiem9uZVwiXScpO1xuXHRcdFx0XHRcdFx0XHR0aGlzLl9hY2NvcmRpb24uZXhwYW5kKCdbZGF0YS1pdGVtLXR5cGU9XCJ6b25lXCJdJyk7XG5cdFx0XHRcdFx0XHRcdHRoaXMuX29uWm9uZVNlbGVjdGVkKCk7XG5cdFx0XHRcdFx0XHRcdHRoaXMuX29uRW50aXRpZXNQYW5lbENoYW5nZSgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIC0tLSBVU0VSUyBMSVNUIC0tLVxuXHRcdFx0XHRpZiAoZGF0YS5jb250YWluc0tleSgndXNlcnMnKSlcblx0XHRcdFx0e1xuXHRcdFx0XHRcdC8vIElmIGEgbnVsbCB1c2VycyBsaXN0IGlzIHJldHVybmVkLCB0aGUgcm9vbSBtdXN0IGhhdmUgYmVlbiBkZWxldGVkIVxuXHRcdFx0XHRcdGlmICghZGF0YS5pc051bGwoJ3VzZXJzJykpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0dGhpcy5fc2V0VXNlcnNEYXRhUHJvdmlkZXIoZGF0YS5nZXRTRlNBcnJheSgndXNlcnMnKSk7XG5cblx0XHRcdFx0XHRcdC8vIFNob3cgd2FybmluZyBpZiB0aGUgdXNlcnMgbGlzdCBleGNlZWRzIHRoZSBzZXJ2ZXItc2lkZSBsaW1pdFxuXHRcdFx0XHRcdFx0aWYgKGRhdGEuY29udGFpbnNLZXkoJ3VTaXplJykpXG5cdFx0XHRcdFx0XHRcdHRoaXMuX3Nob3dMaW1pdEV4Y2VlZGVkV2FybmluZygkKCcjem5tLXVzZXJMaXN0V2FybmluZycpLCAnVGhlIHJlY2VpdmVkIGxpc3QgaXMgaW5jb21wbGV0ZSwgYmVjYXVzZSBpdHMgc2l6ZSAoJyArIGRhdGEuZ2V0SW50KCd1U2l6ZScpICsgJyB1c2VycykgZXhjZWVkcyB0aGlzIGNsaWVudFxcJ3MgbGltaXQgb2YgJyArIGRhdGEuZ2V0SW50KCd1TGltaXQnKSArICc7IHlvdSBzaG91bGQgcmVmaW5lIHlvdXIgc2VhcmNoJyk7XG5cdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdHRoaXMuX3Nob3dMaW1pdEV4Y2VlZGVkV2FybmluZygkKCcjem5tLXVzZXJMaXN0V2FybmluZycpLCAnJyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRpZiAodGhpcy5fYWN0aXZlUGFuZWxUeXBlID09ICd1c2VyJylcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dGhpcy5fYWNjb3JkaW9uLnNlbGVjdCgnW2RhdGEtaXRlbS10eXBlPVwicm9vbVwiXScpO1xuXHRcdFx0XHRcdFx0XHR0aGlzLl9hY2NvcmRpb24uZXhwYW5kKCdbZGF0YS1pdGVtLXR5cGU9XCJyb29tXCJdJyk7XG5cdFx0XHRcdFx0XHRcdHRoaXMuX29uUm9vbVNlbGVjdGVkKCk7XG5cdFx0XHRcdFx0XHRcdHRoaXMuX29uRW50aXRpZXNQYW5lbENoYW5nZSgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIC0tLSBNT05JVE9SRUQgREFUQSAtLS1cblx0XHRcdFx0aWYgKGRhdGEuY29udGFpbnNLZXkoJ21vbml0b3JlZCcpKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Y29uc3Qgem9uZSA9IGRhdGEuZ2V0U0ZTT2JqZWN0KCdtb25pdG9yZWQnKS5nZXRVdGZTdHJpbmcoJ3pvbmUnKTtcblx0XHRcdFx0XHRjb25zdCB0eXBlID0gZGF0YS5nZXRTRlNPYmplY3QoJ21vbml0b3JlZCcpLmdldFV0ZlN0cmluZygndHlwZScpO1xuXHRcdFx0XHRcdGNvbnN0IG5hbWUgPSBkYXRhLmdldFNGU09iamVjdCgnbW9uaXRvcmVkJykuZ2V0VXRmU3RyaW5nKCduYW1lJyk7XG5cblx0XHRcdFx0XHRpZiAoem9uZSA9PSB0aGlzLl9tb25pdG9yZWRab25lICYmIHR5cGUgPT0gdGhpcy5fbW9uaXRvcmVkVHlwZSAmJiBuYW1lID09IHRoaXMuX21vbml0b3JlZE5hbWUpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0aWYgKCFkYXRhLmdldFNGU09iamVjdCgnbW9uaXRvcmVkJykuaXNOdWxsKCdwYXJhbXMnKSlcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgcGFyYW1zID0gZGF0YS5nZXRTRlNPYmplY3QoJ21vbml0b3JlZCcpLmdldFNGU0FycmF5KCdwYXJhbXMnKTtcblxuXHRcdFx0XHRcdFx0XHR0aGlzLl9zZXRNb25pdG9yaW5nSW50ZXJmYWNlKCk7XG5cblx0XHRcdFx0XHRcdFx0Ly8gQnVpbGQgaW50ZXJmYWNlXG5cdFx0XHRcdFx0XHRcdGlmICghdGhpcy5faXNFZGl0aW5nKVxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5faW50ZXJmYWNlQnVpbGRlci5idWlsZEludGVyZmFjZShwYXJhbXMsIGB6bm0tJHt0aGlzLl9tb25pdG9yZWRUeXBlfVRhYk5hdmlnYXRvcmAsIHRydWUpO1xuXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCF0aGlzLl9za2lwSW5pdFRhYnMpXG5cdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0JChgI3pubS0ke3RoaXMuX21vbml0b3JlZFR5cGV9VGFiTmF2aWdhdG9yICN0YWJzYCkuc2Nyb2xsaW5nVGFicyh7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGJvb3RzdHJhcFZlcnNpb246IDQsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHNjcm9sbFRvVGFiRWRnZTogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZW5hYmxlU3dpcGluZzogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZGlzYWJsZVNjcm9sbEFycm93c09uRnVsbHlTY3JvbGxlZDogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y3NzQ2xhc3NMZWZ0QXJyb3c6ICdmYSBmYS1jaGV2cm9uLWxlZnQnLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRjc3NDbGFzc1JpZ2h0QXJyb3c6ICdmYSBmYS1jaGV2cm9uLXJpZ2h0J1xuXHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuX3NraXBJbml0VGFicyA9IHRydWU7XG5cblx0XHRcdFx0XHRcdFx0XHRcdC8vIFNldCBmaXJzdCB0YWIgcGFuZWwgYXMgYWN0aXZlXG5cdFx0XHRcdFx0XHRcdFx0XHR0aGlzLl9pbnRlcmZhY2VCdWlsZGVyLmFjdGl2YXRlRmlyc3RUYWJQYW5lbCgpO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBSZWRyYXcgdGltZSByYW5nZSBzbGlkZXIgdG8gc2V0IGl0cyB3aWR0aFxuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5fdGltZVNsaWRlci5yZXNpemUoKTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gQWRkIGxpc3RlbmVyIHRvIHJlZHJhdyBhbGwgY2hhcnRzIG9uIHRhYiBjaGFuZ2Vcblx0XHRcdFx0XHRcdFx0XHRcdC8vICh0byB3b3JrIGFyb3VuZCBhbiBpc3N1ZSB3aXRoIHRoZSBjaGFydCByZXNpemluZyB0byBkZWZhdWx0IHdpZHRoIHdoZW4gcGFuZSBpcyBoaWRkZW4pXG5cdFx0XHRcdFx0XHRcdFx0XHQkKCdhW2RhdGEtdG9nZ2xlPVwidGFiXCJdJykub24oJ3Nob3duLmJzLnRhYicsICQucHJveHkodGhpcy5fb25XaW5kb3dSZXNpemUsIHRoaXMpKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHQvLyBEaXNhYmxlIGNhdGVnb3JpZXNcblx0XHRcdFx0XHRcdFx0bGV0IGRpc2FibGVkQ2F0ID0gKGRhdGEuZ2V0U0ZTT2JqZWN0KCdtb25pdG9yZWQnKS5jb250YWluc0tleSgnZXhjbHVkZScpID8gZGF0YS5nZXRTRlNPYmplY3QoJ21vbml0b3JlZCcpLmdldFV0ZlN0cmluZ0FycmF5KCdleGNsdWRlJykgOiBbXSk7XG5cblx0XHRcdFx0XHRcdFx0Zm9yIChsZXQgY2F0IG9mIGRpc2FibGVkQ2F0KVxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0bGV0IG5hdkxpbmsgPSAkKGAjem5tLSR7dGhpcy5fbW9uaXRvcmVkVHlwZX1UYWJOYXZpZ2F0b3IgI3RhYnMgI3RhYi0ke2NhdH1gKTtcblxuXHRcdFx0XHRcdFx0XHRcdG5hdkxpbmsuYWRkQ2xhc3MoJ2Rpc2FibGVkJyk7XG5cdFx0XHRcdFx0XHRcdFx0bmF2TGluay5hdHRyKCd0YWJpbmRleCcsIC0xKTtcblx0XHRcdFx0XHRcdFx0XHRuYXZMaW5rLmF0dHIoJ2FyaWEtZGlzYWJsZWQnLCB0cnVlKTtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGlmICh0aGlzLl9tb25pdG9yZWRUeXBlID09IHRoaXMuTU9OSVRPUkVEX1RZUEVfWk9ORSlcblx0XHRcdFx0XHRcdFx0XHR0aGlzLl9zaG93Wm9uZVRyYWZmaWNEYXRhKGRhdGEuZ2V0U0ZTT2JqZWN0KCdtb25pdG9yZWQnKS5nZXRTRlNPYmplY3QoJ3RyYWZmaWMnKSk7XG5cblx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuX21vbml0b3JlZFR5cGUgPT0gdGhpcy5NT05JVE9SRURfVFlQRV9VU0VSKVxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gU3RhdHNcblx0XHRcdFx0XHRcdFx0XHR0aGlzLl9zaG93VXNlclN0YXRzRGF0YShkYXRhLmdldFNGU09iamVjdCgnbW9uaXRvcmVkJykuZ2V0U0ZTT2JqZWN0KCdzdGF0cycpKTtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIE5QQ1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGlzTnBjID0gZGF0YS5nZXRTRlNPYmplY3QoJ21vbml0b3JlZCcpLmdldEJvb2woJ25wYycpO1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gRGlzYWJsZSBkaXNjb25uZWN0LCBraWNrIGFuZCBiYW4gYnV0dG9uc1xuXHRcdFx0XHRcdFx0XHRcdCQoJyN6bm0tZGlzY29ubmVjdEJ0JykuYXR0cignZGlzYWJsZWQnLCBpc05wYyk7XG5cdFx0XHRcdFx0XHRcdFx0JCgnI3pubS1raWNrQnQnKS5hdHRyKCdkaXNhYmxlZCcsIGlzTnBjKTtcblx0XHRcdFx0XHRcdFx0XHQkKCcjem5tLWJhbkJ0JykuYXR0cignZGlzYWJsZWQnLCBpc05wYyk7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBHZW8tbG9jYXRpb25cblx0XHRcdFx0XHRcdFx0XHRjb25zdCBnZW9Mb2NEYXRhID0gZGF0YS5nZXRTRlNPYmplY3QoJ21vbml0b3JlZCcpLmdldFNGU09iamVjdCgnZ2VvTG9jJyk7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5fc2V0R2VvTG9jYXRpb25VSShnZW9Mb2NEYXRhKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHQvLyBTaG93IGFsZXJ0XG5cdFx0XHRcdFx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dTaW1wbGVBbGVydChgVGhlICR7Y2FwaXRhbGl6ZUZpcnN0KHRoaXMuX21vbml0b3JlZFR5cGUpfSBiZWluZyBtb25pdG9yZWQgaXMgbm8gbW9yZSBhdmFpbGFibGUgb24gdGhlIHNlcnZlciwgcGxlYXNlIHNlbGVjdCBhbm90aGVyIG9uZS5gLCBmYWxzZSk7XG5cblx0XHRcdFx0XHRcdFx0Ly8gQ2FuY2VsIG1vbml0b3Jpbmdcblx0XHRcdFx0XHRcdFx0dGhpcy5fb25DbG9zZU1vbml0b3JCdENsaWNrKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0ZWxzZSBpZiAoY29tbWFuZCA9PSB0aGlzLlJFU1BfVVBEQVRFX0VSUk9SKVxuXHRcdHtcblx0XHRcdGlmIChkYXRhLmdldFV0ZlN0cmluZygnem9uZScpID09IHRoaXMuX21vbml0b3JlZFpvbmVcblx0XHRcdFx0JiYgZGF0YS5nZXRVdGZTdHJpbmcoJ3R5cGUnKSA9PSAgdGhpcy5fbW9uaXRvcmVkVHlwZVxuXHRcdFx0XHQmJiBkYXRhLmdldFV0ZlN0cmluZygnbmFtZScpID09ICB0aGlzLl9tb25pdG9yZWROYW1lKVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBTaG93IGFsZXJ0XG5cdFx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dTaW1wbGVBbGVydChgVW5hYmxlIHRvIHVwZGF0ZSAke2NhcGl0YWxpemVGaXJzdCh0aGlzLl9tb25pdG9yZWRUeXBlKX0gc2V0dGluZ3M7IHRoZSBmb2xsb3dpbmcgZXJyb3Igd2FzIHJlcG9ydGVkOiAke2RhdGEuZ2V0VXRmU3RyaW5nKCdtZXNzYWdlJyl9LmApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGVsc2UgaWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX1JPT01fQ09ORklHKVxuXHRcdHtcblx0XHRcdC8vIFJlLWVuYWJsZSBDcmVhdGUgYnV0dG9uXG5cdFx0XHQkKCcjem5tLWNyZWF0ZVJvb21CdCcpLmF0dHIoJ2Rpc2FibGVkJywgZmFsc2UpO1xuXG5cdFx0XHQvLyBTaG93IFJvb20gY3JlYXRpb24gcGFuZWxcblx0XHRcdHRoaXMuX3Nob3dSb29tQ3JlYXRpb25QYW5lbChkYXRhLmdldFNGU0FycmF5KCdzZXR0aW5ncycpKTtcblx0XHR9XG5cblx0XHRlbHNlIGlmIChjb21tYW5kID09IHRoaXMuUkVTUF9ST09NX0NPTkZJR19FUlJPUilcblx0XHR7XG5cdFx0XHQvLyBSZS1lbmFibGUgQ3JlYXRlIGJ1dHRvblxuXHRcdFx0JCgnI3pubS1jcmVhdGVSb29tQnQnKS5hdHRyKCdkaXNhYmxlZCcsIGZhbHNlKTtcblxuXHRcdFx0Ly8gU2hvdyBhbiBhbGVydFxuXHRcdFx0dGhpcy5zaGVsbEN0cmwuc2hvd1NpbXBsZUFsZXJ0KGRhdGEuZ2V0VXRmU3RyaW5nKCdlcnJvcicpKTtcblx0XHR9XG5cblx0XHRlbHNlIGlmIChjb21tYW5kID09IHRoaXMuUkVTUF9ST09NX0NSRUFURUQpXG5cdFx0e1xuXHRcdFx0Ly8gUmUtZW5hYmxlIHJvb20gY3JlYXRpb24gcGFuZWxcblx0XHRcdHRoaXMuX2VuYWJsZUNyZWF0ZVJvb21QYW5lbCh0cnVlKTtcblxuXHRcdFx0Ly8gSGlkZSByb29tIGNyZWF0aW9uIHBhbmVsXG5cdFx0XHQkKCcjem5tLWNyZWF0ZVJvb21Nb2RhbCcpLm1vZGFsKCdoaWRlJyk7XG5cblx0XHRcdC8vIFVwZGF0ZSByb29tcyBsaXN0XG5cdFx0XHR0aGlzLl9yZXF1ZXN0RGF0YSh0cnVlKTtcblx0XHR9XG5cblx0XHRlbHNlIGlmIChjb21tYW5kID09IHRoaXMuUkVTUF9ST09NX0NSRUFUSU9OX0VSUk9SKVxuXHRcdHtcblx0XHRcdC8vIERpc3BsYXkgZXJyb3IgbWVzc2FnZVxuXHRcdFx0JCgnI3pubS1jcmVhdGVSb29tRXJyb3InKS50ZXh0KGRhdGEuZ2V0VXRmU3RyaW5nKCdlcnJvcicpKTtcblx0XHRcdCQoJyN6bm0tY3JlYXRlUm9vbUVycm9yJykuc2hvdygpO1xuXG5cdFx0XHQvLyBSZS1lbmFibGUgcm9vbSBjcmVhdGlvbiBwYW5lbFxuXHRcdFx0dGhpcy5fZW5hYmxlQ3JlYXRlUm9vbVBhbmVsKHRydWUpO1xuXHRcdH1cblxuXHRcdC8vIFVuZXhwZWN0ZWQgZXJyb3IgcmVjZWl2ZWRcblx0XHQvLyBUaGlzIGVycm9yIGlzIHJldHVybmVkIGluIGNhc2Ugc29tZXRoaW5nIHdlbnQgd3Jvbmcgd2hlbiByZXRyaWV2aW5nIHRoZSBtb25pdG9yZWQgZW50aXR5IHBhcmFtZXRlcnMsXG5cdFx0Ly8gc28gd2UgaGF2ZSB0byBzdG9wIHJlcXVlc3RpbmcgdGhlIHNhbWUgZW50aXR5XG5cdFx0ZWxzZSBpZiAoY29tbWFuZCA9PSB0aGlzLlJFU1BfVU5FWFBFQ1RFRF9FUlJPUilcblx0XHR7XG5cdFx0XHQvLyBDYW5jZWwgbW9uaXRvcmluZ1xuXHRcdFx0dGhpcy5fb25DbG9zZU1vbml0b3JCdENsaWNrKCk7XG5cblx0XHRcdC8vIFNob3cgYW4gYWxlcnRcblx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dTaW1wbGVBbGVydChkYXRhLmdldFV0ZlN0cmluZygnZXJyb3InKSk7XG5cdFx0fVxuXG5cdFx0Ly8gRXh0ZW5zaW9uIChab25lIG9yIFJvb20pIGxvZyBtZXNzYWdlcyByZWNlaXZlZFxuXHRcdGVsc2UgaWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX0xPR19NRVNTQUdFUylcblx0XHR7XG5cdFx0XHRsZXQgbG9nRW50cmllcyA9IGRhdGEuZ2V0U0ZTQXJyYXkoJ2VudHJpZXMnKTtcblxuXHRcdFx0Zm9yIChsZXQgZSA9IDA7IGUgPCBsb2dFbnRyaWVzLnNpemUoKTsgZSsrKVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgbG9nRW50cnkgPSBsb2dFbnRyaWVzLmdldFNGU09iamVjdChlKTtcblxuXHRcdFx0XHRjb25zdCBsb2dab25lID0gbG9nRW50cnkuZ2V0VXRmU3RyaW5nKCd6b25lJyk7XG5cdFx0XHRcdGNvbnN0IGxvZ1Jvb20gPSBsb2dFbnRyeS5nZXRVdGZTdHJpbmcoJ3Jvb20nKTtcblxuXHRcdFx0XHQvLyBDaGVjayBpZiB0aGUgem9uZSBpcyBjdXJyZW50bHkgbW9uaXRvcmVkXG5cdFx0XHRcdGlmICh0aGlzLl9tb25pdG9yZWRab25lID09IGxvZ1pvbmUpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHQvLyBjb25zb2xlLmxvZyhsb2dFbnRyeS5nZXRMb25nKCd0aW1lJykpXG5cdFx0XHRcdFx0Ly8gY29uc29sZS5sb2cobmV3IERhdGUobG9nRW50cnkuZ2V0TG9uZygndGltZScpKVxuXG5cdFx0XHRcdFx0bGV0IGVsZSA9IHtcblx0XHRcdFx0XHRcdHRpbWVzdGFtcDoga2VuZG8udG9TdHJpbmcobmV3IERhdGUobG9nRW50cnkuZ2V0TG9uZygndGltZScpKSwgJ2RkL01NL3l5eXkgSEg6bW06c3MnKSxcblx0XHRcdFx0XHRcdGxldmVsOiBsb2dFbnRyeS5nZXRVdGZTdHJpbmcoJ2xldmVsJyksXG5cdFx0XHRcdFx0XHRtZXNzYWdlOiBsb2dFbnRyeS5nZXRVdGZTdHJpbmcoJ21zZycpLFxuXHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRpZiAodGhpcy5fbW9uaXRvcmVkVHlwZSA9PSB0aGlzLk1PTklUT1JFRF9UWVBFX1pPTkUgJiYgbG9nUm9vbSA9PSAnJylcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHQvLyBBZGQgdG8gem9uZSBleHRlbnNpb24gbG9nXG5cdFx0XHRcdFx0XHR0aGlzLl9hZGRMb2dFbnRyeVRvR3JpZCh0aGlzLl96b25lRXh0TG9nR3JpZCwgZWxlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGlmICh0aGlzLl9tb25pdG9yZWRUeXBlID09IHRoaXMuTU9OSVRPUkVEX1RZUEVfUk9PTSAmJiB0aGlzLl9tb25pdG9yZWROYW1lID09IGxvZ1Jvb20pXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdC8vIEFkZCB0byByb29tIGV4dGVuc2lvbiBsb2dcblx0XHRcdFx0XHRcdFx0dGhpcy5fYWRkTG9nRW50cnlUb0dyaWQodGhpcy5fcm9vbUV4dExvZ0dyaWQsIGVsZSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0Ly8gVUkgRVZFTlQgTElTVEVORVJTXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0X29uVXBkYXRlSW50ZXJ2YWxDaGFuZ2UoKVxuXHR7XG5cdFx0Ly8gUmVxdWVzdCBkYXRhIHRvIHNlcnZlclxuXHRcdHRoaXMuX3JlcXVlc3REYXRhKGZhbHNlKTtcblx0fVxuXG5cdF9vbkVudGl0aWVzUGFuZWxDaGFuZ2UoKVxuXHR7XG5cdFx0Ly8gU2V0IG1haW4gY29udHJvbHMgc3RhdGVcblx0XHR0aGlzLl9zZXRNYWluQ29udHJvbHNFbmFibGVkKCk7XG5cblx0XHQvLyBSZXF1ZXN0IGRhdGEgdG8gc2VydmVyXG5cdFx0dGhpcy5fcmVxdWVzdERhdGEodHJ1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogVXBkYXRlIHRoZSBTY29wZSBsYWJlbCBpbiB0aGUgUm9vbXMgcGFuZWwuXG5cdCAqL1xuXHRfb25ab25lU2VsZWN0ZWQoKVxuXHR7XG5cdFx0Ly8gQ2xlYXIgUm9vbSBhbmQgVXNlciBsaXN0c1xuXHRcdHRoaXMuX3Jlc2V0Um9vbUxpc3QoKTtcblx0XHR0aGlzLl9yZXNldFVzZXJMaXN0KCk7XG5cblx0XHQvLyBTZXQgc2NvcGUgbGFiZWxcblx0XHR0aGlzLl9zZXRTY29wZUxhYmVsKCk7XG5cblx0XHQvLyBFbmFibGUvZGlzYWJsZSBSb29tIGFuZCBVc2VyIHRvb2xzXG5cdFx0Y29uc3QgZGlzYWJsZWQgPSB0aGlzLl9zZWxlY3RlZFpvbmUgPT0gdW5kZWZpbmVkO1xuXG5cdFx0Ly8gKE5PVEU6IHRoaXMgZW5hYmxlcy9kaXNhYmxlcyB3aG9sZSBmaWVsZHNldDsgdGhpcyBkb2Vzbid0IGFmZmVjdCBLZW5kbyBEcm9wRG93biwgc28gd2UgaGF2ZSB0byBkbyBpdCBtYW51YWxseSlcblx0XHQkKCcjcm9vbVRvb2xzJykuYXR0cignZGlzYWJsZWQnLCBkaXNhYmxlZCk7XG5cdFx0JCgnI3VzZXJUb29scycpLmF0dHIoJ2Rpc2FibGVkJywgZGlzYWJsZWQpO1xuXG5cdFx0dGhpcy5fZ3JvdXBzRHJvcERvd24uZW5hYmxlKCFkaXNhYmxlZCk7XG5cblx0XHQvLyBTZXQgbWFpbiBjb250cm9scyBzdGF0ZVxuXHRcdHRoaXMuX3NldE1haW5Db250cm9sc0VuYWJsZWQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBVcGRhdGUgdGhlIFNjb3BlIGxhYmVsIGluIHRoZSBVc2VycyBwYW5lbC5cblx0ICovXG5cdF9vblJvb21TZWxlY3RlZCgpXG5cdHtcblx0XHQvLyBDbGVhciBVc2VyIGxpc3Rcblx0XHR0aGlzLl9yZXNldFVzZXJMaXN0KCk7XG5cblx0XHQvLyBTZXQgc2NvcGUgbGFiZWxcblx0XHR0aGlzLl9zZXRTY29wZUxhYmVsKCk7XG5cblx0XHQvLyBFbmFibGUgUmVtb3ZlIGJ1dHRvblxuXHRcdCQoJyN6bm0tcmVtb3ZlUm9vbUJ0JykuYXR0cignZGlzYWJsZWQnLCB0aGlzLl9zZWxlY3RlZFJvb20gPT0gdW5kZWZpbmVkKTtcblxuXHRcdC8vIFNldCBtYWluIGNvbnRyb2xzIHN0YXRlXG5cdFx0dGhpcy5fc2V0TWFpbkNvbnRyb2xzRW5hYmxlZCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFVwZGF0ZSB0aGUgc2NvcGUgbGFiZWwgaW4gdGhlIFVzZXJzIHBhbmVsLlxuXHQgKi9cblx0X29uR3JvdXBDaGFuZ2UoKVxuXHR7XG5cdFx0Ly8gQ2xlYXIgUm9vbSBhbmQgVXNlciBsaXN0c1xuXHRcdHRoaXMuX3Jlc2V0Um9vbUxpc3QoKTtcblx0XHR0aGlzLl9yZXNldFVzZXJMaXN0KCk7XG5cblx0XHQvLyBTZXQgc2NvcGUgbGFiZWxcblx0XHR0aGlzLl9zZXRTY29wZUxhYmVsKCk7XG5cblx0XHQvLyBSZXF1ZXN0IGRhdGEgdG8gc2VydmVyXG5cdFx0dGhpcy5fcmVxdWVzdERhdGEodHJ1ZSk7XG5cblx0XHQvLyBTZXQgbWFpbiBjb250cm9scyBzdGF0ZVxuXHRcdHRoaXMuX3NldE1haW5Db250cm9sc0VuYWJsZWQoKTtcblx0fVxuXG5cdF9vblVzZXJTZWxlY3RlZCgpXG5cdHtcblx0XHQvLyBTZXQgbWFpbiBjb250cm9scyBzdGF0ZVxuXHRcdHRoaXMuX3NldE1haW5Db250cm9sc0VuYWJsZWQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTaG93IHJvb20gY3JlYXRpb24gcGFuZWwuXG5cdCAqL1xuXHRfb25DcmVhdGVSb29tQnRDbGljaygpXG5cdHtcblx0XHQvLyBEaXNhYmxlIENyZWF0ZSBidXR0b25cblx0XHQkKCcjem5tLWNyZWF0ZVJvb21CdCcpLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSk7XG5cblx0XHQvLyBSZXF1ZXN0IGRlZmF1bHQgcm9vbSBzZXR0aW5ncyB0byBleHRlbnNpb25cblx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX0dFVF9ST09NX0NPTkZJRyk7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlIGV4aXN0aW5nIHJvb20uXG5cdCAqL1xuXHRfb25SZW1vdmVSb29tQnRDbGljaygpXG5cdHtcblx0XHR0aGlzLnNoZWxsQ3RybC5zaG93Q29uZmlybVdhcm5pbmcoJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byByZW1vdmUgdGhlIHNlbGVjdGVkIFJvb20/JywgJC5wcm94eSh0aGlzLl9vblJlbW92ZVJlbW92ZUNvbmZpcm0sIHRoaXMpKTtcblx0fVxuXG5cdF9vblJlbW92ZVJlbW92ZUNvbmZpcm0oKVxuXHR7XG5cdFx0Y29uc3Qgc2VsZWN0ZWRab25lID0gdGhpcy5fem9uZUxpc3RCb3guZGF0YUl0ZW0odGhpcy5fem9uZUxpc3RCb3guc2VsZWN0KCkpO1xuXHRcdGxldCBzZWxlY3RlZFJvb20gPSB0aGlzLl9yb29tTGlzdEJveC5kYXRhSXRlbSh0aGlzLl9yb29tTGlzdEJveC5zZWxlY3QoKSk7XG5cblx0XHRpZiAoc2VsZWN0ZWRSb29tKVxuXHRcdHtcblx0XHRcdC8vIFNlbmQgcmVxdWVzdCB0byBzZXJ2ZXJcblx0XHRcdGxldCBwYXJhbXMgPSBuZXcgU0ZTMlguU0ZTT2JqZWN0KCk7XG5cdFx0XHRwYXJhbXMucHV0VXRmU3RyaW5nKCd6b25lJywgc2VsZWN0ZWRab25lLm5hbWUpO1xuXHRcdFx0cGFyYW1zLnB1dFV0ZlN0cmluZygncm9vbScsIHNlbGVjdGVkUm9vbS5uYW1lKTtcblxuXHRcdFx0dGhpcy5zZW5kRXh0ZW5zaW9uUmVxdWVzdCh0aGlzLlJFUV9SRU1PVkVfUk9PTSwgcGFyYW1zKTtcblxuXHRcdFx0Ly8gUmVxdWVzdCBkYXRhIHRvIHNlcnZlciB0byB1cGRhdGUgdGhlIHJvb21zIGxpc3Rcblx0XHRcdHRoaXMuX3JlcXVlc3REYXRhKHRydWUpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmUgY29udGVudCBvZiByb29tIGNyZWF0aW9uIHBhbmVsLlxuXHQgKi9cblx0X29uQ3JlYXRlUm9vbU1vZGFsSGlkZGVuKGUpXG5cdHtcblx0XHQvLyBJZiBhIG5lc3RlZCBtb2RhbCBpcyBvcGVuZWQsIGl0cyBjbG9zaW5nIGNhdXNlcyB0aGUgcGFyZW50IG1vZGFsIHRvIGJlIGNsb3NlZCB0b28gKEJvb3RzdHJhcCBkb2Vzbid0IHN1cHBvcnQgbmVzdGVkIG1vZGFscylcblx0XHQvLyBBcyBhIHdvcmthcm91bmQsIGhlcmUgd2UgcmVzZXQgdGhlIGNzcyBjbGFzcyAnbW9kYWwtb3Blbicgd2hlbiB0aGUgbmVzdGVkIG1vZGFsIGlzIGNsb3NlZCBhbmQgc2tpcCBldmVyeXRoaW5nIGVsc2Vcblx0XHQvLyBJbiBhZGRpdGlvbiB3ZSBoYWQgdG8gdXNlIGEgY3VzdG9tIGxpc3RlbmVyIG9uIHRoZSBjbG9zZS9jYW5jZWwgYnV0dG9ucyBvZiB0aGUgbmVzdGVkIG1vZGFsIChzZWUgY29uZmlnLWdyaWQuanMgZm9yIGV4YW1wbGUpXG5cdFx0aWYgKGUudGFyZ2V0ICE9PSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnem5tLWNyZWF0ZVJvb21Nb2RhbCcpKVxuXHRcdHtcblx0XHRcdCQoJ2JvZHknKS5hZGRDbGFzcygnbW9kYWwtb3BlbicpXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gRGVzdHJveSBzY3JvbGxpbmcgdGFicyBpbiByb29tIGNyZWF0aW9uIHBhbmVsXG5cdFx0JCgnI3pubS1yb29tQ3JlYXRvclRhYk5hdiAjdGFicycpLnNjcm9sbGluZ1RhYnMoJ2Rlc3Ryb3knKTtcblxuXHRcdC8vIFJlbW92ZSBhbGwgdGFiIG5hdmlnYXRvciBjb250ZW50XG5cdFx0dGhpcy5fcm9vbUNyZWF0aW9uSUJ1aWxkZXIuZGVzdHJveUludGVyZmFjZSgpO1xuXG5cdFx0Ly8gUmVtb3ZlIGxpc3RlbmVyIGZvciBjdXN0b20gYWN0aW9ucyB0cmlnZ2VyZWQgYnkgY29uZmlndXJhdGlvbiBpbnRlcmZhY2Vcblx0XHQkKCcjem5tLXJvb21DcmVhdG9yVGFiTmF2Jykub2ZmKCd2YWx1ZS1zZXQnKTtcblxuXHRcdC8vIFJlc2V0IGFuZCBoaWRlIGVycm9yIG1lc3NhZ2Vcblx0XHR0aGlzLl9yZXNldFJvb21DcmVhdGlvbkVycm9yKCk7XG5cdH1cblxuXHRfb25Db25maWdWYWx1ZVNldChlKSAvLyBTQU1FIE1FVEhPRCBEVVBMSUNBVEVEIElOIHpvbmUtY29uZmlndXJhdG9yLmpzXG5cdHtcblx0XHRjb25zdCBjb25maWdQYXJhbSA9IGUudGFyZ2V0LmRhdGE7XG5cblx0XHQvLyBIYW5kbGUgZXh0ZW5zaW9uIG5hbWUvdHlwZSBkcm9wZG93bnMgdXBkYXRlIGFuZCB1cGRhdGUgdGhlIG1haW4gY2xhc3MgZHJvcGRvd24gZGF0YXNvdXJjZSBhY2NvcmRpbmdseVxuXHRcdGlmIChjb25maWdQYXJhbS5uYW1lID09ICdleHRlbnNpb24ubmFtZScgfHwgY29uZmlnUGFyYW0ubmFtZSA9PSAnZXh0ZW5zaW9uLnR5cGUnIHx8IGNvbmZpZ1BhcmFtLm5hbWUgPT0gJ2V4dGVuc2lvbi5maWx0ZXJDbGFzcycpXG5cdFx0e1xuXHRcdFx0Ly8gQWxsIGludm9sdmVkIENvbmZpZ0Zvcm1JdGVtcyBtdXN0IGJlIGF2YWlsYWJsZSBhbmQgaW5pdGlhbGl6ZWQgdG8gcHJvY2VlZFxuXHRcdFx0Y29uc3QgbmFtZUZvcm1JdGVtID0gdGhpcy5fcm9vbUNyZWF0aW9uSUJ1aWxkZXIuZ2V0Q29uZmlnRm9ybUl0ZW0oJ2V4dGVuc2lvbi5uYW1lJyk7XG5cdFx0XHRjb25zdCB0eXBlRm9ybUl0ZW0gPSB0aGlzLl9yb29tQ3JlYXRpb25JQnVpbGRlci5nZXRDb25maWdGb3JtSXRlbSgnZXh0ZW5zaW9uLnR5cGUnKTtcblx0XHRcdGNvbnN0IGNsYXNzRm9ybUl0ZW0gPSB0aGlzLl9yb29tQ3JlYXRpb25JQnVpbGRlci5nZXRDb25maWdGb3JtSXRlbSgnZXh0ZW5zaW9uLmZpbGUnKTtcblx0XHRcdGNvbnN0IGZpbHRlckZvcm1JdGVtID0gdGhpcy5fcm9vbUNyZWF0aW9uSUJ1aWxkZXIuZ2V0Q29uZmlnRm9ybUl0ZW0oJ2V4dGVuc2lvbi5maWx0ZXJDbGFzcycpO1xuXG5cdFx0XHRpZiAobmFtZUZvcm1JdGVtICE9IG51bGwgJiYgdHlwZUZvcm1JdGVtICE9IG51bGwgJiYgY2xhc3NGb3JtSXRlbSAhPSBudWxsICYmIGZpbHRlckZvcm1JdGVtICE9IG51bGwpXG5cdFx0XHR7XG5cdFx0XHRcdGNvbnN0IHNvdXJjZSA9IG5hbWVGb3JtSXRlbS5kYXRhO1xuXHRcdFx0XHRsZXQgY2xhc3Nlc0xpc3QgPSBbXTtcblxuXHRcdFx0XHRsZXQgZGF0YSA9IHNvdXJjZS50cmlnZ2VyRGF0YTtcblx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLnNpemUoKTsgaSsrKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IGV4dCA9IGRhdGEuZ2V0U0ZTT2JqZWN0KGkpO1xuXG5cdFx0XHRcdFx0aWYgKGV4dC5nZXRVdGZTdHJpbmcoJ25hbWUnKSA9PSBuYW1lRm9ybUl0ZW0uZGF0YS52YWx1ZSAmJiBleHQuZ2V0VXRmU3RyaW5nKCd0eXBlJykgPT0gdHlwZUZvcm1JdGVtLmRhdGEudmFsdWUpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IGNsYXNzZXMgPSBleHQuZ2V0VXRmU3RyaW5nKCdjbGFzc2VzU3RyaW5nJykuc3BsaXQoJywnKTtcblxuXHRcdFx0XHRcdFx0aWYgKGZpbHRlckZvcm1JdGVtLmRhdGEudmFsdWUgPT0gdHJ1ZSlcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bGV0IGZpbHRlcmVkQ2xhc3NlcyA9IGNsYXNzZXMuZmlsdGVyKGZpbHRlckNsYXNzTmFtZSk7XG5cdFx0XHRcdFx0XHRcdGNsYXNzZXMgPSBmaWx0ZXJlZENsYXNzZXM7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGNsYXNzZXNMaXN0ID0gY2xhc3Nlc0xpc3QuY29uY2F0KGNsYXNzZXMpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGxldCBjdXJyZW50Q2xhc3MgPSBjbGFzc0Zvcm1JdGVtLmRhdGEudmFsdWU7XG5cblx0XHRcdFx0Ly8gSWYgdGhlIGNsYXNzZXMgbGlzdCBkb2Vzbid0IGNvbnRhaW4gdGhlIGN1cnJlbnQgdmFsdWUsIGNyZWF0ZSBhbiBlbXB0eSBlbnRyeSBhbmQgcmVzZXQgdGhlIHZhbHVlXG5cdFx0XHRcdGlmIChjbGFzc2VzTGlzdC5pbmRleE9mKGN1cnJlbnRDbGFzcykgPCAwKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0aWYgKGNsYXNzZXNMaXN0Lmxlbmd0aCA9PSAwKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGNsYXNzZXNMaXN0LnB1c2goJycpO1xuXHRcdFx0XHRcdFx0Y3VycmVudENsYXNzID0gJyc7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdGN1cnJlbnRDbGFzcyA9IGNsYXNzZXNMaXN0WzBdO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0bGV0IG1haW5DbGFzc0Ryb3BEb3duID0gY2xhc3NGb3JtSXRlbS5faW5uZXJXaWRnZXQ7XG5cdFx0XHRcdG1haW5DbGFzc0Ryb3BEb3duLnNldERhdGFTb3VyY2UoY2xhc3Nlc0xpc3QpO1xuXG5cdFx0XHRcdGNsYXNzRm9ybUl0ZW0uZGF0YS52YWx1ZSA9IGN1cnJlbnRDbGFzcztcblx0XHRcdFx0Y2xhc3NGb3JtSXRlbS5fc2V0V2lkZ2V0VmFsdWUoKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRfb25Sb29tQ3JlYXRvckNyZWF0ZUJ0Q2xpY2soKVxuXHR7XG5cdFx0Ly8gUmVzZXQgYW5kIGhpZGUgZXJyb3IgbWVzc2FnZVxuXHRcdHRoaXMuX3Jlc2V0Um9vbUNyZWF0aW9uRXJyb3IoKTtcblxuXHRcdC8vIENoZWNrIHZhbGlkaXR5XG5cdFx0aWYgKHRoaXMuX3Jvb21DcmVhdGlvbklCdWlsZGVyLmNoZWNrSXNWYWxpZCgpKVxuXHRcdHtcblx0XHRcdGxldCBjaGFuZ2VzID0gdGhpcy5fcm9vbUNyZWF0aW9uSUJ1aWxkZXIuZ2V0Q2hhbmdlZERhdGEoKTtcblxuXHRcdFx0aWYgKGNoYW5nZXMuc2l6ZSgpID4gMClcblx0XHRcdHtcblx0XHRcdFx0Ly8gQ2hlY2sgdGhlIHJvb20gbmFtZSBhZ2FpbnN0IHRoZSByb29tcyBsaXN0IChkdXBsaWNhdGUgbmFtZXMgbm90IGFsbG93ZWQhKVxuXHRcdFx0XHRpZiAodHJ1ZSkvL3RoaXMuX3ZhbGlkYXRlTmV3Um9vbU5hbWUoY2hhbmdlcykpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHQvLyBEaXNhYmxlIHJvb20gY3JlYXRpb24gcGFuZWxcblx0XHRcdFx0XHR0aGlzLl9lbmFibGVDcmVhdGVSb29tUGFuZWwoZmFsc2UpO1xuXG5cdFx0XHRcdFx0Ly8gU2VuZCBzZXR0aW5ncyB0byBzZXJ2ZXIgaW5zdGFuY2Vcblx0XHRcdFx0XHRsZXQgcGFyYW1zID0gbmV3IFNGUzJYLlNGU09iamVjdCgpO1xuXHRcdFx0XHRcdHBhcmFtcy5wdXRTRlNBcnJheSgnc2V0dGluZ3MnLCBjaGFuZ2VzKTtcblx0XHRcdFx0XHRwYXJhbXMucHV0VXRmU3RyaW5nKCd6TmFtZScsIHRoaXMuX3pvbmVMaXN0Qm94LmRhdGFJdGVtKHRoaXMuX3pvbmVMaXN0Qm94LnNlbGVjdCgpKS5uYW1lKTtcblx0XHRcdFx0XHRwYXJhbXMucHV0Qm9vbCgnbm90aWZ5JywgJCgnI3pubS1ub3RpZnlDbGllbnRzQ0InKS5wcm9wKCdjaGVja2VkJykpO1xuXG5cdFx0XHRcdFx0Ly8gU2VuZCBzZXR0aW5ncyB0byBleHRlbnNpb25cblx0XHRcdFx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX0NSRUFURV9ST09NLCBwYXJhbXMpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0e1xuXHRcdFx0XHRcdC8vIFNob3cgYWxlcnRcblx0XHRcdFx0XHR0aGlzLnNoZWxsQ3RybC5zaG93U2ltcGxlQWxlcnQoJ1VuYWJsZSB0byBzdWJtaXQgY29uZmlndXJhdGlvbiBiZWNhdXNlIHRoZSBSb29tIG5hbWUgYWxyZWFkeSBleGlzdHM7IGR1cGxpY2F0ZSBuYW1lcyBhcmUgbm90IGFsbG93ZWQuJywgdHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdC8vIFNob3cgYWxlcnRcblx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dTaW1wbGVBbGVydCgnVW5hYmxlIHRvIHN1Ym1pdCBSb29tIGNvbmZpZ3VyYXRpb24gZHVlIHRvIGFuIGludmFsaWQgdmFsdWU7IHBsZWFzZSB2ZXJpZnkgdGhlIGhpZ2hsaWdodGVkIGZvcm0gZmllbGRzIGluIGFsbCB0YWJzLicsIHRydWUpO1xuXHRcdH1cblx0fVxuXG5cdF9vblNob3dSb29tRmlsdGVyQnRDbGljaygpXG5cdHtcblx0XHR0aGlzLl9yb29tRmlsdGVyLnNob3coKTtcblx0fVxuXG5cdF9vblNob3dVc2VyRmlsdGVyQnRDbGljaygpXG5cdHtcblx0XHR0aGlzLl91c2VyRmlsdGVyLnNob3coKTtcblx0fVxuXG5cdF9vbkFwcGx5QnRDaGFuZ2UoKVxuXHR7XG5cdFx0Ly8gUmVxdWVzdCBkYXRhIHRvIHNlcnZlclxuXHRcdHRoaXMuX3JlcXVlc3REYXRhKHRydWUpO1xuXHR9XG5cblx0X29uUm9vbUZpbHRlclVwZGF0ZWQoKVxuXHR7XG5cdFx0Ly8gRW5hYmxlL2Rpc2FibGUgXCJBcHBseVwiIGNoZWNrYm94XG5cdFx0JCgnI3pubS1hcHBseVJvb21GaWx0ZXJDQicpLmF0dHIoJ2Rpc2FibGVkJywgdGhpcy5fcm9vbUZpbHRlci5maWx0ZXJFeHByZXNzaW9uID09IG51bGwpO1xuXG5cdFx0Ly8gUmVxdWVzdCBkYXRhIHRvIHNlcnZlclxuXHRcdHRoaXMuX3JlcXVlc3REYXRhKHRydWUpO1xuXHR9XG5cblx0X29uVXNlckZpbHRlclVwZGF0ZWQoKVxuXHR7XG5cdFx0Ly8gRW5hYmxlL2Rpc2FibGUgXCJBcHBseVwiIGNoZWNrYm94XG5cdFx0JCgnI3pubS1hcHBseVVzZXJGaWx0ZXJDQicpLmF0dHIoJ2Rpc2FibGVkJywgdGhpcy5fdXNlckZpbHRlci5maWx0ZXJFeHByZXNzaW9uID09IG51bGwpO1xuXG5cdFx0Ly8gUmVxdWVzdCBkYXRhIHRvIHNlcnZlclxuXHRcdHRoaXMuX3JlcXVlc3REYXRhKHRydWUpO1xuXHR9XG5cblx0X29uTW9uaXRvclNlbGVjdGlvbkJ0Q2xpY2soKVxuXHR7XG5cdFx0aWYgKHRoaXMuX3NlbGVjdGVkWm9uZSlcblx0XHR7XG5cdFx0XHQvLyBDYW5jZWwgcHJldmlvdXMgbW9uaXRvcmluZ1xuXHRcdFx0dGhpcy5fb25DbG9zZU1vbml0b3JCdENsaWNrKCk7XG5cblx0XHRcdGxldCBnZXRab25lVXNlckNvdW50SGlzdG9yeSA9IGZhbHNlO1xuXG5cdFx0XHR0aGlzLl9tb25pdG9yZWRab25lID0gdGhpcy5fc2VsZWN0ZWRab25lLm5hbWU7XG5cblx0XHRcdC8vIFpvbmUgbXVzdCBiZSBtb25pdG9yZWRcblx0XHRcdGlmICh0aGlzLl9hY3RpdmVQYW5lbFR5cGUgPT0gJ3pvbmUnKVxuXHRcdFx0e1xuXHRcdFx0XHR0aGlzLl9tb25pdG9yZWRUeXBlID0gdGhpcy5NT05JVE9SRURfVFlQRV9aT05FO1xuXHRcdFx0XHR0aGlzLl9tb25pdG9yZWROYW1lID0gdGhpcy5fbW9uaXRvcmVkWm9uZTtcblxuXHRcdFx0XHRnZXRab25lVXNlckNvdW50SGlzdG9yeSA9IHRydWU7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJvb20gbXVzdCBiZSBtb25pdG9yZWRcblx0XHRcdGlmICh0aGlzLl9hY3RpdmVQYW5lbFR5cGUgPT0gJ3Jvb20nICYmIHRoaXMuX3NlbGVjdGVkUm9vbSAhPSB1bmRlZmluZWQpXG5cdFx0XHR7XG5cdFx0XHRcdHRoaXMuX21vbml0b3JlZFR5cGUgPSB0aGlzLk1PTklUT1JFRF9UWVBFX1JPT007XG5cdFx0XHRcdHRoaXMuX21vbml0b3JlZE5hbWUgPSB0aGlzLl9zZWxlY3RlZFJvb20ubmFtZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVXNlciBtdXN0IGJlIG1vbml0b3JlZFxuXHRcdFx0aWYgKHRoaXMuX2FjdGl2ZVBhbmVsVHlwZSA9PSAndXNlcicgJiYgdGhpcy5fc2VsZWN0ZWRVc2VyICE9IHVuZGVmaW5lZClcblx0XHRcdHtcblx0XHRcdFx0dGhpcy5fbW9uaXRvcmVkVHlwZSA9IHRoaXMuTU9OSVRPUkVEX1RZUEVfVVNFUjtcblx0XHRcdFx0dGhpcy5fbW9uaXRvcmVkTmFtZSA9IHRoaXMuX3NlbGVjdGVkVXNlci5uYW1lO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTaG93IGxvYWRpbmcgYmFyXG5cdFx0XHR0aGlzLl9zd2l0Y2hWaWV3KCd6bm0tbG9hZGluZycpO1xuXG5cdFx0XHQvLyBSZXF1ZXN0IGRhdGEgdG8gc2VydmVyXG5cdFx0XHR0aGlzLl9yZXF1ZXN0RGF0YSh0cnVlLCBnZXRab25lVXNlckNvdW50SGlzdG9yeSk7XG5cdFx0fVxuXHR9XG5cblx0X29uU2VuZEFkbWluTXNnSW5LZXlVcChldmVudClcblx0e1xuXHRcdGlmIChldmVudC5rZXkgIT09ICdFbnRlcicpXG5cdFx0XHRyZXR1cm47XG5cblx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdHRoaXMuX29uU2VuZEFkbWluTXNnQnRDbGljaygpO1xuXHR9XG5cblx0X29uU2VuZEFkbWluTXNnQnRDbGljaygpXG5cdHtcblx0XHRpZiAodGhpcy5fc2VsZWN0ZWRab25lICYmICQoJyN6bm0tbWVzc2FnZUluJykudmFsKCkgIT0gJycpXG5cdFx0e1xuXHRcdFx0Ly8gQnVpbGQgcmVxdWVzdCBwYXJhbWV0ZXJzXG5cdFx0XHRsZXQgcGFyYW1zID0gbmV3IFNGUzJYLlNGU09iamVjdCgpO1xuXG5cdFx0XHQvLyBBbHdheXMgaW5jbHVkZSB6b25lXG5cdFx0XHRwYXJhbXMucHV0VXRmU3RyaW5nKCd6b25lJywgdGhpcy5fc2VsZWN0ZWRab25lLm5hbWUpO1xuXG5cdFx0XHQvLyBTZW5kIG1lc3NhZ2UgdG8gcm9vbT9cblx0XHRcdGlmICh0aGlzLl9hY3RpdmVQYW5lbFR5cGUgPT0gJ3Jvb20nICYmIHRoaXMuX3NlbGVjdGVkUm9vbSAhPSB1bmRlZmluZWQpXG5cdFx0XHRcdHBhcmFtcy5wdXRVdGZTdHJpbmcoJ3Jvb20nLCB0aGlzLl9zZWxlY3RlZFJvb20ubmFtZSk7XG5cblx0XHRcdC8vIFNlbmQgbWVzc2FnZSB0byB1c2VyP1xuXHRcdFx0aWYgKHRoaXMuX2FjdGl2ZVBhbmVsVHlwZSA9PSAndXNlcicgJiYgdGhpcy5fc2VsZWN0ZWRVc2VyICE9IHVuZGVmaW5lZClcblx0XHRcdFx0cGFyYW1zLnB1dFV0ZlN0cmluZygndXNlcicsIHRoaXMuX3NlbGVjdGVkVXNlci5uYW1lKTtcblxuXHRcdFx0Ly8gQWRkIG1lc3NhZ2Vcblx0XHRcdHBhcmFtcy5wdXRVdGZTdHJpbmcoJ21zZycsICQoJyN6bm0tbWVzc2FnZUluJykudmFsKCkpO1xuXG5cdFx0XHQvLyBTZW5kIHJlcXVlc3QgdG8gZXh0ZW5zaW9uXG5cdFx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX0FETUlOX01TRywgcGFyYW1zKTtcblxuXHRcdFx0Ly8gQ2xlYXIgdGV4dCBpbnB1dFxuXHRcdFx0JCgnI3pubS1tZXNzYWdlSW4nKS52YWwoJycpO1xuXHRcdH1cblx0fVxuXG5cdF9vbkNsb3NlTW9uaXRvckJ0Q2xpY2soKVxuXHR7XG5cdFx0Ly8gU2F2ZSByZWYuIGZvciBsYXRlciB1c2FnZVxuXHRcdGNvbnN0IG1vbml0b3JlZFR5cGUgPSB0aGlzLl9tb25pdG9yZWRUeXBlO1xuXG5cdFx0dGhpcy5fbW9uaXRvcmVkWm9uZSA9IG51bGw7XG5cdFx0dGhpcy5fbW9uaXRvcmVkVHlwZSA9IG51bGw7XG5cdFx0dGhpcy5fbW9uaXRvcmVkTmFtZSA9IG51bGw7XG5cblx0XHQvLyBDbGVhciBnZW9sb2NhdGlvbiBVSVxuXHRcdHRoaXMuX2NsZWFyR2VvTG9jYXRpb25VSSgpO1xuXG5cdFx0Ly8gQ2xlYXIgbG9nIGRhdGFncmlkcyBkYXRhcHJvdmlkZXJzXG5cdFx0Ly8gTk9URTogYSB0cnktY2F0Y2ggaXMgdXNlZCBoZXJlIGJlY2F1c2UsIGZvciBhbiB1bmtub3duIHJlYXNvbiwgS2VuZG8gaXMgdGhyb3dpbmcgYW4gZXJyb3Igd2hlbiByZXNldHRpbmcgdGhlIGRhdGEgc291cmNlcyB3aGVuIHRoZSBtb2R1bGUgaXMgZGVzdHJveWVkXG5cdFx0dHJ5XG5cdFx0e1xuXHRcdFx0dGhpcy5fem9uZUV4dExvZ0dyaWQuc2V0RGF0YVNvdXJjZShbXSk7XG5cdFx0XHR0aGlzLl9yb29tRXh0TG9nR3JpZC5zZXREYXRhU291cmNlKFtdKTtcblx0XHR9XG5cdFx0Y2F0Y2ggKGUpIHsgLyogSWdub3JlICovIH1cblxuXHRcdC8vIExlYXZlIGVkaXQgbW9kZVxuXHRcdHRoaXMuX29uQ2FuY2VsQnRDbGljaygpO1xuXG5cdFx0Ly8gUmVhcnJhbmdlIG1vbml0b3JpbmcgaW50ZXJmYWNlXG5cdFx0dGhpcy5fc2V0TW9uaXRvcmluZ0ludGVyZmFjZSgpO1xuXG5cdFx0Ly8gQ2xlYXIgdGFiIG5hdmlnYXRvclxuXHRcdHRoaXMuX2NsZWFyVGFicyhtb25pdG9yZWRUeXBlKTtcblx0fVxuXG5cdF9vbkVkaXRCdENsaWNrKClcblx0e1xuXHRcdGlmICghdGhpcy5faXNFZGl0aW5nKVxuXHRcdHtcblx0XHRcdC8vIFNob3cgZWRpdCBjb250cm9sc1xuXHRcdFx0JCgnI3pubS1lZGl0Q29udHJvbHMnKS5zaG93KCk7XG5cblx0XHRcdC8vIEhpZGUgZWRpdCBidXR0b25cblx0XHRcdCQoJyN6bm0tZWRpdEJ0JykuaGlkZSgpO1xuXG5cdFx0XHQvLyBFbmFibGUgZWRpdGFibGUgZmllbGRzXG5cdFx0XHR0aGlzLl9pbnRlcmZhY2VCdWlsZGVyLmRpc2FibGVJbnRlcmZhY2UoZmFsc2UpO1xuXG5cdFx0XHR0aGlzLl9pc0VkaXRNb2RlID0gdHJ1ZTtcblx0XHR9XG5cdH1cblxuXHRfb25DYW5jZWxCdENsaWNrKClcblx0e1xuXHRcdGlmICh0aGlzLl9pc0VkaXRpbmcpXG5cdFx0e1xuXHRcdFx0Ly8gSGlkZSBlZGl0IGNvbnRyb2xzXG5cdFx0XHQkKCcjem5tLWVkaXRDb250cm9scycpLmhpZGUoKTtcblxuXHRcdFx0Ly8gU2hvdyBlZGl0IGJ1dHRvblxuXHRcdFx0JCgnI3pubS1lZGl0QnQnKS5zaG93KCk7XG5cblx0XHRcdC8vIERpc2FibGUgZWRpdGFibGUgZmllbGRzXG5cdFx0XHR0aGlzLl9pbnRlcmZhY2VCdWlsZGVyLmRpc2FibGVJbnRlcmZhY2UodHJ1ZSk7XG5cblx0XHRcdHRoaXMuX2lzRWRpdE1vZGUgPSBmYWxzZTtcblxuXHRcdFx0Ly8gSGlkZSB2YWxpZGF0aW9uIG1lc3NhZ2VzXG5cdFx0XHR0aGlzLl9pbnRlcmZhY2VCdWlsZGVyLnJlc2V0VmFsaWRhdGlvbigpO1xuXG5cdFx0XHQvLyBSZXF1ZXN0IGRhdGEgdG8gdXBkYXRlIGludGVyZmFjZSAodXBkYXRpbmcgc3VzcGVuZGVkIGluIGVkaXQgbW9kZSlcblx0XHRcdHRoaXMuX3JlcXVlc3REYXRhKHRydWUpO1xuXHRcdH1cblx0fVxuXG5cdF9vblN1Ym1pdEJ0Q2xpY2soKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2lzRWRpdGluZylcblx0XHR7XG5cdFx0XHQvLyBDaGVjayB2YWxpZGl0eVxuXHRcdFx0aWYgKHRoaXMuX2ludGVyZmFjZUJ1aWxkZXIuY2hlY2tJc1ZhbGlkKCkpXG5cdFx0XHR7XG5cdFx0XHRcdGxldCBjaGFuZ2VzID0gdGhpcy5faW50ZXJmYWNlQnVpbGRlci5nZXRDaGFuZ2VkRGF0YSgpO1xuXG5cdFx0XHRcdGlmIChjaGFuZ2VzLnNpemUoKSA+IDApXG5cdFx0XHRcdHtcblx0XHRcdFx0XHQvL2NvbnNvbGUubG9nKGNoYW5nZXMuZ2V0RHVtcCgpKVxuXG5cdFx0XHRcdFx0Ly8gU2VuZCBzZXR0aW5ncyB0byBzZXJ2ZXIgaW5zdGFuY2Vcblx0XHRcdFx0XHRsZXQgcGFyYW1zID0gbmV3IFNGUzJYLlNGU09iamVjdCgpO1xuXHRcdFx0XHRcdHBhcmFtcy5wdXRTRlNBcnJheSgnc2V0dGluZ3MnLCBjaGFuZ2VzKTtcblx0XHRcdFx0XHRwYXJhbXMucHV0VXRmU3RyaW5nKCd6b25lJywgdGhpcy5fbW9uaXRvcmVkWm9uZSk7XG5cblx0XHRcdFx0XHRpZiAodGhpcy5fbW9uaXRvcmVkVHlwZSA9PSB0aGlzLk1PTklUT1JFRF9UWVBFX1JPT00pXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0Ly8gU3VibWl0IHJvb20gc2V0dGluZ3Ncblx0XHRcdFx0XHRcdHBhcmFtcy5wdXRVdGZTdHJpbmcoJ3Jvb20nLCB0aGlzLl9tb25pdG9yZWROYW1lKTtcblx0XHRcdFx0XHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfU0VUX1JPT01fU0VUVElOR1MsIHBhcmFtcyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGVsc2UgaWYgKHRoaXMuX21vbml0b3JlZFR5cGUgPT0gdGhpcy5NT05JVE9SRURfVFlQRV9VU0VSKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdC8vIFN1Ym1pdCB1c2VyIHNldHRpbmdzXG5cdFx0XHRcdFx0XHRwYXJhbXMucHV0VXRmU3RyaW5nKCd1c2VyJywgdGhpcy5fbW9uaXRvcmVkTmFtZSk7XG5cdFx0XHRcdFx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX1NFVF9VU0VSX1NFVFRJTkdTLCBwYXJhbXMpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0Ly8gU3VibWl0IHpvbmUgc2V0dGluZ3Ncblx0XHRcdFx0XHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfU0VUX1pPTkVfU0VUVElOR1MsIHBhcmFtcyk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gTGVhdmUgZWRpdCBtb2RlXG5cdFx0XHRcdFx0dGhpcy5fb25DYW5jZWxCdENsaWNrKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGVsc2Vcblx0XHRcdHtcblx0XHRcdFx0Ly8gU2hvdyBhbGVydFxuXHRcdFx0XHR0aGlzLnNoZWxsQ3RybC5zaG93U2ltcGxlQWxlcnQoJ1VuYWJsZSB0byBzdWJtaXQgY2hhbmdlcyBkdWUgdG8gYW4gaW52YWxpZCB2YWx1ZTsgcGxlYXNlIHZlcmlmeSB0aGUgaGlnaGxpZ2h0ZWQgZm9ybSBmaWVsZHMgaW4gYWxsIHRhYnMuJywgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0X29uVGltZVJhbmdlQ2hhbmdlKClcblx0e1xuXHRcdGxldCB2YWx1ZXMgPSB0aGlzLl90aW1lU2xpZGVyLnZhbHVlKCk7XG5cblx0XHRpZiAodmFsdWVzWzBdID09IHZhbHVlc1sxXSlcblx0XHR7XG5cdFx0XHRpZiAodmFsdWVzWzFdID09IC0yNClcblx0XHRcdFx0dmFsdWVzWzFdID0gLTIzO1xuXG5cdFx0XHR2YWx1ZXNbMF0gPSB2YWx1ZXNbMV0gLSAxO1xuXG5cdFx0XHQvLyBSZXNldCB0aGUgdGltZSByYW5nZSBzbGlkZXIgdmFsdWUgKHdlIG5lZWQgdG8gdXNlIHNldFRpbWVvdXRcblx0XHRcdC8vIGJhY2F1c2UgZG9pbmcgaXQgaW4gdGhlIGNoYW5nZSBldmVudCBsaXN0ZW5lciBkb2Vzbid0IHJlZHJhdyB0aGUgc2xpZGVyKVxuXHRcdFx0c2V0VGltZW91dCgkLnByb3h5KCBmdW5jdGlvbih2YWx1ZXMpIHsgdGhpcy5fdGltZVNsaWRlci52YWx1ZSh2YWx1ZXMpOyB9LCB0aGlzKSwgMTAsIHZhbHVlcyk7XG5cdFx0fVxuXG5cdFx0dGhpcy5fdXNlckNvdW50Q2hhcnQucmFuZ2UgPSB2YWx1ZXM7XG5cdH1cblxuXHRfb25XaW5kb3dSZXNpemUoKVxuXHR7XG5cdFx0Ly8gUmVkcmF3IGNoYXJ0c1xuXHRcdHRoaXMuX3VzZXJDb3VudENoYXJ0LnJlZHJhdygpO1xuXHRcdHRoaXMuX3BhY2tldFF1ZXVlQ2hhcnQucmVkcmF3KCk7XG5cdFx0dGhpcy5fZHJvcHBlZE1zZ0NoYXJ0LnJlZHJhdygpO1xuXHRcdHRoaXMuX3dyaXR0ZW5EYXRhQ2hhcnQucmVkcmF3KCk7XG5cdFx0dGhpcy5fcmVhZERhdGFDaGFydC5yZWRyYXcoKTtcblxuXHRcdC8vIFJlZHJhdyB0aW1lIHJhbmdlIHNsaWRlclxuXHRcdHRoaXMuX3RpbWVTbGlkZXIucmVzaXplKCk7XG5cdH1cblxuXHRfb25Xb3Jkc1JlbG9hZEJ0Q2xpY2soKVxuXHR7XG5cdFx0aWYgKHRoaXMuX21vbml0b3JlZFR5cGUgPT0gdGhpcy5NT05JVE9SRURfVFlQRV9aT05FKVxuXHRcdHtcblx0XHRcdC8vIFNlbmQgcmVxdWVzdCB0byBleHRlbnNpb25cblx0XHRcdGxldCBwYXJhbXMgPSBuZXcgU0ZTMlguU0ZTT2JqZWN0KCk7XG5cdFx0XHRwYXJhbXMucHV0VXRmU3RyaW5nKCd6b25lJywgdGhpcy5fbW9uaXRvcmVkTmFtZSk7XG5cblx0XHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfUkVMT0FEX1dPUkRTLCBwYXJhbXMpO1xuXHRcdH1cblx0fVxuXG5cdF9vblpvbmVFeHRSZWxvYWRCdENsaWNrKClcblx0e1xuXHRcdGlmICh0aGlzLl9tb25pdG9yZWRUeXBlID09IHRoaXMuTU9OSVRPUkVEX1RZUEVfWk9ORSlcblx0XHR7XG5cdFx0XHQvLyBTZW5kIHJlcXVlc3QgdG8gZXh0ZW5zaW9uXG5cdFx0XHRsZXQgcGFyYW1zID0gbmV3IFNGUzJYLlNGU09iamVjdCgpO1xuXHRcdFx0cGFyYW1zLnB1dFV0ZlN0cmluZygnem9uZScsIHRoaXMuX21vbml0b3JlZE5hbWUpO1xuXG5cdFx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX1JFTE9BRF9aT05FX0VYVCwgcGFyYW1zKTtcblx0XHR9XG5cdH1cblxuXHRfb25EaXNjb25uZWN0QnRDbGljaygpXG5cdHtcblx0XHRpZiAodGhpcy5fbW9uaXRvcmVkVHlwZSA9PSB0aGlzLk1PTklUT1JFRF9UWVBFX1VTRVIpXG5cdFx0e1xuXHRcdFx0Ly8gU2VuZCByZXF1ZXN0IHRvIGV4dGVuc2lvblxuXHRcdFx0bGV0IHBhcmFtcyA9IG5ldyBTRlMyWC5TRlNPYmplY3QoKTtcblx0XHRcdHBhcmFtcy5wdXRVdGZTdHJpbmcoJ3pvbmUnLCB0aGlzLl9tb25pdG9yZWRab25lKTtcblx0XHRcdHBhcmFtcy5wdXRVdGZTdHJpbmcoJ3VzZXInLCB0aGlzLl9tb25pdG9yZWROYW1lKTtcblxuXHRcdFx0dGhpcy5zZW5kRXh0ZW5zaW9uUmVxdWVzdCh0aGlzLlJFUV9ESVNDT05ORUNUX1VTRVIsIHBhcmFtcyk7XG5cdFx0fVxuXHR9XG5cblx0X29uS2lja0J0Q2xpY2soKVxuXHR7XG5cdFx0aWYgKHRoaXMuX21vbml0b3JlZFR5cGUgPT0gdGhpcy5NT05JVE9SRURfVFlQRV9VU0VSKVxuXHRcdHtcblx0XHRcdC8vIFNlbmQgcmVxdWVzdCB0byBleHRlbnNpb25cblx0XHRcdGxldCBwYXJhbXMgPSBuZXcgU0ZTMlguU0ZTT2JqZWN0KCk7XG5cdFx0XHRwYXJhbXMucHV0VXRmU3RyaW5nKCd6b25lJywgdGhpcy5fbW9uaXRvcmVkWm9uZSk7XG5cdFx0XHRwYXJhbXMucHV0VXRmU3RyaW5nKCd1c2VyJywgdGhpcy5fbW9uaXRvcmVkTmFtZSk7XG5cdFx0XHRwYXJhbXMucHV0VXRmU3RyaW5nKCdtc2cnLCAkKCcjem5tLWtpY2tNc2dJbicpLnZhbCgpKTtcblx0XHRcdHBhcmFtcy5wdXRJbnQoJ2RlbGF5JywgKHRoaXMuX2tpY2tEZWxheUluLnZhbHVlKCkgIT0gbnVsbCA/IE51bWJlcih0aGlzLl9raWNrRGVsYXlJbi52YWx1ZSgpKSA6IHRoaXMuS0lDS19CQU5fREVGQVVMVF9ERUxBWSkpO1xuXG5cdFx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX0tJQ0tfVVNFUiwgcGFyYW1zKTtcblxuXHRcdFx0Ly8gUmVzZXQgbWVzc2FnZVxuXHRcdFx0JCgnI3pubS1raWNrTXNnSW4nKS52YWwoJycpO1xuXHRcdH1cblx0fVxuXG5cdF9vbkJhbkJ0Q2xpY2soKVxuXHR7XG5cdFx0aWYgKHRoaXMuX21vbml0b3JlZFR5cGUgPT0gdGhpcy5NT05JVE9SRURfVFlQRV9VU0VSKVxuXHRcdHtcblx0XHRcdC8vIFNlbmQgcmVxdWVzdCB0byBleHRlbnNpb25cblx0XHRcdGxldCBwYXJhbXMgPSBuZXcgU0ZTMlguU0ZTT2JqZWN0KCk7XG5cdFx0XHRwYXJhbXMucHV0VXRmU3RyaW5nKCd6b25lJywgdGhpcy5fbW9uaXRvcmVkWm9uZSk7XG5cdFx0XHRwYXJhbXMucHV0VXRmU3RyaW5nKCd1c2VyJywgdGhpcy5fbW9uaXRvcmVkTmFtZSk7XG5cdFx0XHRwYXJhbXMucHV0VXRmU3RyaW5nKCdtc2cnLCAkKCcjem5tLWJhbk1zZ0luJykudmFsKCkpO1xuXHRcdFx0cGFyYW1zLnB1dFV0ZlN0cmluZygnbW9kZScsIHRoaXMuX2Jhbk1vZGVEZC5zZWxlY3QoKSA+IDAgPyB0aGlzLl9iYW5Nb2RlRGQudmFsdWUoKSA6ICdOQU1FJyk7XG5cdFx0XHRwYXJhbXMucHV0SW50KCdkZWxheScsICh0aGlzLl9iYW5EZWxheUluLnZhbHVlKCkgIT0gbnVsbCA/IE51bWJlcih0aGlzLl9iYW5EZWxheUluLnZhbHVlKCkpIDogdGhpcy5LSUNLX0JBTl9ERUZBVUxUX0RFTEFZKSk7XG5cblx0XHRcdGxldCBkdXJhdGlvbiA9IHRoaXMuX2JhbkR1cmF0aW9uSW4udmFsdWUoKSAhPSBudWxsID8gTnVtYmVyKHRoaXMuX2JhbkR1cmF0aW9uSW4udmFsdWUoKSkgOiAxO1xuXG5cdFx0XHRpZiAodGhpcy5fYmFuRHVyVW5pdERkLnZhbHVlKCkgPT0gJ2hvdXJzJylcblx0XHRcdFx0ZHVyYXRpb24gPSBkdXJhdGlvbiAqIDYwO1xuXHRcdFx0ZWxzZSBpZiAodGhpcy5fYmFuRHVyVW5pdERkLnZhbHVlKCkgPT0gJ2RheXMnKVxuXHRcdFx0XHRkdXJhdGlvbiA9IGR1cmF0aW9uICogNjAgKiAyNDtcblxuXHRcdFx0cGFyYW1zLnB1dEludCgnZHVyYXRpb24nLCBkdXJhdGlvbik7XG5cblx0XHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfQkFOX1VTRVIsIHBhcmFtcyk7XG5cblx0XHRcdC8vIFJlc2V0IG1lc3NhZ2Vcblx0XHRcdCQoJyN6bm0tYmFuTXNnSW4nKS52YWwoJycpO1xuXHRcdH1cblx0fVxuXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdC8vIFBSSVZBVEUgTUVUSE9EU1xuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdF9zZXRNb25pdG9yaW5nSW50ZXJmYWNlKClcblx0e1xuXHRcdGNvbnN0IGVuYWJsZWQgPSAodGhpcy5fbW9uaXRvcmVkVHlwZSAhPSBudWxsICYmIHRoaXMuX21vbml0b3JlZE5hbWUgIT0gbnVsbCk7XG5cblx0XHQvLyBTaG93L2hpZGUgaGVhZGVyIGFuZCBmb290ZXJcblx0XHRpZiAoZW5hYmxlZClcblx0XHR7XG5cdFx0XHR0aGlzLl9zd2l0Y2hWaWV3KGB6bm0tJHt0aGlzLl9tb25pdG9yZWRUeXBlfU1vbml0b3JgKTtcblxuXHRcdFx0Ly8gSGVhZGVyIHRpdGxlXG5cdFx0XHRsZXQgdGl0bGUgPSAnTm93IG1vbml0b3JpbmcgJztcblxuXHRcdFx0aWYgKHRoaXMuX21vbml0b3JlZFR5cGUgPT0gdGhpcy5NT05JVE9SRURfVFlQRV9VU0VSKVxuXHRcdFx0XHR0aXRsZSArPSBgVXNlcjogPHN0cm9uZz4ke3RoaXMuX21vbml0b3JlZE5hbWV9PC9zdHJvbmc+IChab25lOiAke3RoaXMuX21vbml0b3JlZFpvbmV9KWA7XG5cdFx0XHRlbHNlIGlmICh0aGlzLl9tb25pdG9yZWRUeXBlID09IHRoaXMuTU9OSVRPUkVEX1RZUEVfUk9PTSlcblx0XHRcdFx0dGl0bGUgKz0gYFJvb206IDxzdHJvbmc+JHt0aGlzLl9tb25pdG9yZWROYW1lfTwvc3Ryb25nPiAoWm9uZTogJHt0aGlzLl9tb25pdG9yZWRab25lfSlgO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHR0aXRsZSArPSBgWm9uZTogPHN0cm9uZz4ke3RoaXMuX21vbml0b3JlZFpvbmV9PC9zdHJvbmc+YDtcblxuXHRcdFx0JCgnI3pubS1tb25pdG9yZWRIZWFkZXInKS5odG1sKHRpdGxlKTtcblx0XHRcdCQoJyN6bm0tbW9uaXRvcmVkRm9vdGVyJykuc2hvdygpO1xuXG5cdFx0XHQvLyBTaG93IHBhbmVsXG5cdFx0XHR0aGlzLl9zd2l0Y2hQYW5lbCgnem5tLW1haW5QYW5lbCcpO1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0dGhpcy5fc3dpdGNoVmlldygnem5tLXNlbGVjdCcpO1xuXG5cdFx0XHQkKCcjem5tLW1vbml0b3JlZEhlYWRlcicpLmh0bWwoJycpO1xuXHRcdFx0JCgnI3pubS1tb25pdG9yZWRGb290ZXInKS5oaWRlKCk7XG5cblx0XHRcdC8vIFNob3cgcGFuZWxcblx0XHRcdHRoaXMuX3N3aXRjaFBhbmVsKCd6bm0tc2lkZWJhclBhbmVsJyk7XG5cdFx0fVxuXHR9XG5cblx0X3N3aXRjaFZpZXcodmlld0lkKVxuXHR7XG5cdFx0ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3pubS12aWV3c3RhY2snKS5zZWxlY3RlZEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh2aWV3SWQpO1xuXHR9XG5cblx0X3N3aXRjaFBhbmVsKHBhbmVsSWQpXG5cdHtcblx0XHRkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnem5tLXZpZXcnKS5zZWxlY3RlZFBhbmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocGFuZWxJZCk7XG5cdH1cblxuXHQvKipcblx0ICogQnVpbGQgdGhlIHBvbGxpbmcgcmVxdWVzdCB0byBiZSBzZW50IHRvIHRoZSBzZXJ2ZXIsIGJhc2VkIG9uIHRoZSBzZWxlY3Rpb25zIGFuZCBvdGhlciBzZXR0aW5ncyBpbiB0aGUgYWNjb3JkaW9uLlxuXHQgKi9cblx0X3JlcXVlc3REYXRhKG5ld0lkID0gZmFsc2UsIGdldFpvbmVVc2VyQ291bnRIaXN0b3J5ID0gZmFsc2UpXG5cdHtcblx0XHQvLyBDbGVhciBwcmV2aW91cyByZXF1ZXN0IHNjaGVkdWxpbmdcblx0XHRjbGVhclRpbWVvdXQodGhpcy5fcmVxdWVzdFRpbWVyKTtcblxuXHRcdC8vIENoZWNrIGlmIGNvbm5lY3Rpb24gaXMgc3RpbGwgYXZhaWxhYmxlXG5cdFx0aWYgKHRoaXMuc21hcnRGb3guaXNDb25uZWN0ZWQpXG5cdFx0e1xuXHRcdFx0aWYgKG5ld0lkKVxuXHRcdFx0XHR0aGlzLl9jdXJyZW50UmVxdWVzdElkKys7XG5cblx0XHRcdC8vIEJ1aWxkIHJlcXVlc3QgcGFyYW1ldGVyc1xuXHRcdFx0bGV0IHBhcmFtcyA9IG5ldyBTRlMyWC5TRlNPYmplY3QoKTtcblxuXHRcdFx0Ly8gVGhlIHVwZGF0ZWQgem9uZXMvcm9vbXMvdXNlcnMgbGlzdHMgYXJlIHJlcXVlc3RlZCBpZiB0aGUgY29ycmVzcG9uZGluZyBwYW5lbCBpcyBkaXNwbGF5ZWQgb25seVxuXHRcdFx0Y29uc3QgZ2V0Wm9uZXMgPSAodGhpcy5fYWN0aXZlUGFuZWxUeXBlID09ICd6b25lJyk7XG5cdFx0XHRjb25zdCBnZXRSb29tcyA9ICh0aGlzLl9hY3RpdmVQYW5lbFR5cGUgPT0gJ3Jvb20nICYmIHRoaXMuX3NlbGVjdGVkWm9uZSAhPSB1bmRlZmluZWQpO1xuXHRcdFx0Y29uc3QgZ2V0VXNlcnMgPSAodGhpcy5fYWN0aXZlUGFuZWxUeXBlID09ICd1c2VyJyAmJiB0aGlzLl9zZWxlY3RlZFpvbmUgIT0gdW5kZWZpbmVkKTtcblxuXHRcdFx0Ly8gLS0tIFpPTkVTIC0tLVxuXHRcdFx0cGFyYW1zLnB1dEJvb2woJ3pvbmVzJywgZ2V0Wm9uZXMpO1xuXG5cdFx0XHQvLyBST09NUyAmIFVTRVJTXG5cdFx0XHRpZiAoZ2V0Um9vbXMgfHwgZ2V0VXNlcnMpXG5cdFx0XHR7XG5cdFx0XHRcdC8vIENvbW1vbiBmaWx0ZXJpbmcgcGFyYW1zOlxuXG5cdFx0XHRcdC8vIGEpIHpvbmUgbmFtZVxuXHRcdFx0XHRwYXJhbXMucHV0VXRmU3RyaW5nKCd6b25lJywgdGhpcy5fc2VsZWN0ZWRab25lLm5hbWUpO1xuXG5cdFx0XHRcdC8vIGIpIGdyb3VwIG5hbWVcblx0XHRcdFx0cGFyYW1zLnB1dFV0ZlN0cmluZygnZ3JvdXAnLCB0aGlzLl9zZWxlY3RlZEdyb3VwLm5hbWUpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBST09NU1xuXHRcdFx0cGFyYW1zLnB1dEJvb2woJ3Jvb21zJywgZ2V0Um9vbXMpO1xuXHRcdFx0aWYgKGdldFJvb21zKVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBGaWx0ZXJpbmcgcGFyYW1zOlxuXG5cdFx0XHRcdC8vIGMpIGFkdmFuY2VkIGZpbHRlcmluZyBwYXJhbXNcblx0XHRcdFx0aWYgKCQoJyN6bm0tYXBwbHlSb29tRmlsdGVyQ0InKS5wcm9wKCdjaGVja2VkJykgJiYgdGhpcy5fcm9vbUZpbHRlci5maWx0ZXJFeHByZXNzaW9uICE9IG51bGwpXG5cdFx0XHRcdFx0cGFyYW1zLnB1dFNGU0FycmF5KCdyRmlsdGVyJywgdGhpcy5fcm9vbUZpbHRlci5maWx0ZXJFeHByZXNzaW9uLnRvU0ZTQXJyYXkoKSk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFVTRVJTXG5cdFx0XHRwYXJhbXMucHV0Qm9vbCgndXNlcnMnLCBnZXRVc2Vycyk7XG5cdFx0XHRpZiAoZ2V0VXNlcnMpXG5cdFx0XHR7XG5cdFx0XHRcdC8vIEZpbHRlcmluZyBwYXJhbXM6XG5cblx0XHRcdFx0Ly8gYykgcm9vbSBuYW1lXG5cdFx0XHRcdGlmICh0aGlzLl9zZWxlY3RlZFJvb20pXG5cdFx0XHRcdFx0cGFyYW1zLnB1dFV0ZlN0cmluZygncm9vbScsIHRoaXMuX3NlbGVjdGVkUm9vbS5uYW1lKTtcblxuXHRcdFx0XHQvLyBkKSBhZHZhbmNlZCBmaWx0ZXJpbmcgcGFyYW1zXG5cdFx0XHRcdGlmICgkKCcjem5tLWFwcGx5VXNlckZpbHRlckNCJykucHJvcCgnY2hlY2tlZCcpICYmIHRoaXMuX3VzZXJGaWx0ZXIuZmlsdGVyRXhwcmVzc2lvbiAhPSBudWxsKVxuXHRcdFx0XHRcdHBhcmFtcy5wdXRTRlNBcnJheSgndUZpbHRlcicsIHRoaXMuX3VzZXJGaWx0ZXIuZmlsdGVyRXhwcmVzc2lvbi50b1NGU0FycmF5KCkpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyAtLS0gQ1VSUkVOVExZIE1PTklUT1JFRCBEQVRBIC0tLVxuXHRcdFx0aWYgKHRoaXMuX21vbml0b3JlZFR5cGUgIT0gbnVsbCAmJiB0aGlzLl9tb25pdG9yZWROYW1lICE9IG51bGwpXG5cdFx0XHR7XG5cdFx0XHRcdGxldCBtb25pdG9yZWRPYmogPSB0aGlzLl9nZXRCYXNpY01vbml0b3JlZE9iamVjdCgpO1xuXG5cdFx0XHRcdGlmICh0aGlzLl9tb25pdG9yZWRUeXBlID09IHRoaXMuTU9OSVRPUkVEX1RZUEVfWk9ORSlcblx0XHRcdFx0XHRtb25pdG9yZWRPYmoucHV0Qm9vbCgndWMnLCBnZXRab25lVXNlckNvdW50SGlzdG9yeSk7XG5cblx0XHRcdFx0cGFyYW1zLnB1dFNGU09iamVjdCgnbW9uaXRvcmVkJywgbW9uaXRvcmVkT2JqKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2V0IHJlcXVlc3QgaWQ7IHdoZW4gYSByZXNwb25zZSBpcyByZWNlaXZlZCwgd2UgY2hlY2sgaXRzIGlkIG1hdGNoZXMgdGhlIGN1cnJlbnQgcmVxdWVzdCBpZDogaWYgbm90LCB0aGUgcmVzcG9uc2UgaXMgZGlzY2FyZGVkXG5cdFx0XHRwYXJhbXMucHV0SW50KCdpZCcsIHRoaXMuX2N1cnJlbnRSZXF1ZXN0SWQpO1xuXG5cdFx0XHQvLyBTZW5kIHJlcXVlc3QgdG8gZXh0ZW5zaW9uXG5cdFx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX0dFVF9EQVRBLCBwYXJhbXMpO1xuXG5cdFx0XHQvLyBTY2hlZHVsZSBuZXh0IHJlcXVlc3Rcblx0XHRcdHRoaXMuX3JlcXVlc3RUaW1lciA9IHNldFRpbWVvdXQoJC5wcm94eSh0aGlzLl9yZXF1ZXN0RGF0YSwgdGhpcyksIE51bWJlcih0aGlzLl9pbnRlcnZhbERyb3BEb3duLnZhbHVlKCkpICogMTAwMCk7XG5cdFx0fVxuXHR9XG5cblx0X2dldEJhc2ljTW9uaXRvcmVkT2JqZWN0KClcblx0e1xuXHRcdGxldCBtb25pdG9yZWRPYmogPSBuZXcgU0ZTMlguU0ZTT2JqZWN0KCk7XG5cblx0XHRtb25pdG9yZWRPYmoucHV0VXRmU3RyaW5nKCd6b25lJywgdGhpcy5fbW9uaXRvcmVkWm9uZSk7XG5cdFx0bW9uaXRvcmVkT2JqLnB1dFV0ZlN0cmluZygndHlwZScsIHRoaXMuX21vbml0b3JlZFR5cGUpO1xuXHRcdG1vbml0b3JlZE9iai5wdXRVdGZTdHJpbmcoJ25hbWUnLCB0aGlzLl9tb25pdG9yZWROYW1lKTtcblxuXHRcdHJldHVybiBtb25pdG9yZWRPYmo7XG5cdH1cblxuXHRfc2V0Wm9uZXNEYXRhUHJvdmlkZXIoem9uZXNEYXRhKVxuXHR7XG5cdFx0dGhpcy5fc2V0TGlzdERhdGFQcm92aWRlcih0aGlzLl96b25lTGlzdEJveCwgem9uZXNEYXRhLCB0cnVlKTtcblx0fVxuXG5cdF9zZXRSb29tc0RhdGFQcm92aWRlcihyb29tc0RhdGEpXG5cdHtcblx0XHR0aGlzLl9zZXRMaXN0RGF0YVByb3ZpZGVyKHRoaXMuX3Jvb21MaXN0Qm94LCByb29tc0RhdGEsIHRydWUpO1xuXG5cdFx0Ly8gU2V0IFJlbW92ZSBidXR0b24gc3RhdGVcblx0XHQkKCcjem5tLXJlbW92ZVJvb21CdCcpLmF0dHIoJ2Rpc2FibGVkJywgdGhpcy5fc2VsZWN0ZWRSb29tID09IHVuZGVmaW5lZCk7XG5cdH1cblxuXHRfc2V0VXNlcnNEYXRhUHJvdmlkZXIodXNlcnNEYXRhKVxuXHR7XG5cdFx0dGhpcy5fc2V0TGlzdERhdGFQcm92aWRlcih0aGlzLl91c2VyTGlzdEJveCwgdXNlcnNEYXRhKTtcblx0fVxuXG5cdF9zZXRMaXN0RGF0YVByb3ZpZGVyKGxpc3RXaWRnZXQsIGxpc3REYXRhLCBjb3VudFVzZXJzID0gZmFsc2UpXG5cdHtcblx0XHQvLyBTYXZlIHJlZmVyZW5jZSB0byBzZWxlY3RlZCBpdGVtIG5hbWVcblx0XHQvLyBOT1RFOiBhcyB3ZSBhcmUgc3Vic3RpdHV0aW5nIHRoZSB3aG9sZSBkYXRhIHNvdXJjZSwgd2UgbmVlZCBpdCB0byByZS1zZWxlY3QgdGhlIHNhbWUgaXRlbSBhZnRlciB1cGRhdGVcblx0XHRsZXQgc2VsZWN0ZWREYXRhSXRlbSA9IGxpc3RXaWRnZXQuZGF0YUl0ZW0obGlzdFdpZGdldC5zZWxlY3QoKSk7XG5cdFx0bGV0IHNlbGVjdGVkRGF0YUl0ZW1OYW1lID0gc2VsZWN0ZWREYXRhSXRlbSA/IHNlbGVjdGVkRGF0YUl0ZW0ubmFtZSA6IG51bGw7XG5cblx0XHRsZXQgZGF0YUFycmF5ID0gW107XG5cblx0XHQvLyBDb252ZXJ0IGRhdGEgY29taW5nIGZyb20gc2VydmVyXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0RGF0YS5zaXplKCk7IGkrKylcblx0XHR7XG5cdFx0XHRsZXQgaXRlbURhdGEgPSBsaXN0RGF0YS5nZXRTRlNPYmplY3QoaSk7XG5cblx0XHRcdGxldCBpdGVtID0ge307XG5cdFx0XHRpdGVtLm5hbWUgPSBpdGVtRGF0YS5nZXRVdGZTdHJpbmcoJ25hbWUnKTtcblxuXHRcdFx0aWYgKGNvdW50VXNlcnMpXG5cdFx0XHRcdGl0ZW0udXNlcnMgPSBpdGVtRGF0YS5nZXRJbnQoJ3VzZXJzJyk7XG5cblx0XHRcdGRhdGFBcnJheS5wdXNoKGl0ZW0pO1xuXHRcdH1cblxuXHRcdC8vIENyZWF0ZSBuZXcgZGF0YSBzb3VyY2Vcblx0XHRsZXQgbGlzdERTID0gbmV3IGtlbmRvLmRhdGEuRGF0YVNvdXJjZSh7XG5cdFx0XHRkYXRhOiBkYXRhQXJyYXksXG5cdFx0XHRzY2hlbWE6IHtcblx0XHRcdFx0bW9kZWw6IHtcblx0XHRcdFx0XHRpZDogJ25hbWUnXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRzb3J0OiB7XG5cdFx0XHRcdGZpZWxkOiAnbmFtZScsXG5cdFx0XHRcdGRpcjogJ2FzYydcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdC8vIEFzc2lnbiBkYXRhIHNvdXJjZSB0byBsaXN0XG5cdFx0bGlzdFdpZGdldC5zZXREYXRhU291cmNlKGxpc3REUyk7XG5cblx0XHQvLyBTZWxlY3QgYWdhaW4gcHJldmlvdXNseSBzZWxlY3RlZCBpdGVtXG5cdFx0aWYgKHNlbGVjdGVkRGF0YUl0ZW1OYW1lICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0c2VsZWN0ZWREYXRhSXRlbSA9IGxpc3REUy5nZXQoc2VsZWN0ZWREYXRhSXRlbU5hbWUpO1xuXG5cdFx0XHRpZiAoc2VsZWN0ZWREYXRhSXRlbSlcblx0XHRcdHtcblx0XHRcdFx0bGV0IHNlbGVjdGVkRWxlbWVudCA9IGxpc3RXaWRnZXQud3JhcHBlci5maW5kKCdbZGF0YS11aWQ9XCInICsgc2VsZWN0ZWREYXRhSXRlbS51aWQgKyAnXCJdJyk7XG5cdFx0XHRcdGxpc3RXaWRnZXQuc2VsZWN0KHNlbGVjdGVkRWxlbWVudCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gUmVzZXQgbWFpbiBjb250cm9sIHN0YXRlXG5cdFx0dGhpcy5fc2V0TWFpbkNvbnRyb2xzRW5hYmxlZCgpO1xuXHR9XG5cblx0X3NldEdyb3Vwc0RhdGFQcm92aWRlcihncm91cHNEYXRhKVxuXHR7XG5cdFx0Ly8gQ3JlYXRlIEdyb3VwcyBhcnJheSwgYWRkaW5nIGNvbW1vbiBlbnRyaWVzXG5cdFx0bGV0IGdyb3Vwc0FycmF5ID0gW1xuXHRcdFx0dGhpcy5fZ2V0R3JvdXBPYmooJycsIHRoaXMuQU5ZX0xBQkVMKSxcblx0XHRcdHRoaXMuX2dldEdyb3VwT2JqKHRoaXMuREVGQVVMVF9HUk9VUF9OQU1FKVxuXHRcdF07XG5cblx0XHQvLyBTYXZlIHJlZmVyZW5jZSB0byBzZWxlY3RlZCBncm91cCBuYW1lXG5cdFx0Ly8gTk9URTogYXMgd2UgYXJlIHN1YnN0aXR1dGluZyB0aGUgd2hvbGUgZGF0YSBzb3VyY2UsIHdlIG5lZWQgaXQgdG8gcmUtc2VsZWN0IHRoZSBzYW1lIGl0ZW0gYWZ0ZXIgdXBkYXRlXG5cdFx0bGV0IHNlbGVjdGVkRGF0YUl0ZW0gPSB0aGlzLl9zZWxlY3RlZEdyb3VwO1xuXHRcdGxldCBzZWxlY3RlZERhdGFJdGVtTmFtZSA9IHNlbGVjdGVkRGF0YUl0ZW0gPyBzZWxlY3RlZERhdGFJdGVtLm5hbWUgOiBudWxsO1xuXG5cdFx0aWYgKGdyb3Vwc0RhdGEgIT0gbnVsbClcblx0XHR7XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGdyb3Vwc0RhdGEubGVuZ3RoOyBpKyspXG5cdFx0XHR7XG5cdFx0XHRcdGlmIChncm91cHNEYXRhW2ldICE9IHRoaXMuREVGQVVMVF9HUk9VUF9OQU1FKSAvLyBEZWZhdWx0IGdyb3VwIHdhcyBhZGRlZCBiZWZvcmVcblx0XHRcdFx0XHRncm91cHNBcnJheS5wdXNoKHRoaXMuX2dldEdyb3VwT2JqKGdyb3Vwc0RhdGFbaV0pKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDcmVhdGUgbmV3IGRhdGEgc291cmNlXG5cdFx0bGV0IGdyb3VwRFMgPSBuZXcga2VuZG8uZGF0YS5EYXRhU291cmNlKHtcblx0XHRcdGRhdGE6IGdyb3Vwc0FycmF5LFxuXHRcdFx0c2NoZW1hOiB7XG5cdFx0XHRcdG1vZGVsOiB7XG5cdFx0XHRcdFx0aWQ6ICduYW1lJ1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvLyBBc3NpZ24gZGF0YSBzb3VyY2UgdG8gZHJvcGRvd25cblx0XHR0aGlzLl9ncm91cHNEcm9wRG93bi5zZXREYXRhU291cmNlKGdyb3VwRFMpO1xuXG5cdFx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdFx0Ly8gU2VsZWN0IHByZXZpb3VzbHkgc2VsZWN0ZWQgaXRlbVxuXHRcdHNlbGVjdGVkRGF0YUl0ZW0gPSBncm91cERTLmdldChzZWxlY3RlZERhdGFJdGVtTmFtZSk7XG5cblx0XHQvLyBJZiBncm91cCBpcyBub3QgZm91bmQsIHNlbGVjdCB0aGUgZGVmYXVsdCBvbmVcblx0XHRpZiAoc2VsZWN0ZWREYXRhSXRlbSA9PSB1bmRlZmluZWQpXG5cdFx0XHRzZWxlY3RlZERhdGFJdGVtID0gZ3JvdXBEUy5nZXQodGhpcy5ERUZBVUxUX0dST1VQX05BTUUpO1xuXG5cdFx0dGhpcy5fZ3JvdXBzRHJvcERvd24uc2VsZWN0KGZ1bmN0aW9uKGRhdGFJdGVtKSB7XG5cdFx0XHRyZXR1cm4gZGF0YUl0ZW0ubmFtZSA9PT0gc2VsZWN0ZWREYXRhSXRlbS5uYW1lO1xuXHRcdH0pO1xuXHR9XG5cblx0X2dldEdyb3VwT2JqKG5hbWUsIGxhYmVsID0gbnVsbClcblx0e1xuXHRcdHJldHVybiB7XG5cdFx0XHRuYW1lOiBuYW1lLFxuXHRcdFx0bGFiZWw6IChsYWJlbCAhPSBudWxsID8gbGFiZWwgOiBuYW1lKVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBVcGRhdGUgdGhlIFNjb3BlIGxhYmVsIGluIHRoZSBSb29tcyBwYW5lbCBhbmQgaW4gdGhlIFVzZXJzIHBhbmVsLlxuXHQgKi9cblx0X3NldFNjb3BlTGFiZWwoKVxuXHR7XG5cdFx0bGV0IHJvb21TY29wZSA9ICcnO1xuXHRcdGxldCB1c2VyU2NvcGUgPSAnJztcblxuXHRcdGlmICh0aGlzLl9zZWxlY3RlZFpvbmUpXG5cdFx0e1xuXHRcdFx0bGV0IHpvbmVOYW1lID0gdGhpcy5fc2VsZWN0ZWRab25lLm5hbWU7XG5cdFx0XHRyb29tU2NvcGUgPSB0aGlzLl9nZXRTY29wZUxhYmVsUGFydCgnWm9uZTonLCB6b25lTmFtZSk7XG5cblx0XHRcdGxldCBzZWxlY3RlZEdyb3VwID0gdGhpcy5fc2VsZWN0ZWRHcm91cDtcblx0XHRcdGxldCBncm91cE5hbWUgPSAoc2VsZWN0ZWRHcm91cCAmJiBzZWxlY3RlZEdyb3VwLm5hbWUgIT0gJycpID8gc2VsZWN0ZWRHcm91cC5uYW1lIDogdGhpcy5BTllfTEFCRUw7XG5cdFx0XHRsZXQgcm9vbU5hbWUgPSAodGhpcy5fc2VsZWN0ZWRSb29tKSA/IHRoaXMuX3NlbGVjdGVkUm9vbS5uYW1lIDogdGhpcy5BTllfTEFCRUw7XG5cblx0XHRcdHVzZXJTY29wZSA9IHRoaXMuX2dldFNjb3BlTGFiZWxQYXJ0KCdab25lOicsIHpvbmVOYW1lKSArICc8YnI+JyArIHRoaXMuX2dldFNjb3BlTGFiZWxQYXJ0KCdHcm91cDonLCBncm91cE5hbWUpICsgJzxicj4nICsgdGhpcy5fZ2V0U2NvcGVMYWJlbFBhcnQoJ1Jvb206Jywgcm9vbU5hbWUpO1xuXHRcdH1cblxuXHRcdCQoJyN6bm0tcm9vbVNjb3BlTGInKS5odG1sKHJvb21TY29wZSk7XG5cdFx0JCgnI3pubS11c2VyU2NvcGVMYicpLmh0bWwodXNlclNjb3BlKTtcblx0fVxuXG5cdF9nZXRTY29wZUxhYmVsUGFydChsYWJlbCwgdGV4dClcblx0e1xuXHRcdHJldHVybiBgPHNwYW4gY2xhc3M9XCJ0ZXh0LW11dGVkXCI+JHtsYWJlbH08L3NwYW4+IDxzcGFuPiR7dGV4dH08L3NwYW4+YDtcblx0fVxuXG5cdF9yZXNldFJvb21MaXN0KClcblx0e1xuXHRcdHRoaXMuX3Jvb21MaXN0Qm94LnNldERhdGFTb3VyY2UoW10pO1xuXG5cdFx0Ly8gQWxzbyBkaXNhYmxlIFJlbW92ZSBidXR0b25cblx0XHQkKCcjem5tLXJlbW92ZVJvb21CdCcpLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSk7XG5cdH1cblxuXHRfcmVzZXRVc2VyTGlzdCgpXG5cdHtcblx0XHR0aGlzLl91c2VyTGlzdEJveC5zZXREYXRhU291cmNlKFtdKTtcblx0fVxuXG5cdF9zZXRNYWluQ29udHJvbHNFbmFibGVkKClcblx0e1xuXHRcdGxldCBlbmFibGVkID0gKHRoaXMuX2FjdGl2ZVBhbmVsVHlwZSA9PSAnem9uZScgJiYgdGhpcy5fc2VsZWN0ZWRab25lICE9IHVuZGVmaW5lZClcblx0XHRcdFx0XHR8fCAodGhpcy5fYWN0aXZlUGFuZWxUeXBlID09ICdyb29tJyAmJiB0aGlzLl9zZWxlY3RlZFJvb20gIT0gdW5kZWZpbmVkKVxuXHRcdFx0XHRcdHx8ICh0aGlzLl9hY3RpdmVQYW5lbFR5cGUgPT0gJ3VzZXInICYmIHRoaXMuX3NlbGVjdGVkVXNlciAhPSB1bmRlZmluZWQpO1xuXG5cdFx0JCgnI3pubS1tYWluQ29udHJvbHMnKS5hdHRyKCdkaXNhYmxlZCcsICFlbmFibGVkKTtcblxuXHRcdCQoJyN6bm0tbW9uaXRvclRhcmdldExiJykudGV4dChlbmFibGVkID8gY2FwaXRhbGl6ZUZpcnN0KHRoaXMuX2FjdGl2ZVBhbmVsVHlwZSkgOiAnc2VsZWN0aW9uJyk7XG5cdFx0JCgnI3pubS1tZXNzYWdlSW4nKS5hdHRyKCdwbGFjZWhvbGRlcicsICdNZXNzYWdlIHRvICcgKyAoZW5hYmxlZCA/IGNhcGl0YWxpemVGaXJzdCh0aGlzLl9hY3RpdmVQYW5lbFR5cGUpIDogJ3NlbGVjdGlvbicpKTtcblx0fVxuXG5cdF9zaG93TGltaXRFeGNlZWRlZFdhcm5pbmcoaWNvbiwgdGl0bGUpXG5cdHtcblx0XHRpY29uLmF0dHIoJ3RpdGxlJywgdGl0bGUpO1xuXG5cdFx0aWYgKHRpdGxlICE9ICcnKVxuXHRcdFx0aWNvbi5yZW1vdmVDbGFzcygnaGlkZGVuJyk7XG5cdFx0ZWxzZVxuXHRcdFx0aWNvbi5hZGRDbGFzcygnaGlkZGVuJyk7XG5cdH1cblxuXHRfc2hvd1Jvb21DcmVhdGlvblBhbmVsKHJvb21TZXR0aW5ncylcblx0e1xuXHRcdC8vIEJ1aWxkIHVzZXIgaW50ZXJmYWNlIGJhc2VkIG9uIHBhc3NlZCBkYXRhXG5cdFx0dGhpcy5fcm9vbUNyZWF0aW9uSUJ1aWxkZXIuYnVpbGRJbnRlcmZhY2Uocm9vbVNldHRpbmdzLCAnem5tLXJvb21DcmVhdG9yVGFiTmF2JywgZmFsc2UsICdyYycpO1xuXG5cdFx0Ly8gRW5hYmxlIHNjcm9sbGluZyB0YWJzXG5cdFx0JCgnI3pubS1yb29tQ3JlYXRvclRhYk5hdiA+ICN0YWJzJykuc2Nyb2xsaW5nVGFicyh7XG5cdFx0XHRib290c3RyYXBWZXJzaW9uOiA0LFxuXHRcdFx0c2Nyb2xsVG9UYWJFZGdlOiB0cnVlLFxuXHRcdFx0ZW5hYmxlU3dpcGluZzogdHJ1ZSxcblx0XHRcdGRpc2FibGVTY3JvbGxBcnJvd3NPbkZ1bGx5U2Nyb2xsZWQ6IHRydWUsXG5cdFx0XHRjc3NDbGFzc0xlZnRBcnJvdzogJ2ZhIGZhLWNoZXZyb24tbGVmdCcsXG5cdFx0XHRjc3NDbGFzc1JpZ2h0QXJyb3c6ICdmYSBmYS1jaGV2cm9uLXJpZ2h0J1xuXHRcdH0pO1xuXG5cdFx0Ly8gUmVzZXQgTm90aWZ5IGNsaWVudHMgY2hlY2tib3hcblx0XHQkKCcjem5tLW5vdGlmeUNsaWVudHNDQicpLnByb3AoJ2NoZWNrZWQnLCB0cnVlKTtcblxuXHRcdC8vIFNldCBsaXN0ZW5lciBmb3IgY3VzdG9tIGFjdGlvbnMgdHJpZ2dlcmVkIGJ5IGNvbmZpZ3VyYXRpb24gaW50ZXJmYWNlXG5cdFx0JCgnI3pubS1yb29tQ3JlYXRvclRhYk5hdicpLm9uKCd2YWx1ZS1zZXQnLCAkLnByb3h5KHRoaXMuX29uQ29uZmlnVmFsdWVTZXQsIHRoaXMpKTtcblxuXHRcdC8vIERpc3BsYXkgcGFuZWxcblx0XHQkKCcjem5tLWNyZWF0ZVJvb21Nb2RhbCcpLm1vZGFsKCdzaG93Jyk7XG5cblx0XHQvLyBSZXNldCBhbmQgaGlkZSBlcnJvciBtZXNzYWdlXG5cdFx0dGhpcy5fcmVzZXRSb29tQ3JlYXRpb25FcnJvcigpO1xuXHR9XG5cblx0X3Jlc2V0Um9vbUNyZWF0aW9uRXJyb3IoKVxuXHR7XG5cdFx0Ly8gUmVzZXQgYW5kIGhpZGUgZXJyb3IgbWVzc2FnZVxuXHRcdCQoJyN6bm0tY3JlYXRlUm9vbUVycm9yJykudGV4dCgnJyk7XG5cdFx0JCgnI3pubS1jcmVhdGVSb29tRXJyb3InKS5oaWRlKCk7XG5cdH1cblxuXHRfdmFsaWRhdGVOZXdSb29tTmFtZShjaGFuZ2VzKVxuXHR7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBjaGFuZ2VzLnNpemUoKTsgaSsrKVxuXHRcdHtcblx0XHRcdGNvbnN0IHNldHRpbmcgPSBjaGFuZ2VzLmdldFNGU09iamVjdChpKTtcblxuXHRcdFx0aWYgKHNldHRpbmcuY29udGFpbnNLZXkoJ25hbWUnKSAmJiBzZXR0aW5nLmdldFV0ZlN0cmluZygnbmFtZScpID09ICduYW1lJylcblx0XHRcdHtcblx0XHRcdFx0Ly8gR2V0IG5hbWUgdmFsdWVcblx0XHRcdFx0Y29uc3QgbmFtZSA9IHNldHRpbmcuZ2V0VGV4dCgndmFsdWUnKTtcblxuXHRcdFx0XHQvLyBHZXQgZGF0YSBzb3VyY2Vcblx0XHRcdFx0Y29uc3QgZHMgPSB0aGlzLl9yb29tTGlzdEJveC5kYXRhU291cmNlLmRhdGEoKTtcblxuXHRcdFx0XHQvLyBDaGVjayBpZiBuYW1lIGV4aXN0cyBpbiBkYXRhIHNvdXJjZVxuXHRcdFx0XHRmb3IgKGxldCBqID0gMDsgaiA8IGRzLmxlbmd0aDsgaisrKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0aWYgKGRzW2pdLm5hbWUgPT0gbmFtZSlcblx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0X2VuYWJsZUNyZWF0ZVJvb21QYW5lbChlbmFibGUpXG5cdHtcblx0XHRsZXQgbW9kYWxFbGVtZW50ID0gJCgnI3pubS1jcmVhdGVSb29tTW9kYWwnKTtcblxuXHRcdC8vIEVuYWJsZSBtb2RhbCBjbG9zZSBidXR0b25zXG5cdFx0JCgnYnV0dG9uW2RhdGEtZGlzbWlzcz1cIm1vZGFsXCJdJywgbW9kYWxFbGVtZW50KS5hdHRyKCdkaXNhYmxlZCcsICFlbmFibGUpO1xuXG5cdFx0Ly8gRW5hYmxlIGNyZWF0ZSBidXR0b25cblx0XHQkKCcjem5tLXJvb21DcmVhdG9yQ3JlYXRlQnQnLCBtb2RhbEVsZW1lbnQpLmF0dHIoJ2Rpc2FibGVkJywgIWVuYWJsZSk7XG5cblx0XHQvLyBFbmFibGUgY2hlY2tib3hcblx0XHQkKCcjem5tLW5vdGlmeUNsaWVudHNDQicsIG1vZGFsRWxlbWVudCkuYXR0cignZGlzYWJsZWQnLCAhZW5hYmxlKTtcblxuXHRcdC8vIEVuYWJsZSBjb25maWd1cmF0aW9uIGludGVyZmFjZVxuXHRcdHRoaXMuX3Jvb21DcmVhdGlvbklCdWlsZGVyLmRpc2FibGVJbnRlcmZhY2UoIWVuYWJsZSk7XG5cdH1cblxuXHRfY2xlYXJUYWJzKG1vbml0b3JlZFR5cGUpXG5cdHtcblx0XHQvLyBEZXN0cm95IHNjcm9sbGluZyB0YWJzXG5cdFx0JChgI3pubS0ke21vbml0b3JlZFR5cGV9VGFiTmF2aWdhdG9yICN0YWJzYCkuc2Nyb2xsaW5nVGFicygnZGVzdHJveScpO1xuXG5cdFx0Ly8gUmVtb3ZlIGFsbCB0YWIgbmF2aWdhdG9yIGNvbnRlbnRcblx0XHR0aGlzLl9pbnRlcmZhY2VCdWlsZGVyLmRlc3Ryb3lJbnRlcmZhY2UoKTtcblxuXHRcdC8vIFNldCBhbGwgdGFiIHBhbmVscyBhcyBpbmFjdGl2ZVxuXHRcdCQoYCN6bm0tJHttb25pdG9yZWRUeXBlfVRhYk5hdmlnYXRvciAjdGFiUGFuZWxzIC50YWItcGFuZWApLnJlbW92ZUNsYXNzKCdzaG93IGFjdGl2ZScpO1xuXG5cdFx0Ly8gUmVtb3ZlIHRhYiBjaGFuZ2UgZXZlbnQgbGlzdGVuZXJcblx0XHQkKCdhW2RhdGEtdG9nZ2xlPVwidGFiXCJdJykub2ZmKCdzaG93bi5icy50YWInKTtcblxuXHRcdHRoaXMuX3NraXBJbml0VGFicyA9IGZhbHNlO1xuXHR9XG5cblx0X3Nob3dab25lVHJhZmZpY0RhdGEoZGF0YSlcblx0e1xuXHRcdC8vIEJ1aWxkIHVzZXIgY291bnQgbW9uaXRvciBoaXN0b3J5XG5cdFx0aWYgKGRhdGEuY29udGFpbnNLZXkoJ2hpc3RvcnknKSlcblx0XHR7XG5cdFx0XHRsZXQgdXNlckNvdW50RGF0YSA9IGRhdGEuZ2V0SW50QXJyYXkoJ2hpc3RvcnknKTtcblx0XHRcdGxldCBzYW1wbGluZ1JhdGVNaW5zID0gZGF0YS5nZXRJbnQoJ3JhdGUnKTtcblxuXHRcdFx0dGhpcy5fdXNlckNvdW50Q2hhcnQuYWRkSGlzdG9yeUVudHJpZXModXNlckNvdW50RGF0YSwgc2FtcGxpbmdSYXRlTWlucyAqIDYwKTtcblx0XHR9XG5cblx0XHQvLyBBZGQgbGFzdCB1c2VyIGNvdW50IHZhbHVlXG5cdFx0dGhpcy5fdXNlckNvdW50Q2hhcnQuYWRkRW50cnkoZGF0YS5nZXRJbnQoJ2N1cnJlbnQnKSk7XG5cdH1cblxuXHRfYWRkTG9nRW50cnlUb0dyaWQoZ3JpZCwgaXRlbSlcblx0e1xuXHRcdGxldCBkcyA9IGdyaWQuZGF0YVNvdXJjZTtcblxuXHRcdC8vIENoZWNrIGl0ZW1zIGxpbWl0XG5cdFx0aWYgKGRzLnRvdGFsKCkgPT0gdGhpcy5NQVhfRVhURU5TSU9OX0xPR19TSVpFKVxuXHRcdFx0ZHMucmVtb3ZlKGRzLmF0KDApKTtcblxuXHRcdGRzLmFkZChpdGVtKTtcblx0fVxuXG5cdF9zaG93VXNlclN0YXRzRGF0YShkYXRhKVxuXHR7XG5cdFx0Ly8gUGFja2V0IHF1ZXVlIGZpbGxpbmcgJVxuXHRcdGxldCBwYWNrZXRRdWV1ZSA9IHJvdW5kVG9EZWNpbWFscyhkYXRhLmdldEZsb2F0KCdwYWNrZXQnKSwgMik7XG5cdFx0dGhpcy5fcGFja2V0UXVldWVDaGFydC5zZXREYXRhU291cmNlKFt7Y2F0ZWdvcnk6ICdRdWV1ZScsIHZhbHVlOiBwYWNrZXRRdWV1ZX1dKTtcblxuXHRcdC8vIERyb3BwZWQgbWVzc2FnZXNcblx0XHRsZXQgZHJvcHBlZE1zZyA9IGRhdGEuZ2V0SW50KCdkcm9wcGVkJyk7XG5cdFx0dGhpcy5fZHJvcHBlZE1zZ0NoYXJ0LnNldERhdGFTb3VyY2UoW3tjYXRlZ29yeTogJ0Ryb3BwZWQnLCB2YWx1ZTogZHJvcHBlZE1zZ31dKTtcblxuXHRcdC8vIFdyaXR0ZW4gZGF0YSBhbW91bnRcblx0XHRsZXQgd3JpdHRlbkRhdGFPYmogPSBzY2FsZUJ5dGVzKGRhdGEuZ2V0TG9uZygnd0J5dGVzJyksIDIpO1xuXHRcdHRoaXMuX3dyaXR0ZW5EYXRhQ2hhcnQuc2V0RGF0YVNvdXJjZShbe2NhdGVnb3J5OiAnV3JpdHRlbicsIHZhbHVlOiB3cml0dGVuRGF0YU9iai52YWx1ZSwgdW5pdDogd3JpdHRlbkRhdGFPYmoudW5pdH1dKTtcblxuXHRcdC8vIFJlYWQgZGF0YSBhbW91bnRcblx0XHRsZXQgcmVhZERhdGFPYmogPSBzY2FsZUJ5dGVzKGRhdGEuZ2V0TG9uZygnckJ5dGVzJyksIDIpO1xuXHRcdHRoaXMuX3JlYWREYXRhQ2hhcnQuc2V0RGF0YVNvdXJjZShbe2NhdGVnb3J5OiAnUmVhZCcsIHZhbHVlOiByZWFkRGF0YU9iai52YWx1ZSwgdW5pdDogcmVhZERhdGFPYmoudW5pdH1dKTtcblx0fVxuXG5cdF9zZXRHZW9Mb2NhdGlvblVJKGdlb0xvY0RhdGEpXG5cdHtcblx0XHRjb25zdCBsb2NhdGlvbiA9IGdlb0xvY0RhdGEuZ2V0VXRmU3RyaW5nKCdsb2NhdGlvbicpO1xuXHRcdGNvbnN0IGVycm9yID0gZ2VvTG9jRGF0YS5nZXRVdGZTdHJpbmcoJ2Vycm9yJyk7XG5cdFx0Y29uc3QgbGF0aXR1ZGUgPSBnZW9Mb2NEYXRhLmdldFV0ZlN0cmluZygnbGF0aXR1ZGUnKTtcblx0XHRjb25zdCBsb25naXR1ZGUgPSBnZW9Mb2NEYXRhLmdldFV0ZlN0cmluZygnbG9uZ2l0dWRlJyk7XG5cblx0XHQvLyBTaG93IGxvY2F0aW9uXG5cdFx0JCgnI3pubS1nZW9Mb2NhdGlvbkxiJykudGV4dChsb2NhdGlvbik7XG5cblx0XHQvLyBMb2cgZXJyb3Jcblx0XHRpZiAoZXJyb3IgIT0gJycpXG5cdFx0XHR0aGlzLnNoZWxsQ3RybC5sb2dNZXNzYWdlKGVycm9yLCAnd2FybicpO1xuXG5cdFx0Ly8gRW5hYmxlL2Rpc2FibGUgU2hvdyBtYXAgYnV0dG9uXG5cdFx0aWYgKGxhdGl0dWRlICE9ICcnICYmIGxvbmdpdHVkZSAhPSAnJylcblx0XHR7XG5cdFx0XHQkKCcjem5tLXNob3dNYXBCdCcpLmF0dHIoJ2Rpc2FibGVkJywgZmFsc2UpO1xuXG5cdFx0XHRjb25zdCB1cmwgPSBgaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9tYXBzL3NlYXJjaC8/YXBpPTEmcXVlcnk9JHtOdW1iZXIobGF0aXR1ZGUpICsgJywnICsgTnVtYmVyKGxvbmdpdHVkZSl9YDtcblx0XHRcdCQoJyN6bm0tc2hvd01hcEJ0JykuYXR0cignaHJlZicsIHVybCk7XG5cdFx0fVxuXHR9XG5cblx0X2NsZWFyR2VvTG9jYXRpb25VSSgpXG5cdHtcblx0XHQkKCcjem5tLWdlb0xvY2F0aW9uTGInKS50ZXh0KCcnKTtcblx0XHQkKCcjem5tLXNob3dNYXBCdCcpLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSk7XG5cdFx0JCgnI3pubS1zaG93TWFwQnQnKS5hdHRyKCdocmVmJywgJyMnKTtcblx0fVxuXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdC8vIFBSSVZBVEUgR0VUVEVSU1xuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdGdldCBfYWN0aXZlUGFuZWxUeXBlKClcblx0e1xuXHRcdHJldHVybiB0aGlzLl9hY2NvcmRpb24uc2VsZWN0KCkuZGF0YSgnaXRlbVR5cGUnKTtcblx0fVxuXG5cdGdldCBfc2VsZWN0ZWRab25lKClcblx0e1xuXHRcdHJldHVybiB0aGlzLl96b25lTGlzdEJveC5kYXRhSXRlbSh0aGlzLl96b25lTGlzdEJveC5zZWxlY3QoKSk7XG5cdH1cblxuXHRnZXQgX3NlbGVjdGVkR3JvdXAoKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2dyb3Vwc0Ryb3BEb3duLmRhdGFJdGVtKHRoaXMuX2dyb3Vwc0Ryb3BEb3duLnNlbGVjdCgpKTtcblx0fVxuXG5cdGdldCBfc2VsZWN0ZWRSb29tKClcblx0e1xuXHRcdHJldHVybiB0aGlzLl9yb29tTGlzdEJveC5kYXRhSXRlbSh0aGlzLl9yb29tTGlzdEJveC5zZWxlY3QoKSk7XG5cdH1cblxuXHRnZXQgX3NlbGVjdGVkVXNlcigpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fdXNlckxpc3RCb3guZGF0YUl0ZW0odGhpcy5fdXNlckxpc3RCb3guc2VsZWN0KCkpO1xuXHR9XG5cblx0Z2V0IF9pc0VkaXRpbmcoKVxuXHR7XG5cdFx0cmV0dXJuICh0aGlzLl9tb25pdG9yZWRUeXBlICE9IG51bGwgJiYgdGhpcy5fbW9uaXRvcmVkTmFtZSAhPSBudWxsICYmIHRoaXMuX2lzRWRpdE1vZGUpO1xuXHR9XG59XG4iLCJleHBvcnQgY2xhc3MgUm9vbVByb3BlcnRpZXNEYXRhXG57XG5cdHN0YXRpYyBnZXQgTEFCRUxTKCkge1xuXHRcdGxldCBtYXAgPSBuZXcgTWFwKCk7XG5cblx0XHRtYXAuc2V0KFNGUzJYLlJvb21Qcm9wZXJ0aWVzLk5BTUUsICduYW1lJyk7XG5cdFx0bWFwLnNldChTRlMyWC5Sb29tUHJvcGVydGllcy5HUk9VUF9JRCwgJ2dyb3VwSWQnKTtcblx0XHRtYXAuc2V0KFNGUzJYLlJvb21Qcm9wZXJ0aWVzLk1BWF9VU0VSUywgJ21heFVzZXJzJyk7XG5cdFx0bWFwLnNldChTRlMyWC5Sb29tUHJvcGVydGllcy5NQVhfU1BFQ1RBVE9SUywgJ21heFNwZWN0YXRvcnMnKTtcblx0XHRtYXAuc2V0KFNGUzJYLlJvb21Qcm9wZXJ0aWVzLlVTRVJfQ09VTlQsICd1c2VyQ291bnQnKTtcblx0XHRtYXAuc2V0KFNGUzJYLlJvb21Qcm9wZXJ0aWVzLlNQRUNUQVRPUl9DT1VOVCwgJ3NwZWN0YXRvckNvdW50Jyk7XG5cdFx0bWFwLnNldChTRlMyWC5Sb29tUHJvcGVydGllcy5JU19HQU1FLCAnaXNHYW1lJyk7XG5cdFx0bWFwLnNldChTRlMyWC5Sb29tUHJvcGVydGllcy5JU19QUklWQVRFLCAnaXNQcml2YXRlJyk7XG5cdFx0bWFwLnNldChTRlMyWC5Sb29tUHJvcGVydGllcy5IQVNfRlJFRV9QTEFZRVJfU0xPVFMsICdoYXNGcmVlUGxheWVyU2xvdHMnKTtcblx0XHRtYXAuc2V0KFNGUzJYLlJvb21Qcm9wZXJ0aWVzLklTX1RZUEVfU0ZTR0FNRSwgJ2lzU0ZTR2FtZVR5cGUnKTtcblxuXHRcdHJldHVybiBtYXA7XG5cdH1cblxuXHRzdGF0aWMgZ2V0TGFiZWwocHJvcE5hbWUpXG5cdHtcblx0XHRyZXR1cm4gJ1Jvb20uJyArIFJvb21Qcm9wZXJ0aWVzRGF0YS5MQUJFTFMuZ2V0KHByb3BOYW1lKTtcblx0fVxuXG5cdHN0YXRpYyBnZXQgcHJvcGVydGllc0FycmF5KClcblx0e1xuXHRcdGNvbnN0IGFyciA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgUm9vbVByb3BlcnRpZXNEYXRhLkxBQkVMUy5lbnRyaWVzKCkpXG5cdFx0e1xuXHRcdFx0YXJyLnB1c2goe1xuXHRcdFx0XHRsYWJlbDogUm9vbVByb3BlcnRpZXNEYXRhLmdldExhYmVsKGtleSksXG5cdFx0XHRcdHZhbHVlOiBrZXlcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdHJldHVybiBhcnI7XG5cdH1cbn1cblxuZXhwb3J0IGNsYXNzIFVzZXJQcm9wZXJ0aWVzRGF0YVxue1xuXHRzdGF0aWMgZ2V0IExBQkVMUygpIHtcblx0XHRsZXQgbWFwID0gbmV3IE1hcCgpO1xuXG5cdFx0bWFwLnNldChTRlMyWC5Vc2VyUHJvcGVydGllcy5OQU1FLCAnbmFtZScpO1xuXHRcdG1hcC5zZXQoU0ZTMlguVXNlclByb3BlcnRpZXMuSVNfUExBWUVSLCAnaXNQbGF5ZXInKTtcblx0XHRtYXAuc2V0KFNGUzJYLlVzZXJQcm9wZXJ0aWVzLklTX1NQRUNUQVRPUiwgJ2lzU3BlY3RhdG9yJyk7XG5cdFx0bWFwLnNldChTRlMyWC5Vc2VyUHJvcGVydGllcy5JU19OUEMsICdpc05QQycpO1xuXHRcdG1hcC5zZXQoU0ZTMlguVXNlclByb3BlcnRpZXMuUFJJVklMRUdFX0lELCAncHJpdmlsZWdlSWQnKTtcblxuXHRcdHJldHVybiBtYXA7XG5cdH1cblxuXHRzdGF0aWMgZ2V0TGFiZWwocHJvcE5hbWUpXG5cdHtcblx0XHRyZXR1cm4gJ1VzZXIuJyArIFVzZXJQcm9wZXJ0aWVzRGF0YS5MQUJFTFMuZ2V0KHByb3BOYW1lKTtcblx0fVxuXG5cdHN0YXRpYyBnZXQgcHJvcGVydGllc0FycmF5KClcblx0e1xuXHRcdGNvbnN0IGFyciA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgVXNlclByb3BlcnRpZXNEYXRhLkxBQkVMUy5lbnRyaWVzKCkpXG5cdFx0e1xuXHRcdFx0YXJyLnB1c2goe1xuXHRcdFx0XHRsYWJlbDogVXNlclByb3BlcnRpZXNEYXRhLmdldExhYmVsKGtleSksXG5cdFx0XHRcdHZhbHVlOiBrZXlcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdHJldHVybiBhcnI7XG5cdH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUM3R0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FDbktBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FDdGFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUN2SEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FDNS9EQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBIiwic291cmNlUm9vdCI6IiJ9
@@ -385,9 +385,6 @@ class ExtensionManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseMo
385
385
  // Create file data source manager
386
386
  this._fileManager = new _managers_file_datasource_manager__WEBPACK_IMPORTED_MODULE_1__["FileDataSourceManager"](libFolder, [libFolder], this._fileSeparator);
387
387
 
388
- // Retrieve HTTP port to be used for files uploading
389
- const uploadHttpPort = data.getInt('httpPort');
390
-
391
388
  // Retrieve module id sent by the server (required because multiple modules use file uploading service)
392
389
  const uploadModuleId = data.getUtfString('modId');
393
390
 
@@ -395,8 +392,9 @@ class ExtensionManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseMo
395
392
  this._uploadTargetConfig = {
396
393
  sessionToken: this.smartFox.sessionToken,
397
394
  host: this.smartFox.config.host,
398
- httpPort: uploadHttpPort,
395
+ port: this.smartFox.config.port,
399
396
  moduleId: uploadModuleId,
397
+ protocol: this.smartFox.config.useSSL ? 'https' : 'http'
400
398
  };
401
399
 
402
400
  // Request Extension files data to server instance
@@ -479,7 +477,7 @@ class ExtensionManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseMo
479
477
  if (requester == this.smartFox.mySelf.name)
480
478
  {
481
479
  // Expand parent
482
- this._filesList.expand($(`#exm-fileList .file-controls[data-item-id="${parentPath}"]`).closest('tr'));
480
+ this._filesList.expand($(`#exm-fileList .file-controls[data-item-id="${$.escapeSelector(parentPath)}"]`).closest('tr'));
483
481
 
484
482
  if (!isUpload)
485
483
  {
@@ -487,7 +485,7 @@ class ExtensionManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseMo
487
485
  this._addFolderModal.modal('hide');
488
486
 
489
487
  // Select upload file
490
- this._filesList.select($(`#exm-fileList .file-controls[data-item-id="${filePath}"]`).closest('tr'));
488
+ this._filesList.select($(`#exm-fileList .file-controls[data-item-id="${$.escapeSelector(filePath)}"]`).closest('tr'));
491
489
  }
492
490
 
493
491
  // Update selection
@@ -537,7 +535,7 @@ class ExtensionManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseMo
537
535
 
538
536
  // Collapse parent if the last of its children was deleted
539
537
  if (parentItem && !parentItem.hasChildren)
540
- this._filesList.collapse($(`#exm-fileList .file-controls[data-item-id="${parentItem.id}"]`).closest('tr'));
538
+ this._filesList.collapse($(`#exm-fileList .file-controls[data-item-id="${$.escapeSelector(parentItem.id)}"]`).closest('tr'));
541
539
  }
542
540
 
543
541
  if (requester == this.smartFox.mySelf.name)
@@ -584,7 +582,7 @@ class ExtensionManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseMo
584
582
  {
585
583
  // Hide control buttons on currently selected item
586
584
  if (this._selectedItem)
587
- $(`#exm-fileList .file-controls[data-item-id="${this._selectedItem.id}"]`).hide();
585
+ $(`#exm-fileList .file-controls[data-item-id="${$.escapeSelector(this._selectedItem.id)}"]`).hide();
588
586
 
589
587
  // Get selected item
590
588
  let selectedRows = this._filesList.select();
@@ -595,7 +593,7 @@ class ExtensionManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseMo
595
593
  this._selectedItem = this._filesList.dataItem(selectedRows[0]);
596
594
 
597
595
  // Show control buttons on new selected item
598
- $(`#exm-fileList .file-controls[data-item-id="${this._selectedItem.id}"]`).show();
596
+ $(`#exm-fileList .file-controls[data-item-id="${$.escapeSelector(this._selectedItem.id)}"]`).show();
599
597
  }
600
598
  else
601
599
  this._selectedItem = null;
@@ -659,8 +657,8 @@ class ExtensionManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseMo
659
657
  $('#exm-clearFilesBt').attr('disabled', true);
660
658
 
661
659
  // Set destination url
662
- const url = 'http://' + this._uploadTargetConfig.host + ':' + this._uploadTargetConfig.httpPort + '/BlueBox/SFS2XFileUpload?sessHashId=' + this._uploadTargetConfig.sessionToken;
663
-
660
+ const url = this._uploadTargetConfig.protocol + '://' + this._uploadTargetConfig.host + ':' + this._uploadTargetConfig.port + '/BlueBox/SFS2XFileUpload?sessHashId=' + this._uploadTargetConfig.sessionToken;
661
+
664
662
  e.sender.options.async.saveUrl = url;
665
663
 
666
664
  // Set payload
@@ -798,4 +796,4 @@ class ExtensionManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseMo
798
796
  /***/ })
799
797
 
800
798
  }]);
801
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXRzL2pzL2NvcmUvbW9kdWxlcy9tb2R1bGUtNi5idW5kbGUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9tYW5hZ2Vycy9maWxlLWRhdGFzb3VyY2UtbWFuYWdlci5qcyIsIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9tb2R1bGVzL2V4dGVuc2lvbi1tYW5hZ2VyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBGaWxlRGF0YVNvdXJjZU1hbmFnZXJcbntcblx0Y29uc3RydWN0b3IobGliRm9sZGVyLCBwcm90ZWN0ZWRGb2xkZXJzLCBmaWxlU2VwYXJhdG9yKVxuXHR7XG5cdFx0dGhpcy5fcHJvdGVjdGVkRm9sZGVycyA9IHByb3RlY3RlZEZvbGRlcnM7IC8vIEZvbGRlcnMgd2hpY2ggY2FuJ3QgYmUgZGVsZXRlZCAoYnV0IHRoZWlyIGNvbnRlbnQgY2FuKVxuXHRcdHRoaXMuX2xpYkZvbGRlciA9IGxpYkZvbGRlcjtcblx0XHR0aGlzLl9maWxlU2VwYXJhdG9yID0gZmlsZVNlcGFyYXRvcjtcblx0fVxuXG5cdGdldCBkYXRhU291cmNlKClcblx0e1xuXHRcdHJldHVybiB0aGlzLl9kYXRhU291cmNlO1xuXHR9XG5cblx0aW5pdCgpXG5cdHtcblx0XHR0aGlzLl9kYXRhU291cmNlID0gbmV3IGtlbmRvLmRhdGEuVHJlZUxpc3REYXRhU291cmNlKHtcblx0XHRcdGRhdGE6IFtdLFxuXHRcdFx0c2NoZW1hOiB7XG5cdFx0XHRcdG1vZGVsOiB7XG5cdFx0XHRcdFx0aWQ6ICdpZCcsXG5cdFx0XHRcdFx0cGFyZW50SWQ6ICdwYXJlbnRJZCcsXG5cdFx0XHRcdFx0ZXhwYW5kZWQ6IGZhbHNlXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRzb3J0OiB7IGZpZWxkOiAnbmFtZScsIGRpcjogJ2FzYycgfVxuXHRcdH0pO1xuXHR9XG5cblx0YWRkRmlsZShmaWxlT2JqLCBwYXJlbnRMZXZlbCA9IG51bGwpXG5cdHtcblx0XHRsZXQgZmlsZSA9IHt9O1xuXG5cdFx0ZmlsZS5uYW1lID0gZmlsZU9iai5nZXRVdGZTdHJpbmcoJ25hbWUnKTtcblx0XHRmaWxlLmlzRGlyID0gZmlsZU9iai5nZXRCb29sKCdpc0RpcicpO1xuXHRcdGZpbGUubGFzdE1vZCA9IGZpbGVPYmouZ2V0TG9uZygnbGFzdE1vZCcpO1xuXHRcdGZpbGUuaXNMaWIgPSAoZmlsZS5pc0RpciAmJiBmaWxlLm5hbWUgPT0gdGhpcy5fbGliRm9sZGVyKTtcblx0XHRmaWxlLmlzUHJvdGVjdGVkID0gKGZpbGUuaXNEaXIgJiYgdGhpcy5fcHJvdGVjdGVkRm9sZGVycy5pbmRleE9mKGZpbGUubmFtZSkgPiAtMSk7XG5cdFx0ZmlsZS5zaXplID0gMDtcblxuXHRcdGlmIChwYXJlbnRMZXZlbCA9PSBudWxsKVxuXHRcdFx0ZmlsZS5sZXZlbCA9IDA7XG5cdFx0ZWxzZVxuXHRcdFx0ZmlsZS5sZXZlbCA9IHBhcmVudExldmVsICsgMTtcblxuXHRcdGlmIChmaWxlT2JqLmNvbnRhaW5zS2V5KCdwYXJlbnQnKSlcblx0XHR7XG5cdFx0XHRmaWxlLnBhcmVudElkID0gZmlsZU9iai5nZXRVdGZTdHJpbmcoJ3BhcmVudCcpO1xuXHRcdFx0ZmlsZS5pZCA9IGZpbGUucGFyZW50SWQgKyB0aGlzLl9maWxlU2VwYXJhdG9yICsgZmlsZS5uYW1lO1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0ZmlsZS5wYXJlbnRJZCA9IG51bGw7XG5cdFx0XHRmaWxlLmlkID0gZmlsZS5uYW1lO1xuXHRcdH1cblxuXHRcdC8vIEFkZCBjaGlsZCBmaWxlc1xuXHRcdGlmIChmaWxlLmlzRGlyKVxuXHRcdHtcblx0XHRcdGxldCBmaWxlc0FyciA9IGZpbGVPYmouZ2V0U0ZTQXJyYXkoJ2ZpbGVzJyk7XG5cblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgZmlsZXNBcnIuc2l6ZSgpOyBpKyspXG5cdFx0XHRcdGZpbGUuc2l6ZSArPSB0aGlzLmFkZEZpbGUoZmlsZXNBcnIuZ2V0U0ZTT2JqZWN0KGkpLCBmaWxlLmxldmVsKTtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdFx0ZmlsZS5zaXplID0gZmlsZU9iai5nZXRMb25nKCdzaXplJyk7XG5cblx0XHQvLyBBZGQgZmlsZSB0byBkYXRhIHNvdXJjZVxuXHRcdHRoaXMuX2RhdGFTb3VyY2UuYWRkKGZpbGUpO1xuXG5cdFx0Ly8gUmV0dXJuIGZpbGUgc2l6ZVxuXHRcdHJldHVybiBmaWxlLnNpemU7XG5cdH1cblxuXHRyZW1vdmVGaWxlKGlkKVxuXHR7XG5cdFx0bGV0IGZpbGVJdGVtID0gdGhpcy5fZGF0YVNvdXJjZS5nZXQoaWQpO1xuXG5cdFx0aWYgKGZpbGVJdGVtKVxuXHRcdHtcblx0XHRcdGlmIChmaWxlSXRlbS5wYXJlbnRJZClcblx0XHRcdHtcblx0XHRcdFx0Ly8gU3VidHJhY3Qgb2xkIHNpemUgZnJvbSBwYXJlbnQgc2l6ZVxuXHRcdFx0XHRsZXQgcGFyZW50SXRlbSA9IHRoaXMuX2RhdGFTb3VyY2UuZ2V0KGZpbGVJdGVtLnBhcmVudElkKTtcblx0XHRcdFx0dGhpcy5fdXBkYXRlUGFyZW50U2l6ZShwYXJlbnRJdGVtLCAtZmlsZUl0ZW0uc2l6ZSk7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuX2RhdGFTb3VyY2UucmVtb3ZlKGZpbGVJdGVtKTtcblxuXHRcdFx0Ly8gUmV0dXJuIHBhcmVudCBpdGVtXG5cdFx0XHRpZiAoZmlsZUl0ZW0ucGFyZW50SWQpXG5cdFx0XHRcdHJldHVybiB0aGlzLl9kYXRhU291cmNlLmdldChmaWxlSXRlbS5wYXJlbnRJZCk7XG5cdFx0fVxuXHR9XG5cblx0Z2V0RmlsZUJ5SWQoaWQpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fZGF0YVNvdXJjZS5nZXQoaWQpO1xuXHR9XG5cblx0YWRkRmlsZVRvUGFyZW50KGZpbGVPYmosIHBhcmVudElkKVxuXHR7XG5cdFx0bGV0IHBhcmVudEl0ZW0gPSB0aGlzLl9kYXRhU291cmNlLmdldChwYXJlbnRJZCk7XG5cblx0XHRpZiAocGFyZW50SXRlbSAhPSBudWxsICYmIHBhcmVudEl0ZW0uaXNEaXIpXG5cdFx0e1xuXHRcdFx0Y29uc3QgZmlsZUlkID0gcGFyZW50SWQgKyB0aGlzLl9maWxlU2VwYXJhdG9yICsgZmlsZU9iai5nZXRVdGZTdHJpbmcoJ25hbWUnKTtcblx0XHRcdGxldCBmaWxlSXRlbSA9IHRoaXMuX2RhdGFTb3VyY2UuZ2V0KGZpbGVJZCk7XG5cblx0XHRcdGlmIChmaWxlSXRlbSAhPSBudWxsKVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBTdWJ0cmFjdCBvbGQgc2l6ZSBmcm9tIHBhcmVudCBzaXplXG5cdFx0XHRcdHRoaXMuX3VwZGF0ZVBhcmVudFNpemUocGFyZW50SXRlbSwgLWZpbGVJdGVtLnNpemUpO1xuXG5cdFx0XHRcdC8vIFVwZGF0ZSBleGlzdGluZyBpdGVtXG5cdFx0XHRcdGZpbGVJdGVtLm5hbWUgPSBmaWxlT2JqLmdldFV0ZlN0cmluZygnbmFtZScpO1xuXHRcdFx0XHRmaWxlSXRlbS5sYXN0TW9kID0gZmlsZU9iai5nZXRMb25nKCdsYXN0TW9kJyk7XG5cdFx0XHRcdGZpbGVJdGVtLnNpemUgPSBmaWxlT2JqLmdldExvbmcoJ3NpemUnKTtcblx0XHRcdH1cblx0XHRcdGVsc2Vcblx0XHRcdHtcblx0XHRcdFx0Ly8gQWRkIG5ldyBpdGVtXG5cdFx0XHRcdHRoaXMuYWRkRmlsZShmaWxlT2JqLCBwYXJlbnRJdGVtLmxldmVsKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVXBkYXRlIHBhcmVudCBpdGVtIHNpemVcblx0XHRcdHRoaXMuX3VwZGF0ZVBhcmVudFNpemUocGFyZW50SXRlbSwgZmlsZU9iai5nZXRMb25nKCdzaXplJykpO1xuXG5cdFx0XHRyZXR1cm4gZmlsZUlkO1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYEFuIHVuZXhwZWN0ZWQgZXJyb3Igb2NjdXJyZWQgd2hpbGUgYWRkaW5nIGZpbGUgJyR7ZmlsZU9iai5nZXRVdGZTdHJpbmcoJ25hbWUnKX0nICh0YXJnZXQ6ICR7cGFyZW50SWR9KS5gKTtcblx0fVxuXG5cdF91cGRhdGVQYXJlbnRTaXplKHBhcmVudEl0ZW0sIHZhbHVlKVxuXHR7XG5cdFx0cGFyZW50SXRlbS5zaXplICs9IHZhbHVlO1xuXG5cdFx0aWYgKHBhcmVudEl0ZW0ucGFyZW50SWQpXG5cdFx0e1xuXHRcdFx0bGV0IGdyYW5kUGFyZW50ID0gdGhpcy5fZGF0YVNvdXJjZS5nZXQocGFyZW50SXRlbS5wYXJlbnRJZCk7XG5cdFx0XHR0aGlzLl91cGRhdGVQYXJlbnRTaXplKGdyYW5kUGFyZW50LCB2YWx1ZSk7XG5cdFx0fVxuXHR9XG59XG4iLCJpbXBvcnQge0Jhc2VNb2R1bGV9IGZyb20gJy4vYmFzZS1tb2R1bGUnO1xuaW1wb3J0IHtGaWxlRGF0YVNvdXJjZU1hbmFnZXJ9IGZyb20gJy4uL21hbmFnZXJzL2ZpbGUtZGF0YXNvdXJjZS1tYW5hZ2VyJztcbmltcG9ydCB7Ynl0ZXNUb1NpemV9IGZyb20gJy4uL3V0aWxzL3V0aWxpdGllcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEV4dGVuc2lvbk1hbmFnZXIgZXh0ZW5kcyBCYXNlTW9kdWxlXG57XG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHQgICAgc3VwZXIoJ2V4dGVuc2lvbk1hbicpO1xuXG5cdFx0Ly8gT3V0Z29pbmcgcmVxdWVzdHNcblx0XHR0aGlzLlJFUV9JTklUID0gJ2luaXQnO1xuXHRcdHRoaXMuUkVRX0dFVF9FWFRFTlNJT05TID0gJ2dldEV4dGVuc2lvbnMnO1xuXHRcdHRoaXMuUkVRX0NSRUFURV9GT0xERVIgPSAnY3JlYXRlRm9sZGVyJztcblx0XHR0aGlzLlJFUV9ERUxFVEVfRklMRVMgPSAnZGVsZXRlRXh0RmlsZXMnO1xuXHRcdHRoaXMuUkVRX1JFTE9BRF9FWFRFTlNJT05TID0gJ3JlbG9hZEV4dCc7XG5cblx0XHQvLyBJbmNvbWluZyByZXNwb25zZXNcblx0XHR0aGlzLlJFU1BfTE9DS0VEID0gJ2xvY2snO1xuXHRcdHRoaXMuUkVTUF9JTklUID0gJ2luaXQnO1xuXHRcdHRoaXMuUkVTUF9FWFRFTlNJT05TID0gJ2V4dGVuc2lvbnMnO1xuXHRcdHRoaXMuUkVTUF9GSUxFX0FEREVEID0gJ2ZpbGVBZGRlZCc7XG5cdFx0dGhpcy5SRVNQX0ZJTEVTX0RFTEVURUQgPSAnZmlsZXNEZWxldGVkJztcblx0XHR0aGlzLlJFU1BfRVJST1IgPSAnZXJyb3InO1xuXHR9XG5cblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0Ly8gQ09NTU9OIE1PRFVMRSBJTlRFUkZBQ0UgTUVUSE9EU1xuXHQvLyBUaGlzIG1lbWJlcnMgYXJlIHVzZWQgYnkgdGhlIG1haW4gY29udHJvbGxlclxuXHQvLyB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBtb2R1bGUncyBjb250cm9sbGVyLlxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdGluaXRpYWxpemUoaWREYXRhLCBzaGVsbENvbnRyb2xsZXIpXG5cdHtcblx0XHQvLyBDYWxsIHN1cGVyIG1ldGhvZFxuXHRcdHN1cGVyLmluaXRpYWxpemUoaWREYXRhLCBzaGVsbENvbnRyb2xsZXIpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBwcm9ncmVzcyBiYXJcblx0XHQkKCcjZXhtLXByb2dyZXNzQmFyJykua2VuZG9Qcm9ncmVzc0Jhcih7XG5cdFx0XHRtaW46IDAsXG4gICAgICAgICAgICBtYXg6IDEwMCxcblx0XHRcdHZhbHVlOiBmYWxzZSxcbiAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsXG4gICAgICAgICAgICBhbmltYXRpb246IHtcbiAgICAgICAgICAgICAgICBkdXJhdGlvbjogNDAwXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG5cdFx0Ly8gQWRkIGxpc3RlbmVycyB0byBidXR0b25zXG5cdFx0JCgnI2V4bS1yZXRyeUJ0Jykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vblJldHJ5Q2xpY2ssIHRoaXMpKTtcblx0XHQkKCcjZXhtLXJlZnJlc2hCdCcpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25SZWZyZXNoQ2xpY2ssIHRoaXMpKTtcblxuXHRcdC8vIEluaXRpYWxpemUgZmlsZXMgbGlzdFxuXHRcdHRoaXMuX2ZpbGVzTGlzdCA9ICQoJyNleG0tZmlsZUxpc3QnKS5rZW5kb1RyZWVMaXN0KHtcbiAgICAgICAgICAgIGRhdGFTb3VyY2U6IFtdLFxuXHRcdFx0cmVzaXphYmxlOiB0cnVlLFxuXHRcdFx0c2VsZWN0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbHVtbnM6IFtcbiAgICAgICAgICAgICAgICB7XG5cdFx0XHRcdFx0ZmllbGQ6ICduYW1lJyxcblx0XHRcdFx0XHR0aXRsZTogJ05hbWUnLFxuXHRcdFx0XHRcdHRlbXBsYXRlOiBrZW5kby50ZW1wbGF0ZShgXG5cdFx0XHRcdFx0XHQ8ZGl2ID5cblx0XHRcdFx0XHRcdFx0IyBpZiAoaXNEaXIpIHsgI1xuXHRcdFx0XHRcdFx0XHRcdCMgaWYgKGV4cGFuZGVkKSB7ICNcblx0XHRcdFx0XHRcdFx0XHRcdDxpIGNsYXNzPVwiZmFzIGZhLWZvbGRlci1vcGVuXCI+PC9pPlxuXHRcdFx0XHRcdFx0XHRcdCMgfSBlbHNlIHsgI1xuXHRcdFx0XHRcdFx0XHRcdFx0PGkgY2xhc3M9XCJmYXMgZmEtZm9sZGVyXCI+PC9pPlxuXHRcdFx0XHRcdFx0XHRcdCMgfSAjXG5cdFx0XHRcdFx0XHRcdCMgfSBlbHNlIHsgI1xuXHRcdFx0XHRcdFx0XHRcdDxpIGNsYXNzPVwiZmFyIGZhLWZpbGVcIj48L2k+XG5cdFx0XHRcdFx0XHRcdCMgfSAjXG5cblx0XHRcdFx0XHRcdFx0IzogbmFtZSAjXG5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImZpbGUtY29udHJvbHMgZmxleC1ncm93LTEgdGV4dC1yaWdodFwiIGRhdGEtaXRlbS1pZD1cIiM6aWQjXCI+XG5cdFx0XHRcdFx0XHRcdCMgaWYgKGlzRGlyKSB7ICNcblx0XHRcdFx0XHRcdFx0XHQ8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImstYnV0dG9uIGstcHJpbWFyeSBteS0xIGNyZWF0ZS1mb2xkZXItYnRcIj48aSBjbGFzcz1cImZhcyBmYS1mb2xkZXItcGx1c1wiPjwvaT48L2J1dHRvbj5cblx0XHRcdFx0XHRcdFx0XHQjIGlmIChsZXZlbCA+IDApIHsgI1xuXHRcdFx0XHRcdFx0XHRcdFx0PGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJrLWJ1dHRvbiBrLXByaW1hcnkgbXktMSB1cGxvYWQtZmlsZXMtYnRcIj48aSBjbGFzcz1cImZhcyBmYS1maWxlLXVwbG9hZFwiPjwvaT48L2J1dHRvbj5cblx0XHRcdFx0XHRcdFx0XHQjIH0gI1xuXHRcdFx0XHRcdFx0XHQjIH0gI1xuXG5cdFx0XHRcdFx0XHRcdCMgaWYgKGxldmVsID4gMCAmJiAhaXNQcm90ZWN0ZWQpIHsgI1xuXHRcdFx0XHRcdFx0XHRcdDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiay1idXR0b24gay1wcmltYXJ5IG15LTEgcmVtb3ZlLWZpbGUtYnRcIj48aSBjbGFzcz1cImZhcyBmYS1taW51cy1jaXJjbGVcIj48L2k+PC9idXR0b24+XG5cdFx0XHRcdFx0XHRcdCMgfSAjXG5cblx0XHRcdFx0XHRcdFx0IyBpZiAobGV2ZWwgPT0gMSAmJiAhaXNMaWIpIHsgI1xuXHRcdFx0XHRcdFx0XHRcdDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiay1idXR0b24gay1wcmltYXJ5IG15LTEgcmVsb2FkLWV4dC1idFwiPjxpIGNsYXNzPVwiZmFzIGZhLXJlZG8tYWx0XCI+PC9pPjwvYnV0dG9uPlxuXHRcdFx0XHRcdFx0XHQjIH0gI1xuXHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0YCksXG5cdFx0XHRcdH0sXG4gICAgICAgICAgICAgICAge1xuXHRcdFx0XHRcdGZpZWxkOiAnc2l6ZScsXG5cdFx0XHRcdFx0dGl0bGU6ICdTaXplJyxcblx0XHRcdFx0XHR0ZW1wbGF0ZTogZnVuY3Rpb24oZGF0YUl0ZW0pIHtcblx0XHRcdFx0XHRcdGRhdGFJdGVtLmJ5dGVzVG9TaXplID0gYnl0ZXNUb1NpemU7IC8vIFBhc3MgYnl0ZXNUb1NpemUgdXRpbGl0eSBmdW5jdGlvbiB0byB0ZW1wbGF0ZVxuXHRcdFx0XHRcdFx0cmV0dXJuIGtlbmRvLnRlbXBsYXRlKGBcblx0XHRcdFx0XHRcdFx0IzogYnl0ZXNUb1NpemUoc2l6ZSwgMiwgJ0tCJykgI1xuXHRcdFx0XHRcdFx0YCkoZGF0YUl0ZW0pO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0d2lkdGg6IDEyMCxcblx0XHRcdFx0XHRtaW5TY3JlZW5XaWR0aDogNTc2XG5cdFx0XHRcdH0sXG4gICAgICAgICAgICAgICAge1xuXHRcdFx0XHRcdGZpZWxkOiAnbGFzdE1vZCcsXG5cdFx0XHRcdFx0dGl0bGU6ICdMYXN0IE1vZGlmaWVkJyxcblx0XHRcdFx0XHR0ZW1wbGF0ZToga2VuZG8udGVtcGxhdGUoYFxuXHRcdFx0XHRcdFx0Izoga2VuZG8udG9TdHJpbmcobmV3IERhdGUobGFzdE1vZCksICdkZCBNTU0geXl5eSBISDptbTpzcycpICNcblx0XHRcdFx0XHRgKSxcblx0XHRcdFx0XHR3aWR0aDogMjAwLFxuXHRcdFx0XHRcdG1pblNjcmVlbldpZHRoOiA3Njhcblx0XHRcdFx0fSxcbiAgICAgICAgICAgIF0sXG5cdFx0XHRjaGFuZ2U6ICQucHJveHkodGhpcy5fb25GaWxlU2VsZWN0ZWRDaGFuZ2UsIHRoaXMpXG4gICAgICAgIH0pLmRhdGEoJ2tlbmRvVHJlZUxpc3QnKTtcblxuXHRcdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdFx0Ly8gQWRkIGxpc3RlbmVycyB0byBjYXRjaCBjb250cm9sIGJ1dHRvbiBjbGlja3Mgb24gcm93c1xuXHRcdCQoJyNleG0tZmlsZUxpc3QnKS5vbignY2xpY2snLCAnLmNyZWF0ZS1mb2xkZXItYnQnLCAkLnByb3h5KHRoaXMuX3Nob3dBZGRGb2xkZXJNb2RhbENsaWNrLCB0aGlzKSk7XG5cdFx0JCgnI2V4bS1maWxlTGlzdCcpLm9uKCdjbGljaycsICcudXBsb2FkLWZpbGVzLWJ0JywgJC5wcm94eSh0aGlzLl9zaG93VXBsb2FkRmlsZXNNb2RhbENsaWNrLCB0aGlzKSk7XG5cdFx0JCgnI2V4bS1maWxlTGlzdCcpLm9uKCdjbGljaycsICcucmVtb3ZlLWZpbGUtYnQnLCAkLnByb3h5KHRoaXMuX29uUmVtb3ZlRmlsZUNsaWNrLCB0aGlzKSk7XG5cdFx0JCgnI2V4bS1maWxlTGlzdCcpLm9uKCdjbGljaycsICcucmVsb2FkLWV4dC1idCcsICQucHJveHkodGhpcy5fb25SZWxvYWRFeHRDbGljaywgdGhpcykpO1xuXG5cdFx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0XHQvLyBJbml0aWFsaXplIFwiYWRkIGZvbGRlclwiIG1vZGFsXG5cdFx0dGhpcy5fYWRkRm9sZGVyTW9kYWwgPSAkKCcjZXhtLWFkZEZvbGRlck1vZGFsJyk7XG5cdFx0dGhpcy5fYWRkRm9sZGVyTW9kYWwubW9kYWwoe1xuXHRcdFx0YmFja2Ryb3A6ICdzdGF0aWMnLFxuXHRcdFx0a2V5Ym9hcmQ6IGZhbHNlLFxuXHRcdFx0c2hvdzogZmFsc2Vcblx0XHR9KTtcblxuXHRcdC8vIEFkZCBsaXN0ZW5lciB0byBtb2RhbCBoaWRlIGV2ZW50XG5cdFx0dGhpcy5fYWRkRm9sZGVyTW9kYWwub24oJ2hpZGRlbi5icy5tb2RhbCcsICQucHJveHkodGhpcy5fb25BZGRGb2xkZXJNb2RhbEhpZGRlbiwgdGhpcykpO1xuXG5cdFx0Ly8gQWRkIGxpc3RlbmVyIHRvIEFkZCBidXR0b24gY2xpY2tcblx0XHQkKCcjZXhtLWFkZEZvbGRlckJ0Jykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vbkFkZEZvbGRlckNsaWNrLCB0aGlzKSk7XG5cblx0XHQvLyBJbml0aWFsaXplIGtlbmRvIHZhbGlkYXRpb24gb24gZm9sZGVyIG5hbWUgZm9ybVxuXHRcdHRoaXMuX2FkZEZvbGRlclZhbGlkYXRvciA9ICQoJyNleG0tYWRkRm9sZGVyRm9ybScpLmtlbmRvVmFsaWRhdG9yKHt9KS5kYXRhKCdrZW5kb1ZhbGlkYXRvcicpO1xuXG5cdFx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0XHQvLyBJbml0aWFsaXplIFwidXBsb2FkIGZpbGVzXCIgbW9kYWxcblx0XHR0aGlzLl91cGxvYWRGaWxlc01vZGFsID0gJCgnI2V4bS11cGxvYWRNb2RhbCcpO1xuXHRcdHRoaXMuX3VwbG9hZEZpbGVzTW9kYWwubW9kYWwoe1xuXHRcdFx0YmFja2Ryb3A6ICdzdGF0aWMnLFxuXHRcdFx0a2V5Ym9hcmQ6IGZhbHNlLFxuXHRcdFx0c2hvdzogZmFsc2Vcblx0XHR9KTtcblxuXHRcdC8vIEluaXRpYWxpemUga2VuZG8gdXBsb2FkZXJcblx0XHR0aGlzLl91cGxvYWRlciA9ICQoJyNleG0tdXBsb2FkZXInKS5rZW5kb1VwbG9hZCh7XG5cdFx0XHRtdWx0aXBsZTogdHJ1ZSxcblx0XHRcdGFzeW5jOiB7XG5cdFx0XHRcdHNhdmVVcmw6ICdodHRwOi8vbG9jYWxob3N0JywgLy8gVGhpcyB3aWxsIGJlIGNoYW5nZWQgbGF0ZXIgaW4gX29uVXBsb2FkU3RhcnQgbWV0aG9kXG5cdFx0XHRcdGF1dG9VcGxvYWQ6IHRydWUsXG5cdFx0XHR9LFxuXHRcdFx0ZGlyZWN0b3J5RHJvcDogdHJ1ZSxcblx0XHRcdHVwbG9hZDogJC5wcm94eSh0aGlzLl9vblVwbG9hZFN0YXJ0LCB0aGlzKSxcblx0XHRcdGNvbXBsZXRlOiAkLnByb3h5KHRoaXMuX29uVXBsb2FkRW5kLCB0aGlzKSxcblx0XHRcdGxvY2FsaXphdGlvbjoge1xuXHRcdFx0XHRzZWxlY3Q6ICdTZWxlY3QgZmlsZXMuLi4nXG5cdFx0XHR9XG5cdFx0fSkuZGF0YSgna2VuZG9VcGxvYWQnKTtcblxuXHRcdC8vIEFkZCBsaXN0ZW5lciB0byBVcGxvYWQgYnV0dG9uIGNsaWNrXG5cdFx0JCgnI2V4bS1jbGVhckZpbGVzQnQnKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uQ2xlYXJGaWxlc0NsaWNrLCB0aGlzKSk7XG5cblx0XHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRcdC8vIFNlbmQgaW5pdGlhbGl6YXRpb24gcmVxdWVzdFxuXHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfSU5JVCk7XG5cdH1cblxuXHRkZXN0cm95KClcblx0e1xuXHRcdC8vIENhbGwgc3VwZXIgbWV0aG9kXG5cdFx0c3VwZXIuZGVzdHJveSgpO1xuXG5cdFx0JCgnI2V4bS1yZXRyeUJ0Jykub2ZmKCdjbGljaycpO1xuXHRcdCQoJyNleG0tcmVmcmVzaEJ0Jykub2ZmKCdjbGljaycpO1xuXG5cdFx0JCgnI2V4bS1maWxlTGlzdCcpLm9mZignY2xpY2snKTtcblxuXHRcdHRoaXMuX2FkZEZvbGRlck1vZGFsLm9mZignaGlkZGVuLmJzLm1vZGFsJyk7XG5cdFx0dGhpcy5fYWRkRm9sZGVyTW9kYWwubW9kYWwoJ2Rpc3Bvc2UnKTtcblx0XHQkKCcjZXhtLWFkZEZvbGRlckJ0Jykub2ZmKCdjbGljaycpO1xuXG5cdFx0dGhpcy5fdXBsb2FkRmlsZXNNb2RhbC5tb2RhbCgnZGlzcG9zZScpO1xuXHRcdCQoJyNleG0tY2xlYXJGaWxlc0J0Jykub2ZmKCdjbGljaycpO1xuXHR9XG5cblx0b25FeHRlbnNpb25Db21tYW5kKGNvbW1hbmQsIGRhdGEpXG5cdHtcblx0XHQvLyBNb2R1bGUgY2FuIGJlIGVuYWJsZWQgKG5vIGxvY2tpbmcgZmlsZSBleGlzdHMpXG5cdFx0aWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX0lOSVQpXG5cdFx0e1xuXHRcdFx0Ly8gUmV0cmlldmUgZmlsZSBzZXBhcmF0b3Jcblx0XHRcdHRoaXMuX2ZpbGVTZXBhcmF0b3IgPSBkYXRhLmdldFV0ZlN0cmluZygnc2VwJyk7XG5cblx0XHRcdC8vIFJldHJpZXZlIEV4dGVuc2lvbnMnIF9fbGliX18gZm9sZGVyIG5hbWVcblx0XHRcdGNvbnN0IGxpYkZvbGRlciA9IGRhdGEuZ2V0VXRmU3RyaW5nKCdsaWInKTtcblxuXHRcdFx0Ly8gQ3JlYXRlIGZpbGUgZGF0YSBzb3VyY2UgbWFuYWdlclxuXHRcdFx0dGhpcy5fZmlsZU1hbmFnZXIgPSBuZXcgRmlsZURhdGFTb3VyY2VNYW5hZ2VyKGxpYkZvbGRlciwgW2xpYkZvbGRlcl0sIHRoaXMuX2ZpbGVTZXBhcmF0b3IpO1xuXG5cdFx0XHQvLyBSZXRyaWV2ZSBIVFRQIHBvcnQgdG8gYmUgdXNlZCBmb3IgZmlsZXMgdXBsb2FkaW5nXG5cdFx0XHRjb25zdCB1cGxvYWRIdHRwUG9ydCA9IGRhdGEuZ2V0SW50KCdodHRwUG9ydCcpO1xuXG5cdFx0XHQvLyBSZXRyaWV2ZSBtb2R1bGUgaWQgc2VudCBieSB0aGUgc2VydmVyIChyZXF1aXJlZCBiZWNhdXNlIG11bHRpcGxlIG1vZHVsZXMgdXNlIGZpbGUgdXBsb2FkaW5nIHNlcnZpY2UpXG5cdFx0XHRjb25zdCB1cGxvYWRNb2R1bGVJZCA9IGRhdGEuZ2V0VXRmU3RyaW5nKCdtb2RJZCcpO1xuXG5cdFx0XHQvLyBTZXQgZmlsZSB1cGxvYWRpbmcgdGFyZ2V0IGNvbmZpZ3VyYXRpb25cblx0XHRcdHRoaXMuX3VwbG9hZFRhcmdldENvbmZpZyA9IHtcblx0XHRcdFx0c2Vzc2lvblRva2VuOiB0aGlzLnNtYXJ0Rm94LnNlc3Npb25Ub2tlbixcblx0XHRcdFx0aG9zdDogdGhpcy5zbWFydEZveC5jb25maWcuaG9zdCxcblx0XHRcdFx0aHR0cFBvcnQ6IHVwbG9hZEh0dHBQb3J0LFxuXHRcdFx0XHRtb2R1bGVJZDogdXBsb2FkTW9kdWxlSWQsXG5cdFx0XHR9O1xuXG5cdFx0XHQvLyBSZXF1ZXN0IEV4dGVuc2lvbiBmaWxlcyBkYXRhIHRvIHNlcnZlciBpbnN0YW5jZVxuXHRcdFx0dGhpcy5fcmVmcmVzaERhdGFMaXN0KCk7XG5cdFx0fVxuXG5cdFx0Lypcblx0XHQgKiBUaGlzIHJlc3BvbnNlIGlzIHJldHVybmVkIGlmIHRoZSBmaWxlIFVwbG9hZHNMb2NrLnR4dCBleGlzdHMgaW4gdGhlIC9jb25maWcgZm9sZGVyIG9mIHRoZSBzZXJ2ZXIuXG5cdFx0ICogVGhpcyBpcyBhbiBhZGRpdGlvbmFsIHNlY3VyaXR5IG1lYXN1cmUgdG8gYXZvaWQgdW53YW50ZWQgZmlsZXMgdG8gYmUgdXBsb2FkZWQgYnkgbWFsaWNpdXMgdXNlcnMgYWNjZXNzaW5nIHRoZSBzZXJ2ZXJcblx0XHQgKiB3aXRoIHRoZSBkZWZhdWx0IGNyZWRlbnRpYWxzLCBpbiBjYXNlIHRoZXkgaGF2ZSBub3QgYmVlbiBjaGFuZ2VkIGJ5IHRoZSBhZG1pbmlzdHJhdG9yIGFmdGVyIHRoZSBpbnN0YWxsYXRpb24uXG5cdFx0ICogVGhlIGZpbGUgbXVzdCBiZSByZW1vdmVkIG1hbnVhbGx5IGJlZm9yZSBhY2Nlc3NpbmcgdGhlIEV4dGVuc2lvbiBNYW5hZ2VyIG1vZHVsZSBmb3IgdGhlIGZpcnN0IHRpbWVcblx0XHQgKi9cblx0XHRlbHNlIGlmIChjb21tYW5kID09IHRoaXMuUkVTUF9MT0NLRUQpXG5cdFx0e1xuXHRcdFx0Ly8gU2hvdyB3YXJuaW5nXG5cdFx0XHR0aGlzLl9zd2l0Y2hWaWV3KCdleG0tbG9ja2VkJyk7XG5cdFx0fVxuXG5cdFx0Ly8gRXh0ZW5zaW9ucyBmb2xkZXJzIGFuZCBmaWxlc1xuXHRcdGVsc2UgaWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX0VYVEVOU0lPTlMpXG5cdFx0e1xuXHRcdFx0Ly8gUmV0cmlldmUgRXh0ZW5zaW9uIGZpbGUgbGlzdFxuXHRcdFx0bGV0IGV4dGVuc2lvbnNPYmogPSBkYXRhLmdldFNGU09iamVjdCgnZXh0ZW5zaW9ucycpO1xuXG5cdFx0XHQvLyBJbml0aWFsaXplIG1hbmFnZXJcblx0XHRcdHRoaXMuX2ZpbGVNYW5hZ2VyLmluaXQoKTtcblxuXHRcdFx0Ly8gQWRkIGxpc3QgdG8gbWFuYWdlclxuXHRcdFx0dGhpcy5fZmlsZU1hbmFnZXIuYWRkRmlsZShleHRlbnNpb25zT2JqKTtcblxuXHRcdFx0Ly8gU2V0IFRyZWVMaXN0IGRhdGEgc291cmNlXG5cdFx0XHR0aGlzLl9maWxlc0xpc3Quc2V0RGF0YVNvdXJjZSh0aGlzLl9maWxlTWFuYWdlci5kYXRhU291cmNlKTtcblxuXHRcdFx0Ly8gRXhwYW5kIGZpcnN0IGxldmVsXG5cdFx0XHR0aGlzLl9maWxlc0xpc3QuZXhwYW5kKCQoJyNleG0tZmlsZUxpc3QgdGJvZHk+dHI6ZXEoMCknKSk7XG5cblx0XHRcdC8vIEVuYWJsZSBpbnRlcmZhY2Vcblx0XHRcdHRoaXMuX2VuYWJsZUludGVyZmFjZSh0cnVlKTtcblxuXHRcdFx0Ly8gU2hvdyBtb2R1bGUncyBtYWluIHZpZXdcblx0XHRcdHRoaXMuX3N3aXRjaFZpZXcoJ2V4bS1tYWluJyk7XG5cdFx0fVxuXG5cdFx0Ly8gQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgbWFuYWdpbmcgZXh0ZW5zaW9uIGZpbGVzXG5cdFx0ZWxzZSBpZiAoY29tbWFuZCA9PSB0aGlzLlJFU1BfRVJST1IpXG5cdFx0e1xuXHRcdFx0Ly8gSGlkZSBhZGQgZm9sZGVyIG1vZGFsXG5cdFx0XHR0aGlzLl9hZGRGb2xkZXJNb2RhbC5tb2RhbCgnaGlkZScpO1xuXG5cdFx0XHQvLyBSZS1lbmFibGUgaW50ZXJmYWNlXG5cdFx0XHR0aGlzLl9lbmFibGVJbnRlcmZhY2UodHJ1ZSk7XG5cblx0XHRcdC8vIFNob3cgYW4gYWxlcnRcblx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dTaW1wbGVBbGVydChkYXRhLmdldFV0ZlN0cmluZygnZXJyb3InKSk7XG5cdFx0fVxuXG5cdFx0Ly8gRXh0ZW5zaW9uIGZvbGRlciBvciBmaWxlIGFkZGVkXG5cdFx0ZWxzZSBpZiAoY29tbWFuZCA9PSB0aGlzLlJFU1BfRklMRV9BRERFRClcblx0XHR7XG5cdFx0XHQvLyBHZXQgbmFtZSBvZiB0aGUgdXNlciB3aG8gYWRkZWQgdGhlIGZpbGUvZm9sZGVyXG5cdFx0XHRjb25zdCByZXF1ZXN0ZXIgPSBkYXRhLmdldFV0ZlN0cmluZygndXNlcicpO1xuXG5cdFx0XHQvLyBHZXQgdGhlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGZpbGUvZm9sZGVyIGJlaW5nIGFkZGVkXG5cdFx0XHRjb25zdCBmaWxlT2JqID0gZGF0YS5nZXRTRlNPYmplY3QoJ2ZpbGUnKTtcblxuXHRcdFx0Ly8gR2V0IHRoZSB0YXJnZXQgZm9sZGVyIHdoZXJlIHRoZSBuZXcgZmlsZS9mb2xkZXIgc2hvdWxkIGJlIGFkZGVkXG5cdFx0XHRjb25zdCBwYXJlbnRQYXRoID0gZGF0YS5nZXRVdGZTdHJpbmcoJ3BhcmVudCcpO1xuXG5cdFx0XHQvLyBHZXQgdGhlIGZsYWcgbm90aWZ5aW5nIHRoaXMgd2FzIGEgZmlsZSB1cGxvYWRcblx0XHRcdGNvbnN0IGlzVXBsb2FkID0gZGF0YS5nZXRCb29sKCdpc1VwbG9hZCcpO1xuXG5cdFx0XHR0cnlcblx0XHRcdHtcblx0XHRcdFx0Ly8gQWRkL3VwZGF0ZSBpdGVtIG9uIGRhdGEgc291cmNlXG5cdFx0XHRcdGNvbnN0IGZpbGVQYXRoID0gdGhpcy5fZmlsZU1hbmFnZXIuYWRkRmlsZVRvUGFyZW50KGZpbGVPYmosIHBhcmVudFBhdGgpO1xuXG5cdFx0XHRcdC8vIFJlZnJlc2ggdmlld1xuXHRcdFx0XHR0aGlzLl9maWxlc0xpc3QucmVmcmVzaCgpO1xuXG5cdFx0XHRcdGlmIChyZXF1ZXN0ZXIgPT0gdGhpcy5zbWFydEZveC5teVNlbGYubmFtZSlcblx0XHRcdFx0e1xuXHRcdFx0XHRcdC8vIEV4cGFuZCBwYXJlbnRcblx0XHRcdFx0XHR0aGlzLl9maWxlc0xpc3QuZXhwYW5kKCQoYCNleG0tZmlsZUxpc3QgLmZpbGUtY29udHJvbHNbZGF0YS1pdGVtLWlkPVwiJHtwYXJlbnRQYXRofVwiXWApLmNsb3Nlc3QoJ3RyJykpO1xuXG5cdFx0XHRcdFx0aWYgKCFpc1VwbG9hZClcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHQvLyBIaWRlIG1vZGFsXG5cdFx0XHRcdFx0XHR0aGlzLl9hZGRGb2xkZXJNb2RhbC5tb2RhbCgnaGlkZScpO1xuXG5cdFx0XHRcdFx0XHQvLyBTZWxlY3QgdXBsb2FkIGZpbGVcblx0XHRcdFx0XHRcdHRoaXMuX2ZpbGVzTGlzdC5zZWxlY3QoJChgI2V4bS1maWxlTGlzdCAuZmlsZS1jb250cm9sc1tkYXRhLWl0ZW0taWQ9XCIke2ZpbGVQYXRofVwiXWApLmNsb3Nlc3QoJ3RyJykpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIFVwZGF0ZSBzZWxlY3Rpb25cblx0XHRcdFx0XHR0aGlzLl9vbkZpbGVTZWxlY3RlZENoYW5nZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0e1xuXHRcdFx0XHRcdC8vIERpc3BsYXkgbm90aWZpY2F0aW9uXG5cdFx0XHRcdFx0aWYgKCFpc1VwbG9hZClcblx0XHRcdFx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dOb3RpZmljYXRpb24oYEZvbGRlciBjcmVhdGVkYCwgYEFkbWluaXN0cmF0b3IgJHtyZXF1ZXN0ZXJ9IGNyZWF0ZWQgZm9sZGVyOiA8c3Ryb25nPiR7ZmlsZVBhdGh9PC9zdHJvbmc+YCk7XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0dGhpcy5zaGVsbEN0cmwuc2hvd05vdGlmaWNhdGlvbihgRmlsZSB1cGxvYWRlZGAsIGBBZG1pbmlzdHJhdG9yICR7cmVxdWVzdGVyfSB1cGxvYWRlZCBmaWxlOiA8c3Ryb25nPiR7ZmlsZVBhdGh9PC9zdHJvbmc+YCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGNhdGNoIChlKVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBUaGlzIHNob3VsZCBub3QgaGFwcGVuLi4uIGRhdGEgc291cmNlIGlzIGNvcnJ1cHRlZD9cblx0XHRcdFx0aWYgKHJlcXVlc3RlciA9PSB0aGlzLnNtYXJ0Rm94Lm15U2VsZi5uYW1lKVxuXHRcdFx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dTaW1wbGVBbGVydChlLm1lc3NhZ2UsIHRydWUpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBFbmFibGUgaW50ZXJmYWNlXG5cdFx0XHR0aGlzLl9lbmFibGVJbnRlcmZhY2UodHJ1ZSk7XG5cdFx0fVxuXG5cdFx0Ly8gRXh0ZW5zaW9uIGZpbGVzIGRlbGV0ZWRcblx0XHRlbHNlIGlmIChjb21tYW5kID09IHRoaXMuUkVTUF9GSUxFU19ERUxFVEVEKVxuXHRcdHtcblx0XHRcdC8vIEdldCBuYW1lIG9mIHRoZSB1c2VyIHdobyBkZWxldGVkIHRoZSBmaWxlL3Ncblx0XHRcdGNvbnN0IHJlcXVlc3RlciA9IGRhdGEuZ2V0VXRmU3RyaW5nKCd1c2VyJyk7XG5cblx0XHRcdC8vIEdldCB0aGUgbGlzdCBvZiBkZWxldGVkIGZpbGVzXG5cdFx0XHRsZXQgZmlsZXMgPSBkYXRhLmdldFNGU0FycmF5KCdmaWxlcycpO1xuXG5cdFx0XHRsZXQgZmlsZXNBcnIgPSBbXTtcblxuXHRcdFx0Ly8gVXBkYXRlIGRhdGEgc291cmNlXG5cdFx0XHRmb3IgKGxldCBqID0gMDsgaiA8IGZpbGVzLnNpemUoKTsgaisrKVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgcGF0aCA9IGZpbGVzLmdldFV0ZlN0cmluZyhqKTtcblx0XHRcdFx0ZmlsZXNBcnIucHVzaChwYXRoKTtcblxuXHRcdFx0XHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdFx0XHRcdC8vIFJlbW92ZSBpdGVtIGZyb20gZGF0YSBzb3VyY2U7IHBhcmVudCBpdGVtIGlzIHJldHVybmVkXG5cdFx0XHRcdGxldCBwYXJlbnRJdGVtID0gdGhpcy5fZmlsZU1hbmFnZXIucmVtb3ZlRmlsZShwYXRoKTtcblxuXHRcdFx0XHQvLyBDb2xsYXBzZSBwYXJlbnQgaWYgdGhlIGxhc3Qgb2YgaXRzIGNoaWxkcmVuIHdhcyBkZWxldGVkXG5cdFx0XHRcdGlmIChwYXJlbnRJdGVtICYmICFwYXJlbnRJdGVtLmhhc0NoaWxkcmVuKVxuXHRcdFx0XHRcdHRoaXMuX2ZpbGVzTGlzdC5jb2xsYXBzZSgkKGAjZXhtLWZpbGVMaXN0IC5maWxlLWNvbnRyb2xzW2RhdGEtaXRlbS1pZD1cIiR7cGFyZW50SXRlbS5pZH1cIl1gKS5jbG9zZXN0KCd0cicpKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHJlcXVlc3RlciA9PSB0aGlzLnNtYXJ0Rm94Lm15U2VsZi5uYW1lKVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBEaXNwbGF5IG5vdGlmaWNhdGlvblxuXHRcdFx0XHR0aGlzLnNoZWxsQ3RybC5zaG93Tm90aWZpY2F0aW9uKGAke3RoaXMuX3NlbGVjdGVkSXRlbS5pc0RpciA/ICdGb2xkZXInIDogJ0ZpbGUnfSBkZWxldGVkYCwgYCR7dGhpcy5fc2VsZWN0ZWRJdGVtLmlzRGlyID8gJ0ZvbGRlcicgOiAnRmlsZSd9ICcke3RoaXMuX3NlbGVjdGVkSXRlbS5uYW1lfScgZGVsZXRlZCBzdWNjZXNzZnVsbHlgKTtcblxuXHRcdFx0XHR0aGlzLl9zZWxlY3RlZEl0ZW0gPSBudWxsO1xuXG5cdFx0XHRcdHRoaXMuX2VuYWJsZUludGVyZmFjZSh0cnVlKTtcblx0XHRcdH1cblx0XHRcdGVsc2Vcblx0XHRcdHtcblx0XHRcdFx0Ly8gRGlzcGxheSBub3RpZmljYXRpb25cblx0XHRcdFx0dGhpcy5zaGVsbEN0cmwuc2hvd05vdGlmaWNhdGlvbihgRmlsZSBkZWxldGVkYCwgYEFkbWluaXN0cmF0b3IgJHtyZXF1ZXN0ZXJ9IGRlbGV0ZWQgdGhlIGZvbGxvd2luZyBmaWxlJHtmaWxlc0Fyci5sZW5ndGggPiAxID8gJ3MnIDogJyd9OiA8c3Ryb25nPiR7ZmlsZXNBcnIuam9pbignPGJyPiAnKX08L3N0cm9uZz5gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gUmVzZXQgc2VsZWN0aW9uXG5cdFx0XHR0aGlzLl9vbkZpbGVTZWxlY3RlZENoYW5nZSgpO1xuXHRcdH1cblxuXHRcdC8vIGVsc2UgaWYgKClcblx0fVxuXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdC8vIFVJIEVWRU5UIExJU1RFTkVSU1xuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdF9vblJldHJ5Q2xpY2soKVxuXHR7XG5cdFx0dGhpcy5fc3dpdGNoVmlldygnZXhtLWluaXQnKTtcblxuXHRcdC8vIFJlLXNlbmQgaW5pdGlhbGl6YXRpb24gcmVxdWVzdFxuXHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfSU5JVCk7XG5cdH1cblxuXHRfb25SZWZyZXNoQ2xpY2soKVxuXHR7XG5cdFx0dGhpcy5fZmlsZXNMaXN0LmNsZWFyU2VsZWN0aW9uKCk7XG5cdFx0dGhpcy5fcmVmcmVzaERhdGFMaXN0KCk7XG5cdH1cblxuXHRfb25GaWxlU2VsZWN0ZWRDaGFuZ2UoKVxuXHR7XG5cdFx0Ly8gSGlkZSBjb250cm9sIGJ1dHRvbnMgb24gY3VycmVudGx5IHNlbGVjdGVkIGl0ZW1cblx0XHRpZiAodGhpcy5fc2VsZWN0ZWRJdGVtKVxuXHRcdFx0JChgI2V4bS1maWxlTGlzdCAuZmlsZS1jb250cm9sc1tkYXRhLWl0ZW0taWQ9XCIke3RoaXMuX3NlbGVjdGVkSXRlbS5pZH1cIl1gKS5oaWRlKCk7XG5cblx0XHQvLyBHZXQgc2VsZWN0ZWQgaXRlbVxuXHRcdGxldCBzZWxlY3RlZFJvd3MgPSB0aGlzLl9maWxlc0xpc3Quc2VsZWN0KCk7XG5cblx0XHRpZiAoc2VsZWN0ZWRSb3dzLmxlbmd0aCA+IDApXG5cdFx0e1xuXHRcdFx0Ly8gU2F2ZSByZWYuIHRvIHNlbGVjdGVkIGl0ZW1cblx0XHRcdHRoaXMuX3NlbGVjdGVkSXRlbSA9IHRoaXMuX2ZpbGVzTGlzdC5kYXRhSXRlbShzZWxlY3RlZFJvd3NbMF0pO1xuXG5cdFx0XHQvLyBTaG93IGNvbnRyb2wgYnV0dG9ucyBvbiBuZXcgc2VsZWN0ZWQgaXRlbVxuXHRcdFx0JChgI2V4bS1maWxlTGlzdCAuZmlsZS1jb250cm9sc1tkYXRhLWl0ZW0taWQ9XCIke3RoaXMuX3NlbGVjdGVkSXRlbS5pZH1cIl1gKS5zaG93KCk7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHRcdHRoaXMuX3NlbGVjdGVkSXRlbSA9IG51bGw7XG5cdH1cblxuXHRfc2hvd0FkZEZvbGRlck1vZGFsQ2xpY2soKVxuXHR7XG5cdFx0aWYgKHRoaXMuX3NlbGVjdGVkSXRlbSAmJiB0aGlzLl9zZWxlY3RlZEl0ZW0uaXNEaXIpXG5cdFx0e1xuXHRcdFx0dGhpcy5fYWRkRm9sZGVyTW9kYWwubW9kYWwoJ3Nob3cnKTtcblx0XHRcdCQoJyNleG0tZm9sZGVyTmFtZUluJykuZm9jdXMoKTtcblx0XHR9XG5cdH1cblxuXHRfb25BZGRGb2xkZXJDbGljaygpXG5cdHtcblx0XHQvLyBUaGUgcGFyZW50IGZvbGRlciBjb3VsZCBoYXZlIGJlZW4gZGVsZXRlZCB3aGlsZSB1c2VyIGlzIHN0aWxsIHR5cGluZyB0aGUgbmFtZSBvZiB0aGUgbmV3IGNoaWxkIGZvbGRlclxuXHRcdGlmICghdGhpcy5fc2VsZWN0ZWRJdGVtKVxuXHRcdHtcblx0XHRcdHRoaXMuX2FkZEZvbGRlck1vZGFsLm1vZGFsKCdoaWRlJyk7XG5cdFx0XHR0aGlzLnNoZWxsQ3RybC5zaG93U2ltcGxlQWxlcnQoJ1VuYWJsZSB0byBjcmVhdGUgZm9sZGVyOyB0aGUgcGFyZW50IGZvbGRlciBkb2VzblxcJ3QgZXhpc3QuJyk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuX2FkZEZvbGRlclZhbGlkYXRvci52YWxpZGF0ZSgpKVxuXHRcdHtcblx0XHRcdC8vIERpc2FibGUgbW9kYWwgaW50ZXJmYWNlXG5cdFx0XHR0aGlzLl9lbmFibGVBZGRGb2xkZXJNb2RhbChmYWxzZSk7XG5cblx0XHRcdGxldCBkYXRhID0gbmV3IFNGUzJYLlNGU09iamVjdCgpO1xuXHRcdFx0ZGF0YS5wdXRVdGZTdHJpbmcoJ2ZvbGRlcicsIHRoaXMuX3NlbGVjdGVkSXRlbS5pZCArIHRoaXMuX2ZpbGVTZXBhcmF0b3IgKyAkKCcjZXhtLWZvbGRlck5hbWVJbicpLnZhbCgpKTtcblxuXHRcdFx0Ly8gU2VuZCByZXF1ZXN0IHRvIHNlcnZlclxuXHRcdFx0dGhpcy5zZW5kRXh0ZW5zaW9uUmVxdWVzdCh0aGlzLlJFUV9DUkVBVEVfRk9MREVSLCBkYXRhKTtcblx0XHR9XG5cdH1cblxuXHRfb25BZGRGb2xkZXJNb2RhbEhpZGRlbigpXG5cdHtcblx0XHQkKCcjZXhtLWZvbGRlck5hbWVJbicpLnZhbCgnJyk7XG5cdFx0dGhpcy5fcmVzZXRBZGRGb2xkZXJWYWxpZGF0aW9uKCk7XG5cblx0XHQvLyBFbmFibGUgbW9kYWwgaW50ZXJmYWNlXG5cdFx0dGhpcy5fZW5hYmxlQWRkRm9sZGVyTW9kYWwodHJ1ZSk7XG5cdH1cblxuXHRfc2hvd1VwbG9hZEZpbGVzTW9kYWxDbGljaygpXG5cdHtcblx0XHRpZiAodGhpcy5fc2VsZWN0ZWRJdGVtKVxuXHRcdFx0dGhpcy5fdXBsb2FkRmlsZXNNb2RhbC5tb2RhbCgnc2hvdycpO1xuXHR9XG5cblx0X29uQ2xlYXJGaWxlc0NsaWNrKClcblx0e1xuXHRcdHRoaXMuX3VwbG9hZGVyLmNsZWFyQWxsRmlsZXMoKTtcblx0fVxuXG5cdF9vblVwbG9hZFN0YXJ0KGUpXG5cdHtcblx0XHQvLyBEaXNhYmxlIGNsZWFyIGJ1dHRvblxuXHRcdCQoJyNleG0tY2xlYXJGaWxlc0J0JykuYXR0cignZGlzYWJsZWQnLCB0cnVlKTtcblxuXHRcdC8vIFNldCBkZXN0aW5hdGlvbiB1cmxcblx0XHRjb25zdCB1cmwgPSAnaHR0cDovLycgKyB0aGlzLl91cGxvYWRUYXJnZXRDb25maWcuaG9zdCArICc6JyArIHRoaXMuX3VwbG9hZFRhcmdldENvbmZpZy5odHRwUG9ydCArICcvQmx1ZUJveC9TRlMyWEZpbGVVcGxvYWQ/c2Vzc0hhc2hJZD0nICsgdGhpcy5fdXBsb2FkVGFyZ2V0Q29uZmlnLnNlc3Npb25Ub2tlbjtcblxuXHRcdGUuc2VuZGVyLm9wdGlvbnMuYXN5bmMuc2F2ZVVybCA9IHVybDtcblxuXHRcdC8vIFNldCBwYXlsb2FkXG5cdFx0Y29uc3QgcGFyYW1zID0gbmV3IEZvcm1EYXRhKCk7XG5cdFx0cGFyYW1zLmFwcGVuZCgnX19tb2R1bGUnLCB0aGlzLl91cGxvYWRUYXJnZXRDb25maWcubW9kdWxlSWQpO1xuXHRcdHBhcmFtcy5hcHBlbmQoJ19fdGFyZ2V0JywgdGhpcy5fc2VsZWN0ZWRJdGVtLmlkKTtcblxuXHRcdGZvciAobGV0IGYgPSAwOyBmIDwgZS5maWxlcy5sZW5ndGg7IGYrKylcblx0XHRcdHBhcmFtcy5hcHBlbmQoJ2ZpbGVzW10nLCBlLmZpbGVzW2ZdLnJhd0ZpbGUpO1xuXG5cdFx0ZS5mb3JtRGF0YSA9IHBhcmFtcztcblx0fVxuXG5cdF9vblVwbG9hZEVuZChlKVxuXHR7XG5cdFx0Ly8gRW5hYmxlIGNsZWFyIGJ1dHRvblxuXHRcdCQoJyNleG0tY2xlYXJGaWxlc0J0JykuYXR0cignZGlzYWJsZWQnLCBmYWxzZSk7XG5cdH1cblxuXHRfb25GaWxlc1VwbG9hZEVuZChyZXNwb25zZSlcblx0e1xuXHRcdC8vIE5vdGhpbmcgdG8gZG86IHdlIGhhdmUgdG8gd2FpdCB0aGUgdXBsb2FkIHByb2Nlc3MgY29tcGxldGlvbiB0byBiZSBzaWduYWxlZCBieSB0aGUgc2VydmVyIHRocm91Z2ggdGhlIGRlZGljYXRlZCBFeHRlbnNpb24gcmVzcG9uc2VcblxuXHRcdC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHRcdC8vIFRPRE8gU2hvdWxkIHdlIGhhbmRsZSB0aGlzIHJlc3BvbnNlIGluIHNvbWUgd2F5PyBGb3Igc29tZSB1bmtub3duIHJlYXNvbiB3ZSBhbHdheXMgZ2V0IG9rPWZhbHNlIGFuZCBzdGF0dXM9MFxuXHRcdC8vIGNvbnNvbGUubG9nKHJlc3BvbnNlKVxuXHRcdC8vIGNvbnNvbGUubG9nKHJlc3BvbnNlLm9rKVxuXHRcdC8vIGNvbnNvbGUubG9nKHJlc3BvbnNlLnN0YXR1cylcblx0fVxuXG5cdF9vblJlbW92ZUZpbGVDbGljaygpXG5cdHtcblx0XHRpZiAodGhpcy5fc2VsZWN0ZWRJdGVtKVxuXHRcdFx0dGhpcy5zaGVsbEN0cmwuc2hvd0NvbmZpcm1XYXJuaW5nKGBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoZSBzZWxlY3RlZCAke3RoaXMuX3NlbGVjdGVkSXRlbS5pc0RpciA/ICdmb2xkZXInIDogJ2ZpbGUnfT88YnI+PGJyPlBhdGg6IDxzdHJvbmc+JHt0aGlzLl9zZWxlY3RlZEl0ZW0uaWR9PC9zdHJvbmc+YCwgJC5wcm94eSh0aGlzLl9vblJlbW92ZUZpbGVDb25maXJtLCB0aGlzKSk7XG5cdH1cblxuXHRfb25SZW1vdmVGaWxlQ29uZmlybSgpXG5cdHtcblx0XHQvLyBEaXNhYmxlIGludGVyZmFjZVxuXHRcdHRoaXMuX2VuYWJsZUludGVyZmFjZShmYWxzZSk7XG5cblx0XHQvLyBSZXF1ZXN0IEV4dGVuc2lvbiBmaWxlcyByZW1vdmFsXG5cdFx0Ly8gTk9URTogZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBBZG1pblRvb2wsIHRoZSBmaWxlIHRvIGJlIGRlbGV0ZWQgaXMgc2VudFxuXHRcdC8vIGluIGFuIGFycmF5IG9mIHN0cmluZ3MsIGV2ZW4gaWYgd2UgY2FuJ3QgZGVsZXRlIG1vcmUgdGhhbiAxIGZpbGUgYXQgb25jZSBpbiB0aGlzIEFkbWluVG9vbFxuXG5cdFx0bGV0IGZpbGVzID0gbmV3IFNGUzJYLlNGU0FycmF5KCk7XG5cdFx0ZmlsZXMuYWRkVXRmU3RyaW5nKHRoaXMuX3NlbGVjdGVkSXRlbS5pZCk7XG5cblx0XHRsZXQgcGFyYW1zID0gbmV3IFNGUzJYLlNGU09iamVjdCgpO1xuXHRcdHBhcmFtcy5wdXRTRlNBcnJheSgnZmlsZXMnLCBmaWxlcyk7XG5cblx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX0RFTEVURV9GSUxFUywgcGFyYW1zKTtcblx0fVxuXG5cdF9vblJlbG9hZEV4dENsaWNrKClcblx0e1xuXHRcdGlmICh0aGlzLl9zZWxlY3RlZEl0ZW0pXG5cdFx0e1xuXHRcdFx0bGV0IHBhdGhBcnIgPSB0aGlzLl9zZWxlY3RlZEl0ZW0uaWQuc3BsaXQodGhpcy5fZmlsZVNlcGFyYXRvcik7XG5cblx0XHRcdGlmIChwYXRoQXJyLmxlbmd0aCA+IDEpXG5cdFx0XHR7XG5cdFx0XHRcdC8vIFJlcXVlc3QgRXh0ZW5zaW9uIHJlbG9hZFxuXHRcdFx0XHQvLyBOT1RFOiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIEFkbWluVG9vbCwgdGhlIEV4dGVuc2lvbiB0byBiZSByZWxvYWRlZCBpcyBzZW50XG5cdFx0XHRcdC8vIGluIGFuIGFycmF5IG9mIHN0cmluZ3MsIGV2ZW4gaWYgd2UgY2FuJ3QgcmVsb2FkIG1vcmUgdGhhbiAxIEV4dGVuc2lvbiBhdCBvbmNlIGluIHRoaXMgQWRtaW5Ub29sXG5cblx0XHRcdFx0bGV0IGV4dFRvUmVsb2FkID0gW107XG5cdFx0XHRcdGV4dFRvUmVsb2FkLnB1c2gocGF0aEFyclsxXSk7XG5cblx0XHRcdFx0bGV0IHBhcmFtcyA9IG5ldyBTRlMyWC5TRlNPYmplY3QoKTtcblx0XHRcdFx0cGFyYW1zLnB1dFV0ZlN0cmluZ0FycmF5KCdleHRlbnNpb25zJywgZXh0VG9SZWxvYWQpO1xuXG5cdFx0XHRcdC8vIFNlbmQgcmVxdWVzdCB0byBzZXJ2ZXJcblx0XHRcdFx0dGhpcy5zZW5kRXh0ZW5zaW9uUmVxdWVzdCh0aGlzLlJFUV9SRUxPQURfRVhURU5TSU9OUywgcGFyYW1zKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQvLyBQUklWQVRFIE1FVEhPRFNcblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRfc3dpdGNoVmlldyh2aWV3SWQpXG5cdHtcblx0XHRkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhtLXZpZXdzdGFjaycpLnNlbGVjdGVkRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHZpZXdJZCk7XG5cdH1cblxuXHRfZW5hYmxlSW50ZXJmYWNlKGVuYWJsZSlcblx0e1xuXHRcdCQoJyNleG0tZmlsZUxpc3QnKS5hdHRyKCdkaXNhYmxlZCcsICFlbmFibGUpO1xuXHRcdCQoJyNleG0tcmVmcmVzaEJ0JykuYXR0cignZGlzYWJsZWQnLCAhZW5hYmxlKTtcblx0fVxuXG5cdF9yZWZyZXNoRGF0YUxpc3QoKVxuXHR7XG5cdFx0Ly8gRGlzYWJsZSBpbnRlcmZhY2Vcblx0XHR0aGlzLl9lbmFibGVJbnRlcmZhY2UoZmFsc2UpO1xuXG5cdFx0Ly8gU2VuZCByZXF1ZXN0IHRvIHNlcnZlclxuXHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfR0VUX0VYVEVOU0lPTlMpXG5cdH1cblxuXHRfcmVzZXRBZGRGb2xkZXJWYWxpZGF0aW9uKClcblx0e1xuXHRcdHRoaXMuX2FkZEZvbGRlclZhbGlkYXRvci5oaWRlTWVzc2FnZXMoKTtcblxuXHRcdC8vIFRoZSBtZXRob2QgYWJvdmUgZG9lc24ndCByZW1vdmUgdGhlIGstaW52YWxpZCBjbGFzc2VzIGFuZCBhcmlhLWludmFsaWQ9XCJ0cnVlXCIgYXR0cmlidXRlcyBmcm9tIGlucHV0c1xuXHRcdC8vIExldCdzIGRvIGl0IG1hbnVhbGx5XG5cdFx0JCgnI2V4bS1hZGRGb2xkZXJGb3JtIC5rLWludmFsaWQnKS5yZW1vdmVDbGFzcygnay1pbnZhbGlkJyk7XG5cdFx0JCgnI2V4bS1hZGRGb2xkZXJGb3JtIFthcmlhLWludmFsaWQ9XCJ0cnVlXCJdJykucmVtb3ZlQXR0cignYXJpYS1pbnZhbGlkJyk7XG5cdH1cblxuXHRfZW5hYmxlQWRkRm9sZGVyTW9kYWwoZW5hYmxlKVxuXHR7XG5cdFx0Ly8gRGlzYWJsZSBtb2RhbCBjbG9zZSBidXR0b25zXG5cdFx0JCgnI2V4bS1hZGRGb2xkZXJNb2RhbCBidXR0b25bZGF0YS1kaXNtaXNzPVwibW9kYWxcIl0nKS5hdHRyKCdkaXNhYmxlZCcsICFlbmFibGUpO1xuXG5cdFx0Ly8gRGlzYWJsZSBhZGQgYnV0dG9uXG5cdFx0JCgnI2V4bS1hZGRGb2xkZXJCdCcpLmF0dHIoJ2Rpc2FibGVkJywgIWVuYWJsZSk7XG5cblx0XHQvLyBEaXNhYmxlIGZpZWxkc2V0XG5cdFx0JCgnI2V4bS1hZGRGb2xkZXJGb3JtJykuYXR0cignZGlzYWJsZWQnLCAhZW5hYmxlKTtcblx0fVxuXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdC8vIFBSSVZBVEUgR0VUVEVSU1xuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNoSkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QSIsInNvdXJjZVJvb3QiOiIifQ==
799
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXRzL2pzL2NvcmUvbW9kdWxlcy9tb2R1bGUtNi5idW5kbGUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9tYW5hZ2Vycy9maWxlLWRhdGFzb3VyY2UtbWFuYWdlci5qcyIsIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9tb2R1bGVzL2V4dGVuc2lvbi1tYW5hZ2VyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBGaWxlRGF0YVNvdXJjZU1hbmFnZXJcbntcblx0Y29uc3RydWN0b3IobGliRm9sZGVyLCBwcm90ZWN0ZWRGb2xkZXJzLCBmaWxlU2VwYXJhdG9yKVxuXHR7XG5cdFx0dGhpcy5fcHJvdGVjdGVkRm9sZGVycyA9IHByb3RlY3RlZEZvbGRlcnM7IC8vIEZvbGRlcnMgd2hpY2ggY2FuJ3QgYmUgZGVsZXRlZCAoYnV0IHRoZWlyIGNvbnRlbnQgY2FuKVxuXHRcdHRoaXMuX2xpYkZvbGRlciA9IGxpYkZvbGRlcjtcblx0XHR0aGlzLl9maWxlU2VwYXJhdG9yID0gZmlsZVNlcGFyYXRvcjtcblx0fVxuXG5cdGdldCBkYXRhU291cmNlKClcblx0e1xuXHRcdHJldHVybiB0aGlzLl9kYXRhU291cmNlO1xuXHR9XG5cblx0aW5pdCgpXG5cdHtcblx0XHR0aGlzLl9kYXRhU291cmNlID0gbmV3IGtlbmRvLmRhdGEuVHJlZUxpc3REYXRhU291cmNlKHtcblx0XHRcdGRhdGE6IFtdLFxuXHRcdFx0c2NoZW1hOiB7XG5cdFx0XHRcdG1vZGVsOiB7XG5cdFx0XHRcdFx0aWQ6ICdpZCcsXG5cdFx0XHRcdFx0cGFyZW50SWQ6ICdwYXJlbnRJZCcsXG5cdFx0XHRcdFx0ZXhwYW5kZWQ6IGZhbHNlXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRzb3J0OiB7IGZpZWxkOiAnbmFtZScsIGRpcjogJ2FzYycgfVxuXHRcdH0pO1xuXHR9XG5cblx0YWRkRmlsZShmaWxlT2JqLCBwYXJlbnRMZXZlbCA9IG51bGwpXG5cdHtcblx0XHRsZXQgZmlsZSA9IHt9O1xuXG5cdFx0ZmlsZS5uYW1lID0gZmlsZU9iai5nZXRVdGZTdHJpbmcoJ25hbWUnKTtcblx0XHRmaWxlLmlzRGlyID0gZmlsZU9iai5nZXRCb29sKCdpc0RpcicpO1xuXHRcdGZpbGUubGFzdE1vZCA9IGZpbGVPYmouZ2V0TG9uZygnbGFzdE1vZCcpO1xuXHRcdGZpbGUuaXNMaWIgPSAoZmlsZS5pc0RpciAmJiBmaWxlLm5hbWUgPT0gdGhpcy5fbGliRm9sZGVyKTtcblx0XHRmaWxlLmlzUHJvdGVjdGVkID0gKGZpbGUuaXNEaXIgJiYgdGhpcy5fcHJvdGVjdGVkRm9sZGVycy5pbmRleE9mKGZpbGUubmFtZSkgPiAtMSk7XG5cdFx0ZmlsZS5zaXplID0gMDtcblxuXHRcdGlmIChwYXJlbnRMZXZlbCA9PSBudWxsKVxuXHRcdFx0ZmlsZS5sZXZlbCA9IDA7XG5cdFx0ZWxzZVxuXHRcdFx0ZmlsZS5sZXZlbCA9IHBhcmVudExldmVsICsgMTtcblxuXHRcdGlmIChmaWxlT2JqLmNvbnRhaW5zS2V5KCdwYXJlbnQnKSlcblx0XHR7XG5cdFx0XHRmaWxlLnBhcmVudElkID0gZmlsZU9iai5nZXRVdGZTdHJpbmcoJ3BhcmVudCcpO1xuXHRcdFx0ZmlsZS5pZCA9IGZpbGUucGFyZW50SWQgKyB0aGlzLl9maWxlU2VwYXJhdG9yICsgZmlsZS5uYW1lO1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0ZmlsZS5wYXJlbnRJZCA9IG51bGw7XG5cdFx0XHRmaWxlLmlkID0gZmlsZS5uYW1lO1xuXHRcdH1cblxuXHRcdC8vIEFkZCBjaGlsZCBmaWxlc1xuXHRcdGlmIChmaWxlLmlzRGlyKVxuXHRcdHtcblx0XHRcdGxldCBmaWxlc0FyciA9IGZpbGVPYmouZ2V0U0ZTQXJyYXkoJ2ZpbGVzJyk7XG5cblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgZmlsZXNBcnIuc2l6ZSgpOyBpKyspXG5cdFx0XHRcdGZpbGUuc2l6ZSArPSB0aGlzLmFkZEZpbGUoZmlsZXNBcnIuZ2V0U0ZTT2JqZWN0KGkpLCBmaWxlLmxldmVsKTtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdFx0ZmlsZS5zaXplID0gZmlsZU9iai5nZXRMb25nKCdzaXplJyk7XG5cblx0XHQvLyBBZGQgZmlsZSB0byBkYXRhIHNvdXJjZVxuXHRcdHRoaXMuX2RhdGFTb3VyY2UuYWRkKGZpbGUpO1xuXG5cdFx0Ly8gUmV0dXJuIGZpbGUgc2l6ZVxuXHRcdHJldHVybiBmaWxlLnNpemU7XG5cdH1cblxuXHRyZW1vdmVGaWxlKGlkKVxuXHR7XG5cdFx0bGV0IGZpbGVJdGVtID0gdGhpcy5fZGF0YVNvdXJjZS5nZXQoaWQpO1xuXG5cdFx0aWYgKGZpbGVJdGVtKVxuXHRcdHtcblx0XHRcdGlmIChmaWxlSXRlbS5wYXJlbnRJZClcblx0XHRcdHtcblx0XHRcdFx0Ly8gU3VidHJhY3Qgb2xkIHNpemUgZnJvbSBwYXJlbnQgc2l6ZVxuXHRcdFx0XHRsZXQgcGFyZW50SXRlbSA9IHRoaXMuX2RhdGFTb3VyY2UuZ2V0KGZpbGVJdGVtLnBhcmVudElkKTtcblx0XHRcdFx0dGhpcy5fdXBkYXRlUGFyZW50U2l6ZShwYXJlbnRJdGVtLCAtZmlsZUl0ZW0uc2l6ZSk7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuX2RhdGFTb3VyY2UucmVtb3ZlKGZpbGVJdGVtKTtcblxuXHRcdFx0Ly8gUmV0dXJuIHBhcmVudCBpdGVtXG5cdFx0XHRpZiAoZmlsZUl0ZW0ucGFyZW50SWQpXG5cdFx0XHRcdHJldHVybiB0aGlzLl9kYXRhU291cmNlLmdldChmaWxlSXRlbS5wYXJlbnRJZCk7XG5cdFx0fVxuXHR9XG5cblx0Z2V0RmlsZUJ5SWQoaWQpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fZGF0YVNvdXJjZS5nZXQoaWQpO1xuXHR9XG5cblx0YWRkRmlsZVRvUGFyZW50KGZpbGVPYmosIHBhcmVudElkKVxuXHR7XG5cdFx0bGV0IHBhcmVudEl0ZW0gPSB0aGlzLl9kYXRhU291cmNlLmdldChwYXJlbnRJZCk7XG5cblx0XHRpZiAocGFyZW50SXRlbSAhPSBudWxsICYmIHBhcmVudEl0ZW0uaXNEaXIpXG5cdFx0e1xuXHRcdFx0Y29uc3QgZmlsZUlkID0gcGFyZW50SWQgKyB0aGlzLl9maWxlU2VwYXJhdG9yICsgZmlsZU9iai5nZXRVdGZTdHJpbmcoJ25hbWUnKTtcblx0XHRcdGxldCBmaWxlSXRlbSA9IHRoaXMuX2RhdGFTb3VyY2UuZ2V0KGZpbGVJZCk7XG5cblx0XHRcdGlmIChmaWxlSXRlbSAhPSBudWxsKVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBTdWJ0cmFjdCBvbGQgc2l6ZSBmcm9tIHBhcmVudCBzaXplXG5cdFx0XHRcdHRoaXMuX3VwZGF0ZVBhcmVudFNpemUocGFyZW50SXRlbSwgLWZpbGVJdGVtLnNpemUpO1xuXG5cdFx0XHRcdC8vIFVwZGF0ZSBleGlzdGluZyBpdGVtXG5cdFx0XHRcdGZpbGVJdGVtLm5hbWUgPSBmaWxlT2JqLmdldFV0ZlN0cmluZygnbmFtZScpO1xuXHRcdFx0XHRmaWxlSXRlbS5sYXN0TW9kID0gZmlsZU9iai5nZXRMb25nKCdsYXN0TW9kJyk7XG5cdFx0XHRcdGZpbGVJdGVtLnNpemUgPSBmaWxlT2JqLmdldExvbmcoJ3NpemUnKTtcblx0XHRcdH1cblx0XHRcdGVsc2Vcblx0XHRcdHtcblx0XHRcdFx0Ly8gQWRkIG5ldyBpdGVtXG5cdFx0XHRcdHRoaXMuYWRkRmlsZShmaWxlT2JqLCBwYXJlbnRJdGVtLmxldmVsKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVXBkYXRlIHBhcmVudCBpdGVtIHNpemVcblx0XHRcdHRoaXMuX3VwZGF0ZVBhcmVudFNpemUocGFyZW50SXRlbSwgZmlsZU9iai5nZXRMb25nKCdzaXplJykpO1xuXG5cdFx0XHRyZXR1cm4gZmlsZUlkO1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYEFuIHVuZXhwZWN0ZWQgZXJyb3Igb2NjdXJyZWQgd2hpbGUgYWRkaW5nIGZpbGUgJyR7ZmlsZU9iai5nZXRVdGZTdHJpbmcoJ25hbWUnKX0nICh0YXJnZXQ6ICR7cGFyZW50SWR9KS5gKTtcblx0fVxuXG5cdF91cGRhdGVQYXJlbnRTaXplKHBhcmVudEl0ZW0sIHZhbHVlKVxuXHR7XG5cdFx0cGFyZW50SXRlbS5zaXplICs9IHZhbHVlO1xuXG5cdFx0aWYgKHBhcmVudEl0ZW0ucGFyZW50SWQpXG5cdFx0e1xuXHRcdFx0bGV0IGdyYW5kUGFyZW50ID0gdGhpcy5fZGF0YVNvdXJjZS5nZXQocGFyZW50SXRlbS5wYXJlbnRJZCk7XG5cdFx0XHR0aGlzLl91cGRhdGVQYXJlbnRTaXplKGdyYW5kUGFyZW50LCB2YWx1ZSk7XG5cdFx0fVxuXHR9XG59XG4iLCJpbXBvcnQge0Jhc2VNb2R1bGV9IGZyb20gJy4vYmFzZS1tb2R1bGUnO1xuaW1wb3J0IHtGaWxlRGF0YVNvdXJjZU1hbmFnZXJ9IGZyb20gJy4uL21hbmFnZXJzL2ZpbGUtZGF0YXNvdXJjZS1tYW5hZ2VyJztcbmltcG9ydCB7Ynl0ZXNUb1NpemV9IGZyb20gJy4uL3V0aWxzL3V0aWxpdGllcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEV4dGVuc2lvbk1hbmFnZXIgZXh0ZW5kcyBCYXNlTW9kdWxlXG57XG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHQgICAgc3VwZXIoJ2V4dGVuc2lvbk1hbicpO1xuXG5cdFx0Ly8gT3V0Z29pbmcgcmVxdWVzdHNcblx0XHR0aGlzLlJFUV9JTklUID0gJ2luaXQnO1xuXHRcdHRoaXMuUkVRX0dFVF9FWFRFTlNJT05TID0gJ2dldEV4dGVuc2lvbnMnO1xuXHRcdHRoaXMuUkVRX0NSRUFURV9GT0xERVIgPSAnY3JlYXRlRm9sZGVyJztcblx0XHR0aGlzLlJFUV9ERUxFVEVfRklMRVMgPSAnZGVsZXRlRXh0RmlsZXMnO1xuXHRcdHRoaXMuUkVRX1JFTE9BRF9FWFRFTlNJT05TID0gJ3JlbG9hZEV4dCc7XG5cblx0XHQvLyBJbmNvbWluZyByZXNwb25zZXNcblx0XHR0aGlzLlJFU1BfTE9DS0VEID0gJ2xvY2snO1xuXHRcdHRoaXMuUkVTUF9JTklUID0gJ2luaXQnO1xuXHRcdHRoaXMuUkVTUF9FWFRFTlNJT05TID0gJ2V4dGVuc2lvbnMnO1xuXHRcdHRoaXMuUkVTUF9GSUxFX0FEREVEID0gJ2ZpbGVBZGRlZCc7XG5cdFx0dGhpcy5SRVNQX0ZJTEVTX0RFTEVURUQgPSAnZmlsZXNEZWxldGVkJztcblx0XHR0aGlzLlJFU1BfRVJST1IgPSAnZXJyb3InO1xuXHR9XG5cblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0Ly8gQ09NTU9OIE1PRFVMRSBJTlRFUkZBQ0UgTUVUSE9EU1xuXHQvLyBUaGlzIG1lbWJlcnMgYXJlIHVzZWQgYnkgdGhlIG1haW4gY29udHJvbGxlclxuXHQvLyB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBtb2R1bGUncyBjb250cm9sbGVyLlxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdGluaXRpYWxpemUoaWREYXRhLCBzaGVsbENvbnRyb2xsZXIpXG5cdHtcblx0XHQvLyBDYWxsIHN1cGVyIG1ldGhvZFxuXHRcdHN1cGVyLmluaXRpYWxpemUoaWREYXRhLCBzaGVsbENvbnRyb2xsZXIpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBwcm9ncmVzcyBiYXJcblx0XHQkKCcjZXhtLXByb2dyZXNzQmFyJykua2VuZG9Qcm9ncmVzc0Jhcih7XG5cdFx0XHRtaW46IDAsXG4gICAgICAgICAgICBtYXg6IDEwMCxcblx0XHRcdHZhbHVlOiBmYWxzZSxcbiAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsXG4gICAgICAgICAgICBhbmltYXRpb246IHtcbiAgICAgICAgICAgICAgICBkdXJhdGlvbjogNDAwXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG5cdFx0Ly8gQWRkIGxpc3RlbmVycyB0byBidXR0b25zXG5cdFx0JCgnI2V4bS1yZXRyeUJ0Jykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vblJldHJ5Q2xpY2ssIHRoaXMpKTtcblx0XHQkKCcjZXhtLXJlZnJlc2hCdCcpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25SZWZyZXNoQ2xpY2ssIHRoaXMpKTtcblxuXHRcdC8vIEluaXRpYWxpemUgZmlsZXMgbGlzdFxuXHRcdHRoaXMuX2ZpbGVzTGlzdCA9ICQoJyNleG0tZmlsZUxpc3QnKS5rZW5kb1RyZWVMaXN0KHtcbiAgICAgICAgICAgIGRhdGFTb3VyY2U6IFtdLFxuXHRcdFx0cmVzaXphYmxlOiB0cnVlLFxuXHRcdFx0c2VsZWN0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbHVtbnM6IFtcbiAgICAgICAgICAgICAgICB7XG5cdFx0XHRcdFx0ZmllbGQ6ICduYW1lJyxcblx0XHRcdFx0XHR0aXRsZTogJ05hbWUnLFxuXHRcdFx0XHRcdHRlbXBsYXRlOiBrZW5kby50ZW1wbGF0ZShgXG5cdFx0XHRcdFx0XHQ8ZGl2ID5cblx0XHRcdFx0XHRcdFx0IyBpZiAoaXNEaXIpIHsgI1xuXHRcdFx0XHRcdFx0XHRcdCMgaWYgKGV4cGFuZGVkKSB7ICNcblx0XHRcdFx0XHRcdFx0XHRcdDxpIGNsYXNzPVwiZmFzIGZhLWZvbGRlci1vcGVuXCI+PC9pPlxuXHRcdFx0XHRcdFx0XHRcdCMgfSBlbHNlIHsgI1xuXHRcdFx0XHRcdFx0XHRcdFx0PGkgY2xhc3M9XCJmYXMgZmEtZm9sZGVyXCI+PC9pPlxuXHRcdFx0XHRcdFx0XHRcdCMgfSAjXG5cdFx0XHRcdFx0XHRcdCMgfSBlbHNlIHsgI1xuXHRcdFx0XHRcdFx0XHRcdDxpIGNsYXNzPVwiZmFyIGZhLWZpbGVcIj48L2k+XG5cdFx0XHRcdFx0XHRcdCMgfSAjXG5cblx0XHRcdFx0XHRcdFx0IzogbmFtZSAjXG5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImZpbGUtY29udHJvbHMgZmxleC1ncm93LTEgdGV4dC1yaWdodFwiIGRhdGEtaXRlbS1pZD1cIiM6aWQjXCI+XG5cdFx0XHRcdFx0XHRcdCMgaWYgKGlzRGlyKSB7ICNcblx0XHRcdFx0XHRcdFx0XHQ8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImstYnV0dG9uIGstcHJpbWFyeSBteS0xIGNyZWF0ZS1mb2xkZXItYnRcIj48aSBjbGFzcz1cImZhcyBmYS1mb2xkZXItcGx1c1wiPjwvaT48L2J1dHRvbj5cblx0XHRcdFx0XHRcdFx0XHQjIGlmIChsZXZlbCA+IDApIHsgI1xuXHRcdFx0XHRcdFx0XHRcdFx0PGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJrLWJ1dHRvbiBrLXByaW1hcnkgbXktMSB1cGxvYWQtZmlsZXMtYnRcIj48aSBjbGFzcz1cImZhcyBmYS1maWxlLXVwbG9hZFwiPjwvaT48L2J1dHRvbj5cblx0XHRcdFx0XHRcdFx0XHQjIH0gI1xuXHRcdFx0XHRcdFx0XHQjIH0gI1xuXG5cdFx0XHRcdFx0XHRcdCMgaWYgKGxldmVsID4gMCAmJiAhaXNQcm90ZWN0ZWQpIHsgI1xuXHRcdFx0XHRcdFx0XHRcdDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiay1idXR0b24gay1wcmltYXJ5IG15LTEgcmVtb3ZlLWZpbGUtYnRcIj48aSBjbGFzcz1cImZhcyBmYS1taW51cy1jaXJjbGVcIj48L2k+PC9idXR0b24+XG5cdFx0XHRcdFx0XHRcdCMgfSAjXG5cblx0XHRcdFx0XHRcdFx0IyBpZiAobGV2ZWwgPT0gMSAmJiAhaXNMaWIpIHsgI1xuXHRcdFx0XHRcdFx0XHRcdDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiay1idXR0b24gay1wcmltYXJ5IG15LTEgcmVsb2FkLWV4dC1idFwiPjxpIGNsYXNzPVwiZmFzIGZhLXJlZG8tYWx0XCI+PC9pPjwvYnV0dG9uPlxuXHRcdFx0XHRcdFx0XHQjIH0gI1xuXHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0YCksXG5cdFx0XHRcdH0sXG4gICAgICAgICAgICAgICAge1xuXHRcdFx0XHRcdGZpZWxkOiAnc2l6ZScsXG5cdFx0XHRcdFx0dGl0bGU6ICdTaXplJyxcblx0XHRcdFx0XHR0ZW1wbGF0ZTogZnVuY3Rpb24oZGF0YUl0ZW0pIHtcblx0XHRcdFx0XHRcdGRhdGFJdGVtLmJ5dGVzVG9TaXplID0gYnl0ZXNUb1NpemU7IC8vIFBhc3MgYnl0ZXNUb1NpemUgdXRpbGl0eSBmdW5jdGlvbiB0byB0ZW1wbGF0ZVxuXHRcdFx0XHRcdFx0cmV0dXJuIGtlbmRvLnRlbXBsYXRlKGBcblx0XHRcdFx0XHRcdFx0IzogYnl0ZXNUb1NpemUoc2l6ZSwgMiwgJ0tCJykgI1xuXHRcdFx0XHRcdFx0YCkoZGF0YUl0ZW0pO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0d2lkdGg6IDEyMCxcblx0XHRcdFx0XHRtaW5TY3JlZW5XaWR0aDogNTc2XG5cdFx0XHRcdH0sXG4gICAgICAgICAgICAgICAge1xuXHRcdFx0XHRcdGZpZWxkOiAnbGFzdE1vZCcsXG5cdFx0XHRcdFx0dGl0bGU6ICdMYXN0IE1vZGlmaWVkJyxcblx0XHRcdFx0XHR0ZW1wbGF0ZToga2VuZG8udGVtcGxhdGUoYFxuXHRcdFx0XHRcdFx0Izoga2VuZG8udG9TdHJpbmcobmV3IERhdGUobGFzdE1vZCksICdkZCBNTU0geXl5eSBISDptbTpzcycpICNcblx0XHRcdFx0XHRgKSxcblx0XHRcdFx0XHR3aWR0aDogMjAwLFxuXHRcdFx0XHRcdG1pblNjcmVlbldpZHRoOiA3Njhcblx0XHRcdFx0fSxcbiAgICAgICAgICAgIF0sXG5cdFx0XHRjaGFuZ2U6ICQucHJveHkodGhpcy5fb25GaWxlU2VsZWN0ZWRDaGFuZ2UsIHRoaXMpXG4gICAgICAgIH0pLmRhdGEoJ2tlbmRvVHJlZUxpc3QnKTtcblxuXHRcdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdFx0Ly8gQWRkIGxpc3RlbmVycyB0byBjYXRjaCBjb250cm9sIGJ1dHRvbiBjbGlja3Mgb24gcm93c1xuXHRcdCQoJyNleG0tZmlsZUxpc3QnKS5vbignY2xpY2snLCAnLmNyZWF0ZS1mb2xkZXItYnQnLCAkLnByb3h5KHRoaXMuX3Nob3dBZGRGb2xkZXJNb2RhbENsaWNrLCB0aGlzKSk7XG5cdFx0JCgnI2V4bS1maWxlTGlzdCcpLm9uKCdjbGljaycsICcudXBsb2FkLWZpbGVzLWJ0JywgJC5wcm94eSh0aGlzLl9zaG93VXBsb2FkRmlsZXNNb2RhbENsaWNrLCB0aGlzKSk7XG5cdFx0JCgnI2V4bS1maWxlTGlzdCcpLm9uKCdjbGljaycsICcucmVtb3ZlLWZpbGUtYnQnLCAkLnByb3h5KHRoaXMuX29uUmVtb3ZlRmlsZUNsaWNrLCB0aGlzKSk7XG5cdFx0JCgnI2V4bS1maWxlTGlzdCcpLm9uKCdjbGljaycsICcucmVsb2FkLWV4dC1idCcsICQucHJveHkodGhpcy5fb25SZWxvYWRFeHRDbGljaywgdGhpcykpO1xuXG5cdFx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0XHQvLyBJbml0aWFsaXplIFwiYWRkIGZvbGRlclwiIG1vZGFsXG5cdFx0dGhpcy5fYWRkRm9sZGVyTW9kYWwgPSAkKCcjZXhtLWFkZEZvbGRlck1vZGFsJyk7XG5cdFx0dGhpcy5fYWRkRm9sZGVyTW9kYWwubW9kYWwoe1xuXHRcdFx0YmFja2Ryb3A6ICdzdGF0aWMnLFxuXHRcdFx0a2V5Ym9hcmQ6IGZhbHNlLFxuXHRcdFx0c2hvdzogZmFsc2Vcblx0XHR9KTtcblxuXHRcdC8vIEFkZCBsaXN0ZW5lciB0byBtb2RhbCBoaWRlIGV2ZW50XG5cdFx0dGhpcy5fYWRkRm9sZGVyTW9kYWwub24oJ2hpZGRlbi5icy5tb2RhbCcsICQucHJveHkodGhpcy5fb25BZGRGb2xkZXJNb2RhbEhpZGRlbiwgdGhpcykpO1xuXG5cdFx0Ly8gQWRkIGxpc3RlbmVyIHRvIEFkZCBidXR0b24gY2xpY2tcblx0XHQkKCcjZXhtLWFkZEZvbGRlckJ0Jykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vbkFkZEZvbGRlckNsaWNrLCB0aGlzKSk7XG5cblx0XHQvLyBJbml0aWFsaXplIGtlbmRvIHZhbGlkYXRpb24gb24gZm9sZGVyIG5hbWUgZm9ybVxuXHRcdHRoaXMuX2FkZEZvbGRlclZhbGlkYXRvciA9ICQoJyNleG0tYWRkRm9sZGVyRm9ybScpLmtlbmRvVmFsaWRhdG9yKHt9KS5kYXRhKCdrZW5kb1ZhbGlkYXRvcicpO1xuXG5cdFx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0XHQvLyBJbml0aWFsaXplIFwidXBsb2FkIGZpbGVzXCIgbW9kYWxcblx0XHR0aGlzLl91cGxvYWRGaWxlc01vZGFsID0gJCgnI2V4bS11cGxvYWRNb2RhbCcpO1xuXHRcdHRoaXMuX3VwbG9hZEZpbGVzTW9kYWwubW9kYWwoe1xuXHRcdFx0YmFja2Ryb3A6ICdzdGF0aWMnLFxuXHRcdFx0a2V5Ym9hcmQ6IGZhbHNlLFxuXHRcdFx0c2hvdzogZmFsc2Vcblx0XHR9KTtcblxuXHRcdC8vIEluaXRpYWxpemUga2VuZG8gdXBsb2FkZXJcblx0XHR0aGlzLl91cGxvYWRlciA9ICQoJyNleG0tdXBsb2FkZXInKS5rZW5kb1VwbG9hZCh7XG5cdFx0XHRtdWx0aXBsZTogdHJ1ZSxcblx0XHRcdGFzeW5jOiB7XG5cdFx0XHRcdHNhdmVVcmw6ICdodHRwOi8vbG9jYWxob3N0JywgLy8gVGhpcyB3aWxsIGJlIGNoYW5nZWQgbGF0ZXIgaW4gX29uVXBsb2FkU3RhcnQgbWV0aG9kXG5cdFx0XHRcdGF1dG9VcGxvYWQ6IHRydWUsXG5cdFx0XHR9LFxuXHRcdFx0ZGlyZWN0b3J5RHJvcDogdHJ1ZSxcblx0XHRcdHVwbG9hZDogJC5wcm94eSh0aGlzLl9vblVwbG9hZFN0YXJ0LCB0aGlzKSxcblx0XHRcdGNvbXBsZXRlOiAkLnByb3h5KHRoaXMuX29uVXBsb2FkRW5kLCB0aGlzKSxcblx0XHRcdGxvY2FsaXphdGlvbjoge1xuXHRcdFx0XHRzZWxlY3Q6ICdTZWxlY3QgZmlsZXMuLi4nXG5cdFx0XHR9XG5cdFx0fSkuZGF0YSgna2VuZG9VcGxvYWQnKTtcblxuXHRcdC8vIEFkZCBsaXN0ZW5lciB0byBVcGxvYWQgYnV0dG9uIGNsaWNrXG5cdFx0JCgnI2V4bS1jbGVhckZpbGVzQnQnKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uQ2xlYXJGaWxlc0NsaWNrLCB0aGlzKSk7XG5cblx0XHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRcdC8vIFNlbmQgaW5pdGlhbGl6YXRpb24gcmVxdWVzdFxuXHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfSU5JVCk7XG5cdH1cblxuXHRkZXN0cm95KClcblx0e1xuXHRcdC8vIENhbGwgc3VwZXIgbWV0aG9kXG5cdFx0c3VwZXIuZGVzdHJveSgpO1xuXG5cdFx0JCgnI2V4bS1yZXRyeUJ0Jykub2ZmKCdjbGljaycpO1xuXHRcdCQoJyNleG0tcmVmcmVzaEJ0Jykub2ZmKCdjbGljaycpO1xuXG5cdFx0JCgnI2V4bS1maWxlTGlzdCcpLm9mZignY2xpY2snKTtcblxuXHRcdHRoaXMuX2FkZEZvbGRlck1vZGFsLm9mZignaGlkZGVuLmJzLm1vZGFsJyk7XG5cdFx0dGhpcy5fYWRkRm9sZGVyTW9kYWwubW9kYWwoJ2Rpc3Bvc2UnKTtcblx0XHQkKCcjZXhtLWFkZEZvbGRlckJ0Jykub2ZmKCdjbGljaycpO1xuXG5cdFx0dGhpcy5fdXBsb2FkRmlsZXNNb2RhbC5tb2RhbCgnZGlzcG9zZScpO1xuXHRcdCQoJyNleG0tY2xlYXJGaWxlc0J0Jykub2ZmKCdjbGljaycpO1xuXHR9XG5cblx0b25FeHRlbnNpb25Db21tYW5kKGNvbW1hbmQsIGRhdGEpXG5cdHtcblx0XHQvLyBNb2R1bGUgY2FuIGJlIGVuYWJsZWQgKG5vIGxvY2tpbmcgZmlsZSBleGlzdHMpXG5cdFx0aWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX0lOSVQpXG5cdFx0e1xuXHRcdFx0Ly8gUmV0cmlldmUgZmlsZSBzZXBhcmF0b3Jcblx0XHRcdHRoaXMuX2ZpbGVTZXBhcmF0b3IgPSBkYXRhLmdldFV0ZlN0cmluZygnc2VwJyk7XG5cblx0XHRcdC8vIFJldHJpZXZlIEV4dGVuc2lvbnMnIF9fbGliX18gZm9sZGVyIG5hbWVcblx0XHRcdGNvbnN0IGxpYkZvbGRlciA9IGRhdGEuZ2V0VXRmU3RyaW5nKCdsaWInKTtcblxuXHRcdFx0Ly8gQ3JlYXRlIGZpbGUgZGF0YSBzb3VyY2UgbWFuYWdlclxuXHRcdFx0dGhpcy5fZmlsZU1hbmFnZXIgPSBuZXcgRmlsZURhdGFTb3VyY2VNYW5hZ2VyKGxpYkZvbGRlciwgW2xpYkZvbGRlcl0sIHRoaXMuX2ZpbGVTZXBhcmF0b3IpO1xuXG5cdFx0XHQvLyBSZXRyaWV2ZSBtb2R1bGUgaWQgc2VudCBieSB0aGUgc2VydmVyIChyZXF1aXJlZCBiZWNhdXNlIG11bHRpcGxlIG1vZHVsZXMgdXNlIGZpbGUgdXBsb2FkaW5nIHNlcnZpY2UpXG5cdFx0XHRjb25zdCB1cGxvYWRNb2R1bGVJZCA9IGRhdGEuZ2V0VXRmU3RyaW5nKCdtb2RJZCcpO1xuXG5cdFx0XHQvLyBTZXQgZmlsZSB1cGxvYWRpbmcgdGFyZ2V0IGNvbmZpZ3VyYXRpb25cblx0XHRcdHRoaXMuX3VwbG9hZFRhcmdldENvbmZpZyA9IHtcblx0XHRcdFx0c2Vzc2lvblRva2VuOiB0aGlzLnNtYXJ0Rm94LnNlc3Npb25Ub2tlbixcblx0XHRcdFx0aG9zdDogdGhpcy5zbWFydEZveC5jb25maWcuaG9zdCxcblx0XHRcdFx0cG9ydDogdGhpcy5zbWFydEZveC5jb25maWcucG9ydCxcblx0XHRcdFx0bW9kdWxlSWQ6IHVwbG9hZE1vZHVsZUlkLFxuXHRcdFx0XHRwcm90b2NvbDogdGhpcy5zbWFydEZveC5jb25maWcudXNlU1NMID8gJ2h0dHBzJyA6ICdodHRwJ1xuXHRcdFx0fTtcblxuXHRcdFx0Ly8gUmVxdWVzdCBFeHRlbnNpb24gZmlsZXMgZGF0YSB0byBzZXJ2ZXIgaW5zdGFuY2Vcblx0XHRcdHRoaXMuX3JlZnJlc2hEYXRhTGlzdCgpO1xuXHRcdH1cblxuXHRcdC8qXG5cdFx0ICogVGhpcyByZXNwb25zZSBpcyByZXR1cm5lZCBpZiB0aGUgZmlsZSBVcGxvYWRzTG9jay50eHQgZXhpc3RzIGluIHRoZSAvY29uZmlnIGZvbGRlciBvZiB0aGUgc2VydmVyLlxuXHRcdCAqIFRoaXMgaXMgYW4gYWRkaXRpb25hbCBzZWN1cml0eSBtZWFzdXJlIHRvIGF2b2lkIHVud2FudGVkIGZpbGVzIHRvIGJlIHVwbG9hZGVkIGJ5IG1hbGljaXVzIHVzZXJzIGFjY2Vzc2luZyB0aGUgc2VydmVyXG5cdFx0ICogd2l0aCB0aGUgZGVmYXVsdCBjcmVkZW50aWFscywgaW4gY2FzZSB0aGV5IGhhdmUgbm90IGJlZW4gY2hhbmdlZCBieSB0aGUgYWRtaW5pc3RyYXRvciBhZnRlciB0aGUgaW5zdGFsbGF0aW9uLlxuXHRcdCAqIFRoZSBmaWxlIG11c3QgYmUgcmVtb3ZlZCBtYW51YWxseSBiZWZvcmUgYWNjZXNzaW5nIHRoZSBFeHRlbnNpb24gTWFuYWdlciBtb2R1bGUgZm9yIHRoZSBmaXJzdCB0aW1lXG5cdFx0ICovXG5cdFx0ZWxzZSBpZiAoY29tbWFuZCA9PSB0aGlzLlJFU1BfTE9DS0VEKVxuXHRcdHtcblx0XHRcdC8vIFNob3cgd2FybmluZ1xuXHRcdFx0dGhpcy5fc3dpdGNoVmlldygnZXhtLWxvY2tlZCcpO1xuXHRcdH1cblxuXHRcdC8vIEV4dGVuc2lvbnMgZm9sZGVycyBhbmQgZmlsZXNcblx0XHRlbHNlIGlmIChjb21tYW5kID09IHRoaXMuUkVTUF9FWFRFTlNJT05TKVxuXHRcdHtcblx0XHRcdC8vIFJldHJpZXZlIEV4dGVuc2lvbiBmaWxlIGxpc3Rcblx0XHRcdGxldCBleHRlbnNpb25zT2JqID0gZGF0YS5nZXRTRlNPYmplY3QoJ2V4dGVuc2lvbnMnKTtcblxuXHRcdFx0Ly8gSW5pdGlhbGl6ZSBtYW5hZ2VyXG5cdFx0XHR0aGlzLl9maWxlTWFuYWdlci5pbml0KCk7XG5cblx0XHRcdC8vIEFkZCBsaXN0IHRvIG1hbmFnZXJcblx0XHRcdHRoaXMuX2ZpbGVNYW5hZ2VyLmFkZEZpbGUoZXh0ZW5zaW9uc09iaik7XG5cblx0XHRcdC8vIFNldCBUcmVlTGlzdCBkYXRhIHNvdXJjZVxuXHRcdFx0dGhpcy5fZmlsZXNMaXN0LnNldERhdGFTb3VyY2UodGhpcy5fZmlsZU1hbmFnZXIuZGF0YVNvdXJjZSk7XG5cblx0XHRcdC8vIEV4cGFuZCBmaXJzdCBsZXZlbFxuXHRcdFx0dGhpcy5fZmlsZXNMaXN0LmV4cGFuZCgkKCcjZXhtLWZpbGVMaXN0IHRib2R5PnRyOmVxKDApJykpO1xuXG5cdFx0XHQvLyBFbmFibGUgaW50ZXJmYWNlXG5cdFx0XHR0aGlzLl9lbmFibGVJbnRlcmZhY2UodHJ1ZSk7XG5cblx0XHRcdC8vIFNob3cgbW9kdWxlJ3MgbWFpbiB2aWV3XG5cdFx0XHR0aGlzLl9zd2l0Y2hWaWV3KCdleG0tbWFpbicpO1xuXHRcdH1cblxuXHRcdC8vIEFuIGVycm9yIG9jY3VycmVkIHdoaWxlIG1hbmFnaW5nIGV4dGVuc2lvbiBmaWxlc1xuXHRcdGVsc2UgaWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX0VSUk9SKVxuXHRcdHtcblx0XHRcdC8vIEhpZGUgYWRkIGZvbGRlciBtb2RhbFxuXHRcdFx0dGhpcy5fYWRkRm9sZGVyTW9kYWwubW9kYWwoJ2hpZGUnKTtcblxuXHRcdFx0Ly8gUmUtZW5hYmxlIGludGVyZmFjZVxuXHRcdFx0dGhpcy5fZW5hYmxlSW50ZXJmYWNlKHRydWUpO1xuXG5cdFx0XHQvLyBTaG93IGFuIGFsZXJ0XG5cdFx0XHR0aGlzLnNoZWxsQ3RybC5zaG93U2ltcGxlQWxlcnQoZGF0YS5nZXRVdGZTdHJpbmcoJ2Vycm9yJykpO1xuXHRcdH1cblxuXHRcdC8vIEV4dGVuc2lvbiBmb2xkZXIgb3IgZmlsZSBhZGRlZFxuXHRcdGVsc2UgaWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX0ZJTEVfQURERUQpXG5cdFx0e1xuXHRcdFx0Ly8gR2V0IG5hbWUgb2YgdGhlIHVzZXIgd2hvIGFkZGVkIHRoZSBmaWxlL2ZvbGRlclxuXHRcdFx0Y29uc3QgcmVxdWVzdGVyID0gZGF0YS5nZXRVdGZTdHJpbmcoJ3VzZXInKTtcblxuXHRcdFx0Ly8gR2V0IHRoZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBmaWxlL2ZvbGRlciBiZWluZyBhZGRlZFxuXHRcdFx0Y29uc3QgZmlsZU9iaiA9IGRhdGEuZ2V0U0ZTT2JqZWN0KCdmaWxlJyk7XG5cblx0XHRcdC8vIEdldCB0aGUgdGFyZ2V0IGZvbGRlciB3aGVyZSB0aGUgbmV3IGZpbGUvZm9sZGVyIHNob3VsZCBiZSBhZGRlZFxuXHRcdFx0Y29uc3QgcGFyZW50UGF0aCA9IGRhdGEuZ2V0VXRmU3RyaW5nKCdwYXJlbnQnKTtcblxuXHRcdFx0Ly8gR2V0IHRoZSBmbGFnIG5vdGlmeWluZyB0aGlzIHdhcyBhIGZpbGUgdXBsb2FkXG5cdFx0XHRjb25zdCBpc1VwbG9hZCA9IGRhdGEuZ2V0Qm9vbCgnaXNVcGxvYWQnKTtcblxuXHRcdFx0dHJ5XG5cdFx0XHR7XG5cdFx0XHRcdC8vIEFkZC91cGRhdGUgaXRlbSBvbiBkYXRhIHNvdXJjZVxuXHRcdFx0XHRjb25zdCBmaWxlUGF0aCA9IHRoaXMuX2ZpbGVNYW5hZ2VyLmFkZEZpbGVUb1BhcmVudChmaWxlT2JqLCBwYXJlbnRQYXRoKTtcblxuXHRcdFx0XHQvLyBSZWZyZXNoIHZpZXdcblx0XHRcdFx0dGhpcy5fZmlsZXNMaXN0LnJlZnJlc2goKTtcblxuXHRcdFx0XHRpZiAocmVxdWVzdGVyID09IHRoaXMuc21hcnRGb3gubXlTZWxmLm5hbWUpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHQvLyBFeHBhbmQgcGFyZW50XG5cdFx0XHRcdFx0dGhpcy5fZmlsZXNMaXN0LmV4cGFuZCgkKGAjZXhtLWZpbGVMaXN0IC5maWxlLWNvbnRyb2xzW2RhdGEtaXRlbS1pZD1cIiR7JC5lc2NhcGVTZWxlY3RvcihwYXJlbnRQYXRoKX1cIl1gKS5jbG9zZXN0KCd0cicpKTtcblxuXHRcdFx0XHRcdGlmICghaXNVcGxvYWQpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0Ly8gSGlkZSBtb2RhbFxuXHRcdFx0XHRcdFx0dGhpcy5fYWRkRm9sZGVyTW9kYWwubW9kYWwoJ2hpZGUnKTtcblxuXHRcdFx0XHRcdFx0Ly8gU2VsZWN0IHVwbG9hZCBmaWxlXG5cdFx0XHRcdFx0XHR0aGlzLl9maWxlc0xpc3Quc2VsZWN0KCQoYCNleG0tZmlsZUxpc3QgLmZpbGUtY29udHJvbHNbZGF0YS1pdGVtLWlkPVwiJHskLmVzY2FwZVNlbGVjdG9yKGZpbGVQYXRoKX1cIl1gKS5jbG9zZXN0KCd0cicpKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBVcGRhdGUgc2VsZWN0aW9uXG5cdFx0XHRcdFx0dGhpcy5fb25GaWxlU2VsZWN0ZWRDaGFuZ2UoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdHtcblx0XHRcdFx0XHQvLyBEaXNwbGF5IG5vdGlmaWNhdGlvblxuXHRcdFx0XHRcdGlmICghaXNVcGxvYWQpXG5cdFx0XHRcdFx0XHR0aGlzLnNoZWxsQ3RybC5zaG93Tm90aWZpY2F0aW9uKGBGb2xkZXIgY3JlYXRlZGAsIGBBZG1pbmlzdHJhdG9yICR7cmVxdWVzdGVyfSBjcmVhdGVkIGZvbGRlcjogPHN0cm9uZz4ke2ZpbGVQYXRofTwvc3Ryb25nPmApO1xuXHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dOb3RpZmljYXRpb24oYEZpbGUgdXBsb2FkZWRgLCBgQWRtaW5pc3RyYXRvciAke3JlcXVlc3Rlcn0gdXBsb2FkZWQgZmlsZTogPHN0cm9uZz4ke2ZpbGVQYXRofTwvc3Ryb25nPmApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRjYXRjaCAoZSlcblx0XHRcdHtcblx0XHRcdFx0Ly8gVGhpcyBzaG91bGQgbm90IGhhcHBlbi4uLiBkYXRhIHNvdXJjZSBpcyBjb3JydXB0ZWQ/XG5cdFx0XHRcdGlmIChyZXF1ZXN0ZXIgPT0gdGhpcy5zbWFydEZveC5teVNlbGYubmFtZSlcblx0XHRcdFx0XHR0aGlzLnNoZWxsQ3RybC5zaG93U2ltcGxlQWxlcnQoZS5tZXNzYWdlLCB0cnVlKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gRW5hYmxlIGludGVyZmFjZVxuXHRcdFx0dGhpcy5fZW5hYmxlSW50ZXJmYWNlKHRydWUpO1xuXHRcdH1cblxuXHRcdC8vIEV4dGVuc2lvbiBmaWxlcyBkZWxldGVkXG5cdFx0ZWxzZSBpZiAoY29tbWFuZCA9PSB0aGlzLlJFU1BfRklMRVNfREVMRVRFRClcblx0XHR7XG5cdFx0XHQvLyBHZXQgbmFtZSBvZiB0aGUgdXNlciB3aG8gZGVsZXRlZCB0aGUgZmlsZS9zXG5cdFx0XHRjb25zdCByZXF1ZXN0ZXIgPSBkYXRhLmdldFV0ZlN0cmluZygndXNlcicpO1xuXG5cdFx0XHQvLyBHZXQgdGhlIGxpc3Qgb2YgZGVsZXRlZCBmaWxlc1xuXHRcdFx0bGV0IGZpbGVzID0gZGF0YS5nZXRTRlNBcnJheSgnZmlsZXMnKTtcblxuXHRcdFx0bGV0IGZpbGVzQXJyID0gW107XG5cblx0XHRcdC8vIFVwZGF0ZSBkYXRhIHNvdXJjZVxuXHRcdFx0Zm9yIChsZXQgaiA9IDA7IGogPCBmaWxlcy5zaXplKCk7IGorKylcblx0XHRcdHtcblx0XHRcdFx0bGV0IHBhdGggPSBmaWxlcy5nZXRVdGZTdHJpbmcoaik7XG5cdFx0XHRcdGZpbGVzQXJyLnB1c2gocGF0aCk7XG5cblx0XHRcdFx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRcdFx0XHQvLyBSZW1vdmUgaXRlbSBmcm9tIGRhdGEgc291cmNlOyBwYXJlbnQgaXRlbSBpcyByZXR1cm5lZFxuXHRcdFx0XHRsZXQgcGFyZW50SXRlbSA9IHRoaXMuX2ZpbGVNYW5hZ2VyLnJlbW92ZUZpbGUocGF0aCk7XG5cblx0XHRcdFx0Ly8gQ29sbGFwc2UgcGFyZW50IGlmIHRoZSBsYXN0IG9mIGl0cyBjaGlsZHJlbiB3YXMgZGVsZXRlZFxuXHRcdFx0XHRpZiAocGFyZW50SXRlbSAmJiAhcGFyZW50SXRlbS5oYXNDaGlsZHJlbilcblx0XHRcdFx0XHR0aGlzLl9maWxlc0xpc3QuY29sbGFwc2UoJChgI2V4bS1maWxlTGlzdCAuZmlsZS1jb250cm9sc1tkYXRhLWl0ZW0taWQ9XCIkeyQuZXNjYXBlU2VsZWN0b3IocGFyZW50SXRlbS5pZCl9XCJdYCkuY2xvc2VzdCgndHInKSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChyZXF1ZXN0ZXIgPT0gdGhpcy5zbWFydEZveC5teVNlbGYubmFtZSlcblx0XHRcdHtcblx0XHRcdFx0Ly8gRGlzcGxheSBub3RpZmljYXRpb25cblx0XHRcdFx0dGhpcy5zaGVsbEN0cmwuc2hvd05vdGlmaWNhdGlvbihgJHt0aGlzLl9zZWxlY3RlZEl0ZW0uaXNEaXIgPyAnRm9sZGVyJyA6ICdGaWxlJ30gZGVsZXRlZGAsIGAke3RoaXMuX3NlbGVjdGVkSXRlbS5pc0RpciA/ICdGb2xkZXInIDogJ0ZpbGUnfSAnJHt0aGlzLl9zZWxlY3RlZEl0ZW0ubmFtZX0nIGRlbGV0ZWQgc3VjY2Vzc2Z1bGx5YCk7XG5cblx0XHRcdFx0dGhpcy5fc2VsZWN0ZWRJdGVtID0gbnVsbDtcblxuXHRcdFx0XHR0aGlzLl9lbmFibGVJbnRlcmZhY2UodHJ1ZSk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlXG5cdFx0XHR7XG5cdFx0XHRcdC8vIERpc3BsYXkgbm90aWZpY2F0aW9uXG5cdFx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dOb3RpZmljYXRpb24oYEZpbGUgZGVsZXRlZGAsIGBBZG1pbmlzdHJhdG9yICR7cmVxdWVzdGVyfSBkZWxldGVkIHRoZSBmb2xsb3dpbmcgZmlsZSR7ZmlsZXNBcnIubGVuZ3RoID4gMSA/ICdzJyA6ICcnfTogPHN0cm9uZz4ke2ZpbGVzQXJyLmpvaW4oJzxicj4gJyl9PC9zdHJvbmc+YCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJlc2V0IHNlbGVjdGlvblxuXHRcdFx0dGhpcy5fb25GaWxlU2VsZWN0ZWRDaGFuZ2UoKTtcblx0XHR9XG5cblx0XHQvLyBlbHNlIGlmICgpXG5cdH1cblxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQvLyBVSSBFVkVOVCBMSVNURU5FUlNcblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRfb25SZXRyeUNsaWNrKClcblx0e1xuXHRcdHRoaXMuX3N3aXRjaFZpZXcoJ2V4bS1pbml0Jyk7XG5cblx0XHQvLyBSZS1zZW5kIGluaXRpYWxpemF0aW9uIHJlcXVlc3Rcblx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX0lOSVQpO1xuXHR9XG5cblx0X29uUmVmcmVzaENsaWNrKClcblx0e1xuXHRcdHRoaXMuX2ZpbGVzTGlzdC5jbGVhclNlbGVjdGlvbigpO1xuXHRcdHRoaXMuX3JlZnJlc2hEYXRhTGlzdCgpO1xuXHR9XG5cblx0X29uRmlsZVNlbGVjdGVkQ2hhbmdlKClcblx0e1xuXHRcdC8vIEhpZGUgY29udHJvbCBidXR0b25zIG9uIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtXG5cdFx0aWYgKHRoaXMuX3NlbGVjdGVkSXRlbSlcblx0XHRcdCQoYCNleG0tZmlsZUxpc3QgLmZpbGUtY29udHJvbHNbZGF0YS1pdGVtLWlkPVwiJHskLmVzY2FwZVNlbGVjdG9yKHRoaXMuX3NlbGVjdGVkSXRlbS5pZCl9XCJdYCkuaGlkZSgpO1xuXG5cdFx0Ly8gR2V0IHNlbGVjdGVkIGl0ZW1cblx0XHRsZXQgc2VsZWN0ZWRSb3dzID0gdGhpcy5fZmlsZXNMaXN0LnNlbGVjdCgpO1xuXG5cdFx0aWYgKHNlbGVjdGVkUm93cy5sZW5ndGggPiAwKVxuXHRcdHtcblx0XHRcdC8vIFNhdmUgcmVmLiB0byBzZWxlY3RlZCBpdGVtXG5cdFx0XHR0aGlzLl9zZWxlY3RlZEl0ZW0gPSB0aGlzLl9maWxlc0xpc3QuZGF0YUl0ZW0oc2VsZWN0ZWRSb3dzWzBdKTtcblxuXHRcdFx0Ly8gU2hvdyBjb250cm9sIGJ1dHRvbnMgb24gbmV3IHNlbGVjdGVkIGl0ZW1cblx0XHRcdCQoYCNleG0tZmlsZUxpc3QgLmZpbGUtY29udHJvbHNbZGF0YS1pdGVtLWlkPVwiJHskLmVzY2FwZVNlbGVjdG9yKHRoaXMuX3NlbGVjdGVkSXRlbS5pZCl9XCJdYCkuc2hvdygpO1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0XHR0aGlzLl9zZWxlY3RlZEl0ZW0gPSBudWxsO1xuXHR9XG5cblx0X3Nob3dBZGRGb2xkZXJNb2RhbENsaWNrKClcblx0e1xuXHRcdGlmICh0aGlzLl9zZWxlY3RlZEl0ZW0gJiYgdGhpcy5fc2VsZWN0ZWRJdGVtLmlzRGlyKVxuXHRcdHtcblx0XHRcdHRoaXMuX2FkZEZvbGRlck1vZGFsLm1vZGFsKCdzaG93Jyk7XG5cdFx0XHQkKCcjZXhtLWZvbGRlck5hbWVJbicpLmZvY3VzKCk7XG5cdFx0fVxuXHR9XG5cblx0X29uQWRkRm9sZGVyQ2xpY2soKVxuXHR7XG5cdFx0Ly8gVGhlIHBhcmVudCBmb2xkZXIgY291bGQgaGF2ZSBiZWVuIGRlbGV0ZWQgd2hpbGUgdXNlciBpcyBzdGlsbCB0eXBpbmcgdGhlIG5hbWUgb2YgdGhlIG5ldyBjaGlsZCBmb2xkZXJcblx0XHRpZiAoIXRoaXMuX3NlbGVjdGVkSXRlbSlcblx0XHR7XG5cdFx0XHR0aGlzLl9hZGRGb2xkZXJNb2RhbC5tb2RhbCgnaGlkZScpO1xuXHRcdFx0dGhpcy5zaGVsbEN0cmwuc2hvd1NpbXBsZUFsZXJ0KCdVbmFibGUgdG8gY3JlYXRlIGZvbGRlcjsgdGhlIHBhcmVudCBmb2xkZXIgZG9lc25cXCd0IGV4aXN0LicpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLl9hZGRGb2xkZXJWYWxpZGF0b3IudmFsaWRhdGUoKSlcblx0XHR7XG5cdFx0XHQvLyBEaXNhYmxlIG1vZGFsIGludGVyZmFjZVxuXHRcdFx0dGhpcy5fZW5hYmxlQWRkRm9sZGVyTW9kYWwoZmFsc2UpO1xuXG5cdFx0XHRsZXQgZGF0YSA9IG5ldyBTRlMyWC5TRlNPYmplY3QoKTtcblx0XHRcdGRhdGEucHV0VXRmU3RyaW5nKCdmb2xkZXInLCB0aGlzLl9zZWxlY3RlZEl0ZW0uaWQgKyB0aGlzLl9maWxlU2VwYXJhdG9yICsgJCgnI2V4bS1mb2xkZXJOYW1lSW4nKS52YWwoKSk7XG5cblx0XHRcdC8vIFNlbmQgcmVxdWVzdCB0byBzZXJ2ZXJcblx0XHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfQ1JFQVRFX0ZPTERFUiwgZGF0YSk7XG5cdFx0fVxuXHR9XG5cblx0X29uQWRkRm9sZGVyTW9kYWxIaWRkZW4oKVxuXHR7XG5cdFx0JCgnI2V4bS1mb2xkZXJOYW1lSW4nKS52YWwoJycpO1xuXHRcdHRoaXMuX3Jlc2V0QWRkRm9sZGVyVmFsaWRhdGlvbigpO1xuXG5cdFx0Ly8gRW5hYmxlIG1vZGFsIGludGVyZmFjZVxuXHRcdHRoaXMuX2VuYWJsZUFkZEZvbGRlck1vZGFsKHRydWUpO1xuXHR9XG5cblx0X3Nob3dVcGxvYWRGaWxlc01vZGFsQ2xpY2soKVxuXHR7XG5cdFx0aWYgKHRoaXMuX3NlbGVjdGVkSXRlbSlcblx0XHRcdHRoaXMuX3VwbG9hZEZpbGVzTW9kYWwubW9kYWwoJ3Nob3cnKTtcblx0fVxuXG5cdF9vbkNsZWFyRmlsZXNDbGljaygpXG5cdHtcblx0XHR0aGlzLl91cGxvYWRlci5jbGVhckFsbEZpbGVzKCk7XG5cdH1cblxuXHRfb25VcGxvYWRTdGFydChlKVxuXHR7XG5cdFx0Ly8gRGlzYWJsZSBjbGVhciBidXR0b25cblx0XHQkKCcjZXhtLWNsZWFyRmlsZXNCdCcpLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSk7XG5cblx0XHQvLyBTZXQgZGVzdGluYXRpb24gdXJsXG5cdFx0Y29uc3QgdXJsID0gdGhpcy5fdXBsb2FkVGFyZ2V0Q29uZmlnLnByb3RvY29sICsgJzovLycgKyB0aGlzLl91cGxvYWRUYXJnZXRDb25maWcuaG9zdCArICc6JyArIHRoaXMuX3VwbG9hZFRhcmdldENvbmZpZy5wb3J0ICsgJy9CbHVlQm94L1NGUzJYRmlsZVVwbG9hZD9zZXNzSGFzaElkPScgKyB0aGlzLl91cGxvYWRUYXJnZXRDb25maWcuc2Vzc2lvblRva2VuO1xuXHRcdFxuXHRcdGUuc2VuZGVyLm9wdGlvbnMuYXN5bmMuc2F2ZVVybCA9IHVybDtcblxuXHRcdC8vIFNldCBwYXlsb2FkXG5cdFx0Y29uc3QgcGFyYW1zID0gbmV3IEZvcm1EYXRhKCk7XG5cdFx0cGFyYW1zLmFwcGVuZCgnX19tb2R1bGUnLCB0aGlzLl91cGxvYWRUYXJnZXRDb25maWcubW9kdWxlSWQpO1xuXHRcdHBhcmFtcy5hcHBlbmQoJ19fdGFyZ2V0JywgdGhpcy5fc2VsZWN0ZWRJdGVtLmlkKTtcblxuXHRcdGZvciAobGV0IGYgPSAwOyBmIDwgZS5maWxlcy5sZW5ndGg7IGYrKylcblx0XHRcdHBhcmFtcy5hcHBlbmQoJ2ZpbGVzW10nLCBlLmZpbGVzW2ZdLnJhd0ZpbGUpO1xuXG5cdFx0ZS5mb3JtRGF0YSA9IHBhcmFtcztcblx0fVxuXG5cdF9vblVwbG9hZEVuZChlKVxuXHR7XG5cdFx0Ly8gRW5hYmxlIGNsZWFyIGJ1dHRvblxuXHRcdCQoJyNleG0tY2xlYXJGaWxlc0J0JykuYXR0cignZGlzYWJsZWQnLCBmYWxzZSk7XG5cdH1cblxuXHRfb25GaWxlc1VwbG9hZEVuZChyZXNwb25zZSlcblx0e1xuXHRcdC8vIE5vdGhpbmcgdG8gZG86IHdlIGhhdmUgdG8gd2FpdCB0aGUgdXBsb2FkIHByb2Nlc3MgY29tcGxldGlvbiB0byBiZSBzaWduYWxlZCBieSB0aGUgc2VydmVyIHRocm91Z2ggdGhlIGRlZGljYXRlZCBFeHRlbnNpb24gcmVzcG9uc2VcblxuXHRcdC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHRcdC8vIFRPRE8gU2hvdWxkIHdlIGhhbmRsZSB0aGlzIHJlc3BvbnNlIGluIHNvbWUgd2F5PyBGb3Igc29tZSB1bmtub3duIHJlYXNvbiB3ZSBhbHdheXMgZ2V0IG9rPWZhbHNlIGFuZCBzdGF0dXM9MFxuXHRcdC8vIGNvbnNvbGUubG9nKHJlc3BvbnNlKVxuXHRcdC8vIGNvbnNvbGUubG9nKHJlc3BvbnNlLm9rKVxuXHRcdC8vIGNvbnNvbGUubG9nKHJlc3BvbnNlLnN0YXR1cylcblx0fVxuXG5cdF9vblJlbW92ZUZpbGVDbGljaygpXG5cdHtcblx0XHRpZiAodGhpcy5fc2VsZWN0ZWRJdGVtKVxuXHRcdFx0dGhpcy5zaGVsbEN0cmwuc2hvd0NvbmZpcm1XYXJuaW5nKGBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoZSBzZWxlY3RlZCAke3RoaXMuX3NlbGVjdGVkSXRlbS5pc0RpciA/ICdmb2xkZXInIDogJ2ZpbGUnfT88YnI+PGJyPlBhdGg6IDxzdHJvbmc+JHt0aGlzLl9zZWxlY3RlZEl0ZW0uaWR9PC9zdHJvbmc+YCwgJC5wcm94eSh0aGlzLl9vblJlbW92ZUZpbGVDb25maXJtLCB0aGlzKSk7XG5cdH1cblxuXHRfb25SZW1vdmVGaWxlQ29uZmlybSgpXG5cdHtcblx0XHQvLyBEaXNhYmxlIGludGVyZmFjZVxuXHRcdHRoaXMuX2VuYWJsZUludGVyZmFjZShmYWxzZSk7XG5cblx0XHQvLyBSZXF1ZXN0IEV4dGVuc2lvbiBmaWxlcyByZW1vdmFsXG5cdFx0Ly8gTk9URTogZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBBZG1pblRvb2wsIHRoZSBmaWxlIHRvIGJlIGRlbGV0ZWQgaXMgc2VudFxuXHRcdC8vIGluIGFuIGFycmF5IG9mIHN0cmluZ3MsIGV2ZW4gaWYgd2UgY2FuJ3QgZGVsZXRlIG1vcmUgdGhhbiAxIGZpbGUgYXQgb25jZSBpbiB0aGlzIEFkbWluVG9vbFxuXG5cdFx0bGV0IGZpbGVzID0gbmV3IFNGUzJYLlNGU0FycmF5KCk7XG5cdFx0ZmlsZXMuYWRkVXRmU3RyaW5nKHRoaXMuX3NlbGVjdGVkSXRlbS5pZCk7XG5cblx0XHRsZXQgcGFyYW1zID0gbmV3IFNGUzJYLlNGU09iamVjdCgpO1xuXHRcdHBhcmFtcy5wdXRTRlNBcnJheSgnZmlsZXMnLCBmaWxlcyk7XG5cblx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX0RFTEVURV9GSUxFUywgcGFyYW1zKTtcblx0fVxuXG5cdF9vblJlbG9hZEV4dENsaWNrKClcblx0e1xuXHRcdGlmICh0aGlzLl9zZWxlY3RlZEl0ZW0pXG5cdFx0e1xuXHRcdFx0bGV0IHBhdGhBcnIgPSB0aGlzLl9zZWxlY3RlZEl0ZW0uaWQuc3BsaXQodGhpcy5fZmlsZVNlcGFyYXRvcik7XG5cblx0XHRcdGlmIChwYXRoQXJyLmxlbmd0aCA+IDEpXG5cdFx0XHR7XG5cdFx0XHRcdC8vIFJlcXVlc3QgRXh0ZW5zaW9uIHJlbG9hZFxuXHRcdFx0XHQvLyBOT1RFOiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIEFkbWluVG9vbCwgdGhlIEV4dGVuc2lvbiB0byBiZSByZWxvYWRlZCBpcyBzZW50XG5cdFx0XHRcdC8vIGluIGFuIGFycmF5IG9mIHN0cmluZ3MsIGV2ZW4gaWYgd2UgY2FuJ3QgcmVsb2FkIG1vcmUgdGhhbiAxIEV4dGVuc2lvbiBhdCBvbmNlIGluIHRoaXMgQWRtaW5Ub29sXG5cblx0XHRcdFx0bGV0IGV4dFRvUmVsb2FkID0gW107XG5cdFx0XHRcdGV4dFRvUmVsb2FkLnB1c2gocGF0aEFyclsxXSk7XG5cblx0XHRcdFx0bGV0IHBhcmFtcyA9IG5ldyBTRlMyWC5TRlNPYmplY3QoKTtcblx0XHRcdFx0cGFyYW1zLnB1dFV0ZlN0cmluZ0FycmF5KCdleHRlbnNpb25zJywgZXh0VG9SZWxvYWQpO1xuXG5cdFx0XHRcdC8vIFNlbmQgcmVxdWVzdCB0byBzZXJ2ZXJcblx0XHRcdFx0dGhpcy5zZW5kRXh0ZW5zaW9uUmVxdWVzdCh0aGlzLlJFUV9SRUxPQURfRVhURU5TSU9OUywgcGFyYW1zKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQvLyBQUklWQVRFIE1FVEhPRFNcblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRfc3dpdGNoVmlldyh2aWV3SWQpXG5cdHtcblx0XHRkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhtLXZpZXdzdGFjaycpLnNlbGVjdGVkRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHZpZXdJZCk7XG5cdH1cblxuXHRfZW5hYmxlSW50ZXJmYWNlKGVuYWJsZSlcblx0e1xuXHRcdCQoJyNleG0tZmlsZUxpc3QnKS5hdHRyKCdkaXNhYmxlZCcsICFlbmFibGUpO1xuXHRcdCQoJyNleG0tcmVmcmVzaEJ0JykuYXR0cignZGlzYWJsZWQnLCAhZW5hYmxlKTtcblx0fVxuXG5cdF9yZWZyZXNoRGF0YUxpc3QoKVxuXHR7XG5cdFx0Ly8gRGlzYWJsZSBpbnRlcmZhY2Vcblx0XHR0aGlzLl9lbmFibGVJbnRlcmZhY2UoZmFsc2UpO1xuXG5cdFx0Ly8gU2VuZCByZXF1ZXN0IHRvIHNlcnZlclxuXHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfR0VUX0VYVEVOU0lPTlMpXG5cdH1cblxuXHRfcmVzZXRBZGRGb2xkZXJWYWxpZGF0aW9uKClcblx0e1xuXHRcdHRoaXMuX2FkZEZvbGRlclZhbGlkYXRvci5oaWRlTWVzc2FnZXMoKTtcblxuXHRcdC8vIFRoZSBtZXRob2QgYWJvdmUgZG9lc24ndCByZW1vdmUgdGhlIGstaW52YWxpZCBjbGFzc2VzIGFuZCBhcmlhLWludmFsaWQ9XCJ0cnVlXCIgYXR0cmlidXRlcyBmcm9tIGlucHV0c1xuXHRcdC8vIExldCdzIGRvIGl0IG1hbnVhbGx5XG5cdFx0JCgnI2V4bS1hZGRGb2xkZXJGb3JtIC5rLWludmFsaWQnKS5yZW1vdmVDbGFzcygnay1pbnZhbGlkJyk7XG5cdFx0JCgnI2V4bS1hZGRGb2xkZXJGb3JtIFthcmlhLWludmFsaWQ9XCJ0cnVlXCJdJykucmVtb3ZlQXR0cignYXJpYS1pbnZhbGlkJyk7XG5cdH1cblxuXHRfZW5hYmxlQWRkRm9sZGVyTW9kYWwoZW5hYmxlKVxuXHR7XG5cdFx0Ly8gRGlzYWJsZSBtb2RhbCBjbG9zZSBidXR0b25zXG5cdFx0JCgnI2V4bS1hZGRGb2xkZXJNb2RhbCBidXR0b25bZGF0YS1kaXNtaXNzPVwibW9kYWxcIl0nKS5hdHRyKCdkaXNhYmxlZCcsICFlbmFibGUpO1xuXG5cdFx0Ly8gRGlzYWJsZSBhZGQgYnV0dG9uXG5cdFx0JCgnI2V4bS1hZGRGb2xkZXJCdCcpLmF0dHIoJ2Rpc2FibGVkJywgIWVuYWJsZSk7XG5cblx0XHQvLyBEaXNhYmxlIGZpZWxkc2V0XG5cdFx0JCgnI2V4bS1hZGRGb2xkZXJGb3JtJykuYXR0cignZGlzYWJsZWQnLCAhZW5hYmxlKTtcblx0fVxuXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdC8vIFBSSVZBVEUgR0VUVEVSU1xuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNoSkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBIiwic291cmNlUm9vdCI6IiJ9
@@ -355,7 +355,7 @@ class SslCertificateManager extends HTMLElement
355
355
  params.append('__module', this._uploadTargetConfig.moduleId);
356
356
 
357
357
  // Set destination url
358
- const url = 'http://' + this._uploadTargetConfig.host + ':' + this._uploadTargetConfig.httpPort + '/BlueBox/SFS2XFileUpload?sessHashId=' + this._uploadTargetConfig.sessionToken;
358
+ const url = this._uploadTargetConfig.protocol + '://' + this._uploadTargetConfig.host + ':' + this._uploadTargetConfig.port + '/BlueBox/SFS2XFileUpload?sessHashId=' + this._uploadTargetConfig.sessionToken;
359
359
 
360
360
  // Start upload
361
361
  fetch(url, {
@@ -590,9 +590,6 @@ class ServerConfigurator extends _base_module__WEBPACK_IMPORTED_MODULE_0__["Base
590
590
  // Initialization data received
591
591
  if (command == this.RESP_INIT)
592
592
  {
593
- // Retrieve HTTP port to be used for SSL certificate file uploading
594
- const uploadHttpPort = data.getInt('httpPort');
595
-
596
593
  // Retrieve module id sent by the server (required because multiple modules use file uploading service)
597
594
  const uploadModuleId = data.getUtfString('modId');
598
595
 
@@ -600,8 +597,9 @@ class ServerConfigurator extends _base_module__WEBPACK_IMPORTED_MODULE_0__["Base
600
597
  this._sslCertManager.uploadTargetConfig = {
601
598
  sessionToken: this.smartFox.sessionToken,
602
599
  host: this.smartFox.config.host,
603
- httpPort: uploadHttpPort,
600
+ port: this.smartFox.config.port,
604
601
  moduleId: uploadModuleId,
602
+ protocol: this.smartFox.config.useSSL ? 'https' : 'http'
605
603
  };
606
604
 
607
605
  // Server sends a flag indicating if file uploads are locked
@@ -844,4 +842,4 @@ class ServerConfigurator extends _base_module__WEBPACK_IMPORTED_MODULE_0__["Base
844
842
  /***/ })
845
843
 
846
844
  }]);
847
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXRzL2pzL2NvcmUvbW9kdWxlcy9tb2R1bGUtOS5idW5kbGUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9jb21wb25lbnRzL21vZHVsZS1zcGVjaWZpYy9zc2wtY2VydGlmaWNhdGUtbWFuYWdlci5qcyIsIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9tb2R1bGVzL3NlcnZlci1jb25maWd1cmF0b3IuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtieXRlc1RvU2l6ZX0gZnJvbSAnLi4vLi4vdXRpbHMvdXRpbGl0aWVzJztcbmltcG9ydCBhZXNqcyBmcm9tICdhZXMtanMnO1xuXG5leHBvcnQgY2xhc3MgU3NsQ2VydGlmaWNhdGVNYW5hZ2VyIGV4dGVuZHMgSFRNTEVsZW1lbnRcbntcblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdCAgICBzdXBlcigpO1xuXG5cdFx0dGhpcy5fbW9kYWxIdG1sID0gYFxuXHRcdFx0PGRpdiBjbGFzcz1cIm1vZGFsXCIgaWQ9XCJ1cGxvYWRNb2RhbFwiIHRhYmluZGV4PVwiLTFcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1sYWJlbGxlZGJ5PVwidXBsb2FkTW9kYWxUaXRsZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nIG1vZGFsLWRpYWxvZy1jZW50ZXJlZFwiIHJvbGU9XCJkb2N1bWVudFwiPlxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XG5cdFx0XHRcdFx0XHRcdDxoNSBjbGFzcz1cIm1vZGFsLXRpdGxlIHRleHQtcHJpbWFyeVwiIGlkPVwidXBsb2FkTW9kYWxUaXRsZVwiPlNTTCBDZXJ0aWZpY2F0ZSBNYW5hZ2VyPC9oNT5cblx0XHRcdFx0XHRcdFx0PGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjbG9zZVwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCI+XG5cdFx0XHRcdFx0XHRcdFx0PHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JnRpbWVzOzwvc3Bhbj5cblx0XHRcdFx0XHRcdFx0PC9idXR0b24+XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5IGluLWZsb3ctaW52YWxpZC1tc2dcIj5cblx0XHRcdFx0XHRcdFx0PGZpZWxkc2V0IGlkPVwidXBsb2FkRmllbGRzZXRcIj5cblx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGlkPVwidXBsb2FkZXJTdWJmb3JtXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY29sLWZvcm0tbGFiZWwgZm9ybS1sYWJlbC1jb250YWluZXJcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8bGFiZWwgZm9yPVwidXBsb2FkZXJcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5DZXJ0aWZpY2F0ZSBrZXlzdG9yZSAoamtzKSA8aSBjbGFzcz1cImZhcyBmYS1xdWVzdGlvbi1jaXJjbGUgdGV4dC1tdXRlZCBoZWxwXCIgdGl0bGU9XCJTU0wgY2VydGlmaWNhdGUncyBwcm90ZWN0ZWQga2V5c3RvcmUgZmlsZSB0byBiZSB1cGxvYWRlZCB0byB0aGUgc2VydmVyLCBpbiBqa3MgZm9ybWF0XCI+PC9pPjwvbGFiZWw+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiaW5uZXItd2lkZ2V0XCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGlucHV0IHR5cGU9XCJmaWxlXCIgaWQ9XCJ1cGxvYWRlclwiIG5hbWU9XCJ1cGxvYWRlclwiIGFjY2VwdD1cIi5qa3NcIiBkYXRhLXVwbG9hZC1tc2c9XCJTZWxlY3QgYSBmaWxlXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJrLWludmFsaWQtbXNnIHBvc2l0aW9uLXN0YXRpY1wiIGRhdGEtZm9yPVwidXBsb2FkZXJcIj48L3NwYW4+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0PGRpdiBpZD1cInBhc3N3b3Jkc1N1YmZvcm1cIj5cblx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJmb3JtLXJvd1wiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBjb2xcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY29sLWZvcm0tbGFiZWwgZm9ybS1sYWJlbC1jb250YWluZXJcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxsYWJlbCBmb3I9XCJrc1Bhc3N3b3JkXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+S2V5c3RvcmUgcGFzc3dvcmQgPGkgY2xhc3M9XCJmYXMgZmEtcXVlc3Rpb24tY2lyY2xlIHRleHQtbXV0ZWQgaGVscFwiIHRpdGxlPVwiUGFzc3dvcmQgdXNlZCB0byBwcm90ZWN0IHRoZSBjZXJ0aWZpY2F0ZSBrZXlzdG9yZVwiPjwvaT48L2xhYmVsPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJpbm5lci13aWRnZXRcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxpbnB1dCB0eXBlPVwicGFzc3dvcmRcIiBpZD1cImtzUGFzc3dvcmRcIiBuYW1lPVwia3NQYXNzd29yZFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIGstdGV4dGJveFwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHJlcXVpcmVkIGRhdGEtcmVxdWlyZWQtbXNnPVwiUmVxdWlyZWRcIiAvPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJrLWludmFsaWQtbXNnIHBvc2l0aW9uLXN0YXRpY1wiIGRhdGEtZm9yPVwia3NQYXNzd29yZFwiPjwvc3Bhbj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgY29sXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImNvbC1mb3JtLWxhYmVsIGZvcm0tbGFiZWwtY29udGFpbmVyXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8bGFiZWwgZm9yPVwiY29uZmlybUtzUGFzc3dvcmRcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5Db25maXJtIHBhc3N3b3JkIDxpIGNsYXNzPVwiZmFzIGZhLXF1ZXN0aW9uLWNpcmNsZSB0ZXh0LW11dGVkIGhlbHBcIiB0aXRsZT1cIktleXN0b3JlIHBhc3N3b3JkIGNvbmZpcm1hdGlvblwiPjwvaT48L2xhYmVsPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJpbm5lci13aWRnZXRcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxpbnB1dCB0eXBlPVwicGFzc3dvcmRcIiBpZD1cImNvbmZpcm1Lc1Bhc3N3b3JkXCIgbmFtZT1cImNvbmZpcm1Lc1Bhc3N3b3JkXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgay10ZXh0Ym94XCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgcmVxdWlyZWQgZGF0YS1yZXF1aXJlZC1tc2c9XCJSZXF1aXJlZFwiIC8+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImstaW52YWxpZC1tc2cgcG9zaXRpb24tc3RhdGljXCIgZGF0YS1mb3I9XCJjb25maXJtS3NQYXNzd29yZFwiPjwvc3Bhbj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblxuXHRcdFx0XHRcdFx0XHRcdFx0PHA+PGVtPkZvciBhZGRpdGlvbmFsIHNlY3VyaXR5LCBlbnRlciBhZ2FpbiBhbmQgY29uZmlybSB5b3VyIFNGUzJYIGFkbWluaXN0cmF0aW9uIHBhc3N3b3JkLjwvZW0+PC9wPlxuXG5cdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZm9ybS1yb3dcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgY29sXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImNvbC1mb3JtLWxhYmVsIGZvcm0tbGFiZWwtY29udGFpbmVyXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8bGFiZWwgZm9yPVwiYWRtaW5QYXNzd29yZFwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkFkbWluIHBhc3N3b3JkIDxpIGNsYXNzPVwiZmFzIGZhLXF1ZXN0aW9uLWNpcmNsZSB0ZXh0LW11dGVkIGhlbHBcIiB0aXRsZT1cIlNtYXJ0Rm94U2VydmVyIDJYIHJlbW90ZSBhZG1pbmlzdHJhdGlvbiBwYXNzd29yZFwiPjwvaT48L2xhYmVsPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJpbm5lci13aWRnZXRcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxpbnB1dCB0eXBlPVwicGFzc3dvcmRcIiBpZD1cImFkbWluUGFzc3dvcmRcIiBuYW1lPVwiYWRtaW5QYXNzd29yZFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIGstdGV4dGJveFwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHJlcXVpcmVkIGRhdGEtcmVxdWlyZWQtbXNnPVwiUmVxdWlyZWRcIiAvPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJrLWludmFsaWQtbXNnIHBvc2l0aW9uLXN0YXRpY1wiIGRhdGEtZm9yPVwiYWRtaW5QYXNzd29yZFwiPjwvc3Bhbj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgY29sXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImNvbC1mb3JtLWxhYmVsIGZvcm0tbGFiZWwtY29udGFpbmVyXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8bGFiZWwgZm9yPVwiY29uZmlybUFkbWluUGFzc3dvcmRcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5Db25maXJtIHBhc3N3b3JkIDxpIGNsYXNzPVwiZmFzIGZhLXF1ZXN0aW9uLWNpcmNsZSB0ZXh0LW11dGVkIGhlbHBcIiB0aXRsZT1cIlNtYXJ0Rm94U2VydmVyIDJYIHJlbW90ZSBhZG1pbmlzdHJhdGlvbiBwYXNzd29yZCBjb25maXJtYXRpb25cIj48L2k+PC9sYWJlbD5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiaW5uZXItd2lkZ2V0XCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8aW5wdXQgdHlwZT1cInBhc3N3b3JkXCIgaWQ9XCJjb25maXJtQWRtaW5QYXNzd29yZFwiIG5hbWU9XCJjb25maXJtQWRtaW5QYXNzd29yZFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIGstdGV4dGJveFwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHJlcXVpcmVkIGRhdGEtcmVxdWlyZWQtbXNnPVwiUmVxdWlyZWRcIiAvPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJrLWludmFsaWQtbXNnIHBvc2l0aW9uLXN0YXRpY1wiIGRhdGEtZm9yPVwiY29uZmlybUFkbWluUGFzc3dvcmRcIj48L3NwYW4+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdDwvZmllbGRzZXQ+XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXIgZmxleC1jb2x1bW5cIj5cblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImQtZmxleCB3LTEwMFwiPlxuXHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJmbGV4LWdyb3ctMSB0ZXh0LWxlZnRcIj5cblx0XHRcdFx0XHRcdFx0XHRcdDxidXR0b24gaWQ9XCJ1cGxvYWRTc2xCdXR0b25cIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJrLWJ1dHRvbiBrLXByaW1hcnlcIj48aSBjbGFzcz1cImZhcyBmYS11cGxvYWQgbXItMVwiPjwvaT5VcGxvYWQgY2VydGlmaWNhdGU8L2J1dHRvbj5cblx0XHRcdFx0XHRcdFx0XHRcdDxpIGlkPVwidXBsb2FkU3Bpbm5lclwiIGNsYXNzPVwiZmFzIGZhLWNpcmNsZS1ub3RjaCBmYS1zcGluIHRleHQtcHJpbWFyeSBhbGlnbi1taWRkbGUgbWwtMVwiPjwvaT5cblx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZmxleC1ncm93LTEgdGV4dC1yaWdodFwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0PGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJrLWJ1dHRvbiBrLXNlY29uZGFyeVwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCI+Q2FuY2VsPC9idXR0b24+XG5cdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGlkPVwidXBsb2FkRXJyb3JNc2dcIiBjbGFzcz1cInRleHQtZGFuZ2VyIG10LTNcIj48L2Rpdj5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdDwvZGl2PlxuXHRcdGA7XG5cblx0XHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRcdCQodGhpcykuYXBwZW5kKGBcblx0XHRcdDxkaXYgY2xhc3M9XCJjb2wtc20tNSBjb2wtbGctNCBjb2wtZm9ybS1sYWJlbCBmb3JtLWxhYmVsLWNvbnRhaW5lclwiPlxuXHRcdFx0XHQ8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+VXBsb2FkIGNlcnRpZmljYXRlIDxpIGNsYXNzPVwiZmFzIGZhLXF1ZXN0aW9uLWNpcmNsZSB0ZXh0LW11dGVkIGhlbHBcIiB0aXRsZT1cIlVwbG9hZCBhbiBTU0wgY2VydGlmaWNhdGUncyBwcm90ZWN0ZWQga2V5c3RvcmUgdG8gdGhlIHNlcnZlclwiPjwvaT48L2xhYmVsPlxuXHRcdFx0PC9kaXY+XG5cdFx0XHQ8ZGl2IGNsYXNzPVwiaW5uZXItd2lkZ2V0IGFsaWduLXNlbGYtY2VudGVyIGFsaWduLXNlbGYtc20tc3RhcnQgY29sLWF1dG9cIj5cblx0XHRcdFx0PGJ1dHRvbiBpZD1cIm1hbmFnZVNzbEJ1dHRvblwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImstYnV0dG9uIGstcHJpbWFyeVwiIGRpc2FibGVkPjxpIGNsYXNzPVwiZmFzIGZhLWNvZyBtci0xXCI+PC9pPk1hbmFnZTwvYnV0dG9uPlxuXHRcdFx0PC9kaXY+XG5cdFx0YCk7XG5cblx0XHQvLyBBZGQgbGlzdGVuZXJzIHRvIE1hbmFnZSBidXR0b24gY2xpY2tcblx0XHQkKCcjbWFuYWdlU3NsQnV0dG9uJywgJCh0aGlzKSkub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vbk1hbmFnZVNzbENsaWNrLCB0aGlzKSk7XG5cdH1cblxuXHRkZXN0cm95KClcblx0e1xuXHRcdC8vIFJlbW92ZSBldmVudCBsaXN0ZW5lclxuXHRcdCQoJyNtYW5hZ2VTc2xCdXR0b24nLCAkKHRoaXMpKS5vZmYoJ2NsaWNrJyk7XG5cblx0XHQvLyBIaWRlIG1vZGFsICh3aGljaCBpbiB0dXJuIGRlc3Ryb3lzIGl0KVxuXHRcdGxldCBtb2RhbEVsZW1lbnQgPSAkKCcjdXBsb2FkTW9kYWwnLCAkKHRoaXMpKTtcblxuXHRcdGlmIChtb2RhbEVsZW1lbnQpXG5cdFx0XHRtb2RhbEVsZW1lbnQubW9kYWwoJ2hpZGUnKTtcblx0fVxuXG5cdGdldCBlbmFibGVkKClcblx0e1xuXHRcdHJldHVybiB0aGlzLl9pc0VuYWJsZWQ7XG5cdH1cblxuXHRzZXQgZW5hYmxlZCh2YWx1ZSlcblx0e1xuXHRcdHRoaXMuX2lzRW5hYmxlZCA9IHZhbHVlO1xuXG5cdFx0Ly8gRW5hYmxlL2Rpc2FibGUgTWFuYWdlIGJ1dHRvblxuXHRcdCQoJyNtYW5hZ2VTc2xCdXR0b24nLCAkKHRoaXMpKS5hdHRyKCdkaXNhYmxlZCcsICF2YWx1ZSk7XG5cblx0XHQvLyBFbmFibGUvZGlzYWJsZSBtb2RhbFxuXHRcdGxldCBtb2RhbEVsZW1lbnQgPSAkKCcjdXBsb2FkTW9kYWwnLCAkKHRoaXMpKTtcblxuXHRcdGlmIChtb2RhbEVsZW1lbnQpXG5cdFx0e1xuXHRcdFx0Ly8gRGlzYWJsZSBtb2RhbCBjbG9zZSBidXR0b25zXG5cdFx0XHQkKCdidXR0b25bZGF0YS1kaXNtaXNzPVwibW9kYWxcIl0nLCBtb2RhbEVsZW1lbnQpLmF0dHIoJ2Rpc2FibGVkJywgIXZhbHVlKTtcblxuXHRcdFx0Ly8gRGlzYWJsZSB1cGxvYWQgYnV0dG9uXG5cdFx0XHQkKCcjdXBsb2FkU3NsQnV0dG9uJywgbW9kYWxFbGVtZW50KS5hdHRyKCdkaXNhYmxlZCcsICF2YWx1ZSk7XG5cblx0XHRcdC8vIERpc2FibGUgZmllbGRzZXRcblx0XHRcdCQoJyN1cGxvYWRGaWVsZHNldCcsIG1vZGFsRWxlbWVudCkuYXR0cignZGlzYWJsZWQnLCAhdmFsdWUpO1xuXHRcdH1cblx0fVxuXG5cdGdldCB1cGxvYWRUYXJnZXRDb25maWcoKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3VwbG9hZFRhcmdldENvbmZpZztcblx0fVxuXG5cdHNldCB1cGxvYWRUYXJnZXRDb25maWcoZGF0YSlcblx0e1xuXHRcdHRoaXMuX3VwbG9hZFRhcmdldENvbmZpZyA9IGRhdGE7XG5cdH1cblxuXHRfb25NYW5hZ2VTc2xDbGljaygpXG5cdHtcblx0XHQvLyBJbml0aWFsaXplIGFuZCBzaG93IG1vZGFsXG5cdFx0dGhpcy5fc2hvd01vZGFsKCk7XG5cdH1cblxuXHRfb25VcGxvYWRTc2xDbGljaygpXG5cdHtcblx0XHRpZiAodGhpcy5fdmFsaWRhdGUoKSlcblx0XHRcdHRoaXMuX3N0YXJ0U3NsQ2VydFVwbG9hZCgpO1xuXHR9XG5cblx0X3Nob3dNb2RhbCgpXG5cdHtcblx0XHQvLyBBcHBlbmQgbW9kYWwgaHRtbFxuXHRcdCQodGhpcykuYXBwZW5kKHRoaXMuX21vZGFsSHRtbCk7XG5cblx0XHRsZXQgbW9kYWxFbGVtZW50ID0gJCgnI3VwbG9hZE1vZGFsJywgJCh0aGlzKSk7XG5cblx0XHQvLyBIaWRlIFNTTCBjZXJ0aWZpY2F0ZSB1cGxvYWQgc3Bpbm5lciBhbmQgZXJyb3IgbWVzc2FnZSBjb250YWluZXJcblx0XHQkKCcjdXBsb2FkU3Bpbm5lcicsIG1vZGFsRWxlbWVudCkuaGlkZSgpO1xuXHRcdCQoJyN1cGxvYWRFcnJvck1zZycsIG1vZGFsRWxlbWVudCkuaGlkZSgpO1xuXHRcdCQoJyN1cGxvYWRFcnJvck1zZycsIG1vZGFsRWxlbWVudCkudGV4dCgnJyk7XG5cblx0XHQvLyBBZGQgbGlzdGVuZXIgdG8gVXBsb2FkIGJ1dHRvbiBjbGlja1xuXHRcdCQoJyN1cGxvYWRTc2xCdXR0b24nLCBtb2RhbEVsZW1lbnQpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25VcGxvYWRTc2xDbGljaywgdGhpcykpO1xuXG5cdFx0Ly8gQWRkIGxpc3RlbmVyIHRvIG1vZGFsIGhpZGUgZXZlbnRcblx0XHRtb2RhbEVsZW1lbnQub24oJ2hpZGRlbi5icy5tb2RhbCcsICQucHJveHkodGhpcy5fZGVzdHJveU1vZGFsLCB0aGlzKSk7XG5cblx0XHQvLyBJbml0aWFsaXplIGtlbmRvIHVwbG9hZGVyXG5cdFx0dGhpcy5fdXBsb2FkV2lkZ2V0ID0gbW9kYWxFbGVtZW50LmZpbmQoJyN1cGxvYWRlcicpLmtlbmRvVXBsb2FkKHtcblx0XHRcdGFsbG93ZWRFeHRlbnNpb25zOiBbJy5qa3MnXSxcblx0XHRcdG11bHRpcGxlOiBmYWxzZSxcblx0XHRcdHRlbXBsYXRlOiBmdW5jdGlvbihkYXRhSXRlbSkge1xuXHRcdFx0XHRkYXRhSXRlbS5ieXRlc1RvU2l6ZSA9IGJ5dGVzVG9TaXplOyAvLyBQYXNzIGJ5dGVzVG9TaXplIHV0aWxpdHkgZnVuY3Rpb24gdG8gdGVtcGxhdGVcblx0XHRcdFx0cmV0dXJuIGtlbmRvLnRlbXBsYXRlKGBcblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz0nay1wcm9ncmVzcyB3LTEwMCc+PC9zcGFuPlxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiXCI+XG5cdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImstZmlsZS1uYW1lXCIgdGl0bGU9XCIjPW5hbWUjXCI+Iz1uYW1lIzwvc3Bhbj5cblx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiay1maWxlLXNpemVcIj5TaXplOiAjPWJ5dGVzVG9TaXplKHNpemUsIDEsICdCeXRlcycpIzwvc3Bhbj5cblx0XHRcdFx0XHQ8L3NwYW4+XG5cdFx0XHRcdGApKGRhdGFJdGVtKTtcblx0XHRcdH0sXG5cdCAgICAgICAgbG9jYWxpemF0aW9uOiB7XG5cdCAgICAgICAgICAgIHNlbGVjdDogJ1NlbGVjdCBmaWxlLi4uJ1xuXHQgICAgICAgIH1cbiAgICAgICAgfSkuZGF0YSgna2VuZG9VcGxvYWQnKTtcblxuXHRcdC8vIEluaXRpYWxpemUga2VuZG8gdmFsaWRhdGlvbiBvbiB1cGxvYWRlciBzdWJmb3JtXG5cdFx0Ly8gTk9URTogd2UgdXNlIHNlcGFyYXRlIHZhbGlkYXRvcnMgdG8gYmUgYWJsZSB0byBkaXNhYmxlICd2YWxpZGF0ZU9uQmx1cicgb24gdGhlIHVwbG9hZGVyLFxuXHRcdC8vIGJlY2F1c2UgaXQgY2F1c2VzIHRoZSBlcnJvciBtZXNzYWdlIHRvIGFwcGVhciBhcyBzb29uIGFzIHRoZSBcIlNlbGVjdCBmaWxlXCIgYnV0dG9uIGlzIGNsaWNrZWRcblx0XHR0aGlzLl92YWxpZGF0b3IxID0gbW9kYWxFbGVtZW50LmZpbmQoJyN1cGxvYWRlclN1YmZvcm0nKS5rZW5kb1ZhbGlkYXRvcih7XG5cdFx0XHR2YWxpZGF0ZU9uQmx1cjogZmFsc2UsXG5cdFx0XHRydWxlczoge1xuXHRcdFx0XHR1cGxvYWQ6IGZ1bmN0aW9uKGlucHV0KSB7XG5cdFx0XHRcdFx0bGV0IHZhbGlkID0gZmFsc2U7XG5cdFx0XHRcdFx0aWYgKGlucHV0LmlzKCdbdHlwZT1maWxlXScpKVxuXHRcdFx0XHRcdFx0dmFsaWQgPSBpbnB1dC5jbG9zZXN0KCcuay11cGxvYWQnKS5maW5kKCcuay1maWxlJykubGVuZ3RoID4gMDtcblxuXHRcdFx0XHRcdHJldHVybiB2YWxpZDtcblx0ICAgICAgICAgICAgfVxuXHRcdFx0fVxuXHRcdH0pLmRhdGEoJ2tlbmRvVmFsaWRhdG9yJyk7XG5cblx0XHQvLyBJbml0aWFsaXplIGtlbmRvIHZhbGlkYXRpb24gb24gcGFzc3dvcmRzIHN1YmZvcm1cblx0XHR0aGlzLl92YWxpZGF0b3IyID0gbW9kYWxFbGVtZW50LmZpbmQoJyNwYXNzd29yZHNTdWJmb3JtJykua2VuZG9WYWxpZGF0b3Ioe1xuXHRcdFx0dmFsaWRhdGVPbkJsdXI6IHRydWUsXG5cdFx0XHRydWxlczoge1xuXHRcdFx0XHR2ZXJpZnlLc1Bhc3N3b3JkOiAkLnByb3h5KGZ1bmN0aW9uKGlucHV0KSB7XG5cdFx0XHRcdFx0bGV0IHZhbGlkID0gdHJ1ZTtcblx0XHRcdFx0XHRpZiAoaW5wdXQuaXMoJ1tuYW1lPWNvbmZpcm1Lc1Bhc3N3b3JkXScpKVxuXHRcdFx0XHRcdFx0dmFsaWQgPSBpbnB1dC52YWwoKSA9PT0gJCh0aGlzKS5maW5kKCcja3NQYXNzd29yZCcpLnZhbCgpO1xuXHRcdFx0XHRcdHJldHVybiB2YWxpZDtcblx0XHRcdFx0fSwgdGhpcyksXG5cdFx0XHRcdHZlcmlmeUFkbVBhc3N3b3JkOiAkLnByb3h5KGZ1bmN0aW9uKGlucHV0KSB7XG5cdFx0XHRcdFx0bGV0IHZhbGlkID0gdHJ1ZTtcblx0XHRcdFx0XHRpZiAoaW5wdXQuaXMoJ1tuYW1lPWNvbmZpcm1BZG1pblBhc3N3b3JkXScpKVxuXHRcdFx0XHRcdFx0dmFsaWQgPSBpbnB1dC52YWwoKSA9PT0gJCh0aGlzKS5maW5kKCcjYWRtaW5QYXNzd29yZCcpLnZhbCgpO1xuXHRcdFx0XHRcdHJldHVybiB2YWxpZDtcblx0XHRcdFx0fSwgdGhpcylcblx0XHRcdH0sXG5cdFx0XHRtZXNzYWdlczoge1xuXHRcdFx0XHR2ZXJpZnlLc1Bhc3N3b3JkOiAnUGFzc3dvcmQgbm90IG1hdGNoaW5nJyxcblx0XHRcdFx0dmVyaWZ5QWRtUGFzc3dvcmQ6ICdQYXNzd29yZCBub3QgbWF0Y2hpbmcnLFxuXHRcdFx0fVxuXHRcdH0pLmRhdGEoJ2tlbmRvVmFsaWRhdG9yJyk7XG5cblx0XHQvLyBJbml0aWFsaXplIGJvb3RzdHJhcCBtb2RhbFxuXHRcdG1vZGFsRWxlbWVudC5tb2RhbCh7XG5cdFx0XHRiYWNrZHJvcDogJ3N0YXRpYycsXG5cdFx0XHRrZXlib2FyZDogZmFsc2UsXG5cdFx0fSk7XG5cdH1cblxuXHRfZGVzdHJveU1vZGFsKClcblx0e1xuXHRcdGxldCBtb2RhbEVsZW1lbnQgPSAkKCcjdXBsb2FkTW9kYWwnLCAkKHRoaXMpKTtcblxuXHRcdGlmIChtb2RhbEVsZW1lbnQpXG5cdFx0e1xuXHRcdFx0Ly8gUmVtb3ZlIGxpc3RlbmVyc1xuXHRcdFx0JCgnI3VwbG9hZFNzbEJ1dHRvbicsIG1vZGFsRWxlbWVudCkub2ZmKCdjbGljaycpO1xuXHRcdFx0bW9kYWxFbGVtZW50Lm9mZignaGlkZGVuLmJzLm1vZGFsJyk7XG5cblx0XHRcdC8vIERlc3Ryb3kgZXZlcnl0aGluZyBLZW5kb1xuXHRcdFx0a2VuZG8uZGVzdHJveShtb2RhbEVsZW1lbnQpO1xuXG5cdFx0XHQvLyBEaXNwb3NlIG1vZGFsXG5cdFx0XHRtb2RhbEVsZW1lbnQubW9kYWwoJ2Rpc3Bvc2UnKTtcblxuXHRcdFx0Ly8gUmVtb3ZlIGh0bWxcblx0XHRcdG1vZGFsRWxlbWVudC5yZW1vdmUoKTtcblx0XHRcdG1vZGFsRWxlbWVudCA9IG51bGw7XG5cdFx0fVxuXHR9XG5cblx0X3ZhbGlkYXRlKClcblx0e1xuXHRcdGxldCB2YWwxID0gdGhpcy5fdmFsaWRhdG9yMS52YWxpZGF0ZSgpO1xuXHRcdGxldCB2YWwyID0gdGhpcy5fdmFsaWRhdG9yMi52YWxpZGF0ZSgpO1xuXG5cdFx0cmV0dXJuIHZhbDEgJiYgdmFsMjtcblx0fVxuXG5cdF9zdGFydFNzbENlcnRVcGxvYWQoKVxuXHR7XG5cdFx0aWYgKCF0aGlzLl91cGxvYWRUYXJnZXRDb25maWcpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1VwbG9hZCB0YXJnZXQgY29uZmlndXJhdGlvbiBub3Qgc2V0Jyk7XG5cblx0XHRsZXQgbW9kYWxFbGVtZW50ID0gJCgnI3VwbG9hZE1vZGFsJywgJCh0aGlzKSk7XG5cblx0XHRpZiAobW9kYWxFbGVtZW50KVxuXHRcdHtcblx0XHRcdGxldCBjZXJ0RGF0YSA9IHt9O1xuXHRcdFx0Y2VydERhdGEuZmlsZSA9IHRoaXMuX3VwbG9hZFdpZGdldC5nZXRGaWxlcygpWzBdO1xuXHRcdFx0Y2VydERhdGEua3NQYXNzd29yZCA9ICQoJyNrc1Bhc3N3b3JkJywgbW9kYWxFbGVtZW50KS52YWwoKTtcblx0XHRcdGNlcnREYXRhLmFkbWluUGFzc3dvcmQgPSAkKCcjYWRtaW5QYXNzd29yZCcsIG1vZGFsRWxlbWVudCkudmFsKCk7XG5cblx0XHRcdC8vIERpc2FibGUgbW9kYWxcblx0XHRcdHRoaXMuZW5hYmxlZCA9IGZhbHNlO1xuXG5cdFx0XHQvLyBIaWRlIHByZXZpb3VzIGVycm9yIGFuZCBzaG93IHNwaW5uZXJcblx0XHRcdCQoJyN1cGxvYWRTcGlubmVyJywgbW9kYWxFbGVtZW50KS5zaG93KCk7XG5cdFx0XHQkKCcjdXBsb2FkRXJyb3JNc2cnLCBtb2RhbEVsZW1lbnQpLmhpZGUoKTtcblx0XHRcdCQoJyN1cGxvYWRFcnJvck1zZycsIG1vZGFsRWxlbWVudCkudGV4dCgnJyk7XG5cblx0XHRcdC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHRcdFx0Ly8gR2VuZXJhdGUgSW5pdCBWZWN0b3Jcblx0XHRcdGxldCBybmdWYWx1ZXMgPSBbXTtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgMTY7IGkrKylcblx0XHRcdFx0cm5nVmFsdWVzLnB1c2goTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMjU2KSk7XG5cblx0XHRcdGxldCBpdiA9IG5ldyBVaW50OEFycmF5KHJuZ1ZhbHVlcyk7XG5cblx0XHRcdC8vIEdlbmVyYXRlIHNlY3JldCBrZXkgYnkgTUQ1LWVuY29kaW5nIGFkbWluIHBhc3N3b3JkICsgc2Vzc2lvbiB0b2tlblxuXHRcdFx0bGV0IG1kNVBhc3MgPSB0aGlzLl9iaW5hcnlNRDUoY2VydERhdGEuYWRtaW5QYXNzd29yZCArIHRoaXMuX3VwbG9hZFRhcmdldENvbmZpZy5zZXNzaW9uVG9rZW4pO1xuXG5cdFx0XHQvLyBFbmNyeXB0IGtleXN0b3JlIHBhc3N3b3JkIHZpYSBBRVMgKDEyOGJpdClcblx0XHRcdGxldCBlbmNyeXB0ZWRQd2QgPSB0aGlzLl9hZXNFbmNyeXB0KGNlcnREYXRhLmtzUGFzc3dvcmQsIG1kNVBhc3MsIGl2KTtcblxuXHRcdFx0Ly8gRW5jb2RlIElWIHVzaW5nIEJhc2U2NFxuXHRcdFx0bGV0IGVuY29kZWRJdiA9IHRoaXMuX2I2NEVuY29kZShpdik7XG5cblx0XHRcdC8vIEVuY29kZSBlbmNyeXB0ZWQgcGFzc3dvcmQgdXNpbmcgQmFzZTY0XG5cdFx0XHRsZXQgZW5jb2RlZFB3ZCA9IHRoaXMuX2I2NEVuY29kZShlbmNyeXB0ZWRQd2QpO1xuXG5cdFx0XHQvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblx0XHRcdC8vIFNldCBwYXJhbWV0ZXJzIHRvIGJlIHNlbnQgd2l0aCB0aGUgY2VydGlmaWNhdGUga2V5c3RvcmUgZmlsZVxuXHRcdFx0Y29uc3QgcGFyYW1zID0gbmV3IEZvcm1EYXRhKCk7XG5cdFx0XHRwYXJhbXMuYXBwZW5kKCdmaWxlc1tdJywgY2VydERhdGEuZmlsZS5yYXdGaWxlKTtcblx0XHRcdHBhcmFtcy5hcHBlbmQoJ19faXYnLCBlbmNvZGVkSXYpO1xuXHRcdFx0cGFyYW1zLmFwcGVuZCgnX19wYXNzd29yZCcsIGVuY29kZWRQd2QpO1xuXHRcdFx0cGFyYW1zLmFwcGVuZCgnX19tb2R1bGUnLCB0aGlzLl91cGxvYWRUYXJnZXRDb25maWcubW9kdWxlSWQpO1xuXG5cdFx0XHQvLyBTZXQgZGVzdGluYXRpb24gdXJsXG5cdFx0XHRjb25zdCB1cmwgPSAnaHR0cDovLycgKyB0aGlzLl91cGxvYWRUYXJnZXRDb25maWcuaG9zdCArICc6JyArIHRoaXMuX3VwbG9hZFRhcmdldENvbmZpZy5odHRwUG9ydCArICcvQmx1ZUJveC9TRlMyWEZpbGVVcGxvYWQ/c2Vzc0hhc2hJZD0nICsgdGhpcy5fdXBsb2FkVGFyZ2V0Q29uZmlnLnNlc3Npb25Ub2tlbjtcblxuXHRcdFx0Ly8gU3RhcnQgdXBsb2FkXG5cdFx0XHRmZXRjaCh1cmwsIHtcblx0XHRcdFx0bWV0aG9kOiAnUE9TVCcsXG5cdFx0XHRcdGJvZHk6IHBhcmFtcyxcblx0XHRcdFx0bW9kZTogJ25vLWNvcnMnXG5cdFx0XHR9KS50aGVuKCQucHJveHkodGhpcy5fb25Tc2xDZXJ0VXBsb2FkRW5kLCB0aGlzKSk7XG5cdFx0fVxuXHR9XG5cblx0X29uU3NsQ2VydFVwbG9hZEVuZChyZXNwb25zZSlcblx0e1xuXHRcdC8vIE5vdGhpbmcgdG8gZG86IHdlIGhhdmUgdG8gd2FpdCB0aGUgdXBsb2FkIHByb2Nlc3MgY29tcGxldGlvbiB0byBiZSBzaWduYWxlZCBieSB0aGUgc2VydmVyIHRocm91Z2ggdGhlIGRlZGljYXRlZCBFeHRlbnNpb24gcmVzcG9uc2VcblxuXHRcdC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHRcdC8vIFRPRE8gU2hvdWxkIHdlIGhhbmRsZSB0aGlzIHJlc3BvbnNlIGluIHNvbWUgd2F5PyBGb3Igc29tZSB1bmtub3duIHJlYXNvbiB3ZSBhbHdheXMgZ2V0IG9rPWZhbHNlIGFuZCBzdGF0dXM9MFxuXHRcdC8vY29uc29sZS5sb2cocmVzcG9uc2UpXG5cdFx0Ly9jb25zb2xlLmxvZyhyZXNwb25zZS5vaylcblx0XHQvL2NvbnNvbGUubG9nKHJlc3BvbnNlLnN0YXR1cylcblx0fVxuXG5cdC8qKlxuXHQgKiBNZXRob2QgY2FsbGVkIGJ5IHBhcmVudCB3aGVuIHVwbG9hZCBmYWlsZWQuXG5cdCAqL1xuXHRvblNzbENlcnRVcGxvYWRFcnJvcihlcnJvcilcblx0e1xuXHRcdGxldCBtb2RhbEVsZW1lbnQgPSAkKCcjdXBsb2FkTW9kYWwnLCAkKHRoaXMpKTtcblxuXHRcdGlmIChtb2RhbEVsZW1lbnQpXG5cdFx0e1xuXHRcdFx0Ly8gRW5hYmxlIG1vZGFsXG5cdFx0XHR0aGlzLmVuYWJsZWQgPSB0cnVlO1xuXG5cdFx0XHQvLyBTaG93IHVwbG9hZCBlcnJvclxuXHRcdFx0JCgnI3VwbG9hZEVycm9yTXNnJywgbW9kYWxFbGVtZW50KS5zaG93KCk7XG5cdFx0XHQkKCcjdXBsb2FkRXJyb3JNc2cnLCBtb2RhbEVsZW1lbnQpLnRleHQoZXJyb3IgKyAnLicpO1xuXG5cdFx0XHQvLyBIaWRlIHNwaW5uZXJcblx0XHRcdCQoJyN1cGxvYWRTcGlubmVyJywgbW9kYWxFbGVtZW50KS5oaWRlKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE1ldGhvZCBjYWxsZWQgYnkgcGFyZW50IHdoZW4gdXBsb2FkIGlzIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuXG5cdCAqL1xuXHRvblNzbENlcnRVcGxvYWRTdWNjZXNzKClcblx0e1xuXHRcdGxldCBtb2RhbEVsZW1lbnQgPSAkKCcjdXBsb2FkTW9kYWwnLCAkKHRoaXMpKTtcblxuXHRcdGlmIChtb2RhbEVsZW1lbnQpXG5cdFx0e1xuXHRcdFx0Ly8gRW5hYmxlIG1vZGFsXG5cdFx0XHR0aGlzLmVuYWJsZWQgPSB0cnVlO1xuXG5cdFx0XHQvLyBIaWRlIHNwaW5uZXJcblx0XHRcdCQoJyN1cGxvYWRTcGlubmVyJywgbW9kYWxFbGVtZW50KS5oaWRlKCk7XG5cblx0XHRcdC8vIEhpZGUgbW9kYWxcblx0XHRcdG1vZGFsRWxlbWVudC5tb2RhbCgnaGlkZScpO1xuXHRcdH1cblx0fVxuXG5cdC8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cblx0Lypcblx0ICogVGFrZXMgYSBzdHJpbmcgYW5kIHJldHVybnMgdGhlIE1ENSBhcyBVaW50OEFycmF5XG5cdCAqL1xuXHRfYmluYXJ5TUQ1KHN0cilcblx0e1xuXHRcdGxldCBNRDUgPSBuZXcgU0ZTMlguTUQ1KCk7XG5cdFx0bGV0IGhleFN0ciA9IE1ENS5oZXhfbWQ1KHN0cik7XG5cblx0XHRyZXR1cm4gdGhpcy5faGV4Qnl0ZVN0cmluZ1RvQnl0ZUFycmF5KGhleFN0cik7XG5cdH1cblxuXHQvKlxuXHQgKiBIZXggYnl0ZXMgLS0tPiBBY3R1YWwgYnl0ZVtdIGFzIFVpbnQ4QXJyYXlcblx0ICovXG5cdF9oZXhCeXRlU3RyaW5nVG9CeXRlQXJyYXkoaGV4Qnl0ZVN0cmluZylcblx0e1xuXHQgICAgbGV0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoMTYpOyAvLyBNRDUgZml4ZWQgb3V0cHV0IHNpemVcblxuXHQgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZXhCeXRlU3RyaW5nLmxlbmd0aDspXG5cdCAgICB7XG5cdCAgICAgICAgbGV0IGhleEJ5dGUgPSBoZXhCeXRlU3RyaW5nW2krK10gKyBoZXhCeXRlU3RyaW5nW2krK107XG5cdCAgICAgICAgbGV0IGJ5dGUgPSBwYXJzZUludChoZXhCeXRlLCAxNik7XG5cblx0ICAgICAgICBieXRlc1tpIC8gMiAtIDFdID0gYnl0ZTtcblx0ICAgIH1cblxuXHQgICAgcmV0dXJuIGJ5dGVzO1xuXHR9XG5cblx0Lypcblx0ICogRW5jcnlwdCB1c2luZyBBRVMsIG1vZGUgQ0JDLCBQS0NTIzcgcGFkZGluZ1xuXHQgKlxuXHQgKiB0ZXh0IFx0XHQtPiB0aGUgdGV4dCB3ZSB3YW50IHRvIGVuY29kZVxuXHQgKiBrZXkgXHRcdC0+IHRoZSBBRVMga2V5XG5cdCAqIGl2ICBcdFx0LT4gdGhlIEFFUy9DQkMgaW5pdCB2ZWN0b3Jcblx0ICpcblx0ICogUmV0dXJucyBcdC0+IFVpbnQ4QXJyYXlcblx0ICovXG5cdF9hZXNFbmNyeXB0KHRleHQsIGtleSwgaXYpXG5cdHtcblx0XHRsZXQgdGV4dEJ5dGVzID0gYWVzanMudXRpbHMudXRmOC50b0J5dGVzKHRleHQpOyBcdFx0Ly8gR2V0IFVURi04IGJ5dGVzXG5cdFx0bGV0IGFlc0NCQyA9IG5ldyBhZXNqcy5Nb2RlT2ZPcGVyYXRpb24uY2JjKGtleSwgaXYpO1x0Ly8gSW5pdCBDQkMgbW9kZVxuXHRcdHRleHRCeXRlcyA9IGFlc2pzLnBhZGRpbmcucGtjczcucGFkKHRleHRCeXRlcyk7IFx0XHQvLyBQS0NTIzcgcGFkZGluZ1xuXG5cdFx0Ly8gRW5jcnlwdFxuXHRcdHJldHVybiBhZXNDQkMuZW5jcnlwdCh0ZXh0Qnl0ZXMpO1xuXHR9XG5cblx0Lypcblx0ICogRW5jb2RlIHBhc3NlZCBieXRlIGFycmF5IC0tPiBCYXNlNjQgcmVwcmVzZW50YXRpb25cblx0ICogUmV0dXJucyAtLT4gc3RyaW5nXG5cdCAqL1xuXHRfYjY0RW5jb2RlKGJhcnJheSlcblx0e1xuXHRcdHJldHVybiBidG9hKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgYmFycmF5KSk7XG5cdH1cbn1cblxuLy8gREVGSU5FIENPTVBPTkVOVFxuaWYgKCF3aW5kb3cuY3VzdG9tRWxlbWVudHMuZ2V0KCdzc2wtY2VydGlmaWNhdGUtbWFuYWdlcicpKVxuXHR3aW5kb3cuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdzc2wtY2VydGlmaWNhdGUtbWFuYWdlcicsIFNzbENlcnRpZmljYXRlTWFuYWdlcik7XG4iLCJpbXBvcnQge0Jhc2VNb2R1bGV9IGZyb20gJy4vYmFzZS1tb2R1bGUnO1xuaW1wb3J0IHtDb25maWdJbnRlcmZhY2VCdWlsZGVyfSBmcm9tICcuLi91dGlscy91aWJ1aWxkZXIvY29uZmlnLWludGVyZmFjZS1idWlsZGVyJztcbmltcG9ydCB7U3NsQ2VydGlmaWNhdGVNYW5hZ2VyfSBmcm9tICcuLi9jb21wb25lbnRzL21vZHVsZS1zcGVjaWZpYy9zc2wtY2VydGlmaWNhdGUtbWFuYWdlcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlcnZlckNvbmZpZ3VyYXRvciBleHRlbmRzIEJhc2VNb2R1bGVcbntcblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdCAgICBzdXBlcignc2VydmVyQ29uZmlnJyk7XG5cblx0XHQvLyBPdXRnb2luZyByZXF1ZXN0c1xuXHRcdHRoaXMuUkVRX0lOSVQgPSAnaW5pdCc7XG5cdFx0dGhpcy5SRVFfR0VUX0NPTkZJRyA9ICdnZXRDb25maWcnO1xuXHRcdHRoaXMuUkVRX1VQREFURV9DT05GSUcgPSAndXBkQ29uZmlnJztcblx0XHR0aGlzLlJFUV9VUERBVEVfR0VPX0RCID0gJ3VwZEdlb0RiJztcblxuXHRcdC8vIEluY29taW5nIHJlc3BvbnNlc1xuXHRcdHRoaXMuUkVTUF9JTklUID0gJ2luaXQnO1xuXHRcdHRoaXMuUkVTUF9DT05GSUcgPSAnY29uZmlnJztcblx0XHR0aGlzLlJFU1BfQ09ORklHX1VQREFURV9DT05GSVJNID0gJ2NvbmZpZ1VwZGF0ZSc7XG5cdFx0dGhpcy5SRVNQX0NPTkZJR19DSEFOR0VEX0FMRVJUID0gJ2NvbmZpZ0FsZXJ0Jztcblx0XHR0aGlzLlJFU1BfU1NMX1VQTE9BRF9FUlJPUiA9ICdzc2xVcGxvYWRFcnJvcic7XG5cdFx0dGhpcy5SRVNQX1NTTF9VUExPQURfQ09ORklSTSA9ICdzc2xVcGxvYWQnO1xuXHRcdHRoaXMuUkVTUF9VUERBVEVfR0VPX0RCID0gJ2dlb0RiVXBkYXRlJztcblx0fVxuXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdC8vIENPTU1PTiBNT0RVTEUgSU5URVJGQUNFIE1FVEhPRFNcblx0Ly8gVGhpcyBtZW1iZXJzIGFyZSB1c2VkIGJ5IHRoZSBtYWluIGNvbnRyb2xsZXJcblx0Ly8gdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgbW9kdWxlJ3MgY29udHJvbGxlci5cblx0Ly8gVGhpcyBtZXRob2RzIG92ZXJyaWRlIHRob3NlIGluIEJhc2VNb2R1bGUgY2xhc3MuXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0aW5pdGlhbGl6ZShpZERhdGEsIHNoZWxsQ29udHJvbGxlcilcblx0e1xuXHRcdC8vIENhbGwgc3VwZXIgbWV0aG9kXG5cdFx0c3VwZXIuaW5pdGlhbGl6ZShpZERhdGEsIHNoZWxsQ29udHJvbGxlcik7XG5cblx0XHQvLyBJbml0aWFsaXplIHByb2dyZXNzIGJhclxuXHRcdCQoJyNzcmMtcHJvZ3Jlc3NCYXInKS5rZW5kb1Byb2dyZXNzQmFyKHtcblx0XHRcdG1pbjogMCxcbiAgICAgICAgICAgIG1heDogMTAwLFxuXHRcdFx0dmFsdWU6IGZhbHNlLFxuICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJyxcbiAgICAgICAgICAgIGFuaW1hdGlvbjoge1xuICAgICAgICAgICAgICAgIGR1cmF0aW9uOiA0MDBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cblx0XHQvLyBDcmVhdGUgaW50ZXJmYWNlIGJ1aWxkZXIgaW5zdGFuY2Vcblx0XHR0aGlzLl9pbnRlcmZhY2VCdWlsZGVyID0gbmV3IENvbmZpZ0ludGVyZmFjZUJ1aWxkZXIoKTtcblxuXHRcdC8vIEFkZCBsaXN0ZW5lciB0byBHZW9MaXRlMiBkYXRhYmFzZSB1cGRhdGUgYnV0dG9uXG5cdFx0JCgnI3NyYy11cGRhdGVHZW9sb2NEYkJ1dHRvbicpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25VcGRhdGVHZW9sb2NEYkNsaWNrLCB0aGlzKSk7XG5cblx0XHQvLyBBZGQgbGlzdGVuZXIgdG8gaW50ZXJmYWNlIGJ1dHRvbnNcblx0XHQkKCcjc3JjLXJlbG9hZEJ1dHRvbicpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25SZWxvYWRDbGljaywgdGhpcykpO1xuXHRcdCQoJyNzcmMtc3VibWl0QnV0dG9uJykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vblN1Ym1pdENsaWNrLCB0aGlzKSk7XG5cblx0XHQvLyBTYXZlIHJlZiB0byBTU0wgTWFuYWdlclxuXHRcdHRoaXMuX3NzbENlcnRNYW5hZ2VyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NyYy1zc2xDZXJ0TWFuYWdlcicpO1xuXG5cdFx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cblx0XHQvLyBTZW5kIGluaXRpYWxpemF0aW9uIHJlcXVlc3Rcblx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX0lOSVQpO1xuXHR9XG5cblx0ZGVzdHJveSgpXG5cdHtcblx0XHQvLyBDYWxsIHN1cGVyIG1ldGhvZFxuXHRcdHN1cGVyLmRlc3Ryb3koKTtcblxuXHRcdC8vIERlc3Ryb3kgU1NMIENlcnRpZmljYXRlIE1hbmFnZXJcblx0XHR0aGlzLl9zc2xDZXJ0TWFuYWdlci5kZXN0cm95KCk7XG5cblx0XHQvLyBSZW1vdmUgaW50ZXJmYWNlIGJ1dHRvbnMgY2xpY2sgbGlzdGVuZXJzXG5cdFx0JCgnI3NyYy11cGRhdGVHZW9sb2NEYkJ1dHRvbicpLm9mZignY2xpY2snKTtcblx0XHQkKCcjc3JjLXJlbG9hZEJ1dHRvbicpLm9mZignY2xpY2snKTtcblx0XHQkKCcjc3JjLXN1Ym1pdEJ1dHRvbicpLm9mZignY2xpY2snKTtcblxuXHRcdC8vIENsZWFyIHRhYnMgY29udGFpbmVyXG5cdFx0dGhpcy5fY2xlYXJUYWJzKCk7XG5cdH1cblxuXHRvbkV4dGVuc2lvbkNvbW1hbmQoY29tbWFuZCwgZGF0YSlcblx0e1xuXHRcdC8vIEluaXRpYWxpemF0aW9uIGRhdGEgcmVjZWl2ZWRcblx0XHRpZiAoY29tbWFuZCA9PSB0aGlzLlJFU1BfSU5JVClcblx0XHR7XG5cdFx0XHQvLyBSZXRyaWV2ZSBIVFRQIHBvcnQgdG8gYmUgdXNlZCBmb3IgU1NMIGNlcnRpZmljYXRlIGZpbGUgdXBsb2FkaW5nXG5cdFx0XHRjb25zdCB1cGxvYWRIdHRwUG9ydCA9IGRhdGEuZ2V0SW50KCdodHRwUG9ydCcpO1xuXG5cdFx0XHQvLyBSZXRyaWV2ZSBtb2R1bGUgaWQgc2VudCBieSB0aGUgc2VydmVyIChyZXF1aXJlZCBiZWNhdXNlIG11bHRpcGxlIG1vZHVsZXMgdXNlIGZpbGUgdXBsb2FkaW5nIHNlcnZpY2UpXG5cdFx0XHRjb25zdCB1cGxvYWRNb2R1bGVJZCA9IGRhdGEuZ2V0VXRmU3RyaW5nKCdtb2RJZCcpO1xuXG5cdFx0XHQvLyBTZXQgU1NMIHVwbG9hZCBtYW5hZ2VyIHRhcmdldCBjb25maWd1cmF0aW9uXG5cdFx0XHR0aGlzLl9zc2xDZXJ0TWFuYWdlci51cGxvYWRUYXJnZXRDb25maWcgPSB7XG5cdFx0XHRcdHNlc3Npb25Ub2tlbjogdGhpcy5zbWFydEZveC5zZXNzaW9uVG9rZW4sXG5cdFx0XHRcdGhvc3Q6IHRoaXMuc21hcnRGb3guY29uZmlnLmhvc3QsXG5cdFx0XHRcdGh0dHBQb3J0OiB1cGxvYWRIdHRwUG9ydCxcblx0XHRcdFx0bW9kdWxlSWQ6IHVwbG9hZE1vZHVsZUlkLFxuXHRcdFx0fTtcblxuXHRcdFx0Ly8gU2VydmVyIHNlbmRzIGEgZmxhZyBpbmRpY2F0aW5nIGlmIGZpbGUgdXBsb2FkcyBhcmUgbG9ja2VkXG5cdFx0XHQvLyBXZSB1c2UgaXQgdG8gZW5hYmxlIHRoZSBcIk1hbmFnZSBTU0wgY2VydGlmaWNhdGVcIiBidXR0b25cblx0XHRcdHRoaXMuX3NzbExvY2tlZCA9IGRhdGEuZ2V0Qm9vbCgnbG9jaycpO1xuXG5cdFx0XHRpZiAoIXRoaXMuX3NzbExvY2tlZClcblx0XHRcdFx0JCgnI3NyYy1tYW5hZ2VTc2xXYXJuJykuaGlkZSgpO1xuXG5cdFx0XHQvLyBSZXF1ZXN0IGNvbmZpZ3VyYXRpb24gZGF0YSB0byBzZXJ2ZXIgaW5zdGFuY2Vcblx0XHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfR0VUX0NPTkZJRyk7XG5cdFx0fVxuXG5cdFx0Ly8gU2VydmVyIGNvbmZpZ3VyYXRpb24gZGF0YSByZWNlaXZlZFxuXHRcdGVsc2UgaWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX0NPTkZJRylcblx0XHR7XG5cdFx0XHQvLyBCdWlsZCB1c2VyIGludGVyZmFjZSBiYXNlZCBvbiByZWNlaXZlZCBkYXRhXG5cdFx0XHR0aGlzLl9pbnRlcmZhY2VCdWlsZGVyLmJ1aWxkSW50ZXJmYWNlKGRhdGEuZ2V0U0ZTQXJyYXkoJ3NldHRpbmdzJyksICdzcmMtdGFiTmF2aWdhdG9yJywgZmFsc2UpO1xuXG5cdFx0XHQvLyBFbmFibGUgYnV0dG9uc1xuXHRcdFx0dGhpcy5fZW5hYmxlQnV0dG9ucyh0cnVlKTtcblxuXHRcdFx0Ly8gSW5pdGlhbGl6ZSBUYWJOYXZpZ2F0b3ItcmFsYXRlZCB3aWRnZXRzXG5cdFx0XHRpZiAoIXRoaXMuX3RhYk5hdkluaXRpYWxpemVkKVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBFbmFibGUgc2Nyb2xsaW5nIHRhYnNcblx0XHRcdFx0JCgnI3NyYy10YWJOYXZpZ2F0b3IgPiAjdGFicycpLnNjcm9sbGluZ1RhYnMoe1xuXHRcdFx0XHRcdGJvb3RzdHJhcFZlcnNpb246IDQsXG5cdFx0XHRcdFx0c2Nyb2xsVG9UYWJFZGdlOiB0cnVlLFxuXHRcdFx0XHRcdGVuYWJsZVN3aXBpbmc6IHRydWUsXG5cdFx0XHRcdFx0ZGlzYWJsZVNjcm9sbEFycm93c09uRnVsbHlTY3JvbGxlZDogdHJ1ZSxcblx0XHRcdFx0XHRjc3NDbGFzc0xlZnRBcnJvdzogJ2ZhIGZhLWNoZXZyb24tbGVmdCcsXG5cdFx0XHRcdFx0Y3NzQ2xhc3NSaWdodEFycm93OiAnZmEgZmEtY2hldnJvbi1yaWdodCdcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0dGhpcy5fdGFiTmF2SW5pdGlhbGl6ZWQgPSB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBSdW4gdmFsaWRhdGlvbiAodG8gcmVtb3ZlIHZhbGlkYXRpb24gbWVzc2FnZXMgaWYgZGF0YSB3YXMgcmVsb2FkZWQpXG5cdFx0XHR0aGlzLl9pbnRlcmZhY2VCdWlsZGVyLmNoZWNrSXNWYWxpZCgpO1xuXG5cdFx0XHR0aGlzLl9zd2l0Y2hWaWV3KCdzcmMtbWFpbicpO1xuXHRcdH1cblxuXHRcdC8vIFNlcnZlciBjb25maWd1cmF0aW9uIHVwZGF0ZSBjb25maXJtYXRpb25cblx0XHRlbHNlIGlmIChjb21tYW5kID09IHRoaXMuUkVTUF9DT05GSUdfVVBEQVRFX0NPTkZJUk0pXG5cdFx0e1xuXHRcdFx0Ly8gRW5hYmxlIGJ1dHRvbnNcblx0XHRcdHRoaXMuX2VuYWJsZUJ1dHRvbnModHJ1ZSk7XG5cblx0XHRcdC8vIEVuYWJsZSBmb3JtIGl0ZW1zXG5cdFx0XHR0aGlzLl9pbnRlcmZhY2VCdWlsZGVyLmRpc2FibGVJbnRlcmZhY2UoZmFsc2UpO1xuXG5cdFx0XHQvLyBJZiB0aGUgY3VycmVudCB1c2VyIGlzIHRoZSB1cGRhdGVyLCBzaG93IGEgbm90aWZpY2F0aW9uXG5cdFx0XHQvLyBPdGhlcndpc2UsIHNob3cgYSBkaWFsb2cgYm94IHN1Z2dlc3RpbmcgdG8gcmVsb2FkXG5cdFx0XHRsZXQgdXBkYXRlciA9IGRhdGEuZ2V0VXRmU3RyaW5nKCd1c2VyJyk7XG5cblx0XHRcdGlmICh1cGRhdGVyID09IHRoaXMuc21hcnRGb3gubXlTZWxmLm5hbWUpXG5cdFx0XHR7XG5cdFx0XHRcdC8vIFJlc2V0IHRoZSAnbW9kaWZpZWQnIGZsYWdcblx0XHRcdFx0dGhpcy5faW50ZXJmYWNlQnVpbGRlci5yZXNldElzTW9kaWZpZWQoKTtcblxuXHRcdFx0XHQvLyBEaXNwbGF5IG5vdGlmaWNhdGlvblxuXHRcdFx0XHR0aGlzLnNoZWxsQ3RybC5zaG93Tm90aWZpY2F0aW9uKCdTZXJ2ZXIgc2V0dGluZ3MgdXBkYXRlZCcsICdDaGFuZ2VzIHdpbGwgYmUgYXBwbGllZCBvbiBuZXh0IHNlcnZlciByZXN0YXJ0Jyk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlXG5cdFx0XHR7XG5cdFx0XHRcdC8vIFNob3cgYWxlcnRcblx0XHRcdFx0dGhpcy5zaGVsbEN0cmwuc2hvd1NpbXBsZUFsZXJ0KGBBZG1pbmlzdHJhdG9yICR7dXBkYXRlcn0gaGFzIG1vZGlmaWVkIHRoZSBzZXJ2ZXIgc2V0dGluZ3M7IHBsZWFzZSByZWxvYWQgdG8gdXBkYXRlIHlvdXIgdmlldy5gKTtcblxuXHRcdFx0XHQvLyBEaXNhYmxlIHN1Ym1pdCBidXR0b25cblx0XHRcdFx0JCgnI3NyYy1zdWJtaXRCdXR0b24nKS5hdHRyKCdkaXNhYmxlZCcsIHRydWUpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFNlcnZlciBjb25maWd1cmF0aW9uIHhtbCBzYXZlZCBieSBhbiBleHRlcm5hbCBwcm9jZXNzXG5cdFx0ZWxzZSBpZiAoY29tbWFuZCA9PSB0aGlzLlJFU1BfQ09ORklHX0NIQU5HRURfQUxFUlQpXG5cdFx0e1xuXHRcdFx0Ly8gU2hvdyBhbGVydFxuXHRcdFx0dGhpcy5zaGVsbEN0cmwuc2hvd1NpbXBsZUFsZXJ0KGBUaGUgc3lzdGVtIGhhcyBtb2RpZmllZCB0aGUgc2VydmVyIHNldHRpbmdzIGF1dG9tYXRpY2FsbHk7IHBsZWFzZSByZWxvYWQgdG8gdXBkYXRlIHlvdXIgdmlldy5gKTtcblxuXHRcdFx0Ly8gRGlzYWJsZSBzdWJtaXQgYnV0dG9uXG5cdFx0XHQkKCcjc3JjLXN1Ym1pdEJ1dHRvbicpLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSk7XG5cdFx0fVxuXG5cdFx0Ly8gU1NMIGNlcnRpZmljYXRlIHVwbG9hZCBlcnJvclxuXHRcdGVsc2UgaWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX1NTTF9VUExPQURfRVJST1IpXG5cdFx0e1xuXHRcdFx0Y29uc3QgZXJyb3IgPSBkYXRhLmdldFV0ZlN0cmluZygnZXJyb3InKTtcblxuXHRcdFx0Ly8gTG9nIHdhcm5pbmdcblx0XHRcdHRoaXMuc2hlbGxDdHJsLmxvZ01lc3NhZ2UoZXJyb3IsICdlcnJvcicpO1xuXG5cdFx0XHQvLyBTaG93IGVycm9yIGluIG1hbmFnZXIgd2luZG93XG5cdFx0XHR0aGlzLl9zc2xDZXJ0TWFuYWdlci5vblNzbENlcnRVcGxvYWRFcnJvcihlcnJvcik7XG5cdFx0fVxuXG5cdFx0Ly8gU1NMIGNlcnRpZmljYXRlIHVwbG9hZCBjb25maXJtZWRcblx0XHRlbHNlIGlmIChjb21tYW5kID09IHRoaXMuUkVTUF9TU0xfVVBMT0FEX0NPTkZJUk0pXG5cdFx0e1xuXHRcdFx0Ly8gQ2xvc3cgbWFuYWdlciB3aW5kb3dcblx0XHRcdHRoaXMuX3NzbENlcnRNYW5hZ2VyLm9uU3NsQ2VydFVwbG9hZFN1Y2Nlc3MoKTtcblxuXHRcdFx0bGV0IHVwZGF0ZXIgPSBkYXRhLmdldFV0ZlN0cmluZygndXNlcicpO1xuXG5cdFx0XHQvLyBEaXNwbGF5IG5vdGlmaWNhdGlvblxuXHRcdFx0aWYgKHVwZGF0ZXIgPT0gdGhpcy5zbWFydEZveC5teVNlbGYubmFtZSlcblx0XHRcdFx0dGhpcy5zaGVsbEN0cmwuc2hvd05vdGlmaWNhdGlvbignU1NMIGNlcnRpZmljYXRlJywgJ1NTTCBjZXJ0aWZpY2F0ZSBrZXlzdG9yZSB3YXMgdXBsb2FkZWQgc3VjY2Vzc2Z1bGx5Jyk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dOb3RpZmljYXRpb24oJ1NTTCBjZXJ0aWZpY2F0ZScsIGBBZG1pbmlzdHJhdG9yICR7dXBkYXRlcn0gaGFzIHVwbG9hZGVkIGEgbmV3IFNTTCBjZXJ0aWZpY2F0ZSBrZXlzdG9yZWApO1xuXG5cdFx0XHQvLyBXaGVuIGEgY2VydGlmaWNhdGUgaXMgdXBsb2FkZWQsIEhUVFBTIGlzIGFsc28gZW5hYmxlZCBhdXRvbWF0aWNhbGx5OlxuXHRcdFx0Ly8gd2UgaGF2ZSB0byB1cGRhdGUgdGhlIGludGVyZmFjZSBhY2NvcmRpbmdseVxuXHRcdFx0dGhpcy5fdXBkYXRlQ29uZmlnRm9ybUl0ZW1EaXNwbGF5ZWRWYWx1ZSgnd2ViU2VydmVyLmVuYWJsZUh0dHBzJywgdHJ1ZSk7XG5cdFx0fVxuXG5cdFx0Ly8gR2VvbG9jYXRpb24gZGF0YWJhc2UgdXBkYXRlIGNvbmZpcm1hdGlvblxuXHRcdGVsc2UgaWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX1VQREFURV9HRU9fREIpXG5cdFx0e1xuXHRcdFx0Ly8gRW5hYmxlIGJ1dHRvblxuXHRcdFx0JCgnI3NyYy11cGRhdGVHZW9sb2NEYkJ1dHRvbicpLmF0dHIoJ2Rpc2FibGVkJywgZmFsc2UpO1xuXG5cdFx0XHQvLyBDaGVjayBzdWNjZXNzXG5cdFx0XHRpZiAoZGF0YS5nZXRCb29sKCdzdWNjZXNzJykpXG5cdFx0XHR7XG5cdFx0XHRcdC8vIFVwZGF0ZSBkaXNwbGF5ZWQgZGF0ZVxuXHRcdFx0XHR0aGlzLl91cGRhdGVDb25maWdGb3JtSXRlbURpc3BsYXllZFZhbHVlKCdhZG1pbkhlbHBlci5nZW9EYlJlbGVhc2VEYXRlJywgZGF0YS5nZXRVdGZTdHJpbmcoJ25ld1JlbERhdGUnKSk7XG5cblx0XHRcdFx0Ly8gSWYgdGhlIGN1cnJlbnQgdXNlciBpcyB0aGUgdXBkYXRlciwgYWxzbyBzaG93IGEgbm90aWZpY2F0aW9uXG5cdFx0XHRcdGxldCB1cGRhdGVyID0gZGF0YS5nZXRVdGZTdHJpbmcoJ3VzZXInKTtcblxuXHRcdFx0XHRpZiAodXBkYXRlciA9PSB0aGlzLnNtYXJ0Rm94Lm15U2VsZi5uYW1lKVxuXHRcdFx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dOb3RpZmljYXRpb24oJ0dlb2xvY2F0aW9uIGRhdGFiYXNlIHVwZGF0ZWQnLCAnTGF0ZXN0IHJlbGVhc2Ugb2YgdGhlIEdlb0xpdGUyIENvdW50cnkgZGF0YWJhc2UgaGFzIGJlZW4gaW5zdGFsbGVkIHN1Y2Nlc3NmdWxseScpO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBTaG93IGFsZXJ0XG5cdFx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dTaW1wbGVBbGVydChkYXRhLmdldFV0ZlN0cmluZygnZXJyb3InKSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0Ly8gUFJJVkFURSBNRVRIT0RTXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0X2VuYWJsZUJ1dHRvbnMoZW5hYmxlZClcblx0e1xuXHRcdCQoJyNzcmMtcmVsb2FkQnV0dG9uJykuYXR0cignZGlzYWJsZWQnLCAhZW5hYmxlZCk7XG5cdFx0JCgnI3NyYy1zdWJtaXRCdXR0b24nKS5hdHRyKCdkaXNhYmxlZCcsICFlbmFibGVkKTtcblx0XHQkKCcjc3JjLWJhY2t1cENoZWNrJykuYXR0cignZGlzYWJsZWQnLCAhZW5hYmxlZCk7XG5cblx0XHQkKCcjc3JjLXVwZGF0ZUdlb2xvY0RiQnV0dG9uJykuYXR0cignZGlzYWJsZWQnLCAhZW5hYmxlZCk7XG5cblx0XHRpZiAoIXRoaXMuX3NzbExvY2tlZClcblx0XHRcdHRoaXMuX3NzbENlcnRNYW5hZ2VyLmVuYWJsZWQgPSBlbmFibGVkO1xuXHR9XG5cblx0X3N3aXRjaFZpZXcodmlld0lkKVxuXHR7XG5cdFx0ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NyYy12aWV3c3RhY2snKS5zZWxlY3RlZEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh2aWV3SWQpO1xuXHR9XG5cblx0X2NsZWFyVGFicygpXG5cdHtcblx0XHQvLyBEZXN0cm95IHNjcm9sbGluZyB0YWJzXG5cdFx0JCgnI3NyYy10YWJOYXZpZ2F0b3IgI3RhYnMnKS5zY3JvbGxpbmdUYWJzKCdkZXN0cm95Jyk7XG5cblx0XHQvLyBSZW1vdmUgYWxsIHRhYiBuYXZpZ2F0b3IgY29udGVudFxuXHRcdHRoaXMuX2ludGVyZmFjZUJ1aWxkZXIuZGVzdHJveUludGVyZmFjZSgpO1xuXHR9XG5cblx0X29uVXBkYXRlR2VvbG9jRGJDbGljaygpXG5cdHtcblx0XHQvLyBEaXNhYmxlIGJ1dHRvblxuXHRcdCQoJyNzcmMtdXBkYXRlR2VvbG9jRGJCdXR0b24nKS5hdHRyKCdkaXNhYmxlZCcsIHRydWUpO1xuXG5cdFx0Ly8gU2VuZCByZXF1ZXN0IHRvIHNlcnZlclxuXHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfVVBEQVRFX0dFT19EQik7XG5cdH1cblxuXHRfb25SZWxvYWRDbGljaygpXG5cdHtcblx0XHQvLyBEaXNhYmxlIGJ1dHRvbnNcblx0XHR0aGlzLl9lbmFibGVCdXR0b25zKGZhbHNlKTtcblxuXHRcdC8vIFN3aXRjaCB0byBsb2FkaW5nIHZpZXdcblx0XHR0aGlzLl9zd2l0Y2hWaWV3KCdzcmMtbG9hZGluZycpO1xuXG5cdFx0Ly8gSGlkZSB2YWxpZGF0aW9uIG1lc3NhZ2VzXG5cdFx0dGhpcy5faW50ZXJmYWNlQnVpbGRlci5yZXNldFZhbGlkYXRpb24oKTtcblxuXHRcdC8vIFJlcXVlc3QgY29uZmlndXJhdGlvbiBkYXRhIHRvIHNlcnZlciBpbnN0YW5jZVxuXHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfR0VUX0NPTkZJRyk7XG5cdH1cblxuXHRfb25TdWJtaXRDbGljaygpXG5cdHtcblx0XHQvLyBDaGVjayB2YWxpZGl0eVxuXHRcdGlmICh0aGlzLl9pbnRlcmZhY2VCdWlsZGVyLmNoZWNrSXNWYWxpZCgpKVxuXHRcdHtcblx0XHRcdGxldCBjaGFuZ2VzID0gdGhpcy5faW50ZXJmYWNlQnVpbGRlci5nZXRDaGFuZ2VkRGF0YSgpO1xuXG5cdFx0XHRpZiAoY2hhbmdlcy5zaXplKCkgPiAwKVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBEaXNhYmxlIGJ1dHRvbnNcblx0XHRcdFx0dGhpcy5fZW5hYmxlQnV0dG9ucyhmYWxzZSk7XG5cblx0XHRcdFx0Ly8gRGlzYWJsZSBmb3JtIGl0ZW1zXG5cdFx0XHRcdHRoaXMuX2ludGVyZmFjZUJ1aWxkZXIuZGlzYWJsZUludGVyZmFjZSh0cnVlKTtcblxuXHRcdFx0XHQvLyBTZW5kIHVwZGF0ZWQgc2V0dGluZ3MgdG8gc2VydmVyIGluc3RhbmNlXG5cdFx0XHRcdGxldCBwYXJhbXMgPSBuZXcgU0ZTMlguU0ZTT2JqZWN0KCk7XG5cdFx0XHRcdHBhcmFtcy5wdXRTRlNBcnJheSgnc2V0dGluZ3MnLCBjaGFuZ2VzKTtcblx0XHRcdFx0cGFyYW1zLnB1dEJvb2woJ2JhY2t1cCcsICQoJyNzcmMtYmFja3VwQ2hlY2snKS5wcm9wKCdjaGVja2VkJykpO1xuXG5cdFx0XHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfVVBEQVRFX0NPTkZJRywgcGFyYW1zKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5zaGVsbEN0cmwuc2hvd1NpbXBsZUFsZXJ0KCdVbmFibGUgdG8gc3VibWl0IGNvbmZpZ3VyYXRpb24gY2hhbmdlcyBkdWUgdG8gYW4gaW52YWxpZCB2YWx1ZTsgcGxlYXNlIHZlcmlmeSB0aGUgaGlnaGxpZ2h0ZWQgZm9ybSBmaWVsZHMgaW4gYWxsIHRhYnMuJywgdHJ1ZSk7XG5cdH1cblxuXHRfdXBkYXRlQ29uZmlnRm9ybUl0ZW1EaXNwbGF5ZWRWYWx1ZShjb25maWdQYXJhbU5hbWUsIG5ld1ZhbHVlKVxuXHR7XG5cdFx0Ly8gR2V0IHRoZSByZWxldmFudCBDb25maWd1cmF0aW9uIEZvcm0gSXRlbVxuXHRcdGNvbnN0IGNvbmZpZ0Zvcm1JdGVtID0gdGhpcy5faW50ZXJmYWNlQnVpbGRlci5nZXRDb25maWdGb3JtSXRlbShjb25maWdQYXJhbU5hbWUpO1xuXG5cdFx0Ly8gVXBkYXRlIENvbmZpZ3VyYXRpb24gUGFyYW1ldGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgQ29uZmlndXJhdGlvbiBGb3JtIEl0ZW1cblx0XHRjb25maWdGb3JtSXRlbS5kYXRhLnZhbHVlID0gbmV3VmFsdWU7XG5cdFx0Y29uZmlnRm9ybUl0ZW0uZGF0YS5yZXNldElzTW9kaWZpZWQoKTsgLy8gVGhpcyBpcyBuZWVkZWQgdG8gYXZvaWQgdGhlIENvbmZpZ3VyYXRpb24gUGFyYW1ldGVyIHRvIGZsYWdnZWQgYXMgJ2NoYW5nZWQnXG5cblx0XHQvLyBEaXNwbGF5IHRoZSBuZXcgdmFsdWUgb2YgdGhlIENvbmZpZ3VyYXRpb24gRm9ybSBJdGVtXG5cdFx0Y29uZmlnRm9ybUl0ZW0uX3NldFdpZGdldFZhbHVlKCk7IC8vIERpc3BsYXkgdGhlIG5ldyB2YWx1ZSBpbiB0aGUgY29uZmlnIGZvcm0gaXRlbVxuXHR9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUNuZEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBIiwic291cmNlUm9vdCI6IiJ9
845
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXRzL2pzL2NvcmUvbW9kdWxlcy9tb2R1bGUtOS5idW5kbGUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9jb21wb25lbnRzL21vZHVsZS1zcGVjaWZpYy9zc2wtY2VydGlmaWNhdGUtbWFuYWdlci5qcyIsIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9tb2R1bGVzL3NlcnZlci1jb25maWd1cmF0b3IuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtieXRlc1RvU2l6ZX0gZnJvbSAnLi4vLi4vdXRpbHMvdXRpbGl0aWVzJztcbmltcG9ydCBhZXNqcyBmcm9tICdhZXMtanMnO1xuXG5leHBvcnQgY2xhc3MgU3NsQ2VydGlmaWNhdGVNYW5hZ2VyIGV4dGVuZHMgSFRNTEVsZW1lbnRcbntcblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdCAgICBzdXBlcigpO1xuXG5cdFx0dGhpcy5fbW9kYWxIdG1sID0gYFxuXHRcdFx0PGRpdiBjbGFzcz1cIm1vZGFsXCIgaWQ9XCJ1cGxvYWRNb2RhbFwiIHRhYmluZGV4PVwiLTFcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1sYWJlbGxlZGJ5PVwidXBsb2FkTW9kYWxUaXRsZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nIG1vZGFsLWRpYWxvZy1jZW50ZXJlZFwiIHJvbGU9XCJkb2N1bWVudFwiPlxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XG5cdFx0XHRcdFx0XHRcdDxoNSBjbGFzcz1cIm1vZGFsLXRpdGxlIHRleHQtcHJpbWFyeVwiIGlkPVwidXBsb2FkTW9kYWxUaXRsZVwiPlNTTCBDZXJ0aWZpY2F0ZSBNYW5hZ2VyPC9oNT5cblx0XHRcdFx0XHRcdFx0PGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjbG9zZVwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCI+XG5cdFx0XHRcdFx0XHRcdFx0PHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JnRpbWVzOzwvc3Bhbj5cblx0XHRcdFx0XHRcdFx0PC9idXR0b24+XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5IGluLWZsb3ctaW52YWxpZC1tc2dcIj5cblx0XHRcdFx0XHRcdFx0PGZpZWxkc2V0IGlkPVwidXBsb2FkRmllbGRzZXRcIj5cblx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGlkPVwidXBsb2FkZXJTdWJmb3JtXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY29sLWZvcm0tbGFiZWwgZm9ybS1sYWJlbC1jb250YWluZXJcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8bGFiZWwgZm9yPVwidXBsb2FkZXJcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5DZXJ0aWZpY2F0ZSBrZXlzdG9yZSAoamtzKSA8aSBjbGFzcz1cImZhcyBmYS1xdWVzdGlvbi1jaXJjbGUgdGV4dC1tdXRlZCBoZWxwXCIgdGl0bGU9XCJTU0wgY2VydGlmaWNhdGUncyBwcm90ZWN0ZWQga2V5c3RvcmUgZmlsZSB0byBiZSB1cGxvYWRlZCB0byB0aGUgc2VydmVyLCBpbiBqa3MgZm9ybWF0XCI+PC9pPjwvbGFiZWw+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiaW5uZXItd2lkZ2V0XCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGlucHV0IHR5cGU9XCJmaWxlXCIgaWQ9XCJ1cGxvYWRlclwiIG5hbWU9XCJ1cGxvYWRlclwiIGFjY2VwdD1cIi5qa3NcIiBkYXRhLXVwbG9hZC1tc2c9XCJTZWxlY3QgYSBmaWxlXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJrLWludmFsaWQtbXNnIHBvc2l0aW9uLXN0YXRpY1wiIGRhdGEtZm9yPVwidXBsb2FkZXJcIj48L3NwYW4+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0PGRpdiBpZD1cInBhc3N3b3Jkc1N1YmZvcm1cIj5cblx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJmb3JtLXJvd1wiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBjb2xcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY29sLWZvcm0tbGFiZWwgZm9ybS1sYWJlbC1jb250YWluZXJcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxsYWJlbCBmb3I9XCJrc1Bhc3N3b3JkXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+S2V5c3RvcmUgcGFzc3dvcmQgPGkgY2xhc3M9XCJmYXMgZmEtcXVlc3Rpb24tY2lyY2xlIHRleHQtbXV0ZWQgaGVscFwiIHRpdGxlPVwiUGFzc3dvcmQgdXNlZCB0byBwcm90ZWN0IHRoZSBjZXJ0aWZpY2F0ZSBrZXlzdG9yZVwiPjwvaT48L2xhYmVsPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJpbm5lci13aWRnZXRcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxpbnB1dCB0eXBlPVwicGFzc3dvcmRcIiBpZD1cImtzUGFzc3dvcmRcIiBuYW1lPVwia3NQYXNzd29yZFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIGstdGV4dGJveFwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHJlcXVpcmVkIGRhdGEtcmVxdWlyZWQtbXNnPVwiUmVxdWlyZWRcIiAvPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJrLWludmFsaWQtbXNnIHBvc2l0aW9uLXN0YXRpY1wiIGRhdGEtZm9yPVwia3NQYXNzd29yZFwiPjwvc3Bhbj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgY29sXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImNvbC1mb3JtLWxhYmVsIGZvcm0tbGFiZWwtY29udGFpbmVyXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8bGFiZWwgZm9yPVwiY29uZmlybUtzUGFzc3dvcmRcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5Db25maXJtIHBhc3N3b3JkIDxpIGNsYXNzPVwiZmFzIGZhLXF1ZXN0aW9uLWNpcmNsZSB0ZXh0LW11dGVkIGhlbHBcIiB0aXRsZT1cIktleXN0b3JlIHBhc3N3b3JkIGNvbmZpcm1hdGlvblwiPjwvaT48L2xhYmVsPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJpbm5lci13aWRnZXRcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxpbnB1dCB0eXBlPVwicGFzc3dvcmRcIiBpZD1cImNvbmZpcm1Lc1Bhc3N3b3JkXCIgbmFtZT1cImNvbmZpcm1Lc1Bhc3N3b3JkXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgay10ZXh0Ym94XCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgcmVxdWlyZWQgZGF0YS1yZXF1aXJlZC1tc2c9XCJSZXF1aXJlZFwiIC8+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImstaW52YWxpZC1tc2cgcG9zaXRpb24tc3RhdGljXCIgZGF0YS1mb3I9XCJjb25maXJtS3NQYXNzd29yZFwiPjwvc3Bhbj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblxuXHRcdFx0XHRcdFx0XHRcdFx0PHA+PGVtPkZvciBhZGRpdGlvbmFsIHNlY3VyaXR5LCBlbnRlciBhZ2FpbiBhbmQgY29uZmlybSB5b3VyIFNGUzJYIGFkbWluaXN0cmF0aW9uIHBhc3N3b3JkLjwvZW0+PC9wPlxuXG5cdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZm9ybS1yb3dcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgY29sXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImNvbC1mb3JtLWxhYmVsIGZvcm0tbGFiZWwtY29udGFpbmVyXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8bGFiZWwgZm9yPVwiYWRtaW5QYXNzd29yZFwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkFkbWluIHBhc3N3b3JkIDxpIGNsYXNzPVwiZmFzIGZhLXF1ZXN0aW9uLWNpcmNsZSB0ZXh0LW11dGVkIGhlbHBcIiB0aXRsZT1cIlNtYXJ0Rm94U2VydmVyIDJYIHJlbW90ZSBhZG1pbmlzdHJhdGlvbiBwYXNzd29yZFwiPjwvaT48L2xhYmVsPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJpbm5lci13aWRnZXRcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxpbnB1dCB0eXBlPVwicGFzc3dvcmRcIiBpZD1cImFkbWluUGFzc3dvcmRcIiBuYW1lPVwiYWRtaW5QYXNzd29yZFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIGstdGV4dGJveFwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHJlcXVpcmVkIGRhdGEtcmVxdWlyZWQtbXNnPVwiUmVxdWlyZWRcIiAvPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJrLWludmFsaWQtbXNnIHBvc2l0aW9uLXN0YXRpY1wiIGRhdGEtZm9yPVwiYWRtaW5QYXNzd29yZFwiPjwvc3Bhbj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgY29sXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImNvbC1mb3JtLWxhYmVsIGZvcm0tbGFiZWwtY29udGFpbmVyXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8bGFiZWwgZm9yPVwiY29uZmlybUFkbWluUGFzc3dvcmRcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5Db25maXJtIHBhc3N3b3JkIDxpIGNsYXNzPVwiZmFzIGZhLXF1ZXN0aW9uLWNpcmNsZSB0ZXh0LW11dGVkIGhlbHBcIiB0aXRsZT1cIlNtYXJ0Rm94U2VydmVyIDJYIHJlbW90ZSBhZG1pbmlzdHJhdGlvbiBwYXNzd29yZCBjb25maXJtYXRpb25cIj48L2k+PC9sYWJlbD5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiaW5uZXItd2lkZ2V0XCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8aW5wdXQgdHlwZT1cInBhc3N3b3JkXCIgaWQ9XCJjb25maXJtQWRtaW5QYXNzd29yZFwiIG5hbWU9XCJjb25maXJtQWRtaW5QYXNzd29yZFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIGstdGV4dGJveFwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHJlcXVpcmVkIGRhdGEtcmVxdWlyZWQtbXNnPVwiUmVxdWlyZWRcIiAvPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJrLWludmFsaWQtbXNnIHBvc2l0aW9uLXN0YXRpY1wiIGRhdGEtZm9yPVwiY29uZmlybUFkbWluUGFzc3dvcmRcIj48L3NwYW4+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdDwvZmllbGRzZXQ+XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXIgZmxleC1jb2x1bW5cIj5cblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImQtZmxleCB3LTEwMFwiPlxuXHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJmbGV4LWdyb3ctMSB0ZXh0LWxlZnRcIj5cblx0XHRcdFx0XHRcdFx0XHRcdDxidXR0b24gaWQ9XCJ1cGxvYWRTc2xCdXR0b25cIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJrLWJ1dHRvbiBrLXByaW1hcnlcIj48aSBjbGFzcz1cImZhcyBmYS11cGxvYWQgbXItMVwiPjwvaT5VcGxvYWQgY2VydGlmaWNhdGU8L2J1dHRvbj5cblx0XHRcdFx0XHRcdFx0XHRcdDxpIGlkPVwidXBsb2FkU3Bpbm5lclwiIGNsYXNzPVwiZmFzIGZhLWNpcmNsZS1ub3RjaCBmYS1zcGluIHRleHQtcHJpbWFyeSBhbGlnbi1taWRkbGUgbWwtMVwiPjwvaT5cblx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZmxleC1ncm93LTEgdGV4dC1yaWdodFwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0PGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJrLWJ1dHRvbiBrLXNlY29uZGFyeVwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCI+Q2FuY2VsPC9idXR0b24+XG5cdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGlkPVwidXBsb2FkRXJyb3JNc2dcIiBjbGFzcz1cInRleHQtZGFuZ2VyIG10LTNcIj48L2Rpdj5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdDwvZGl2PlxuXHRcdGA7XG5cblx0XHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRcdCQodGhpcykuYXBwZW5kKGBcblx0XHRcdDxkaXYgY2xhc3M9XCJjb2wtc20tNSBjb2wtbGctNCBjb2wtZm9ybS1sYWJlbCBmb3JtLWxhYmVsLWNvbnRhaW5lclwiPlxuXHRcdFx0XHQ8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+VXBsb2FkIGNlcnRpZmljYXRlIDxpIGNsYXNzPVwiZmFzIGZhLXF1ZXN0aW9uLWNpcmNsZSB0ZXh0LW11dGVkIGhlbHBcIiB0aXRsZT1cIlVwbG9hZCBhbiBTU0wgY2VydGlmaWNhdGUncyBwcm90ZWN0ZWQga2V5c3RvcmUgdG8gdGhlIHNlcnZlclwiPjwvaT48L2xhYmVsPlxuXHRcdFx0PC9kaXY+XG5cdFx0XHQ8ZGl2IGNsYXNzPVwiaW5uZXItd2lkZ2V0IGFsaWduLXNlbGYtY2VudGVyIGFsaWduLXNlbGYtc20tc3RhcnQgY29sLWF1dG9cIj5cblx0XHRcdFx0PGJ1dHRvbiBpZD1cIm1hbmFnZVNzbEJ1dHRvblwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImstYnV0dG9uIGstcHJpbWFyeVwiIGRpc2FibGVkPjxpIGNsYXNzPVwiZmFzIGZhLWNvZyBtci0xXCI+PC9pPk1hbmFnZTwvYnV0dG9uPlxuXHRcdFx0PC9kaXY+XG5cdFx0YCk7XG5cblx0XHQvLyBBZGQgbGlzdGVuZXJzIHRvIE1hbmFnZSBidXR0b24gY2xpY2tcblx0XHQkKCcjbWFuYWdlU3NsQnV0dG9uJywgJCh0aGlzKSkub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vbk1hbmFnZVNzbENsaWNrLCB0aGlzKSk7XG5cdH1cblxuXHRkZXN0cm95KClcblx0e1xuXHRcdC8vIFJlbW92ZSBldmVudCBsaXN0ZW5lclxuXHRcdCQoJyNtYW5hZ2VTc2xCdXR0b24nLCAkKHRoaXMpKS5vZmYoJ2NsaWNrJyk7XG5cblx0XHQvLyBIaWRlIG1vZGFsICh3aGljaCBpbiB0dXJuIGRlc3Ryb3lzIGl0KVxuXHRcdGxldCBtb2RhbEVsZW1lbnQgPSAkKCcjdXBsb2FkTW9kYWwnLCAkKHRoaXMpKTtcblxuXHRcdGlmIChtb2RhbEVsZW1lbnQpXG5cdFx0XHRtb2RhbEVsZW1lbnQubW9kYWwoJ2hpZGUnKTtcblx0fVxuXG5cdGdldCBlbmFibGVkKClcblx0e1xuXHRcdHJldHVybiB0aGlzLl9pc0VuYWJsZWQ7XG5cdH1cblxuXHRzZXQgZW5hYmxlZCh2YWx1ZSlcblx0e1xuXHRcdHRoaXMuX2lzRW5hYmxlZCA9IHZhbHVlO1xuXG5cdFx0Ly8gRW5hYmxlL2Rpc2FibGUgTWFuYWdlIGJ1dHRvblxuXHRcdCQoJyNtYW5hZ2VTc2xCdXR0b24nLCAkKHRoaXMpKS5hdHRyKCdkaXNhYmxlZCcsICF2YWx1ZSk7XG5cblx0XHQvLyBFbmFibGUvZGlzYWJsZSBtb2RhbFxuXHRcdGxldCBtb2RhbEVsZW1lbnQgPSAkKCcjdXBsb2FkTW9kYWwnLCAkKHRoaXMpKTtcblxuXHRcdGlmIChtb2RhbEVsZW1lbnQpXG5cdFx0e1xuXHRcdFx0Ly8gRGlzYWJsZSBtb2RhbCBjbG9zZSBidXR0b25zXG5cdFx0XHQkKCdidXR0b25bZGF0YS1kaXNtaXNzPVwibW9kYWxcIl0nLCBtb2RhbEVsZW1lbnQpLmF0dHIoJ2Rpc2FibGVkJywgIXZhbHVlKTtcblxuXHRcdFx0Ly8gRGlzYWJsZSB1cGxvYWQgYnV0dG9uXG5cdFx0XHQkKCcjdXBsb2FkU3NsQnV0dG9uJywgbW9kYWxFbGVtZW50KS5hdHRyKCdkaXNhYmxlZCcsICF2YWx1ZSk7XG5cblx0XHRcdC8vIERpc2FibGUgZmllbGRzZXRcblx0XHRcdCQoJyN1cGxvYWRGaWVsZHNldCcsIG1vZGFsRWxlbWVudCkuYXR0cignZGlzYWJsZWQnLCAhdmFsdWUpO1xuXHRcdH1cblx0fVxuXG5cdGdldCB1cGxvYWRUYXJnZXRDb25maWcoKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3VwbG9hZFRhcmdldENvbmZpZztcblx0fVxuXG5cdHNldCB1cGxvYWRUYXJnZXRDb25maWcoZGF0YSlcblx0e1xuXHRcdHRoaXMuX3VwbG9hZFRhcmdldENvbmZpZyA9IGRhdGE7XG5cdH1cblxuXHRfb25NYW5hZ2VTc2xDbGljaygpXG5cdHtcblx0XHQvLyBJbml0aWFsaXplIGFuZCBzaG93IG1vZGFsXG5cdFx0dGhpcy5fc2hvd01vZGFsKCk7XG5cdH1cblxuXHRfb25VcGxvYWRTc2xDbGljaygpXG5cdHtcblx0XHRpZiAodGhpcy5fdmFsaWRhdGUoKSlcblx0XHRcdHRoaXMuX3N0YXJ0U3NsQ2VydFVwbG9hZCgpO1xuXHR9XG5cblx0X3Nob3dNb2RhbCgpXG5cdHtcblx0XHQvLyBBcHBlbmQgbW9kYWwgaHRtbFxuXHRcdCQodGhpcykuYXBwZW5kKHRoaXMuX21vZGFsSHRtbCk7XG5cblx0XHRsZXQgbW9kYWxFbGVtZW50ID0gJCgnI3VwbG9hZE1vZGFsJywgJCh0aGlzKSk7XG5cblx0XHQvLyBIaWRlIFNTTCBjZXJ0aWZpY2F0ZSB1cGxvYWQgc3Bpbm5lciBhbmQgZXJyb3IgbWVzc2FnZSBjb250YWluZXJcblx0XHQkKCcjdXBsb2FkU3Bpbm5lcicsIG1vZGFsRWxlbWVudCkuaGlkZSgpO1xuXHRcdCQoJyN1cGxvYWRFcnJvck1zZycsIG1vZGFsRWxlbWVudCkuaGlkZSgpO1xuXHRcdCQoJyN1cGxvYWRFcnJvck1zZycsIG1vZGFsRWxlbWVudCkudGV4dCgnJyk7XG5cblx0XHQvLyBBZGQgbGlzdGVuZXIgdG8gVXBsb2FkIGJ1dHRvbiBjbGlja1xuXHRcdCQoJyN1cGxvYWRTc2xCdXR0b24nLCBtb2RhbEVsZW1lbnQpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25VcGxvYWRTc2xDbGljaywgdGhpcykpO1xuXG5cdFx0Ly8gQWRkIGxpc3RlbmVyIHRvIG1vZGFsIGhpZGUgZXZlbnRcblx0XHRtb2RhbEVsZW1lbnQub24oJ2hpZGRlbi5icy5tb2RhbCcsICQucHJveHkodGhpcy5fZGVzdHJveU1vZGFsLCB0aGlzKSk7XG5cblx0XHQvLyBJbml0aWFsaXplIGtlbmRvIHVwbG9hZGVyXG5cdFx0dGhpcy5fdXBsb2FkV2lkZ2V0ID0gbW9kYWxFbGVtZW50LmZpbmQoJyN1cGxvYWRlcicpLmtlbmRvVXBsb2FkKHtcblx0XHRcdGFsbG93ZWRFeHRlbnNpb25zOiBbJy5qa3MnXSxcblx0XHRcdG11bHRpcGxlOiBmYWxzZSxcblx0XHRcdHRlbXBsYXRlOiBmdW5jdGlvbihkYXRhSXRlbSkge1xuXHRcdFx0XHRkYXRhSXRlbS5ieXRlc1RvU2l6ZSA9IGJ5dGVzVG9TaXplOyAvLyBQYXNzIGJ5dGVzVG9TaXplIHV0aWxpdHkgZnVuY3Rpb24gdG8gdGVtcGxhdGVcblx0XHRcdFx0cmV0dXJuIGtlbmRvLnRlbXBsYXRlKGBcblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz0nay1wcm9ncmVzcyB3LTEwMCc+PC9zcGFuPlxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiXCI+XG5cdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImstZmlsZS1uYW1lXCIgdGl0bGU9XCIjPW5hbWUjXCI+Iz1uYW1lIzwvc3Bhbj5cblx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiay1maWxlLXNpemVcIj5TaXplOiAjPWJ5dGVzVG9TaXplKHNpemUsIDEsICdCeXRlcycpIzwvc3Bhbj5cblx0XHRcdFx0XHQ8L3NwYW4+XG5cdFx0XHRcdGApKGRhdGFJdGVtKTtcblx0XHRcdH0sXG5cdCAgICAgICAgbG9jYWxpemF0aW9uOiB7XG5cdCAgICAgICAgICAgIHNlbGVjdDogJ1NlbGVjdCBmaWxlLi4uJ1xuXHQgICAgICAgIH1cbiAgICAgICAgfSkuZGF0YSgna2VuZG9VcGxvYWQnKTtcblxuXHRcdC8vIEluaXRpYWxpemUga2VuZG8gdmFsaWRhdGlvbiBvbiB1cGxvYWRlciBzdWJmb3JtXG5cdFx0Ly8gTk9URTogd2UgdXNlIHNlcGFyYXRlIHZhbGlkYXRvcnMgdG8gYmUgYWJsZSB0byBkaXNhYmxlICd2YWxpZGF0ZU9uQmx1cicgb24gdGhlIHVwbG9hZGVyLFxuXHRcdC8vIGJlY2F1c2UgaXQgY2F1c2VzIHRoZSBlcnJvciBtZXNzYWdlIHRvIGFwcGVhciBhcyBzb29uIGFzIHRoZSBcIlNlbGVjdCBmaWxlXCIgYnV0dG9uIGlzIGNsaWNrZWRcblx0XHR0aGlzLl92YWxpZGF0b3IxID0gbW9kYWxFbGVtZW50LmZpbmQoJyN1cGxvYWRlclN1YmZvcm0nKS5rZW5kb1ZhbGlkYXRvcih7XG5cdFx0XHR2YWxpZGF0ZU9uQmx1cjogZmFsc2UsXG5cdFx0XHRydWxlczoge1xuXHRcdFx0XHR1cGxvYWQ6IGZ1bmN0aW9uKGlucHV0KSB7XG5cdFx0XHRcdFx0bGV0IHZhbGlkID0gZmFsc2U7XG5cdFx0XHRcdFx0aWYgKGlucHV0LmlzKCdbdHlwZT1maWxlXScpKVxuXHRcdFx0XHRcdFx0dmFsaWQgPSBpbnB1dC5jbG9zZXN0KCcuay11cGxvYWQnKS5maW5kKCcuay1maWxlJykubGVuZ3RoID4gMDtcblxuXHRcdFx0XHRcdHJldHVybiB2YWxpZDtcblx0ICAgICAgICAgICAgfVxuXHRcdFx0fVxuXHRcdH0pLmRhdGEoJ2tlbmRvVmFsaWRhdG9yJyk7XG5cblx0XHQvLyBJbml0aWFsaXplIGtlbmRvIHZhbGlkYXRpb24gb24gcGFzc3dvcmRzIHN1YmZvcm1cblx0XHR0aGlzLl92YWxpZGF0b3IyID0gbW9kYWxFbGVtZW50LmZpbmQoJyNwYXNzd29yZHNTdWJmb3JtJykua2VuZG9WYWxpZGF0b3Ioe1xuXHRcdFx0dmFsaWRhdGVPbkJsdXI6IHRydWUsXG5cdFx0XHRydWxlczoge1xuXHRcdFx0XHR2ZXJpZnlLc1Bhc3N3b3JkOiAkLnByb3h5KGZ1bmN0aW9uKGlucHV0KSB7XG5cdFx0XHRcdFx0bGV0IHZhbGlkID0gdHJ1ZTtcblx0XHRcdFx0XHRpZiAoaW5wdXQuaXMoJ1tuYW1lPWNvbmZpcm1Lc1Bhc3N3b3JkXScpKVxuXHRcdFx0XHRcdFx0dmFsaWQgPSBpbnB1dC52YWwoKSA9PT0gJCh0aGlzKS5maW5kKCcja3NQYXNzd29yZCcpLnZhbCgpO1xuXHRcdFx0XHRcdHJldHVybiB2YWxpZDtcblx0XHRcdFx0fSwgdGhpcyksXG5cdFx0XHRcdHZlcmlmeUFkbVBhc3N3b3JkOiAkLnByb3h5KGZ1bmN0aW9uKGlucHV0KSB7XG5cdFx0XHRcdFx0bGV0IHZhbGlkID0gdHJ1ZTtcblx0XHRcdFx0XHRpZiAoaW5wdXQuaXMoJ1tuYW1lPWNvbmZpcm1BZG1pblBhc3N3b3JkXScpKVxuXHRcdFx0XHRcdFx0dmFsaWQgPSBpbnB1dC52YWwoKSA9PT0gJCh0aGlzKS5maW5kKCcjYWRtaW5QYXNzd29yZCcpLnZhbCgpO1xuXHRcdFx0XHRcdHJldHVybiB2YWxpZDtcblx0XHRcdFx0fSwgdGhpcylcblx0XHRcdH0sXG5cdFx0XHRtZXNzYWdlczoge1xuXHRcdFx0XHR2ZXJpZnlLc1Bhc3N3b3JkOiAnUGFzc3dvcmQgbm90IG1hdGNoaW5nJyxcblx0XHRcdFx0dmVyaWZ5QWRtUGFzc3dvcmQ6ICdQYXNzd29yZCBub3QgbWF0Y2hpbmcnLFxuXHRcdFx0fVxuXHRcdH0pLmRhdGEoJ2tlbmRvVmFsaWRhdG9yJyk7XG5cblx0XHQvLyBJbml0aWFsaXplIGJvb3RzdHJhcCBtb2RhbFxuXHRcdG1vZGFsRWxlbWVudC5tb2RhbCh7XG5cdFx0XHRiYWNrZHJvcDogJ3N0YXRpYycsXG5cdFx0XHRrZXlib2FyZDogZmFsc2UsXG5cdFx0fSk7XG5cdH1cblxuXHRfZGVzdHJveU1vZGFsKClcblx0e1xuXHRcdGxldCBtb2RhbEVsZW1lbnQgPSAkKCcjdXBsb2FkTW9kYWwnLCAkKHRoaXMpKTtcblxuXHRcdGlmIChtb2RhbEVsZW1lbnQpXG5cdFx0e1xuXHRcdFx0Ly8gUmVtb3ZlIGxpc3RlbmVyc1xuXHRcdFx0JCgnI3VwbG9hZFNzbEJ1dHRvbicsIG1vZGFsRWxlbWVudCkub2ZmKCdjbGljaycpO1xuXHRcdFx0bW9kYWxFbGVtZW50Lm9mZignaGlkZGVuLmJzLm1vZGFsJyk7XG5cblx0XHRcdC8vIERlc3Ryb3kgZXZlcnl0aGluZyBLZW5kb1xuXHRcdFx0a2VuZG8uZGVzdHJveShtb2RhbEVsZW1lbnQpO1xuXG5cdFx0XHQvLyBEaXNwb3NlIG1vZGFsXG5cdFx0XHRtb2RhbEVsZW1lbnQubW9kYWwoJ2Rpc3Bvc2UnKTtcblxuXHRcdFx0Ly8gUmVtb3ZlIGh0bWxcblx0XHRcdG1vZGFsRWxlbWVudC5yZW1vdmUoKTtcblx0XHRcdG1vZGFsRWxlbWVudCA9IG51bGw7XG5cdFx0fVxuXHR9XG5cblx0X3ZhbGlkYXRlKClcblx0e1xuXHRcdGxldCB2YWwxID0gdGhpcy5fdmFsaWRhdG9yMS52YWxpZGF0ZSgpO1xuXHRcdGxldCB2YWwyID0gdGhpcy5fdmFsaWRhdG9yMi52YWxpZGF0ZSgpO1xuXG5cdFx0cmV0dXJuIHZhbDEgJiYgdmFsMjtcblx0fVxuXG5cdF9zdGFydFNzbENlcnRVcGxvYWQoKVxuXHR7XG5cdFx0aWYgKCF0aGlzLl91cGxvYWRUYXJnZXRDb25maWcpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1VwbG9hZCB0YXJnZXQgY29uZmlndXJhdGlvbiBub3Qgc2V0Jyk7XG5cblx0XHRsZXQgbW9kYWxFbGVtZW50ID0gJCgnI3VwbG9hZE1vZGFsJywgJCh0aGlzKSk7XG5cblx0XHRpZiAobW9kYWxFbGVtZW50KVxuXHRcdHtcblx0XHRcdGxldCBjZXJ0RGF0YSA9IHt9O1xuXHRcdFx0Y2VydERhdGEuZmlsZSA9IHRoaXMuX3VwbG9hZFdpZGdldC5nZXRGaWxlcygpWzBdO1xuXHRcdFx0Y2VydERhdGEua3NQYXNzd29yZCA9ICQoJyNrc1Bhc3N3b3JkJywgbW9kYWxFbGVtZW50KS52YWwoKTtcblx0XHRcdGNlcnREYXRhLmFkbWluUGFzc3dvcmQgPSAkKCcjYWRtaW5QYXNzd29yZCcsIG1vZGFsRWxlbWVudCkudmFsKCk7XG5cblx0XHRcdC8vIERpc2FibGUgbW9kYWxcblx0XHRcdHRoaXMuZW5hYmxlZCA9IGZhbHNlO1xuXG5cdFx0XHQvLyBIaWRlIHByZXZpb3VzIGVycm9yIGFuZCBzaG93IHNwaW5uZXJcblx0XHRcdCQoJyN1cGxvYWRTcGlubmVyJywgbW9kYWxFbGVtZW50KS5zaG93KCk7XG5cdFx0XHQkKCcjdXBsb2FkRXJyb3JNc2cnLCBtb2RhbEVsZW1lbnQpLmhpZGUoKTtcblx0XHRcdCQoJyN1cGxvYWRFcnJvck1zZycsIG1vZGFsRWxlbWVudCkudGV4dCgnJyk7XG5cblx0XHRcdC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHRcdFx0Ly8gR2VuZXJhdGUgSW5pdCBWZWN0b3Jcblx0XHRcdGxldCBybmdWYWx1ZXMgPSBbXTtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgMTY7IGkrKylcblx0XHRcdFx0cm5nVmFsdWVzLnB1c2goTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMjU2KSk7XG5cblx0XHRcdGxldCBpdiA9IG5ldyBVaW50OEFycmF5KHJuZ1ZhbHVlcyk7XG5cblx0XHRcdC8vIEdlbmVyYXRlIHNlY3JldCBrZXkgYnkgTUQ1LWVuY29kaW5nIGFkbWluIHBhc3N3b3JkICsgc2Vzc2lvbiB0b2tlblxuXHRcdFx0bGV0IG1kNVBhc3MgPSB0aGlzLl9iaW5hcnlNRDUoY2VydERhdGEuYWRtaW5QYXNzd29yZCArIHRoaXMuX3VwbG9hZFRhcmdldENvbmZpZy5zZXNzaW9uVG9rZW4pO1xuXG5cdFx0XHQvLyBFbmNyeXB0IGtleXN0b3JlIHBhc3N3b3JkIHZpYSBBRVMgKDEyOGJpdClcblx0XHRcdGxldCBlbmNyeXB0ZWRQd2QgPSB0aGlzLl9hZXNFbmNyeXB0KGNlcnREYXRhLmtzUGFzc3dvcmQsIG1kNVBhc3MsIGl2KTtcblxuXHRcdFx0Ly8gRW5jb2RlIElWIHVzaW5nIEJhc2U2NFxuXHRcdFx0bGV0IGVuY29kZWRJdiA9IHRoaXMuX2I2NEVuY29kZShpdik7XG5cblx0XHRcdC8vIEVuY29kZSBlbmNyeXB0ZWQgcGFzc3dvcmQgdXNpbmcgQmFzZTY0XG5cdFx0XHRsZXQgZW5jb2RlZFB3ZCA9IHRoaXMuX2I2NEVuY29kZShlbmNyeXB0ZWRQd2QpO1xuXG5cdFx0XHQvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblx0XHRcdC8vIFNldCBwYXJhbWV0ZXJzIHRvIGJlIHNlbnQgd2l0aCB0aGUgY2VydGlmaWNhdGUga2V5c3RvcmUgZmlsZVxuXHRcdFx0Y29uc3QgcGFyYW1zID0gbmV3IEZvcm1EYXRhKCk7XG5cdFx0XHRwYXJhbXMuYXBwZW5kKCdmaWxlc1tdJywgY2VydERhdGEuZmlsZS5yYXdGaWxlKTtcblx0XHRcdHBhcmFtcy5hcHBlbmQoJ19faXYnLCBlbmNvZGVkSXYpO1xuXHRcdFx0cGFyYW1zLmFwcGVuZCgnX19wYXNzd29yZCcsIGVuY29kZWRQd2QpO1xuXHRcdFx0cGFyYW1zLmFwcGVuZCgnX19tb2R1bGUnLCB0aGlzLl91cGxvYWRUYXJnZXRDb25maWcubW9kdWxlSWQpO1xuXG5cdFx0XHQvLyBTZXQgZGVzdGluYXRpb24gdXJsXG5cdFx0XHRjb25zdCB1cmwgPSB0aGlzLl91cGxvYWRUYXJnZXRDb25maWcucHJvdG9jb2wgKyAnOi8vJyArIHRoaXMuX3VwbG9hZFRhcmdldENvbmZpZy5ob3N0ICsgJzonICsgdGhpcy5fdXBsb2FkVGFyZ2V0Q29uZmlnLnBvcnQgKyAnL0JsdWVCb3gvU0ZTMlhGaWxlVXBsb2FkP3Nlc3NIYXNoSWQ9JyArIHRoaXMuX3VwbG9hZFRhcmdldENvbmZpZy5zZXNzaW9uVG9rZW47XG5cblx0XHRcdC8vIFN0YXJ0IHVwbG9hZFxuXHRcdFx0ZmV0Y2godXJsLCB7XG5cdFx0XHRcdG1ldGhvZDogJ1BPU1QnLFxuXHRcdFx0XHRib2R5OiBwYXJhbXMsXG5cdFx0XHRcdG1vZGU6ICduby1jb3JzJ1xuXHRcdFx0fSkudGhlbigkLnByb3h5KHRoaXMuX29uU3NsQ2VydFVwbG9hZEVuZCwgdGhpcykpO1xuXHRcdH1cblx0fVxuXG5cdF9vblNzbENlcnRVcGxvYWRFbmQocmVzcG9uc2UpXG5cdHtcblx0XHQvLyBOb3RoaW5nIHRvIGRvOiB3ZSBoYXZlIHRvIHdhaXQgdGhlIHVwbG9hZCBwcm9jZXNzIGNvbXBsZXRpb24gdG8gYmUgc2lnbmFsZWQgYnkgdGhlIHNlcnZlciB0aHJvdWdoIHRoZSBkZWRpY2F0ZWQgRXh0ZW5zaW9uIHJlc3BvbnNlXG5cblx0XHQvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblx0XHQvLyBUT0RPIFNob3VsZCB3ZSBoYW5kbGUgdGhpcyByZXNwb25zZSBpbiBzb21lIHdheT8gRm9yIHNvbWUgdW5rbm93biByZWFzb24gd2UgYWx3YXlzIGdldCBvaz1mYWxzZSBhbmQgc3RhdHVzPTBcblx0XHQvL2NvbnNvbGUubG9nKHJlc3BvbnNlKVxuXHRcdC8vY29uc29sZS5sb2cocmVzcG9uc2Uub2spXG5cdFx0Ly9jb25zb2xlLmxvZyhyZXNwb25zZS5zdGF0dXMpXG5cdH1cblxuXHQvKipcblx0ICogTWV0aG9kIGNhbGxlZCBieSBwYXJlbnQgd2hlbiB1cGxvYWQgZmFpbGVkLlxuXHQgKi9cblx0b25Tc2xDZXJ0VXBsb2FkRXJyb3IoZXJyb3IpXG5cdHtcblx0XHRsZXQgbW9kYWxFbGVtZW50ID0gJCgnI3VwbG9hZE1vZGFsJywgJCh0aGlzKSk7XG5cblx0XHRpZiAobW9kYWxFbGVtZW50KVxuXHRcdHtcblx0XHRcdC8vIEVuYWJsZSBtb2RhbFxuXHRcdFx0dGhpcy5lbmFibGVkID0gdHJ1ZTtcblxuXHRcdFx0Ly8gU2hvdyB1cGxvYWQgZXJyb3Jcblx0XHRcdCQoJyN1cGxvYWRFcnJvck1zZycsIG1vZGFsRWxlbWVudCkuc2hvdygpO1xuXHRcdFx0JCgnI3VwbG9hZEVycm9yTXNnJywgbW9kYWxFbGVtZW50KS50ZXh0KGVycm9yICsgJy4nKTtcblxuXHRcdFx0Ly8gSGlkZSBzcGlubmVyXG5cdFx0XHQkKCcjdXBsb2FkU3Bpbm5lcicsIG1vZGFsRWxlbWVudCkuaGlkZSgpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBNZXRob2QgY2FsbGVkIGJ5IHBhcmVudCB3aGVuIHVwbG9hZCBpcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LlxuXHQgKi9cblx0b25Tc2xDZXJ0VXBsb2FkU3VjY2VzcygpXG5cdHtcblx0XHRsZXQgbW9kYWxFbGVtZW50ID0gJCgnI3VwbG9hZE1vZGFsJywgJCh0aGlzKSk7XG5cblx0XHRpZiAobW9kYWxFbGVtZW50KVxuXHRcdHtcblx0XHRcdC8vIEVuYWJsZSBtb2RhbFxuXHRcdFx0dGhpcy5lbmFibGVkID0gdHJ1ZTtcblxuXHRcdFx0Ly8gSGlkZSBzcGlubmVyXG5cdFx0XHQkKCcjdXBsb2FkU3Bpbm5lcicsIG1vZGFsRWxlbWVudCkuaGlkZSgpO1xuXG5cdFx0XHQvLyBIaWRlIG1vZGFsXG5cdFx0XHRtb2RhbEVsZW1lbnQubW9kYWwoJ2hpZGUnKTtcblx0XHR9XG5cdH1cblxuXHQvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5cdC8qXG5cdCAqIFRha2VzIGEgc3RyaW5nIGFuZCByZXR1cm5zIHRoZSBNRDUgYXMgVWludDhBcnJheVxuXHQgKi9cblx0X2JpbmFyeU1ENShzdHIpXG5cdHtcblx0XHRsZXQgTUQ1ID0gbmV3IFNGUzJYLk1ENSgpO1xuXHRcdGxldCBoZXhTdHIgPSBNRDUuaGV4X21kNShzdHIpO1xuXG5cdFx0cmV0dXJuIHRoaXMuX2hleEJ5dGVTdHJpbmdUb0J5dGVBcnJheShoZXhTdHIpO1xuXHR9XG5cblx0Lypcblx0ICogSGV4IGJ5dGVzIC0tLT4gQWN0dWFsIGJ5dGVbXSBhcyBVaW50OEFycmF5XG5cdCAqL1xuXHRfaGV4Qnl0ZVN0cmluZ1RvQnl0ZUFycmF5KGhleEJ5dGVTdHJpbmcpXG5cdHtcblx0ICAgIGxldCBieXRlcyA9IG5ldyBVaW50OEFycmF5KDE2KTsgLy8gTUQ1IGZpeGVkIG91dHB1dCBzaXplXG5cblx0ICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGV4Qnl0ZVN0cmluZy5sZW5ndGg7KVxuXHQgICAge1xuXHQgICAgICAgIGxldCBoZXhCeXRlID0gaGV4Qnl0ZVN0cmluZ1tpKytdICsgaGV4Qnl0ZVN0cmluZ1tpKytdO1xuXHQgICAgICAgIGxldCBieXRlID0gcGFyc2VJbnQoaGV4Qnl0ZSwgMTYpO1xuXG5cdCAgICAgICAgYnl0ZXNbaSAvIDIgLSAxXSA9IGJ5dGU7XG5cdCAgICB9XG5cblx0ICAgIHJldHVybiBieXRlcztcblx0fVxuXG5cdC8qXG5cdCAqIEVuY3J5cHQgdXNpbmcgQUVTLCBtb2RlIENCQywgUEtDUyM3IHBhZGRpbmdcblx0ICpcblx0ICogdGV4dCBcdFx0LT4gdGhlIHRleHQgd2Ugd2FudCB0byBlbmNvZGVcblx0ICoga2V5IFx0XHQtPiB0aGUgQUVTIGtleVxuXHQgKiBpdiAgXHRcdC0+IHRoZSBBRVMvQ0JDIGluaXQgdmVjdG9yXG5cdCAqXG5cdCAqIFJldHVybnMgXHQtPiBVaW50OEFycmF5XG5cdCAqL1xuXHRfYWVzRW5jcnlwdCh0ZXh0LCBrZXksIGl2KVxuXHR7XG5cdFx0bGV0IHRleHRCeXRlcyA9IGFlc2pzLnV0aWxzLnV0ZjgudG9CeXRlcyh0ZXh0KTsgXHRcdC8vIEdldCBVVEYtOCBieXRlc1xuXHRcdGxldCBhZXNDQkMgPSBuZXcgYWVzanMuTW9kZU9mT3BlcmF0aW9uLmNiYyhrZXksIGl2KTtcdC8vIEluaXQgQ0JDIG1vZGVcblx0XHR0ZXh0Qnl0ZXMgPSBhZXNqcy5wYWRkaW5nLnBrY3M3LnBhZCh0ZXh0Qnl0ZXMpOyBcdFx0Ly8gUEtDUyM3IHBhZGRpbmdcblxuXHRcdC8vIEVuY3J5cHRcblx0XHRyZXR1cm4gYWVzQ0JDLmVuY3J5cHQodGV4dEJ5dGVzKTtcblx0fVxuXG5cdC8qXG5cdCAqIEVuY29kZSBwYXNzZWQgYnl0ZSBhcnJheSAtLT4gQmFzZTY0IHJlcHJlc2VudGF0aW9uXG5cdCAqIFJldHVybnMgLS0+IHN0cmluZ1xuXHQgKi9cblx0X2I2NEVuY29kZShiYXJyYXkpXG5cdHtcblx0XHRyZXR1cm4gYnRvYShTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGJhcnJheSkpO1xuXHR9XG59XG5cbi8vIERFRklORSBDT01QT05FTlRcbmlmICghd2luZG93LmN1c3RvbUVsZW1lbnRzLmdldCgnc3NsLWNlcnRpZmljYXRlLW1hbmFnZXInKSlcblx0d2luZG93LmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnc3NsLWNlcnRpZmljYXRlLW1hbmFnZXInLCBTc2xDZXJ0aWZpY2F0ZU1hbmFnZXIpO1xuIiwiaW1wb3J0IHtCYXNlTW9kdWxlfSBmcm9tICcuL2Jhc2UtbW9kdWxlJztcbmltcG9ydCB7Q29uZmlnSW50ZXJmYWNlQnVpbGRlcn0gZnJvbSAnLi4vdXRpbHMvdWlidWlsZGVyL2NvbmZpZy1pbnRlcmZhY2UtYnVpbGRlcic7XG5pbXBvcnQge1NzbENlcnRpZmljYXRlTWFuYWdlcn0gZnJvbSAnLi4vY29tcG9uZW50cy9tb2R1bGUtc3BlY2lmaWMvc3NsLWNlcnRpZmljYXRlLW1hbmFnZXInO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTZXJ2ZXJDb25maWd1cmF0b3IgZXh0ZW5kcyBCYXNlTW9kdWxlXG57XG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHQgICAgc3VwZXIoJ3NlcnZlckNvbmZpZycpO1xuXG5cdFx0Ly8gT3V0Z29pbmcgcmVxdWVzdHNcblx0XHR0aGlzLlJFUV9JTklUID0gJ2luaXQnO1xuXHRcdHRoaXMuUkVRX0dFVF9DT05GSUcgPSAnZ2V0Q29uZmlnJztcblx0XHR0aGlzLlJFUV9VUERBVEVfQ09ORklHID0gJ3VwZENvbmZpZyc7XG5cdFx0dGhpcy5SRVFfVVBEQVRFX0dFT19EQiA9ICd1cGRHZW9EYic7XG5cblx0XHQvLyBJbmNvbWluZyByZXNwb25zZXNcblx0XHR0aGlzLlJFU1BfSU5JVCA9ICdpbml0Jztcblx0XHR0aGlzLlJFU1BfQ09ORklHID0gJ2NvbmZpZyc7XG5cdFx0dGhpcy5SRVNQX0NPTkZJR19VUERBVEVfQ09ORklSTSA9ICdjb25maWdVcGRhdGUnO1xuXHRcdHRoaXMuUkVTUF9DT05GSUdfQ0hBTkdFRF9BTEVSVCA9ICdjb25maWdBbGVydCc7XG5cdFx0dGhpcy5SRVNQX1NTTF9VUExPQURfRVJST1IgPSAnc3NsVXBsb2FkRXJyb3InO1xuXHRcdHRoaXMuUkVTUF9TU0xfVVBMT0FEX0NPTkZJUk0gPSAnc3NsVXBsb2FkJztcblx0XHR0aGlzLlJFU1BfVVBEQVRFX0dFT19EQiA9ICdnZW9EYlVwZGF0ZSc7XG5cdH1cblxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQvLyBDT01NT04gTU9EVUxFIElOVEVSRkFDRSBNRVRIT0RTXG5cdC8vIFRoaXMgbWVtYmVycyBhcmUgdXNlZCBieSB0aGUgbWFpbiBjb250cm9sbGVyXG5cdC8vIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIG1vZHVsZSdzIGNvbnRyb2xsZXIuXG5cdC8vIFRoaXMgbWV0aG9kcyBvdmVycmlkZSB0aG9zZSBpbiBCYXNlTW9kdWxlIGNsYXNzLlxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdGluaXRpYWxpemUoaWREYXRhLCBzaGVsbENvbnRyb2xsZXIpXG5cdHtcblx0XHQvLyBDYWxsIHN1cGVyIG1ldGhvZFxuXHRcdHN1cGVyLmluaXRpYWxpemUoaWREYXRhLCBzaGVsbENvbnRyb2xsZXIpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBwcm9ncmVzcyBiYXJcblx0XHQkKCcjc3JjLXByb2dyZXNzQmFyJykua2VuZG9Qcm9ncmVzc0Jhcih7XG5cdFx0XHRtaW46IDAsXG4gICAgICAgICAgICBtYXg6IDEwMCxcblx0XHRcdHZhbHVlOiBmYWxzZSxcbiAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsXG4gICAgICAgICAgICBhbmltYXRpb246IHtcbiAgICAgICAgICAgICAgICBkdXJhdGlvbjogNDAwXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG5cdFx0Ly8gQ3JlYXRlIGludGVyZmFjZSBidWlsZGVyIGluc3RhbmNlXG5cdFx0dGhpcy5faW50ZXJmYWNlQnVpbGRlciA9IG5ldyBDb25maWdJbnRlcmZhY2VCdWlsZGVyKCk7XG5cblx0XHQvLyBBZGQgbGlzdGVuZXIgdG8gR2VvTGl0ZTIgZGF0YWJhc2UgdXBkYXRlIGJ1dHRvblxuXHRcdCQoJyNzcmMtdXBkYXRlR2VvbG9jRGJCdXR0b24nKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uVXBkYXRlR2VvbG9jRGJDbGljaywgdGhpcykpO1xuXG5cdFx0Ly8gQWRkIGxpc3RlbmVyIHRvIGludGVyZmFjZSBidXR0b25zXG5cdFx0JCgnI3NyYy1yZWxvYWRCdXR0b24nKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uUmVsb2FkQ2xpY2ssIHRoaXMpKTtcblx0XHQkKCcjc3JjLXN1Ym1pdEJ1dHRvbicpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25TdWJtaXRDbGljaywgdGhpcykpO1xuXG5cdFx0Ly8gU2F2ZSByZWYgdG8gU1NMIE1hbmFnZXJcblx0XHR0aGlzLl9zc2xDZXJ0TWFuYWdlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzcmMtc3NsQ2VydE1hbmFnZXInKTtcblxuXHRcdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5cdFx0Ly8gU2VuZCBpbml0aWFsaXphdGlvbiByZXF1ZXN0XG5cdFx0dGhpcy5zZW5kRXh0ZW5zaW9uUmVxdWVzdCh0aGlzLlJFUV9JTklUKTtcblx0fVxuXG5cdGRlc3Ryb3koKVxuXHR7XG5cdFx0Ly8gQ2FsbCBzdXBlciBtZXRob2Rcblx0XHRzdXBlci5kZXN0cm95KCk7XG5cblx0XHQvLyBEZXN0cm95IFNTTCBDZXJ0aWZpY2F0ZSBNYW5hZ2VyXG5cdFx0dGhpcy5fc3NsQ2VydE1hbmFnZXIuZGVzdHJveSgpO1xuXG5cdFx0Ly8gUmVtb3ZlIGludGVyZmFjZSBidXR0b25zIGNsaWNrIGxpc3RlbmVyc1xuXHRcdCQoJyNzcmMtdXBkYXRlR2VvbG9jRGJCdXR0b24nKS5vZmYoJ2NsaWNrJyk7XG5cdFx0JCgnI3NyYy1yZWxvYWRCdXR0b24nKS5vZmYoJ2NsaWNrJyk7XG5cdFx0JCgnI3NyYy1zdWJtaXRCdXR0b24nKS5vZmYoJ2NsaWNrJyk7XG5cblx0XHQvLyBDbGVhciB0YWJzIGNvbnRhaW5lclxuXHRcdHRoaXMuX2NsZWFyVGFicygpO1xuXHR9XG5cblx0b25FeHRlbnNpb25Db21tYW5kKGNvbW1hbmQsIGRhdGEpXG5cdHtcblx0XHQvLyBJbml0aWFsaXphdGlvbiBkYXRhIHJlY2VpdmVkXG5cdFx0aWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX0lOSVQpXG5cdFx0e1xuXHRcdFx0Ly8gUmV0cmlldmUgbW9kdWxlIGlkIHNlbnQgYnkgdGhlIHNlcnZlciAocmVxdWlyZWQgYmVjYXVzZSBtdWx0aXBsZSBtb2R1bGVzIHVzZSBmaWxlIHVwbG9hZGluZyBzZXJ2aWNlKVxuXHRcdFx0Y29uc3QgdXBsb2FkTW9kdWxlSWQgPSBkYXRhLmdldFV0ZlN0cmluZygnbW9kSWQnKTtcblxuXHRcdFx0Ly8gU2V0IFNTTCB1cGxvYWQgbWFuYWdlciB0YXJnZXQgY29uZmlndXJhdGlvblxuXHRcdFx0dGhpcy5fc3NsQ2VydE1hbmFnZXIudXBsb2FkVGFyZ2V0Q29uZmlnID0ge1xuXHRcdFx0XHRzZXNzaW9uVG9rZW46IHRoaXMuc21hcnRGb3guc2Vzc2lvblRva2VuLFxuXHRcdFx0XHRob3N0OiB0aGlzLnNtYXJ0Rm94LmNvbmZpZy5ob3N0LFxuXHRcdFx0XHRwb3J0OiB0aGlzLnNtYXJ0Rm94LmNvbmZpZy5wb3J0LFxuXHRcdFx0XHRtb2R1bGVJZDogdXBsb2FkTW9kdWxlSWQsXG5cdFx0XHRcdHByb3RvY29sOiB0aGlzLnNtYXJ0Rm94LmNvbmZpZy51c2VTU0wgPyAnaHR0cHMnIDogJ2h0dHAnXG5cdFx0XHR9O1xuXG5cdFx0XHQvLyBTZXJ2ZXIgc2VuZHMgYSBmbGFnIGluZGljYXRpbmcgaWYgZmlsZSB1cGxvYWRzIGFyZSBsb2NrZWRcblx0XHRcdC8vIFdlIHVzZSBpdCB0byBlbmFibGUgdGhlIFwiTWFuYWdlIFNTTCBjZXJ0aWZpY2F0ZVwiIGJ1dHRvblxuXHRcdFx0dGhpcy5fc3NsTG9ja2VkID0gZGF0YS5nZXRCb29sKCdsb2NrJyk7XG5cblx0XHRcdGlmICghdGhpcy5fc3NsTG9ja2VkKVxuXHRcdFx0XHQkKCcjc3JjLW1hbmFnZVNzbFdhcm4nKS5oaWRlKCk7XG5cblx0XHRcdC8vIFJlcXVlc3QgY29uZmlndXJhdGlvbiBkYXRhIHRvIHNlcnZlciBpbnN0YW5jZVxuXHRcdFx0dGhpcy5zZW5kRXh0ZW5zaW9uUmVxdWVzdCh0aGlzLlJFUV9HRVRfQ09ORklHKTtcblx0XHR9XG5cblx0XHQvLyBTZXJ2ZXIgY29uZmlndXJhdGlvbiBkYXRhIHJlY2VpdmVkXG5cdFx0ZWxzZSBpZiAoY29tbWFuZCA9PSB0aGlzLlJFU1BfQ09ORklHKVxuXHRcdHtcblx0XHRcdC8vIEJ1aWxkIHVzZXIgaW50ZXJmYWNlIGJhc2VkIG9uIHJlY2VpdmVkIGRhdGFcblx0XHRcdHRoaXMuX2ludGVyZmFjZUJ1aWxkZXIuYnVpbGRJbnRlcmZhY2UoZGF0YS5nZXRTRlNBcnJheSgnc2V0dGluZ3MnKSwgJ3NyYy10YWJOYXZpZ2F0b3InLCBmYWxzZSk7XG5cblx0XHRcdC8vIEVuYWJsZSBidXR0b25zXG5cdFx0XHR0aGlzLl9lbmFibGVCdXR0b25zKHRydWUpO1xuXG5cdFx0XHQvLyBJbml0aWFsaXplIFRhYk5hdmlnYXRvci1yYWxhdGVkIHdpZGdldHNcblx0XHRcdGlmICghdGhpcy5fdGFiTmF2SW5pdGlhbGl6ZWQpXG5cdFx0XHR7XG5cdFx0XHRcdC8vIEVuYWJsZSBzY3JvbGxpbmcgdGFic1xuXHRcdFx0XHQkKCcjc3JjLXRhYk5hdmlnYXRvciA+ICN0YWJzJykuc2Nyb2xsaW5nVGFicyh7XG5cdFx0XHRcdFx0Ym9vdHN0cmFwVmVyc2lvbjogNCxcblx0XHRcdFx0XHRzY3JvbGxUb1RhYkVkZ2U6IHRydWUsXG5cdFx0XHRcdFx0ZW5hYmxlU3dpcGluZzogdHJ1ZSxcblx0XHRcdFx0XHRkaXNhYmxlU2Nyb2xsQXJyb3dzT25GdWxseVNjcm9sbGVkOiB0cnVlLFxuXHRcdFx0XHRcdGNzc0NsYXNzTGVmdEFycm93OiAnZmEgZmEtY2hldnJvbi1sZWZ0Jyxcblx0XHRcdFx0XHRjc3NDbGFzc1JpZ2h0QXJyb3c6ICdmYSBmYS1jaGV2cm9uLXJpZ2h0J1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHR0aGlzLl90YWJOYXZJbml0aWFsaXplZCA9IHRydWU7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJ1biB2YWxpZGF0aW9uICh0byByZW1vdmUgdmFsaWRhdGlvbiBtZXNzYWdlcyBpZiBkYXRhIHdhcyByZWxvYWRlZClcblx0XHRcdHRoaXMuX2ludGVyZmFjZUJ1aWxkZXIuY2hlY2tJc1ZhbGlkKCk7XG5cblx0XHRcdHRoaXMuX3N3aXRjaFZpZXcoJ3NyYy1tYWluJyk7XG5cdFx0fVxuXG5cdFx0Ly8gU2VydmVyIGNvbmZpZ3VyYXRpb24gdXBkYXRlIGNvbmZpcm1hdGlvblxuXHRcdGVsc2UgaWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX0NPTkZJR19VUERBVEVfQ09ORklSTSlcblx0XHR7XG5cdFx0XHQvLyBFbmFibGUgYnV0dG9uc1xuXHRcdFx0dGhpcy5fZW5hYmxlQnV0dG9ucyh0cnVlKTtcblxuXHRcdFx0Ly8gRW5hYmxlIGZvcm0gaXRlbXNcblx0XHRcdHRoaXMuX2ludGVyZmFjZUJ1aWxkZXIuZGlzYWJsZUludGVyZmFjZShmYWxzZSk7XG5cblx0XHRcdC8vIElmIHRoZSBjdXJyZW50IHVzZXIgaXMgdGhlIHVwZGF0ZXIsIHNob3cgYSBub3RpZmljYXRpb25cblx0XHRcdC8vIE90aGVyd2lzZSwgc2hvdyBhIGRpYWxvZyBib3ggc3VnZ2VzdGluZyB0byByZWxvYWRcblx0XHRcdGxldCB1cGRhdGVyID0gZGF0YS5nZXRVdGZTdHJpbmcoJ3VzZXInKTtcblxuXHRcdFx0aWYgKHVwZGF0ZXIgPT0gdGhpcy5zbWFydEZveC5teVNlbGYubmFtZSlcblx0XHRcdHtcblx0XHRcdFx0Ly8gUmVzZXQgdGhlICdtb2RpZmllZCcgZmxhZ1xuXHRcdFx0XHR0aGlzLl9pbnRlcmZhY2VCdWlsZGVyLnJlc2V0SXNNb2RpZmllZCgpO1xuXG5cdFx0XHRcdC8vIERpc3BsYXkgbm90aWZpY2F0aW9uXG5cdFx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dOb3RpZmljYXRpb24oJ1NlcnZlciBzZXR0aW5ncyB1cGRhdGVkJywgJ0NoYW5nZXMgd2lsbCBiZSBhcHBsaWVkIG9uIG5leHQgc2VydmVyIHJlc3RhcnQnKTtcblx0XHRcdH1cblx0XHRcdGVsc2Vcblx0XHRcdHtcblx0XHRcdFx0Ly8gU2hvdyBhbGVydFxuXHRcdFx0XHR0aGlzLnNoZWxsQ3RybC5zaG93U2ltcGxlQWxlcnQoYEFkbWluaXN0cmF0b3IgJHt1cGRhdGVyfSBoYXMgbW9kaWZpZWQgdGhlIHNlcnZlciBzZXR0aW5nczsgcGxlYXNlIHJlbG9hZCB0byB1cGRhdGUgeW91ciB2aWV3LmApO1xuXG5cdFx0XHRcdC8vIERpc2FibGUgc3VibWl0IGJ1dHRvblxuXHRcdFx0XHQkKCcjc3JjLXN1Ym1pdEJ1dHRvbicpLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gU2VydmVyIGNvbmZpZ3VyYXRpb24geG1sIHNhdmVkIGJ5IGFuIGV4dGVybmFsIHByb2Nlc3Ncblx0XHRlbHNlIGlmIChjb21tYW5kID09IHRoaXMuUkVTUF9DT05GSUdfQ0hBTkdFRF9BTEVSVClcblx0XHR7XG5cdFx0XHQvLyBTaG93IGFsZXJ0XG5cdFx0XHR0aGlzLnNoZWxsQ3RybC5zaG93U2ltcGxlQWxlcnQoYFRoZSBzeXN0ZW0gaGFzIG1vZGlmaWVkIHRoZSBzZXJ2ZXIgc2V0dGluZ3MgYXV0b21hdGljYWxseTsgcGxlYXNlIHJlbG9hZCB0byB1cGRhdGUgeW91ciB2aWV3LmApO1xuXG5cdFx0XHQvLyBEaXNhYmxlIHN1Ym1pdCBidXR0b25cblx0XHRcdCQoJyNzcmMtc3VibWl0QnV0dG9uJykuYXR0cignZGlzYWJsZWQnLCB0cnVlKTtcblx0XHR9XG5cblx0XHQvLyBTU0wgY2VydGlmaWNhdGUgdXBsb2FkIGVycm9yXG5cdFx0ZWxzZSBpZiAoY29tbWFuZCA9PSB0aGlzLlJFU1BfU1NMX1VQTE9BRF9FUlJPUilcblx0XHR7XG5cdFx0XHRjb25zdCBlcnJvciA9IGRhdGEuZ2V0VXRmU3RyaW5nKCdlcnJvcicpO1xuXG5cdFx0XHQvLyBMb2cgd2FybmluZ1xuXHRcdFx0dGhpcy5zaGVsbEN0cmwubG9nTWVzc2FnZShlcnJvciwgJ2Vycm9yJyk7XG5cblx0XHRcdC8vIFNob3cgZXJyb3IgaW4gbWFuYWdlciB3aW5kb3dcblx0XHRcdHRoaXMuX3NzbENlcnRNYW5hZ2VyLm9uU3NsQ2VydFVwbG9hZEVycm9yKGVycm9yKTtcblx0XHR9XG5cblx0XHQvLyBTU0wgY2VydGlmaWNhdGUgdXBsb2FkIGNvbmZpcm1lZFxuXHRcdGVsc2UgaWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX1NTTF9VUExPQURfQ09ORklSTSlcblx0XHR7XG5cdFx0XHQvLyBDbG9zdyBtYW5hZ2VyIHdpbmRvd1xuXHRcdFx0dGhpcy5fc3NsQ2VydE1hbmFnZXIub25Tc2xDZXJ0VXBsb2FkU3VjY2VzcygpO1xuXG5cdFx0XHRsZXQgdXBkYXRlciA9IGRhdGEuZ2V0VXRmU3RyaW5nKCd1c2VyJyk7XG5cblx0XHRcdC8vIERpc3BsYXkgbm90aWZpY2F0aW9uXG5cdFx0XHRpZiAodXBkYXRlciA9PSB0aGlzLnNtYXJ0Rm94Lm15U2VsZi5uYW1lKVxuXHRcdFx0XHR0aGlzLnNoZWxsQ3RybC5zaG93Tm90aWZpY2F0aW9uKCdTU0wgY2VydGlmaWNhdGUnLCAnU1NMIGNlcnRpZmljYXRlIGtleXN0b3JlIHdhcyB1cGxvYWRlZCBzdWNjZXNzZnVsbHknKTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0dGhpcy5zaGVsbEN0cmwuc2hvd05vdGlmaWNhdGlvbignU1NMIGNlcnRpZmljYXRlJywgYEFkbWluaXN0cmF0b3IgJHt1cGRhdGVyfSBoYXMgdXBsb2FkZWQgYSBuZXcgU1NMIGNlcnRpZmljYXRlIGtleXN0b3JlYCk7XG5cblx0XHRcdC8vIFdoZW4gYSBjZXJ0aWZpY2F0ZSBpcyB1cGxvYWRlZCwgSFRUUFMgaXMgYWxzbyBlbmFibGVkIGF1dG9tYXRpY2FsbHk6XG5cdFx0XHQvLyB3ZSBoYXZlIHRvIHVwZGF0ZSB0aGUgaW50ZXJmYWNlIGFjY29yZGluZ2x5XG5cdFx0XHR0aGlzLl91cGRhdGVDb25maWdGb3JtSXRlbURpc3BsYXllZFZhbHVlKCd3ZWJTZXJ2ZXIuZW5hYmxlSHR0cHMnLCB0cnVlKTtcblx0XHR9XG5cblx0XHQvLyBHZW9sb2NhdGlvbiBkYXRhYmFzZSB1cGRhdGUgY29uZmlybWF0aW9uXG5cdFx0ZWxzZSBpZiAoY29tbWFuZCA9PSB0aGlzLlJFU1BfVVBEQVRFX0dFT19EQilcblx0XHR7XG5cdFx0XHQvLyBFbmFibGUgYnV0dG9uXG5cdFx0XHQkKCcjc3JjLXVwZGF0ZUdlb2xvY0RiQnV0dG9uJykuYXR0cignZGlzYWJsZWQnLCBmYWxzZSk7XG5cblx0XHRcdC8vIENoZWNrIHN1Y2Nlc3Ncblx0XHRcdGlmIChkYXRhLmdldEJvb2woJ3N1Y2Nlc3MnKSlcblx0XHRcdHtcblx0XHRcdFx0Ly8gVXBkYXRlIGRpc3BsYXllZCBkYXRlXG5cdFx0XHRcdHRoaXMuX3VwZGF0ZUNvbmZpZ0Zvcm1JdGVtRGlzcGxheWVkVmFsdWUoJ2FkbWluSGVscGVyLmdlb0RiUmVsZWFzZURhdGUnLCBkYXRhLmdldFV0ZlN0cmluZygnbmV3UmVsRGF0ZScpKTtcblxuXHRcdFx0XHQvLyBJZiB0aGUgY3VycmVudCB1c2VyIGlzIHRoZSB1cGRhdGVyLCBhbHNvIHNob3cgYSBub3RpZmljYXRpb25cblx0XHRcdFx0bGV0IHVwZGF0ZXIgPSBkYXRhLmdldFV0ZlN0cmluZygndXNlcicpO1xuXG5cdFx0XHRcdGlmICh1cGRhdGVyID09IHRoaXMuc21hcnRGb3gubXlTZWxmLm5hbWUpXG5cdFx0XHRcdFx0dGhpcy5zaGVsbEN0cmwuc2hvd05vdGlmaWNhdGlvbignR2VvbG9jYXRpb24gZGF0YWJhc2UgdXBkYXRlZCcsICdMYXRlc3QgcmVsZWFzZSBvZiB0aGUgR2VvTGl0ZTIgQ291bnRyeSBkYXRhYmFzZSBoYXMgYmVlbiBpbnN0YWxsZWQgc3VjY2Vzc2Z1bGx5Jyk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlXG5cdFx0XHR7XG5cdFx0XHRcdC8vIFNob3cgYWxlcnRcblx0XHRcdFx0dGhpcy5zaGVsbEN0cmwuc2hvd1NpbXBsZUFsZXJ0KGRhdGEuZ2V0VXRmU3RyaW5nKCdlcnJvcicpKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQvLyBQUklWQVRFIE1FVEhPRFNcblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRfZW5hYmxlQnV0dG9ucyhlbmFibGVkKVxuXHR7XG5cdFx0JCgnI3NyYy1yZWxvYWRCdXR0b24nKS5hdHRyKCdkaXNhYmxlZCcsICFlbmFibGVkKTtcblx0XHQkKCcjc3JjLXN1Ym1pdEJ1dHRvbicpLmF0dHIoJ2Rpc2FibGVkJywgIWVuYWJsZWQpO1xuXHRcdCQoJyNzcmMtYmFja3VwQ2hlY2snKS5hdHRyKCdkaXNhYmxlZCcsICFlbmFibGVkKTtcblxuXHRcdCQoJyNzcmMtdXBkYXRlR2VvbG9jRGJCdXR0b24nKS5hdHRyKCdkaXNhYmxlZCcsICFlbmFibGVkKTtcblxuXHRcdGlmICghdGhpcy5fc3NsTG9ja2VkKVxuXHRcdFx0dGhpcy5fc3NsQ2VydE1hbmFnZXIuZW5hYmxlZCA9IGVuYWJsZWQ7XG5cdH1cblxuXHRfc3dpdGNoVmlldyh2aWV3SWQpXG5cdHtcblx0XHRkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3JjLXZpZXdzdGFjaycpLnNlbGVjdGVkRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHZpZXdJZCk7XG5cdH1cblxuXHRfY2xlYXJUYWJzKClcblx0e1xuXHRcdC8vIERlc3Ryb3kgc2Nyb2xsaW5nIHRhYnNcblx0XHQkKCcjc3JjLXRhYk5hdmlnYXRvciAjdGFicycpLnNjcm9sbGluZ1RhYnMoJ2Rlc3Ryb3knKTtcblxuXHRcdC8vIFJlbW92ZSBhbGwgdGFiIG5hdmlnYXRvciBjb250ZW50XG5cdFx0dGhpcy5faW50ZXJmYWNlQnVpbGRlci5kZXN0cm95SW50ZXJmYWNlKCk7XG5cdH1cblxuXHRfb25VcGRhdGVHZW9sb2NEYkNsaWNrKClcblx0e1xuXHRcdC8vIERpc2FibGUgYnV0dG9uXG5cdFx0JCgnI3NyYy11cGRhdGVHZW9sb2NEYkJ1dHRvbicpLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSk7XG5cblx0XHQvLyBTZW5kIHJlcXVlc3QgdG8gc2VydmVyXG5cdFx0dGhpcy5zZW5kRXh0ZW5zaW9uUmVxdWVzdCh0aGlzLlJFUV9VUERBVEVfR0VPX0RCKTtcblx0fVxuXG5cdF9vblJlbG9hZENsaWNrKClcblx0e1xuXHRcdC8vIERpc2FibGUgYnV0dG9uc1xuXHRcdHRoaXMuX2VuYWJsZUJ1dHRvbnMoZmFsc2UpO1xuXG5cdFx0Ly8gU3dpdGNoIHRvIGxvYWRpbmcgdmlld1xuXHRcdHRoaXMuX3N3aXRjaFZpZXcoJ3NyYy1sb2FkaW5nJyk7XG5cblx0XHQvLyBIaWRlIHZhbGlkYXRpb24gbWVzc2FnZXNcblx0XHR0aGlzLl9pbnRlcmZhY2VCdWlsZGVyLnJlc2V0VmFsaWRhdGlvbigpO1xuXG5cdFx0Ly8gUmVxdWVzdCBjb25maWd1cmF0aW9uIGRhdGEgdG8gc2VydmVyIGluc3RhbmNlXG5cdFx0dGhpcy5zZW5kRXh0ZW5zaW9uUmVxdWVzdCh0aGlzLlJFUV9HRVRfQ09ORklHKTtcblx0fVxuXG5cdF9vblN1Ym1pdENsaWNrKClcblx0e1xuXHRcdC8vIENoZWNrIHZhbGlkaXR5XG5cdFx0aWYgKHRoaXMuX2ludGVyZmFjZUJ1aWxkZXIuY2hlY2tJc1ZhbGlkKCkpXG5cdFx0e1xuXHRcdFx0bGV0IGNoYW5nZXMgPSB0aGlzLl9pbnRlcmZhY2VCdWlsZGVyLmdldENoYW5nZWREYXRhKCk7XG5cblx0XHRcdGlmIChjaGFuZ2VzLnNpemUoKSA+IDApXG5cdFx0XHR7XG5cdFx0XHRcdC8vIERpc2FibGUgYnV0dG9uc1xuXHRcdFx0XHR0aGlzLl9lbmFibGVCdXR0b25zKGZhbHNlKTtcblxuXHRcdFx0XHQvLyBEaXNhYmxlIGZvcm0gaXRlbXNcblx0XHRcdFx0dGhpcy5faW50ZXJmYWNlQnVpbGRlci5kaXNhYmxlSW50ZXJmYWNlKHRydWUpO1xuXG5cdFx0XHRcdC8vIFNlbmQgdXBkYXRlZCBzZXR0aW5ncyB0byBzZXJ2ZXIgaW5zdGFuY2Vcblx0XHRcdFx0bGV0IHBhcmFtcyA9IG5ldyBTRlMyWC5TRlNPYmplY3QoKTtcblx0XHRcdFx0cGFyYW1zLnB1dFNGU0FycmF5KCdzZXR0aW5ncycsIGNoYW5nZXMpO1xuXHRcdFx0XHRwYXJhbXMucHV0Qm9vbCgnYmFja3VwJywgJCgnI3NyYy1iYWNrdXBDaGVjaycpLnByb3AoJ2NoZWNrZWQnKSk7XG5cblx0XHRcdFx0dGhpcy5zZW5kRXh0ZW5zaW9uUmVxdWVzdCh0aGlzLlJFUV9VUERBVEVfQ09ORklHLCBwYXJhbXMpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRlbHNlXG5cdFx0XHR0aGlzLnNoZWxsQ3RybC5zaG93U2ltcGxlQWxlcnQoJ1VuYWJsZSB0byBzdWJtaXQgY29uZmlndXJhdGlvbiBjaGFuZ2VzIGR1ZSB0byBhbiBpbnZhbGlkIHZhbHVlOyBwbGVhc2UgdmVyaWZ5IHRoZSBoaWdobGlnaHRlZCBmb3JtIGZpZWxkcyBpbiBhbGwgdGFicy4nLCB0cnVlKTtcblx0fVxuXG5cdF91cGRhdGVDb25maWdGb3JtSXRlbURpc3BsYXllZFZhbHVlKGNvbmZpZ1BhcmFtTmFtZSwgbmV3VmFsdWUpXG5cdHtcblx0XHQvLyBHZXQgdGhlIHJlbGV2YW50IENvbmZpZ3VyYXRpb24gRm9ybSBJdGVtXG5cdFx0Y29uc3QgY29uZmlnRm9ybUl0ZW0gPSB0aGlzLl9pbnRlcmZhY2VCdWlsZGVyLmdldENvbmZpZ0Zvcm1JdGVtKGNvbmZpZ1BhcmFtTmFtZSk7XG5cblx0XHQvLyBVcGRhdGUgQ29uZmlndXJhdGlvbiBQYXJhbWV0ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBDb25maWd1cmF0aW9uIEZvcm0gSXRlbVxuXHRcdGNvbmZpZ0Zvcm1JdGVtLmRhdGEudmFsdWUgPSBuZXdWYWx1ZTtcblx0XHRjb25maWdGb3JtSXRlbS5kYXRhLnJlc2V0SXNNb2RpZmllZCgpOyAvLyBUaGlzIGlzIG5lZWRlZCB0byBhdm9pZCB0aGUgQ29uZmlndXJhdGlvbiBQYXJhbWV0ZXIgdG8gZmxhZ2dlZCBhcyAnY2hhbmdlZCdcblxuXHRcdC8vIERpc3BsYXkgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgQ29uZmlndXJhdGlvbiBGb3JtIEl0ZW1cblx0XHRjb25maWdGb3JtSXRlbS5fc2V0V2lkZ2V0VmFsdWUoKTsgLy8gRGlzcGxheSB0aGUgbmV3IHZhbHVlIGluIHRoZSBjb25maWcgZm9ybSBpdGVtXG5cdH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7OztBQ25kQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QSIsInNvdXJjZVJvb3QiOiIifQ==
@@ -0,0 +1,5 @@
1
+ <template-module class="module" id="template-module">
2
+ <div>
3
+ This is a template module
4
+ </div>
5
+ </template-module>
@@ -42,7 +42,17 @@
42
42
  <div id="znc-main" class="px-3 pt-3">
43
43
  <div id="znc-tabNavigator">
44
44
  <ul class="nav nav-tabs" id="tabs" role="tablist"></ul>
45
- <div class="tab-content" id="tabPanels"></div>
45
+ <div class="tab-content" id="tabPanels">
46
+ <div class="tab-pane" id="tabpane-wordsFilter" role="tabpanel" aria-labelledby="tab-wordsFilter">
47
+ <!-- A form is created here automatically, containing the words filter settings -->
48
+ <hr/>
49
+ <div class="custom-tab-content">
50
+ <!-- Custom tab content used in Zone configuration only (when displaying Room configuration this tab pane never shows up) -->
51
+ <label class="config-form-separator-label mb-3 font-weight-bold">Words Files Editor</label>
52
+ <words-files-manager id="znc-wordsFilesManager" class="form-group row"></words-files-manager>
53
+ </div>
54
+ </div>
55
+ </div>
46
56
  </div>
47
57
 
48
58
  <div id="znc-buttons" class="sticky-bottom-controls py-3 bg-color-default">
@@ -238,6 +238,14 @@
238
238
  <div class="text-muted">Service provided by <a href="https://www.geoplugin.com" target="_blank">geoPlugin</a>; includes GeoLite data created by <a href="https://www.maxmind.com" target="_blank">MaxMind</a>.</div>
239
239
  </div>
240
240
  <hr/>
241
+ <div class="custom-tab-content">
242
+ <label class="config-form-separator-label mb-3 font-weight-bold">Disconnect User</label>
243
+ <div>Force immediate user disconnection.</div>
244
+ <div class="row no-gutters my-2">
245
+ <button id="znm-disconnectBt" type="button" class="k-button k-primary my-1"><i class="fas fa-plug mr-1"></i>Disconnect</button>
246
+ </div>
247
+ </div>
248
+ <hr/>
241
249
  <div class="custom-tab-content">
242
250
  <label class="config-form-separator-label mb-3 font-weight-bold">Kick User</label>
243
251
  <div>Force user disconnection by kicking him/her; a message can be sent to the user to describe the reason of the action.</div>
@@ -0,0 +1,147 @@
1
+ <zone>
2
+ <name>BasicExamples</name>
3
+ <isCustomLogin>false</isCustomLogin>
4
+ <isForceLogout>false</isForceLogout>
5
+ <applyWordsFilterToUserName>true</applyWordsFilterToUserName>
6
+ <applyWordsFilterToRoomName>true</applyWordsFilterToRoomName>
7
+ <applyWordsFilterToPrivateMessages>true</applyWordsFilterToPrivateMessages>
8
+ <isFilterBuddyMessages>true</isFilterBuddyMessages>
9
+ <isEncrypted>false</isEncrypted>
10
+ <maxUsers>1000</maxUsers>
11
+ <maxUserVariablesAllowed>10</maxUserVariablesAllowed>
12
+ <maxRoomVariablesAllowed>10</maxRoomVariablesAllowed>
13
+ <minRoomNameChars>1</minRoomNameChars>
14
+ <maxRoomNameChars>20</maxRoomNameChars>
15
+ <maxRooms>500</maxRooms>
16
+ <maxRoomsCreatedPerUser>10</maxRoomsCreatedPerUser>
17
+ <userCountChangeUpdateInterval>1000</userCountChangeUpdateInterval>
18
+ <userReconnectionSeconds>0</userReconnectionSeconds>
19
+ <overrideMaxUserIdleTime>300</overrideMaxUserIdleTime>
20
+ <maxFailedLogins>2</maxFailedLogins>
21
+ <allowGuestUsers>true</allowGuestUsers>
22
+ <guestUserNamePrefix>Guest#</guestUserNamePrefix>
23
+ <publicRoomGroups>default,games,chats</publicRoomGroups>
24
+ <defaultRoomGroups>default,games,chats</defaultRoomGroups>
25
+ <defaultPlayerIdGeneratorClass></defaultPlayerIdGeneratorClass>
26
+ <allowInvitationsOnlyForBuddies>true</allowInvitationsOnlyForBuddies>
27
+ <maxUsersPerJoinInvitationRequest>5</maxUsersPerJoinInvitationRequest>
28
+ <geoLocationEnabled>true</geoLocationEnabled>
29
+ <wordsFilter active="false">
30
+ <useWarnings>false</useWarnings>
31
+ <warningsBeforeKick>3</warningsBeforeKick>
32
+ <kicksBeforeBan>2</kicksBeforeBan>
33
+ <banDuration>1440</banDuration>
34
+ <maxBadWordsPerMessage>0</maxBadWordsPerMessage>
35
+ <kicksBeforeBanMinutes>3</kicksBeforeBanMinutes>
36
+ <secondsBeforeBanOrKick>5</secondsBeforeBanOrKick>
37
+ <warningMessage>Stop swearing or you will be banned</warningMessage>
38
+ <kickMessage>Swearing not allowed: you are being kicked</kickMessage>
39
+ <banMessage>Too much swearing: you are banned</banMessage>
40
+ <wordsFile>config/wordsFile.txt</wordsFile>
41
+ <filterMode>BLACKLIST</filterMode>
42
+ <banMode>NAME</banMode>
43
+ <hideBadWordWithCharacter>*</hideBadWordWithCharacter>
44
+ </wordsFilter>
45
+ <floodFilter active="false">
46
+ <banDurationMinutes>1440</banDurationMinutes>
47
+ <maxFloodingAttempts>5</maxFloodingAttempts>
48
+ <secondsBeforeBan>5</secondsBeforeBan>
49
+ <banMode>NAME</banMode>
50
+ <logFloodingAttempts>true</logFloodingAttempts>
51
+ <banMessage>Too much flooding, you are banned</banMessage>
52
+ </floodFilter>
53
+ <rooms>
54
+ <room>
55
+ <name>The Lobby</name>
56
+ <groupId>default</groupId>
57
+ <password></password>
58
+ <maxUsers>150</maxUsers>
59
+ <maxSpectators>0</maxSpectators>
60
+ <isDynamic>false</isDynamic>
61
+ <isGame>false</isGame>
62
+ <isHidden>false</isHidden>
63
+ <autoRemoveMode>DEFAULT</autoRemoveMode>
64
+ <permissions>
65
+ <flags>PUBLIC_MESSAGES</flags>
66
+ <maxRoomVariablesAllowed>10</maxRoomVariablesAllowed>
67
+ </permissions>
68
+ <events>USER_ENTER_EVENT,USER_EXIT_EVENT,USER_COUNT_CHANGE_EVENT,USER_VARIABLES_UPDATE_EVENT</events>
69
+ <badWordsFilter isActive="false"/>
70
+ <roomVariables/>
71
+ <extension>
72
+ <name></name>
73
+ <type>JAVA</type>
74
+ <file></file>
75
+ <propertiesFile></propertiesFile>
76
+ <reloadMode>AUTO</reloadMode>
77
+ </extension>
78
+ </room>
79
+ </rooms>
80
+ <disabledSystemEvents/>
81
+ <privilegeManager active="false">
82
+ <profiles>
83
+ <profile id="0">
84
+ <name>Guest</name>
85
+ <deniedRequests/>
86
+ <permissionFlags>
87
+ <string>ExtensionCalls</string>
88
+ </permissionFlags>
89
+ </profile>
90
+ <profile id="1">
91
+ <name>Standard</name>
92
+ <deniedRequests/>
93
+ <permissionFlags>
94
+ <string>ExtensionCalls</string>
95
+ </permissionFlags>
96
+ </profile>
97
+ <profile id="2">
98
+ <name>Moderator</name>
99
+ <deniedRequests/>
100
+ <permissionFlags>
101
+ <string>ExtensionCalls</string>
102
+ <string>SuperUser</string>
103
+ </permissionFlags>
104
+ </profile>
105
+ <profile id="3">
106
+ <name>Administrator</name>
107
+ <deniedRequests/>
108
+ <permissionFlags>
109
+ <string>ExtensionCalls</string>
110
+ <string>SuperUser</string>
111
+ </permissionFlags>
112
+ </profile>
113
+ </profiles>
114
+ </privilegeManager>
115
+ <extension>
116
+ <name></name>
117
+ <type>JAVA</type>
118
+ <file></file>
119
+ <propertiesFile></propertiesFile>
120
+ <reloadMode>AUTO</reloadMode>
121
+ </extension>
122
+ <buddyList active="true">
123
+ <allowOfflineBuddyVariables>true</allowOfflineBuddyVariables>
124
+ <maxItemsPerList>100</maxItemsPerList>
125
+ <maxBuddyVariables>15</maxBuddyVariables>
126
+ <offlineBuddyVariablesCacheSize>500</offlineBuddyVariablesCacheSize>
127
+ <customStorageClass></customStorageClass>
128
+ <useTempBuddies>true</useTempBuddies>
129
+ <buddyStates>
130
+ <string>Available</string>
131
+ <string>Away</string>
132
+ <string>Occupied</string>
133
+ </buddyStates>
134
+ <badWordsFilter isActive="true"/>
135
+ </buddyList>
136
+ <databaseManager active="false">
137
+ <driverName></driverName>
138
+ <connectionString></connectionString>
139
+ <userName></userName>
140
+ <password></password>
141
+ <testSql></testSql>
142
+ <maxActiveConnections>10</maxActiveConnections>
143
+ <maxIdleConnections>10</maxIdleConnections>
144
+ <exhaustedPoolAction>FAIL</exhaustedPoolAction>
145
+ <blockTime>3000</blockTime>
146
+ </databaseManager>
147
+ </zone>
@@ -1,5 +1,5 @@
1
1
  module Rubyfox
2
2
  module Server
3
- VERSION = "2.16.0.0"
3
+ VERSION = "2.16.3.1"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubyfox-server
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.16.0.0
4
+ version: 2.16.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Leitzen
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2020-07-16 00:00:00.000000000 Z
12
+ date: 2020-12-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: thor
@@ -904,10 +904,11 @@ files:
904
904
  - lib/rubyfox/server/data/lib/apache-tomcat/lib/annotations-api.jar
905
905
  - lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina-ant.jar
906
906
  - lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina-ha.jar
907
+ - lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina-ssi.jar
907
908
  - lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina-storeconfig.jar
908
909
  - lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina-tribes.jar
909
910
  - lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina.jar
910
- - lib/rubyfox/server/data/lib/apache-tomcat/lib/ecj-4.12.jar
911
+ - lib/rubyfox/server/data/lib/apache-tomcat/lib/ecj-4.17.jar
911
912
  - lib/rubyfox/server/data/lib/apache-tomcat/lib/el-api.jar
912
913
  - lib/rubyfox/server/data/lib/apache-tomcat/lib/jasper-el.jar
913
914
  - lib/rubyfox/server/data/lib/apache-tomcat/lib/jasper.jar
@@ -1120,6 +1121,7 @@ files:
1120
1121
  - lib/rubyfox/server/data/www/ROOT/admin/modules/log-viewer.html
1121
1122
  - lib/rubyfox/server/data/www/ROOT/admin/modules/server-configurator.html
1122
1123
  - lib/rubyfox/server/data/www/ROOT/admin/modules/servlet-manager.html
1124
+ - lib/rubyfox/server/data/www/ROOT/admin/modules/template.html
1123
1125
  - lib/rubyfox/server/data/www/ROOT/admin/modules/zone-configurator.html
1124
1126
  - lib/rubyfox/server/data/www/ROOT/admin/modules/zone-monitor.html
1125
1127
  - lib/rubyfox/server/data/www/ROOT/crossdomain.xml
@@ -1153,6 +1155,7 @@ files:
1153
1155
  - lib/rubyfox/server/data/www/manager/status.xsd
1154
1156
  - lib/rubyfox/server/data/www/manager/xform.xsl
1155
1157
  - lib/rubyfox/server/data/zones/.keep
1158
+ - lib/rubyfox/server/data/zones/BasicExamples.zone.xml
1156
1159
  - lib/rubyfox/server/environment.rb
1157
1160
  - lib/rubyfox/server/third-party-licenses/Antlr-license.txt
1158
1161
  - lib/rubyfox/server/third-party-licenses/StringTemplate-license.txt
@@ -1179,7 +1182,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
1179
1182
  - !ruby/object:Gem::Version
1180
1183
  version: '0'
1181
1184
  requirements: []
1182
- rubygems_version: 3.0.6
1185
+ rubygems_version: 3.1.4
1183
1186
  signing_key:
1184
1187
  specification_version: 4
1185
1188
  summary: ''