{"remainingRequest":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\thread-loader\\dist\\cjs.js!D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\babel-loader\\lib\\index.js!D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\cache-loader\\dist\\cjs.js??ref--0-0!D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\vue-loader\\lib\\index.js??vue-loader-options!D:\\jenkins\\workspace\\dataShare-fvue\\src\\components\\dataTemplate\\TemplateDynamicView.vue?vue&type=script&lang=js","dependencies":[{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\src\\components\\dataTemplate\\TemplateDynamicView.vue","mtime":1733309211704},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\babel.config.js","mtime":1733906004399},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\thread-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\babel-loader\\lib\\index.js","mtime":456789000000},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\vue-loader\\lib\\index.js","mtime":499162500000}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:aW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tICJEOi9qZW5raW5zL3dvcmtzcGFjZS9kYXRhU2hhcmUtZnZ1ZS9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXkuanMiOwppbXBvcnQgX3JlZ2VuZXJhdG9yUnVudGltZSBmcm9tICJEOi9qZW5raW5zL3dvcmtzcGFjZS9kYXRhU2hhcmUtZnZ1ZS9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vcmVnZW5lcmF0b3JSdW50aW1lLmpzIjsKaW1wb3J0IF9hc3luY1RvR2VuZXJhdG9yIGZyb20gIkQ6L2plbmtpbnMvd29ya3NwYWNlL2RhdGFTaGFyZS1mdnVlL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hc3luY1RvR2VuZXJhdG9yLmpzIjsKaW1wb3J0IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIGZyb20gIkQ6L2plbmtpbnMvd29ya3NwYWNlL2RhdGFTaGFyZS1mdnVlL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyLmpzIjsKaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSAiRDovamVua2lucy93b3Jrc3BhY2UvZGF0YVNoYXJlLWZ2dWUvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDIuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5jb25jYXQuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5maWx0ZXIuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5pbmNsdWRlcy5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmpvaW4uanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5tYXAuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5wdXNoLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkucmVkdWNlLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuc29ydC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmZ1bmN0aW9uLm5hbWUuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5qc29uLnN0cmluZ2lmeS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci5jb25zdHJ1Y3Rvci5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci50by1maXhlZC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5rZXlzLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZy5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC5leGVjLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmluY2x1ZGVzLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLml0ZXJhdG9yLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnJlcGxhY2UuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuc2VhcmNoLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLmNvbnN0cnVjdG9yLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLmZpbHRlci5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci5mb3ItZWFjaC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci5tYXAuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3IucmVkdWNlLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5mb3ItZWFjaC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuaXRlcmF0b3IuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy93ZWIuc2VsZi5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL3dlYi51cmwuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy93ZWIudXJsLnRvLWpzb24uanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy93ZWIudXJsLXNlYXJjaC1wYXJhbXMuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy93ZWIudXJsLXNlYXJjaC1wYXJhbXMuZGVsZXRlLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvd2ViLnVybC1zZWFyY2gtcGFyYW1zLmhhcy5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL3dlYi51cmwtc2VhcmNoLXBhcmFtcy5zaXplLmpzIjsKLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KCmltcG9ydCB7IExvYWRpbmcgfSBmcm9tICdlbGVtZW50LXVpJzsKaW1wb3J0IEh0Q2hlY2tib3ggZnJvbSAnQC9jb21wb25lbnRzL2NvbnRyb2wvSHRDaGVja2JveC52dWUnOwppbXBvcnQgSHREaWFsb2cgZnJvbSAnQC9jb21wb25lbnRzL2NvbnRyb2wvSHREaWFsb2cudnVlJzsKaW1wb3J0IEh0RGlhbG9nQnRuIGZyb20gJ0AvY29tcG9uZW50cy9jb250cm9sL2h0RGlhbG9nQnRuLnZ1ZSc7CmltcG9ydCBFaXBTZWxlY3QgZnJvbSAnQC9jb21wb25lbnRzL2VpcENvbnRyb2wvRWlwU2VsZWN0LnZ1ZSc7CmltcG9ydCBWUnVudGltZVRlbXBsYXRlIGZyb20gJ3YtcnVudGltZS10ZW1wbGF0ZSc7CmltcG9ydCB1dGlscyBmcm9tICdAL3V0aWxzLmpzJzsKaW1wb3J0IHsgQmFzZTY0IH0gZnJvbSAnanMtYmFzZTY0JzsKaW1wb3J0IFZ1ZSBmcm9tICd2dWUnOwppbXBvcnQgUVJDb2RlIGZyb20gJ3FyY29kZSc7CmltcG9ydCByZXEgZnJvbSAnQC9yZXF1ZXN0LmpzJzsKaW1wb3J0IGZvcm0gZnJvbSAnQC9hcGkvZm9ybS5qcyc7CmltcG9ydCBkaWFsb2cgZnJvbSAnQC9hcGkvZGlhbG9nQXBpLmpzJzsKdmFyIFRlbXBsYXRlQmF0Y2hVcGRhdGVEaWFsb2cgPSBmdW5jdGlvbiBUZW1wbGF0ZUJhdGNoVXBkYXRlRGlhbG9nKCkgewogIHJldHVybiBpbXBvcnQoJ0AvY29tcG9uZW50cy9kaWFsb2cvVGVtcGxhdGVCYXRjaFVwZGF0ZURpYWxvZy52dWUnKTsKfTsKZXhwb3J0IGRlZmF1bHQgewogIG5hbWU6ICd0ZW1wbGF0ZS1keW5hbWljLXZpZXcnLAogIHByb3BzOiB7CiAgICB0ZW1wbGF0ZUtleTogU3RyaW5nLAogICAgaHRtbDogU3RyaW5nLAogICAgdGVtcGxhdGVJbmZvOiBPYmplY3QsCiAgICBwYXJhbWV0ZXJxUXVlcnlzOiBTdHJpbmcsCiAgICBzaW5nbGU6IHsKICAgICAgZGVmYXVsdDogJ3RydWUnCiAgICB9LAogICAgZGVmS2V5OiBTdHJpbmcsCiAgICB0YXNrVHlwZTogewogICAgICBkZWZhdWx0OiAnJwogICAgfSwKICAgIGRhdGFWaWV3OiBPYmplY3QsCiAgICBpc0pvaW5GbG93OiB7CiAgICAgIGRlZmF1bHQ6IGZhbHNlCiAgICB9CiAgfSwKICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkgewogICAgcmV0dXJuIHsKICAgICAgcmVmcmVzaFRpbWU6IG5ldyBEYXRlKCkuZ2V0VGltZSgpLAogICAgICBzaG93RGF0ZVZpZXc6IHRydWUKICAgIH07CiAgfSwKICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkKCkgewogICAgdGhpcy5pbml0KCk7CiAgfSwKICB3YXRjaDogewogICAgaHRtbDogZnVuY3Rpb24gaHRtbChuZXdWYWwpIHsKICAgICAgaWYgKG5ld1ZhbCkgewogICAgICAgIHRoaXMuaW5pdCgpOwogICAgICB9CiAgICB9CiAgfSwKICBtZXRob2RzOiB7CiAgICBpbml0OiBmdW5jdGlvbiBpbml0KCkgewogICAgICBWdWUuY29tcG9uZW50KCdodC1kYXRhdmlldy1ydW50aW1lLXRlbXBsYXRlJywgewogICAgICAgIHRlbXBsYXRlOiB0aGlzLmh0bWwsCiAgICAgICAgcHJvcHM6IHsKICAgICAgICAgIHRlbXBsYXRlS2V5OiBTdHJpbmcsCiAgICAgICAgICB0ZW1wbGF0ZUluZm86IE9iamVjdCwKICAgICAgICAgIHNpbmdsZTogU3RyaW5nLAogICAgICAgICAgZGVmS2V5OiBTdHJpbmcsCiAgICAgICAgICB0YXNrVHlwZTogewogICAgICAgICAgICBkZWZhdWx0OiAnJwogICAgICAgICAgfSwKICAgICAgICAgIGRhdGFWaWV3OiBPYmplY3QsCiAgICAgICAgICBpc0pvaW5GbG93OiB7CiAgICAgICAgICAgIGRlZmF1bHQ6IGZhbHNlCiAgICAgICAgICB9LAogICAgICAgICAgcGFyYW1ldGVycVF1ZXJ5czogU3RyaW5nCiAgICAgICAgfSwKICAgICAgICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkgewogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgdHJlZVF1ZXJ5czogW10sCiAgICAgICAgICAgIGFsaWFzX25ldzogJ3N0YXRlbWVudCcsCiAgICAgICAgICAgIGxvYWRpbmc6IGZhbHNlLAogICAgICAgICAgICBRUkNvZGV1cmw6ICcnLAogICAgICAgICAgICBRUkNvZGVEaWFsb2c6IGZhbHNlLAogICAgICAgICAgICBodG1sOiAnJywKICAgICAgICAgICAgdGFibGVEYXRhOiB7CiAgICAgICAgICAgICAgc2VsZWN0Um93czogW10sCiAgICAgICAgICAgICAgcXVlcnlzOiAnJwogICAgICAgICAgICB9LAogICAgICAgICAgICBkaWFsb2dFeHBvcnRWaXNpYmxlOiBmYWxzZSwKICAgICAgICAgICAgZXhwb3J0RGF0YTogewogICAgICAgICAgICAgIGdldFR5cGU6ICdhbGwnLAogICAgICAgICAgICAgIGV4cEZpZWxkOiBbXQogICAgICAgICAgICB9LAogICAgICAgICAgICBkaXNwbGF5RmllbGRzOiBbXSwKICAgICAgICAgICAgZXhwb3J0U2VsbGVjdGlvbjogW10sCiAgICAgICAgICAgIHNlYXJjaEZvcm06IHsKICAgICAgICAgICAgICBGX3hiOiAnJywKICAgICAgICAgICAgICBGX3htOiAnJwogICAgICAgICAgICB9LAogICAgICAgICAgICBxdWVyeUZvcm06IHsKICAgICAgICAgICAgICBxdWVyeURhdGE6ICcnCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZvcm1UeXBlOiBmYWxzZSwKICAgICAgICAgICAgbGFiZWxQb3NpdGlvbjogJ2xlZnQnLAogICAgICAgICAgICBpbmNvbnM6ICdlbC1pY29uLWFycm93LWRvd24nLAogICAgICAgICAgICBvcHRpb25zOiB7CiAgICAgICAgICAgICAgZnVsbHNjcmVlbjogdHJ1ZSwKICAgICAgICAgICAgICBsb2NrOiB0cnVlCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHJvd1RlbXBsYXRlSWQ6IG51bGwsCiAgICAgICAgICAgIHJvd0lkOiBudWxsLAogICAgICAgICAgICBRUkNvZGVTaG93OiB0cnVlLAogICAgICAgICAgICBRUkNvZGVEZXNjOiBbXSwKICAgICAgICAgICAgdHJlZTogW10sCiAgICAgICAgICAgIGN1c3RvbURpYWxvZzogW10sCiAgICAgICAgICAgIHRhYmxlSGVpZ2h0OiAwLjY4NSAqIHdpbmRvdy5pbm5lckhlaWdodCwKICAgICAgICAgICAgZGlhbG9nU3ViVmlzaWJsZTogZmFsc2UsCiAgICAgICAgICAgIHRhYnM6IFtdLAogICAgICAgICAgICBlbnRzOiBbXSwKICAgICAgICAgICAgbW9kaWZ5UmVjb3JkOiB7CiAgICAgICAgICAgICAgcGFnaW5hdGlvbjogewogICAgICAgICAgICAgICAgcGFnZUJlYW46IHsKICAgICAgICAgICAgICAgICAgcGFnZTogMSwKICAgICAgICAgICAgICAgICAgcGFnZVNpemU6IDIwLAogICAgICAgICAgICAgICAgICB0b3RhbDogMAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgcmVjb3JkTGlzdDogW10sCiAgICAgICAgICAgIHJlY29yZFJlZklkOiAnJywKICAgICAgICAgICAgZGlhbG9nUmVjb3JkVmlzaWJsZTogZmFsc2UsCiAgICAgICAgICAgIHJlY29yZFRhYmxlTG9hZGluZzogZmFsc2UsCiAgICAgICAgICAgIG1vZGlmeURldGFpbERpYWxvZ1Zpc2libGU6IGZhbHNlLAogICAgICAgICAgICBjdXJyZW50TW9kaWZ5OiB7fSwKICAgICAgICAgICAgcmVmSWQ6ICcnLAogICAgICAgICAgICBxdWVyeVN1YlZhbHVlOiAnJywKICAgICAgICAgICAgc3ViVGFibGVMb2FkaW5nOiBmYWxzZSwKICAgICAgICAgICAgY3VycmVudFRhYk5hbWU6ICcnLAogICAgICAgICAgICBjdXJyZW50VGFiOiB7fSwKICAgICAgICAgICAgZXhwb3J0VHlwZTogJ21haW4nLAogICAgICAgICAgICBzdWJEaXNwbGF5RmllbGRzOiBbXSwKICAgICAgICAgICAgc3ViRGlzcGxheUZpZWxkc0xpc3Q6IFtdLAogICAgICAgICAgICBub3RQcmludDogZmFsc2UsCiAgICAgICAgICAgIGRpc3BsYXlGaWVsZDoge30sCiAgICAgICAgICAgIHRyZWVMaXN0OiBbXSwKICAgICAgICAgICAgcm93czogW10sCiAgICAgICAgICAgIHBhZ2luYXRpb246IHsKICAgICAgICAgICAgICBwYWdlOiAxLAogICAgICAgICAgICAgIHBhZ2VTaXplOiAxMAogICAgICAgICAgICB9LAogICAgICAgICAgICBwYWdpbmF0aW9uTGF5b3V0OiAndG90YWwsIHNpemVzLCBwcmV2LCBwYWdlciwgbmV4dCwganVtcGVyJywKICAgICAgICAgICAgdG90YWw6IDAsCiAgICAgICAgICAgIHBlcm1pc3Npb246IHsKICAgICAgICAgICAgICBwcmludDogdHJ1ZSwKICAgICAgICAgICAgICBhZGQ6IHRydWUsCiAgICAgICAgICAgICAgZGVsOiB0cnVlLAogICAgICAgICAgICAgIGV4cG9ydDogdHJ1ZSwKICAgICAgICAgICAgICBlZGl0OiB0cnVlLAogICAgICAgICAgICAgIGhpZGRlbjogZmFsc2UKICAgICAgICAgICAgfSwKICAgICAgICAgICAgc2hvd1JpZ2h0TWVudTogdHJ1ZSwKICAgICAgICAgICAgbGlzdFNlbGVjdGFibGU6IHRydWUsCiAgICAgICAgICAgIGZpbHRlcnM6IHt9LAogICAgICAgICAgICBzb3J0ZXI6IG51bGwsCiAgICAgICAgICAgIGRpYWxvZ1N1blZpc2libGU6IGZhbHNlLAogICAgICAgICAgICAvL+WtmeihqOWvueivneahhgogICAgICAgICAgICBzdW5UYWJzOiBbXSwKICAgICAgICAgICAgLy/lrZnooajmlbDmja4KICAgICAgICAgICAgcXVlcnlTdW5WYWx1ZTogJycsCiAgICAgICAgICAgIG9wZXJhdGVDb2xXaWR0aDogJzI0MCcsCiAgICAgICAgICAgIHN1bW1hcnlGaWVsZHM6IFtdLAogICAgICAgICAgICBkaWFsb2dWaXNpYmxlOiBmYWxzZSwKICAgICAgICAgICAgcGFnZVJlc3VsdDogewogICAgICAgICAgICAgIHBhZ2U6IDEsCiAgICAgICAgICAgICAgcGFnZVNpemU6IDIwLAogICAgICAgICAgICAgIHRvdGFsOiAwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGxvZ0RhdGE6IFtdLAogICAgICAgICAgICBub3RTb3J0YWJsZUZpZWxkczogWydicG1fc3RhdHVzXycsICdicG1fcHJvY19pbnN0X2lkXycsICdicG1fc3ViamVjdF8nLCAnYnBtX3Byb2NfZGVmX25hbWVfJywgJ2JwbV9jcmVhdGVfdGltZV8nLCAnYnBtX2VuZF90aW1lXycsICdicG1faXNfZm9yYmlkZGVuXycsICdicG1fY3JlYXRvcl8nXSwKICAgICAgICAgICAgZGVmYXVsdFZhbHVlTGlzdDogW10sCiAgICAgICAgICAgIC8v5om56YeP5pu05paw5pWw5o2uCiAgICAgICAgICAgIGlnbm9yZWRBbGlhczogWydhcHBDZW50ZXJGcm9udCddLAogICAgICAgICAgICBRUkNvZGVQYXR0ZXJuOiB0cnVlLAogICAgICAgICAgICBRUkNvZGVUeXBlOiAnJywKICAgICAgICAgICAgaXNNb2JpbGU6IGZhbHNlLAogICAgICAgICAgICBhY3RpdmVOYW1lczogWycxJ10sCiAgICAgICAgICAgIHN3aXRjaE1hcDoge30sCiAgICAgICAgICAgIGZpbHRlck1hcDoge30KICAgICAgICAgIH07CiAgICAgICAgfSwKICAgICAgICBjb21wb25lbnRzOiB7CiAgICAgICAgICBWUnVudGltZVRlbXBsYXRlOiBWUnVudGltZVRlbXBsYXRlLAogICAgICAgICAgSHRDaGVja2JveDogSHRDaGVja2JveCwKICAgICAgICAgIEh0RGlhbG9nOiBIdERpYWxvZywKICAgICAgICAgIEh0RGlhbG9nQnRuOiBIdERpYWxvZ0J0biwKICAgICAgICAgIFRlbXBsYXRlQmF0Y2hVcGRhdGVEaWFsb2c6IFRlbXBsYXRlQmF0Y2hVcGRhdGVEaWFsb2csCiAgICAgICAgICBFaXBTZWxlY3Q6IEVpcFNlbGVjdAogICAgICAgIH0sCiAgICAgICAgd2F0Y2g6IHsKICAgICAgICAgIGVudHM6IHsKICAgICAgICAgICAgaGFuZGxlcjogZnVuY3Rpb24gaGFuZGxlcihuZXdWYWwsIG9sZFZhbHVlKSB7CiAgICAgICAgICAgICAgaWYgKG5ld1ZhbCAmJiBuZXdWYWwubGVuZ3RoID49IDEgJiYgbmV3VmFsICE9IG9sZFZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aGlzLmdldFN1YkRhdGEodGhpcywgdGhpcy5yZWZJZCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBkZWVwOiB0cnVlLAogICAgICAgICAgICBpbW1lZGlhdGU6IHRydWUKICAgICAgICAgIH0sCiAgICAgICAgICB0ZW1wbGF0ZUluZm86IHsKICAgICAgICAgICAgaGFuZGxlcjogZnVuY3Rpb24gaGFuZGxlcihuZXdWYWwsIG9sZFZhbCkgewogICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgICAgaWYgKG5ld1ZhbCAmJiBuZXdWYWwuaWQpIHsKICAgICAgICAgICAgICAgIHZhciBsb2FkaW5nID0gdGhpcy4kbG9hZGluZyh0aGlzLm9wdGlvbnMpOwogICAgICAgICAgICAgICAgdmFyIF9tZSA9IHRoaXM7CiAgICAgICAgICAgICAgICBfbWUudGVtcGxhdGVJbmZvID0gbmV3VmFsOwogICAgICAgICAgICAgICAgaWYgKF9tZS50ZW1wbGF0ZUluZm8uZGlzcGxheUZpZWxkKSB7CiAgICAgICAgICAgICAgICAgIHZhciBkaXNwbGF5RmllbGQgPSB1dGlscy5wYXJzZVRvSnNvbihfbWUudGVtcGxhdGVJbmZvLmRpc3BsYXlGaWVsZCk7CiAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGlzcGxheUZpZWxkLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGRpc3BsYXlGaWVsZFtpXS50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlGaWVsZHMucHVzaChkaXNwbGF5RmllbGRbaV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKF9tZS50ZW1wbGF0ZUluZm8uY29uZGl0aW9uRmllbGQpIHsKICAgICAgICAgICAgICAgICAgdmFyIGNvbmRpdGlvbkZpZWxkID0gdXRpbHMucGFyc2VUb0pzb24oX21lLnRlbXBsYXRlSW5mby5jb25kaXRpb25GaWVsZCk7CiAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29uZGl0aW9uRmllbGQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZmllbGROYW1lID0gJ0ZfJyArIGNvbmRpdGlvbkZpZWxkW2ldLm5hbWU7CiAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2V0KHRoaXMuc2VhcmNoRm9ybSwgZmllbGROYW1lLCAnJyk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBwYXJhbXMgPSB7CiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlSWQ6IF9tZS50ZW1wbGF0ZUluZm8uaWQKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB2YXIgcGFnZUJlYW4gPSB7CiAgICAgICAgICAgICAgICAgIHBhZ2VCZWFuOiB7CiAgICAgICAgICAgICAgICAgICAgcGFnZTogJzEnLAogICAgICAgICAgICAgICAgICAgIHBhZ2VTaXplOiBuZXdWYWwucGFnZVNpemUsCiAgICAgICAgICAgICAgICAgICAgc2hvd1RvdGFsOiAndHJ1ZScKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsgLy/liJ3mrKHliqDovb3pu5jorqRwYWdlQmVhbgogICAgICAgICAgICAgICAgcGFyYW1zLnBhZ2luYXRpb24gPSBwYWdlQmVhbjsKICAgICAgICAgICAgICAgIGlmIChfbWUuaXNKb2luRmxvdykgewogICAgICAgICAgICAgICAgICBwYXJhbXMuaXNKb2luRmxvdyA9IHRydWU7CiAgICAgICAgICAgICAgICAgIHBhcmFtcy50YXNrVHlwZSA9IF9tZS50YXNrVHlwZTsKICAgICAgICAgICAgICAgICAgcGFyYW1zLmRlZktleSA9IF9tZS5kZWZLZXk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoX21lLmRhdGFWaWV3KSB7CiAgICAgICAgICAgICAgICAgIF9tZS5oYW5kZWxCaW5kRmlsZWRWYWx1YSgpOwogICAgICAgICAgICAgICAgICAvL+WFs+iBlOafpeivouWtl+autQogICAgICAgICAgICAgICAgICBpZiAoX21lLmRhdGFWaWV3LnNlbGVjdExpc3QgJiYgX21lLmRhdGFWaWV3LnNlbGVjdExpc3QubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgIHBhcmFtcy5zZWxlY3RMaXN0ID0gX21lLmRhdGFWaWV3LnNlbGVjdExpc3Q7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgcGFyYW1zLnJlZklkVmFsdWUgPSBfbWUuZGF0YVZpZXcucmVmSWRWYWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhcmFtZXRlcnFRdWVyeXMpIHsKICAgICAgICAgICAgICAgICAgdmFyIHF1ZXJ5cyA9IEpTT04ucGFyc2UoQmFzZTY0LmRlY29kZShkZWNvZGVVUklDb21wb25lbnQodGhpcy5wYXJhbWV0ZXJxUXVlcnlzKSkpOwogICAgICAgICAgICAgICAgICBwYXJhbXMucGFnaW5hdGlvbi5xdWVyeXMgPSBxdWVyeXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgZGVmYXVsdFF1ZXJ5ID0gdGhpcy5idWlsZERlZmF1bHRRdWVyeXMoKTsKICAgICAgICAgICAgICAgIGlmIChkZWZhdWx0UXVlcnkubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICBpZiAocGFyYW1zLnBhZ2luYXRpb24ucXVlcnlzKSB7CiAgICAgICAgICAgICAgICAgICAgcGFyYW1zLnBhZ2luYXRpb24ucXVlcnlzLmNvbmNhdChkZWZhdWx0UXVlcnkpOwogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHBhcmFtcy5wYWdpbmF0aW9uLnF1ZXJ5cyA9IGRlZmF1bHRRdWVyeTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy/lpoLmnpzmnInorr7nva7pu5jorqTmjpLluo8s5LyY5YWI5L2/55So6buY6K6k5o6S5bqPCiAgICAgICAgICAgICAgICBpZiAodGhpcy50ZW1wbGF0ZUluZm8uc29ydEZpZWxkKSB7CiAgICAgICAgICAgICAgICAgIHZhciBzb3J0RmllbGQgPSBKU09OLnBhcnNlKHRoaXMudGVtcGxhdGVJbmZvLnNvcnRGaWVsZCk7CiAgICAgICAgICAgICAgICAgIHZhciBzb3J0ZXIgPSBbXTsKICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCBzb3J0RmllbGQubGVuZ3RoOyB4KyspIHsKICAgICAgICAgICAgICAgICAgICBzb3J0ZXIucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eTogc29ydEZpZWxkW3hdLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb246IHNvcnRGaWVsZFt4XS5zb3J0CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgcGFyYW1zLnBhZ2luYXRpb24uc29ydGVyID0gc29ydGVyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHRoaXNfID0gdGhpczsKICAgICAgICAgICAgICAgIGlmIChwYXJhbXMudGVtcGxhdGVJZCkgewogICAgICAgICAgICAgICAgICB0aGlzLiRzdG9yZS5kaXNwYXRjaCgnZm9ybS9nZXRCcG1UZW1wbGF0ZUJ5UGFnaW5hdGlvbicsIHBhcmFtcykudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzXy5yb3dzID0gcmVzcG9uc2UuZGF0YS5yb3dzOwogICAgICAgICAgICAgICAgICAgIHRoaXNfLnRvdGFsID0gcmVzcG9uc2UuZGF0YS50b3RhbDsKICAgICAgICAgICAgICAgICAgICB0aGlzXy5wYWdpbmF0aW9uLnBhZ2UgPSByZXNwb25zZS5kYXRhLnBhZ2U7CiAgICAgICAgICAgICAgICAgICAgdGhpc18ucGFnaW5hdGlvbi5wYWdlU2l6ZSA9IHJlc3BvbnNlLmRhdGEucGFnZVNpemU7CiAgICAgICAgICAgICAgICAgICAgbG9hZGluZy5jbG9zZSgpOwogICAgICAgICAgICAgICAgICAgIHRoaXNfLmluaXRTd2l0Y2hTdGF0dXMoKTsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpc18uJGVsICYmIHRoaXNfLiRlbC5xdWVyeVNlbGVjdG9yKSB7CiAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9wQnRuRG9tID0gdGhpc18uJGVsLnF1ZXJ5U2VsZWN0b3IoJ2Rpdi50b3BfYnRuX2NvbCcpOwogICAgICAgICAgICAgICAgICAgICAgaWYgKCF0b3BCdG5Eb20gfHwgIXRvcEJ0bkRvbS5xdWVyeVNlbGVjdG9yKCdpLmVsLWljb24tZGVsZXRlJykgJiYgIXRvcEJ0bkRvbS5xdWVyeVNlbGVjdG9yKCdpLmVsLWljb24tZWRpdCcpICYmICF0b3BCdG5Eb20ucXVlcnlTZWxlY3RvcignaS5lbC1pY29uLXMtZ3JpZCcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfLmxpc3RTZWxlY3RhYmxlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRkRG9tID0gdGhpc18uJGVsLnF1ZXJ5U2VsZWN0b3IoJ3RkLnJpZ2h0X21lbnUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0ZERvbSB8fCAhdGREb20ucXVlcnlTZWxlY3RvcignYnV0dG9uJykgJiYgdGREb20ucXVlcnlTZWxlY3Rvcignc3dpdGNoJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzXy5zaG93UmlnaHRNZW51ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIH0sIDIwMCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGxvYWRpbmcuY2xvc2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChuZXdWYWwudHJlZUZpZWxkICYmIG5ld1ZhbC50cmVlRmllbGQgIT09ICd7fScpIHsKICAgICAgICAgICAgICAgICAgdmFyIHRyZWVGaWVsZCA9IEpTT04ucGFyc2UobmV3VmFsLnRyZWVGaWVsZCk7CiAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdFRyZWUodHJlZUZpZWxkKTsKICAgICAgICAgICAgICAgICAgZm9ybS5nZXRTdWJFbnRzQnlGb3JtS2V5KHRoaXMudGVtcGxhdGVJbmZvLmZvcm1LZXksIGZ1bmN0aW9uIChyZXNwKSB7CiAgICAgICAgICAgICAgICAgICAgcmVzcC5kYXRhLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICAgICAgICAgICAgICAgIHZhciBzdWJEaXNwbGF5RmllbGRzID0gW107CiAgICAgICAgICAgICAgICAgICAgICBpdGVtLmF0dHJpYnV0ZUxpc3QuZm9yRWFjaChmdW5jdGlvbiAoYXR0cikgewogICAgICAgICAgICAgICAgICAgICAgICBzdWJEaXNwbGF5RmllbGRzLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2M6IGF0dHIuY29tbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBhdHRyLmZpZWxkTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBhdHRyLmNvbHVtblR5cGUKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnN1YkRpc3BsYXlGaWVsZHMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkczogc3ViRGlzcGxheUZpZWxkcywKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogaXRlbS5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50OiBpdGVtLmNvbW1lbnQKICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChuZXdWYWwuc3VtbWFyeUZpZWxkKSB7CiAgICAgICAgICAgICAgICAgIHRoaXMuc3VtbWFyeUZpZWxkcyA9IEpTT04ucGFyc2UobmV3VmFsLnN1bW1hcnlGaWVsZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBkZWVwOiB0cnVlLAogICAgICAgICAgICBpbW1lZGlhdGU6IHRydWUKICAgICAgICAgIH0sCiAgICAgICAgICBjdXJyZW50VGFiTmFtZTogZnVuY3Rpb24gY3VycmVudFRhYk5hbWUobmV3VmFsKSB7CiAgICAgICAgICAgIGlmIChuZXdWYWwpIHsKICAgICAgICAgICAgICB0aGlzLnF1ZXJ5U3ViVmFsdWUgPSAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgY29tcHV0ZWQ6IHsKICAgICAgICAgIHNob3dEcmFmdExpc3Q6IGZ1bmN0aW9uIHNob3dEcmFmdExpc3QoKSB7CiAgICAgICAgICAgIC8v5aaC5p6c5b2T5YmN6aG16Z2i6KKr5bWM5YWlaWZyYW1l6YeM6Z2i5LiN5pi+56S66I2J56i/CiAgICAgICAgICAgIHJldHVybiB3aW5kb3cuc2VsZiA9PT0gd2luZG93LnRvcDsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7CiAgICAgICAgICB0aGlzLmhhbmRlbEJpbmRGaWxlZFZhbHVhKCk7CiAgICAgICAgICB2YXIgdGhpc18gPSB0aGlzOwogICAgICAgICAgdGhpcy4kcm9vdC4kb24oJ2Zvcm0tcmVsb2FkLXN1Y2Nlc3MnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXNfLmhhbmRlbEJpbmRGaWxlZFZhbHVhKCk7CiAgICAgICAgICB9KTsKICAgICAgICAgIHRoaXMuJGVtaXQoJ2FmdGVyTW91bnRlZCcpOwogICAgICAgIH0sCiAgICAgICAgbWV0aG9kczogewogICAgICAgICAgbG9hZERhdGE6IGZ1bmN0aW9uIGxvYWREYXRhKHBhcmFtLCBjYikgewogICAgICAgICAgICB2YXIgX3RoaXMyID0gdGhpczsKICAgICAgICAgICAgdmFyIHF1ZXJ5cyA9IHBhcmFtLnF1ZXJ5cyB8fCBbXTsKICAgICAgICAgICAgdmFyIGhhc0RlZmF1bHRRdWVyeSA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLmhhbmRlbEJpbmRGaWxlZFZhbHVhKCk7CiAgICAgICAgICAgIHZhciBwSUQgPSB0aGlzLmRhdGFWaWV3LnJlZklkVmFsdWU7CiAgICAgICAgICAgIHF1ZXJ5cy5mb3JFYWNoKGZ1bmN0aW9uIChxKSB7CiAgICAgICAgICAgICAgaWYgKHEucHJvcGVydHkgPT0gJ1BJZCcpIHsKICAgICAgICAgICAgICAgIGhhc0RlZmF1bHRRdWVyeSA9IHRydWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgaWYgKCFoYXNEZWZhdWx0UXVlcnkpIHsKICAgICAgICAgICAgICBxdWVyeXMucHVzaCh7CiAgICAgICAgICAgICAgICBvcGVyYXRpb246ICdFUVVBTCcsCiAgICAgICAgICAgICAgICBncm91cDogJ2RlZmFsdXQnLAogICAgICAgICAgICAgICAgcHJvcGVydHk6ICdQSWQnLAogICAgICAgICAgICAgICAgcmVsYXRpb246ICdBTkQnLAogICAgICAgICAgICAgICAgdmFsdWU6IHBJRAogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIHF1ZXJ5cy5wdXNoKHsKICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogJ0VRVUFMJywKICAgICAgICAgICAgICAgIGdyb3VwOiAnZGVmYWx1dCcsCiAgICAgICAgICAgICAgICBwcm9wZXJ0eTogJ2JvQWxpYXMnLAogICAgICAgICAgICAgICAgcmVsYXRpb246ICdBTkQnLAogICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMudGVtcGxhdGVJbmZvLmJvRGVmQWxpYXMKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwYXJhbS5xdWVyeXMgPSBxdWVyeXM7CiAgICAgICAgICAgIHJlcS5wb3N0KHdpbmRvdy5jb250ZXh0LmZvcm0gKyAnL2Zvcm0vZm9ybURhdGFJbXBvcnRMb2cvdjEvbGlzdEpzb24nLCBwYXJhbSkudGhlbihmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgIHZhciByZXNwb25zZSA9IGRhdGEuZGF0YTsKICAgICAgICAgICAgICBfdGhpczIubG9nRGF0YSA9IHJlc3BvbnNlLnJvd3M7CiAgICAgICAgICAgICAgX3RoaXMyLnBhZ2VSZXN1bHQgPSB7CiAgICAgICAgICAgICAgICBwYWdlOiByZXNwb25zZS5wYWdlLAogICAgICAgICAgICAgICAgcGFnZVNpemU6IHJlc3BvbnNlLnBhZ2VTaXplLAogICAgICAgICAgICAgICAgdG90YWw6IHJlc3BvbnNlLnRvdGFsCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSkuZmluYWxseShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGNiKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSwKICAgICAgICAgIGhhbmRlbEJpbmRGaWxlZFZhbHVhOiBmdW5jdGlvbiBoYW5kZWxCaW5kRmlsZWRWYWx1YSgpIHsKICAgICAgICAgICAgLy/mlbDmja7op4blm77mjqfku7YKICAgICAgICAgICAgdmFyIF9tZSA9IHRoaXM7CiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFWaWV3KSB7CiAgICAgICAgICAgICAgdmFyIHBJbnN0ID0gdXRpbHMuZ2V0T25saW5lRm9ybUluc3RhbmNlKHRoaXMuJHBhcmVudC4kcGFyZW50LiRwYXJlbnQuJHBhcmVudCk7CiAgICAgICAgICAgICAgaWYgKCFwSW5zdFt0aGlzLmRhdGFWaWV3LmJvRGVmQWxpYXNdKSB7CiAgICAgICAgICAgICAgICB0aGlzLmRhdGFWaWV3LmJvRGVmQWxpYXMgPSBPYmplY3Qua2V5cyhwSW5zdC5kYXRhKVswXTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdmFyIHJlZklkVmFsdWUgPSB1dGlscy5nZXRWYWx1ZUJ5UGF0aChwSW5zdCwgJ2RhdGEuJyArIHRoaXMuZGF0YVZpZXcuYm9EZWZBbGlhcyArICcuaWRfJyk7CiAgICAgICAgICAgICAgaWYgKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ2Zvcm1JbXBvcnRUZW1wUmVmSWQnKSAmJiAhcmVmSWRWYWx1ZSkgewogICAgICAgICAgICAgICAgcmVmSWRWYWx1ZSA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ2Zvcm1JbXBvcnRUZW1wUmVmSWQnKTsKICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFyZWZJZFZhbHVlKSB7CiAgICAgICAgICAgICAgICAvL+WvvOWFpeeahOaXtuWAmeayoeacieWFs+mUrueahOWklumUru+8jOWImeS4uuWFtuiHquWKqOa3u+WKoAogICAgICAgICAgICAgICAgcmVmSWRWYWx1ZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOwogICAgICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgnZm9ybUltcG9ydFRlbXBSZWZJZCcsIHJlZklkVmFsdWUpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBfbWUuZGF0YVZpZXcucmVmSWRWYWx1ZSA9IHJlZklkVmFsdWU7CiAgICAgICAgICAgICAgaWYgKHBJbnN0LnBlcm1pc3Npb24gJiYgcEluc3QucGVybWlzc2lvbi50YWJsZSAmJiBwSW5zdC5wZXJtaXNzaW9uLnRhYmxlW3RoaXMudGVtcGxhdGVJbmZvLmJvRGVmQWxpYXNdKSB7CiAgICAgICAgICAgICAgICB0aGlzLnBlcm1pc3Npb24gPSBwSW5zdC5wZXJtaXNzaW9uLnRhYmxlW3RoaXMudGVtcGxhdGVJbmZvLmJvRGVmQWxpYXNdOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAodGhpcy5wZXJtaXNzaW9uLmhpZGRlbikgewogICAgICAgICAgICAgICAgdGhpcy4kcGFyZW50LnNob3dEYXRlVmlldyA9IGZhbHNlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAvL+WFs+iBlOafpeivouWtl+autQogICAgICAgICAgICAgIHZhciBzZWxlY3RMaXN0ID0gdGhpcy5kYXRhVmlldy5zZWxlY3RMaXN0OwogICAgICAgICAgICAgIGlmIChzZWxlY3RMaXN0ICYmIHNlbGVjdExpc3QubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxlY3RMaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RMaXN0W2ldLnNlbGVjdEZpZWxkKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHBhdGggPSAnZGF0YS4nICsgdGhpcy5kYXRhVmlldy5ib0RlZkFsaWFzICsgJy4nICsgc2VsZWN0TGlzdFtpXS5zZWxlY3RGaWVsZDsKICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSB1dGlscy5nZXRWYWx1ZUJ5UGF0aChwSW5zdCwgcGF0aCk7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0TGlzdFtpXS5zZWxlY3RWYWx1ZSA9IHZhbHVlOwoKICAgICAgICAgICAgICAgICAgICAvL+a3u+WKoOebkeWQrAogICAgICAgICAgICAgICAgICAgIHBJbnN0LiR3YXRjaChwYXRoLCBmdW5jdGlvbiAobmV3VmFsLCBvbGRWYWwpIHsKICAgICAgICAgICAgICAgICAgICAgIC8vIOebkeWQrOS4reS9v+eUqOmXtOmalOivt+axgu+8jOWHj+Wwkeivt+axguasoeaVsAogICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dCk7CiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1ZhbCAhPT0gb2xkVmFsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgLy9fbWUuc2V0RGF0YVZpZXdWYWx1ZShfbWUuZGF0YVZpZXcpOwogICAgICAgICAgICAgICAgICAgICAgICAgIF9tZS5zZWFyY2goKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgfSwgNTAwKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAvL+WFs+iBlOWhq+WFheWtl+autQogICAgICAgICAgICAgIHZhciBiaW5kTGlzdCA9IHRoaXMuZGF0YVZpZXcuYmluZExpc3Q7CiAgICAgICAgICAgICAgaWYgKGJpbmRMaXN0ICYmIGJpbmRMaXN0Lmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYmluZExpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgaWYgKGJpbmRMaXN0W2ldLmZpbGxGaWVsZCkgewogICAgICAgICAgICAgICAgICAgIHZhciBfcGF0aCA9ICdkYXRhLicgKyB0aGlzLmRhdGFWaWV3LmJvRGVmQWxpYXMgKyAnLicgKyBiaW5kTGlzdFtpXS5maWxsRmllbGQ7CiAgICAgICAgICAgICAgICAgICAgdmFyIF92YWx1ZSA9IHV0aWxzLmdldFZhbHVlQnlQYXRoKHBJbnN0LCBfcGF0aCk7CiAgICAgICAgICAgICAgICAgICAgYmluZExpc3RbaV0uZmlsbFZhbHVlID0gX3ZhbHVlOwogICAgICAgICAgICAgICAgICAgIHBJbnN0LiR3YXRjaChfcGF0aCwgZnVuY3Rpb24gKG5ld1ZhbCwgb2xkVmFsKSB7CiAgICAgICAgICAgICAgICAgICAgICAvLyDnm5HlkKzkuK3kvb/nlKjpl7TpmpTor7fmsYLvvIzlh4/lsJHor7fmsYLmrKHmlbAKICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpOwogICAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdWYWwgIT09IG9sZFZhbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIC8vX21lLnNldERhdGFWaWV3VmFsdWUoX21lLmRhdGFWaWV3KTsKICAgICAgICAgICAgICAgICAgICAgICAgICBfbWUuc2VhcmNoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIH0sIDUwMCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICBwcmludExpc3Q6IGZ1bmN0aW9uIHByaW50TGlzdCgpIHsKICAgICAgICAgICAgdmFyIF90aGlzMyA9IHRoaXM7CiAgICAgICAgICAgIHRoaXMubm90UHJpbnQgPSB0cnVlOwogICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmlubmVySFRNTCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcmludERhdGEnKS5pbm5lckhUTUw7CiAgICAgICAgICAgICAgd2luZG93LnByaW50KCk7CiAgICAgICAgICAgICAgbG9jYXRpb24ucmVsb2FkKCk7CiAgICAgICAgICAgIH0sIDIwMCk7CiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgIF90aGlzMy5ub3RQcmludCA9IGZhbHNlOwogICAgICAgICAgICB9LCAyMDApOwogICAgICAgICAgfSwKICAgICAgICAgIHByaW50RGV0YWlsOiBmdW5jdGlvbiBwcmludERldGFpbCh0ZW1wbGF0ZUlkLCBpZCwgYWN0aW9uKSB7CiAgICAgICAgICAgIC8v5pWw5o2u6ZqP5py65re75Yqg5Yiw5YW25LuW6I+c5Y2V5LiL6Z2i5pe26I635Y+W5b2T5YmN6I+c5Y2V55qE5Yir5ZCNCiAgICAgICAgICAgIGlmIChzZXNzaW9uU3RvcmFnZS5tZW51X2FsaWFzKSB7CiAgICAgICAgICAgICAgdGhpcy5hbGlhc19uZXcgPSBzZXNzaW9uU3RvcmFnZS5tZW51X2FsaWFzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciB1cmwgPSAnLycgKyB0aGlzLmFsaWFzX25ldyArICcvdGVtcGxhdGUvZm9ybS8nICsgdGhpcy50ZW1wbGF0ZUtleSArICcvJyArIGFjdGlvbiArICcvdHJ1ZSc7CiAgICAgICAgICAgIGlmIChpZCkgewogICAgICAgICAgICAgIHVybCA9IHVybCArICc/aWQ9JyArIGlkICsgJyYnOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHVybCArPSAnPyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHN0YXJ0Rmxvd1N0ciA9ICdzdGFydEZsb3c9ZmFsc2UnOwogICAgICAgICAgICB2YXIgcGF0aCA9IHVybCArIHN0YXJ0Rmxvd1N0cjsKICAgICAgICAgICAgaWYgKHBhdGguaW5kZXhPZignb3RoZXJtZW51JykgIT0gLTEpIHsKICAgICAgICAgICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKCcvb3RoZXJtZW51JywgJy9zdGF0ZW1lbnQnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLiRyb3V0ZXIucHVzaCh7CiAgICAgICAgICAgICAgcGF0aDogcGF0aCwKICAgICAgICAgICAgICBxdWVyeTogewogICAgICAgICAgICAgICAgaXNQcmludDogdHJ1ZQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICB9LAogICAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uIGNvbXBsZXRlKHJvdywgdGFza1R5cGUpIHsKICAgICAgICAgICAgdmFyIF90aGlzNCA9IHRoaXM7CiAgICAgICAgICAgIGlmICh0YXNrVHlwZSA9PSAndG9kbycpIHsKICAgICAgICAgICAgICB2YXIgdXJsID0gd2luZG93LmNvbnRleHQuYnBtUnVuVGltZSArICcvcnVudGltZS90YXNrL3YxL2dldEJwbVRhc2tCeUluc3RJZD9pbnN0SWQ9JyArIHJvdy5icG1fcHJvY19pbnN0X2lkXzsKICAgICAgICAgICAgICByZXEuZ2V0KHVybCkudGhlbihmdW5jdGlvbiAocmVzKSB7CiAgICAgICAgICAgICAgICBpZiAocmVzLmRhdGEubGVuZ3RoID09IDApIHsKICAgICAgICAgICAgICAgICAgX3RoaXM0LiRtZXNzYWdlLmVycm9yKCfmraTku7vliqHlt7LooqvlpITnkIbmiJbkuI3lrZjlnKjvvIEnKTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzLmRhdGEubGVuZ3RoID09IDEpIHsKICAgICAgICAgICAgICAgICAgX3RoaXM0LiRyb3V0ZXIucHVzaCgnL3JlcG9ydE1vZHVsZUluc3QvJyArIHJlcy5kYXRhWzBdLmlkICsgJy8wJyArICcvJyArIF90aGlzNC5kZWZLZXkgKyAnL3RydWUvJyArIF90aGlzNC50ZW1wbGF0ZUtleSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBfdGhpczQuJG1lc3NhZ2UuZXJyb3IoJ+aaguS4jeaUr+aMge+8gScpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9IGVsc2UgaWYgKHRhc2tUeXBlID09ICdkb25lJykgewogICAgICAgICAgICAgIHRoaXMuJHJvdXRlci5wdXNoKCcvcmVwb3J0TW9kdWxlSW5zdERvbmUvJyArIHJvdy5icG1fcHJvY19pbnN0X2lkXyArICcvZG9uZUxpc3QvJyArIHRoaXMuZGVmS2V5ICsgJy8nICsgdGhpcy50ZW1wbGF0ZUtleSk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAodGFza1R5cGUgPT0gJ3JlcXVlc3QnKSB7CiAgICAgICAgICAgICAgdGhpcy4kcm91dGVyLnB1c2goJy9yZXBvcnRNb2R1bGVJbnN0RG9uZS8nICsgcm93LmJwbV9wcm9jX2luc3RfaWRfICsgJy9yZXF1ZXN0LycgKyB0aGlzLmRlZktleSArICcvJyArIHRoaXMudGVtcGxhdGVLZXkpOwogICAgICAgICAgICB9IGVsc2UgaWYgKHRhc2tUeXBlID09ICd0b2RvUmVhZCcpIHsKICAgICAgICAgICAgICB2YXIgcGFnZUJlYW4gPSB7CiAgICAgICAgICAgICAgICBwYWdlOiAxLAogICAgICAgICAgICAgICAgcGFnZVNpemU6IDEwLAogICAgICAgICAgICAgICAgc2hvd1RvdGFsOiAndHJ1ZScKICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIHZhciBzdGF0dXMgPSByb3cuYnBtX3N0YXR1c187CiAgICAgICAgICAgICAgcmVxLnBvc3QoJyR7YnBtUnVuVGltZX0vcnVudGltZS90YXNrL3YxL2dldE5vdGljZVRvZG9SZWFkTGlzdCcsIHsKICAgICAgICAgICAgICAgIHBhZ2VCZWFuOiBwYWdlQmVhbiwKICAgICAgICAgICAgICAgIHF1ZXJ5czogW3sKICAgICAgICAgICAgICAgICAgcHJvcGVydHk6ICdwcm9jX2luc3RfaWRfJywKICAgICAgICAgICAgICAgICAgdmFsdWU6IHJvdy5icG1fcHJvY19pbnN0X2lkXywKICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uOiAnRVFVQUwnLAogICAgICAgICAgICAgICAgICByZWxhdGlvbjogJ0FORCcKICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5kYXRhLnJvd3MgJiYgcmVzcG9uc2UuZGF0YS5yb3dzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgdmFyIGlkID0gcmVzcG9uc2UuZGF0YS5yb3dzWzBdLmlkOwogICAgICAgICAgICAgICAgICB2YXIgX3VybCA9ICcnOwogICAgICAgICAgICAgICAgICA3OwogICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09ICdGT0xMT1cnKSB7CiAgICAgICAgICAgICAgICAgICAgX3VybCA9ICcvcmVwb3J0TW9kdWxlSW5zdFRhc2tSZWFkLycgKyBpZCArICcvRk9MTE9XLycgKyBfdGhpczQuZGVmS2V5ICsgJy8nICsgX3RoaXM0LnRlbXBsYXRlS2V5OwogICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PSAnQ09NTVUnKSB7CiAgICAgICAgICAgICAgICAgICAgX3VybCA9ICcvcmVwb3J0TW9kdWxlSW5zdC8nICsgaWQgKyAnLzAvJyArIF90aGlzNC5kZWZLZXkgKyAnL3RydWUvJyArIF90aGlzNC50ZW1wbGF0ZUtleTsKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBfdXJsID0gJy9yZXBvcnRNb2R1bGVJbnN0UmVhZC8nICsgcm93LmJwbV9wcm9jX2luc3RfaWRfICsgJy9yZWFkLycgKyBpZCArICcvJyArIF90aGlzNC5kZWZLZXkgKyAnLycgKyBfdGhpczQudGVtcGxhdGVLZXk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgX3RoaXM0LiRyb3V0ZXIucHVzaChfdXJsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSBlbHNlIGlmICh0YXNrVHlwZSA9PSAnZG9uZVJlYWQnKSB7CiAgICAgICAgICAgICAgdmFyIF9wYWdlQmVhbiA9IHsKICAgICAgICAgICAgICAgIHBhZ2U6IDEsCiAgICAgICAgICAgICAgICBwYWdlU2l6ZTogMTAsCiAgICAgICAgICAgICAgICBzaG93VG90YWw6ICd0cnVlJwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgcmVxLnBvc3QoJyR7YnBtUnVuVGltZX0vcnVudGltZS90YXNrL3YxL2dldE5vdGljZURvbmVSZWFkTGlzdCcsIHsKICAgICAgICAgICAgICAgIHBhZ2VCZWFuOiBfcGFnZUJlYW4sCiAgICAgICAgICAgICAgICBxdWVyeXM6IFt7CiAgICAgICAgICAgICAgICAgIHByb3BlcnR5OiAncHJvY19pbnN0X2lkXycsCiAgICAgICAgICAgICAgICAgIHZhbHVlOiByb3cuYnBtX3Byb2NfaW5zdF9pZF8sCiAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogJ0VRVUFMJywKICAgICAgICAgICAgICAgICAgcmVsYXRpb246ICdBTkQnCiAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuZGF0YS5yb3dzICYmIHJlc3BvbnNlLmRhdGEucm93cy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgIHZhciBpZCA9IHJlc3BvbnNlLmRhdGEucm93c1swXS5pZDsKICAgICAgICAgICAgICAgICAgX3RoaXM0LiRyb3V0ZXIucHVzaCgnL3JlcG9ydE1vZHVsZUluc3REb25lLycgKyByb3cuYnBtX3Byb2NfaW5zdF9pZF8gKyAnL3JlYWQvZG9uZS8nICsgaWQgKyAnLycgKyBfdGhpczQuZGVmS2V5ICsgJy8nICsgX3RoaXM0LnRlbXBsYXRlS2V5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSBlbHNlIGlmICh0YXNrVHlwZSA9PSAnbXlSZWFkJykgewogICAgICAgICAgICAgIHZhciBfcGFnZUJlYW4yID0gewogICAgICAgICAgICAgICAgcGFnZTogMSwKICAgICAgICAgICAgICAgIHBhZ2VTaXplOiAxMCwKICAgICAgICAgICAgICAgIHNob3dUb3RhbDogJ3RydWUnCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICByZXEucG9zdCgnJHticG1SdW5UaW1lfS9ydW50aW1lL3Rhc2svdjEvZ2V0TXlOb3RpY2VSZWFkTGlzdCcsIHsKICAgICAgICAgICAgICAgIHBhZ2VCZWFuOiBfcGFnZUJlYW4yLAogICAgICAgICAgICAgICAgcXVlcnlzOiBbewogICAgICAgICAgICAgICAgICBwcm9wZXJ0eTogJ3Byb2NfaW5zdF9pZF8nLAogICAgICAgICAgICAgICAgICB2YWx1ZTogcm93LmJwbV9wcm9jX2luc3RfaWRfLAogICAgICAgICAgICAgICAgICBvcGVyYXRpb246ICdFUVVBTCcsCiAgICAgICAgICAgICAgICAgIHJlbGF0aW9uOiAnQU5EJwogICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEucm93cyAmJiByZXNwb25zZS5kYXRhLnJvd3MubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICB2YXIgaWQgPSByZXNwb25zZS5kYXRhLnJvd3NbMF0uaWQ7CiAgICAgICAgICAgICAgICAgIF90aGlzNC4kcm91dGVyLnB1c2goJy9yZXBvcnRNb2R1bGVJbnN0TXlSZWFkLycgKyByb3cuYnBtX3Byb2NfaW5zdF9pZF8gKyAnLycgKyBpZCArICcvbXlSZWFkLycgKyBfdGhpczQuZGVmS2V5ICsgJy8nICsgX3RoaXM0LnRlbXBsYXRlS2V5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSBlbHNlIGlmICh0YXNrVHlwZSA9PSAnbXlEZWxlZ2F0ZScpIHsKICAgICAgICAgICAgICB0aGlzLiRyb3V0ZXIucHVzaCgnL3JlcG9ydE1vZHVsZUluc3RSZWFkLycgKyByb3cuYnBtX3Byb2NfaW5zdF9pZF8gKyAnL2RlbGVnYXRlLycgKyB0aGlzLmRlZktleSArICcvJyArIHRoaXMudGVtcGxhdGVLZXkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgLy/kuIvovb3lhajpg6jpgInkuK3nmoTkuoznu7TnoIEKICAgICAgICAgIGRvd25sb2FkQWxsUVJDb2RlOiBmdW5jdGlvbiBkb3dubG9hZEFsbFFSQ29kZSh0ZW1wbGF0ZUlkLCBtb2JpbGVGb3JtQWxpYXMsIGRpc3BsYXksIHBrRmllbGQsIFFSQ29kZVBhdHRlcm4pIHsKICAgICAgICAgICAgdmFyIF90aGlzNSA9IHRoaXM7CiAgICAgICAgICAgIHRoaXMuUVJDb2RlUGF0dGVybiA9IFFSQ29kZVBhdHRlcm47CiAgICAgICAgICAgIHZhciBfc2VsZWN0RGF0YSA9IHRoaXMuJHJlZnMubXVsdGlwbGVUZW1wbGF0ZVRhYmxlLnNlbGVjdGlvbjsKICAgICAgICAgICAgaWYgKF9zZWxlY3REYXRhLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgIHRoaXMuJG1lc3NhZ2UuZXJyb3IoJ+ivt+iHs+WwkemAieS4reS4gOadoeaVsOaNriEnKTsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTsKICAgICAgICAgICAgdmFyIGFjY291bnQgPSBCYXNlNjQuZW5jb2RlKHRoaXMuJHN0b3JlLnN0YXRlLmxvZ2luLmN1cnJlbnRVc2VyLmFjY291bnQpOwogICAgICAgICAgICB2YXIgdG9rZW4gPSB0aGlzLiRzdG9yZS5zdGF0ZS5sb2dpbi5jdXJyZW50VXNlci50b2tlbjsKICAgICAgICAgICAgdmFyIG1vYmlsZSA9IHdpbmRvdy5jb250ZXh0Lm1vYmlsZTsKICAgICAgICAgICAgdmFyIFFSQ29kZXVybCA9ICcnOwogICAgICAgICAgICB2YXIgemlwID0gbmV3IEpTWmlwKCk7CiAgICAgICAgICAgIC8vIOWIm+W7uuS4gOS4quWQjeS4umltYWdlc+eahOaWsOeahOaWh+S7tuebruW9lQogICAgICAgICAgICB2YXIgaW1nID0gemlwLmZvbGRlcignaW1hZ2VzJyk7CiAgICAgICAgICAgIHZhciBwbGlzdCA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IF9zZWxlY3REYXRhLmxlbmd0aDsgeCsrKSB7CiAgICAgICAgICAgICAgaWYgKHRoaXMuUVJDb2RlUGF0dGVybikgewogICAgICAgICAgICAgICAgUVJDb2RldXJsID0gbW9iaWxlICsgJy9RUkNvZGVGb3JtLycgKyB0aGlzLnRlbXBsYXRlS2V5ICsgJy9nZXQnICsgJz9pZD0nICsgX3NlbGVjdERhdGFbeF1bcGtGaWVsZF0gKyAnJnRva2VuPScgKyB0b2tlbjsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgUVJDb2RldXJsID0gbW9iaWxlICsgJy9RUkNvZGVGb3JtLycgKyB0aGlzLnRlbXBsYXRlS2V5ICsgJy9lZGl0JyArICc/aWQ9JyArIF9zZWxlY3REYXRhW3hdW3BrRmllbGRdOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB2YXIgbXNnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7CiAgICAgICAgICAgICAgUVJDb2RlLnRvQ2FudmFzKG1zZywgUVJDb2RldXJsLCBmdW5jdGlvbiAoZXJyb3IpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTsKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICB2YXIgX2NhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgICAgICAgIF9jYW52YXMuc2V0QXR0cmlidXRlKCdpZCcsICdRUkNvZGVBbmREZXNjQWxsJyArIHgpOwogICAgICAgICAgICAgIF9jYW52YXMuc2V0QXR0cmlidXRlKCdzdHlsZScsICd0ZXh0LWFsaWduOmNlbnRlcjt3aWR0aDonICsgbXNnLndpZHRoICsgJ3B4OycpOwogICAgICAgICAgICAgIF9jYW52YXMuYXBwZW5kQ2hpbGQobXNnKTsKICAgICAgICAgICAgICAvL+WIm+W7uuW6lemDqOeahOaPj+i/sOS/oeaBrwogICAgICAgICAgICAgIGZvciAodmFyIFkgPSAwOyBZIDwgZGlzcGxheS5sZW5ndGg7IFkrKykgewogICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBKU09OLnBhcnNlKGRpc3BsYXlbWV0pOwogICAgICAgICAgICAgICAgaWYgKF9zZWxlY3REYXRhW3hdW2l0ZW0ubmFtZV0pIHsKICAgICAgICAgICAgICAgICAgdmFyIGRlc2MgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICAgICAgICAgICAgZGVzYy5pbm5lckhUTUwgPSBpdGVtLmRlc2MgKyAnOicgKyBfc2VsZWN0RGF0YVt4XVtpdGVtLm5hbWVdOwogICAgICAgICAgICAgICAgICBfY2FudmFzLmFwcGVuZENoaWxkKGRlc2MpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnUVJDb2RlQW5kRGVzY0FsbCcpLmFwcGVuZENoaWxkKF9jYW52YXMpOwogICAgICAgICAgICAgIHBsaXN0LnB1c2godGhpcy5kb3dubG9hZFFSQ29kZUFuZERlc2MoJyNRUkNvZGVBbmREZXNjQWxsJyArIHgsIF9jYW52YXMpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBQcm9taXNlLmFsbChwbGlzdCkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7CiAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ1FSQ29kZUFuZERlc2NBbGwnKS5pbm5lckhUTUwgPSAnJzsKICAgICAgICAgICAgICBmb3IgKHZhciBfeCA9IDA7IF94IDwgcmVzdWx0Lmxlbmd0aDsgX3grKykgewogICAgICAgICAgICAgICAgdmFyIGNhbnZhcyA9IHJlc3VsdFtfeF07CiAgICAgICAgICAgICAgICB2YXIgaW1hZ2UgPSBjYW52YXMudG9EYXRhVVJMKCkuc3BsaXQoJztiYXNlNjQsJylbMV07CiAgICAgICAgICAgICAgICAvLyDov5nkuKppbWFnZXPmlofku7bnm67lvZXkuK3liJvlu7rkuIDkuKpiYXNlNjTmlbDmja7kuLppbWdEYXRh55qE5Zu+5YOP77yM5Zu+5YOP5ZCN5pivc21pbGUuZ2lmCiAgICAgICAgICAgICAgICBpbWcuZmlsZShfeCArICcucG5nJywgaW1hZ2UsIHsKICAgICAgICAgICAgICAgICAgYmFzZTY0OiB0cnVlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgLy8g5oqK5omT5YyF5YaF5a655byC5q2l6L2s5oiQYmxvYuS6jOi/m+WItuagvOW8jwogICAgICAgICAgICAgIHppcC5nZW5lcmF0ZUFzeW5jKHsKICAgICAgICAgICAgICAgIHR5cGU6ICdibG9iJwogICAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKGNvbnRlbnQpIHsKICAgICAgICAgICAgICAgIHZhciBlbGVMaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOwogICAgICAgICAgICAgICAgZWxlTGluay5kb3dubG9hZCA9ICfkuoznu7TnoIEuemlwJzsKICAgICAgICAgICAgICAgIGVsZUxpbmsuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICAgICAgICAgIC8vIOS4i+i9veWGheWuuei9rOWPmOaIkGJsb2LlnLDlnYAKICAgICAgICAgICAgICAgIGVsZUxpbmsuaHJlZiA9IFVSTC5jcmVhdGVPYmplY3RVUkwoY29udGVudCk7CiAgICAgICAgICAgICAgICAvLyDop6blj5Hngrnlh7sKICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZWxlTGluayk7CiAgICAgICAgICAgICAgICBlbGVMaW5rLmNsaWNrKCk7CiAgICAgICAgICAgICAgICAvLyDnhLblkI7np7vpmaQKICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZWxlTGluayk7CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgX3RoaXM1LmxvYWRpbmcgPSBmYWxzZTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9LAogICAgICAgICAgb25Db3B5OiBmdW5jdGlvbiBvbkNvcHkoZSkgewogICAgICAgICAgICB0aGlzLiRtZXNzYWdlLnN1Y2Nlc3MoJ+WGheWuueW3suWkjeWItuWIsOWJquWIh+adv++8gScpOwogICAgICAgICAgfSwKICAgICAgICAgIC8vIOWkjeWItuWksei0peaXtueahOWbnuiwg+WHveaVsAogICAgICAgICAgb25FcnJvcjogZnVuY3Rpb24gb25FcnJvcihlKSB7CiAgICAgICAgICAgIHRoaXMuJG1lc3NhZ2UuZXJyb3IoJ+aKseatie+8jOWkjeWItuWksei0pe+8gScpOwogICAgICAgICAgfSwKICAgICAgICAgIGRvd25sb2FkUVJDb2RlOiBmdW5jdGlvbiBkb3dubG9hZFFSQ29kZSgpIHsKICAgICAgICAgICAgdmFyIHBsaXN0ID0gW107CiAgICAgICAgICAgIHZhciBfY2FudmFzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI1FSQ29kZUFuZERlc2MnKTsKICAgICAgICAgICAgcGxpc3QucHVzaCh0aGlzLmRvd25sb2FkUVJDb2RlQW5kRGVzYygnI1FSQ29kZUFuZERlc2MnLCBfY2FudmFzKSk7CiAgICAgICAgICAgIFByb21pc2UuYWxsKHBsaXN0KS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHsKICAgICAgICAgICAgICB2YXIgY2FudmFzID0gcmVzdWx0WzBdOwogICAgICAgICAgICAgIHZhciBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOwogICAgICAgICAgICAgIGxpbmsuaHJlZiA9IGNhbnZhcy50b0RhdGFVUkwoKTsgLy/kuIvovb3pk77mjqUKICAgICAgICAgICAgICBsaW5rLnNldEF0dHJpYnV0ZSgnZG93bmxvYWQnLCAn5LqM57u056CBLmpwZycpOwogICAgICAgICAgICAgIGxpbmsuc3R5bGUuZGlzcGxheSA9ICdub25lJzsgLy9h5qCH562+6ZqQ6JePCiAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsaW5rKTsKICAgICAgICAgICAgICBsaW5rLmNsaWNrKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSwKICAgICAgICAgIC8v5oqK5LqM57u056CB5LiO5LqM57u056CB6K+05piO5LiA6LW35LiL6L295oiQ5Zu+54mHCiAgICAgICAgICBkb3dubG9hZFFSQ29kZUFuZERlc2M6IGZ1bmN0aW9uIGRvd25sb2FkUVJDb2RlQW5kRGVzYyhjbGFzc3MsIF9jYW52YXMpIHsKICAgICAgICAgICAgdmFyIHAyID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgIHZhciBjYW52YXMyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7CiAgICAgICAgICAgICAgdmFyIHcgPSBwYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShfY2FudmFzKS53aWR0aCk7CiAgICAgICAgICAgICAgdmFyIGggPSBwYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShfY2FudmFzKS5oZWlnaHQpOwogICAgICAgICAgICAgIC8v5bCGY2FudmFz55S75biD5pS+5aSn6Iul5bmy5YCN77yM54S25ZCO55ub5pS+5Zyo6L6D5bCP55qE5a655Zmo5YaF77yM5bCx5pi+5b6X5LiN5qih57OK5LqGCiAgICAgICAgICAgICAgY2FudmFzMi53aWR0aCA9IHcgKiAyOwogICAgICAgICAgICAgIGNhbnZhczIuaGVpZ2h0ID0gaCAqIDI7CiAgICAgICAgICAgICAgY2FudmFzMi5zdHlsZS53aWR0aCA9IHcgKyAncHgnOwogICAgICAgICAgICAgIGNhbnZhczIuc3R5bGUuaGVpZ2h0ID0gaCArICdweCc7CiAgICAgICAgICAgICAgLy/lj6/ku6XmjInnhafoh6rlt7HnmoTpnIDmsYLvvIzlr7ljb250ZXh055qE5Y+C5pWw5L+u5pS5LHRyYW5zbGF0ZeaMh+eahOaYr+WBj+enu+mHjwogICAgICAgICAgICAgIHZhciBjb250ZXh0ID0gY2FudmFzMi5nZXRDb250ZXh0KCcyZCcpOwogICAgICAgICAgICAgIGNvbnRleHQuc2NhbGUoMiwgMik7CiAgICAgICAgICAgICAgcmV0dXJuIGh0bWwyY2FudmFzKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoY2xhc3NzKSwgewogICAgICAgICAgICAgICAgY2FudmFzOiBjYW52YXMyCiAgICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoY2FudmFzKSB7CiAgICAgICAgICAgICAgICByZXNvbHZlKGNhbnZhcyk7CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4gcDI7CiAgICAgICAgICB9LAogICAgICAgICAgUVJDb2RlRGlhbG9nQ2xvc2U6IGZ1bmN0aW9uIFFSQ29kZURpYWxvZ0Nsb3NlKCkgewogICAgICAgICAgICB0aGlzLlFSQ29kZVR5cGUgPSAnJzsKICAgICAgICAgICAgdGhpcy5RUkNvZGVEaWFsb2cgPSBmYWxzZTsKICAgICAgICAgIH0sCiAgICAgICAgICBmb3VuZFFSQ29kZTogZnVuY3Rpb24gZm91bmRRUkNvZGUoKSB7CiAgICAgICAgICAgIC8qdGhpcy5RUkNvZGV1cmwgPQ0KICAgICAgICAgICAgICB3aW5kb3cuY29udGV4dC5mcm9udCArDQogICAgICAgICAgICAgICIvUVJDb2RlRm9ybS8iICsNCiAgICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZUtleSArDQogICAgICAgICAgICAgICIvZ2V0IiArDQogICAgICAgICAgICAgICI/aWQ9IiArDQogICAgICAgICAgICAgIHRoaXMucm93SWQgKw0KICAgICAgICAgICAgICAiJnRva2VuPSIgKw0KICAgICAgICAgICAgICB0aGlzLiRzdG9yZS5zdGF0ZS5sb2dpbi5jdXJyZW50VXNlci50b2tlbjsqLwogICAgICAgICAgICBpZiAodGhpcy5RUkNvZGVUeXBlID09ICdhZGQnKSB7CiAgICAgICAgICAgICAgdmFyIGlzU3RhcnRGbG93ID0gdGhpcy50ZW1wbGF0ZUluZm8uZGVmSWQgPyAndHJ1ZScgOiAnZmFsc2UnOwogICAgICAgICAgICAgIHRoaXMuUVJDb2RldXJsID0gcmVxLmdldENvbnRleHQoKS5tb2JpbGUgKyAnL3RlbXBsYXRlL2Zvcm0vJyArIHRoaXMudGVtcGxhdGVLZXkgKyAnL2FkZC8/c3RhcnRGbG93PScgKyBpc1N0YXJ0RmxvdzsKICAgICAgICAgICAgICBpZiAodGhpcy5RUkNvZGVQYXR0ZXJuKSB7CiAgICAgICAgICAgICAgICB2YXIgdG9rZW4gPSB0aGlzLiRzdG9yZS5zdGF0ZS5sb2dpbi5jdXJyZW50VXNlci50b2tlbjsKICAgICAgICAgICAgICAgIHRoaXMuUVJDb2RldXJsICs9ICcmdG9rZW49JyArIHRva2VuOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAvL+S4jeiuuumcgOS4jemcgOimgeeZu+W9le+8jOiuv+mXrueahOmDveaYr+aYjue7humhtemdogogICAgICAgICAgICAgIGlmICh0aGlzLlFSQ29kZVBhdHRlcm4pIHsKICAgICAgICAgICAgICAgIC8v5YWN55m75b2VCiAgICAgICAgICAgICAgICB0aGlzLlFSQ29kZXVybCA9IHJlcS5nZXRDb250ZXh0KCkubW9iaWxlICsgJy9RUkNvZGVGb3JtLycgKyB0aGlzLnRlbXBsYXRlS2V5ICsgJy9nZXQ/aWQ9JyArIHRoaXMucm93SWQgKyAnJnRva2VuPScgKyB0aGlzLiRzdG9yZS5zdGF0ZS5sb2dpbi5jdXJyZW50VXNlci50b2tlbjsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgLy/pnIDopoHnmbvlvZUKICAgICAgICAgICAgICAgIHRoaXMuUVJDb2RldXJsID0gcmVxLmdldENvbnRleHQoKS5tb2JpbGUgKyAnL1FSQ29kZUZvcm0vJyArIHRoaXMudGVtcGxhdGVLZXkgKyAnL2dldD9pZD0nICsgdGhpcy5yb3dJZDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQmFzZTY0LmVuY29kZSh0aGlzLiRzdG9yZS5zdGF0ZS5sb2dpbi5jdXJyZW50VXNlci5hY2NvdW50KTsKICAgICAgICAgICAgdmFyIG1zZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdRUkNvZGUnKTsKICAgICAgICAgICAgUVJDb2RlLnRvQ2FudmFzKG1zZywgdGhpcy5RUkNvZGV1cmwsIGZ1bmN0aW9uIChlcnJvcikgewogICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHRoaXMuUVJDb2RlU2hvdyA9IHRydWU7CiAgICAgICAgICB9LAogICAgICAgICAgZ2V0UVJDb2RlOiBmdW5jdGlvbiBnZXRRUkNvZGUodGVtcGxhdGVJZCwgaWQsIG1vYmlsZUZvcm1BbGlhcywgZGlzcGxheSwgaW5kZXgsIFFSQ29kZVBhdHRlcm4pIHsKICAgICAgICAgICAgdGhpcy5RUkNvZGVQYXR0ZXJuID0gUVJDb2RlUGF0dGVybjsKICAgICAgICAgICAgdGhpcy5RUkNvZGVEZXNjID0gW107CiAgICAgICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgZGlzcGxheS5sZW5ndGg7IHgrKykgewogICAgICAgICAgICAgIHZhciBpdGVtID0gSlNPTi5wYXJzZShkaXNwbGF5W3hdKTsKICAgICAgICAgICAgICBpZiAodGhpcy5yb3dzW2luZGV4XVtpdGVtLm5hbWVdKSB7CiAgICAgICAgICAgICAgICB0aGlzLlFSQ29kZURlc2MucHVzaChpdGVtLmRlc2MgKyAnOicgKyB0aGlzLnJvd3NbaW5kZXhdW2l0ZW0ubmFtZV0pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLm1vYmlsZUZvcm1BbGlhcyA9IG1vYmlsZUZvcm1BbGlhczsKICAgICAgICAgICAgdGhpcy5RUkNvZGVTaG93ID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuUVJDb2RlRGlhbG9nID0gdHJ1ZTsKICAgICAgICAgICAgdGhpcy5yb3dUZW1wbGF0ZUlkID0gdGVtcGxhdGVJZDsKICAgICAgICAgICAgdGhpcy5yb3dJZCA9IGlkOwogICAgICAgICAgfSwKICAgICAgICAgIGhhbmRsZVNpemVDaGFuZ2U6IGZ1bmN0aW9uIGhhbmRsZVNpemVDaGFuZ2Uoc2l6ZSkgewogICAgICAgICAgICAvL+avj+mhteS4i+aLieaYvuekuuaVsOaNrgogICAgICAgICAgICB0aGlzLnBhZ2luYXRpb24ucGFnZVNpemUgPSBzaXplOwogICAgICAgICAgICB0aGlzLnNlYXJjaCgpOwogICAgICAgICAgfSwKICAgICAgICAgIGhhbmRsZUN1cnJlbnRDaGFuZ2U6IGZ1bmN0aW9uIGhhbmRsZUN1cnJlbnRDaGFuZ2UoY3VycmVudFBhZ2UpIHsKICAgICAgICAgICAgLy/ngrnlh7vnrKzlh6DpobUKICAgICAgICAgICAgdGhpcy5wYWdpbmF0aW9uLnBhZ2UgPSBjdXJyZW50UGFnZTsKICAgICAgICAgICAgdGhpcy5zZWFyY2goKTsKICAgICAgICAgIH0sCiAgICAgICAgICBnZXRQYXJhbTogZnVuY3Rpb24gZ2V0UGFyYW0oKSB7CiAgICAgICAgICAgIHZhciBwYXJhbXMgPSB7fTsKICAgICAgICAgICAgaWYgKHN0ciA9PSAnZmluZCcpIHsKICAgICAgICAgICAgICAvLyB0aGlzLiRzdG9yZS5kaXNwYXRjaCgiZm9ybS9zZXRCcG1UZW1wbGF0ZVBhZ2luYXRpb25QYWdlTnVtIiwgMSk7CiAgICAgICAgICAgICAgdGhpcy5wYWdpbmF0aW9uLnBhZ2UgPSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvL+WIpOaWreS4uuWQiOW5tuafpeivoui/mOaYr+WIhuW8gOafpeivogogICAgICAgICAgICBpZiAodGhpcy5mb3JtVHlwZSkgewogICAgICAgICAgICAgIHBhcmFtcyA9IHRoaXMuZ2V0UXVlcnlGaWx0ZXIoKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAvL+WIpOaWreaYr+WQpumFjee9ruS6huWQiOW5tuafpeivogogICAgICAgICAgICAgIGlmICgkKCcuc2VhcmNoLXF1ZXJ5JykubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgcGFyYW1zID0gdGhpcy5nZXRDb25kaXRpb25RdWVyeSgpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBwYXJhbXMgPSB0aGlzLmdldFF1ZXJ5RmlsdGVyKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChwYXJhbXMucGFnaW5hdGlvbiAmJiBwYXJhbXMucGFnaW5hdGlvbiAmJiBwYXJhbXMucGFnaW5hdGlvbi5xdWVyeXMpIHsKICAgICAgICAgICAgICB2YXIgdGVtcFF1ZXJ5UyA9IFtdOwogICAgICAgICAgICAgIHZhciBiZXR3ZWVuQ29uZGl0aW9ucyA9IHt9OwogICAgICAgICAgICAgIHBhcmFtcy5wYWdpbmF0aW9uLnF1ZXJ5cy5mb3JFYWNoKGZ1bmN0aW9uIChxKSB7CiAgICAgICAgICAgICAgICBpZiAocS52YWx1ZSAmJiAocS5vcGVyYXRpb24gIT0gJ0JFVFdFRU4nIHx8IHEudmFsdWUuY29uc3RydWN0b3IgPT0gQXJyYXkpKSB7CiAgICAgICAgICAgICAgICAgIHRlbXBRdWVyeVMucHVzaChxKTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocS52YWx1ZSkgewogICAgICAgICAgICAgICAgICB2YXIgY29uZGl0aW9ucyA9IHE7CiAgICAgICAgICAgICAgICAgIGlmIChiZXR3ZWVuQ29uZGl0aW9uc1txLnByb3BlcnR5XSkgewogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnMgPSBiZXR3ZWVuQ29uZGl0aW9uc1txLnByb3BlcnR5XTsKICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zLnZhbHVlID0gW2NvbmRpdGlvbnMudmFsdWVdOwogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnMudmFsdWUucHVzaChxLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBiZXR3ZWVuQ29uZGl0aW9uc1txLnByb3BlcnR5XSA9IGNvbmRpdGlvbnM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGJldHdlZW5Db25kaXRpb25zKSB7CiAgICAgICAgICAgICAgICB0ZW1wUXVlcnlTLnB1c2goYmV0d2VlbkNvbmRpdGlvbnNba2V5XSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHBhcmFtcy5wYWdpbmF0aW9uLnF1ZXJ5cyA9IHRlbXBRdWVyeVM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHBhcmFtczsKICAgICAgICAgIH0sCiAgICAgICAgICBzZWFyY2g6IGZ1bmN0aW9uIHNlYXJjaChzdHIpIHsKICAgICAgICAgICAgdmFyIGxvYWRpbmcgPSB0aGlzLiRsb2FkaW5nKHRoaXMub3B0aW9ucyk7CiAgICAgICAgICAgIHZhciBwYXJhbXMgPSB7fTsKICAgICAgICAgICAgaWYgKHN0ciA9PSAnZmluZCcpIHsKICAgICAgICAgICAgICAvLyB0aGlzLiRzdG9yZS5kaXNwYXRjaCgiZm9ybS9zZXRCcG1UZW1wbGF0ZVBhZ2luYXRpb25QYWdlTnVtIiwgMSk7CiAgICAgICAgICAgICAgdGhpcy5wYWdpbmF0aW9uLnBhZ2UgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8v5Yik5pat5Li65ZCI5bm25p+l6K+i6L+Y5piv5YiG5byA5p+l6K+iCiAgICAgICAgICAgIGlmICh0aGlzLmZvcm1UeXBlKSB7CiAgICAgICAgICAgICAgcGFyYW1zID0gdGhpcy5nZXRRdWVyeUZpbHRlcigpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIC8v5Yik5pat5piv5ZCm6YWN572u5LqG5ZCI5bm25p+l6K+iCiAgICAgICAgICAgICAgaWYgKCQoJy5zZWFyY2gtcXVlcnknKS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBwYXJhbXMgPSB0aGlzLmdldENvbmRpdGlvblF1ZXJ5KCk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHBhcmFtcyA9IHRoaXMuZ2V0UXVlcnlGaWx0ZXIoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHBhcmFtcy5wYWdpbmF0aW9uICYmIHBhcmFtcy5wYWdpbmF0aW9uLnF1ZXJ5cykgewogICAgICAgICAgICAgIHZhciB0ZW1wUXVlcnlTID0gW107CiAgICAgICAgICAgICAgdmFyIGJldHdlZW5Db25kaXRpb25zID0ge307CiAgICAgICAgICAgICAgcGFyYW1zLnBhZ2luYXRpb24ucXVlcnlzLmZvckVhY2goZnVuY3Rpb24gKHEpIHsKICAgICAgICAgICAgICAgIGlmIChxLnZhbHVlICYmIChxLm9wZXJhdGlvbiAhPSAnQkVUV0VFTicgfHwgcS52YWx1ZS5jb25zdHJ1Y3RvciA9PSBBcnJheSkpIHsKICAgICAgICAgICAgICAgICAgdGVtcFF1ZXJ5Uy5wdXNoKHEpOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChxLnZhbHVlKSB7CiAgICAgICAgICAgICAgICAgIHZhciBjb25kaXRpb25zID0gcTsKICAgICAgICAgICAgICAgICAgaWYgKGJldHdlZW5Db25kaXRpb25zW3EucHJvcGVydHldKSB7CiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9ucyA9IGJldHdlZW5Db25kaXRpb25zW3EucHJvcGVydHldOwogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnMudmFsdWUgPSBbY29uZGl0aW9ucy52YWx1ZV07CiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9ucy52YWx1ZS5wdXNoKHEudmFsdWUpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGJldHdlZW5Db25kaXRpb25zW3EucHJvcGVydHldID0gY29uZGl0aW9uczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gYmV0d2VlbkNvbmRpdGlvbnMpIHsKICAgICAgICAgICAgICAgIHRlbXBRdWVyeVMucHVzaChiZXR3ZWVuQ29uZGl0aW9uc1trZXldKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcGFyYW1zLnBhZ2luYXRpb24ucXVlcnlzID0gdGVtcFF1ZXJ5UzsKICAgICAgICAgICAgICBwYXJhbXMucGFnaW5hdGlvbi5xdWVyeXMgPSBwYXJhbXMucGFnaW5hdGlvbi5xdWVyeXMgPyBwYXJhbXMucGFnaW5hdGlvbi5xdWVyeXMuY29uY2F0KHRoaXMudHJlZVF1ZXJ5cykgOiB0aGlzLnRyZWVRdWVyeXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy/miorov4fmu6TmoJHnmoTmnaHku7bkuZ/mi7zmjqXov5vljrsKICAgICAgICAgICAgaWYgKHRoaXMudHJlZVF1ZXJ5cyAmJiB0aGlzLnRyZWVRdWVyeXMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgIHBhcmFtcy5wYWdpbmF0aW9uLnF1ZXJ5cyA9IHBhcmFtcy5wYWdpbmF0aW9uLnF1ZXJ5cyA/IHBhcmFtcy5wYWdpbmF0aW9uLnF1ZXJ5cy5jb25jYXQodGhpcy50cmVlUXVlcnlzKSA6IHRoaXMudHJlZVF1ZXJ5czsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy/mlbDmja7op4blm77mjqfku7YKICAgICAgICAgICAgaWYgKHRoaXMuZGF0YVZpZXcpIHsKICAgICAgICAgICAgICB0aGlzLmhhbmRlbEJpbmRGaWxlZFZhbHVhKCk7CiAgICAgICAgICAgICAgcGFyYW1zLnJlZklkVmFsdWUgPSB0aGlzLmRhdGFWaWV3LnJlZklkVmFsdWU7CiAgICAgICAgICAgICAgLy/lhbPogZTmn6Xor6LlrZfmrrUKICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhVmlldy5zZWxlY3RMaXN0ICYmIHRoaXMuZGF0YVZpZXcuc2VsZWN0TGlzdC5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBwYXJhbXMuc2VsZWN0TGlzdCA9IHRoaXMuZGF0YVZpZXcuc2VsZWN0TGlzdDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHRoaXNfID0gdGhpczsKICAgICAgICAgICAgaWYgKHRoaXNfLmlzSm9pbkZsb3cpIHsKICAgICAgICAgICAgICBwYXJhbXMuaXNKb2luRmxvdyA9IHRydWU7CiAgICAgICAgICAgICAgcGFyYW1zLnRhc2tUeXBlID0gdGhpc18udGFza1R5cGU7CiAgICAgICAgICAgICAgcGFyYW1zLmRlZktleSA9IHRoaXNfLmRlZktleTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJC5pc0VtcHR5T2JqZWN0KHRoaXMuc2VhcmNoRm9ybSkpIHsKICAgICAgICAgICAgICB0aGlzLiRzdG9yZS5kaXNwYXRjaCgnZm9ybS9nZXRCcG1UZW1wbGF0ZUJ5UGFnaW5hdGlvbicsIHBhcmFtcykudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgIHRoaXNfLnJvd3MgPSByZXNwb25zZS5kYXRhLnJvd3M7CiAgICAgICAgICAgICAgICB0aGlzXy50b3RhbCA9IHJlc3BvbnNlLmRhdGEudG90YWw7CiAgICAgICAgICAgICAgICB0aGlzXy5wYWdpbmF0aW9uLnBhZ2UgPSByZXNwb25zZS5kYXRhLnBhZ2U7CiAgICAgICAgICAgICAgICB0aGlzXy5wYWdpbmF0aW9uLnBhZ2VTaXplID0gcmVzcG9uc2UuZGF0YS5wYWdlU2l6ZTsKICAgICAgICAgICAgICAgIGxvYWRpbmcuY2xvc2UoKTsKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0aGlzLiRzdG9yZS5kaXNwYXRjaCgnZm9ybS9nZXRCcG1UZW1wbGF0ZUJ5UGFnaW5hdGlvbicsIHBhcmFtcykudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgIHRoaXNfLnJvd3MgPSByZXNwb25zZS5kYXRhLnJvd3M7CiAgICAgICAgICAgICAgICB0aGlzXy50b3RhbCA9IHJlc3BvbnNlLmRhdGEudG90YWw7CiAgICAgICAgICAgICAgICB0aGlzXy5wYWdpbmF0aW9uLnBhZ2UgPSByZXNwb25zZS5kYXRhLnBhZ2U7CiAgICAgICAgICAgICAgICB0aGlzXy5wYWdpbmF0aW9uLnBhZ2VTaXplID0gcmVzcG9uc2UuZGF0YS5wYWdlU2l6ZTsKICAgICAgICAgICAgICAgIGxvYWRpbmcuY2xvc2UoKTsKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIGdldFF1ZXJ5RmlsdGVyOiBmdW5jdGlvbiBnZXRRdWVyeUZpbHRlcigpIHsKICAgICAgICAgICAgdmFyIF90aGlzNiA9IHRoaXM7CiAgICAgICAgICAgIHZhciBvcGVyYXRpb25NYXAgPSB0aGlzLmdldFNlYXJjaEl0ZW1zKCk7CiAgICAgICAgICAgIHZhciBmaWVsZFR5cGVNYXAgPSB0aGlzLmdldEZpZWxkVHlwZSgpOwogICAgICAgICAgICB2YXIgc3BlY2lhbE1hcCA9IHRoaXMuZ2V0U3BlY2lhbE1hcCgpOwogICAgICAgICAgICB2YXIgcXVlcnlzID0gW107IC8v5p+l6K+i5p2h5Lu2CiAgICAgICAgICAgIHZhciBxdWVyeUZpbHRlciA9IHt9OwogICAgICAgICAgICB2YXIgcGFnZUJlYW4gPSB7CiAgICAgICAgICAgICAgcGFnZUJlYW46IHRoaXMucGFnaW5hdGlvbgogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgcGFyYW1zID0gewogICAgICAgICAgICAgIHRlbXBsYXRlSWQ6IHRoaXMudGVtcGxhdGVJbmZvLmlkCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHBhcmFtcy5wYWdpbmF0aW9uID0gcGFnZUJlYW47CiAgICAgICAgICAgIGlmICgkLmlzRW1wdHlPYmplY3QodGhpcy5zZWFyY2hGb3JtKSkgewogICAgICAgICAgICAgIHJldHVybiBwYXJhbXM7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3Aoa2V5KSB7CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIF90aGlzNi5zZWFyY2hGb3JtW2tleV0gIT0gJ3VuZGVmaW5lZCcgJiYgX3RoaXM2LnNlYXJjaEZvcm1ba2V5XSAhPSAnJyAmJiBfdGhpczYuc2VhcmNoRm9ybVtrZXldICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgaWYgKF90aGlzNi5zZWFyY2hGb3JtW2tleV0gaW5zdGFuY2VvZiBBcnJheSkgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgX3RoaXM2LnNlYXJjaEZvcm1ba2V5XS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgcXVlcnlzLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eToga2V5LAogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogX3RoaXM2LnNlYXJjaEZvcm1ba2V5XVtpXSwKICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXA6ICdtYWluJywKICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uOiBvcGVyYXRpb25NYXBba2V5XSwKICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb246ICdBTkQnCiAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoX3RoaXM2LnNlYXJjaEZvcm1ba2V5XS5pbmNsdWRlcygnLCcpICYmICFzcGVjaWFsTWFwW2tleV0pIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYXJyID0gX3RoaXM2LnNlYXJjaEZvcm1ba2V5XS5zcGxpdCgnLCcpOwogICAgICAgICAgICAgICAgICAgIGFyci5mb3JFYWNoKGZ1bmN0aW9uICh2KSB7CiAgICAgICAgICAgICAgICAgICAgICBxdWVyeXMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5OiBrZXksCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB2LAogICAgICAgICAgICAgICAgICAgICAgICBncm91cDogJ21haW4nLAogICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb246IG9wZXJhdGlvbk1hcFtrZXldLAogICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbjogJ0FORCcKICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IF90aGlzNi5zZWFyY2hGb3JtW2tleV07CiAgICAgICAgICAgICAgICAgICAgLy/mlbTmlbDnsbvlnosKICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRUeXBlTWFwW2tleV0gJiYgZmllbGRUeXBlTWFwW2tleV0gPT0gJ251bWJlcicpIHsKICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gcGFyc2VGbG9hdChfdGhpczYuc2VhcmNoRm9ybVtrZXldKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcXVlcnlzLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk6IGtleSwKICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgIGdyb3VwOiAnbWFpbicsCiAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb246IG9wZXJhdGlvbk1hcFtrZXldLAogICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb246ICdBTkQnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiB0aGlzLnNlYXJjaEZvcm0pIHsKICAgICAgICAgICAgICAgIF9sb29wKGtleSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHRoaXMuY2xlYXJRdWVyeUJ5R3JvdXBOYW1lKHF1ZXJ5cywgJ2ZpbHRlcicpOwogICAgICAgICAgICAgIC8vIOWwhui/h+a7pOadoeS7tua3u+WKoOafpeivouWPguaVsOaVsOe7hOS4rQogICAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlcnMgJiYgT2JqZWN0LmtleXModGhpcy5maWx0ZXJzKS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICB2YXIgcHJlZml4ID0gdGhpcy50ZW1wbGF0ZUluZm8uaXNFeHRlcm5hbCA9PT0gMSA/ICcnIDogJ0ZfJzsKICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHRoaXMuZmlsdGVycykuZm9yRWFjaChmdW5jdGlvbiAoaykgewogICAgICAgICAgICAgICAgICB2YXIgZmlsdGVyID0gX3RoaXM2LmZpbHRlcnNba107CiAgICAgICAgICAgICAgICAgIHZhciBxdWVyeSA9IHsKICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eTogcHJlZml4ICsgaywKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZmlsdGVyWzBdLAogICAgICAgICAgICAgICAgICAgIGdyb3VwOiAnZmlsdGVyJywKICAgICAgICAgICAgICAgICAgICByZWxhdGlvbjogJ0FORCcKICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgaWYgKGZpbHRlci5sZW5ndGggPT0gMSkgewogICAgICAgICAgICAgICAgICAgIHF1ZXJ5Lm9wZXJhdGlvbiA9ICdFUVVBTCc7CiAgICAgICAgICAgICAgICAgICAgcXVlcnlzLnB1c2gocXVlcnkpOwogICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpbHRlci5sZW5ndGggPiAxKSB7CiAgICAgICAgICAgICAgICAgICAgcXVlcnkub3BlcmF0aW9uID0gJ0lOJzsKICAgICAgICAgICAgICAgICAgICBxdWVyeS52YWx1ZSA9IGZpbHRlcjsKICAgICAgICAgICAgICAgICAgICBxdWVyeXMucHVzaChxdWVyeSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBxdWVyeUZpbHRlciA9IHsKICAgICAgICAgICAgICAgIHBhZ2VCZWFuOiB0aGlzLnBhZ2luYXRpb24sCiAgICAgICAgICAgICAgICBxdWVyeXM6IHF1ZXJ5cwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgLy/lpoLmnpzmnInorr7nva7pu5jorqTmjpLluo8s5LyY5YWI5L2/55So6buY6K6k5o6S5bqPCiAgICAgICAgICAgICAgaWYgKHRoaXMudGVtcGxhdGVJbmZvLnNvcnRGaWVsZCkgewogICAgICAgICAgICAgICAgdmFyIHNvcnRGaWVsZCA9IEpTT04ucGFyc2UodGhpcy50ZW1wbGF0ZUluZm8uc29ydEZpZWxkKTsKICAgICAgICAgICAgICAgIHZhciBzb3J0ZXIgPSBbXTsKICAgICAgICAgICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgc29ydEZpZWxkLmxlbmd0aDsgeCsrKSB7CiAgICAgICAgICAgICAgICAgIHNvcnRlci5wdXNoKHsKICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eTogc29ydEZpZWxkW3hdLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uOiBzb3J0RmllbGRbeF0uc29ydAogICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHF1ZXJ5RmlsdGVyLnNvcnRlciA9IHNvcnRlcjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHRoaXMuc29ydGVyICYmIHRoaXMuc29ydGVyLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIHF1ZXJ5RmlsdGVyLnNvcnRlciA9IHRoaXMuc29ydGVyOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBwYXJhbXMucGFnaW5hdGlvbiA9IHF1ZXJ5RmlsdGVyOwogICAgICAgICAgICAgIHJldHVybiBwYXJhbXM7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICAvLyDpgJrov4fliIbnu4TlkI3np7DmuIXpmaTlr7nlupTmn6Xor6LmnaHku7YKICAgICAgICAgIGNsZWFyUXVlcnlCeUdyb3VwTmFtZTogZnVuY3Rpb24gY2xlYXJRdWVyeUJ5R3JvdXBOYW1lKHF1ZXJ5cywgZ3JvdXBOYW1lKSB7CiAgICAgICAgICAgIC8vIOW+heWIoOmZpOeahOafpeivouadoeS7tgogICAgICAgICAgICB2YXIgdG9EZWxldGUgPSBbXTsKICAgICAgICAgICAgcXVlcnlzICYmIHF1ZXJ5cy5mb3JFYWNoKGZ1bmN0aW9uIChxdWVyeSkgewogICAgICAgICAgICAgIGlmIChxdWVyeS5ncm91cCA9PSBncm91cE5hbWUpIHsKICAgICAgICAgICAgICAgIHRvRGVsZXRlLnB1c2gocXVlcnkpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHRvRGVsZXRlLmZvckVhY2goZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICBxdWVyeXMucmVtb3ZlKGQpOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0sCiAgICAgICAgICBoYW5kbGVTb3J0Q2hhbmdlOiBmdW5jdGlvbiBoYW5kbGVTb3J0Q2hhbmdlKGNvbHVtbikgewogICAgICAgICAgICBpZiAoIWNvbHVtbi5vcmRlcikgewogICAgICAgICAgICAgIHRoaXMuc29ydGVyID0gbnVsbDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0aGlzLnNvcnRlciA9IFt7CiAgICAgICAgICAgICAgICBwcm9wZXJ0eTogY29sdW1uLnByb3AsCiAgICAgICAgICAgICAgICBkaXJlY3Rpb246IGNvbHVtbi5vcmRlciA9PSAnYXNjZW5kaW5nJyA/ICdBU0MnIDogJ0RFU0MnCiAgICAgICAgICAgICAgfV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5zZWFyY2goKTsKICAgICAgICAgIH0sCiAgICAgICAgICBoYW5kbGVGaWx0ZXJDaGFuZ2U6IGZ1bmN0aW9uIGhhbmRsZUZpbHRlckNoYW5nZShtKSB7CiAgICAgICAgICAgIHZhciBfdGhpczcgPSB0aGlzOwogICAgICAgICAgICB0aGlzLmZpbHRlcnMgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHRoaXMuZmlsdGVycyksIG0pOwogICAgICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmZpbHRlcnMpLmZvckVhY2goZnVuY3Rpb24gKGspIHsKICAgICAgICAgICAgICBpZiAoIV90aGlzNy5maWx0ZXJzW2tdIHx8IF90aGlzNy5maWx0ZXJzW2tdLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgICAgICAgICBkZWxldGUgX3RoaXM3LmZpbHRlcnNba107CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5zZWFyY2goKTsKICAgICAgICAgIH0sCiAgICAgICAgICBnZXRTZWFyY2hJdGVtczogZnVuY3Rpb24gZ2V0U2VhcmNoSXRlbXMoKSB7CiAgICAgICAgICAgIHZhciBzZWFyY2hJdGVtcyA9ICQoJy5zZWFyY2gtaXRlbScpOwogICAgICAgICAgICB2YXIgb3BlcmF0aW9uTWFwID0ge307CiAgICAgICAgICAgIHZhciBvcGVyYXRpb25UeXBlID0gewogICAgICAgICAgICAgIGxpa2U6ICdMSUtFJywKICAgICAgICAgICAgICBlcXVhbDogJ0VRVUFMJywKICAgICAgICAgICAgICBiZXR3ZWVuOiAnQkVUV0VFTicsCiAgICAgICAgICAgICAgbGVmdF9saWtlOiAnTEVGVF9MSUtFJywKICAgICAgICAgICAgICByaWdodF9saWtlOiAnUklHSFRfTElLRScKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKHNlYXJjaEl0ZW1zKSB7CiAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWFyY2hJdGVtcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgdmFyIG9wZXJhdGlvbiA9ICc9JzsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgJChzZWFyY2hJdGVtc1tpXSkuYXR0cignaHQtcXVlcnknKSAhPSAndW5kZWZpbmVkJykgewogICAgICAgICAgICAgICAgICBvcGVyYXRpb24gPSAkKHNlYXJjaEl0ZW1zW2ldKS5hdHRyKCdvcGVyYXRpb24nKTsKICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uTWFwWyQoc2VhcmNoSXRlbXNbaV0pLmF0dHIoJ2h0LXF1ZXJ5JyldID0gdHlwZW9mIG9wZXJhdGlvblR5cGVbb3BlcmF0aW9uXSAhPSAndW5kZWZpbmVkJyA/IG9wZXJhdGlvblR5cGVbb3BlcmF0aW9uXSA6IG9wZXJhdGlvbjsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mICQoc2VhcmNoSXRlbXNbaV0pLmNoaWxkcmVuKCkuYXR0cignaHQtcXVlcnknKSAhPSAndW5kZWZpbmVkJykgewogICAgICAgICAgICAgICAgICBvcGVyYXRpb24gPSAkKHNlYXJjaEl0ZW1zW2ldKS5jaGlsZHJlbigpLmF0dHIoJ29wZXJhdGlvbicpOwogICAgICAgICAgICAgICAgICBvcGVyYXRpb25NYXBbJChzZWFyY2hJdGVtc1tpXSkuY2hpbGRyZW4oKS5hdHRyKCdodC1xdWVyeScpXSA9IHR5cGVvZiBvcGVyYXRpb25UeXBlW29wZXJhdGlvbl0gIT0gJ3VuZGVmaW5lZCcgPyBvcGVyYXRpb25UeXBlW29wZXJhdGlvbl0gOiBvcGVyYXRpb247CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBvcGVyYXRpb25NYXA7CiAgICAgICAgICB9LAogICAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbiBnZXRGaWVsZFR5cGUoKSB7CiAgICAgICAgICAgIHZhciBzZWFyY2hJdGVtcyA9ICQoJy5zZWFyY2gtaXRlbScpOwogICAgICAgICAgICB2YXIgb3BlcmF0aW9uTWFwID0ge307CiAgICAgICAgICAgIHZhciBvcGVyYXRpb25UeXBlID0gewogICAgICAgICAgICAgIG51bWJlcjogJ251bWJlcicsCiAgICAgICAgICAgICAgdGV4dDogJ3RleHQnCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmIChzZWFyY2hJdGVtcykgewogICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VhcmNoSXRlbXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIHZhciBvcGVyYXRpb24gPSAnPSc7CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mICQoc2VhcmNoSXRlbXNbaV0pLmF0dHIoJ2h0LXF1ZXJ5JykgIT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uID0gJChzZWFyY2hJdGVtc1tpXSkuYXR0cigndHlwZScpOwogICAgICAgICAgICAgICAgICBvcGVyYXRpb25NYXBbJChzZWFyY2hJdGVtc1tpXSkuYXR0cignaHQtcXVlcnknKV0gPSB0eXBlb2Ygb3BlcmF0aW9uVHlwZVtvcGVyYXRpb25dICE9ICd1bmRlZmluZWQnID8gb3BlcmF0aW9uVHlwZVtvcGVyYXRpb25dIDogb3BlcmF0aW9uOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgJChzZWFyY2hJdGVtc1tpXSkuY2hpbGRyZW4oKS5hdHRyKCdodC1xdWVyeScpICE9ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiA9ICQoc2VhcmNoSXRlbXNbaV0pLmNoaWxkcmVuKCkuYXR0cigndHlwZScpOwogICAgICAgICAgICAgICAgICBvcGVyYXRpb25NYXBbJChzZWFyY2hJdGVtc1tpXSkuY2hpbGRyZW4oKS5hdHRyKCdodC1xdWVyeScpXSA9IHR5cGVvZiBvcGVyYXRpb25UeXBlW29wZXJhdGlvbl0gIT0gJ3VuZGVmaW5lZCcgPyBvcGVyYXRpb25UeXBlW29wZXJhdGlvbl0gOiBvcGVyYXRpb247CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBvcGVyYXRpb25NYXA7CiAgICAgICAgICB9LAogICAgICAgICAgLy/ojrflj5bnibnmrormn6Xor6Lmg4XlhrXvvIjoh6rlrprkuYnlr7nor53moYbvvIkKICAgICAgICAgIGdldFNwZWNpYWxNYXA6IGZ1bmN0aW9uIGdldFNwZWNpYWxNYXAoKSB7CiAgICAgICAgICAgIHZhciBzZWFyY2hJdGVtcyA9ICQoJy5zZWFyY2gtaXRlbScpOwogICAgICAgICAgICB2YXIgZmllbGRRdWVyeU1hcCA9IHt9OyAvL+afpeivouadoeS7tuWtl+autQoKICAgICAgICAgICAgaWYgKHNlYXJjaEl0ZW1zKSB7CiAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWFyY2hJdGVtcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiAkKHNlYXJjaEl0ZW1zW2ldKS5hdHRyKCdodC1xdWVyeScpICE9ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICAgIC8v5p+l6K+i5p2h5Lu25a2X5q61CiAgICAgICAgICAgICAgICAgIGZpZWxkUXVlcnlNYXBbJChzZWFyY2hJdGVtc1tpXSkuYXR0cignaHQtcXVlcnknKV0gPSB0eXBlb2YgJChzZWFyY2hJdGVtc1tpXSkuYXR0cignc3BlY2lhbC1xdWVyeScpICE9ICd1bmRlZmluZWQnID8gdHJ1ZSA6IGZhbHNlOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgJChzZWFyY2hJdGVtc1tpXSkuY2hpbGRyZW4oKS5hdHRyKCdodC1xdWVyeScpICE9ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICAgIC8v5p+l6K+i5p2h5Lu25a2X5q61CiAgICAgICAgICAgICAgICAgIGZpZWxkUXVlcnlNYXBbJChzZWFyY2hJdGVtc1tpXSkuY2hpbGRyZW4oKS5hdHRyKCdodC1xdWVyeScpXSA9IHR5cGVvZiAkKHNlYXJjaEl0ZW1zW2ldKS5jaGlsZHJlbigpLmF0dHIoJ3NwZWNpYWwtcXVlcnknKSAhPSAndW5kZWZpbmVkJyA/IHRydWUgOiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZpZWxkUXVlcnlNYXA7CiAgICAgICAgICB9LAogICAgICAgICAgZ2V0Q29uZGl0aW9uUXVlcnk6IGZ1bmN0aW9uIGdldENvbmRpdGlvblF1ZXJ5KCkgewogICAgICAgICAgICB2YXIgX3RoaXM4ID0gdGhpczsKICAgICAgICAgICAgdmFyIHNlYXJjaEFsbCA9ICQoJy5zZWFyY2gtcXVlcnknKTsKICAgICAgICAgICAgdmFyIHZhbHVlcyA9ICcnOwogICAgICAgICAgICB2YXIgcXVlcnlzID0gW107IC8v5p+l6K+i5p2h5Lu2CiAgICAgICAgICAgIHZhciBxdWVyeUZpbHRlciA9IHt9OwogICAgICAgICAgICB2YXIgcGFnZUJlYW4gPSB7CiAgICAgICAgICAgICAgcGFnZUJlYW46IHRoaXMucGFnaW5hdGlvbgogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgcGFyYW1zID0gewogICAgICAgICAgICAgIHRlbXBsYXRlSWQ6IHRoaXMudGVtcGxhdGVJbmZvLmlkCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHBhcmFtcy5wYWdpbmF0aW9uID0gcGFnZUJlYW47CgogICAgICAgICAgICAvLyDlsIbov4fmu6TmnaHku7bmt7vliqDmn6Xor6Llj4LmlbDmlbDnu4TkuK0KICAgICAgICAgICAgaWYgKHRoaXMuZmlsdGVycyAmJiBPYmplY3Qua2V5cyh0aGlzLmZpbHRlcnMpLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICB2YXIgcHJlZml4ID0gdGhpcy50ZW1wbGF0ZUluZm8uaXNFeHRlcm5hbCA9PT0gMSA/ICcnIDogJ0ZfJzsKICAgICAgICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmZpbHRlcnMpLmZvckVhY2goZnVuY3Rpb24gKGspIHsKICAgICAgICAgICAgICAgIHZhciBmaWx0ZXIgPSBfdGhpczguZmlsdGVyc1trXTsKICAgICAgICAgICAgICAgIHZhciBxdWVyeSA9IHsKICAgICAgICAgICAgICAgICAgcHJvcGVydHk6IHByZWZpeCArIGssCiAgICAgICAgICAgICAgICAgIHZhbHVlOiBmaWx0ZXJbMF0sCiAgICAgICAgICAgICAgICAgIGdyb3VwOiAnZmlsdGVyJywKICAgICAgICAgICAgICAgICAgcmVsYXRpb246ICdBTkQnCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgaWYgKGZpbHRlci5sZW5ndGggPT0gMSkgewogICAgICAgICAgICAgICAgICBxdWVyeS5vcGVyYXRpb24gPSAnRVFVQUwnOwogICAgICAgICAgICAgICAgICBxdWVyeXMucHVzaChxdWVyeSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpbHRlci5sZW5ndGggPiAxKSB7CiAgICAgICAgICAgICAgICAgIHF1ZXJ5Lm9wZXJhdGlvbiA9ICdJTic7CiAgICAgICAgICAgICAgICAgIHF1ZXJ5LnZhbHVlID0gZmlsdGVyOwogICAgICAgICAgICAgICAgICBxdWVyeXMucHVzaChxdWVyeSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMucXVlcnlGb3JtLnF1ZXJ5RGF0YSA9PSAnJykgewogICAgICAgICAgICAgIHF1ZXJ5RmlsdGVyID0gewogICAgICAgICAgICAgICAgcGFnZUJlYW46IHRoaXMucGFnaW5hdGlvbiwKICAgICAgICAgICAgICAgIHF1ZXJ5czogcXVlcnlzCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICBwYXJhbXMucGFnaW5hdGlvbiA9IHF1ZXJ5RmlsdGVyOwogICAgICAgICAgICAgIHJldHVybiBwYXJhbXM7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgaWYgKHR5cGVvZiAkKCQoc2VhcmNoQWxsWzBdKS5jaGlsZHJlbigpWzBdKS5hdHRyKCdodC1xdWljay1zZWFyY2gnKSAhPSAndW5kZWZpbmVkJykgewogICAgICAgICAgICAgICAgdmFsdWVzID0gJCgkKHNlYXJjaEFsbFswXSkuY2hpbGRyZW4oKVswXSkuYXR0cignaHQtcXVpY2stc2VhcmNoJyk7CiAgICAgICAgICAgICAgICB2YXIgYXJyID0gdmFsdWVzLnNwbGl0KCcsJyk7CiAgICAgICAgICAgICAgICB2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoYXJyKSwKICAgICAgICAgICAgICAgICAgX3N0ZXA7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICBmb3IgKF9pdGVyYXRvci5zKCk7ICEoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lOykgewogICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IF9zdGVwLnZhbHVlOwogICAgICAgICAgICAgICAgICAgIHF1ZXJ5cy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5OiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLnF1ZXJ5Rm9ybS5xdWVyeURhdGEsCiAgICAgICAgICAgICAgICAgICAgICBncm91cDogJ21haW4nLAogICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uOiAnTElLRScsCiAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbjogJ09SJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgICAgX2l0ZXJhdG9yLmUoZXJyKTsKICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgIF9pdGVyYXRvci5mKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHF1ZXJ5RmlsdGVyID0gewogICAgICAgICAgICAgIHBhZ2VCZWFuOiB0aGlzLnBhZ2luYXRpb24sCiAgICAgICAgICAgICAgcXVlcnlzOiBxdWVyeXMKICAgICAgICAgICAgfTsKICAgICAgICAgICAgcGFyYW1zLnBhZ2luYXRpb24gPSBxdWVyeUZpbHRlcjsKICAgICAgICAgICAgcmV0dXJuIHBhcmFtczsKICAgICAgICAgIH0sCiAgICAgICAgICAvL+aJk+W8gOmrmOe6p+ajgOe0ogogICAgICAgICAgYWR2YW5jZWQ6IGZ1bmN0aW9uIGFkdmFuY2VkKCkgewogICAgICAgICAgICB0aGlzLmZvcm1UeXBlID0gIXRoaXMuZm9ybVR5cGU7CiAgICAgICAgICAgIGlmICh0aGlzLmZvcm1UeXBlKSB7CiAgICAgICAgICAgICAgdGhpcy5pbmNvbnMgPSAnZWwtaWNvbi1hcnJvdy11cCc7CiAgICAgICAgICAgICAgdGhpcy5xdWVyeUZvcm0ucXVlcnlEYXRhID0gJyc7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdGhpcy5pbmNvbnMgPSAnZWwtaWNvbi1hcnJvdy1kb3duJzsKICAgICAgICAgICAgICB0aGlzLnNlYXJjaEZvcm0gPSB7fTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIC8v5Zue6L2m5p+l6K+iCiAgICAgICAgICBzZWFyY2hFbnRlckZ1bjogZnVuY3Rpb24gc2VhcmNoRW50ZXJGdW4oZSkgewogICAgICAgICAgICB2YXIga2V5Q29kZSA9IHdpbmRvdy5ldmVudCA/IGUua2V5Q29kZSA6IGUud2hpY2g7CiAgICAgICAgICAgIGlmIChrZXlDb2RlID09IDEzKSB7CiAgICAgICAgICAgICAgdGhpcy5zZWFyY2goJ2ZpbmQnKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIHJlc2V0OiBmdW5jdGlvbiByZXNldChmbGFnKSB7CiAgICAgICAgICAgIHRoaXMucXVlcnlGb3JtLnF1ZXJ5RGF0YSA9ICcnOwogICAgICAgICAgICBpZiAodGhpcy50ZW1wbGF0ZUluZm8uY29uZGl0aW9uRmllbGQpIHsKICAgICAgICAgICAgICB2YXIgY29uZGl0aW9uRmllbGQgPSB1dGlscy5wYXJzZVRvSnNvbih0aGlzLnRlbXBsYXRlSW5mby5jb25kaXRpb25GaWVsZCk7CiAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25kaXRpb25GaWVsZC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgdmFyIGZpZWxkTmFtZSA9ICdGXycgKyBjb25kaXRpb25GaWVsZFtpXS5uYW1lOwogICAgICAgICAgICAgICAgdGhpcy4kc2V0KHRoaXMuc2VhcmNoRm9ybSwgZmllbGROYW1lLCAnJyk7CiAgICAgICAgICAgICAgICB0aGlzLiRzZXQodGhpcy5zZWFyY2hGb3JtLCBjb25kaXRpb25GaWVsZFtpXS5uYW1lLCAnJyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuZmlsdGVycyA9IHt9OwogICAgICAgICAgICB0aGlzLiRyZWZzLm11bHRpcGxlVGVtcGxhdGVUYWJsZS5jbGVhckZpbHRlcigpOwogICAgICAgICAgICBpZiAoIWZsYWcpIHsKICAgICAgICAgICAgICB0aGlzLnNlYXJjaCgnZmluZCcpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgaGFuZGxlU2VsZWN0aW9uQ2hhbmdlOiBmdW5jdGlvbiBoYW5kbGVTZWxlY3Rpb25DaGFuZ2UodmFsKSB7CiAgICAgICAgICAgIHRoaXMudGFibGVEYXRhLnNlbGVjdFJvd3MgPSB2YWw7CiAgICAgICAgICB9LAogICAgICAgICAgZGVsZXRlZDogZnVuY3Rpb24gZGVsZXRlZCgpIHsKICAgICAgICAgICAgdmFyIF90aGlzOSA9IHRoaXM7CiAgICAgICAgICAgIGlmICh0aGlzLnRhYmxlRGF0YS5zZWxlY3RSb3dzID09IG51bGwgfHwgdGhpcy50YWJsZURhdGEuc2VsZWN0Um93cy5sZW5ndGggPT0gMCkgewogICAgICAgICAgICAgIHRoaXMuJG1lc3NhZ2Uud2FybmluZygn6K+36YCJ5oup5paH5Lu25Yig6ZmkIScpOwogICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLiRjb25maXJtKCfmraTmk43kvZzlsIbliKDpmaTor6Xmlofku7YsIOaYr+WQpue7p+e7rT8nLCAn5o+Q56S6JywgewogICAgICAgICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiAn56Gu5a6aJywKICAgICAgICAgICAgICBjYW5jZWxCdXR0b25UZXh0OiAn5Y+W5raIJywKICAgICAgICAgICAgICB0eXBlOiAnd2FybmluZycKICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgdmFyIHMgPSBbXTsKICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IF90aGlzOS50YWJsZURhdGEuc2VsZWN0Um93cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgcy5wdXNoKF90aGlzOS50YWJsZURhdGEuc2VsZWN0Um93c1tpXVtfdGhpczkudGVtcGxhdGVJbmZvLnBrRmllbGRdKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdmFyIGRhdGEgPSB7CiAgICAgICAgICAgICAgICBpZHM6IHMuam9pbignLCcpLAogICAgICAgICAgICAgICAgYm9BbGlhczogX3RoaXM5LnRlbXBsYXRlSW5mby5ib0RlZkFsaWFzCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICBfdGhpczkuJHN0b3JlLmRpc3BhdGNoKCdmb3JtL2RlbGV0ZVRlbXBsYXRlRGF0YUJ5SWQnLCBkYXRhKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIF90aGlzOS5wYWdpbmF0aW9uLnBhZ2UgPSAxOwogICAgICAgICAgICAgICAgX3RoaXM5LnNlYXJjaCgpOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgX3RoaXM5LiRtZXNzYWdlKHsKICAgICAgICAgICAgICAgIHR5cGU6ICdpbmZvJywKICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICflt7Llj5bmtojliKDpmaQnCiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSwKICAgICAgICAgIGRlbDogZnVuY3Rpb24gZGVsKGlkKSB7CiAgICAgICAgICAgIHZhciBfdGhpczEwID0gdGhpczsKICAgICAgICAgICAgdGhpcy4kY29uZmlybSgn5q2k5pON5L2c5bCG5Yig6Zmk6K+l5pWw5o2uLCDmmK/lkKbnu6fnu60/JywgJ+aPkOekuicsIHsKICAgICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogJ+ehruWumicsCiAgICAgICAgICAgICAgY2FuY2VsQnV0dG9uVGV4dDogJ+WPlua2iCcsCiAgICAgICAgICAgICAgdHlwZTogJ3dhcm5pbmcnCiAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgIHZhciBkYXRhID0gewogICAgICAgICAgICAgICAgaWRzOiBpZCwKICAgICAgICAgICAgICAgIGJvQWxpYXM6IF90aGlzMTAudGVtcGxhdGVJbmZvLmJvRGVmQWxpYXMKICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIF90aGlzMTAuJHN0b3JlLmRpc3BhdGNoKCdmb3JtL2RlbGV0ZVRlbXBsYXRlRGF0YUJ5SWQnLCBkYXRhKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIF90aGlzMTAucGFnaW5hdGlvbi5wYWdlID0gMTsKICAgICAgICAgICAgICAgIF90aGlzMTAuc2VhcmNoKCk7CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICBfdGhpczEwLiRtZXNzYWdlKHsKICAgICAgICAgICAgICAgIHR5cGU6ICdpbmZvJywKICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICflt7Llj5bmtojliKDpmaQnCiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSwKICAgICAgICAgIG9wZXJhdGluZzogZnVuY3Rpb24gb3BlcmF0aW5nKHRlbXBsYXRlSWQsIGlkLCBhY3Rpb24sIGRlZklkLCBpc1N0YXJ0Rmxvdywgb3BlblR5cGUpIHsKICAgICAgICAgICAgLy9pc1N0YXJ0RmxvdyDvvIhmYWxzZe+8muWPr+S7peWPkei1t+a1geeoi++8jHRydWXvvJrkuI3lj6/ku6Xlj5HotbfmtYHnqIvvvIkKICAgICAgICAgICAgaWYgKHRoaXMudGVtcGxhdGVJbmZvLm1hbmFnZUZpZWxkICYmICFpc1N0YXJ0RmxvdykgewogICAgICAgICAgICAgIC8v5YWI6YWN572u5LiN6IO95Y+R6LW35rWB56iLCiAgICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSAnYWRkJyAmJiBpc1N0YXJ0RmxvdyA9PSAnJykgewogICAgICAgICAgICAgICAgaXNTdGFydEZsb3cgPSB0cnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoYWN0aW9uID09ICdlZGl0JyAmJiBpc1N0YXJ0RmxvdyA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgIGlzU3RhcnRGbG93ID0gdHJ1ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgLy/lho3liKTmlq3mmK/lkKblj6/ku6Xlj5HotbfmtYHnqIsKICAgICAgICAgICAgICB2YXIgbWFuYWdlRmllbGQgPSBKU09OLnBhcnNlKHRoaXMudGVtcGxhdGVJbmZvLm1hbmFnZUZpZWxkKTsKICAgICAgICAgICAgICAvL+WIpOaWreaYr+WQpumFjee9ruS6huWPkei1t+a1geeoi+aMiemSrgogICAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgbWFuYWdlRmllbGQubGVuZ3RoOyBrKyspIHsKICAgICAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gJ2FkZCcgJiYgbWFuYWdlRmllbGRba10ubmFtZSA9PSAnc3RhcnRGbG93JykgewogICAgICAgICAgICAgICAgICBpc1N0YXJ0RmxvdyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uID09ICdlZGl0JyAmJiBtYW5hZ2VGaWVsZFtrXS5uYW1lID09ICdzdGFydEZsb3cnKSB7CiAgICAgICAgICAgICAgICAgIGlzU3RhcnRGbG93ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXRlbXBsYXRlSWQpIHsKICAgICAgICAgICAgICB0ZW1wbGF0ZUlkID0gdGhpcy50ZW1wbGF0ZUluZm8uaWQ7CiAgICAgICAgICAgICAgYWN0aW9uID0gYWN0aW9uID09ICdzZWxlY3QnID8gJ2dldCcgOiAnYWRkJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAvL+aVsOaNruinhuWbvumaj+acuua3u+WKoOWIsOWFtuS7luiPnOWNleS4i+mdouaXtuiOt+WPluW9k+WJjeiPnOWNleeahOWIq+WQjSAg5bm25LiU5b2T5YmN5pWw5o2u6KeG5Zu+5LiN5piv6KGo5Y2V6YeM55qE5pWw5o2u6KeG5Zu+ICBkYXRhVmlldwogICAgICAgICAgICBpZiAoc2Vzc2lvblN0b3JhZ2UubWVudV9hbGlhcyAmJiAhdGhpcy5kYXRhVmlldyAmJiAhdGhpcy5pZ25vcmVkQWxpYXMuaW5jbHVkZXMoc2Vzc2lvblN0b3JhZ2UubWVudV9hbGlhcykpIHsKICAgICAgICAgICAgICB0aGlzLmFsaWFzX25ldyA9IHNlc3Npb25TdG9yYWdlLm1lbnVfYWxpYXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHVybCA9ICcvJyArIHRoaXMuYWxpYXNfbmV3ICsgJy90ZW1wbGF0ZS9mb3JtLycgKyB0aGlzLnRlbXBsYXRlS2V5ICsgJy8nICsgYWN0aW9uOwogICAgICAgICAgICBpZiAodGhpcy5pc0pvaW5GbG93KSB7CiAgICAgICAgICAgICAgdGhpcy5hbGlhc19uZXcgPSAnc3RhdGVtZW50JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5zaW5nbGUgPT0gJ3RydWUnKSB7CiAgICAgICAgICAgICAgdXJsID0gJy8nICsgdGhpcy5hbGlhc19uZXcgKyAnL3RlbXBsYXRlL2Zvcm0vJyArIHRoaXMudGVtcGxhdGVLZXkgKyAnLycgKyBhY3Rpb24gKyAnL3RydWUnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8v5Yik5pat5pWw5o2u6KeG5Zu+5o6n5Lu2CiAgICAgICAgICAgIHZhciBpc0RhdGFWaWV3ID0gZmFsc2U7CiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFWaWV3KSB7CiAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YVZpZXcuYm9EZWZBbGlhcyAmJiB0aGlzLmRhdGFWaWV3LmJvRGVmQWxpYXMgIT0gJycpIHsKICAgICAgICAgICAgICAgIGlzRGF0YVZpZXcgPSB0cnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAob3BlblR5cGUgPT0gJ25ldycgfHwgdGhpcy5pc0pvaW5GbG93IHx8IGlzRGF0YVZpZXcpIHsKICAgICAgICAgICAgICB1cmwgKz0gJy9uZXcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpZCkgewogICAgICAgICAgICAgIHVybCA9IHVybCArICc/aWQ9JyArIGlkICsgJyYnOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHVybCArPSAnPyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHN0YXJ0Rmxvd1N0ciA9ICdzdGFydEZsb3c9ZmFsc2UnOwogICAgICAgICAgICBpZiAoYWN0aW9uID09ICdhZGQnICYmIGRlZklkICYmIGlzU3RhcnRGbG93ID09PSBmYWxzZSkgewogICAgICAgICAgICAgIHN0YXJ0Rmxvd1N0ciA9ICdzdGFydEZsb3c9dHJ1ZSc7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoaWQgJiYgaXNTdGFydEZsb3cgPT09IGZhbHNlICYmIGRlZklkKSB7CiAgICAgICAgICAgICAgc3RhcnRGbG93U3RyID0gJ3N0YXJ0Rmxvdz10cnVlJzsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgZGF0YVVybCA9ICcnOwogICAgICAgICAgICBpZiAodGhpcy5kYXRhVmlldykgewogICAgICAgICAgICAgIGlmICh0aGlzLmRhdGFWaWV3LmJpbmRMaXN0ICYmIHRoaXMuZGF0YVZpZXcuYmluZExpc3QubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgdmFyIGJpbmRMaXN0ID0gW107CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZGF0YVZpZXcuYmluZExpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSB7CiAgICAgICAgICAgICAgICAgICAga2V5OiB0aGlzLmRhdGFWaWV3LmJpbmRMaXN0W2ldLmJpbmRGaWxsZCwKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5kYXRhVmlldy5iaW5kTGlzdFtpXS5maWxsVmFsdWUKICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgYmluZExpc3QucHVzaChpdGVtKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRhdGFVcmwgPSAnJmJpbmRMaXN0PScgKyBlbmNvZGVVUklDb21wb25lbnQoQmFzZTY0LmVuY29kZShKU09OLnN0cmluZ2lmeShiaW5kTGlzdCkpKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHBhdGggPSB1cmwgKyBzdGFydEZsb3dTdHI7CiAgICAgICAgICAgIGlmIChkYXRhVXJsICE9ICcnKSB7CiAgICAgICAgICAgICAgcGF0aCA9IHVybCArIHN0YXJ0Rmxvd1N0ciArIGRhdGFVcmw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGVidWdnZXI7CiAgICAgICAgICAgIC8vVE9ETyDlpoLmnpzmmK/mqKHlnZflvIDlj5Eg5YWo6YOo5bey5paw56qX5Y+j5omT5byACiAgICAgICAgICAgIGlmIChvcGVuVHlwZSA9PSAnbmV3JyB8fCB0aGlzLmlzSm9pbkZsb3cgfHwgaXNEYXRhVmlldykgewogICAgICAgICAgICAgIHdpbmRvdy5vcGVuKHRoaXMuJHJvdXRlci5yZXNvbHZlKHBhdGgucmVwbGFjZSh0aGlzLmFsaWFzX25ldywgJ3N0YXRlbWVudCcpICsgJyZpc05ld1BhZ2U9dHJ1ZScpLmhyZWYsICdfYmxhbmsnKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBpZiAocGF0aC5pbmRleE9mKCdvdGhlcm1lbnUnKSAhPSAtMSkgewogICAgICAgICAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgnL290aGVybWVudScsICcvc3RhdGVtZW50Jyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHRoaXMuJHJvdXRlci5wdXNoKHBhdGgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgb3BlblVybDogZnVuY3Rpb24gb3BlblVybCh1cmwsIHR5cGUsIHJvdywgZmllbGROYW1lKSB7CiAgICAgICAgICAgIGlmIChyb3cgJiYgZmllbGROYW1lKSB7CiAgICAgICAgICAgICAgdXJsID0gdGhpcy5oYW5kbGVkVXJsUGFyYW1zKHVybCwgcm93LCBmaWVsZE5hbWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0eXBlID09ICduZXcnKSB7CiAgICAgICAgICAgICAgd2luZG93Lm9wZW4odXJsLCAnX2JsYW5rJyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB1cmw7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICBoYW5kbGVkVXJsUGFyYW1zOiBmdW5jdGlvbiBoYW5kbGVkVXJsUGFyYW1zKHVybCwgcm93LCBmaWVsZE5hbWUpIHsKICAgICAgICAgICAgaWYgKHRoaXMudGVtcGxhdGVJbmZvLmRpc3BsYXlGaWVsZCkgewogICAgICAgICAgICAgIHZhciBkaXNwbGF5RmllbGRzID0gSlNPTi5wYXJzZSh0aGlzLnRlbXBsYXRlSW5mby5kaXNwbGF5RmllbGQpOwogICAgICAgICAgICAgIGRpc3BsYXlGaWVsZHMuZm9yRWFjaChmdW5jdGlvbiAoZGlzcGxheSkgewogICAgICAgICAgICAgICAgaWYgKGRpc3BsYXkubmFtZSA9PSBmaWVsZE5hbWUpIHsKICAgICAgICAgICAgICAgICAgaWYgKGRpc3BsYXkudXJsUGFyYW1zICYmIGRpc3BsYXkudXJsUGFyYW1zLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdXJsUGFyYW1zID0gZGlzcGxheS51cmxQYXJhbXM7CiAgICAgICAgICAgICAgICAgICAgdmFyIHN1ZmZpeCA9ICcnOwogICAgICAgICAgICAgICAgICAgIHVybFBhcmFtcy5mb3JFYWNoKGZ1bmN0aW9uIChwYXJhbSkgewogICAgICAgICAgICAgICAgICAgICAgaWYgKHN1ZmZpeCkgewogICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXggKz0gJyYnOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgc3VmZml4ID0gc3VmZml4ICsgcGFyYW0ubmFtZSArICc9JyArIHJvd1twYXJhbS5maWVsZF07CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN1ZmZpeCkgewogICAgICAgICAgICAgICAgICAgICAgaWYgKHVybC5pbmRleE9mKCc/JykgIT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gdXJsICsgJyYnICsgc3VmZml4OwogICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gdXJsICsgJz8nICsgc3VmZml4OwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVybDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgcmV0dXJuIHVybDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdXJsOwogICAgICAgICAgfSwKICAgICAgICAgIHZpZXdSZXBvcnQ6IGZ1bmN0aW9uIHZpZXdSZXBvcnQoZGF0YSwganNvblN0ciwgb3BlblR5cGUpIHsKICAgICAgICAgICAgdmFyIGl0ZW0gPSBKU09OLnBhcnNlKEJhc2U2NC5kZWNvZGUoanNvblN0cikpOwogICAgICAgICAgICB2YXIgY29uZGl0aW9uRmllbGQgPSBpdGVtLmNvbmRpdGlvbkZpZWxkOwogICAgICAgICAgICB2YXIgcXVlcnlzID0gW107CiAgICAgICAgICAgIGlmIChjb25kaXRpb25GaWVsZCAmJiBjb25kaXRpb25GaWVsZC5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgY29uZGl0aW9uRmllbGQuZm9yRWFjaChmdW5jdGlvbiAob2JqKSB7CiAgICAgICAgICAgICAgICBpZiAob2JqLnBhcmFtZXRlcikgewogICAgICAgICAgICAgICAgICBxdWVyeXMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk6IG9iai5rZXksCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGRhdGFbb2JqLnBhcmFtZXRlcl0sCiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6ICdtYWluJywKICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb246IG9iai5xdCwKICAgICAgICAgICAgICAgICAgICByZWxhdGlvbjogJ0FORCcKICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy/mlbDmja7pmo/mnLrmt7vliqDliLDlhbbku5boj5zljZXkuIvpnaLml7bojrflj5blvZPliY3oj5zljZXnmoTliKvlkI0KICAgICAgICAgICAgaWYgKHNlc3Npb25TdG9yYWdlLm1lbnVfYWxpYXMpIHsKICAgICAgICAgICAgICB0aGlzLmFsaWFzX25ldyA9IHNlc3Npb25TdG9yYWdlLm1lbnVfYWxpYXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHVybCA9ICcvJyArIHRoaXMuYWxpYXNfbmV3ICsgJy90ZW1wbGF0ZS9wcmV2aWV3LycgKyBpdGVtLmFsaWFzICsgJy9mYWxzZS8nICsgZW5jb2RlVVJJQ29tcG9uZW50KEJhc2U2NC5lbmNvZGUoSlNPTi5zdHJpbmdpZnkocXVlcnlzKSkpOwogICAgICAgICAgICAvL3VybCDovaznoIHpmLLmraLmnInmlpzmnaAg5a+86Ie06Lev55Sx6Lez6L2s5LiN5a+5CiAgICAgICAgICAgIGlmIChvcGVuVHlwZSA9PSAnbmV3JykgewogICAgICAgICAgICAgIHdpbmRvdy5vcGVuKHRoaXMuJHJvdXRlci5yZXNvbHZlKHVybCkuaHJlZiwgJ19ibGFuaycpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHRoaXMuJHJvdXRlci5wdXNoKHVybCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICBzdGFydEZsb3c6IGZ1bmN0aW9uIHN0YXJ0RmxvdyhpZCkgewogICAgICAgICAgICB2YXIgX3RoaXMxMSA9IHRoaXM7CiAgICAgICAgICAgIHZhciBkYXRhID0gewogICAgICAgICAgICAgIGRlZktleTogdGhpcy50ZW1wbGF0ZUluZm8uZGVmSWQsCiAgICAgICAgICAgICAgYnVzaW5lc3NLZXk6IGlkLAogICAgICAgICAgICAgIGJvQWxpYXM6IHRoaXMudGVtcGxhdGVJbmZvLmJvRGVmQWxpYXMKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIGxvYWRpbmdJbnN0YW5jZSA9IExvYWRpbmcuc2VydmljZSh7CiAgICAgICAgICAgICAgZnVsbHNjcmVlbjogdHJ1ZQogICAgICAgICAgICB9KTsgLy/lvIDlp4sKICAgICAgICAgICAgdGhpcy4kc3RvcmUuZGlzcGF0Y2goJ3N0b3JlUHJvY2Vzcy9zdGFydEZvcm0nLCBkYXRhKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHsKICAgICAgICAgICAgICBsb2FkaW5nSW5zdGFuY2UuY2xvc2UoKTsgLy8g57uT5p2fCiAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGF0ZSkgewogICAgICAgICAgICAgICAgX3RoaXMxMS4kbWVzc2FnZS5zdWNjZXNzKHJlc3VsdC5tZXNzYWdlKTsKICAgICAgICAgICAgICAgIF90aGlzMTEuc2VhcmNoKCk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIF90aGlzMTEuZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIF90aGlzMTEuJG1lc3NhZ2UuZXJyb3IocmVzdWx0Lm1lc3NhZ2UpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICB9LAogICAgICAgICAgLy/ngrnlh7vlr7zlh7rmjInpkq4KICAgICAgICAgIGV4cG9ydHM6IGZ1bmN0aW9uIGV4cG9ydHMoZXhwb3J0U2V0dGluZ0ZpZWxkcykgewogICAgICAgICAgICB2YXIgX3RoaXMxMiA9IHRoaXM7CiAgICAgICAgICAgIHZhciBkaXNwbGF5RmllbGRzID0gW107CiAgICAgICAgICAgIGlmIChleHBvcnRTZXR0aW5nRmllbGRzKSB7CiAgICAgICAgICAgICAgZGlzcGxheUZpZWxkcyA9IEpTT04ucGFyc2UoQmFzZTY0LmRlY29kZShleHBvcnRTZXR0aW5nRmllbGRzKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRpc3BsYXlGaWVsZHMubGVuZ3RoID09IDAgJiYgdGhpcy50ZW1wbGF0ZUluZm8uZGlzcGxheUZpZWxkKSB7CiAgICAgICAgICAgICAgZGlzcGxheUZpZWxkcyA9IEpTT04ucGFyc2UodGhpcy50ZW1wbGF0ZUluZm8uZGlzcGxheUZpZWxkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmV4cG9ydFR5cGUgPSAnbWFpbic7CiAgICAgICAgICAgIHRoaXMuZGlzcGxheUZpZWxkcyA9IFtdOwogICAgICAgICAgICBkaXNwbGF5RmllbGRzLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICAgICAgICBpZiAoaXRlbS50eXBlKSB7CiAgICAgICAgICAgICAgICBfdGhpczEyLmRpc3BsYXlGaWVsZHMucHVzaChpdGVtKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLmRpYWxvZ0V4cG9ydFZpc2libGUgPSB0cnVlOwogICAgICAgICAgfSwKICAgICAgICAgIGltcG9ydENvbW1hbmQ6IGZ1bmN0aW9uIGltcG9ydENvbW1hbmQocGFyYW1zKSB7CiAgICAgICAgICAgIHN3aXRjaCAocGFyYW1zLmNvbW1hbmQpIHsKICAgICAgICAgICAgICBjYXNlICdkb3dubG9hZFRlbXBGaWxlJzoKICAgICAgICAgICAgICAgIHRoaXMuZG93bmxvYWRNYWluVGVtcEZpbGUoKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGNhc2UgJ2ltcG9ydE1haW4nOgogICAgICAgICAgICAgICAgdGhpcy5pbXBvcnRNYWluKCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBjYXNlICdsb2cnOgogICAgICAgICAgICAgICAgdGhpcy5vcGVuTG9nKCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICBvcGVuTG9nOiBmdW5jdGlvbiBvcGVuTG9nKCkgewogICAgICAgICAgICB0aGlzLmRpYWxvZ1Zpc2libGUgPSB0cnVlOwogICAgICAgICAgfSwKICAgICAgICAgIGRvd25sb2FkTWFpblRlbXBGaWxlOiBmdW5jdGlvbiBkb3dubG9hZE1haW5UZW1wRmlsZSgpIHsKICAgICAgICAgICAgdmFyIGN1c3RvbVRlbXBsYXRlSWQgPSAnJzsKICAgICAgICAgICAgaWYgKHRoaXMudGVtcGxhdGVJbmZvICYmIHRoaXMudGVtcGxhdGVJbmZvLm1hbmFnZUZpZWxkKSB7CiAgICAgICAgICAgICAgdmFyIG1hbmFnZUZpZWxkTGlzdCA9IEpTT04ucGFyc2UodGhpcy50ZW1wbGF0ZUluZm8ubWFuYWdlRmllbGQpOwogICAgICAgICAgICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBtYW5hZ2VGaWVsZExpc3QubGVuZ3RoOyBpbmRleCsrKSB7CiAgICAgICAgICAgICAgICB2YXIgbWFuYWdlID0gbWFuYWdlRmllbGRMaXN0W2luZGV4XTsKICAgICAgICAgICAgICAgIGlmIChtYW5hZ2UubmFtZSA9PSAnaW1wb3J0JykgewogICAgICAgICAgICAgICAgICBpZiAobWFuYWdlLmltcG9ydFRlbXBsYXRlICYmIG1hbmFnZS5pbXBvcnRUZW1wbGF0ZS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgY3VzdG9tVGVtcGxhdGVJZCA9IG1hbmFnZS5pbXBvcnRUZW1wbGF0ZVswXS5pZDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGN1c3RvbVRlbXBsYXRlSWQpIHsKICAgICAgICAgICAgICB0aGlzLiRzdG9yZS5kaXNwYXRjaCgnbWVudS9kb3dubG9hZEZpbGUnLCBjdXN0b21UZW1wbGF0ZUlkKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB2YXIgbG9hZGluZ0luc3RhbmNlID0gTG9hZGluZy5zZXJ2aWNlKHsKICAgICAgICAgICAgICAgIGZ1bGxzY3JlZW46IHRydWUKICAgICAgICAgICAgICB9KTsgLy/lvIDlp4sKICAgICAgICAgICAgICB0aGlzLiRzdG9yZS5kaXNwYXRjaCgnZm9ybS9kb3dubG9hZE1haW5UZW1wRmlsZScsIHRoaXMudGVtcGxhdGVJbmZvLmFsaWFzKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGxvYWRpbmdJbnN0YW5jZS5jbG9zZSgpOyAvLyDnu5PmnZ8KICAgICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoYykgewogICAgICAgICAgICAgICAgbG9hZGluZ0luc3RhbmNlLmNsb3NlKCk7CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICBpbXBvcnRNYWluOiBmdW5jdGlvbiBpbXBvcnRNYWluKHBhcmFtKSB7CiAgICAgICAgICAgIHZhciBfdGhpczEzID0gdGhpczsKICAgICAgICAgICAgdmFyIGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CiAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlsZScsIHBhcmFtLmZpbGUpOwogICAgICAgICAgICB2YXIgcGFyYW1zID0gewogICAgICAgICAgICAgIGRhdGE6IGZvcm1EYXRhLAogICAgICAgICAgICAgIGFsaWFzOiB0aGlzLnRlbXBsYXRlSW5mby5hbGlhcwogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAodGhpcy5kYXRhVmlldykgewogICAgICAgICAgICAgIHRoaXMuaGFuZGVsQmluZEZpbGVkVmFsdWEoKTsKICAgICAgICAgICAgICBwYXJhbXMuYmluZEZpbGxkID0gdGhpcy5kYXRhVmlldy5iaW5kRmlsbGQgfHwgJyc7CiAgICAgICAgICAgICAgcGFyYW1zLmZpbGxWYWx1ZSA9IHRoaXMuZGF0YVZpZXcuZmlsbFZhbHVlIHx8ICcnOwogICAgICAgICAgICAgIHBhcmFtcy5yZWZJZFZhbHVlID0gdGhpcy5kYXRhVmlldy5yZWZJZFZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBsb2FkaW5nSW5zdGFuY2UgPSBMb2FkaW5nLnNlcnZpY2UoewogICAgICAgICAgICAgIGZ1bGxzY3JlZW46IHRydWUKICAgICAgICAgICAgfSk7IC8v5byA5aeLCiAgICAgICAgICAgIGZvcm0ubWFpbkltcG9ydChwYXJhbXMsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgICAgbG9hZGluZ0luc3RhbmNlLmNsb3NlKCk7IC8vIOe7k+adnwogICAgICAgICAgICAgIGlmIChkYXRhLnN0YXRlKSB7CiAgICAgICAgICAgICAgICAvL+WvvOWFpeaIkOWKn+S5i+WQjumHjeaWsOa4suafk+W9k+WJjee7hOS7tgogICAgICAgICAgICAgICAgX3RoaXMxMy4kcGFyZW50LnJlZnJlc2hUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CiAgICAgICAgICAgICAgICBfdGhpczEzLiRtZXNzYWdlKHsKICAgICAgICAgICAgICAgICAgdHlwZTogJ3N1Y2Nlc3MnLAogICAgICAgICAgICAgICAgICBtZXNzYWdlOiBkYXRhLm1lc3NhZ2UKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgcGFyYW0ub25TdWNjZXNzKCk7CiAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnZm9ybUltcG9ydFRlbXBSZWZJZCcpKSB7CiAgICAgICAgICAgICAgICAgIHZhciBqc29uID0gSlNPTi5wYXJzZShkYXRhLnZhbHVlKTsKICAgICAgICAgICAgICAgICAganNvbi5ib0FsaWFzID0gX3RoaXMxMy5kYXRhVmlldy5ib0RlZkFsaWFzOwogICAgICAgICAgICAgICAgICB2YXIgb2xkQ29uZiA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ2Zvcm1JbXBvcnRUZW1wSnNvbicpOwogICAgICAgICAgICAgICAgICBpZiAoIW9sZENvbmYpIHsKICAgICAgICAgICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCdmb3JtSW1wb3J0VGVtcEpzb24nLCBKU09OLnN0cmluZ2lmeShbanNvbl0pKTsKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2YXIgb2xkSm9zbiA9IEpTT04ucGFyc2Uob2xkQ29uZik7CiAgICAgICAgICAgICAgICAgICAgdmFyIGlzSW5PbGRKb3NuID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IG9sZEpvc24ubGVuZ3RoOyBpbmRleCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICB2YXIgb2xkID0gb2xkSm9zbltpbmRleF07CiAgICAgICAgICAgICAgICAgICAgICBpZiAob2xkLnRhYk5hbWUgPT0ganNvbi50YWJOYW1lICYmIG9sZC5iaW5kRmlsbGQgPT0ganNvbi5iaW5kRmlsbGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaXNJbk9sZEpvc24gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0luT2xkSm9zbikgewogICAgICAgICAgICAgICAgICAgICAgb2xkSm9zbi5wdXNoKGpzb24pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCdmb3JtSW1wb3J0VGVtcEpzb24nLCBKU09OLnN0cmluZ2lmeShvbGRKb3NuKSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF90aGlzMTMuc2VhcmNoKCk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHBhcmFtLm9uRXJyb3IoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSwKICAgICAgICAgIC8v5pi+56S65a2Q6KGo5a+56K+d5qGGCiAgICAgICAgICBzaG93U3ViTGlzdDogZnVuY3Rpb24gc2hvd1N1Ykxpc3QocmVmSWQpIHsKICAgICAgICAgICAgdGhpcy5yZWZJZCA9IHJlZklkOwogICAgICAgICAgICB0aGlzLmdldFN1YkVudHNCeUZvcm1LZXkocmVmSWQpOwogICAgICAgICAgfSwKICAgICAgICAgIC8v5pi+56S65L+u5pS56K6w5b2VCiAgICAgICAgICBvcGVuUmVjb3JkTGlzdDogZnVuY3Rpb24gb3BlblJlY29yZExpc3QocmVmSWQpIHsKICAgICAgICAgICAgdmFyIF90aGlzMTQgPSB0aGlzOwogICAgICAgICAgICB0aGlzLmRpYWxvZ1JlY29yZFZpc2libGUgPSB0cnVlOwogICAgICAgICAgICB0aGlzLnJlY29yZFJlZklkID0gcmVmSWQ7CiAgICAgICAgICAgIHZhciBwYXJhbSA9IHsKICAgICAgICAgICAgICBwYWdlQmVhbjogewogICAgICAgICAgICAgICAgcGFnZTogMSwKICAgICAgICAgICAgICAgIHBhZ2VTaXplOiAyMCwKICAgICAgICAgICAgICAgIHNob3dUb3RhbDogdHJ1ZQogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgc29ydGVyOiBbewogICAgICAgICAgICAgICAgZGlyZWN0aW9uOiAnQVNDJywKICAgICAgICAgICAgICAgIHByb3BlcnR5OiAnbW9kaWZ5VGltZScKICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICBxdWVyeXM6IFt7CiAgICAgICAgICAgICAgICBwcm9wZXJ0eTogJ3JlZl9pZF8nLAogICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMucmVjb3JkUmVmSWQsCiAgICAgICAgICAgICAgICBncm91cDogJ21haW4nLAogICAgICAgICAgICAgICAgb3BlcmF0aW9uOiAnRVFVQUwnLAogICAgICAgICAgICAgICAgcmVsYXRpb246ICdBTkQnCiAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgdGhpcy5yZWNvcmRUYWJsZUxvYWRpbmcgPSB0cnVlOwogICAgICAgICAgICB2YXIgdXJsID0gJyR7YnBtUnVuVGltZX0vYnBtL2JvRGF0YU1vZGlmeVJlY29yZC92MS9saXN0SnNvbic7CiAgICAgICAgICAgIHJlcS5wb3N0KHVybCwgcGFyYW0pLnRoZW4oZnVuY3Rpb24gKHJlc3ApIHsKICAgICAgICAgICAgICBfdGhpczE0LnJlY29yZFRhYmxlTG9hZGluZyA9IGZhbHNlOwogICAgICAgICAgICAgIF90aGlzMTQucmVjb3JkTGlzdCA9IHJlc3AuZGF0YS5yb3dzOwogICAgICAgICAgICAgIF90aGlzMTQubW9kaWZ5UmVjb3JkLnBhZ2luYXRpb24ucGFnZUJlYW4gPSB7CiAgICAgICAgICAgICAgICBwYWdlU2l6ZTogcmVzcC5kYXRhLnBhZ2VTaXplLAogICAgICAgICAgICAgICAgcGFnZTogcmVzcC5kYXRhLnBhZ2UsCiAgICAgICAgICAgICAgICB0b3RhbDogcmVzcC5kYXRhLnRvdGFsCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9LAogICAgICAgICAgaGFuZGxlUmVjb3JkQ3VycmVudENoYW5nZTogZnVuY3Rpb24gaGFuZGxlUmVjb3JkQ3VycmVudENoYW5nZShpbmRleCwgbW9kaWZ5UmVjb3JkKSB7CiAgICAgICAgICAgIHZhciBfdGhpczE1ID0gdGhpczsKICAgICAgICAgICAgbW9kaWZ5UmVjb3JkLnBhZ2luYXRpb24ucGFnZUJlYW4ucGFnZSA9IGluZGV4OwogICAgICAgICAgICB2YXIgcGFyYW0gPSB7CiAgICAgICAgICAgICAgcGFnZUJlYW46IG1vZGlmeVJlY29yZC5wYWdpbmF0aW9uLnBhZ2VCZWFuLAogICAgICAgICAgICAgIHNvcnRlcjogW3sKICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogJ0FTQycsCiAgICAgICAgICAgICAgICBwcm9wZXJ0eTogJ21vZGlmeVRpbWUnCiAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgcXVlcnlzOiBbewogICAgICAgICAgICAgICAgcHJvcGVydHk6ICdyZWZfaWRfJywKICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLnJlY29yZFJlZklkLAogICAgICAgICAgICAgICAgZ3JvdXA6ICdtYWluJywKICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogJ0VRVUFMJywKICAgICAgICAgICAgICAgIHJlbGF0aW9uOiAnQU5EJwogICAgICAgICAgICAgIH1dCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMucmVjb3JkVGFibGVMb2FkaW5nID0gdHJ1ZTsKICAgICAgICAgICAgdmFyIHVybCA9ICcke2JwbVJ1blRpbWV9L2JwbS9ib0RhdGFNb2RpZnlSZWNvcmQvdjEvbGlzdEpzb24nOwogICAgICAgICAgICByZXEucG9zdCh1cmwsIHBhcmFtKS50aGVuKGZ1bmN0aW9uIChyZXNwKSB7CiAgICAgICAgICAgICAgX3RoaXMxNS5yZWNvcmRUYWJsZUxvYWRpbmcgPSBmYWxzZTsKICAgICAgICAgICAgICBfdGhpczE1LnJlY29yZExpc3QgPSByZXNwLmRhdGEucm93czsKICAgICAgICAgICAgICBfdGhpczE1Lm1vZGlmeVJlY29yZC5wYWdpbmF0aW9uLnBhZ2VCZWFuID0gewogICAgICAgICAgICAgICAgcGFnZVNpemU6IHJlc3AuZGF0YS5wYWdlU2l6ZSwKICAgICAgICAgICAgICAgIHBhZ2U6IHJlc3AuZGF0YS5wYWdlLAogICAgICAgICAgICAgICAgdG90YWw6IHJlc3AuZGF0YS50b3RhbAogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSwKICAgICAgICAgIC8v5Y+W5raI5L+u5pS56K6w5b2V5a+56K+d5qGGCiAgICAgICAgICByZWNvcmRDYW5jZWw6IGZ1bmN0aW9uIHJlY29yZENhbmNlbCgpIHsKICAgICAgICAgICAgdGhpcy5kaWFsb2dSZWNvcmRWaXNpYmxlID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMucmVjb3JkTGlzdCA9IFtdOwogICAgICAgICAgICB0aGlzLnJlY29yZFJlZklkID0gJyc7CiAgICAgICAgICAgIHRoaXMubW9kaWZ5UmVjb3JkID0gewogICAgICAgICAgICAgIHBhZ2luYXRpb246IHsKICAgICAgICAgICAgICAgIHBhZ2VCZWFuOiB7CiAgICAgICAgICAgICAgICAgIHBhZ2U6IDEsCiAgICAgICAgICAgICAgICAgIHBhZ2VTaXplOiAyMCwKICAgICAgICAgICAgICAgICAgdG90YWw6IDAKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICB9LAogICAgICAgICAgLy8KICAgICAgICAgIG9wZW5Nb2RpZnlEZXRhaWw6IGZ1bmN0aW9uIG9wZW5Nb2RpZnlEZXRhaWwocm93KSB7CiAgICAgICAgICAgIHRoaXMuY3VycmVudE1vZGlmeSA9IHJvdzsKICAgICAgICAgICAgdGhpcy5tb2RpZnlEZXRhaWxEaWFsb2dWaXNpYmxlID0gdHJ1ZTsKICAgICAgICAgIH0sCiAgICAgICAgICAvL+afpeeci+S/ruaUueiusOW9leivpuaDhQogICAgICAgICAgc2hvd01vZGlmeVJlY29yZDogZnVuY3Rpb24gc2hvd01vZGlmeVJlY29yZChpZCwgcmVmSWQpIHsKICAgICAgICAgICAgdmFyIHVybCA9ICcvc3RhdGVtZW50L3RlbXBsYXRlL2Zvcm0vJyArIHRoaXMudGVtcGxhdGVLZXkgKyAnL2dldC90cnVlJyArICc/aWQ9JyArIHJlZklkICsgJyZzdGFydEZsb3c9ZmFsc2UmcmVjb3JkSWQ9JyArIGlkICsgJyZpc05ld1BhZ2U9dHJ1ZSc7CiAgICAgICAgICAgIHdpbmRvdy5vcGVuKHRoaXMuJHJvdXRlci5yZXNvbHZlKHVybCkuaHJlZiwgJ19ibGFuaycpOwogICAgICAgICAgfSwKICAgICAgICAgIC8v56Gu5a6a5a+85Ye6CiAgICAgICAgICBzdWJtaXRFeHBvcnQ6IGZ1bmN0aW9uIHN1Ym1pdEV4cG9ydCgpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLmV4cG9ydERhdGEgfHwgdGhpcy5leHBvcnREYXRhLmV4cEZpZWxkLmxlbmd0aCA8IDEpIHsKICAgICAgICAgICAgICB0aGlzLiRtZXNzYWdlKHsKICAgICAgICAgICAgICAgIHR5cGU6ICdpbmZvJywKICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICfor7fpgInmi6nopoHlr7zlh7rnmoTlrZfmrrXvvIEnCiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLmV4cG9ydFR5cGUgPT09ICdtYWluJykgdGhpcy5leHBvcnRNYWluKCk7ZWxzZSB0aGlzLmV4cG9ydFN1YkRhdGEodGhpcy5leHBvcnREYXRhLmV4cEZpZWxkLCB0aGlzLnJlZklkLCB0aGlzLmN1cnJlbnRUYWIuZW50TmFtZSk7CiAgICAgICAgICB9LAogICAgICAgICAgZXhwb3J0TWFpbjogZnVuY3Rpb24gZXhwb3J0TWFpbigpIHsKICAgICAgICAgICAgdmFyIF90aGlzMTYgPSB0aGlzOwogICAgICAgICAgICB2YXIgZXhwRmllbGQgPSAnJzsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmV4cG9ydERhdGEuZXhwRmllbGQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKICAgICAgICAgICAgICAgIGV4cEZpZWxkICs9ICcsJzsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgZXhwRmllbGQgKz0gdGhpcy5leHBvcnREYXRhLmV4cEZpZWxkW2ldLm5hbWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZXhwRmllbGQgPSBCYXNlNjQuZW5jb2RlKGV4cEZpZWxkKTsKICAgICAgICAgICAgdmFyIGRhdGEgPSB7CiAgICAgICAgICAgICAgYm9BbGlhczogdGhpcy50ZW1wbGF0ZUluZm8uYWxpYXMsCiAgICAgICAgICAgICAgZ2V0VHlwZTogdGhpcy5leHBvcnREYXRhLmdldFR5cGUsCiAgICAgICAgICAgICAgZXhwRmllbGQ6IGV4cEZpZWxkLAogICAgICAgICAgICAgIGZpbHRlcktleTogJycKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZGF0YS5xdWVyeSA9IHRoaXMuZ2V0UXVlcnlGaWx0ZXIoKS5wYWdpbmF0aW9uOwogICAgICAgICAgICBpZiAodGhpcy5kYXRhVmlldyAmJiB0aGlzLmRhdGFWaWV3LmJpbmRTZWxlY3RkKSB7CiAgICAgICAgICAgICAgZGF0YS5xdWVyeS5xdWVyeXMucHVzaCh7CiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5kYXRhVmlldy5zZWxlY3RWYWx1ZSwKICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogJ0VRVUFMJywKICAgICAgICAgICAgICAgIHByb3BlcnR5OiAnRl8nICsgdGhpcy5kYXRhVmlldy5iaW5kU2VsZWN0ZAogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBsb2FkaW5nSW5zdGFuY2UgPSBMb2FkaW5nLnNlcnZpY2UoewogICAgICAgICAgICAgIGZ1bGxzY3JlZW46IHRydWUKICAgICAgICAgICAgfSk7IC8v5byA5aeLCiAgICAgICAgICAgIHRoaXMuJHN0b3JlLmRpc3BhdGNoKCdmb3JtL3RlbXBsYXRlRXhwb3J0JywgZGF0YSkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgbG9hZGluZ0luc3RhbmNlLmNsb3NlKCk7IC8vIOe7k+adnwogICAgICAgICAgICAgIF90aGlzMTYuZGlhbG9nRXhwb3J0VmlzaWJsZSA9IGZhbHNlOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IHRoaXMuc3ViRGlzcGxheUZpZWxkc0xpc3QubGVuZ3RoOyBfaSsrKSB7CiAgICAgICAgICAgICAgdGhpcy5leHBvcnRTdWJEYXRhKHRoaXMuJHJlZnNbJ3N1YkV4cG9ydFRhYmxlJ11bX2ldLnNlbGVjdGlvbiwgJycsIHRoaXMuc3ViRGlzcGxheUZpZWxkc0xpc3RbX2ldLm5hbWUpOwogICAgICAgICAgICAgIHRoaXMuJHNldCh0aGlzLiRyZWZzWydzdWJFeHBvcnRUYWJsZSddW19pXSwgJ3NlbGVjdGlvbicsIFtdKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIGV4cG9ydFN1YkRhdGE6IGZ1bmN0aW9uIGV4cG9ydFN1YkRhdGEoZXhwRmllbGRzLCByZWZJZCwgYWxpYXMpIHsKICAgICAgICAgICAgdmFyIF90aGlzMTcgPSB0aGlzOwogICAgICAgICAgICB2YXIgZXhwRmllbGQgPSBbXTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBleHBGaWVsZHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBleHBGaWVsZC5wdXNoKHsKICAgICAgICAgICAgICAgIGtleTogZXhwRmllbGRzW2ldLm5hbWUsCiAgICAgICAgICAgICAgICB2YWx1ZTogZXhwRmllbGRzW2ldLmRlc2MKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgZGF0YSA9IHsKICAgICAgICAgICAgICBhbGlhczogYWxpYXMsCiAgICAgICAgICAgICAgcmVmSWQ6IHJlZklkLAogICAgICAgICAgICAgIHR5cGU6IHRoaXMuZXhwb3J0RGF0YS5nZXRUeXBlLAogICAgICAgICAgICAgIGV4cEZpZWxkOiBKU09OLnN0cmluZ2lmeShleHBGaWVsZCksCiAgICAgICAgICAgICAgZmlsdGVyS2V5OiAnJwogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnF1ZXJ5RmlsdGVyID0gdGhpcy5jdXJyZW50VGFiLnBhZ2luYXRpb247CiAgICAgICAgICAgIHZhciBsb2FkaW5nSW5zdGFuY2UgPSBMb2FkaW5nLnNlcnZpY2UoewogICAgICAgICAgICAgIGZ1bGxzY3JlZW46IHRydWUKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGZvcm0uc3ViRXhwb3J0KGRhdGEsIGZ1bmN0aW9uIChyZXNwKSB7CiAgICAgICAgICAgICAgbG9hZGluZ0luc3RhbmNlLmNsb3NlKCk7CiAgICAgICAgICAgICAgX3RoaXMxNy5kaWFsb2dFeHBvcnRWaXNpYmxlID0gZmFsc2U7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSwKICAgICAgICAgIC8v5Y+W5raI5a+85Ye6CiAgICAgICAgICBleHBvcnRDYW5jZWw6IGZ1bmN0aW9uIGV4cG9ydENhbmNlbCgpIHsKICAgICAgICAgICAgdGhpcy5kaWFsb2dFeHBvcnRWaXNpYmxlID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuZXhwb3J0RGF0YS5leHBGaWVsZCA9IFtdOwogICAgICAgICAgfSwKICAgICAgICAgIC8v5Y+W5raI5a2Q6KGo5a+56K+d5qGGCiAgICAgICAgICBzdWJDYW5jZWw6IGZ1bmN0aW9uIHN1YkNhbmNlbCgpIHsKICAgICAgICAgICAgdGhpcy5kaWFsb2dTdWJWaXNpYmxlID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMudGFicyA9IFtdOwogICAgICAgICAgICB0aGlzLmVudHMgPSBbXTsKICAgICAgICAgIH0sCiAgICAgICAgICBzdW5DYW5jZWw6IGZ1bmN0aW9uIHN1bkNhbmNlbCgpIHsKICAgICAgICAgICAgdGhpcy5kaWFsb2dTdW5WaXNpYmxlID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuc3VuVGFicyA9IFtdOwogICAgICAgICAgfSwKICAgICAgICAgIGhhbmRsZUV4cG9ydFNlbGVjdGlvbkNoYW5nZTogZnVuY3Rpb24gaGFuZGxlRXhwb3J0U2VsZWN0aW9uQ2hhbmdlKHZhbCkgewogICAgICAgICAgICB0aGlzLmV4cG9ydERhdGEuZXhwRmllbGQgPSBbXTsKICAgICAgICAgICAgaWYgKHZhbCkgewogICAgICAgICAgICAgIHRoaXMuZXhwb3J0RGF0YS5leHBGaWVsZCA9IHZhbDsKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIC8v5YWo6YCJCiAgICAgICAgICBoYW5kbGVFeHBvcnRTZWxlY3RBbGw6IGZ1bmN0aW9uIGhhbmRsZUV4cG9ydFNlbGVjdEFsbCgpIHsKICAgICAgICAgICAgdGhpcy5leHBvcnREYXRhLmV4cEZpZWxkID0gdGhpcy5kaXNwbGF5RmllbGRzOwogICAgICAgICAgfSwKICAgICAgICAgIC8v5o6S5bqPCiAgICAgICAgICBzb3J0OiBmdW5jdGlvbiBzb3J0KGluZGV4LCB0eXBlKSB7CiAgICAgICAgICAgIGlmICgndXAnID09IHR5cGUpIHsKICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IDApIHsKICAgICAgICAgICAgICAgIHRoaXMuJG1lc3NhZ2UoewogICAgICAgICAgICAgICAgICBtZXNzYWdlOiAn5bey57uP5piv5YiX6KGo5Lit56ys5LiA5L2NJywKICAgICAgICAgICAgICAgICAgdHlwZTogJ3dhcm5pbmcnCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdmFyIHRlbXAgPSB0aGlzLmRpc3BsYXlGaWVsZHNbaW5kZXggLSAxXTsKICAgICAgICAgICAgICAgIHRoaXMuJHNldCh0aGlzLmRpc3BsYXlGaWVsZHMsIGluZGV4IC0gMSwgdGhpcy5kaXNwbGF5RmllbGRzW2luZGV4XSk7CiAgICAgICAgICAgICAgICB0aGlzLiRzZXQodGhpcy5kaXNwbGF5RmllbGRzLCBpbmRleCwgdGVtcCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGlmIChpbmRleCA9PT0gdGhpcy5kaXNwbGF5RmllbGRzLmxlbmd0aCAtIDEpIHsKICAgICAgICAgICAgICAgIHRoaXMuJG1lc3NhZ2UoewogICAgICAgICAgICAgICAgICBtZXNzYWdlOiAn5bey57uP5piv5YiX6KGo5Lit5pyA5ZCO5LiA5L2NJywKICAgICAgICAgICAgICAgICAgdHlwZTogJ3dhcm5pbmcnCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5pc1RyYW5zaXRpb24gPSB0cnVlOwogICAgICAgICAgICAgICAgdmFyIGkgPSB0aGlzLmRpc3BsYXlGaWVsZHNbaW5kZXggKyAxXTsKICAgICAgICAgICAgICAgIHRoaXMuJHNldCh0aGlzLmRpc3BsYXlGaWVsZHMsIGluZGV4ICsgMSwgdGhpcy5kaXNwbGF5RmllbGRzW2luZGV4XSk7CiAgICAgICAgICAgICAgICB0aGlzLiRzZXQodGhpcy5kaXNwbGF5RmllbGRzLCBpbmRleCwgaSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgZ2V0U3VuRGF0YTogZnVuY3Rpb24gZ2V0U3VuRGF0YSh0YWIsIHJvdykgewogICAgICAgICAgICB2YXIgX3RoaXMxOCA9IHRoaXM7CiAgICAgICAgICAgIHJldHVybiBfYXN5bmNUb0dlbmVyYXRvcigvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZSgpLm1hcmsoZnVuY3Rpb24gX2NhbGxlZSgpIHsKICAgICAgICAgICAgICB2YXIgZW50cywgcGssIHJlZklkLCBpLCBfdGFiOwogICAgICAgICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lKCkud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkgewogICAgICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHsKICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgIGVudHMgPSB0YWIuY2hpbGRFbnRzOwogICAgICAgICAgICAgICAgICAgIHBrID0gdGFiLnBrS2V5OwogICAgICAgICAgICAgICAgICAgIHJlZklkID0gJyc7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJvd1tway50b0xvY2FsZUxvd2VyQ2FzZSgpXSkgewogICAgICAgICAgICAgICAgICAgICAgcmVmSWQgPSByb3dbcGsudG9Mb2NhbGVMb3dlckNhc2UoKV07CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgIHJlZklkID0gcm93W3BrLnRvVXBwZXJDYXNlKCldOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBfdGhpczE4LnN1YlRhYmxlTG9hZGluZyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEoZW50cyAmJiBlbnRzLmxlbmd0aCA+IDApKSB7CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTU7CiAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaSA9IDA7CiAgICAgICAgICAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgICAgICAgICBpZiAoIShpIDwgZW50cy5sZW5ndGgpKSB7CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTU7CiAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDEwOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpczE4LmdldEJvRGF0YShlbnRzW2ldLCByZWZJZCk7CiAgICAgICAgICAgICAgICAgIGNhc2UgMTA6CiAgICAgICAgICAgICAgICAgICAgX3RhYiA9IF9jb250ZXh0LnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMxOC5zdW5UYWJzLnB1c2goX3RhYik7CiAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CiAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA3OwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICBjYXNlIDE1OgogICAgICAgICAgICAgICAgICAgIF90aGlzMTguc3ViVGFibGVMb2FkaW5nID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMxOC5kaWFsb2dTdW5WaXNpYmxlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgY2FzZSAxNzoKICAgICAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0sIF9jYWxsZWUpOwogICAgICAgICAgICB9KSkoKTsKICAgICAgICAgIH0sCiAgICAgICAgICBnZXRCb0RhdGE6IGZ1bmN0aW9uIGdldEJvRGF0YShlbnQsIHJlZklkKSB7CiAgICAgICAgICAgIHZhciBfdGhpczE5ID0gdGhpczsKICAgICAgICAgICAgdmFyIGF0dHJpYnV0ZUxpc3QgPSBlbnQuYXR0cmlidXRlTGlzdDsKICAgICAgICAgICAgdmFyIHRhYiA9IHsKICAgICAgICAgICAgICByZWZJZDogcmVmSWQsCiAgICAgICAgICAgICAgcGtLZXk6IGVudC5wa0tleSwKICAgICAgICAgICAgICBuYW1lOiBlbnQudGFibGVOYW1lLAogICAgICAgICAgICAgIGVudE5hbWU6IGVudC5uYW1lLAogICAgICAgICAgICAgIHRpdGxlOiBlbnQuY29tbWVudCwKICAgICAgICAgICAgICBhdHRyaWJ1dGVMaXN0OiBhdHRyaWJ1dGVMaXN0LAogICAgICAgICAgICAgIGNvbW1lbnQ6IGVudC5jb21tZW50LAogICAgICAgICAgICAgIHBhZ2luYXRpb246IHsKICAgICAgICAgICAgICAgIHBhZ2VCZWFuOiB7CiAgICAgICAgICAgICAgICAgIHBhZ2VTaXplOiAyMCwKICAgICAgICAgICAgICAgICAgcGFnZTogMSwKICAgICAgICAgICAgICAgICAgdG90YWw6IDAKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRhYi5jaGlsZEVudHMgPSBbXTsKICAgICAgICAgICAgaWYgKGVudC5jaGlsZEVudHMgJiYgZW50LmNoaWxkRW50cy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgdGFiLmNoaWxkRW50cyA9IGVudC5jaGlsZEVudHM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICBfdGhpczE5LiRzdG9yZS5kaXNwYXRjaCgnZm9ybS9nZXRTdWJEYXRhUGFnaW5hdGlvbicsIHsKICAgICAgICAgICAgICAgIHBhZ2luYXRpb246IHRhYi5wYWdpbmF0aW9uLAogICAgICAgICAgICAgICAgbmFtZTogZW50Lm5hbWUsCiAgICAgICAgICAgICAgICByZWZJZDogcmVmSWQKICAgICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLnJvd3MubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICB0YWIuZGF0YUxpc3QgPSBkYXRhLnJvd3M7CiAgICAgICAgICAgICAgICAgIHRhYi5wYWdpbmF0aW9uLnBhZ2VCZWFuLnBhZ2VTaXplID0gZGF0YS5wYWdlU2l6ZTsKICAgICAgICAgICAgICAgICAgdGFiLnBhZ2luYXRpb24ucGFnZUJlYW4ucGFnZSA9IGRhdGEucGFnZTsKICAgICAgICAgICAgICAgICAgdGFiLnBhZ2luYXRpb24ucGFnZUJlYW4udG90YWwgPSBkYXRhLnRvdGFsOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgdGFiLmRhdGFMaXN0ID0gW107CiAgICAgICAgICAgICAgICAgIHRhYi5wYWdpbmF0aW9uLnBhZ2VCZWFuLnBhZ2VTaXplID0gMTsKICAgICAgICAgICAgICAgICAgdGFiLnBhZ2luYXRpb24ucGFnZUJlYW4ucGFnZSA9IDE7CiAgICAgICAgICAgICAgICAgIHRhYi5wYWdpbmF0aW9uLnBhZ2VCZWFuLnRvdGFsID0gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJlc29sdmUodGFiKTsKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9LAogICAgICAgICAgZ2V0U3ViRW50c0J5Rm9ybUtleTogZnVuY3Rpb24gZ2V0U3ViRW50c0J5Rm9ybUtleShyZWZJZCkgewogICAgICAgICAgICAvKmlmICghdGhpcy5lbnRzIHx8IHRoaXMuZW50cy5sZW5ndGggPCAxKSB7DQogICAgICAgICAgICAgIGZvcm0uZ2V0U3ViRW50c0J5Rm9ybUtleSh0aGlzLnRlbXBsYXRlSW5mby5mb3JtS2V5LCAocmVzcCkgPT4gew0KICAgICAgICAgICAgICAgIC8vIOWtkOihqOS4juWtmeihqOWtl+auteWQjeiuvue9ruWwj+WGmQ0KICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzcC5kYXRhLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgICByZXNwLmRhdGFbaV0uYXR0cmlidXRlTGlzdC5mb3JFYWNoKGF0dHJpYnV0ZSA9PiB7DQogICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS5maWVsZE5hbWUgPSBhdHRyaWJ1dGUuZmllbGROYW1lLnRvTG93ZXJDYXNlKCk7DQogICAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAgICAgcmVzcC5kYXRhW2ldLmNoaWxkRW50cy5mb3JFYWNoKHNob3dDaGlsZEVudCA9PiB7DQogICAgICAgICAgICAgICAgICAgIHNob3dDaGlsZEVudC5hdHRyaWJ1dGVMaXN0LmZvckVhY2goYXR0cmlidXRlID0+IHsNCiAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUuZmllbGROYW1lID0gYXR0cmlidXRlLmZpZWxkTmFtZS50b0xvd2VyQ2FzZSgpOw0KICAgICAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgdGhpcy5lbnRzID0gcmVzcC5kYXRhOw0KICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0gZWxzZSB7Ki8KICAgICAgICAgICAgdGhpcy5nZXRTdWJEYXRhKHRoaXMsIHJlZklkKTsKICAgICAgICAgICAgLyogfSovCiAgICAgICAgICB9LAogICAgICAgICAgZ2V0U3ViRGF0YTogZnVuY3Rpb24gZ2V0U3ViRGF0YShfbWUsIHJlZklkKSB7CiAgICAgICAgICAgIHZhciBfdGhpczIwID0gdGhpczsKICAgICAgICAgICAgcmV0dXJuIF9hc3luY1RvR2VuZXJhdG9yKC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lKCkubWFyayhmdW5jdGlvbiBfY2FsbGVlMigpIHsKICAgICAgICAgICAgICB2YXIgZW50cywgaSwgdGFiOwogICAgICAgICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lKCkud3JhcChmdW5jdGlvbiBfY2FsbGVlMiQoX2NvbnRleHQyKSB7CiAgICAgICAgICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDIucHJldiA9IF9jb250ZXh0Mi5uZXh0KSB7CiAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAvL2xldCBlbnRzID0gdGhpcy5lbnRzOwogICAgICAgICAgICAgICAgICAgIGVudHMgPSBKU09OLnBhcnNlKF9tZS50ZW1wbGF0ZUluZm8uc3ViRmllbGQpOwogICAgICAgICAgICAgICAgICAgIGlmICghKGVudHMgJiYgZW50cy5sZW5ndGggPiAwKSkgewogICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAxMzsKICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpID0gMDsKICAgICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgICAgIGlmICghKGkgPCBlbnRzLmxlbmd0aCkpIHsKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMTM7CiAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZW50c1tpXS5hdHRyaWJ1dGVMaXN0LmZvckVhY2goZnVuY3Rpb24gKGF0dHIpIHsKICAgICAgICAgICAgICAgICAgICAgIGF0dHIuZmllbGROYW1lID0gYXR0ci5maWVsZE5hbWUudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBlbnRzW2ldLmNoaWxkRW50cy5mb3JFYWNoKGZ1bmN0aW9uIChzaG93Q2hpbGRFbnQpIHsKICAgICAgICAgICAgICAgICAgICAgIHNob3dDaGlsZEVudC5hdHRyaWJ1dGVMaXN0LmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUuZmllbGROYW1lID0gYXR0cmlidXRlLmZpZWxkTmFtZS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSA4OwogICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpczIwLmdldEJvRGF0YShlbnRzW2ldLCByZWZJZCk7CiAgICAgICAgICAgICAgICAgIGNhc2UgODoKICAgICAgICAgICAgICAgICAgICB0YWIgPSBfY29udGV4dDIuc2VudDsKICAgICAgICAgICAgICAgICAgICBfdGhpczIwLnRhYnMucHVzaCh0YWIpOwogICAgICAgICAgICAgICAgICBjYXNlIDEwOgogICAgICAgICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDM7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgIGNhc2UgMTM6CiAgICAgICAgICAgICAgICAgICAgX3RoaXMyMC5kaWFsb2dTdWJWaXNpYmxlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKICAgICAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9LCBfY2FsbGVlMik7CiAgICAgICAgICAgIH0pKSgpOwogICAgICAgICAgfSwKICAgICAgICAgIG5vZGVDbGljazogZnVuY3Rpb24gbm9kZUNsaWNrKG5vZGUpIHsKICAgICAgICAgICAgdmFyIGxvYWRpbmcgPSB0aGlzLiRsb2FkaW5nKHRoaXMub3B0aW9ucyk7CiAgICAgICAgICAgIC8vIHRoaXMuJHN0b3JlLmRpc3BhdGNoKCJmb3JtL3NldEJwbVRlbXBsYXRlUGFnaW5hdGlvblBhZ2VOdW0iLCAxKTsKICAgICAgICAgICAgdGhpcy5wYWdpbmF0aW9uLnBhZ2UgPSAxOwogICAgICAgICAgICAvL+avj+asoeeCueWHu+i/h+a7pOagkSzlupTor6Xmiorlj7PovrnnmoR0YWJsZSDkuI7liIbpobXlhajpg6jph43nva7kuLrliJ3lp4sKCiAgICAgICAgICAgIHZhciBwYWdlQmVhbiA9IHsKICAgICAgICAgICAgICBwYWdlQmVhbjogewogICAgICAgICAgICAgICAgcGFnZTogMSwKICAgICAgICAgICAgICAgIHBhZ2VTaXplOiB0aGlzLnBhZ2luYXRpb24ucGFnZVNpemUKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHBhZ2VCZWFuLnF1ZXJ5cyA9IFtdOwogICAgICAgICAgICBpZiAoIW5vZGUuaWQgfHwgbm9kZS5pZCAhPSAtMSkgewogICAgICAgICAgICAgIHZhciB0cmVlRmllbGQgPSBKU09OLnBhcnNlKHRoaXMudGVtcGxhdGVJbmZvLnRyZWVGaWVsZCk7CiAgICAgICAgICAgICAgdHJlZUZpZWxkLnF1ZXJ5cy5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICAgICAgICBpZiAoaXRlbS5rZXlfICYmIGl0ZW0udmFsdWVfKSB7CiAgICAgICAgICAgICAgICAgIHBhZ2VCZWFuLnF1ZXJ5cy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eTogJyRUUkVFJCcgKyBpdGVtLmtleV8sCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG5vZGVbaXRlbS52YWx1ZV9dLAogICAgICAgICAgICAgICAgICAgIGdyb3VwOiAnbWFpbicsCiAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uOiAnRVFVQUwnLAogICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uOiAnQU5EJwogICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvL+aKiui/h+a7pOagkeeahOafpeivouadoeS7tuWtmOS4gOS7vei1t+adpSzlj7PovrnnmoTmkJzntKLkuI7liIbpobXmiY3og73lkIzml7bkvb/nlKgKICAgICAgICAgICAgdGhpcy50cmVlUXVlcnlzID0gcGFnZUJlYW4ucXVlcnlzOwogICAgICAgICAgICB2YXIgcGFyYW1zID0gewogICAgICAgICAgICAgIHRlbXBsYXRlSWQ6IHRoaXMudGVtcGxhdGVJbmZvLmlkLAogICAgICAgICAgICAgIHBhZ2luYXRpb246IHBhZ2VCZWFuCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMucmVzZXQodHJ1ZSk7CiAgICAgICAgICAgIC8v5pWw5o2u6KeG5Zu+5o6n5Lu2CiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFWaWV3KSB7CiAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YVZpZXcuc2VsZWN0TGlzdCAmJiB0aGlzLmRhdGFWaWV3LnNlbGVjdExpc3QubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgcGFyYW1zLnNlbGVjdExpc3QgPSB0aGlzLmRhdGFWaWV3LnNlbGVjdExpc3Q7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciB0aGlzXyA9IHRoaXM7CiAgICAgICAgICAgIGlmICh0aGlzXy5pc0pvaW5GbG93KSB7CiAgICAgICAgICAgICAgcGFyYW1zLmlzSm9pbkZsb3cgPSB0cnVlOwogICAgICAgICAgICAgIHBhcmFtcy50YXNrVHlwZSA9IHRoaXNfLnRhc2tUeXBlOwogICAgICAgICAgICAgIHBhcmFtcy5kZWZLZXkgPSB0aGlzXy5kZWZLZXk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy4kc3RvcmUuZGlzcGF0Y2goJ2Zvcm0vZ2V0QnBtVGVtcGxhdGVCeVBhZ2luYXRpb24nLCBwYXJhbXMpLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgdGhpc18ucm93cyA9IHJlc3BvbnNlLmRhdGEucm93czsKICAgICAgICAgICAgICB0aGlzXy50b3RhbCA9IHJlc3BvbnNlLmRhdGEudG90YWw7CiAgICAgICAgICAgICAgdGhpc18ucGFnaW5hdGlvbi5wYWdlID0gcmVzcG9uc2UuZGF0YS5wYWdlOwogICAgICAgICAgICAgIHRoaXNfLnBhZ2luYXRpb24ucGFnZVNpemUgPSByZXNwb25zZS5kYXRhLnBhZ2VTaXplOwogICAgICAgICAgICAgIGxvYWRpbmcuY2xvc2UoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9LAogICAgICAgICAgLy/liqDovb3moJHnmoTkv6Hmga8KICAgICAgICAgIHRvVHJlZURhdGE6IGZ1bmN0aW9uIHRvVHJlZURhdGEoZGF0YSwgaWQsIHBpZCwgbmFtZSwgcHZhbHVlKSB7CiAgICAgICAgICAgIC8vIOW7uueri+S4quagkeW9oue7k+aehCzpnIDopoHlrprkuYnkuKrmnIDpobblsYLnmoTniLboioLngrnvvIxwdmFsdWXmmK8wCiAgICAgICAgICAgIHZhciBwYXJlbnRzID0gZGF0YS5maWx0ZXIoZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlW2lkXSA9PSB2YWx1ZVtwaWRdIHx8IHZhbHVlW3BpZF0gPT0gbnVsbCB8fCB2YWx1ZVtwaWRdID09IHB2YWx1ZTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGlmICghcGFyZW50cykgewogICAgICAgICAgICAgIHBhcmVudHMgPSBkYXRhLmZpbHRlcihmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZVtwaWRdICE9PSAndW5kZWZpbmVkJyAmJiB2YWx1ZVtwaWRdICE9IG51bGwgJiYgdmFsdWVbaWRdICE9IHZhbHVlW3BpZF07CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHBhcmVudHM7CiAgICAgICAgICB9LAogICAgICAgICAgLy/liJ3lp4vljJbmoJEKICAgICAgICAgIGluaXRUcmVlOiBmdW5jdGlvbiBpbml0VHJlZSh0cmVlRmllbGQpIHsKICAgICAgICAgICAgdmFyIHRoaXNfID0gdGhpczsKICAgICAgICAgICAgZm9ybS5nZXRCeUFsaWFzKHRyZWVGaWVsZC5hbGlhcywgZnVuY3Rpb24gKHJlcykgewogICAgICAgICAgICAgIHRoaXNfLmN1c3RvbURpYWxvZyA9IHJlczsKICAgICAgICAgICAgICBkaWFsb2cuZ2V0VHJlZURhdGEoewogICAgICAgICAgICAgICAgcmVxdWVzdFR5cGU6ICdHRVQnLAogICAgICAgICAgICAgICAgdXJsOiAnJHtmb3JtfS9mb3JtL2N1c3RvbURpYWxvZy92MS9nZXRUcmVlRGF0YT9hbGlhcz0nICsgdHJlZUZpZWxkLmFsaWFzICsgJyZtYXBQYXJhbT0nCiAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKHJlc3ApIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzXy5jdXN0b21EaWFsb2cuZGlzcGxheWZpZWxkKSB7CiAgICAgICAgICAgICAgICAgIHZhciBkaXNwbGF5ZmllbGQgPSBKU09OLnBhcnNlKHRoaXNfLmN1c3RvbURpYWxvZy5kaXNwbGF5ZmllbGQpOwogICAgICAgICAgICAgICAgICB0aGlzXy5kaXNwbGF5RmllbGQgPSBkaXNwbGF5ZmllbGQ7CiAgICAgICAgICAgICAgICAgIHRoaXNfLnRyZWVMaXN0ID0gcmVzcC5kYXRhOwogICAgICAgICAgICAgICAgICB2YXIgaGVhZCA9IHt9OwogICAgICAgICAgICAgICAgICBoZWFkW2Rpc3BsYXlmaWVsZC5kaXNwbGF5TmFtZV0gPSAn5YWo6YOoJzsKICAgICAgICAgICAgICAgICAgaGVhZC5pZCA9IC0xOwogICAgICAgICAgICAgICAgICB0aGlzXy50cmVlLnB1c2goaGVhZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSwKICAgICAgICAgIGxvYWRUcmVlOiBmdW5jdGlvbiBsb2FkVHJlZShub2RlLCByZXNvbHZlKSB7CiAgICAgICAgICAgIHZhciBfdGhpczIxID0gdGhpczsKICAgICAgICAgICAgaWYgKG5vZGUpIHsKICAgICAgICAgICAgICBpZiAobm9kZS5kYXRhLmlkID09PSAtMSkgewogICAgICAgICAgICAgICAgdmFyIHRyZWUgPSB0aGlzLnRvVHJlZURhdGEodGhpcy50cmVlTGlzdCwgdGhpcy5kaXNwbGF5RmllbGQuaWQsIHRoaXMuZGlzcGxheUZpZWxkLnBpZCwgdGhpcy5kaXNwbGF5RmllbGQuZGlzcGxheU5hbWUsIHRoaXMuZGlzcGxheUZpZWxkLnB2YWx1ZSA/IHRoaXMuZGlzcGxheUZpZWxkLnB2YWx1ZSA6ICcwJyk7CiAgICAgICAgICAgICAgICByZXNvbHZlKHRyZWUpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXNvbHZlKHRoaXMudHJlZUxpc3QuZmlsdGVyKGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVbX3RoaXMyMS5kaXNwbGF5RmllbGQucGlkXSA9PT0gbm9kZS5kYXRhW190aGlzMjEuZGlzcGxheUZpZWxkLmlkXTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgcmVzb2x2ZShbXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICBoYW5kbGVTdWJDdXJyZW50Q2hhbmdlOiBmdW5jdGlvbiBoYW5kbGVTdWJDdXJyZW50Q2hhbmdlKGluZGV4LCB0YWIpIHsKICAgICAgICAgICAgdmFyIF90aGlzMjIgPSB0aGlzOwogICAgICAgICAgICB0YWIucGFnaW5hdGlvbi5wYWdlQmVhbi5wYWdlID0gaW5kZXg7CiAgICAgICAgICAgIHRoaXMuc3ViVGFibGVMb2FkaW5nID0gdHJ1ZTsKICAgICAgICAgICAgdGhpcy4kc3RvcmUuZGlzcGF0Y2goJ2Zvcm0vZ2V0U3ViRGF0YVBhZ2luYXRpb24nLCB7CiAgICAgICAgICAgICAgcGFnaW5hdGlvbjogdGFiLnBhZ2luYXRpb24sCiAgICAgICAgICAgICAgbmFtZTogdGFiLmVudE5hbWUsCiAgICAgICAgICAgICAgcmVmSWQ6IHRhYi5yZWZJZCA/IHRhYi5yZWZJZCA6IHRoaXMucmVmSWQKICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAocmVzcCkgewogICAgICAgICAgICAgIHRhYi5wYWdpbmF0aW9uLnBhZ2VCZWFuID0gewogICAgICAgICAgICAgICAgcGFnZVNpemU6IHJlc3AucGFnZVNpemUsCiAgICAgICAgICAgICAgICBwYWdlOiByZXNwLnBhZ2UsCiAgICAgICAgICAgICAgICB0b3RhbDogcmVzcC50b3RhbAogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgdGFiLmRhdGFMaXN0ID0gcmVzcC5yb3dzOwogICAgICAgICAgICB9KS5maW5hbGx5KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICBfdGhpczIyLnN1YlRhYmxlTG9hZGluZyA9IGZhbHNlOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0sCiAgICAgICAgICBxdWVyeVN1YlRhYmxlOiBmdW5jdGlvbiBxdWVyeVN1YlRhYmxlKHRhYikgewogICAgICAgICAgICB2YXIgX3RoaXMyMyA9IHRoaXM7CiAgICAgICAgICAgIHRhYi5wYWdpbmF0aW9uLnF1ZXJ5cyA9IFtdOwogICAgICAgICAgICBpZiAodGhpcy5xdWVyeVN1YlZhbHVlKSB7CiAgICAgICAgICAgICAgdGFiLmF0dHJpYnV0ZUxpc3QuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkgewogICAgICAgICAgICAgICAgLy9wZ1NxbOS9v+eUqOaooeeziuafpeivou+8jOexu+Wei+S4jeWMuemFjeaXtuS8muaKpemUme+8jOatpOWkhOWPquS/neeVmXZhcmNoYXLnsbvlnosKICAgICAgICAgICAgICAgIC8vIGlmIChpdGVtLmRhdGFUeXBlID09ICd2YXJjaGFyJykgewogICAgICAgICAgICAgICAgdGFiLnBhZ2luYXRpb24ucXVlcnlzLnB1c2goewogICAgICAgICAgICAgICAgICBwcm9wZXJ0eTogaXRlbS5maWVsZE5hbWUsCiAgICAgICAgICAgICAgICAgIHZhbHVlOiBfdGhpczIzLnF1ZXJ5U3ViVmFsdWUsCiAgICAgICAgICAgICAgICAgIGdyb3VwOiAnb3RoZXInLAogICAgICAgICAgICAgICAgICBvcGVyYXRpb246ICdMSUtFJywKICAgICAgICAgICAgICAgICAgcmVsYXRpb246ICdPUicKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgLy8gfQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucXVlcnlTdW5WYWx1ZSkgewogICAgICAgICAgICAgIHRhYi5hdHRyaWJ1dGVMaXN0LmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICAgICAgICAgIC8vIGlmIChpdGVtLmRhdGFUeXBlID09ICd2YXJjaGFyJykgewogICAgICAgICAgICAgICAgdGFiLnBhZ2luYXRpb24ucXVlcnlzLnB1c2goewogICAgICAgICAgICAgICAgICBwcm9wZXJ0eTogaXRlbS5maWVsZE5hbWUsCiAgICAgICAgICAgICAgICAgIHZhbHVlOiBfdGhpczIzLnF1ZXJ5U3VuVmFsdWUsCiAgICAgICAgICAgICAgICAgIGdyb3VwOiAnb3RoZXInLAogICAgICAgICAgICAgICAgICBvcGVyYXRpb246ICdMSUtFJywKICAgICAgICAgICAgICAgICAgcmVsYXRpb246ICdPUicKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgLy8gfQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuaGFuZGxlU3ViQ3VycmVudENoYW5nZSgxLCB0YWIpOwogICAgICAgICAgfSwKICAgICAgICAgIGltcG9ydFN1YjogZnVuY3Rpb24gaW1wb3J0U3ViKHBhcmFtKSB7CiAgICAgICAgICAgIHZhciBfdGhpczI0ID0gdGhpczsKICAgICAgICAgICAgdmFyIGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CiAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlsZScsIHBhcmFtLmZpbGUpOwogICAgICAgICAgICB2YXIgcGFyYW1zID0gewogICAgICAgICAgICAgIGRhdGE6IGZvcm1EYXRhLAogICAgICAgICAgICAgIGFsaWFzOiB0aGlzLmN1cnJlbnRUYWIuZW50TmFtZSwKICAgICAgICAgICAgICByZWZJZDogdGhpcy5yZWZJZAogICAgICAgICAgICB9OwogICAgICAgICAgICBmb3JtLnN1YkltcG9ydChwYXJhbXMsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgICAgaWYgKGRhdGEuc3RhdGUpIHsKICAgICAgICAgICAgICAgIF90aGlzMjQuJG1lc3NhZ2UoewogICAgICAgICAgICAgICAgICB0eXBlOiAnc3VjY2VzcycsCiAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGRhdGEubWVzc2FnZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBwYXJhbS5vblN1Y2Nlc3MoKTsKICAgICAgICAgICAgICAgIF90aGlzMjQuaGFuZGxlU3ViQ3VycmVudENoYW5nZSgxLCBfdGhpczI0LmN1cnJlbnRUYWIpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBfdGhpczI0LiRtZXNzYWdlLmVycm9yKGRhdGEubWVzc2FnZSk7CiAgICAgICAgICAgICAgICBwYXJhbS5vbkVycm9yKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgIH0sCiAgICAgICAgICBleHBvcnRTdWI6IGZ1bmN0aW9uIGV4cG9ydFN1Yih0YWIpIHsKICAgICAgICAgICAgdmFyIF90aGlzMjUgPSB0aGlzOwogICAgICAgICAgICB0aGlzLmV4cG9ydFR5cGUgPSAnc3ViJzsKICAgICAgICAgICAgdGhpcy5jdXJyZW50VGFiID0gdGFiOwogICAgICAgICAgICB0aGlzLmRpc3BsYXlGaWVsZHMgPSBbXTsKICAgICAgICAgICAgdGhpcy5zdWJEaXNwbGF5RmllbGRzTGlzdCA9IFtdOwogICAgICAgICAgICB0YWIuYXR0cmlidXRlTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICAgICAgX3RoaXMyNS5kaXNwbGF5RmllbGRzLnB1c2goewogICAgICAgICAgICAgICAgZGVzYzogaXRlbS5jb21tZW50LAogICAgICAgICAgICAgICAgbmFtZTogaXRlbS5maWVsZE5hbWUsCiAgICAgICAgICAgICAgICB0eXBlOiBpdGVtLmNvbHVtblR5cGUKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHRoaXMuZGlhbG9nRXhwb3J0VmlzaWJsZSA9IHRydWU7CiAgICAgICAgICB9LAogICAgICAgICAgaW1wb3J0QnV0dG9uOiBmdW5jdGlvbiBpbXBvcnRCdXR0b24odGFiKSB7CiAgICAgICAgICAgIHRoaXMuY3VycmVudFRhYiA9IHRhYjsKICAgICAgICAgIH0sCiAgICAgICAgICBteURyYWZ0TGlzdDogZnVuY3Rpb24gbXlEcmFmdExpc3QoKSB7CiAgICAgICAgICAgIC8v5pWw5o2u6KeG5Zu+6ZqP5py65re75Yqg5Yiw5YW25LuW6I+c5Y2V5LiL6Z2i5pe26I635Y+W5b2T5YmN6I+c5Y2V55qE5Yir5ZCNICDlubbkuJTlvZPliY3mlbDmja7op4blm77kuI3mmK/ooajljZXph4znmoTmlbDmja7op4blm74gIGRhdGFWaWV3CiAgICAgICAgICAgIGlmIChzZXNzaW9uU3RvcmFnZS5tZW51X2FsaWFzICYmICF0aGlzLmRhdGFWaWV3ICYmICF0aGlzLmlnbm9yZWRBbGlhcy5pbmNsdWRlcyhzZXNzaW9uU3RvcmFnZS5tZW51X2FsaWFzKSkgewogICAgICAgICAgICAgIHRoaXMuYWxpYXNfbmV3ID0gc2Vzc2lvblN0b3JhZ2UubWVudV9hbGlhczsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgZGF0YVZpZXdGbGFnID0gZmFsc2U7CiAgICAgICAgICAgIC8v5Yik5pat5b2T5YmN5pWw5o2u6KeG5Zu+5piv5LiN5piv6KGo5Y2V6YeM55qE5pWw5o2u6KeG5Zu+CiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFWaWV3KSB7CiAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YVZpZXcuYm9EZWZBbGlhcyAmJiB0aGlzLmRhdGFWaWV3LmJvRGVmQWxpYXMgIT0gJycpIHsKICAgICAgICAgICAgICAgIGRhdGFWaWV3RmxhZyA9IHRydWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBwYXRoID0gJy8nICsgdGhpcy5hbGlhc19uZXcgKyAnL2RyYWZ0TGlzdC8nICsgdGhpcy50ZW1wbGF0ZUluZm8uYWxpYXMgKyAnLycgKyBkYXRhVmlld0ZsYWc7CiAgICAgICAgICAgIGlmICh0aGlzLm9wZW5UeXBlID09ICduZXcnIHx8IGRhdGFWaWV3RmxhZykgewogICAgICAgICAgICAgIHBhdGggKz0gJz9pc05ldz10cnVlJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZGF0YVZpZXdGbGFnKSB7CiAgICAgICAgICAgICAgd2luZG93Lm9wZW4ocGF0aCwgJ19ibGFuaycpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHRoaXMuJHJvdXRlci5wdXNoKHBhdGgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBsZXQgdXJsID0KICAgICAgICAgICAgLy8gICAiL3N0YXRlbWVudC9kcmFmdExpc3Q/dGVtcEFsaWFzPSIgKyA7CiAgICAgICAgICAgIC8vIGNvbnN0IHsgaHJlZiB9ID0gdGhpcy4kcm91dGVyLnB1c2goewogICAgICAgICAgICAvLyAgIHBhdGg6IHVybCwKICAgICAgICAgICAgLy8gfSk7CiAgICAgICAgICAgIC8vIHdpbmRvdy5vcGVuKGhyZWYsICJfYmxhbmsiKTsKICAgICAgICAgIH0sCiAgICAgICAgICBpbml0U3dpdGNoU3RhdHVzOiBmdW5jdGlvbiBpbml0U3dpdGNoU3RhdHVzKCkgewogICAgICAgICAgICAvL+WIneWni+WMluW8gOWFs+eKtuaAgQogICAgICAgICAgICB2YXIgbWFuYWdlcyA9IHV0aWxzLnBhcnNlVG9Kc29uKHRoaXMudGVtcGxhdGVJbmZvLm1hbmFnZUZpZWxkKTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYW5hZ2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgaWYgKG1hbmFnZXNbaV0ubmFtZSA9PT0gJ3N3aXRjaCcpIHsKICAgICAgICAgICAgICAgIHZhciBmaWVsZE5hbWUgPSBtYW5hZ2VzW2ldLmJpbmQ7CiAgICAgICAgICAgICAgICB0aGlzLiRzZXQodGhpcy5zd2l0Y2hNYXAsIGZpZWxkTmFtZSwge30pOwogICAgICAgICAgICAgICAgdGhpcy5zd2l0Y2hNYXBbZmllbGROYW1lXS5vbiA9IG1hbmFnZXNbaV0uc3dpdGNoT247CiAgICAgICAgICAgICAgICB0aGlzLnN3aXRjaE1hcFtmaWVsZE5hbWVdLm9mZiA9IG1hbmFnZXNbaV0uc3dpdGNoT2ZmOwogICAgICAgICAgICAgICAgdGhpcy5zd2l0Y2hNYXBbZmllbGROYW1lXS5vbkxhYmVsID0gbWFuYWdlc1tpXS5zd2l0Y2hPbkxhYmVsOwogICAgICAgICAgICAgICAgdGhpcy5zd2l0Y2hNYXBbZmllbGROYW1lXS5vZmZMYWJlbCA9IG1hbmFnZXNbaV0uc3dpdGNoT2ZmTGFiZWw7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgc3dpdGNoQ2hhbmdlOiBmdW5jdGlvbiBzd2l0Y2hDaGFuZ2UocGtWYWwsIG9uLCBvZmYsIGZpZWxkTmFtZSwgcm93LCBkZWZhdWx0VHJ1ZSkgewogICAgICAgICAgICB2YXIgdGhpc18gPSB0aGlzOwogICAgICAgICAgICB2YXIgdmFsID0gcm93W2ZpZWxkTmFtZV07CiAgICAgICAgICAgIGlmICh2YWwgIT0gb24gJiYgdmFsICE9IG9mZikgewogICAgICAgICAgICAgIGlmIChkZWZhdWx0VHJ1ZSA9PSAndHJ1ZScpIHsKICAgICAgICAgICAgICAgIHRoaXMuJHNldChyb3csIGZpZWxkTmFtZSwgb2ZmKTsKICAgICAgICAgICAgICAgIHZhbCA9IG9mZjsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy4kc2V0KHJvdywgZmllbGROYW1lLCBvbik7CiAgICAgICAgICAgICAgICB2YWwgPSBvbjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpc18uJGNvbmZpcm0oJ+WwhuS8muS/ruaUueivpeaVsOaNru+8jOaYr+WQpue7p+e7rT8nLCB7CiAgICAgICAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6ICfnoa7lrponLAogICAgICAgICAgICAgIGNhbmNlbEJ1dHRvblRleHQ6ICflj5bmtognLAogICAgICAgICAgICAgIHR5cGU6ICd3YXJuaW5nJwogICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICB2YXIgZm9ybSA9IHdpbmRvdy5jb250ZXh0LmZvcm07CiAgICAgICAgICAgICAgdmFyIGZvcm1BbGlhcyA9IHRoaXNfLnRlbXBsYXRlSW5mby5mb3JtS2V5OyAvL+ihqOWNleWIq+WQjQogICAgICAgICAgICAgIHZhciBkYXRhRGVmQWxpYXMgPSB0aGlzXy50ZW1wbGF0ZUluZm8uYm9EZWZBbGlhczsgLy/mlbDmja7lu7rmqKHliKvlkI0KICAgICAgICAgICAgICByZXEuZ2V0KGZvcm0gKyAnL2Zvcm0vZGF0YVRlbXBsYXRlL3YxL2dldEZvcm0vJyArIGZvcm1BbGlhcyArICcvJyArIGRhdGFEZWZBbGlhcyArICc/aWQ9JyArIHBrVmFsICsgJyZhY3Rpb249Z2V0JnJlY29yZElkPScpLnRoZW4oZnVuY3Rpb24gKHJlc3ApIHsKICAgICAgICAgICAgICAgIHZhciBib0RhdGEgPSByZXNwLmRhdGEuZGF0YTsKICAgICAgICAgICAgICAgIGJvRGF0YVtkYXRhRGVmQWxpYXNdW2ZpZWxkTmFtZV0gPSB2YWw7CiAgICAgICAgICAgICAgICB2YXIgc2F2ZURhdGEgPSB7CiAgICAgICAgICAgICAgICAgIGJvQWxpYXM6IHRoaXNfLnRlbXBsYXRlSW5mby5ib0RlZkFsaWFzLAogICAgICAgICAgICAgICAgICBib0RhdGE6IHJlc3AuZGF0YS5kYXRhCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdGhpc18uJHN0b3JlLmRpc3BhdGNoKCdmb3JtL2JvU2F2ZScsIHNhdmVEYXRhKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGF0ZSkgewogICAgICAgICAgICAgICAgICAgIHRoaXNfLiRtZXNzYWdlKHsKICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdzdWNjZXNzJywKICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICfkv53lrZjmiJDlip8nCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGhpc18uJG1lc3NhZ2UoewogICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICfkv53lrZjlpLHotKUnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgdmFyIGZvcm0gPSB3aW5kb3cuY29udGV4dC5mb3JtOwogICAgICAgICAgICAgIHZhciBmb3JtQWxpYXMgPSB0aGlzXy50ZW1wbGF0ZUluZm8uZm9ybUtleTsgLy/ooajljZXliKvlkI0KICAgICAgICAgICAgICB2YXIgZGF0YURlZkFsaWFzID0gdGhpc18udGVtcGxhdGVJbmZvLmJvRGVmQWxpYXM7IC8v5pWw5o2u5bu65qih5Yir5ZCNCiAgICAgICAgICAgICAgcmVxLmdldChmb3JtICsgJy9mb3JtL2RhdGFUZW1wbGF0ZS92MS9nZXRGb3JtLycgKyBmb3JtQWxpYXMgKyAnLycgKyBkYXRhRGVmQWxpYXMgKyAnP2lkPScgKyBwa1ZhbCArICcmYWN0aW9uPWdldCZyZWNvcmRJZD0nKS50aGVuKGZ1bmN0aW9uIChyZXNwKSB7CiAgICAgICAgICAgICAgICB0aGlzXy4kc2V0KHJvdywgZmllbGROYW1lLCByZXNwLmRhdGEuZGF0YVtkYXRhRGVmQWxpYXNdW2ZpZWxkTmFtZV0pOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0sCiAgICAgICAgICBkaXNwbGF5OiBmdW5jdGlvbiBkaXNwbGF5KG1wRGlzcGxheSkgewogICAgICAgICAgICAvL3Bj56uv55qE5pWw5o2u5oql6KGo5LiN6ZyA6KaB5YGa5pys5pa55rOV55qE5aSE55CG77yM55u05o6l6L+U5ZuedHJ1ZeWNs+WPr+OAggogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgIH0sCiAgICAgICAgICBnZXRGaXhlZDogZnVuY3Rpb24gZ2V0Rml4ZWQoZml4ZWQpIHsKICAgICAgICAgICAgcmV0dXJuIGZpeGVkOwogICAgICAgICAgfSwKICAgICAgICAgIHN1bW1hcnk6IGZ1bmN0aW9uIHN1bW1hcnkobWV0aG9kLCBmaWVsZCwgZGVjaW1hbCkgewogICAgICAgICAgICB2YXIgbGlzdCA9IHRoaXMucm93cy5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICAgICAgICByZXR1cm4gaXRlbVtmaWVsZF0gIT09IHVuZGVmaW5lZCAmJiBpdGVtW2ZpZWxkXSAhPT0gJyc7CiAgICAgICAgICAgIH0pLm1hcChmdW5jdGlvbiAoaXRlbSkgewogICAgICAgICAgICAgIHJldHVybiBuZXcgTnVtYmVyKGl0ZW1bZmllbGRdKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGlmICghbGlzdCB8fCBsaXN0Lmxlbmd0aCA9PSAwKSB7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChtZXRob2QgPT09ICdjb3VudCcpIHsKICAgICAgICAgICAgICByZXR1cm4gbGlzdC5sZW5ndGg7CiAgICAgICAgICAgIH0gZWxzZSBpZiAobWV0aG9kID09PSAnc3VtJykgewogICAgICAgICAgICAgIHJldHVybiBsaXN0LnJlZHVjZShmdW5jdGlvbiAoYSwgYikgewogICAgICAgICAgICAgICAgcmV0dXJuIGEgKyBiOwogICAgICAgICAgICAgIH0pLnRvRml4ZWQoZGVjaW1hbCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAobWV0aG9kID09PSAnbWluJykgewogICAgICAgICAgICAgIHJldHVybiBNYXRoLm1pbi5hcHBseShNYXRoLCBfdG9Db25zdW1hYmxlQXJyYXkobGlzdCkpLnRvRml4ZWQoZGVjaW1hbCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAobWV0aG9kID09PSAnbWF4JykgewogICAgICAgICAgICAgIHJldHVybiBNYXRoLm1heC5hcHBseShNYXRoLCBfdG9Db25zdW1hYmxlQXJyYXkobGlzdCkpLnRvRml4ZWQoZGVjaW1hbCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAobWV0aG9kID09PSAnYXZnJykgewogICAgICAgICAgICAgIHJldHVybiAobGlzdC5yZWR1Y2UoZnVuY3Rpb24gKGEsIGIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBhICsgYjsKICAgICAgICAgICAgICB9KSAvIGxpc3QubGVuZ3RoKS50b0ZpeGVkKGRlY2ltYWwpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgZ2V0Q29sb3I6IGZ1bmN0aW9uIGdldENvbG9yKGRhdGEsIHJvdykgewogICAgICAgICAgICB2YXIgcmVzdUNvbG9yID0gJ2NvbG9yOmJsYWNrJzsKICAgICAgICAgICAgdmFyIGRlY29kZSA9IEJhc2U2NC5kZWNvZGUoZGF0YSk7CiAgICAgICAgICAgIHZhciBjb2xvclJ1bGUgPSBKU09OLnBhcnNlKGRlY29kZSk7CiAgICAgICAgICAgIGlmIChjb2xvclJ1bGUgJiYgY29sb3JSdWxlIGluc3RhbmNlb2YgQXJyYXkpIHsKICAgICAgICAgICAgICBjb2xvclJ1bGUuZm9yRWFjaChmdW5jdGlvbiAocnVsZSkgewogICAgICAgICAgICAgICAgdmFyIEZuID0gRnVuY3Rpb24oJ2RhdGEnLCBydWxlLnByb1J1bGUpOwogICAgICAgICAgICAgICAgaWYgKEZuKHJvdykpIHsKICAgICAgICAgICAgICAgICAgcmVzdUNvbG9yID0gJ2NvbG9yOicgKyBydWxlLnByb0NvbG9yOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZXN1Q29sb3I7CiAgICAgICAgICB9LAogICAgICAgICAgZ2V0UHJvVmFsdWU6IGZ1bmN0aW9uIGdldFByb1ZhbHVlKHZhbHVlLCBydWxlKSB7CiAgICAgICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHZhbHVlIC8gcnVsZSAqIDEwMDAwKSAvIDEwMDsgLy8g5bCP5pWw54K55ZCO5Lik5L2N55m+5YiG5q+UCiAgICAgICAgICB9LAogICAgICAgICAgZ2V0UHJvQ29sb3I6IGZ1bmN0aW9uIGdldFByb0NvbG9yKGRhdGEsIHJvdykgewogICAgICAgICAgICB2YXIgcmVzdUNvbG9yID0gJyM0MDllZmYnOwogICAgICAgICAgICB2YXIgZGVjb2RlID0gQmFzZTY0LmRlY29kZShkYXRhKTsKICAgICAgICAgICAgLypkZWNvZGU9ZGVjb2RlLnJlcGxhY2UoL1xzKiEvZywiIik7Ki8KICAgICAgICAgICAgdmFyIGNvbG9yUnVsZSA9IEpTT04ucGFyc2UoZGVjb2RlKTsKICAgICAgICAgICAgaWYgKGNvbG9yUnVsZSAmJiBjb2xvclJ1bGUgaW5zdGFuY2VvZiBBcnJheSkgewogICAgICAgICAgICAgIGNvbG9yUnVsZS5mb3JFYWNoKGZ1bmN0aW9uIChydWxlKSB7CiAgICAgICAgICAgICAgICB2YXIgRm4gPSBGdW5jdGlvbignZGF0YScsIHJ1bGUucHJvUnVsZSk7CiAgICAgICAgICAgICAgICBpZiAoRm4ocm93KSkgewogICAgICAgICAgICAgICAgICByZXN1Q29sb3IgPSBydWxlLnByb0NvbG9yOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZXN1Q29sb3I7CiAgICAgICAgICB9LAogICAgICAgICAgaXNTb3J0YWJsZTogZnVuY3Rpb24gaXNTb3J0YWJsZShmaWVsZCkgewogICAgICAgICAgICB2YXIgaXNDbG9iID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuZGlzcGxheUZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICAgICAgaWYgKGl0ZW0ubmFtZSA9PT0gZmllbGQgJiYgaXRlbS50eXBlID09PSAnY2xvYicpIHsKICAgICAgICAgICAgICAgIGlzQ2xvYiA9IHRydWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuICF0aGlzLm5vdFNvcnRhYmxlRmllbGRzLmluY2x1ZGVzKGZpZWxkKSAmJiAhaXNDbG9iOwogICAgICAgICAgfSwKICAgICAgICAgIGN1c3RvbUV2aWxKUzogZnVuY3Rpb24gY3VzdG9tRXZpbEpTKHJvdywgaHRTY3JpcHQpIHsKICAgICAgICAgICAgdmFyIEZuID0gRnVuY3Rpb24oJ19yZXEnLCAncm93JywgJ190aGlzJywgQmFzZTY0LmRlY29kZShodFNjcmlwdCkpOyAvL+S4gOS4quWPmOmHj+aMh+WQkUZ1bmN0aW9u77yM6Ziy5q2i5pyJ5Lqb5YmN56uv57yW6K+R5bel5YW35oql6ZSZCiAgICAgICAgICAgIHZhciByZXN1bHQgPSBGbihyZXEsIHJvdywgdGhpcyk7CiAgICAgICAgICB9LAogICAgICAgICAgYmF0Y2hVcGRhdGU6IGZ1bmN0aW9uIGJhdGNoVXBkYXRlKHRpdGxlLCBiYXNlNjRKc29uLCBiYXNlNjRGaWxlZHMpIHsKICAgICAgICAgICAgaWYgKHRoaXMudGFibGVEYXRhLnNlbGVjdFJvd3MgPT0gbnVsbCB8fCB0aGlzLnRhYmxlRGF0YS5zZWxlY3RSb3dzLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgICAgICAgdGhpcy4kbWVzc2FnZS53YXJuaW5nKCfor7fpgInmi6nmlbDmja4nKTsKICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGRlZmF1bHRWYWx1ZUxpc3QgPSBbXTsKICAgICAgICAgICAgdmFyIG91dEZvcm0gPSBbXTsKICAgICAgICAgICAgaWYgKGJhc2U2NEpzb24pIHsKICAgICAgICAgICAgICAvL+aYr+WQpuacieeUqOaIt+iHquW3sei+k+WFpeeahOWtl+autQogICAgICAgICAgICAgIHZhciByZXMgPSB0cnVlOwogICAgICAgICAgICAgIHZhciBiYXRjaFVwZGF0ZURhdGEgPSBKU09OLnBhcnNlKEJhc2U2NC5kZWNvZGUoYmFzZTY0SnNvbikpOwogICAgICAgICAgICAgIHZhciBmaWxlZHNPYmogPSBKU09OLnBhcnNlKEJhc2U2NC5kZWNvZGUoYmFzZTY0RmlsZWRzKSk7CiAgICAgICAgICAgICAgYmF0Y2hVcGRhdGVEYXRhLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICAgICAgICAgIGlmIChpdGVtLnZhbHVlVHlwZSA9PSAxKSB7CiAgICAgICAgICAgICAgICAgIHZhciBpc1JlcXVpcmVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgIGlmIChpdGVtLmlzUmVxdWlyZWQpIHsKICAgICAgICAgICAgICAgICAgICBpc1JlcXVpcmVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB2YXIgb2JqID0gewogICAgICAgICAgICAgICAgICAgIG5hbWU6IGl0ZW0ubmFtZSwKICAgICAgICAgICAgICAgICAgICBkZXNjOiBmaWxlZHNPYmpbaXRlbS5uYW1lXSwKICAgICAgICAgICAgICAgICAgICBvdXRUeXBlOiBpdGVtLm91dFZhbHVlVHlwZSwKICAgICAgICAgICAgICAgICAgICBzaW5nbGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIHNlbGVjdEN1cnJlbnQ6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIGlzUmVxdWlyZWQ6IGlzUmVxdWlyZWQKICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0ub3V0VmFsdWVUeXBlID09ICdzZWxlY3QnKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHNlbGVjdENvbmZpZyA9IEpTT04ucGFyc2UoaXRlbS5vdXRDb25maWcpOwogICAgICAgICAgICAgICAgICAgIG9iai5nYW5nZWQgPSB7CiAgICAgICAgICAgICAgICAgICAgICBhbGlhczogJycsCiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUJpbmQ6ICcnLAogICAgICAgICAgICAgICAgICAgICAgbm9Jbml0OiAnJywKICAgICAgICAgICAgICAgICAgICAgIGxhYmVsQmluZDogJycsCiAgICAgICAgICAgICAgICAgICAgICBiaW5kOiB7fQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdENvbmZpZy5jdXN0b21RdWVyeSkgewogICAgICAgICAgICAgICAgICAgICAgdmFyIGdhbmdlZCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXM6IHNlbGVjdENvbmZpZy5jdXN0b21RdWVyeS5hbGlhcywKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVCaW5kOiBzZWxlY3RDb25maWcuY3VzdG9tUXVlcnkudmFsdWVCaW5kLAogICAgICAgICAgICAgICAgICAgICAgICBub0luaXQ6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbEJpbmQ6IHNlbGVjdENvbmZpZy5jdXN0b21RdWVyeS5sYWJlbEJpbmQsCiAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQ6IHt9CiAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgb2JqLmdhbmdlZCA9IGdhbmdlZDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgb2JqLnNlbGVjdERhdGEgPSBzZWxlY3RDb25maWcuc2VsZWN0RGF0YTsKICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtLm91dFZhbHVlVHlwZSA9PSAnZGlhbG9nJykgewogICAgICAgICAgICAgICAgICAgIHZhciBfc2VsZWN0Q29uZmlnID0gSlNPTi5wYXJzZShpdGVtLm91dENvbmZpZyk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGRpYWxvZ0NvbmZpZyA9IF9zZWxlY3RDb25maWcuZGlhbG9nQ29uZmlnOwogICAgICAgICAgICAgICAgICAgIHZhciBtYXBwaW5nQ29uZiA9IFtdOwogICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbWV0ZXIgPSBfc2VsZWN0Q29uZmlnLnBhcmFtZXRlcjsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gcGFyYW1ldGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBwYXJhbWV0ZXJba2V5XSB8fCAnJzsKICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmdDb25mLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICBmcm9tOiBrZXksCiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogW3ZhbHVlXSwKICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0U3ViOiBbdmFsdWVdCiAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIGN1c3RkaWFsb2cgPSB7CiAgICAgICAgICAgICAgICAgICAgICBzZWxlY3ROdW06IGRpYWxvZ0NvbmZpZy5zZWxlY3ROdW0sCiAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBbXSwKICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmdDb25mOiBtYXBwaW5nQ29uZiwKICAgICAgICAgICAgICAgICAgICAgIGN1c3RRdWVyeUpzb246IFtdLAogICAgICAgICAgICAgICAgICAgICAgYWxpYXM6IGRpYWxvZ0NvbmZpZy5hbGlhcywKICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGRpYWxvZ0NvbmZpZy5jdXN0RGlhbG9nCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBvYmouY3VzdGRpYWxvZyA9IHsKICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICfor7fpgInmi6knLAogICAgICAgICAgICAgICAgICAgICAgY3VzdERpYWxvZzogY3VzdGRpYWxvZywKICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdEZpZWxkOiBkaWFsb2dDb25maWcucmVzdWx0RmllbGQKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0ub3V0Q29uZmlnICYmIChpdGVtLm91dFZhbHVlVHlwZSAhPSAnaW5wdXQnIHx8IGl0ZW0ub3V0VmFsdWVUeXBlICE9ICdkYXRhJyB8fCBpdGVtLm91dFZhbHVlVHlwZSAhPSAnbnVtYmVyJykpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgb3V0Q29uZmlnID0gSlNPTi5wYXJzZShpdGVtLm91dENvbmZpZyk7CiAgICAgICAgICAgICAgICAgICAgdmFyIF9wYXJhbWV0ZXIgPSBvdXRDb25maWcucGFyYW1ldGVyOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBfcGFyYW1ldGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoIV9wYXJhbWV0ZXJba2V5XSkgewogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgX3BhcmFtZXRlcltrZXldOwogICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgX3BhcmFtZXRlcltrZXldID0gJ2RhdGEuJyArIF9wYXJhbWV0ZXJba2V5XTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKG91dENvbmZpZy5zZWxlY3RDdXJyZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICBvYmouc2VsZWN0Q3VycmVudCA9IG91dENvbmZpZy5zZWxlY3RDdXJyZW50OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAob3V0Q29uZmlnLmlzU2luZ2xlKSB7CiAgICAgICAgICAgICAgICAgICAgICBvYmouc2luZ2xlID0gb3V0Q29uZmlnLmlzU2luZ2xlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBvYmouYmluZENvbmZpZyA9IF9wYXJhbWV0ZXI7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgb3V0Rm9ybS5wdXNoKG9iaik7CiAgICAgICAgICAgICAgICAgIHJlcyA9IGZhbHNlOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlTGlzdC5wdXNoKHsKICAgICAgICAgICAgICAgICAgICBrZXk6IGl0ZW0ubmFtZSwKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogaXRlbS5kZWZhdWx0VmFsdWUKICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgaWYgKHJlcykgewogICAgICAgICAgICAgICAgdGhpcy51cGRhdGVCbyhkZWZhdWx0VmFsdWVMaXN0KTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0VmFsdWVMaXN0ID0gZGVmYXVsdFZhbHVlTGlzdDsKICAgICAgICAgICAgICAgIHRoaXMuJHJlZnMudGVtcGxhdGVCYXRjaFVwZGF0ZURpYWxvZy5zaG93RGlhbG9nKHRpdGxlLCBvdXRGb3JtKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdGhpcy4kbWVzc2FnZSh7CiAgICAgICAgICAgICAgICB0eXBlOiAnaW5mbycsCiAgICAgICAgICAgICAgICBtZXNzYWdlOiAn5pyq6K6+572u5pu05paw5YaF5a65JwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgb25Db25maXJtOiBmdW5jdGlvbiBvbkNvbmZpcm0oZGF0YSkgewogICAgICAgICAgICB2YXIgZGVmYXVsdFZhbHVlTGlzdCA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gZGF0YSkgewogICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZUxpc3QucHVzaCh7CiAgICAgICAgICAgICAgICBrZXk6IGtleSwKICAgICAgICAgICAgICAgIHZhbHVlOiBkYXRhW2tleV0KICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgYm9EYXRhID0gdGhpcy5kZWZhdWx0VmFsdWVMaXN0ID8gdGhpcy5kZWZhdWx0VmFsdWVMaXN0LmNvbmNhdChkZWZhdWx0VmFsdWVMaXN0KSA6IHRoaXMuZGVmYXVsdFZhbHVlOwogICAgICAgICAgICB0aGlzLnVwZGF0ZUJvKGJvRGF0YSk7CiAgICAgICAgICB9LAogICAgICAgICAgdXBkYXRlQm86IGZ1bmN0aW9uIHVwZGF0ZUJvKGRlZmF1bHRWYWx1ZUxpc3QpIHsKICAgICAgICAgICAgdmFyIF90aGlzMjYgPSB0aGlzOwogICAgICAgICAgICB0aGlzLiRjb25maXJtKCfmraTmk43kvZzlsIbmibnph4/mm7TmlrDmlbDmja4sIOaYr+WQpue7p+e7rT8nLCAn5o+Q56S6JywgewogICAgICAgICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiAn56Gu5a6aJywKICAgICAgICAgICAgICBjYW5jZWxCdXR0b25UZXh0OiAn5Y+W5raIJywKICAgICAgICAgICAgICB0eXBlOiAnd2FybmluZycKICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgdmFyIHNlbGVjdFJvd3MgPSBfdGhpczI2LnRhYmxlRGF0YS5zZWxlY3RSb3dzOwogICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZWN0Um93cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgc2VsZWN0Um93c1tpXS5mb3JtS2V5ID0gX3RoaXMyNi50ZW1wbGF0ZUluZm8uZm9ybUtleTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZGVmYXVsdFZhbHVlTGlzdC5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgICAgICBzZWxlY3RSb3dzW2ldW2RlZmF1bHRWYWx1ZUxpc3Rbal0ua2V5XSA9IGRlZmF1bHRWYWx1ZUxpc3Rbal0udmFsdWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHZhciBkYXRhID0gewogICAgICAgICAgICAgICAgYm9EYXRhOiBzZWxlY3RSb3dzLAogICAgICAgICAgICAgICAgYm9BbGlhczogX3RoaXMyNi50ZW1wbGF0ZUluZm8uYm9EZWZBbGlhcwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgX3RoaXMyNi4kc3RvcmUuZGlzcGF0Y2goJ2Zvcm0vYmF0Y2hVcGRhdGVUZW1wbGF0ZURhdGEnLCBkYXRhKS50aGVuKGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5zdGF0ZSkgewogICAgICAgICAgICAgICAgICBfdGhpczI2LiRtZXNzYWdlKHsKICAgICAgICAgICAgICAgICAgICB0eXBlOiAnc3VjY2VzcycsCiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZGF0YS5tZXNzYWdlCiAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICBfdGhpczI2LnNlYXJjaCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgX3RoaXMyNi4kbWVzc2FnZSh7CiAgICAgICAgICAgICAgICB0eXBlOiAnaW5mbycsCiAgICAgICAgICAgICAgICBtZXNzYWdlOiAn5bey5Y+W5raI5pu05pawJwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0sCiAgICAgICAgICBhZGRDb21tYW5kOiBmdW5jdGlvbiBhZGRDb21tYW5kKGNvbW1hbmQpIHsKICAgICAgICAgICAgaWYgKGNvbW1hbmQgPT0gJ25vdExvZ2luJyB8fCBjb21tYW5kID09ICdsb2dpbicpIHsKICAgICAgICAgICAgICB0aGlzLmdldEFkZFFSQ29kZShjb21tYW5kKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIGdldEFkZFFSQ29kZTogZnVuY3Rpb24gZ2V0QWRkUVJDb2RlKGNvbW1hbmQpIHsKICAgICAgICAgICAgdGhpcy5RUkNvZGVQYXR0ZXJuID0gY29tbWFuZCA9PSAnbm90TG9naW4nID8gdHJ1ZSA6IGZhbHNlOwogICAgICAgICAgICB0aGlzLlFSQ29kZURlc2MgPSBbXTsKICAgICAgICAgICAgdGhpcy5RUkNvZGVUeXBlID0gJ2FkZCc7CiAgICAgICAgICAgIHRoaXMuUVJDb2RlU2hvdyA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLlFSQ29kZURpYWxvZyA9IHRydWU7CiAgICAgICAgICB9LAogICAgICAgICAgc2hvd1NlYXJjaFBhbmU6IGZ1bmN0aW9uIHNob3dTZWFyY2hQYW5lKCkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgIH0sCiAgICAgICAgICBidWlsZERlZmF1bHRRdWVyeXM6IGZ1bmN0aW9uIGJ1aWxkRGVmYXVsdFF1ZXJ5cygpIHsKICAgICAgICAgICAgdmFyIHRoaXNfID0gdGhpczsKICAgICAgICAgICAgdmFyIHF1ZXJ5cyA9IFtdOwogICAgICAgICAgICB2YXIgY29uZGl0aW9ucyA9IEpTT04ucGFyc2UodGhpc18udGVtcGxhdGVJbmZvLmNvbmRpdGlvbkZpZWxkKTsKICAgICAgICAgICAgdmFyIHByZWZpeCA9IHRoaXMudGVtcGxhdGVJbmZvLmlzRXh0ZXJuYWwgPT0gMSA/ICcnIDogJ0ZfJzsKICAgICAgICAgICAgLy/mnaHku7blrZfmrrXpu5jorqTlgLzliKTmlq0KICAgICAgICAgICAgY29uZGl0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb25kaXRpb24pIHsKICAgICAgICAgICAgICBpZiAoY29uZGl0aW9uLmRlZmF1bHRWYWx1ZSkgewogICAgICAgICAgICAgICAgdmFyIGZpZWxkID0gY29uZGl0aW9uLmNvbFByZWZpeCArIGNvbmRpdGlvbi5uYTsKICAgICAgICAgICAgICAgIHRoaXNfLiRzZXQodGhpc18uc2VhcmNoRm9ybSwgZmllbGQsIGNvbmRpdGlvbi5kZWZhdWx0VmFsdWUpOwogICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gY29uZGl0aW9uLmRlZmF1bHRWYWx1ZTsKICAgICAgICAgICAgICAgIGlmIChjb25kaXRpb24udHkgPT0gJ251bWJlcicpIHsKICAgICAgICAgICAgICAgICAgdmFsdWUgPSBwYXJzZUZsb2F0KHZhbHVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHF1ZXJ5cy5wdXNoKHsKICAgICAgICAgICAgICAgICAgcHJvcGVydHk6IGZpZWxkLAogICAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWUsCiAgICAgICAgICAgICAgICAgIGdyb3VwOiAnbWFpbicsCiAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogY29uZGl0aW9uLnF0LnRvVXBwZXJDYXNlKCksCiAgICAgICAgICAgICAgICAgIHJlbGF0aW9uOiAnQU5EJwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgLy/nrZvpgInlrZfmrrXpu5jorqTlgLzliKTmlq0KCiAgICAgICAgICAgIHZhciBmaWx0ZXJzID0gSlNPTi5wYXJzZSh0aGlzXy50ZW1wbGF0ZUluZm8uZmlsdGVyaW5nRmllbGQpOwogICAgICAgICAgICBmaWx0ZXJzLmZvckVhY2goZnVuY3Rpb24gKGZpbHRlcikgewogICAgICAgICAgICAgIGlmIChmaWx0ZXIuZGVmYXVsdFZhbHVlICYmIGZpbHRlci5kZWZhdWx0VmFsdWUubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgdGhpc18uZmlsdGVyTWFwW2ZpbHRlci5uYW1lXSA9IGZpbHRlci5kZWZhdWx0VmFsdWU7CiAgICAgICAgICAgICAgICBmaWx0ZXIuZGVmYXVsdFZhbHVlLmZvckVhY2goZnVuY3Rpb24gKHZhbCkgewogICAgICAgICAgICAgICAgICBxdWVyeXMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk6IHByZWZpeCArIGZpbHRlci5uYW1lLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiB2YWwsCiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6ICdkZWZWYWxfJyArIGZpbHRlci5uYW1lLAogICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogJ0VRVUFMJywKICAgICAgICAgICAgICAgICAgICByZWxhdGlvbjogJ09SJwogICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHRoaXNfLiRvbignYWZ0ZXJNb3VudGVkJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgIHZhciBoZWFkZXJDb2x1bW5zID0gdGhpc18uJHJlZnMubXVsdGlwbGVUZW1wbGF0ZVRhYmxlLiRyZWZzLnRhYmxlSGVhZGVyLmNvbHVtbnM7CiAgICAgICAgICAgICAgaGVhZGVyQ29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzXy5maWx0ZXJNYXAuaGFzT3duUHJvcGVydHkoY29sdW1uLnByb3BlcnR5KSkgewogICAgICAgICAgICAgICAgICB0aGlzXy5maWx0ZXJNYXBbY29sdW1uLnByb3BlcnR5XS5mb3JFYWNoKGZ1bmN0aW9uICh2YWwpIHsKICAgICAgICAgICAgICAgICAgICBjb2x1bW4uZmlsdGVyZWRWYWx1ZS5wdXNoKHZhbCk7CiAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIHF1ZXJ5czsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0pOwogICAgfQogIH0KfTs="},null]}