{"remainingRequest":"D:\\jenkins\\workspace\\ljzc-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\thread-loader\\dist\\cjs.js!D:\\jenkins\\workspace\\ljzc-fvue\\node_modules\\babel-loader\\lib\\index.js!D:\\jenkins\\workspace\\ljzc-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\cache-loader\\dist\\cjs.js??ref--0-0!D:\\jenkins\\workspace\\ljzc-fvue\\node_modules\\vue-loader\\lib\\index.js??vue-loader-options!D:\\jenkins\\workspace\\ljzc-fvue\\src\\components\\dataTemplate\\TemplateDynamicView.vue?vue&type=script&lang=js&","dependencies":[{"path":"D:\\jenkins\\workspace\\ljzc-fvue\\src\\components\\dataTemplate\\TemplateDynamicView.vue","mtime":1705040076634},{"path":"D:\\jenkins\\workspace\\ljzc-fvue\\babel.config.js","mtime":1701311296006},{"path":"D:\\jenkins\\workspace\\ljzc-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\ljzc-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\thread-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\ljzc-fvue\\node_modules\\babel-loader\\lib\\index.js","mtime":456789000000},{"path":"D:\\jenkins\\workspace\\ljzc-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\ljzc-fvue\\node_modules\\vue-loader\\lib\\index.js","mtime":499162500000}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:aW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tICJEOi9qZW5raW5zL3dvcmtzcGFjZS9sanpjLWZ2dWUvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5LmpzIjsKaW1wb3J0IF9hc3luY1RvR2VuZXJhdG9yIGZyb20gIkQ6L2plbmtpbnMvd29ya3NwYWNlL2xqemMtZnZ1ZS9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vYXN5bmNUb0dlbmVyYXRvci5qcyI7CmltcG9ydCBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciBmcm9tICJEOi9qZW5raW5zL3dvcmtzcGFjZS9sanpjLWZ2dWUvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIuanMiOwppbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tICJEOi9qZW5raW5zL3dvcmtzcGFjZS9sanpjLWZ2dWUvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDIuanMiOwppbXBvcnQgInJlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmcuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3IuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLml0ZXJhdG9yLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkucHVzaC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmZ1bmN0aW9uLm5hbWUuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3Qua2V5cy5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmNvbmNhdC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnNvcnQuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLmZvci1lYWNoLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvd2ViLnNlbGYuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuZXhlYy5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5zZWFyY2guanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcucmVwbGFjZS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL3dlYi51cmwuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy93ZWIudXJsLXNlYXJjaC1wYXJhbXMuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy93ZWIudXJsLXNlYXJjaC1wYXJhbXMuZGVsZXRlLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvd2ViLnVybC1zZWFyY2gtcGFyYW1zLmhhcy5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL3dlYi51cmwtc2VhcmNoLXBhcmFtcy5zaXplLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuaW5jbHVkZXMuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuaW5jbHVkZXMuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5qb2luLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuanNvbi5zdHJpbmdpZnkuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5maWx0ZXIuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5tYXAuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIuY29uc3RydWN0b3IuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIudG8tZml4ZWQuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5yZWR1Y2UuanMiOwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwoKaW1wb3J0IHsgTG9hZGluZyB9IGZyb20gJ2VsZW1lbnQtdWknOwppbXBvcnQgSHRDaGVja2JveCBmcm9tICdAL2NvbXBvbmVudHMvY29udHJvbC9IdENoZWNrYm94LnZ1ZSc7CmltcG9ydCBIdERpYWxvZyBmcm9tICdAL2NvbXBvbmVudHMvY29udHJvbC9IdERpYWxvZy52dWUnOwppbXBvcnQgSHREaWFsb2dCdG4gZnJvbSAnQC9jb21wb25lbnRzL2NvbnRyb2wvaHREaWFsb2dCdG4udnVlJzsKaW1wb3J0IEVpcFNlbGVjdCBmcm9tICdAL2NvbXBvbmVudHMvZWlwQ29udHJvbC9FaXBTZWxlY3QudnVlJzsKaW1wb3J0IFZSdW50aW1lVGVtcGxhdGUgZnJvbSAndi1ydW50aW1lLXRlbXBsYXRlJzsKaW1wb3J0IHV0aWxzIGZyb20gJ0AvdXRpbHMuanMnOwppbXBvcnQgeyBCYXNlNjQgfSBmcm9tICdqcy1iYXNlNjQnOwppbXBvcnQgVnVlIGZyb20gJ3Z1ZSc7CmltcG9ydCBRUkNvZGUgZnJvbSAncXJjb2RlJzsKaW1wb3J0IHJlcSBmcm9tICdAL3JlcXVlc3QuanMnOwppbXBvcnQgZm9ybSBmcm9tICdAL2FwaS9mb3JtLmpzJzsKaW1wb3J0IGRpYWxvZyBmcm9tICdAL2FwaS9kaWFsb2dBcGkuanMnOwp2YXIgVGVtcGxhdGVCYXRjaFVwZGF0ZURpYWxvZyA9IGZ1bmN0aW9uIFRlbXBsYXRlQmF0Y2hVcGRhdGVEaWFsb2coKSB7CiAgcmV0dXJuIGltcG9ydCgnQC9jb21wb25lbnRzL2RpYWxvZy9UZW1wbGF0ZUJhdGNoVXBkYXRlRGlhbG9nLnZ1ZScpOwp9OwpleHBvcnQgZGVmYXVsdCB7CiAgbmFtZTogJ3RlbXBsYXRlLWR5bmFtaWMtdmlldycsCiAgcHJvcHM6IHsKICAgIHRlbXBsYXRlS2V5OiBTdHJpbmcsCiAgICBodG1sOiBTdHJpbmcsCiAgICB0ZW1wbGF0ZUluZm86IE9iamVjdCwKICAgIHBhcmFtZXRlcnFRdWVyeXM6IFN0cmluZywKICAgIHNpbmdsZTogewogICAgICBkZWZhdWx0OiAndHJ1ZScKICAgIH0sCiAgICBkZWZLZXk6IFN0cmluZywKICAgIHRhc2tUeXBlOiB7CiAgICAgIGRlZmF1bHQ6ICcnCiAgICB9LAogICAgZGF0YVZpZXc6IE9iamVjdCwKICAgIGlzSm9pbkZsb3c6IHsKICAgICAgZGVmYXVsdDogZmFsc2UKICAgIH0KICB9LAogIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7CiAgICByZXR1cm4gewogICAgICByZWZyZXNoVGltZTogbmV3IERhdGUoKS5nZXRUaW1lKCksCiAgICAgIHNob3dEYXRlVmlldzogdHJ1ZQogICAgfTsKICB9LAogIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQoKSB7CiAgICB0aGlzLmluaXQoKTsKICB9LAogIHdhdGNoOiB7CiAgICBodG1sOiBmdW5jdGlvbiBodG1sKG5ld1ZhbCkgewogICAgICBpZiAobmV3VmFsKSB7CiAgICAgICAgdGhpcy5pbml0KCk7CiAgICAgIH0KICAgIH0KICB9LAogIG1ldGhvZHM6IHsKICAgIGluaXQ6IGZ1bmN0aW9uIGluaXQoKSB7CiAgICAgIFZ1ZS5jb21wb25lbnQoJ2h0LWRhdGF2aWV3LXJ1bnRpbWUtdGVtcGxhdGUnLCB7CiAgICAgICAgdGVtcGxhdGU6IHRoaXMuaHRtbCwKICAgICAgICBwcm9wczogewogICAgICAgICAgdGVtcGxhdGVLZXk6IFN0cmluZywKICAgICAgICAgIHRlbXBsYXRlSW5mbzogT2JqZWN0LAogICAgICAgICAgc2luZ2xlOiBTdHJpbmcsCiAgICAgICAgICBkZWZLZXk6IFN0cmluZywKICAgICAgICAgIHRhc2tUeXBlOiB7CiAgICAgICAgICAgIGRlZmF1bHQ6ICcnCiAgICAgICAgICB9LAogICAgICAgICAgZGF0YVZpZXc6IE9iamVjdCwKICAgICAgICAgIGlzSm9pbkZsb3c6IHsKICAgICAgICAgICAgZGVmYXVsdDogZmFsc2UKICAgICAgICAgIH0sCiAgICAgICAgICBwYXJhbWV0ZXJxUXVlcnlzOiBTdHJpbmcKICAgICAgICB9LAogICAgICAgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICB0cmVlUXVlcnlzOiBbXSwKICAgICAgICAgICAgYWxpYXNfbmV3OiAnc3RhdGVtZW50JywKICAgICAgICAgICAgbG9hZGluZzogZmFsc2UsCiAgICAgICAgICAgIFFSQ29kZXVybDogJycsCiAgICAgICAgICAgIFFSQ29kZURpYWxvZzogZmFsc2UsCiAgICAgICAgICAgIGh0bWw6ICcnLAogICAgICAgICAgICB0YWJsZURhdGE6IHsKICAgICAgICAgICAgICBzZWxlY3RSb3dzOiBbXSwKICAgICAgICAgICAgICBxdWVyeXM6ICcnCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGRpYWxvZ0V4cG9ydFZpc2libGU6IGZhbHNlLAogICAgICAgICAgICBleHBvcnREYXRhOiB7CiAgICAgICAgICAgICAgZ2V0VHlwZTogJ2FsbCcsCiAgICAgICAgICAgICAgZXhwRmllbGQ6IFtdCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGRpc3BsYXlGaWVsZHM6IFtdLAogICAgICAgICAgICBleHBvcnRTZWxsZWN0aW9uOiBbXSwKICAgICAgICAgICAgc2VhcmNoRm9ybTogewogICAgICAgICAgICAgIEZfeGI6ICcnLAogICAgICAgICAgICAgIEZfeG06ICcnCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHF1ZXJ5Rm9ybTogewogICAgICAgICAgICAgIHF1ZXJ5RGF0YTogJycKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZm9ybVR5cGU6IGZhbHNlLAogICAgICAgICAgICBsYWJlbFBvc2l0aW9uOiAnbGVmdCcsCiAgICAgICAgICAgIGluY29uczogJ2VsLWljb24tYXJyb3ctZG93bicsCiAgICAgICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgICAgICBmdWxsc2NyZWVuOiB0cnVlLAogICAgICAgICAgICAgIGxvY2s6IHRydWUKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcm93VGVtcGxhdGVJZDogbnVsbCwKICAgICAgICAgICAgcm93SWQ6IG51bGwsCiAgICAgICAgICAgIFFSQ29kZVNob3c6IHRydWUsCiAgICAgICAgICAgIFFSQ29kZURlc2M6IFtdLAogICAgICAgICAgICB0cmVlOiBbXSwKICAgICAgICAgICAgY3VzdG9tRGlhbG9nOiBbXSwKICAgICAgICAgICAgdGFibGVIZWlnaHQ6IDAuNjg1ICogd2luZG93LmlubmVySGVpZ2h0LAogICAgICAgICAgICBkaWFsb2dTdWJWaXNpYmxlOiBmYWxzZSwKICAgICAgICAgICAgdGFiczogW10sCiAgICAgICAgICAgIGVudHM6IFtdLAogICAgICAgICAgICBtb2RpZnlSZWNvcmQ6IHsKICAgICAgICAgICAgICBwYWdpbmF0aW9uOiB7CiAgICAgICAgICAgICAgICBwYWdlQmVhbjogewogICAgICAgICAgICAgICAgICBwYWdlOiAxLAogICAgICAgICAgICAgICAgICBwYWdlU2l6ZTogMjAsCiAgICAgICAgICAgICAgICAgIHRvdGFsOiAwCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICByZWNvcmRMaXN0OiBbXSwKICAgICAgICAgICAgcmVjb3JkUmVmSWQ6ICcnLAogICAgICAgICAgICBkaWFsb2dSZWNvcmRWaXNpYmxlOiBmYWxzZSwKICAgICAgICAgICAgcmVjb3JkVGFibGVMb2FkaW5nOiBmYWxzZSwKICAgICAgICAgICAgbW9kaWZ5RGV0YWlsRGlhbG9nVmlzaWJsZTogZmFsc2UsCiAgICAgICAgICAgIGN1cnJlbnRNb2RpZnk6IHt9LAogICAgICAgICAgICByZWZJZDogJycsCiAgICAgICAgICAgIHF1ZXJ5U3ViVmFsdWU6ICcnLAogICAgICAgICAgICBzdWJUYWJsZUxvYWRpbmc6IGZhbHNlLAogICAgICAgICAgICBjdXJyZW50VGFiTmFtZTogJycsCiAgICAgICAgICAgIGN1cnJlbnRUYWI6IHt9LAogICAgICAgICAgICBleHBvcnRUeXBlOiAnbWFpbicsCiAgICAgICAgICAgIHN1YkRpc3BsYXlGaWVsZHM6IFtdLAogICAgICAgICAgICBzdWJEaXNwbGF5RmllbGRzTGlzdDogW10sCiAgICAgICAgICAgIG5vdFByaW50OiBmYWxzZSwKICAgICAgICAgICAgZGlzcGxheUZpZWxkOiB7fSwKICAgICAgICAgICAgdHJlZUxpc3Q6IFtdLAogICAgICAgICAgICByb3dzOiBbXSwKICAgICAgICAgICAgcGFnaW5hdGlvbjogewogICAgICAgICAgICAgIHBhZ2U6IDEsCiAgICAgICAgICAgICAgcGFnZVNpemU6IDEwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHBhZ2luYXRpb25MYXlvdXQ6ICd0b3RhbCwgc2l6ZXMsIHByZXYsIHBhZ2VyLCBuZXh0LCBqdW1wZXInLAogICAgICAgICAgICB0b3RhbDogMCwKICAgICAgICAgICAgcGVybWlzc2lvbjogewogICAgICAgICAgICAgIHByaW50OiB0cnVlLAogICAgICAgICAgICAgIGFkZDogdHJ1ZSwKICAgICAgICAgICAgICBkZWw6IHRydWUsCiAgICAgICAgICAgICAgZXhwb3J0OiB0cnVlLAogICAgICAgICAgICAgIGVkaXQ6IHRydWUsCiAgICAgICAgICAgICAgaGlkZGVuOiBmYWxzZQogICAgICAgICAgICB9LAogICAgICAgICAgICBzaG93UmlnaHRNZW51OiB0cnVlLAogICAgICAgICAgICBsaXN0U2VsZWN0YWJsZTogdHJ1ZSwKICAgICAgICAgICAgZmlsdGVyczoge30sCiAgICAgICAgICAgIHNvcnRlcjogbnVsbCwKICAgICAgICAgICAgZGlhbG9nU3VuVmlzaWJsZTogZmFsc2UsCiAgICAgICAgICAgIC8v5a2Z6KGo5a+56K+d5qGGCiAgICAgICAgICAgIHN1blRhYnM6IFtdLAogICAgICAgICAgICAvL+WtmeihqOaVsOaNrgogICAgICAgICAgICBxdWVyeVN1blZhbHVlOiAnJywKICAgICAgICAgICAgb3BlcmF0ZUNvbFdpZHRoOiAnMjQwJywKICAgICAgICAgICAgc3VtbWFyeUZpZWxkczogW10sCiAgICAgICAgICAgIGRpYWxvZ1Zpc2libGU6IGZhbHNlLAogICAgICAgICAgICBwYWdlUmVzdWx0OiB7CiAgICAgICAgICAgICAgcGFnZTogMSwKICAgICAgICAgICAgICBwYWdlU2l6ZTogMjAsCiAgICAgICAgICAgICAgdG90YWw6IDAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbG9nRGF0YTogW10sCiAgICAgICAgICAgIG5vdFNvcnRhYmxlRmllbGRzOiBbJ2JwbV9zdGF0dXNfJywgJ2JwbV9wcm9jX2luc3RfaWRfJywgJ2JwbV9zdWJqZWN0XycsICdicG1fcHJvY19kZWZfbmFtZV8nLCAnYnBtX2NyZWF0ZV90aW1lXycsICdicG1fZW5kX3RpbWVfJywgJ2JwbV9pc19mb3JiaWRkZW5fJywgJ2JwbV9jcmVhdG9yXyddLAogICAgICAgICAgICBkZWZhdWx0VmFsdWVMaXN0OiBbXSwKICAgICAgICAgICAgLy/mibnph4/mm7TmlrDmlbDmja4KICAgICAgICAgICAgaWdub3JlZEFsaWFzOiBbJ2FwcENlbnRlckZyb250J10sCiAgICAgICAgICAgIFFSQ29kZVBhdHRlcm46IHRydWUsCiAgICAgICAgICAgIFFSQ29kZVR5cGU6ICcnLAogICAgICAgICAgICBpc01vYmlsZTogZmFsc2UsCiAgICAgICAgICAgIGFjdGl2ZU5hbWVzOiBbJzEnXSwKICAgICAgICAgICAgc3dpdGNoTWFwOiB7fSwKICAgICAgICAgICAgZmlsdGVyTWFwOiB7fQogICAgICAgICAgfTsKICAgICAgICB9LAogICAgICAgIGNvbXBvbmVudHM6IHsKICAgICAgICAgIFZSdW50aW1lVGVtcGxhdGU6IFZSdW50aW1lVGVtcGxhdGUsCiAgICAgICAgICBIdENoZWNrYm94OiBIdENoZWNrYm94LAogICAgICAgICAgSHREaWFsb2c6IEh0RGlhbG9nLAogICAgICAgICAgSHREaWFsb2dCdG46IEh0RGlhbG9nQnRuLAogICAgICAgICAgVGVtcGxhdGVCYXRjaFVwZGF0ZURpYWxvZzogVGVtcGxhdGVCYXRjaFVwZGF0ZURpYWxvZywKICAgICAgICAgIEVpcFNlbGVjdDogRWlwU2VsZWN0CiAgICAgICAgfSwKICAgICAgICB3YXRjaDogewogICAgICAgICAgZW50czogewogICAgICAgICAgICBoYW5kbGVyOiBmdW5jdGlvbiBoYW5kbGVyKG5ld1ZhbCwgb2xkVmFsdWUpIHsKICAgICAgICAgICAgICBpZiAobmV3VmFsICYmIG5ld1ZhbC5sZW5ndGggPj0gMSAmJiBuZXdWYWwgIT0gb2xkVmFsdWUpIHsKICAgICAgICAgICAgICAgIHRoaXMuZ2V0U3ViRGF0YSh0aGlzLCB0aGlzLnJlZklkKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGRlZXA6IHRydWUsCiAgICAgICAgICAgIGltbWVkaWF0ZTogdHJ1ZQogICAgICAgICAgfSwKICAgICAgICAgIHRlbXBsYXRlSW5mbzogewogICAgICAgICAgICBoYW5kbGVyOiBmdW5jdGlvbiBoYW5kbGVyKG5ld1ZhbCwgb2xkVmFsKSB7CiAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgICBpZiAobmV3VmFsICYmIG5ld1ZhbC5pZCkgewogICAgICAgICAgICAgICAgdmFyIGxvYWRpbmcgPSB0aGlzLiRsb2FkaW5nKHRoaXMub3B0aW9ucyk7CiAgICAgICAgICAgICAgICB2YXIgX21lID0gdGhpczsKICAgICAgICAgICAgICAgIF9tZS50ZW1wbGF0ZUluZm8gPSBuZXdWYWw7CiAgICAgICAgICAgICAgICBpZiAoX21lLnRlbXBsYXRlSW5mby5kaXNwbGF5RmllbGQpIHsKICAgICAgICAgICAgICAgICAgdmFyIGRpc3BsYXlGaWVsZCA9IHV0aWxzLnBhcnNlVG9Kc29uKF9tZS50ZW1wbGF0ZUluZm8uZGlzcGxheUZpZWxkKTsKICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaXNwbGF5RmllbGQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZGlzcGxheUZpZWxkW2ldLnR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheUZpZWxkcy5wdXNoKGRpc3BsYXlGaWVsZFtpXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoX21lLnRlbXBsYXRlSW5mby5jb25kaXRpb25GaWVsZCkgewogICAgICAgICAgICAgICAgICB2YXIgY29uZGl0aW9uRmllbGQgPSB1dGlscy5wYXJzZVRvSnNvbihfbWUudGVtcGxhdGVJbmZvLmNvbmRpdGlvbkZpZWxkKTsKICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25kaXRpb25GaWVsZC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIHZhciBmaWVsZE5hbWUgPSAnRl8nICsgY29uZGl0aW9uRmllbGRbaV0ubmFtZTsKICAgICAgICAgICAgICAgICAgICB0aGlzLiRzZXQodGhpcy5zZWFyY2hGb3JtLCBmaWVsZE5hbWUsICcnKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHBhcmFtcyA9IHsKICAgICAgICAgICAgICAgICAgdGVtcGxhdGVJZDogX21lLnRlbXBsYXRlSW5mby5pZAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHZhciBwYWdlQmVhbiA9IHsKICAgICAgICAgICAgICAgICAgcGFnZUJlYW46IHsKICAgICAgICAgICAgICAgICAgICBwYWdlOiAnMScsCiAgICAgICAgICAgICAgICAgICAgcGFnZVNpemU6IG5ld1ZhbC5wYWdlU2l6ZSwKICAgICAgICAgICAgICAgICAgICBzaG93VG90YWw6ICd0cnVlJwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OyAvL+WIneasoeWKoOi9vem7mOiupHBhZ2VCZWFuCiAgICAgICAgICAgICAgICBwYXJhbXMucGFnaW5hdGlvbiA9IHBhZ2VCZWFuOwogICAgICAgICAgICAgICAgaWYgKF9tZS5pc0pvaW5GbG93KSB7CiAgICAgICAgICAgICAgICAgIHBhcmFtcy5pc0pvaW5GbG93ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgcGFyYW1zLnRhc2tUeXBlID0gX21lLnRhc2tUeXBlOwogICAgICAgICAgICAgICAgICBwYXJhbXMuZGVmS2V5ID0gX21lLmRlZktleTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChfbWUuZGF0YVZpZXcpIHsKICAgICAgICAgICAgICAgICAgX21lLmhhbmRlbEJpbmRGaWxlZFZhbHVhKCk7CiAgICAgICAgICAgICAgICAgIC8v5YWz6IGU5p+l6K+i5a2X5q61CiAgICAgICAgICAgICAgICAgIGlmIChfbWUuZGF0YVZpZXcuc2VsZWN0TGlzdCAmJiBfbWUuZGF0YVZpZXcuc2VsZWN0TGlzdC5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgcGFyYW1zLnNlbGVjdExpc3QgPSBfbWUuZGF0YVZpZXcuc2VsZWN0TGlzdDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBwYXJhbXMucmVmSWRWYWx1ZSA9IF9tZS5kYXRhVmlldy5yZWZJZFZhbHVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyYW1ldGVycVF1ZXJ5cykgewogICAgICAgICAgICAgICAgICB2YXIgcXVlcnlzID0gSlNPTi5wYXJzZShCYXNlNjQuZGVjb2RlKGRlY29kZVVSSUNvbXBvbmVudCh0aGlzLnBhcmFtZXRlcnFRdWVyeXMpKSk7CiAgICAgICAgICAgICAgICAgIHBhcmFtcy5wYWdpbmF0aW9uLnF1ZXJ5cyA9IHF1ZXJ5czsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBkZWZhdWx0UXVlcnkgPSB0aGlzLmJ1aWxkRGVmYXVsdFF1ZXJ5cygpOwogICAgICAgICAgICAgICAgaWYgKGRlZmF1bHRRdWVyeS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgIGlmIChwYXJhbXMucGFnaW5hdGlvbi5xdWVyeXMpIHsKICAgICAgICAgICAgICAgICAgICBwYXJhbXMucGFnaW5hdGlvbi5xdWVyeXMuY29uY2F0KGRlZmF1bHRRdWVyeSk7CiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcGFyYW1zLnBhZ2luYXRpb24ucXVlcnlzID0gZGVmYXVsdFF1ZXJ5OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvL+WmguaenOacieiuvue9rum7mOiupOaOkuW6jyzkvJjlhYjkvb/nlKjpu5jorqTmjpLluo8KICAgICAgICAgICAgICAgIGlmICh0aGlzLnRlbXBsYXRlSW5mby5zb3J0RmllbGQpIHsKICAgICAgICAgICAgICAgICAgdmFyIHNvcnRGaWVsZCA9IEpTT04ucGFyc2UodGhpcy50ZW1wbGF0ZUluZm8uc29ydEZpZWxkKTsKICAgICAgICAgICAgICAgICAgdmFyIHNvcnRlciA9IFtdOwogICAgICAgICAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHNvcnRGaWVsZC5sZW5ndGg7IHgrKykgewogICAgICAgICAgICAgICAgICAgIHNvcnRlci5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICdwcm9wZXJ0eSc6IHNvcnRGaWVsZFt4XS5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgJ2RpcmVjdGlvbic6IHNvcnRGaWVsZFt4XS5zb3J0CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgcGFyYW1zLnBhZ2luYXRpb24uc29ydGVyID0gc29ydGVyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHRoaXNfID0gdGhpczsKICAgICAgICAgICAgICAgIGlmIChwYXJhbXMudGVtcGxhdGVJZCkgewogICAgICAgICAgICAgICAgICB0aGlzLiRzdG9yZS5kaXNwYXRjaCgnZm9ybS9nZXRCcG1UZW1wbGF0ZUJ5UGFnaW5hdGlvbicsIHBhcmFtcykudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzXy5yb3dzID0gcmVzcG9uc2UuZGF0YS5yb3dzOwogICAgICAgICAgICAgICAgICAgIHRoaXNfLnRvdGFsID0gcmVzcG9uc2UuZGF0YS50b3RhbDsKICAgICAgICAgICAgICAgICAgICB0aGlzXy5wYWdpbmF0aW9uLnBhZ2UgPSByZXNwb25zZS5kYXRhLnBhZ2U7CiAgICAgICAgICAgICAgICAgICAgdGhpc18ucGFnaW5hdGlvbi5wYWdlU2l6ZSA9IHJlc3BvbnNlLmRhdGEucGFnZVNpemU7CiAgICAgICAgICAgICAgICAgICAgbG9hZGluZy5jbG9zZSgpOwogICAgICAgICAgICAgICAgICAgIHRoaXNfLmluaXRTd2l0Y2hTdGF0dXMoKTsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpc18uJGVsICYmIHRoaXNfLiRlbC5xdWVyeVNlbGVjdG9yKSB7CiAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9wQnRuRG9tID0gdGhpc18uJGVsLnF1ZXJ5U2VsZWN0b3IoJ2Rpdi50b3BfYnRuX2NvbCcpOwogICAgICAgICAgICAgICAgICAgICAgaWYgKCF0b3BCdG5Eb20gfHwgIXRvcEJ0bkRvbS5xdWVyeVNlbGVjdG9yKCdpLmVsLWljb24tZGVsZXRlJykgJiYgIXRvcEJ0bkRvbS5xdWVyeVNlbGVjdG9yKCdpLmVsLWljb24tZWRpdCcpICYmICF0b3BCdG5Eb20ucXVlcnlTZWxlY3RvcignaS5lbC1pY29uLXMtZ3JpZCcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfLmxpc3RTZWxlY3RhYmxlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRkRG9tID0gdGhpc18uJGVsLnF1ZXJ5U2VsZWN0b3IoJ3RkLnJpZ2h0X21lbnUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0ZERvbSB8fCAhdGREb20ucXVlcnlTZWxlY3RvcignYnV0dG9uJykgJiYgdGREb20ucXVlcnlTZWxlY3Rvcignc3dpdGNoJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzXy5zaG93UmlnaHRNZW51ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIH0sIDIwMCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGxvYWRpbmcuY2xvc2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChuZXdWYWwudHJlZUZpZWxkICYmIG5ld1ZhbC50cmVlRmllbGQgIT09ICd7fScpIHsKICAgICAgICAgICAgICAgICAgdmFyIHRyZWVGaWVsZCA9IEpTT04ucGFyc2UobmV3VmFsLnRyZWVGaWVsZCk7CiAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdFRyZWUodHJlZUZpZWxkKTsKICAgICAgICAgICAgICAgICAgZm9ybS5nZXRTdWJFbnRzQnlGb3JtS2V5KHRoaXMudGVtcGxhdGVJbmZvLmZvcm1LZXksIGZ1bmN0aW9uIChyZXNwKSB7CiAgICAgICAgICAgICAgICAgICAgcmVzcC5kYXRhLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICAgICAgICAgICAgICAgIHZhciBzdWJEaXNwbGF5RmllbGRzID0gW107CiAgICAgICAgICAgICAgICAgICAgICBpdGVtLmF0dHJpYnV0ZUxpc3QuZm9yRWFjaChmdW5jdGlvbiAoYXR0cikgewogICAgICAgICAgICAgICAgICAgICAgICBzdWJEaXNwbGF5RmllbGRzLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2M6IGF0dHIuY29tbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBhdHRyLmZpZWxkTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBhdHRyLmNvbHVtblR5cGUKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnN1YkRpc3BsYXlGaWVsZHMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkczogc3ViRGlzcGxheUZpZWxkcywKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogaXRlbS5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50OiBpdGVtLmNvbW1lbnQKICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChuZXdWYWwuc3VtbWFyeUZpZWxkKSB7CiAgICAgICAgICAgICAgICAgIHRoaXMuc3VtbWFyeUZpZWxkcyA9IEpTT04ucGFyc2UobmV3VmFsLnN1bW1hcnlGaWVsZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBkZWVwOiB0cnVlLAogICAgICAgICAgICBpbW1lZGlhdGU6IHRydWUKICAgICAgICAgIH0sCiAgICAgICAgICBjdXJyZW50VGFiTmFtZTogZnVuY3Rpb24gY3VycmVudFRhYk5hbWUobmV3VmFsKSB7CiAgICAgICAgICAgIGlmIChuZXdWYWwpIHsKICAgICAgICAgICAgICB0aGlzLnF1ZXJ5U3ViVmFsdWUgPSAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgY29tcHV0ZWQ6IHsKICAgICAgICAgIHNob3dEcmFmdExpc3Q6IGZ1bmN0aW9uIHNob3dEcmFmdExpc3QoKSB7CiAgICAgICAgICAgIC8v5aaC5p6c5b2T5YmN6aG16Z2i6KKr5bWM5YWlaWZyYW1l6YeM6Z2i5LiN5pi+56S66I2J56i/CiAgICAgICAgICAgIHJldHVybiB3aW5kb3cuc2VsZiA9PT0gd2luZG93LnRvcDsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7CiAgICAgICAgICB0aGlzLmhhbmRlbEJpbmRGaWxlZFZhbHVhKCk7CiAgICAgICAgICB2YXIgdGhpc18gPSB0aGlzOwogICAgICAgICAgdGhpcy4kcm9vdC4kb24oJ2Zvcm0tcmVsb2FkLXN1Y2Nlc3MnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXNfLmhhbmRlbEJpbmRGaWxlZFZhbHVhKCk7CiAgICAgICAgICB9KTsKICAgICAgICAgIHRoaXMuJGVtaXQoImFmdGVyTW91bnRlZCIpOwogICAgICAgIH0sCiAgICAgICAgbWV0aG9kczogewogICAgICAgICAgbG9hZERhdGE6IGZ1bmN0aW9uIGxvYWREYXRhKHBhcmFtLCBjYikgewogICAgICAgICAgICB2YXIgX3RoaXMyID0gdGhpczsKICAgICAgICAgICAgdmFyIHF1ZXJ5cyA9IHBhcmFtLnF1ZXJ5cyB8fCBbXTsKICAgICAgICAgICAgdmFyIGhhc0RlZmF1bHRRdWVyeSA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLmhhbmRlbEJpbmRGaWxlZFZhbHVhKCk7CiAgICAgICAgICAgIHZhciBwSUQgPSB0aGlzLmRhdGFWaWV3LnJlZklkVmFsdWU7CiAgICAgICAgICAgIHF1ZXJ5cy5mb3JFYWNoKGZ1bmN0aW9uIChxKSB7CiAgICAgICAgICAgICAgaWYgKHEucHJvcGVydHkgPT0gJ1BJZCcpIHsKICAgICAgICAgICAgICAgIGhhc0RlZmF1bHRRdWVyeSA9IHRydWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgaWYgKCFoYXNEZWZhdWx0UXVlcnkpIHsKICAgICAgICAgICAgICBxdWVyeXMucHVzaCh7CiAgICAgICAgICAgICAgICBvcGVyYXRpb246ICdFUVVBTCcsCiAgICAgICAgICAgICAgICBncm91cDogJ2RlZmFsdXQnLAogICAgICAgICAgICAgICAgcHJvcGVydHk6ICdQSWQnLAogICAgICAgICAgICAgICAgcmVsYXRpb246ICdBTkQnLAogICAgICAgICAgICAgICAgdmFsdWU6IHBJRAogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIHF1ZXJ5cy5wdXNoKHsKICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogJ0VRVUFMJywKICAgICAgICAgICAgICAgIGdyb3VwOiAnZGVmYWx1dCcsCiAgICAgICAgICAgICAgICBwcm9wZXJ0eTogJ2JvQWxpYXMnLAogICAgICAgICAgICAgICAgcmVsYXRpb246ICdBTkQnLAogICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMudGVtcGxhdGVJbmZvLmJvRGVmQWxpYXMKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwYXJhbS5xdWVyeXMgPSBxdWVyeXM7CiAgICAgICAgICAgIHJlcS5wb3N0KHdpbmRvdy5jb250ZXh0LmZvcm0gKyAnL2Zvcm0vZm9ybURhdGFJbXBvcnRMb2cvdjEvbGlzdEpzb24nLCBwYXJhbSkudGhlbihmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgIHZhciByZXNwb25zZSA9IGRhdGEuZGF0YTsKICAgICAgICAgICAgICBfdGhpczIubG9nRGF0YSA9IHJlc3BvbnNlLnJvd3M7CiAgICAgICAgICAgICAgX3RoaXMyLnBhZ2VSZXN1bHQgPSB7CiAgICAgICAgICAgICAgICBwYWdlOiByZXNwb25zZS5wYWdlLAogICAgICAgICAgICAgICAgcGFnZVNpemU6IHJlc3BvbnNlLnBhZ2VTaXplLAogICAgICAgICAgICAgICAgdG90YWw6IHJlc3BvbnNlLnRvdGFsCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSkuZmluYWxseShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGNiKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSwKICAgICAgICAgIGhhbmRlbEJpbmRGaWxlZFZhbHVhOiBmdW5jdGlvbiBoYW5kZWxCaW5kRmlsZWRWYWx1YSgpIHsKICAgICAgICAgICAgLy/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/aWQ9JyArIGlkICsgJyYnOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHVybCArPSAnPyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHN0YXJ0Rmxvd1N0ciA9ICdzdGFydEZsb3c9ZmFsc2UnOwogICAgICAgICAgICB2YXIgcGF0aCA9IHVybCArIHN0YXJ0Rmxvd1N0cjsKICAgICAgICAgICAgaWYgKHBhdGguaW5kZXhPZignb3RoZXJtZW51JykgIT0gLTEpIHsKICAgICAgICAgICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKCcvb3RoZXJtZW51JywgJy9zdGF0ZW1lbnQnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLiRyb3V0ZXIucHVzaCh7CiAgICAgICAgICAgICAgcGF0aDogcGF0aCwKICAgICAgICAgICAgICBxdWVyeTogewogICAgICAgICAgICAgICAgaXNQcmludDogdHJ1ZQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICB9LAogICAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uIGNvbXBsZXRlKHJvdywgdGFza1R5cGUpIHsKICAgICAgICAgICAgdmFyIF90aGlzNCA9IHRoaXM7CiAgICAgICAgICAgIGlmICh0YXNrVHlwZSA9PSAndG9kbycpIHsKICAgICAgICAgICAgICB2YXIgdXJsID0gd2luZG93LmNvbnRleHQuYnBtUnVuVGltZSArICcvcnVudGltZS90YXNrL3YxL2dldEJwbVRhc2tCeUluc3RJZD9pbnN0SWQ9JyArIHJvdy5icG1fcHJvY19pbnN0X2lkXzsKICAgICAgICAgICAgICByZXEuZ2V0KHVybCkudGhlbihmdW5jdGlvbiAocmVzKSB7CiAgICAgICAgICAgICAgICBpZiAocmVzLmRhdGEubGVuZ3RoID09IDApIHsKICAgICAgICAgICAgICAgICAgX3RoaXM0LiRtZXNzYWdlLmVycm9yKCfmraTku7vliqHlt7LooqvlpITnkIbmiJbkuI3lrZjlnKjvvIEnKTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzLmRhdGEubGVuZ3RoID09IDEpIHsKICAgICAgICAgICAgICAgICAgX3RoaXM0LiRyb3V0ZXIucHVzaCgiL3JlcG9ydE1vZHVsZUluc3QvIiArIHJlcy5kYXRhWzBdLmlkICsgIi8wIiArICIvIiArIF90aGlzNC5kZWZLZXkgKyAiL3RydWUvIiArIF90aGlzNC50ZW1wbGF0ZUtleSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBfdGhpczQuJG1lc3NhZ2UuZXJyb3IoJ+aaguS4jeaUr+aMge+8gScpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9IGVsc2UgaWYgKHRhc2tUeXBlID09ICJkb25lIikgewogICAgICAgICAgICAgIHRoaXMuJHJvdXRlci5wdXNoKCcvcmVwb3J0TW9kdWxlSW5zdERvbmUvJyArIHJvdy5icG1fcHJvY19pbnN0X2lkXyArICcvZG9uZUxpc3QvJyArIHRoaXMuZGVmS2V5ICsgJy8nICsgdGhpcy50ZW1wbGF0ZUtleSk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAodGFza1R5cGUgPT0gInJlcXVlc3QiKSB7CiAgICAgICAgICAgICAgdGhpcy4kcm91dGVyLnB1c2goJy9yZXBvcnRNb2R1bGVJbnN0RG9uZS8nICsgcm93LmJwbV9wcm9jX2luc3RfaWRfICsgJy9yZXF1ZXN0LycgKyB0aGlzLmRlZktleSArICcvJyArIHRoaXMudGVtcGxhdGVLZXkpOwogICAgICAgICAgICB9IGVsc2UgaWYgKHRhc2tUeXBlID09ICJ0b2RvUmVhZCIpIHsKICAgICAgICAgICAgICB2YXIgcGFnZUJlYW4gPSB7CiAgICAgICAgICAgICAgICAicGFnZSI6IDEsCiAgICAgICAgICAgICAgICAicGFnZVNpemUiOiAxMCwKICAgICAgICAgICAgICAgICJzaG93VG90YWwiOiAidHJ1ZSIKICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIHZhciBzdGF0dXMgPSByb3cuYnBtX3N0YXR1c187CiAgICAgICAgICAgICAgcmVxLnBvc3QoJyR7YnBtUnVuVGltZX0vcnVudGltZS90YXNrL3YxL2dldE5vdGljZVRvZG9SZWFkTGlzdCcsIHsKICAgICAgICAgICAgICAgIHBhZ2VCZWFuOiBwYWdlQmVhbiwKICAgICAgICAgICAgICAgIHF1ZXJ5czogW3sKICAgICAgICAgICAgICAgICAgcHJvcGVydHk6ICJwcm9jX2luc3RfaWRfIiwKICAgICAgICAgICAgICAgICAgdmFsdWU6IHJvdy5icG1fcHJvY19pbnN0X2lkXywKICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uOiAnRVFVQUwnLAogICAgICAgICAgICAgICAgICByZWxhdGlvbjogJ0FORCcKICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5kYXRhLnJvd3MgJiYgcmVzcG9uc2UuZGF0YS5yb3dzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgdmFyIGlkID0gcmVzcG9uc2UuZGF0YS5yb3dzWzBdLmlkOwogICAgICAgICAgICAgICAgICB2YXIgX3VybCA9ICIiOwogICAgICAgICAgICAgICAgICA3OwogICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09ICdGT0xMT1cnKSB7CiAgICAgICAgICAgICAgICAgICAgX3VybCA9ICcvcmVwb3J0TW9kdWxlSW5zdFRhc2tSZWFkLycgKyBpZCArICcvRk9MTE9XLycgKyBfdGhpczQuZGVmS2V5ICsgJy8nICsgX3RoaXM0LnRlbXBsYXRlS2V5OwogICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PSAnQ09NTVUnKSB7CiAgICAgICAgICAgICAgICAgICAgX3VybCA9ICcvcmVwb3J0TW9kdWxlSW5zdC8nICsgaWQgKyAnLzAvJyArIF90aGlzNC5kZWZLZXkgKyAnL3RydWUvJyArIF90aGlzNC50ZW1wbGF0ZUtleTsKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBfdXJsID0gJy9yZXBvcnRNb2R1bGVJbnN0UmVhZC8nICsgcm93LmJwbV9wcm9jX2luc3RfaWRfICsgJy9yZWFkLycgKyBpZCArICcvJyArIF90aGlzNC5kZWZLZXkgKyAiLyIgKyBfdGhpczQudGVtcGxhdGVLZXk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgX3RoaXM0LiRyb3V0ZXIucHVzaChfdXJsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSBlbHNlIGlmICh0YXNrVHlwZSA9PSAiZG9uZVJlYWQiKSB7CiAgICAgICAgICAgICAgdmFyIF9wYWdlQmVhbiA9IHsKICAgICAgICAgICAgICAgICJwYWdlIjogMSwKICAgICAgICAgICAgICAgICJwYWdlU2l6ZSI6IDEwLAogICAgICAgICAgICAgICAgInNob3dUb3RhbCI6ICJ0cnVlIgogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgcmVxLnBvc3QoJyR7YnBtUnVuVGltZX0vcnVudGltZS90YXNrL3YxL2dldE5vdGljZURvbmVSZWFkTGlzdCcsIHsKICAgICAgICAgICAgICAgIHBhZ2VCZWFuOiBfcGFnZUJlYW4sCiAgICAgICAgICAgICAgICBxdWVyeXM6IFt7CiAgICAgICAgICAgICAgICAgIHByb3BlcnR5OiAicHJvY19pbnN0X2lkXyIsCiAgICAgICAgICAgICAgICAgIHZhbHVlOiByb3cuYnBtX3Byb2NfaW5zdF9pZF8sCiAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogJ0VRVUFMJywKICAgICAgICAgICAgICAgICAgcmVsYXRpb246ICdBTkQnCiAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuZGF0YS5yb3dzICYmIHJlc3BvbnNlLmRhdGEucm93cy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgIHZhciBpZCA9IHJlc3BvbnNlLmRhdGEucm93c1swXS5pZDsKICAgICAgICAgICAgICAgICAgX3RoaXM0LiRyb3V0ZXIucHVzaCgnL3JlcG9ydE1vZHVsZUluc3REb25lLycgKyByb3cuYnBtX3Byb2NfaW5zdF9pZF8gKyAnL3JlYWQvZG9uZS8nICsgaWQgKyAnLycgKyBfdGhpczQuZGVmS2V5ICsgIi8iICsgX3RoaXM0LnRlbXBsYXRlS2V5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSBlbHNlIGlmICh0YXNrVHlwZSA9PSAibXlSZWFkIikgewogICAgICAgICAgICAgIHZhciBfcGFnZUJlYW4yID0gewogICAgICAgICAgICAgICAgInBhZ2UiOiAxLAogICAgICAgICAgICAgICAgInBhZ2VTaXplIjogMTAsCiAgICAgICAgICAgICAgICAic2hvd1RvdGFsIjogInRydWUiCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICByZXEucG9zdCgnJHticG1SdW5UaW1lfS9ydW50aW1lL3Rhc2svdjEvZ2V0TXlOb3RpY2VSZWFkTGlzdCcsIHsKICAgICAgICAgICAgICAgIHBhZ2VCZWFuOiBfcGFnZUJlYW4yLAogICAgICAgICAgICAgICAgcXVlcnlzOiBbewogICAgICAgICAgICAgICAgICBwcm9wZXJ0eTogInByb2NfaW5zdF9pZF8iLAogICAgICAgICAgICAgICAgICB2YWx1ZTogcm93LmJwbV9wcm9jX2luc3RfaWRfLAogICAgICAgICAgICAgICAgICBvcGVyYXRpb246ICdFUVVBTCcsCiAgICAgICAgICAgICAgICAgIHJlbGF0aW9uOiAnQU5EJwogICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEucm93cyAmJiByZXNwb25zZS5kYXRhLnJvd3MubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICB2YXIgaWQgPSByZXNwb25zZS5kYXRhLnJvd3NbMF0uaWQ7CiAgICAgICAgICAgICAgICAgIF90aGlzNC4kcm91dGVyLnB1c2goJy9yZXBvcnRNb2R1bGVJbnN0TXlSZWFkLycgKyByb3cuYnBtX3Byb2NfaW5zdF9pZF8gKyAnLycgKyBpZCArICcvbXlSZWFkLycgKyBfdGhpczQuZGVmS2V5ICsgIi8iICsgX3RoaXM0LnRlbXBsYXRlS2V5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSBlbHNlIGlmICh0YXNrVHlwZSA9PSAibXlEZWxlZ2F0ZSIpIHsKICAgICAgICAgICAgICB0aGlzLiRyb3V0ZXIucHVzaCgnL3JlcG9ydE1vZHVsZUluc3RSZWFkLycgKyByb3cuYnBtX3Byb2NfaW5zdF9pZF8gKyAnL2RlbGVnYXRlLycgKyB0aGlzLmRlZktleSArICIvIiArIHRoaXMudGVtcGxhdGVLZXkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgLy/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/ICIiIDogIkZfIjsKICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHRoaXMuZmlsdGVycykuZm9yRWFjaChmdW5jdGlvbiAoaykgewogICAgICAgICAgICAgICAgICB2YXIgZmlsdGVyID0gX3RoaXM2LmZpbHRlcnNba107CiAgICAgICAgICAgICAgICAgIHZhciBxdWVyeSA9IHsKICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eTogcHJlZml4ICsgaywKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZmlsdGVyWzBdLAogICAgICAgICAgICAgICAgICAgIGdyb3VwOiAnZmlsdGVyJywKICAgICAgICAgICAgICAgICAgICByZWxhdGlvbjogJ0FORCcKICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgaWYgKGZpbHRlci5sZW5ndGggPT0gMSkgewogICAgICAgICAgICAgICAgICAgIHF1ZXJ5Lm9wZXJhdGlvbiA9ICdFUVVBTCc7CiAgICAgICAgICAgICAgICAgICAgcXVlcnlzLnB1c2gocXVlcnkpOwogICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpbHRlci5sZW5ndGggPiAxKSB7CiAgICAgICAgICAgICAgICAgICAgcXVlcnkub3BlcmF0aW9uID0gJ0lOJzsKICAgICAgICAgICAgICAgICAgICBxdWVyeS52YWx1ZSA9IGZpbHRlcjsKICAgICAgICAgICAgICAgICAgICBxdWVyeXMucHVzaChxdWVyeSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBxdWVyeUZpbHRlciA9IHsKICAgICAgICAgICAgICAgIHBhZ2VCZWFuOiB0aGlzLnBhZ2luYXRpb24sCiAgICAgICAgICAgICAgICBxdWVyeXM6IHF1ZXJ5cwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgLy/lpoLmnpzmnInorr7nva7pu5jorqTmjpLluo8s5LyY5YWI5L2/55So6buY6K6k5o6S5bqPCiAgICAgICAgICAgICAgaWYgKHRoaXMudGVtcGxhdGVJbmZvLnNvcnRGaWVsZCkgewogICAgICAgICAgICAgICAgdmFyIHNvcnRGaWVsZCA9IEpTT04ucGFyc2UodGhpcy50ZW1wbGF0ZUluZm8uc29ydEZpZWxkKTsKICAgICAgICAgICAgICAgIHZhciBzb3J0ZXIgPSBbXTsKICAgICAgICAgICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgc29ydEZpZWxkLmxlbmd0aDsgeCsrKSB7CiAgICAgICAgICAgICAgICAgIHNvcnRlci5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAncHJvcGVydHknOiBzb3J0RmllbGRbeF0ubmFtZSwKICAgICAgICAgICAgICAgICAgICAnZGlyZWN0aW9uJzogc29ydEZpZWxkW3hdLnNvcnQKICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBxdWVyeUZpbHRlci5zb3J0ZXIgPSBzb3J0ZXI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmICh0aGlzLnNvcnRlciAmJiB0aGlzLnNvcnRlci5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBxdWVyeUZpbHRlci5zb3J0ZXIgPSB0aGlzLnNvcnRlcjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcGFyYW1zLnBhZ2luYXRpb24gPSBxdWVyeUZpbHRlcjsKICAgICAgICAgICAgICByZXR1cm4gcGFyYW1zOwogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgLy8g6YCa6L+H5YiG57uE5ZCN56ew5riF6Zmk5a+55bqU5p+l6K+i5p2h5Lu2CiAgICAgICAgICBjbGVhclF1ZXJ5QnlHcm91cE5hbWU6IGZ1bmN0aW9uIGNsZWFyUXVlcnlCeUdyb3VwTmFtZShxdWVyeXMsIGdyb3VwTmFtZSkgewogICAgICAgICAgICAvLyDlvoXliKDpmaTnmoTmn6Xor6LmnaHku7YKICAgICAgICAgICAgdmFyIHRvRGVsZXRlID0gW107CiAgICAgICAgICAgIHF1ZXJ5cyAmJiBxdWVyeXMuZm9yRWFjaChmdW5jdGlvbiAocXVlcnkpIHsKICAgICAgICAgICAgICBpZiAocXVlcnkuZ3JvdXAgPT0gZ3JvdXBOYW1lKSB7CiAgICAgICAgICAgICAgICB0b0RlbGV0ZS5wdXNoKHF1ZXJ5KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0b0RlbGV0ZS5mb3JFYWNoKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgcXVlcnlzLnJlbW92ZShkKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9LAogICAgICAgICAgaGFuZGxlU29ydENoYW5nZTogZnVuY3Rpb24gaGFuZGxlU29ydENoYW5nZShjb2x1bW4pIHsKICAgICAgICAgICAgaWYgKCFjb2x1bW4ub3JkZXIpIHsKICAgICAgICAgICAgICB0aGlzLnNvcnRlciA9IG51bGw7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdGhpcy5zb3J0ZXIgPSBbewogICAgICAgICAgICAgICAgcHJvcGVydHk6IGNvbHVtbi5wcm9wLAogICAgICAgICAgICAgICAgZGlyZWN0aW9uOiBjb2x1bW4ub3JkZXIgPT0gJ2FzY2VuZGluZycgPyAnQVNDJyA6ICdERVNDJwogICAgICAgICAgICAgIH1dOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuc2VhcmNoKCk7CiAgICAgICAgICB9LAogICAgICAgICAgaGFuZGxlRmlsdGVyQ2hhbmdlOiBmdW5jdGlvbiBoYW5kbGVGaWx0ZXJDaGFuZ2UobSkgewogICAgICAgICAgICB2YXIgX3RoaXM3ID0gdGhpczsKICAgICAgICAgICAgdGhpcy5maWx0ZXJzID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCB0aGlzLmZpbHRlcnMpLCBtKTsKICAgICAgICAgICAgT2JqZWN0LmtleXModGhpcy5maWx0ZXJzKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7CiAgICAgICAgICAgICAgaWYgKCFfdGhpczcuZmlsdGVyc1trXSB8fCBfdGhpczcuZmlsdGVyc1trXS5sZW5ndGggPT0gMCkgewogICAgICAgICAgICAgICAgZGVsZXRlIF90aGlzNy5maWx0ZXJzW2tdOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHRoaXMuc2VhcmNoKCk7CiAgICAgICAgICB9LAogICAgICAgICAgZ2V0U2VhcmNoSXRlbXM6IGZ1bmN0aW9uIGdldFNlYXJjaEl0ZW1zKCkgewogICAgICAgICAgICB2YXIgc2VhcmNoSXRlbXMgPSAkKCcuc2VhcmNoLWl0ZW0nKTsKICAgICAgICAgICAgdmFyIG9wZXJhdGlvbk1hcCA9IHt9OwogICAgICAgICAgICB2YXIgb3BlcmF0aW9uVHlwZSA9IHsKICAgICAgICAgICAgICBsaWtlOiAnTElLRScsCiAgICAgICAgICAgICAgZXF1YWw6ICdFUVVBTCcsCiAgICAgICAgICAgICAgYmV0d2VlbjogJ0JFVFdFRU4nLAogICAgICAgICAgICAgIGxlZnRfbGlrZTogJ0xFRlRfTElLRScsCiAgICAgICAgICAgICAgcmlnaHRfbGlrZTogJ1JJR0hUX0xJS0UnCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmIChzZWFyY2hJdGVtcykgewogICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VhcmNoSXRlbXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIHZhciBvcGVyYXRpb24gPSAnPSc7CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mICQoc2VhcmNoSXRlbXNbaV0pLmF0dHIoJ2h0LXF1ZXJ5JykgIT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uID0gJChzZWFyY2hJdGVtc1tpXSkuYXR0cignb3BlcmF0aW9uJyk7CiAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbk1hcFskKHNlYXJjaEl0ZW1zW2ldKS5hdHRyKCdodC1xdWVyeScpXSA9IHR5cGVvZiBvcGVyYXRpb25UeXBlW29wZXJhdGlvbl0gIT0gJ3VuZGVmaW5lZCcgPyBvcGVyYXRpb25UeXBlW29wZXJhdGlvbl0gOiBvcGVyYXRpb247CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiAkKHNlYXJjaEl0ZW1zW2ldKS5jaGlsZHJlbigpLmF0dHIoJ2h0LXF1ZXJ5JykgIT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uID0gJChzZWFyY2hJdGVtc1tpXSkuY2hpbGRyZW4oKS5hdHRyKCdvcGVyYXRpb24nKTsKICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uTWFwWyQoc2VhcmNoSXRlbXNbaV0pLmNoaWxkcmVuKCkuYXR0cignaHQtcXVlcnknKV0gPSB0eXBlb2Ygb3BlcmF0aW9uVHlwZVtvcGVyYXRpb25dICE9ICd1bmRlZmluZWQnID8gb3BlcmF0aW9uVHlwZVtvcGVyYXRpb25dIDogb3BlcmF0aW9uOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gb3BlcmF0aW9uTWFwOwogICAgICAgICAgfSwKICAgICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24gZ2V0RmllbGRUeXBlKCkgewogICAgICAgICAgICB2YXIgc2VhcmNoSXRlbXMgPSAkKCcuc2VhcmNoLWl0ZW0nKTsKICAgICAgICAgICAgdmFyIG9wZXJhdGlvbk1hcCA9IHt9OwogICAgICAgICAgICB2YXIgb3BlcmF0aW9uVHlwZSA9IHsKICAgICAgICAgICAgICBudW1iZXI6ICdudW1iZXInLAogICAgICAgICAgICAgIHRleHQ6ICd0ZXh0JwogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAoc2VhcmNoSXRlbXMpIHsKICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlYXJjaEl0ZW1zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICB2YXIgb3BlcmF0aW9uID0gJz0nOwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiAkKHNlYXJjaEl0ZW1zW2ldKS5hdHRyKCdodC1xdWVyeScpICE9ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiA9ICQoc2VhcmNoSXRlbXNbaV0pLmF0dHIoJ3R5cGUnKTsKICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uTWFwWyQoc2VhcmNoSXRlbXNbaV0pLmF0dHIoJ2h0LXF1ZXJ5JyldID0gdHlwZW9mIG9wZXJhdGlvblR5cGVbb3BlcmF0aW9uXSAhPSAndW5kZWZpbmVkJyA/IG9wZXJhdGlvblR5cGVbb3BlcmF0aW9uXSA6IG9wZXJhdGlvbjsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mICQoc2VhcmNoSXRlbXNbaV0pLmNoaWxkcmVuKCkuYXR0cignaHQtcXVlcnknKSAhPSAndW5kZWZpbmVkJykgewogICAgICAgICAgICAgICAgICBvcGVyYXRpb24gPSAkKHNlYXJjaEl0ZW1zW2ldKS5jaGlsZHJlbigpLmF0dHIoJ3R5cGUnKTsKICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uTWFwWyQoc2VhcmNoSXRlbXNbaV0pLmNoaWxkcmVuKCkuYXR0cignaHQtcXVlcnknKV0gPSB0eXBlb2Ygb3BlcmF0aW9uVHlwZVtvcGVyYXRpb25dICE9ICd1bmRlZmluZWQnID8gb3BlcmF0aW9uVHlwZVtvcGVyYXRpb25dIDogb3BlcmF0aW9uOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gb3BlcmF0aW9uTWFwOwogICAgICAgICAgfSwKICAgICAgICAgIC8v6I635Y+W54m55q6K5p+l6K+i5oOF5Ya177yI6Ieq5a6a5LmJ5a+56K+d5qGG77yJCiAgICAgICAgICBnZXRTcGVjaWFsTWFwOiBmdW5jdGlvbiBnZXRTcGVjaWFsTWFwKCkgewogICAgICAgICAgICB2YXIgc2VhcmNoSXRlbXMgPSAkKCIuc2VhcmNoLWl0ZW0iKTsKICAgICAgICAgICAgdmFyIGZpZWxkUXVlcnlNYXAgPSB7fTsgLy/mn6Xor6LmnaHku7blrZfmrrUKCiAgICAgICAgICAgIGlmIChzZWFyY2hJdGVtcykgewogICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VhcmNoSXRlbXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgJChzZWFyY2hJdGVtc1tpXSkuYXR0cigiaHQtcXVlcnkiKSAhPSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgICAvL+afpeivouadoeS7tuWtl+autQogICAgICAgICAgICAgICAgICBmaWVsZFF1ZXJ5TWFwWyQoc2VhcmNoSXRlbXNbaV0pLmF0dHIoImh0LXF1ZXJ5IildID0gdHlwZW9mICQoc2VhcmNoSXRlbXNbaV0pLmF0dHIoInNwZWNpYWwtcXVlcnkiKSAhPSAidW5kZWZpbmVkIiA/IHRydWUgOiBmYWxzZTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mICQoc2VhcmNoSXRlbXNbaV0pLmNoaWxkcmVuKCkuYXR0cigiaHQtcXVlcnkiKSAhPSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgICAvL+afpeivouadoeS7tuWtl+autQogICAgICAgICAgICAgICAgICBmaWVsZFF1ZXJ5TWFwWyQoc2VhcmNoSXRlbXNbaV0pLmNoaWxkcmVuKCkuYXR0cigiaHQtcXVlcnkiKV0gPSB0eXBlb2YgJChzZWFyY2hJdGVtc1tpXSkuY2hpbGRyZW4oKS5hdHRyKCJzcGVjaWFsLXF1ZXJ5IikgIT0gInVuZGVmaW5lZCIgPyB0cnVlIDogZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmaWVsZFF1ZXJ5TWFwOwogICAgICAgICAgfSwKICAgICAgICAgIGdldENvbmRpdGlvblF1ZXJ5OiBmdW5jdGlvbiBnZXRDb25kaXRpb25RdWVyeSgpIHsKICAgICAgICAgICAgdmFyIF90aGlzOCA9IHRoaXM7CiAgICAgICAgICAgIHZhciBzZWFyY2hBbGwgPSAkKCcuc2VhcmNoLXF1ZXJ5Jyk7CiAgICAgICAgICAgIHZhciB2YWx1ZXMgPSAnJzsKICAgICAgICAgICAgdmFyIHF1ZXJ5cyA9IFtdOyAvL+afpeivouadoeS7tgogICAgICAgICAgICB2YXIgcXVlcnlGaWx0ZXIgPSB7fTsKICAgICAgICAgICAgdmFyIHBhZ2VCZWFuID0gewogICAgICAgICAgICAgIHBhZ2VCZWFuOiB0aGlzLnBhZ2luYXRpb24KICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIHBhcmFtcyA9IHsKICAgICAgICAgICAgICB0ZW1wbGF0ZUlkOiB0aGlzLnRlbXBsYXRlSW5mby5pZAogICAgICAgICAgICB9OwogICAgICAgICAgICBwYXJhbXMucGFnaW5hdGlvbiA9IHBhZ2VCZWFuOwoKICAgICAgICAgICAgLy8g5bCG6L+H5ruk5p2h5Lu25re75Yqg5p+l6K+i5Y+C5pWw5pWw57uE5LitCiAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlcnMgJiYgT2JqZWN0LmtleXModGhpcy5maWx0ZXJzKS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgdmFyIHByZWZpeCA9IHRoaXMudGVtcGxhdGVJbmZvLmlzRXh0ZXJuYWwgPT09IDEgPyAiIiA6ICJGXyI7CiAgICAgICAgICAgICAgT2JqZWN0LmtleXModGhpcy5maWx0ZXJzKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7CiAgICAgICAgICAgICAgICB2YXIgZmlsdGVyID0gX3RoaXM4LmZpbHRlcnNba107CiAgICAgICAgICAgICAgICB2YXIgcXVlcnkgPSB7CiAgICAgICAgICAgICAgICAgIHByb3BlcnR5OiBwcmVmaXggKyBrLAogICAgICAgICAgICAgICAgICB2YWx1ZTogZmlsdGVyWzBdLAogICAgICAgICAgICAgICAgICBncm91cDogJ2ZpbHRlcicsCiAgICAgICAgICAgICAgICAgIHJlbGF0aW9uOiAnQU5EJwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmIChmaWx0ZXIubGVuZ3RoID09IDEpIHsKICAgICAgICAgICAgICAgICAgcXVlcnkub3BlcmF0aW9uID0gJ0VRVUFMJzsKICAgICAgICAgICAgICAgICAgcXVlcnlzLnB1c2gocXVlcnkpOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaWx0ZXIubGVuZ3RoID4gMSkgewogICAgICAgICAgICAgICAgICBxdWVyeS5vcGVyYXRpb24gPSAnSU4nOwogICAgICAgICAgICAgICAgICBxdWVyeS52YWx1ZSA9IGZpbHRlcjsKICAgICAgICAgICAgICAgICAgcXVlcnlzLnB1c2gocXVlcnkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXJ5Rm9ybS5xdWVyeURhdGEgPT0gJycpIHsKICAgICAgICAgICAgICBxdWVyeUZpbHRlciA9IHsKICAgICAgICAgICAgICAgIHBhZ2VCZWFuOiB0aGlzLnBhZ2luYXRpb24sCiAgICAgICAgICAgICAgICBxdWVyeXM6IHF1ZXJ5cwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgcGFyYW1zLnBhZ2luYXRpb24gPSBxdWVyeUZpbHRlcjsKICAgICAgICAgICAgICByZXR1cm4gcGFyYW1zOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGlmICh0eXBlb2YgJCgkKHNlYXJjaEFsbFswXSkuY2hpbGRyZW4oKVswXSkuYXR0cignaHQtcXVpY2stc2VhcmNoJykgIT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgICAgIHZhbHVlcyA9ICQoJChzZWFyY2hBbGxbMF0pLmNoaWxkcmVuKClbMF0pLmF0dHIoJ2h0LXF1aWNrLXNlYXJjaCcpOwogICAgICAgICAgICAgICAgdmFyIGFyciA9IHZhbHVlcy5zcGxpdCgnLCcpOwogICAgICAgICAgICAgICAgdmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGFyciksCiAgICAgICAgICAgICAgICAgIF9zdGVwOwogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTspIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBfc3RlcC52YWx1ZTsKICAgICAgICAgICAgICAgICAgICBxdWVyeXMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eTogdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5xdWVyeUZvcm0ucXVlcnlEYXRhLAogICAgICAgICAgICAgICAgICAgICAgZ3JvdXA6ICdtYWluJywKICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogJ0xJS0UnLAogICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb246ICdPUicKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICAgIF9pdGVyYXRvci5lKGVycik7CiAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICBfaXRlcmF0b3IuZigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBxdWVyeUZpbHRlciA9IHsKICAgICAgICAgICAgICBwYWdlQmVhbjogdGhpcy5wYWdpbmF0aW9uLAogICAgICAgICAgICAgIHF1ZXJ5czogcXVlcnlzCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHBhcmFtcy5wYWdpbmF0aW9uID0gcXVlcnlGaWx0ZXI7CiAgICAgICAgICAgIHJldHVybiBwYXJhbXM7CiAgICAgICAgICB9LAogICAgICAgICAgLy/miZPlvIDpq5jnuqfmo4DntKIKICAgICAgICAgIGFkdmFuY2VkOiBmdW5jdGlvbiBhZHZhbmNlZCgpIHsKICAgICAgICAgICAgdGhpcy5mb3JtVHlwZSA9ICF0aGlzLmZvcm1UeXBlOwogICAgICAgICAgICBpZiAodGhpcy5mb3JtVHlwZSkgewogICAgICAgICAgICAgIHRoaXMuaW5jb25zID0gJ2VsLWljb24tYXJyb3ctdXAnOwogICAgICAgICAgICAgIHRoaXMucXVlcnlGb3JtLnF1ZXJ5RGF0YSA9ICcnOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHRoaXMuaW5jb25zID0gJ2VsLWljb24tYXJyb3ctZG93bic7CiAgICAgICAgICAgICAgdGhpcy5zZWFyY2hGb3JtID0ge307CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICAvL+Wbnui9puafpeivogogICAgICAgICAgc2VhcmNoRW50ZXJGdW46IGZ1bmN0aW9uIHNlYXJjaEVudGVyRnVuKGUpIHsKICAgICAgICAgICAgdmFyIGtleUNvZGUgPSB3aW5kb3cuZXZlbnQgPyBlLmtleUNvZGUgOiBlLndoaWNoOwogICAgICAgICAgICBpZiAoa2V5Q29kZSA9PSAxMykgewogICAgICAgICAgICAgIHRoaXMuc2VhcmNoKCdmaW5kJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICByZXNldDogZnVuY3Rpb24gcmVzZXQoZmxhZykgewogICAgICAgICAgICB0aGlzLnF1ZXJ5Rm9ybS5xdWVyeURhdGEgPSAnJzsKICAgICAgICAgICAgaWYgKHRoaXMudGVtcGxhdGVJbmZvLmNvbmRpdGlvbkZpZWxkKSB7CiAgICAgICAgICAgICAgdmFyIGNvbmRpdGlvbkZpZWxkID0gdXRpbHMucGFyc2VUb0pzb24odGhpcy50ZW1wbGF0ZUluZm8uY29uZGl0aW9uRmllbGQpOwogICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29uZGl0aW9uRmllbGQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIHZhciBmaWVsZE5hbWUgPSAnRl8nICsgY29uZGl0aW9uRmllbGRbaV0ubmFtZTsKICAgICAgICAgICAgICAgIHRoaXMuJHNldCh0aGlzLnNlYXJjaEZvcm0sIGZpZWxkTmFtZSwgJycpOwogICAgICAgICAgICAgICAgdGhpcy4kc2V0KHRoaXMuc2VhcmNoRm9ybSwgY29uZGl0aW9uRmllbGRbaV0ubmFtZSwgJycpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmZpbHRlcnMgPSB7fTsKICAgICAgICAgICAgdGhpcy4kcmVmcy5tdWx0aXBsZVRlbXBsYXRlVGFibGUuY2xlYXJGaWx0ZXIoKTsKICAgICAgICAgICAgaWYgKCFmbGFnKSB7CiAgICAgICAgICAgICAgdGhpcy5zZWFyY2goJ2ZpbmQnKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIGhhbmRsZVNlbGVjdGlvbkNoYW5nZTogZnVuY3Rpb24gaGFuZGxlU2VsZWN0aW9uQ2hhbmdlKHZhbCkgewogICAgICAgICAgICB0aGlzLnRhYmxlRGF0YS5zZWxlY3RSb3dzID0gdmFsOwogICAgICAgICAgfSwKICAgICAgICAgIGRlbGV0ZWQ6IGZ1bmN0aW9uIGRlbGV0ZWQoKSB7CiAgICAgICAgICAgIHZhciBfdGhpczkgPSB0aGlzOwogICAgICAgICAgICBpZiAodGhpcy50YWJsZURhdGEuc2VsZWN0Um93cyA9PSBudWxsIHx8IHRoaXMudGFibGVEYXRhLnNlbGVjdFJvd3MubGVuZ3RoID09IDApIHsKICAgICAgICAgICAgICB0aGlzLiRtZXNzYWdlLndhcm5pbmcoJ+ivt+mAieaLqeaWh+S7tuWIoOmZpCEnKTsKICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy4kY29uZmlybSgn5q2k5pON5L2c5bCG5Yig6Zmk6K+l5paH5Lu2LCDmmK/lkKbnu6fnu60/JywgJ+aPkOekuicsIHsKICAgICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogJ+ehruWumicsCiAgICAgICAgICAgICAgY2FuY2VsQnV0dG9uVGV4dDogJ+WPlua2iCcsCiAgICAgICAgICAgICAgdHlwZTogJ3dhcm5pbmcnCiAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgIHZhciBzID0gW107CiAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBfdGhpczkudGFibGVEYXRhLnNlbGVjdFJvd3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIHMucHVzaChfdGhpczkudGFibGVEYXRhLnNlbGVjdFJvd3NbaV1bX3RoaXM5LnRlbXBsYXRlSW5mby5wa0ZpZWxkXSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHZhciBkYXRhID0gewogICAgICAgICAgICAgICAgaWRzOiBzLmpvaW4oJywnKSwKICAgICAgICAgICAgICAgIGJvQWxpYXM6IF90aGlzOS50ZW1wbGF0ZUluZm8uYm9EZWZBbGlhcwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgX3RoaXM5LiRzdG9yZS5kaXNwYXRjaCgnZm9ybS9kZWxldGVUZW1wbGF0ZURhdGFCeUlkJywgZGF0YSkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBfdGhpczkucGFnaW5hdGlvbi5wYWdlID0gMTsKICAgICAgICAgICAgICAgIF90aGlzOS5zZWFyY2goKTsKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgIF90aGlzOS4kbWVzc2FnZSh7CiAgICAgICAgICAgICAgICB0eXBlOiAnaW5mbycsCiAgICAgICAgICAgICAgICBtZXNzYWdlOiAn5bey5Y+W5raI5Yig6ZmkJwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0sCiAgICAgICAgICBkZWw6IGZ1bmN0aW9uIGRlbChpZCkgewogICAgICAgICAgICB2YXIgX3RoaXMxMCA9IHRoaXM7CiAgICAgICAgICAgIHRoaXMuJGNvbmZpcm0oJ+atpOaTjeS9nOWwhuWIoOmZpOivpeaVsOaNriwg5piv5ZCm57un57utPycsICfmj5DnpLonLCB7CiAgICAgICAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6ICfnoa7lrponLAogICAgICAgICAgICAgIGNhbmNlbEJ1dHRvblRleHQ6ICflj5bmtognLAogICAgICAgICAgICAgIHR5cGU6ICd3YXJuaW5nJwogICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICB2YXIgZGF0YSA9IHsKICAgICAgICAgICAgICAgIGlkczogaWQsCiAgICAgICAgICAgICAgICBib0FsaWFzOiBfdGhpczEwLnRlbXBsYXRlSW5mby5ib0RlZkFsaWFzCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICBfdGhpczEwLiRzdG9yZS5kaXNwYXRjaCgnZm9ybS9kZWxldGVUZW1wbGF0ZURhdGFCeUlkJywgZGF0YSkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBfdGhpczEwLnBhZ2luYXRpb24ucGFnZSA9IDE7CiAgICAgICAgICAgICAgICBfdGhpczEwLnNlYXJjaCgpOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgX3RoaXMxMC4kbWVzc2FnZSh7CiAgICAgICAgICAgICAgICB0eXBlOiAnaW5mbycsCiAgICAgICAgICAgICAgICBtZXNzYWdlOiAn5bey5Y+W5raI5Yig6ZmkJwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0sCiAgICAgICAgICBvcGVyYXRpbmc6IGZ1bmN0aW9uIG9wZXJhdGluZyh0ZW1wbGF0ZUlkLCBpZCwgYWN0aW9uLCBkZWZJZCwgaXNTdGFydEZsb3csIG9wZW5UeXBlKSB7CiAgICAgICAgICAgIC8vaXNTdGFydEZsb3cg77yIZmFsc2XvvJrlj6/ku6Xlj5HotbfmtYHnqIvvvIx0cnVl77ya5LiN5Y+v5Lul5Y+R6LW35rWB56iL77yJCiAgICAgICAgICAgIGlmICh0aGlzLnRlbXBsYXRlSW5mby5tYW5hZ2VGaWVsZCAmJiAhaXNTdGFydEZsb3cpIHsKICAgICAgICAgICAgICAvL+WFiOmFjee9ruS4jeiDveWPkei1t+a1geeoiwogICAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gImFkZCIgJiYgaXNTdGFydEZsb3cgPT0gIiIpIHsKICAgICAgICAgICAgICAgIGlzU3RhcnRGbG93ID0gdHJ1ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSAiZWRpdCIgJiYgaXNTdGFydEZsb3cgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICBpc1N0YXJ0RmxvdyA9IHRydWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIC8v5YaN5Yik5pat5piv5ZCm5Y+v5Lul5Y+R6LW35rWB56iLCiAgICAgICAgICAgICAgdmFyIG1hbmFnZUZpZWxkID0gSlNPTi5wYXJzZSh0aGlzLnRlbXBsYXRlSW5mby5tYW5hZ2VGaWVsZCk7CiAgICAgICAgICAgICAgLy/liKTmlq3mmK/lkKbphY3nva7kuoblj5HotbfmtYHnqIvmjInpkq4KICAgICAgICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IG1hbmFnZUZpZWxkLmxlbmd0aDsgaysrKSB7CiAgICAgICAgICAgICAgICBpZiAoYWN0aW9uID09ICJhZGQiICYmIG1hbmFnZUZpZWxkW2tdLm5hbWUgPT0gInN0YXJ0RmxvdyIpIHsKICAgICAgICAgICAgICAgICAgaXNTdGFydEZsb3cgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PSAiZWRpdCIgJiYgbWFuYWdlRmllbGRba10ubmFtZSA9PSAic3RhcnRGbG93IikgewogICAgICAgICAgICAgICAgICBpc1N0YXJ0RmxvdyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCF0ZW1wbGF0ZUlkKSB7CiAgICAgICAgICAgICAgdGVtcGxhdGVJZCA9IHRoaXMudGVtcGxhdGVJbmZvLmlkOwogICAgICAgICAgICAgIGFjdGlvbiA9IGFjdGlvbiA9PSAnc2VsZWN0JyA/ICdnZXQnIDogJ2FkZCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy/mlbDmja7op4blm77pmo/mnLrmt7vliqDliLDlhbbku5boj5zljZXkuIvpnaLml7bojrflj5blvZPliY3oj5zljZXnmoTliKvlkI0gIOW5tuS4lOW9k+WJjeaVsOaNruinhuWbvuS4jeaYr+ihqOWNlemHjOeahOaVsOaNruinhuWbviAgZGF0YVZpZXcKICAgICAgICAgICAgaWYgKHNlc3Npb25TdG9yYWdlLm1lbnVfYWxpYXMgJiYgIXRoaXMuZGF0YVZpZXcgJiYgIXRoaXMuaWdub3JlZEFsaWFzLmluY2x1ZGVzKHNlc3Npb25TdG9yYWdlLm1lbnVfYWxpYXMpKSB7CiAgICAgICAgICAgICAgdGhpcy5hbGlhc19uZXcgPSBzZXNzaW9uU3RvcmFnZS5tZW51X2FsaWFzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciB1cmwgPSAnLycgKyB0aGlzLmFsaWFzX25ldyArICcvdGVtcGxhdGUvZm9ybS8nICsgdGhpcy50ZW1wbGF0ZUtleSArICcvJyArIGFjdGlvbjsKICAgICAgICAgICAgaWYgKHRoaXMuaXNKb2luRmxvdykgewogICAgICAgICAgICAgIHRoaXMuYWxpYXNfbmV3ID0gInN0YXRlbWVudCI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuc2luZ2xlID09ICd0cnVlJykgewogICAgICAgICAgICAgIHVybCA9ICcvJyArIHRoaXMuYWxpYXNfbmV3ICsgJy90ZW1wbGF0ZS9mb3JtLycgKyB0aGlzLnRlbXBsYXRlS2V5ICsgJy8nICsgYWN0aW9uICsgJy90cnVlJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAvL+WIpOaWreaVsOaNruinhuWbvuaOp+S7tgogICAgICAgICAgICB2YXIgaXNEYXRhVmlldyA9IGZhbHNlOwogICAgICAgICAgICBpZiAodGhpcy5kYXRhVmlldykgewogICAgICAgICAgICAgIGlmICh0aGlzLmRhdGFWaWV3LmJvRGVmQWxpYXMgJiYgdGhpcy5kYXRhVmlldy5ib0RlZkFsaWFzICE9ICIiKSB7CiAgICAgICAgICAgICAgICBpc0RhdGFWaWV3ID0gdHJ1ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG9wZW5UeXBlID09ICJuZXciIHx8IHRoaXMuaXNKb2luRmxvdyB8fCBpc0RhdGFWaWV3KSB7CiAgICAgICAgICAgICAgdXJsICs9ICIvbmV3IjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoaWQpIHsKICAgICAgICAgICAgICB1cmwgPSB1cmwgKyAnP2lkPScgKyBpZCArICcmJzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB1cmwgKz0gJz8nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBzdGFydEZsb3dTdHIgPSAnc3RhcnRGbG93PWZhbHNlJzsKICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSAnYWRkJyAmJiBkZWZJZCAmJiBpc1N0YXJ0RmxvdyA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICBzdGFydEZsb3dTdHIgPSAnc3RhcnRGbG93PXRydWUnOwogICAgICAgICAgICB9IGVsc2UgaWYgKGlkICYmIGlzU3RhcnRGbG93ID09PSBmYWxzZSAmJiBkZWZJZCkgewogICAgICAgICAgICAgIHN0YXJ0Rmxvd1N0ciA9ICdzdGFydEZsb3c9dHJ1ZSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGRhdGFVcmwgPSAnJzsKICAgICAgICAgICAgaWYgKHRoaXMuZGF0YVZpZXcpIHsKICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhVmlldy5iaW5kTGlzdCAmJiB0aGlzLmRhdGFWaWV3LmJpbmRMaXN0Lmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIHZhciBiaW5kTGlzdCA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRhdGFWaWV3LmJpbmRMaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgIHZhciBpdGVtID0gewogICAgICAgICAgICAgICAgICAgIGtleTogdGhpcy5kYXRhVmlldy5iaW5kTGlzdFtpXS5iaW5kRmlsbGQsCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuZGF0YVZpZXcuYmluZExpc3RbaV0uZmlsbFZhbHVlCiAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgIGJpbmRMaXN0LnB1c2goaXRlbSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBkYXRhVXJsID0gJyZiaW5kTGlzdD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KEJhc2U2NC5lbmNvZGUoSlNPTi5zdHJpbmdpZnkoYmluZExpc3QpKSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBwYXRoID0gdXJsICsgc3RhcnRGbG93U3RyOwogICAgICAgICAgICBpZiAoZGF0YVVybCAhPSAnJykgewogICAgICAgICAgICAgIHBhdGggPSB1cmwgKyBzdGFydEZsb3dTdHIgKyBkYXRhVXJsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRlYnVnZ2VyOwogICAgICAgICAgICAvL1RPRE8g5aaC5p6c5piv5qih5Z2X5byA5Y+RIOWFqOmDqOW3suaWsOeql+WPo+aJk+W8gAogICAgICAgICAgICBpZiAob3BlblR5cGUgPT0gJ25ldycgfHwgdGhpcy5pc0pvaW5GbG93IHx8IGlzRGF0YVZpZXcpIHsKICAgICAgICAgICAgICB3aW5kb3cub3Blbih0aGlzLiRyb3V0ZXIucmVzb2x2ZShwYXRoLnJlcGxhY2UodGhpcy5hbGlhc19uZXcsICJzdGF0ZW1lbnQiKSArICcmaXNOZXdQYWdlPXRydWUnKS5ocmVmLCAnX2JsYW5rJyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgaWYgKHBhdGguaW5kZXhPZignb3RoZXJtZW51JykgIT0gLTEpIHsKICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoJy9vdGhlcm1lbnUnLCAnL3N0YXRlbWVudCcpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB0aGlzLiRyb3V0ZXIucHVzaChwYXRoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIG9wZW5Vcmw6IGZ1bmN0aW9uIG9wZW5VcmwodXJsLCB0eXBlLCByb3csIGZpZWxkTmFtZSkgewogICAgICAgICAgICBpZiAocm93ICYmIGZpZWxkTmFtZSkgewogICAgICAgICAgICAgIHVybCA9IHRoaXMuaGFuZGxlZFVybFBhcmFtcyh1cmwsIHJvdywgZmllbGROYW1lKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodHlwZSA9PSAnbmV3JykgewogICAgICAgICAgICAgIHdpbmRvdy5vcGVuKHVybCwgJ19ibGFuaycpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdXJsOwogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgaGFuZGxlZFVybFBhcmFtczogZnVuY3Rpb24gaGFuZGxlZFVybFBhcmFtcyh1cmwsIHJvdywgZmllbGROYW1lKSB7CiAgICAgICAgICAgIGlmICh0aGlzLnRlbXBsYXRlSW5mby5kaXNwbGF5RmllbGQpIHsKICAgICAgICAgICAgICB2YXIgZGlzcGxheUZpZWxkcyA9IEpTT04ucGFyc2UodGhpcy50ZW1wbGF0ZUluZm8uZGlzcGxheUZpZWxkKTsKICAgICAgICAgICAgICBkaXNwbGF5RmllbGRzLmZvckVhY2goZnVuY3Rpb24gKGRpc3BsYXkpIHsKICAgICAgICAgICAgICAgIGlmIChkaXNwbGF5Lm5hbWUgPT0gZmllbGROYW1lKSB7CiAgICAgICAgICAgICAgICAgIGlmIChkaXNwbGF5LnVybFBhcmFtcyAmJiBkaXNwbGF5LnVybFBhcmFtcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHVybFBhcmFtcyA9IGRpc3BsYXkudXJsUGFyYW1zOwogICAgICAgICAgICAgICAgICAgIHZhciBzdWZmaXggPSAnJzsKICAgICAgICAgICAgICAgICAgICB1cmxQYXJhbXMuZm9yRWFjaChmdW5jdGlvbiAocGFyYW0pIHsKICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWZmaXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4ICs9ICcmJzsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeCA9IHN1ZmZpeCArIHBhcmFtLm5hbWUgKyAnPScgKyByb3dbcGFyYW0uZmllbGRdOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIGlmIChzdWZmaXgpIHsKICAgICAgICAgICAgICAgICAgICAgIGlmICh1cmwuaW5kZXhPZignPycpICE9IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9IHVybCArICcmJyArIHN1ZmZpeDsKICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9IHVybCArICc/JyArIHN1ZmZpeDsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1cmw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIHJldHVybiB1cmw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHVybDsKICAgICAgICAgIH0sCiAgICAgICAgICB2aWV3UmVwb3J0OiBmdW5jdGlvbiB2aWV3UmVwb3J0KGRhdGEsIGpzb25TdHIsIG9wZW5UeXBlKSB7CiAgICAgICAgICAgIHZhciBpdGVtID0gSlNPTi5wYXJzZShCYXNlNjQuZGVjb2RlKGpzb25TdHIpKTsKICAgICAgICAgICAgdmFyIGNvbmRpdGlvbkZpZWxkID0gaXRlbS5jb25kaXRpb25GaWVsZDsKICAgICAgICAgICAgdmFyIHF1ZXJ5cyA9IFtdOwogICAgICAgICAgICBpZiAoY29uZGl0aW9uRmllbGQgJiYgY29uZGl0aW9uRmllbGQubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgIGNvbmRpdGlvbkZpZWxkLmZvckVhY2goZnVuY3Rpb24gKG9iaikgewogICAgICAgICAgICAgICAgaWYgKG9iai5wYXJhbWV0ZXIpIHsKICAgICAgICAgICAgICAgICAgcXVlcnlzLnB1c2goewogICAgICAgICAgICAgICAgICAgIHByb3BlcnR5OiBvYmoua2V5LAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiBkYXRhW29iai5wYXJhbWV0ZXJdLAogICAgICAgICAgICAgICAgICAgIGdyb3VwOiAnbWFpbicsCiAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uOiBvYmoucXQsCiAgICAgICAgICAgICAgICAgICAgcmVsYXRpb246ICdBTkQnCiAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8v5pWw5o2u6ZqP5py65re75Yqg5Yiw5YW25LuW6I+c5Y2V5LiL6Z2i5pe26I635Y+W5b2T5YmN6I+c5Y2V55qE5Yir5ZCNCiAgICAgICAgICAgIGlmIChzZXNzaW9uU3RvcmFnZS5tZW51X2FsaWFzKSB7CiAgICAgICAgICAgICAgdGhpcy5hbGlhc19uZXcgPSBzZXNzaW9uU3RvcmFnZS5tZW51X2FsaWFzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciB1cmwgPSAnLycgKyB0aGlzLmFsaWFzX25ldyArICcvdGVtcGxhdGUvcHJldmlldy8nICsgaXRlbS5hbGlhcyArICcvZmFsc2UvJyArIGVuY29kZVVSSUNvbXBvbmVudChCYXNlNjQuZW5jb2RlKEpTT04uc3RyaW5naWZ5KHF1ZXJ5cykpKTsKICAgICAgICAgICAgLy91cmwg6L2s56CB6Ziy5q2i5pyJ5pac5p2gIOWvvOiHtOi3r+eUsei3s+i9rOS4jeWvuQogICAgICAgICAgICBpZiAob3BlblR5cGUgPT0gJ25ldycpIHsKICAgICAgICAgICAgICB3aW5kb3cub3Blbih0aGlzLiRyb3V0ZXIucmVzb2x2ZSh1cmwpLmhyZWYsICdfYmxhbmsnKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0aGlzLiRyb3V0ZXIucHVzaCh1cmwpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgc3RhcnRGbG93OiBmdW5jdGlvbiBzdGFydEZsb3coaWQpIHsKICAgICAgICAgICAgdmFyIF90aGlzMTEgPSB0aGlzOwogICAgICAgICAgICB2YXIgZGF0YSA9IHsKICAgICAgICAgICAgICBkZWZLZXk6IHRoaXMudGVtcGxhdGVJbmZvLmRlZklkLAogICAgICAgICAgICAgIGJ1c2luZXNzS2V5OiBpZCwKICAgICAgICAgICAgICBib0FsaWFzOiB0aGlzLnRlbXBsYXRlSW5mby5ib0RlZkFsaWFzCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBsb2FkaW5nSW5zdGFuY2UgPSBMb2FkaW5nLnNlcnZpY2UoewogICAgICAgICAgICAgIGZ1bGxzY3JlZW46IHRydWUKICAgICAgICAgICAgfSk7IC8v5byA5aeLCiAgICAgICAgICAgIHRoaXMuJHN0b3JlLmRpc3BhdGNoKCdzdG9yZVByb2Nlc3Mvc3RhcnRGb3JtJywgZGF0YSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7CiAgICAgICAgICAgICAgbG9hZGluZ0luc3RhbmNlLmNsb3NlKCk7IC8vIOe7k+adnwogICAgICAgICAgICAgIGlmIChyZXN1bHQuc3RhdGUpIHsKICAgICAgICAgICAgICAgIF90aGlzMTEuJG1lc3NhZ2Uuc3VjY2VzcyhyZXN1bHQubWVzc2FnZSk7CiAgICAgICAgICAgICAgICBfdGhpczExLnNlYXJjaCgpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBfdGhpczExLmRpc2FibGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICBfdGhpczExLiRtZXNzYWdlLmVycm9yKHJlc3VsdC5tZXNzYWdlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSwKICAgICAgICAgIC8v54K55Ye75a+85Ye65oyJ6ZKuCiAgICAgICAgICBleHBvcnRzOiBmdW5jdGlvbiBleHBvcnRzKGV4cG9ydFNldHRpbmdGaWVsZHMpIHsKICAgICAgICAgICAgdmFyIF90aGlzMTIgPSB0aGlzOwogICAgICAgICAgICB2YXIgZGlzcGxheUZpZWxkcyA9IFtdOwogICAgICAgICAgICBpZiAoZXhwb3J0U2V0dGluZ0ZpZWxkcykgewogICAgICAgICAgICAgIGRpc3BsYXlGaWVsZHMgPSBKU09OLnBhcnNlKEJhc2U2NC5kZWNvZGUoZXhwb3J0U2V0dGluZ0ZpZWxkcykpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChkaXNwbGF5RmllbGRzLmxlbmd0aCA9PSAwICYmIHRoaXMudGVtcGxhdGVJbmZvLmRpc3BsYXlGaWVsZCkgewogICAgICAgICAgICAgIGRpc3BsYXlGaWVsZHMgPSBKU09OLnBhcnNlKHRoaXMudGVtcGxhdGVJbmZvLmRpc3BsYXlGaWVsZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5leHBvcnRUeXBlID0gJ21haW4nOwogICAgICAgICAgICB0aGlzLmRpc3BsYXlGaWVsZHMgPSBbXTsKICAgICAgICAgICAgZGlzcGxheUZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICAgICAgaWYgKGl0ZW0udHlwZSkgewogICAgICAgICAgICAgICAgX3RoaXMxMi5kaXNwbGF5RmllbGRzLnB1c2goaXRlbSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5kaWFsb2dFeHBvcnRWaXNpYmxlID0gdHJ1ZTsKICAgICAgICAgIH0sCiAgICAgICAgICBpbXBvcnRDb21tYW5kOiBmdW5jdGlvbiBpbXBvcnRDb21tYW5kKHBhcmFtcykgewogICAgICAgICAgICBzd2l0Y2ggKHBhcmFtcy5jb21tYW5kKSB7CiAgICAgICAgICAgICAgY2FzZSAnZG93bmxvYWRUZW1wRmlsZSc6CiAgICAgICAgICAgICAgICB0aGlzLmRvd25sb2FkTWFpblRlbXBGaWxlKCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBjYXNlICdpbXBvcnRNYWluJzoKICAgICAgICAgICAgICAgIHRoaXMuaW1wb3J0TWFpbigpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgY2FzZSAnbG9nJzoKICAgICAgICAgICAgICAgIHRoaXMub3BlbkxvZygpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgb3BlbkxvZzogZnVuY3Rpb24gb3BlbkxvZygpIHsKICAgICAgICAgICAgdGhpcy5kaWFsb2dWaXNpYmxlID0gdHJ1ZTsKICAgICAgICAgIH0sCiAgICAgICAgICBkb3dubG9hZE1haW5UZW1wRmlsZTogZnVuY3Rpb24gZG93bmxvYWRNYWluVGVtcEZpbGUoKSB7CiAgICAgICAgICAgIHZhciBjdXN0b21UZW1wbGF0ZUlkID0gJyc7CiAgICAgICAgICAgIGlmICh0aGlzLnRlbXBsYXRlSW5mbyAmJiB0aGlzLnRlbXBsYXRlSW5mby5tYW5hZ2VGaWVsZCkgewogICAgICAgICAgICAgIHZhciBtYW5hZ2VGaWVsZExpc3QgPSBKU09OLnBhcnNlKHRoaXMudGVtcGxhdGVJbmZvLm1hbmFnZUZpZWxkKTsKICAgICAgICAgICAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgbWFuYWdlRmllbGRMaXN0Lmxlbmd0aDsgaW5kZXgrKykgewogICAgICAgICAgICAgICAgdmFyIG1hbmFnZSA9IG1hbmFnZUZpZWxkTGlzdFtpbmRleF07CiAgICAgICAgICAgICAgICBpZiAobWFuYWdlLm5hbWUgPT0gJ2ltcG9ydCcpIHsKICAgICAgICAgICAgICAgICAgaWYgKG1hbmFnZS5pbXBvcnRUZW1wbGF0ZSAmJiBtYW5hZ2UuaW1wb3J0VGVtcGxhdGUubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgIGN1c3RvbVRlbXBsYXRlSWQgPSBtYW5hZ2UuaW1wb3J0VGVtcGxhdGVbMF0uaWQ7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChjdXN0b21UZW1wbGF0ZUlkKSB7CiAgICAgICAgICAgICAgdGhpcy4kc3RvcmUuZGlzcGF0Y2goJ21lbnUvZG93bmxvYWRGaWxlJywgY3VzdG9tVGVtcGxhdGVJZCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdmFyIGxvYWRpbmdJbnN0YW5jZSA9IExvYWRpbmcuc2VydmljZSh7CiAgICAgICAgICAgICAgICBmdWxsc2NyZWVuOiB0cnVlCiAgICAgICAgICAgICAgfSk7IC8v5byA5aeLCiAgICAgICAgICAgICAgdGhpcy4kc3RvcmUuZGlzcGF0Y2goJ2Zvcm0vZG93bmxvYWRNYWluVGVtcEZpbGUnLCB0aGlzLnRlbXBsYXRlSW5mby5hbGlhcykudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBsb2FkaW5nSW5zdGFuY2UuY2xvc2UoKTsgLy8g57uT5p2fCiAgICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGMpIHsKICAgICAgICAgICAgICAgIGxvYWRpbmdJbnN0YW5jZS5jbG9zZSgpOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgaW1wb3J0TWFpbjogZnVuY3Rpb24gaW1wb3J0TWFpbihwYXJhbSkgewogICAgICAgICAgICB2YXIgX3RoaXMxMyA9IHRoaXM7CiAgICAgICAgICAgIHZhciBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpOwogICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoJ2ZpbGUnLCBwYXJhbS5maWxlKTsKICAgICAgICAgICAgdmFyIHBhcmFtcyA9IHsKICAgICAgICAgICAgICBkYXRhOiBmb3JtRGF0YSwKICAgICAgICAgICAgICBhbGlhczogdGhpcy50ZW1wbGF0ZUluZm8uYWxpYXMKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKHRoaXMuZGF0YVZpZXcpIHsKICAgICAgICAgICAgICB0aGlzLmhhbmRlbEJpbmRGaWxlZFZhbHVhKCk7CiAgICAgICAgICAgICAgcGFyYW1zLmJpbmRGaWxsZCA9IHRoaXMuZGF0YVZpZXcuYmluZEZpbGxkIHx8ICcnOwogICAgICAgICAgICAgIHBhcmFtcy5maWxsVmFsdWUgPSB0aGlzLmRhdGFWaWV3LmZpbGxWYWx1ZSB8fCAnJzsKICAgICAgICAgICAgICBwYXJhbXMucmVmSWRWYWx1ZSA9IHRoaXMuZGF0YVZpZXcucmVmSWRWYWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgbG9hZGluZ0luc3RhbmNlID0gTG9hZGluZy5zZXJ2aWNlKHsKICAgICAgICAgICAgICBmdWxsc2NyZWVuOiB0cnVlCiAgICAgICAgICAgIH0pOyAvL+W8gOWniwogICAgICAgICAgICBmb3JtLm1haW5JbXBvcnQocGFyYW1zLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgIGxvYWRpbmdJbnN0YW5jZS5jbG9zZSgpOyAvLyDnu5PmnZ8KICAgICAgICAgICAgICBpZiAoZGF0YS5zdGF0ZSkgewogICAgICAgICAgICAgICAgLy/lr7zlhaXmiJDlip/kuYvlkI7ph43mlrDmuLLmn5PlvZPliY3nu4Tku7YKICAgICAgICAgICAgICAgIF90aGlzMTMuJHBhcmVudC5yZWZyZXNoVGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOwogICAgICAgICAgICAgICAgX3RoaXMxMy4kbWVzc2FnZSh7CiAgICAgICAgICAgICAgICAgIHR5cGU6ICdzdWNjZXNzJywKICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZGF0YS5tZXNzYWdlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHBhcmFtLm9uU3VjY2VzcygpOwogICAgICAgICAgICAgICAgaWYgKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ2Zvcm1JbXBvcnRUZW1wUmVmSWQnKSkgewogICAgICAgICAgICAgICAgICB2YXIganNvbiA9IEpTT04ucGFyc2UoZGF0YS52YWx1ZSk7CiAgICAgICAgICAgICAgICAgIGpzb24uYm9BbGlhcyA9IF90aGlzMTMuZGF0YVZpZXcuYm9EZWZBbGlhczsKICAgICAgICAgICAgICAgICAgdmFyIG9sZENvbmYgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdmb3JtSW1wb3J0VGVtcEpzb24nKTsKICAgICAgICAgICAgICAgICAgaWYgKCFvbGRDb25mKSB7CiAgICAgICAgICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgnZm9ybUltcG9ydFRlbXBKc29uJywgSlNPTi5zdHJpbmdpZnkoW2pzb25dKSk7CiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG9sZEpvc24gPSBKU09OLnBhcnNlKG9sZENvbmYpOwogICAgICAgICAgICAgICAgICAgIHZhciBpc0luT2xkSm9zbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBvbGRKb3NuLmxlbmd0aDsgaW5kZXgrKykgewogICAgICAgICAgICAgICAgICAgICAgdmFyIG9sZCA9IG9sZEpvc25baW5kZXhdOwogICAgICAgICAgICAgICAgICAgICAgaWYgKG9sZC50YWJOYW1lID09IGpzb24udGFiTmFtZSAmJiBvbGQuYmluZEZpbGxkID09IGpzb24uYmluZEZpbGxkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlzSW5PbGRKb3NuID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghaXNJbk9sZEpvc24pIHsKICAgICAgICAgICAgICAgICAgICAgIG9sZEpvc24ucHVzaChqc29uKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgnZm9ybUltcG9ydFRlbXBKc29uJywgSlNPTi5zdHJpbmdpZnkob2xkSm9zbikpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBfdGhpczEzLnNlYXJjaCgpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBwYXJhbS5vbkVycm9yKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgIH0sCiAgICAgICAgICAvL+aYvuekuuWtkOihqOWvueivneahhgogICAgICAgICAgc2hvd1N1Ykxpc3Q6IGZ1bmN0aW9uIHNob3dTdWJMaXN0KHJlZklkKSB7CiAgICAgICAgICAgIHRoaXMucmVmSWQgPSByZWZJZDsKICAgICAgICAgICAgdGhpcy5nZXRTdWJFbnRzQnlGb3JtS2V5KHJlZklkKTsKICAgICAgICAgIH0sCiAgICAgICAgICAvL+aYvuekuuS/ruaUueiusOW9lQogICAgICAgICAgb3BlblJlY29yZExpc3Q6IGZ1bmN0aW9uIG9wZW5SZWNvcmRMaXN0KHJlZklkKSB7CiAgICAgICAgICAgIHZhciBfdGhpczE0ID0gdGhpczsKICAgICAgICAgICAgdGhpcy5kaWFsb2dSZWNvcmRWaXNpYmxlID0gdHJ1ZTsKICAgICAgICAgICAgdGhpcy5yZWNvcmRSZWZJZCA9IHJlZklkOwogICAgICAgICAgICB2YXIgcGFyYW0gPSB7CiAgICAgICAgICAgICAgcGFnZUJlYW46IHsKICAgICAgICAgICAgICAgIHBhZ2U6IDEsCiAgICAgICAgICAgICAgICBwYWdlU2l6ZTogMjAsCiAgICAgICAgICAgICAgICBzaG93VG90YWw6IHRydWUKICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgIHNvcnRlcjogW3sKICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogJ0FTQycsCiAgICAgICAgICAgICAgICBwcm9wZXJ0eTogJ21vZGlmeVRpbWUnCiAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgcXVlcnlzOiBbewogICAgICAgICAgICAgICAgcHJvcGVydHk6ICdyZWZfaWRfJywKICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLnJlY29yZFJlZklkLAogICAgICAgICAgICAgICAgZ3JvdXA6ICdtYWluJywKICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogJ0VRVUFMJywKICAgICAgICAgICAgICAgIHJlbGF0aW9uOiAnQU5EJwogICAgICAgICAgICAgIH1dCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMucmVjb3JkVGFibGVMb2FkaW5nID0gdHJ1ZTsKICAgICAgICAgICAgdmFyIHVybCA9ICcke2JwbVJ1blRpbWV9L2JwbS9ib0RhdGFNb2RpZnlSZWNvcmQvdjEvbGlzdEpzb24nOwogICAgICAgICAgICByZXEucG9zdCh1cmwsIHBhcmFtKS50aGVuKGZ1bmN0aW9uIChyZXNwKSB7CiAgICAgICAgICAgICAgX3RoaXMxNC5yZWNvcmRUYWJsZUxvYWRpbmcgPSBmYWxzZTsKICAgICAgICAgICAgICBfdGhpczE0LnJlY29yZExpc3QgPSByZXNwLmRhdGEucm93czsKICAgICAgICAgICAgICBfdGhpczE0Lm1vZGlmeVJlY29yZC5wYWdpbmF0aW9uLnBhZ2VCZWFuID0gewogICAgICAgICAgICAgICAgcGFnZVNpemU6IHJlc3AuZGF0YS5wYWdlU2l6ZSwKICAgICAgICAgICAgICAgIHBhZ2U6IHJlc3AuZGF0YS5wYWdlLAogICAgICAgICAgICAgICAgdG90YWw6IHJlc3AuZGF0YS50b3RhbAogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSwKICAgICAgICAgIGhhbmRsZVJlY29yZEN1cnJlbnRDaGFuZ2U6IGZ1bmN0aW9uIGhhbmRsZVJlY29yZEN1cnJlbnRDaGFuZ2UoaW5kZXgsIG1vZGlmeVJlY29yZCkgewogICAgICAgICAgICB2YXIgX3RoaXMxNSA9IHRoaXM7CiAgICAgICAgICAgIG1vZGlmeVJlY29yZC5wYWdpbmF0aW9uLnBhZ2VCZWFuLnBhZ2UgPSBpbmRleDsKICAgICAgICAgICAgdmFyIHBhcmFtID0gewogICAgICAgICAgICAgIHBhZ2VCZWFuOiBtb2RpZnlSZWNvcmQucGFnaW5hdGlvbi5wYWdlQmVhbiwKICAgICAgICAgICAgICBzb3J0ZXI6IFt7CiAgICAgICAgICAgICAgICBkaXJlY3Rpb246ICdBU0MnLAogICAgICAgICAgICAgICAgcHJvcGVydHk6ICdtb2RpZnlUaW1lJwogICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgIHF1ZXJ5czogW3sKICAgICAgICAgICAgICAgIHByb3BlcnR5OiAncmVmX2lkXycsCiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5yZWNvcmRSZWZJZCwKICAgICAgICAgICAgICAgIGdyb3VwOiAnbWFpbicsCiAgICAgICAgICAgICAgICBvcGVyYXRpb246ICdFUVVBTCcsCiAgICAgICAgICAgICAgICByZWxhdGlvbjogJ0FORCcKICAgICAgICAgICAgICB9XQogICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLnJlY29yZFRhYmxlTG9hZGluZyA9IHRydWU7CiAgICAgICAgICAgIHZhciB1cmwgPSAnJHticG1SdW5UaW1lfS9icG0vYm9EYXRhTW9kaWZ5UmVjb3JkL3YxL2xpc3RKc29uJzsKICAgICAgICAgICAgcmVxLnBvc3QodXJsLCBwYXJhbSkudGhlbihmdW5jdGlvbiAocmVzcCkgewogICAgICAgICAgICAgIF90aGlzMTUucmVjb3JkVGFibGVMb2FkaW5nID0gZmFsc2U7CiAgICAgICAgICAgICAgX3RoaXMxNS5yZWNvcmRMaXN0ID0gcmVzcC5kYXRhLnJvd3M7CiAgICAgICAgICAgICAgX3RoaXMxNS5tb2RpZnlSZWNvcmQucGFnaW5hdGlvbi5wYWdlQmVhbiA9IHsKICAgICAgICAgICAgICAgIHBhZ2VTaXplOiByZXNwLmRhdGEucGFnZVNpemUsCiAgICAgICAgICAgICAgICBwYWdlOiByZXNwLmRhdGEucGFnZSwKICAgICAgICAgICAgICAgIHRvdGFsOiByZXNwLmRhdGEudG90YWwKICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0sCiAgICAgICAgICAvL+WPlua2iOS/ruaUueiusOW9leWvueivneahhgogICAgICAgICAgcmVjb3JkQ2FuY2VsOiBmdW5jdGlvbiByZWNvcmRDYW5jZWwoKSB7CiAgICAgICAgICAgIHRoaXMuZGlhbG9nUmVjb3JkVmlzaWJsZSA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLnJlY29yZExpc3QgPSBbXTsKICAgICAgICAgICAgdGhpcy5yZWNvcmRSZWZJZCA9ICcnOwogICAgICAgICAgICB0aGlzLm1vZGlmeVJlY29yZCA9IHsKICAgICAgICAgICAgICBwYWdpbmF0aW9uOiB7CiAgICAgICAgICAgICAgICBwYWdlQmVhbjogewogICAgICAgICAgICAgICAgICBwYWdlOiAxLAogICAgICAgICAgICAgICAgICBwYWdlU2l6ZTogMjAsCiAgICAgICAgICAgICAgICAgIHRvdGFsOiAwCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgfSwKICAgICAgICAgIC8vCiAgICAgICAgICBvcGVuTW9kaWZ5RGV0YWlsOiBmdW5jdGlvbiBvcGVuTW9kaWZ5RGV0YWlsKHJvdykgewogICAgICAgICAgICB0aGlzLmN1cnJlbnRNb2RpZnkgPSByb3c7CiAgICAgICAgICAgIHRoaXMubW9kaWZ5RGV0YWlsRGlhbG9nVmlzaWJsZSA9IHRydWU7CiAgICAgICAgICB9LAogICAgICAgICAgLy/mn6XnnIvkv67mlLnorrDlvZXor6bmg4UKICAgICAgICAgIHNob3dNb2RpZnlSZWNvcmQ6IGZ1bmN0aW9uIHNob3dNb2RpZnlSZWNvcmQoaWQsIHJlZklkKSB7CiAgICAgICAgICAgIHZhciB1cmwgPSAnL3N0YXRlbWVudC90ZW1wbGF0ZS9mb3JtLycgKyB0aGlzLnRlbXBsYXRlS2V5ICsgJy9nZXQvdHJ1ZScgKyAnP2lkPScgKyByZWZJZCArICcmc3RhcnRGbG93PWZhbHNlJnJlY29yZElkPScgKyBpZCArICcmaXNOZXdQYWdlPXRydWUnOwogICAgICAgICAgICB3aW5kb3cub3Blbih0aGlzLiRyb3V0ZXIucmVzb2x2ZSh1cmwpLmhyZWYsICdfYmxhbmsnKTsKICAgICAgICAgIH0sCiAgICAgICAgICAvL+ehruWumuWvvOWHugogICAgICAgICAgc3VibWl0RXhwb3J0OiBmdW5jdGlvbiBzdWJtaXRFeHBvcnQoKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5leHBvcnREYXRhIHx8IHRoaXMuZXhwb3J0RGF0YS5leHBGaWVsZC5sZW5ndGggPCAxKSB7CiAgICAgICAgICAgICAgdGhpcy4kbWVzc2FnZSh7CiAgICAgICAgICAgICAgICB0eXBlOiAnaW5mbycsCiAgICAgICAgICAgICAgICBtZXNzYWdlOiAn6K+36YCJ5oup6KaB5a+85Ye655qE5a2X5q6177yBJwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5leHBvcnRUeXBlID09PSAnbWFpbicpIHRoaXMuZXhwb3J0TWFpbigpO2Vsc2UgdGhpcy5leHBvcnRTdWJEYXRhKHRoaXMuZXhwb3J0RGF0YS5leHBGaWVsZCwgdGhpcy5yZWZJZCwgdGhpcy5jdXJyZW50VGFiLmVudE5hbWUpOwogICAgICAgICAgfSwKICAgICAgICAgIGV4cG9ydE1haW46IGZ1bmN0aW9uIGV4cG9ydE1haW4oKSB7CiAgICAgICAgICAgIHZhciBfdGhpczE2ID0gdGhpczsKICAgICAgICAgICAgdmFyIGV4cEZpZWxkID0gJyc7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5leHBvcnREYXRhLmV4cEZpZWxkLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7CiAgICAgICAgICAgICAgICBleHBGaWVsZCArPSAnLCc7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGV4cEZpZWxkICs9IHRoaXMuZXhwb3J0RGF0YS5leHBGaWVsZFtpXS5uYW1lOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGV4cEZpZWxkID0gQmFzZTY0LmVuY29kZShleHBGaWVsZCk7CiAgICAgICAgICAgIHZhciBkYXRhID0gewogICAgICAgICAgICAgIGJvQWxpYXM6IHRoaXMudGVtcGxhdGVJbmZvLmFsaWFzLAogICAgICAgICAgICAgIGdldFR5cGU6IHRoaXMuZXhwb3J0RGF0YS5nZXRUeXBlLAogICAgICAgICAgICAgIGV4cEZpZWxkOiBleHBGaWVsZCwKICAgICAgICAgICAgICBmaWx0ZXJLZXk6ICcnCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGRhdGEucXVlcnkgPSB0aGlzLmdldFF1ZXJ5RmlsdGVyKCkucGFnaW5hdGlvbjsKICAgICAgICAgICAgaWYgKHRoaXMuZGF0YVZpZXcgJiYgdGhpcy5kYXRhVmlldy5iaW5kU2VsZWN0ZCkgewogICAgICAgICAgICAgIGRhdGEucXVlcnkucXVlcnlzLnB1c2goewogICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuZGF0YVZpZXcuc2VsZWN0VmFsdWUsCiAgICAgICAgICAgICAgICBvcGVyYXRpb246ICdFUVVBTCcsCiAgICAgICAgICAgICAgICBwcm9wZXJ0eTogJ0ZfJyArIHRoaXMuZGF0YVZpZXcuYmluZFNlbGVjdGQKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgbG9hZGluZ0luc3RhbmNlID0gTG9hZGluZy5zZXJ2aWNlKHsKICAgICAgICAgICAgICBmdWxsc2NyZWVuOiB0cnVlCiAgICAgICAgICAgIH0pOyAvL+W8gOWniwogICAgICAgICAgICB0aGlzLiRzdG9yZS5kaXNwYXRjaCgnZm9ybS90ZW1wbGF0ZUV4cG9ydCcsIGRhdGEpLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgIGxvYWRpbmdJbnN0YW5jZS5jbG9zZSgpOyAvLyDnu5PmnZ8KICAgICAgICAgICAgICBfdGhpczE2LmRpYWxvZ0V4cG9ydFZpc2libGUgPSBmYWxzZTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCB0aGlzLnN1YkRpc3BsYXlGaWVsZHNMaXN0Lmxlbmd0aDsgX2krKykgewogICAgICAgICAgICAgIHRoaXMuZXhwb3J0U3ViRGF0YSh0aGlzLiRyZWZzWydzdWJFeHBvcnRUYWJsZSddW19pXS5zZWxlY3Rpb24sICcnLCB0aGlzLnN1YkRpc3BsYXlGaWVsZHNMaXN0W19pXS5uYW1lKTsKICAgICAgICAgICAgICB0aGlzLiRzZXQodGhpcy4kcmVmc1snc3ViRXhwb3J0VGFibGUnXVtfaV0sICdzZWxlY3Rpb24nLCBbXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICBleHBvcnRTdWJEYXRhOiBmdW5jdGlvbiBleHBvcnRTdWJEYXRhKGV4cEZpZWxkcywgcmVmSWQsIGFsaWFzKSB7CiAgICAgICAgICAgIHZhciBfdGhpczE3ID0gdGhpczsKICAgICAgICAgICAgdmFyIGV4cEZpZWxkID0gW107CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXhwRmllbGRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgZXhwRmllbGQucHVzaCh7CiAgICAgICAgICAgICAgICBrZXk6IGV4cEZpZWxkc1tpXS5uYW1lLAogICAgICAgICAgICAgICAgdmFsdWU6IGV4cEZpZWxkc1tpXS5kZXNjCiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGRhdGEgPSB7CiAgICAgICAgICAgICAgYWxpYXM6IGFsaWFzLAogICAgICAgICAgICAgIHJlZklkOiByZWZJZCwKICAgICAgICAgICAgICB0eXBlOiB0aGlzLmV4cG9ydERhdGEuZ2V0VHlwZSwKICAgICAgICAgICAgICBleHBGaWVsZDogSlNPTi5zdHJpbmdpZnkoZXhwRmllbGQpLAogICAgICAgICAgICAgIGZpbHRlcktleTogJycKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZGF0YS5xdWVyeUZpbHRlciA9IHRoaXMuY3VycmVudFRhYi5wYWdpbmF0aW9uOwogICAgICAgICAgICB2YXIgbG9hZGluZ0luc3RhbmNlID0gTG9hZGluZy5zZXJ2aWNlKHsKICAgICAgICAgICAgICBmdWxsc2NyZWVuOiB0cnVlCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBmb3JtLnN1YkV4cG9ydChkYXRhLCBmdW5jdGlvbiAocmVzcCkgewogICAgICAgICAgICAgIGxvYWRpbmdJbnN0YW5jZS5jbG9zZSgpOwogICAgICAgICAgICAgIF90aGlzMTcuZGlhbG9nRXhwb3J0VmlzaWJsZSA9IGZhbHNlOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0sCiAgICAgICAgICAvL+WPlua2iOWvvOWHugogICAgICAgICAgZXhwb3J0Q2FuY2VsOiBmdW5jdGlvbiBleHBvcnRDYW5jZWwoKSB7CiAgICAgICAgICAgIHRoaXMuZGlhbG9nRXhwb3J0VmlzaWJsZSA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLmV4cG9ydERhdGEuZXhwRmllbGQgPSBbXTsKICAgICAgICAgIH0sCiAgICAgICAgICAvL+WPlua2iOWtkOihqOWvueivneahhgogICAgICAgICAgc3ViQ2FuY2VsOiBmdW5jdGlvbiBzdWJDYW5jZWwoKSB7CiAgICAgICAgICAgIHRoaXMuZGlhbG9nU3ViVmlzaWJsZSA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLnRhYnMgPSBbXTsKICAgICAgICAgICAgdGhpcy5lbnRzID0gW107CiAgICAgICAgICB9LAogICAgICAgICAgc3VuQ2FuY2VsOiBmdW5jdGlvbiBzdW5DYW5jZWwoKSB7CiAgICAgICAgICAgIHRoaXMuZGlhbG9nU3VuVmlzaWJsZSA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLnN1blRhYnMgPSBbXTsKICAgICAgICAgIH0sCiAgICAgICAgICBoYW5kbGVFeHBvcnRTZWxlY3Rpb25DaGFuZ2U6IGZ1bmN0aW9uIGhhbmRsZUV4cG9ydFNlbGVjdGlvbkNoYW5nZSh2YWwpIHsKICAgICAgICAgICAgdGhpcy5leHBvcnREYXRhLmV4cEZpZWxkID0gW107CiAgICAgICAgICAgIGlmICh2YWwpIHsKICAgICAgICAgICAgICB0aGlzLmV4cG9ydERhdGEuZXhwRmllbGQgPSB2YWw7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICAvL+WFqOmAiQogICAgICAgICAgaGFuZGxlRXhwb3J0U2VsZWN0QWxsOiBmdW5jdGlvbiBoYW5kbGVFeHBvcnRTZWxlY3RBbGwoKSB7CiAgICAgICAgICAgIHRoaXMuZXhwb3J0RGF0YS5leHBGaWVsZCA9IHRoaXMuZGlzcGxheUZpZWxkczsKICAgICAgICAgIH0sCiAgICAgICAgICAvL+aOkuW6jwogICAgICAgICAgc29ydDogZnVuY3Rpb24gc29ydChpbmRleCwgdHlwZSkgewogICAgICAgICAgICBpZiAoJ3VwJyA9PSB0eXBlKSB7CiAgICAgICAgICAgICAgaWYgKGluZGV4ID09PSAwKSB7CiAgICAgICAgICAgICAgICB0aGlzLiRtZXNzYWdlKHsKICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ+W3sue7j+aYr+WIl+ihqOS4reesrOS4gOS9jScsCiAgICAgICAgICAgICAgICAgIHR5cGU6ICd3YXJuaW5nJwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciB0ZW1wID0gdGhpcy5kaXNwbGF5RmllbGRzW2luZGV4IC0gMV07CiAgICAgICAgICAgICAgICB0aGlzLiRzZXQodGhpcy5kaXNwbGF5RmllbGRzLCBpbmRleCAtIDEsIHRoaXMuZGlzcGxheUZpZWxkc1tpbmRleF0pOwogICAgICAgICAgICAgICAgdGhpcy4kc2V0KHRoaXMuZGlzcGxheUZpZWxkcywgaW5kZXgsIHRlbXApOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IHRoaXMuZGlzcGxheUZpZWxkcy5sZW5ndGggLSAxKSB7CiAgICAgICAgICAgICAgICB0aGlzLiRtZXNzYWdlKHsKICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ+W3sue7j+aYr+WIl+ihqOS4reacgOWQjuS4gOS9jScsCiAgICAgICAgICAgICAgICAgIHR5cGU6ICd3YXJuaW5nJwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuaXNUcmFuc2l0aW9uID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHZhciBpID0gdGhpcy5kaXNwbGF5RmllbGRzW2luZGV4ICsgMV07CiAgICAgICAgICAgICAgICB0aGlzLiRzZXQodGhpcy5kaXNwbGF5RmllbGRzLCBpbmRleCArIDEsIHRoaXMuZGlzcGxheUZpZWxkc1tpbmRleF0pOwogICAgICAgICAgICAgICAgdGhpcy4kc2V0KHRoaXMuZGlzcGxheUZpZWxkcywgaW5kZXgsIGkpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIGdldFN1bkRhdGE6IGZ1bmN0aW9uIGdldFN1bkRhdGEodGFiLCByb3cpIHsKICAgICAgICAgICAgdmFyIF90aGlzMTggPSB0aGlzOwogICAgICAgICAgICByZXR1cm4gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlKCkgewogICAgICAgICAgICAgIHZhciBlbnRzLCBwaywgcmVmSWQsIGksIF90YWI7CiAgICAgICAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7CiAgICAgICAgICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkgewogICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgZW50cyA9IHRhYi5jaGlsZEVudHM7CiAgICAgICAgICAgICAgICAgICAgcGsgPSB0YWIucGtLZXk7CiAgICAgICAgICAgICAgICAgICAgcmVmSWQgPSAnJzsKICAgICAgICAgICAgICAgICAgICBpZiAocm93W3BrLnRvTG9jYWxlTG93ZXJDYXNlKCldKSB7CiAgICAgICAgICAgICAgICAgICAgICByZWZJZCA9IHJvd1tway50b0xvY2FsZUxvd2VyQ2FzZSgpXTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgcmVmSWQgPSByb3dbcGsudG9VcHBlckNhc2UoKV07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIF90aGlzMTguc3ViVGFibGVMb2FkaW5nID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBpZiAoIShlbnRzICYmIGVudHMubGVuZ3RoID4gMCkpIHsKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxNTsKICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpID0gMDsKICAgICAgICAgICAgICAgICAgY2FzZSA3OgogICAgICAgICAgICAgICAgICAgIGlmICghKGkgPCBlbnRzLmxlbmd0aCkpIHsKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxNTsKICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTA7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzMTguZ2V0Qm9EYXRhKGVudHNbaV0sIHJlZklkKTsKICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKICAgICAgICAgICAgICAgICAgICBfdGFiID0gX2NvbnRleHQuc2VudDsKICAgICAgICAgICAgICAgICAgICBfdGhpczE4LnN1blRhYnMucHVzaChfdGFiKTsKICAgICAgICAgICAgICAgICAgY2FzZSAxMjoKICAgICAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDc7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CiAgICAgICAgICAgICAgICAgICAgX3RoaXMxOC5zdWJUYWJsZUxvYWRpbmcgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBfdGhpczE4LmRpYWxvZ1N1blZpc2libGUgPSB0cnVlOwogICAgICAgICAgICAgICAgICBjYXNlIDE3OgogICAgICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSwgX2NhbGxlZSk7CiAgICAgICAgICAgIH0pKSgpOwogICAgICAgICAgfSwKICAgICAgICAgIGdldEJvRGF0YTogZnVuY3Rpb24gZ2V0Qm9EYXRhKGVudCwgcmVmSWQpIHsKICAgICAgICAgICAgdmFyIF90aGlzMTkgPSB0aGlzOwogICAgICAgICAgICB2YXIgYXR0cmlidXRlTGlzdCA9IGVudC5hdHRyaWJ1dGVMaXN0OwogICAgICAgICAgICB2YXIgdGFiID0gewogICAgICAgICAgICAgIHJlZklkOiByZWZJZCwKICAgICAgICAgICAgICBwa0tleTogZW50LnBrS2V5LAogICAgICAgICAgICAgIG5hbWU6IGVudC50YWJsZU5hbWUsCiAgICAgICAgICAgICAgZW50TmFtZTogZW50Lm5hbWUsCiAgICAgICAgICAgICAgdGl0bGU6IGVudC5jb21tZW50LAogICAgICAgICAgICAgIGF0dHJpYnV0ZUxpc3Q6IGF0dHJpYnV0ZUxpc3QsCiAgICAgICAgICAgICAgY29tbWVudDogZW50LmNvbW1lbnQsCiAgICAgICAgICAgICAgcGFnaW5hdGlvbjogewogICAgICAgICAgICAgICAgcGFnZUJlYW46IHsKICAgICAgICAgICAgICAgICAgcGFnZVNpemU6IDIwLAogICAgICAgICAgICAgICAgICBwYWdlOiAxLAogICAgICAgICAgICAgICAgICB0b3RhbDogMAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgdGFiLmNoaWxkRW50cyA9IFtdOwogICAgICAgICAgICBpZiAoZW50LmNoaWxkRW50cyAmJiBlbnQuY2hpbGRFbnRzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICB0YWIuY2hpbGRFbnRzID0gZW50LmNoaWxkRW50czsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgIF90aGlzMTkuJHN0b3JlLmRpc3BhdGNoKCdmb3JtL2dldFN1YkRhdGFQYWdpbmF0aW9uJywgewogICAgICAgICAgICAgICAgcGFnaW5hdGlvbjogdGFiLnBhZ2luYXRpb24sCiAgICAgICAgICAgICAgICBuYW1lOiBlbnQubmFtZSwKICAgICAgICAgICAgICAgIHJlZklkOiByZWZJZAogICAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgICAgIGlmIChkYXRhICYmIGRhdGEucm93cy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgIHRhYi5kYXRhTGlzdCA9IGRhdGEucm93czsKICAgICAgICAgICAgICAgICAgdGFiLnBhZ2luYXRpb24ucGFnZUJlYW4ucGFnZVNpemUgPSBkYXRhLnBhZ2VTaXplOwogICAgICAgICAgICAgICAgICB0YWIucGFnaW5hdGlvbi5wYWdlQmVhbi5wYWdlID0gZGF0YS5wYWdlOwogICAgICAgICAgICAgICAgICB0YWIucGFnaW5hdGlvbi5wYWdlQmVhbi50b3RhbCA9IGRhdGEudG90YWw7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICB0YWIuZGF0YUxpc3QgPSBbXTsKICAgICAgICAgICAgICAgICAgdGFiLnBhZ2luYXRpb24ucGFnZUJlYW4ucGFnZVNpemUgPSAxOwogICAgICAgICAgICAgICAgICB0YWIucGFnaW5hdGlvbi5wYWdlQmVhbi5wYWdlID0gMTsKICAgICAgICAgICAgICAgICAgdGFiLnBhZ2luYXRpb24ucGFnZUJlYW4udG90YWwgPSAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmVzb2x2ZSh0YWIpOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0sCiAgICAgICAgICBnZXRTdWJFbnRzQnlGb3JtS2V5OiBmdW5jdGlvbiBnZXRTdWJFbnRzQnlGb3JtS2V5KHJlZklkKSB7CiAgICAgICAgICAgIC8qaWYgKCF0aGlzLmVudHMgfHwgdGhpcy5lbnRzLmxlbmd0aCA8IDEpIHsNCiAgICAgICAgICAgICAgZm9ybS5nZXRTdWJFbnRzQnlGb3JtS2V5KHRoaXMudGVtcGxhdGVJbmZvLmZvcm1LZXksIChyZXNwKSA9PiB7DQogICAgICAgICAgICAgICAgLy8g5a2Q6KGo5LiO5a2Z6KGo5a2X5q615ZCN6K6+572u5bCP5YaZDQogICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXNwLmRhdGEubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICAgIHJlc3AuZGF0YVtpXS5hdHRyaWJ1dGVMaXN0LmZvckVhY2goYXR0cmlidXRlID0+IHsNCiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlLmZpZWxkTmFtZSA9IGF0dHJpYnV0ZS5maWVsZE5hbWUudG9Mb3dlckNhc2UoKTsNCiAgICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgICByZXNwLmRhdGFbaV0uY2hpbGRFbnRzLmZvckVhY2goc2hvd0NoaWxkRW50ID0+IHsNCiAgICAgICAgICAgICAgICAgICAgc2hvd0NoaWxkRW50LmF0dHJpYnV0ZUxpc3QuZm9yRWFjaChhdHRyaWJ1dGUgPT4gew0KICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS5maWVsZE5hbWUgPSBhdHRyaWJ1dGUuZmllbGROYW1lLnRvTG93ZXJDYXNlKCk7DQogICAgICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB0aGlzLmVudHMgPSByZXNwLmRhdGE7DQogICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfSBlbHNlIHsqLwogICAgICAgICAgICB0aGlzLmdldFN1YkRhdGEodGhpcywgcmVmSWQpOwogICAgICAgICAgICAvKiB9Ki8KICAgICAgICAgIH0sCiAgICAgICAgICBnZXRTdWJEYXRhOiBmdW5jdGlvbiBnZXRTdWJEYXRhKF9tZSwgcmVmSWQpIHsKICAgICAgICAgICAgdmFyIF90aGlzMjAgPSB0aGlzOwogICAgICAgICAgICByZXR1cm4gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlMigpIHsKICAgICAgICAgICAgICB2YXIgZW50cywgaSwgdGFiOwogICAgICAgICAgICAgIHJldHVybiByZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlMiQoX2NvbnRleHQyKSB7CiAgICAgICAgICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDIucHJldiA9IF9jb250ZXh0Mi5uZXh0KSB7CiAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAvL2xldCBlbnRzID0gdGhpcy5lbnRzOwogICAgICAgICAgICAgICAgICAgIGVudHMgPSBKU09OLnBhcnNlKF9tZS50ZW1wbGF0ZUluZm8uc3ViRmllbGQpOwogICAgICAgICAgICAgICAgICAgIGlmICghKGVudHMgJiYgZW50cy5sZW5ndGggPiAwKSkgewogICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAxMzsKICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpID0gMDsKICAgICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgICAgIGlmICghKGkgPCBlbnRzLmxlbmd0aCkpIHsKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMTM7CiAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZW50c1tpXS5hdHRyaWJ1dGVMaXN0LmZvckVhY2goZnVuY3Rpb24gKGF0dHIpIHsKICAgICAgICAgICAgICAgICAgICAgIGF0dHIuZmllbGROYW1lID0gYXR0ci5maWVsZE5hbWUudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBlbnRzW2ldLmNoaWxkRW50cy5mb3JFYWNoKGZ1bmN0aW9uIChzaG93Q2hpbGRFbnQpIHsKICAgICAgICAgICAgICAgICAgICAgIHNob3dDaGlsZEVudC5hdHRyaWJ1dGVMaXN0LmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUuZmllbGROYW1lID0gYXR0cmlidXRlLmZpZWxkTmFtZS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSA4OwogICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpczIwLmdldEJvRGF0YShlbnRzW2ldLCByZWZJZCk7CiAgICAgICAgICAgICAgICAgIGNhc2UgODoKICAgICAgICAgICAgICAgICAgICB0YWIgPSBfY29udGV4dDIuc2VudDsKICAgICAgICAgICAgICAgICAgICBfdGhpczIwLnRhYnMucHVzaCh0YWIpOwogICAgICAgICAgICAgICAgICBjYXNlIDEwOgogICAgICAgICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDM7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgIGNhc2UgMTM6CiAgICAgICAgICAgICAgICAgICAgX3RoaXMyMC5kaWFsb2dTdWJWaXNpYmxlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKICAgICAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9LCBfY2FsbGVlMik7CiAgICAgICAgICAgIH0pKSgpOwogICAgICAgICAgfSwKICAgICAgICAgIG5vZGVDbGljazogZnVuY3Rpb24gbm9kZUNsaWNrKG5vZGUpIHsKICAgICAgICAgICAgdmFyIGxvYWRpbmcgPSB0aGlzLiRsb2FkaW5nKHRoaXMub3B0aW9ucyk7CiAgICAgICAgICAgIC8vIHRoaXMuJHN0b3JlLmRpc3BhdGNoKCJmb3JtL3NldEJwbVRlbXBsYXRlUGFnaW5hdGlvblBhZ2VOdW0iLCAxKTsKICAgICAgICAgICAgdGhpcy5wYWdpbmF0aW9uLnBhZ2UgPSAxOwogICAgICAgICAgICAvL+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+CiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFWaWV3KSB7CiAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YVZpZXcuYm9EZWZBbGlhcyAmJiB0aGlzLmRhdGFWaWV3LmJvRGVmQWxpYXMgIT0gIiIpIHsKICAgICAgICAgICAgICAgIGRhdGFWaWV3RmxhZyA9IHRydWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBwYXRoID0gJy8nICsgdGhpcy5hbGlhc19uZXcgKyAnL2RyYWZ0TGlzdC8nICsgdGhpcy50ZW1wbGF0ZUluZm8uYWxpYXMgKyAnLycgKyBkYXRhVmlld0ZsYWc7CiAgICAgICAgICAgIGlmICh0aGlzLm9wZW5UeXBlID09ICJuZXciIHx8IGRhdGFWaWV3RmxhZykgewogICAgICAgICAgICAgIHBhdGggKz0gIj9pc05ldz10cnVlIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZGF0YVZpZXdGbGFnKSB7CiAgICAgICAgICAgICAgd2luZG93Lm9wZW4ocGF0aCwgJ19ibGFuaycpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHRoaXMuJHJvdXRlci5wdXNoKHBhdGgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBsZXQgdXJsID0KICAgICAgICAgICAgLy8gICAiL3N0YXRlbWVudC9kcmFmdExpc3Q/dGVtcEFsaWFzPSIgKyA7CiAgICAgICAgICAgIC8vIGNvbnN0IHsgaHJlZiB9ID0gdGhpcy4kcm91dGVyLnB1c2goewogICAgICAgICAgICAvLyAgIHBhdGg6IHVybCwKICAgICAgICAgICAgLy8gfSk7CiAgICAgICAgICAgIC8vIHdpbmRvdy5vcGVuKGhyZWYsICJfYmxhbmsiKTsKICAgICAgICAgIH0sCiAgICAgICAgICBpbml0U3dpdGNoU3RhdHVzOiBmdW5jdGlvbiBpbml0U3dpdGNoU3RhdHVzKCkgewogICAgICAgICAgICAvL+WIneWni+WMluW8gOWFs+eKtuaAgQogICAgICAgICAgICB2YXIgbWFuYWdlcyA9IHV0aWxzLnBhcnNlVG9Kc29uKHRoaXMudGVtcGxhdGVJbmZvLm1hbmFnZUZpZWxkKTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYW5hZ2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgaWYgKG1hbmFnZXNbaV0ubmFtZSA9PT0gJ3N3aXRjaCcpIHsKICAgICAgICAgICAgICAgIHZhciBmaWVsZE5hbWUgPSBtYW5hZ2VzW2ldLmJpbmQ7CiAgICAgICAgICAgICAgICB0aGlzLiRzZXQodGhpcy5zd2l0Y2hNYXAsIGZpZWxkTmFtZSwge30pOwogICAgICAgICAgICAgICAgdGhpcy5zd2l0Y2hNYXBbZmllbGROYW1lXS5vbiA9IG1hbmFnZXNbaV0uc3dpdGNoT247CiAgICAgICAgICAgICAgICB0aGlzLnN3aXRjaE1hcFtmaWVsZE5hbWVdLm9mZiA9IG1hbmFnZXNbaV0uc3dpdGNoT2ZmOwogICAgICAgICAgICAgICAgdGhpcy5zd2l0Y2hNYXBbZmllbGROYW1lXS5vbkxhYmVsID0gbWFuYWdlc1tpXS5zd2l0Y2hPbkxhYmVsOwogICAgICAgICAgICAgICAgdGhpcy5zd2l0Y2hNYXBbZmllbGROYW1lXS5vZmZMYWJlbCA9IG1hbmFnZXNbaV0uc3dpdGNoT2ZmTGFiZWw7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgc3dpdGNoQ2hhbmdlOiBmdW5jdGlvbiBzd2l0Y2hDaGFuZ2UocGtWYWwsIG9uLCBvZmYsIGZpZWxkTmFtZSwgcm93LCBkZWZhdWx0VHJ1ZSkgewogICAgICAgICAgICB2YXIgdGhpc18gPSB0aGlzOwogICAgICAgICAgICB2YXIgdmFsID0gcm93W2ZpZWxkTmFtZV07CiAgICAgICAgICAgIGlmICh2YWwgIT0gb24gJiYgdmFsICE9IG9mZikgewogICAgICAgICAgICAgIGlmIChkZWZhdWx0VHJ1ZSA9PSAidHJ1ZSIpIHsKICAgICAgICAgICAgICAgIHRoaXMuJHNldChyb3csIGZpZWxkTmFtZSwgb2ZmKTsKICAgICAgICAgICAgICAgIHZhbCA9IG9mZjsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy4kc2V0KHJvdywgZmllbGROYW1lLCBvbik7CiAgICAgICAgICAgICAgICB2YWwgPSBvbjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpc18uJGNvbmZpcm0oJ+WwhuS8muS/ruaUueivpeaVsOaNru+8jOaYr+WQpue7p+e7rT8nLCB7CiAgICAgICAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6ICfnoa7lrponLAogICAgICAgICAgICAgIGNhbmNlbEJ1dHRvblRleHQ6ICflj5bmtognLAogICAgICAgICAgICAgIHR5cGU6ICd3YXJuaW5nJwogICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICB2YXIgZm9ybSA9IHdpbmRvdy5jb250ZXh0LmZvcm07CiAgICAgICAgICAgICAgdmFyIGZvcm1BbGlhcyA9IHRoaXNfLnRlbXBsYXRlSW5mby5mb3JtS2V5OyAvL+ihqOWNleWIq+WQjQogICAgICAgICAgICAgIHZhciBkYXRhRGVmQWxpYXMgPSB0aGlzXy50ZW1wbGF0ZUluZm8uYm9EZWZBbGlhczsgLy/mlbDmja7lu7rmqKHliKvlkI0KICAgICAgICAgICAgICByZXEuZ2V0KGZvcm0gKyAnL2Zvcm0vZGF0YVRlbXBsYXRlL3YxL2dldEZvcm0vJyArIGZvcm1BbGlhcyArICcvJyArIGRhdGFEZWZBbGlhcyArICc/aWQ9JyArIHBrVmFsICsgJyZhY3Rpb249Z2V0JnJlY29yZElkPScpLnRoZW4oZnVuY3Rpb24gKHJlc3ApIHsKICAgICAgICAgICAgICAgIHZhciBib0RhdGEgPSByZXNwLmRhdGEuZGF0YTsKICAgICAgICAgICAgICAgIGJvRGF0YVtkYXRhRGVmQWxpYXNdW2ZpZWxkTmFtZV0gPSB2YWw7CiAgICAgICAgICAgICAgICB2YXIgc2F2ZURhdGEgPSB7CiAgICAgICAgICAgICAgICAgIGJvQWxpYXM6IHRoaXNfLnRlbXBsYXRlSW5mby5ib0RlZkFsaWFzLAogICAgICAgICAgICAgICAgICBib0RhdGE6IHJlc3AuZGF0YS5kYXRhCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdGhpc18uJHN0b3JlLmRpc3BhdGNoKCdmb3JtL2JvU2F2ZScsIHNhdmVEYXRhKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGF0ZSkgewogICAgICAgICAgICAgICAgICAgIHRoaXNfLiRtZXNzYWdlKHsKICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdzdWNjZXNzJywKICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICfkv53lrZjmiJDlip8nCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGhpc18uJG1lc3NhZ2UoewogICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICfkv53lrZjlpLHotKUnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgdmFyIGZvcm0gPSB3aW5kb3cuY29udGV4dC5mb3JtOwogICAgICAgICAgICAgIHZhciBmb3JtQWxpYXMgPSB0aGlzXy50ZW1wbGF0ZUluZm8uZm9ybUtleTsgLy/ooajljZXliKvlkI0KICAgICAgICAgICAgICB2YXIgZGF0YURlZkFsaWFzID0gdGhpc18udGVtcGxhdGVJbmZvLmJvRGVmQWxpYXM7IC8v5pWw5o2u5bu65qih5Yir5ZCNCiAgICAgICAgICAgICAgcmVxLmdldChmb3JtICsgJy9mb3JtL2RhdGFUZW1wbGF0ZS92MS9nZXRGb3JtLycgKyBmb3JtQWxpYXMgKyAnLycgKyBkYXRhRGVmQWxpYXMgKyAnP2lkPScgKyBwa1ZhbCArICcmYWN0aW9uPWdldCZyZWNvcmRJZD0nKS50aGVuKGZ1bmN0aW9uIChyZXNwKSB7CiAgICAgICAgICAgICAgICB0aGlzXy4kc2V0KHJvdywgZmllbGROYW1lLCByZXNwLmRhdGEuZGF0YVtkYXRhRGVmQWxpYXNdW2ZpZWxkTmFtZV0pOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0sCiAgICAgICAgICBkaXNwbGF5OiBmdW5jdGlvbiBkaXNwbGF5KG1wRGlzcGxheSkgewogICAgICAgICAgICAvL3Bj56uv55qE5pWw5o2u5oql6KGo5LiN6ZyA6KaB5YGa5pys5pa55rOV55qE5aSE55CG77yM55u05o6l6L+U5ZuedHJ1ZeWNs+WPr+OAggogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgIH0sCiAgICAgICAgICBnZXRGaXhlZDogZnVuY3Rpb24gZ2V0Rml4ZWQoZml4ZWQpIHsKICAgICAgICAgICAgcmV0dXJuIGZpeGVkOwogICAgICAgICAgfSwKICAgICAgICAgIHN1bW1hcnk6IGZ1bmN0aW9uIHN1bW1hcnkobWV0aG9kLCBmaWVsZCwgZGVjaW1hbCkgewogICAgICAgICAgICB2YXIgbGlzdCA9IHRoaXMucm93cy5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICAgICAgICByZXR1cm4gaXRlbVtmaWVsZF0gIT09IHVuZGVmaW5lZCAmJiBpdGVtW2ZpZWxkXSAhPT0gJyc7CiAgICAgICAgICAgIH0pLm1hcChmdW5jdGlvbiAoaXRlbSkgewogICAgICAgICAgICAgIHJldHVybiBuZXcgTnVtYmVyKGl0ZW1bZmllbGRdKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGlmICghbGlzdCB8fCBsaXN0Lmxlbmd0aCA9PSAwKSB7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChtZXRob2QgPT09ICdjb3VudCcpIHsKICAgICAgICAgICAgICByZXR1cm4gbGlzdC5sZW5ndGg7CiAgICAgICAgICAgIH0gZWxzZSBpZiAobWV0aG9kID09PSAnc3VtJykgewogICAgICAgICAgICAgIHJldHVybiBsaXN0LnJlZHVjZShmdW5jdGlvbiAoYSwgYikgewogICAgICAgICAgICAgICAgcmV0dXJuIGEgKyBiOwogICAgICAgICAgICAgIH0pLnRvRml4ZWQoZGVjaW1hbCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAobWV0aG9kID09PSAnbWluJykgewogICAgICAgICAgICAgIHJldHVybiBNYXRoLm1pbi5hcHBseShNYXRoLCBfdG9Db25zdW1hYmxlQXJyYXkobGlzdCkpLnRvRml4ZWQoZGVjaW1hbCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAobWV0aG9kID09PSAnbWF4JykgewogICAgICAgICAgICAgIHJldHVybiBNYXRoLm1heC5hcHBseShNYXRoLCBfdG9Db25zdW1hYmxlQXJyYXkobGlzdCkpLnRvRml4ZWQoZGVjaW1hbCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAobWV0aG9kID09PSAnYXZnJykgewogICAgICAgICAgICAgIHJldHVybiAobGlzdC5yZWR1Y2UoZnVuY3Rpb24gKGEsIGIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBhICsgYjsKICAgICAgICAgICAgICB9KSAvIGxpc3QubGVuZ3RoKS50b0ZpeGVkKGRlY2ltYWwpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgZ2V0Q29sb3I6IGZ1bmN0aW9uIGdldENvbG9yKGRhdGEsIHJvdykgewogICAgICAgICAgICB2YXIgcmVzdUNvbG9yID0gJ2NvbG9yOmJsYWNrJzsKICAgICAgICAgICAgdmFyIGRlY29kZSA9IEJhc2U2NC5kZWNvZGUoZGF0YSk7CiAgICAgICAgICAgIHZhciBjb2xvclJ1bGUgPSBKU09OLnBhcnNlKGRlY29kZSk7CiAgICAgICAgICAgIGlmIChjb2xvclJ1bGUgJiYgY29sb3JSdWxlIGluc3RhbmNlb2YgQXJyYXkpIHsKICAgICAgICAgICAgICBjb2xvclJ1bGUuZm9yRWFjaChmdW5jdGlvbiAocnVsZSkgewogICAgICAgICAgICAgICAgdmFyIEZuID0gRnVuY3Rpb24oJ2RhdGEnLCBydWxlLnByb1J1bGUpOwogICAgICAgICAgICAgICAgaWYgKEZuKHJvdykpIHsKICAgICAgICAgICAgICAgICAgcmVzdUNvbG9yID0gJ2NvbG9yOicgKyBydWxlLnByb0NvbG9yOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZXN1Q29sb3I7CiAgICAgICAgICB9LAogICAgICAgICAgZ2V0UHJvVmFsdWU6IGZ1bmN0aW9uIGdldFByb1ZhbHVlKHZhbHVlLCBydWxlKSB7CiAgICAgICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHZhbHVlIC8gcnVsZSAqIDEwMDAwKSAvIDEwMDsgLy8g5bCP5pWw54K55ZCO5Lik5L2N55m+5YiG5q+UCiAgICAgICAgICB9LAogICAgICAgICAgZ2V0UHJvQ29sb3I6IGZ1bmN0aW9uIGdldFByb0NvbG9yKGRhdGEsIHJvdykgewogICAgICAgICAgICB2YXIgcmVzdUNvbG9yID0gJyM0MDllZmYnOwogICAgICAgICAgICB2YXIgZGVjb2RlID0gQmFzZTY0LmRlY29kZShkYXRhKTsKICAgICAgICAgICAgLypkZWNvZGU9ZGVjb2RlLnJlcGxhY2UoL1xzKiEvZywiIik7Ki8KICAgICAgICAgICAgdmFyIGNvbG9yUnVsZSA9IEpTT04ucGFyc2UoZGVjb2RlKTsKICAgICAgICAgICAgaWYgKGNvbG9yUnVsZSAmJiBjb2xvclJ1bGUgaW5zdGFuY2VvZiBBcnJheSkgewogICAgICAgICAgICAgIGNvbG9yUnVsZS5mb3JFYWNoKGZ1bmN0aW9uIChydWxlKSB7CiAgICAgICAgICAgICAgICB2YXIgRm4gPSBGdW5jdGlvbignZGF0YScsIHJ1bGUucHJvUnVsZSk7CiAgICAgICAgICAgICAgICBpZiAoRm4ocm93KSkgewogICAgICAgICAgICAgICAgICByZXN1Q29sb3IgPSBydWxlLnByb0NvbG9yOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZXN1Q29sb3I7CiAgICAgICAgICB9LAogICAgICAgICAgaXNTb3J0YWJsZTogZnVuY3Rpb24gaXNTb3J0YWJsZShmaWVsZCkgewogICAgICAgICAgICB2YXIgaXNDbG9iID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuZGlzcGxheUZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICAgICAgaWYgKGl0ZW0ubmFtZSA9PT0gZmllbGQgJiYgaXRlbS50eXBlID09PSAnY2xvYicpIHsKICAgICAgICAgICAgICAgIGlzQ2xvYiA9IHRydWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuICF0aGlzLm5vdFNvcnRhYmxlRmllbGRzLmluY2x1ZGVzKGZpZWxkKSAmJiAhaXNDbG9iOwogICAgICAgICAgfSwKICAgICAgICAgIGN1c3RvbUV2aWxKUzogZnVuY3Rpb24gY3VzdG9tRXZpbEpTKHJvdywgaHRTY3JpcHQpIHsKICAgICAgICAgICAgdmFyIEZuID0gRnVuY3Rpb24oJ19yZXEnLCAncm93JywgJ190aGlzJywgQmFzZTY0LmRlY29kZShodFNjcmlwdCkpOyAvL+S4gOS4quWPmOmHj+aMh+WQkUZ1bmN0aW9u77yM6Ziy5q2i5pyJ5Lqb5YmN56uv57yW6K+R5bel5YW35oql6ZSZCiAgICAgICAgICAgIHZhciByZXN1bHQgPSBGbihyZXEsIHJvdywgdGhpcyk7CiAgICAgICAgICB9LAogICAgICAgICAgYmF0Y2hVcGRhdGU6IGZ1bmN0aW9uIGJhdGNoVXBkYXRlKHRpdGxlLCBiYXNlNjRKc29uLCBiYXNlNjRGaWxlZHMpIHsKICAgICAgICAgICAgaWYgKHRoaXMudGFibGVEYXRhLnNlbGVjdFJvd3MgPT0gbnVsbCB8fCB0aGlzLnRhYmxlRGF0YS5zZWxlY3RSb3dzLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgICAgICAgdGhpcy4kbWVzc2FnZS53YXJuaW5nKCfor7fpgInmi6nmlbDmja4nKTsKICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGRlZmF1bHRWYWx1ZUxpc3QgPSBbXTsKICAgICAgICAgICAgdmFyIG91dEZvcm0gPSBbXTsKICAgICAgICAgICAgaWYgKGJhc2U2NEpzb24pIHsKICAgICAgICAgICAgICAvL+aYr+WQpuacieeUqOaIt+iHquW3sei+k+WFpeeahOWtl+autQogICAgICAgICAgICAgIHZhciByZXMgPSB0cnVlOwogICAgICAgICAgICAgIHZhciBiYXRjaFVwZGF0ZURhdGEgPSBKU09OLnBhcnNlKEJhc2U2NC5kZWNvZGUoYmFzZTY0SnNvbikpOwogICAgICAgICAgICAgIHZhciBmaWxlZHNPYmogPSBKU09OLnBhcnNlKEJhc2U2NC5kZWNvZGUoYmFzZTY0RmlsZWRzKSk7CiAgICAgICAgICAgICAgYmF0Y2hVcGRhdGVEYXRhLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICAgICAgICAgIGlmIChpdGVtLnZhbHVlVHlwZSA9PSAxKSB7CiAgICAgICAgICAgICAgICAgIHZhciBpc1JlcXVpcmVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgIGlmIChpdGVtLmlzUmVxdWlyZWQpIHsKICAgICAgICAgICAgICAgICAgICBpc1JlcXVpcmVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB2YXIgb2JqID0gewogICAgICAgICAgICAgICAgICAgIG5hbWU6IGl0ZW0ubmFtZSwKICAgICAgICAgICAgICAgICAgICBkZXNjOiBmaWxlZHNPYmpbaXRlbS5uYW1lXSwKICAgICAgICAgICAgICAgICAgICBvdXRUeXBlOiBpdGVtLm91dFZhbHVlVHlwZSwKICAgICAgICAgICAgICAgICAgICBzaW5nbGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIHNlbGVjdEN1cnJlbnQ6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIGlzUmVxdWlyZWQ6IGlzUmVxdWlyZWQKICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0ub3V0VmFsdWVUeXBlID09ICdzZWxlY3QnKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHNlbGVjdENvbmZpZyA9IEpTT04ucGFyc2UoaXRlbS5vdXRDb25maWcpOwogICAgICAgICAgICAgICAgICAgIG9iai5nYW5nZWQgPSB7CiAgICAgICAgICAgICAgICAgICAgICBhbGlhczogJycsCiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUJpbmQ6ICcnLAogICAgICAgICAgICAgICAgICAgICAgbm9Jbml0OiAnJywKICAgICAgICAgICAgICAgICAgICAgIGxhYmVsQmluZDogJycsCiAgICAgICAgICAgICAgICAgICAgICBiaW5kOiB7fQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdENvbmZpZy5jdXN0b21RdWVyeSkgewogICAgICAgICAgICAgICAgICAgICAgdmFyIGdhbmdlZCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXM6IHNlbGVjdENvbmZpZy5jdXN0b21RdWVyeS5hbGlhcywKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVCaW5kOiBzZWxlY3RDb25maWcuY3VzdG9tUXVlcnkudmFsdWVCaW5kLAogICAgICAgICAgICAgICAgICAgICAgICBub0luaXQ6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbEJpbmQ6IHNlbGVjdENvbmZpZy5jdXN0b21RdWVyeS5sYWJlbEJpbmQsCiAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQ6IHt9CiAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgb2JqLmdhbmdlZCA9IGdhbmdlZDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgb2JqLnNlbGVjdERhdGEgPSBzZWxlY3RDb25maWcuc2VsZWN0RGF0YTsKICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtLm91dFZhbHVlVHlwZSA9PSAnZGlhbG9nJykgewogICAgICAgICAgICAgICAgICAgIHZhciBfc2VsZWN0Q29uZmlnID0gSlNPTi5wYXJzZShpdGVtLm91dENvbmZpZyk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGRpYWxvZ0NvbmZpZyA9IF9zZWxlY3RDb25maWcuZGlhbG9nQ29uZmlnOwogICAgICAgICAgICAgICAgICAgIHZhciBtYXBwaW5nQ29uZiA9IFtdOwogICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbWV0ZXIgPSBfc2VsZWN0Q29uZmlnLnBhcmFtZXRlcjsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gcGFyYW1ldGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBwYXJhbWV0ZXJba2V5XSB8fCAiIjsKICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmdDb25mLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICBmcm9tOiBrZXksCiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogW3ZhbHVlXSwKICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0U3ViOiBbdmFsdWVdCiAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIGN1c3RkaWFsb2cgPSB7CiAgICAgICAgICAgICAgICAgICAgICBzZWxlY3ROdW06IGRpYWxvZ0NvbmZpZy5zZWxlY3ROdW0sCiAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBbXSwKICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmdDb25mOiBtYXBwaW5nQ29uZiwKICAgICAgICAgICAgICAgICAgICAgIGN1c3RRdWVyeUpzb246IFtdLAogICAgICAgICAgICAgICAgICAgICAgYWxpYXM6IGRpYWxvZ0NvbmZpZy5hbGlhcywKICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGRpYWxvZ0NvbmZpZy5jdXN0RGlhbG9nCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBvYmouY3VzdGRpYWxvZyA9IHsKICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICfor7fpgInmi6knLAogICAgICAgICAgICAgICAgICAgICAgY3VzdERpYWxvZzogY3VzdGRpYWxvZywKICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdEZpZWxkOiBkaWFsb2dDb25maWcucmVzdWx0RmllbGQKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0ub3V0Q29uZmlnICYmIChpdGVtLm91dFZhbHVlVHlwZSAhPSAnaW5wdXQnIHx8IGl0ZW0ub3V0VmFsdWVUeXBlICE9ICdkYXRhJyB8fCBpdGVtLm91dFZhbHVlVHlwZSAhPSAnbnVtYmVyJykpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgb3V0Q29uZmlnID0gSlNPTi5wYXJzZShpdGVtLm91dENvbmZpZyk7CiAgICAgICAgICAgICAgICAgICAgdmFyIF9wYXJhbWV0ZXIgPSBvdXRDb25maWcucGFyYW1ldGVyOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBfcGFyYW1ldGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoIV9wYXJhbWV0ZXJba2V5XSkgewogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgX3BhcmFtZXRlcltrZXldOwogICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgX3BhcmFtZXRlcltrZXldID0gJ2RhdGEuJyArIF9wYXJhbWV0ZXJba2V5XTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKG91dENvbmZpZy5zZWxlY3RDdXJyZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICBvYmouc2VsZWN0Q3VycmVudCA9IG91dENvbmZpZy5zZWxlY3RDdXJyZW50OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAob3V0Q29uZmlnLmlzU2luZ2xlKSB7CiAgICAgICAgICAgICAgICAgICAgICBvYmouc2luZ2xlID0gb3V0Q29uZmlnLmlzU2luZ2xlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBvYmouYmluZENvbmZpZyA9IF9wYXJhbWV0ZXI7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgb3V0Rm9ybS5wdXNoKG9iaik7CiAgICAgICAgICAgICAgICAgIHJlcyA9IGZhbHNlOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlTGlzdC5wdXNoKHsKICAgICAgICAgICAgICAgICAgICBrZXk6IGl0ZW0ubmFtZSwKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogaXRlbS5kZWZhdWx0VmFsdWUKICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgaWYgKHJlcykgewogICAgICAgICAgICAgICAgdGhpcy51cGRhdGVCbyhkZWZhdWx0VmFsdWVMaXN0KTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0VmFsdWVMaXN0ID0gZGVmYXVsdFZhbHVlTGlzdDsKICAgICAgICAgICAgICAgIHRoaXMuJHJlZnMudGVtcGxhdGVCYXRjaFVwZGF0ZURpYWxvZy5zaG93RGlhbG9nKHRpdGxlLCBvdXRGb3JtKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdGhpcy4kbWVzc2FnZSh7CiAgICAgICAgICAgICAgICB0eXBlOiAnaW5mbycsCiAgICAgICAgICAgICAgICBtZXNzYWdlOiAn5pyq6K6+572u5pu05paw5YaF5a65JwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgb25Db25maXJtOiBmdW5jdGlvbiBvbkNvbmZpcm0oZGF0YSkgewogICAgICAgICAgICB2YXIgZGVmYXVsdFZhbHVlTGlzdCA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gZGF0YSkgewogICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZUxpc3QucHVzaCh7CiAgICAgICAgICAgICAgICBrZXk6IGtleSwKICAgICAgICAgICAgICAgIHZhbHVlOiBkYXRhW2tleV0KICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgYm9EYXRhID0gdGhpcy5kZWZhdWx0VmFsdWVMaXN0ID8gdGhpcy5kZWZhdWx0VmFsdWVMaXN0LmNvbmNhdChkZWZhdWx0VmFsdWVMaXN0KSA6IHRoaXMuZGVmYXVsdFZhbHVlOwogICAgICAgICAgICB0aGlzLnVwZGF0ZUJvKGJvRGF0YSk7CiAgICAgICAgICB9LAogICAgICAgICAgdXBkYXRlQm86IGZ1bmN0aW9uIHVwZGF0ZUJvKGRlZmF1bHRWYWx1ZUxpc3QpIHsKICAgICAgICAgICAgdmFyIF90aGlzMjYgPSB0aGlzOwogICAgICAgICAgICB0aGlzLiRjb25maXJtKCfmraTmk43kvZzlsIbmibnph4/mm7TmlrDmlbDmja4sIOaYr+WQpue7p+e7rT8nLCAn5o+Q56S6JywgewogICAgICAgICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiAn56Gu5a6aJywKICAgICAgICAgICAgICBjYW5jZWxCdXR0b25UZXh0OiAn5Y+W5raIJywKICAgICAgICAgICAgICB0eXBlOiAnd2FybmluZycKICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgdmFyIHNlbGVjdFJvd3MgPSBfdGhpczI2LnRhYmxlRGF0YS5zZWxlY3RSb3dzOwogICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZWN0Um93cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgc2VsZWN0Um93c1tpXS5mb3JtS2V5ID0gX3RoaXMyNi50ZW1wbGF0ZUluZm8uZm9ybUtleTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZGVmYXVsdFZhbHVlTGlzdC5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgICAgICBzZWxlY3RSb3dzW2ldW2RlZmF1bHRWYWx1ZUxpc3Rbal0ua2V5XSA9IGRlZmF1bHRWYWx1ZUxpc3Rbal0udmFsdWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHZhciBkYXRhID0gewogICAgICAgICAgICAgICAgYm9EYXRhOiBzZWxlY3RSb3dzLAogICAgICAgICAgICAgICAgYm9BbGlhczogX3RoaXMyNi50ZW1wbGF0ZUluZm8uYm9EZWZBbGlhcwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgX3RoaXMyNi4kc3RvcmUuZGlzcGF0Y2goJ2Zvcm0vYmF0Y2hVcGRhdGVUZW1wbGF0ZURhdGEnLCBkYXRhKS50aGVuKGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5zdGF0ZSkgewogICAgICAgICAgICAgICAgICBfdGhpczI2LiRtZXNzYWdlKHsKICAgICAgICAgICAgICAgICAgICB0eXBlOiAnc3VjY2VzcycsCiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZGF0YS5tZXNzYWdlCiAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICBfdGhpczI2LnNlYXJjaCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgX3RoaXMyNi4kbWVzc2FnZSh7CiAgICAgICAgICAgICAgICB0eXBlOiAnaW5mbycsCiAgICAgICAgICAgICAgICBtZXNzYWdlOiAn5bey5Y+W5raI5pu05pawJwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0sCiAgICAgICAgICBhZGRDb21tYW5kOiBmdW5jdGlvbiBhZGRDb21tYW5kKGNvbW1hbmQpIHsKICAgICAgICAgICAgaWYgKGNvbW1hbmQgPT0gJ25vdExvZ2luJyB8fCBjb21tYW5kID09ICdsb2dpbicpIHsKICAgICAgICAgICAgICB0aGlzLmdldEFkZFFSQ29kZShjb21tYW5kKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIGdldEFkZFFSQ29kZTogZnVuY3Rpb24gZ2V0QWRkUVJDb2RlKGNvbW1hbmQpIHsKICAgICAgICAgICAgdGhpcy5RUkNvZGVQYXR0ZXJuID0gY29tbWFuZCA9PSAnbm90TG9naW4nID8gdHJ1ZSA6IGZhbHNlOwogICAgICAgICAgICB0aGlzLlFSQ29kZURlc2MgPSBbXTsKICAgICAgICAgICAgdGhpcy5RUkNvZGVUeXBlID0gJ2FkZCc7CiAgICAgICAgICAgIHRoaXMuUVJDb2RlU2hvdyA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLlFSQ29kZURpYWxvZyA9IHRydWU7CiAgICAgICAgICB9LAogICAgICAgICAgc2hvd1NlYXJjaFBhbmU6IGZ1bmN0aW9uIHNob3dTZWFyY2hQYW5lKCkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgIH0sCiAgICAgICAgICBidWlsZERlZmF1bHRRdWVyeXM6IGZ1bmN0aW9uIGJ1aWxkRGVmYXVsdFF1ZXJ5cygpIHsKICAgICAgICAgICAgdmFyIHRoaXNfID0gdGhpczsKICAgICAgICAgICAgdmFyIHF1ZXJ5cyA9IFtdOwogICAgICAgICAgICB2YXIgY29uZGl0aW9ucyA9IEpTT04ucGFyc2UodGhpc18udGVtcGxhdGVJbmZvLmNvbmRpdGlvbkZpZWxkKTsKICAgICAgICAgICAgdmFyIHByZWZpeCA9IHRoaXMudGVtcGxhdGVJbmZvLmlzRXh0ZXJuYWwgPT0gMSA/ICIiIDogIkZfIjsKICAgICAgICAgICAgLy/mnaHku7blrZfmrrXpu5jorqTlgLzliKTmlq0KICAgICAgICAgICAgY29uZGl0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb25kaXRpb24pIHsKICAgICAgICAgICAgICBpZiAoY29uZGl0aW9uLmRlZmF1bHRWYWx1ZSkgewogICAgICAgICAgICAgICAgdmFyIGZpZWxkID0gY29uZGl0aW9uLmNvbFByZWZpeCArIGNvbmRpdGlvbi5uYTsKICAgICAgICAgICAgICAgIHRoaXNfLiRzZXQodGhpc18uc2VhcmNoRm9ybSwgZmllbGQsIGNvbmRpdGlvbi5kZWZhdWx0VmFsdWUpOwogICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gY29uZGl0aW9uLmRlZmF1bHRWYWx1ZTsKICAgICAgICAgICAgICAgIGlmIChjb25kaXRpb24udHkgPT0gJ251bWJlcicpIHsKICAgICAgICAgICAgICAgICAgdmFsdWUgPSBwYXJzZUZsb2F0KHZhbHVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHF1ZXJ5cy5wdXNoKHsKICAgICAgICAgICAgICAgICAgcHJvcGVydHk6IGZpZWxkLAogICAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWUsCiAgICAgICAgICAgICAgICAgIGdyb3VwOiAibWFpbiIsCiAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogY29uZGl0aW9uLnF0LnRvVXBwZXJDYXNlKCksCiAgICAgICAgICAgICAgICAgIHJlbGF0aW9uOiAnQU5EJwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgLy/nrZvpgInlrZfmrrXpu5jorqTlgLzliKTmlq0KCiAgICAgICAgICAgIHZhciBmaWx0ZXJzID0gSlNPTi5wYXJzZSh0aGlzXy50ZW1wbGF0ZUluZm8uZmlsdGVyaW5nRmllbGQpOwogICAgICAgICAgICBmaWx0ZXJzLmZvckVhY2goZnVuY3Rpb24gKGZpbHRlcikgewogICAgICAgICAgICAgIGlmIChmaWx0ZXIuZGVmYXVsdFZhbHVlICYmIGZpbHRlci5kZWZhdWx0VmFsdWUubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgdGhpc18uZmlsdGVyTWFwW2ZpbHRlci5uYW1lXSA9IGZpbHRlci5kZWZhdWx0VmFsdWU7CiAgICAgICAgICAgICAgICBmaWx0ZXIuZGVmYXVsdFZhbHVlLmZvckVhY2goZnVuY3Rpb24gKHZhbCkgewogICAgICAgICAgICAgICAgICBxdWVyeXMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk6IHByZWZpeCArIGZpbHRlci5uYW1lLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiB2YWwsCiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6ICJkZWZWYWxfIiArIGZpbHRlci5uYW1lLAogICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogIkVRVUFMIiwKICAgICAgICAgICAgICAgICAgICByZWxhdGlvbjogIk9SIgogICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHRoaXNfLiRvbigiYWZ0ZXJNb3VudGVkIiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgIHZhciBoZWFkZXJDb2x1bW5zID0gdGhpc18uJHJlZnMubXVsdGlwbGVUZW1wbGF0ZVRhYmxlLiRyZWZzLnRhYmxlSGVhZGVyLmNvbHVtbnM7CiAgICAgICAgICAgICAgaGVhZGVyQ29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzXy5maWx0ZXJNYXAuaGFzT3duUHJvcGVydHkoY29sdW1uLnByb3BlcnR5KSkgewogICAgICAgICAgICAgICAgICB0aGlzXy5maWx0ZXJNYXBbY29sdW1uLnByb3BlcnR5XS5mb3JFYWNoKGZ1bmN0aW9uICh2YWwpIHsKICAgICAgICAgICAgICAgICAgICBjb2x1bW4uZmlsdGVyZWRWYWx1ZS5wdXNoKHZhbCk7CiAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIHF1ZXJ5czsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0pOwogICAgfQogIH0KfTs="},null]}