{"remainingRequest":"D:\\jenkins\\workspace\\bzzgj-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\thread-loader\\dist\\cjs.js!D:\\jenkins\\workspace\\bzzgj-fvue\\node_modules\\babel-loader\\lib\\index.js!D:\\jenkins\\workspace\\bzzgj-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\cache-loader\\dist\\cjs.js??ref--0-0!D:\\jenkins\\workspace\\bzzgj-fvue\\node_modules\\vue-loader\\lib\\index.js??vue-loader-options!D:\\jenkins\\workspace\\bzzgj-fvue\\src\\components\\eipControl\\EipDialog.vue?vue&type=script&lang=js&","dependencies":[{"path":"D:\\jenkins\\workspace\\bzzgj-fvue\\src\\components\\eipControl\\EipDialog.vue","mtime":1705895419251},{"path":"D:\\jenkins\\workspace\\bzzgj-fvue\\babel.config.js","mtime":1725536844935},{"path":"D:\\jenkins\\workspace\\bzzgj-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\bzzgj-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\thread-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\bzzgj-fvue\\node_modules\\babel-loader\\lib\\index.js","mtime":456789000000},{"path":"D:\\jenkins\\workspace\\bzzgj-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\bzzgj-fvue\\node_modules\\vue-loader\\lib\\index.js","mtime":499162500000}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:aW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tICJEOi9qZW5raW5zL3dvcmtzcGFjZS9ienpnai1mdnVlL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheS5qcyI7CmltcG9ydCBfYXN5bmNUb0dlbmVyYXRvciBmcm9tICJEOi9qZW5raW5zL3dvcmtzcGFjZS9ienpnai1mdnVlL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hc3luY1RvR2VuZXJhdG9yLmpzIjsKaW1wb3J0ICJyZWdlbmVyYXRvci1ydW50aW1lL3J1bnRpbWUuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5maWx0ZXIuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5wdXNoLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuc3BsaWNlLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuZnVuY3Rpb24ubmFtZS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLml0ZXJhdG9yLmNvbnN0cnVjdG9yLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuaXRlcmF0b3IuZmlsdGVyLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuaXRlcmF0b3IuZm9yLWVhY2guanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5qc29uLnN0cmluZ2lmeS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5rZXlzLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZy5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC5jb25zdHJ1Y3Rvci5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC5kb3QtYWxsLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLmV4ZWMuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuc3RpY2t5LmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLnRvLXN0cmluZy5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5yZXBsYWNlLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnNlYXJjaC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuZm9yLWVhY2guanMiOwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwoKaW1wb3J0IHsgbWFwU3RhdGUgfSBmcm9tICd2dWV4JzsKaW1wb3J0IHV0aWxzIGZyb20gJ0AvdXRpbHMuanMnOwppbXBvcnQgaG90ZW50VWlVdGlscyBmcm9tICdAL2hvdGVudC11aS11dGlsLmpzJzsKaW1wb3J0IHsgTWVzc2FnZSB9IGZyb20gJ2VsZW1lbnQtdWknOwppbXBvcnQgcmVxIGZyb20gJ0AvcmVxdWVzdC5qcyc7CmltcG9ydCBzdWJfcGlvX21peGluIGZyb20gJ0Avc3ViLXBlcm1pc3Npb24tbWl4aW4uanMnOwppbXBvcnQgRWlwVGFnIGZyb20gJ0AvY29tcG9uZW50cy9laXBDb250cm9sL0VpcFRhZy52dWUnOwppbXBvcnQgRWlwU2VsZWN0RGlhIGZyb20gJ0AvY29tcG9uZW50cy9laXBDb250cm9sL0VpcFNlbGVjdERpYS52dWUnOwpleHBvcnQgZGVmYXVsdCB7CiAgY29tcG9uZW50czogewogICAgRWlwVGFnOiBFaXBUYWcsCiAgICBFaXBTZWxlY3REaWE6IEVpcFNlbGVjdERpYQogIH0sCiAgbmFtZTogJ2VpcC1kaWFsb2cnLAogIHByb3BzOiBbJ3ZhbGlkYXRlJywgJ3ZhbHVlJywgJ25hbWUnLCAncGVybWlzc2lvbicsICdhdHRlcicsICdzaW5nbGUnLCAnc2VsZWN0b3Jjb25maWcnLCAnY3VzdGRpYWxvZycsICdwbGFjZWhvbGRlcicsICd0b29sdGlwcGxhY2VtZW50J10sCiAgbWl4aW5zOiBbc3ViX3Bpb19taXhpbl0sCiAgLy/mt7flhaXmlrnlvI/lvJXlhaXooajljZXnu4Tku7bkuK3lhazlhbHlsZ7mgKfvvIzlpITnkIblrZDooajjgIHlrZnooajooYzlhoXogZTliqjvvIjliIfpnaLkv67mlLlwZXJtaXNzaW9uX3N1Yu+8iQogIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7CiAgICByZXR1cm4gewogICAgICBkaWFsb2dWaXNpYmxlOiBmYWxzZSwKICAgICAgLy/miZPlvIDmoJHlvaLovpPlhaXliqjmgIHlj4LmlbDlgLznmoTlr7nor53moYYKICAgICAgcGFnZVBhcmFtOiB7fSwKICAgICAgLy/moJHlvaLlr7nor53moYblj4LmlbAKICAgICAgY29uZGl0aW9uZmllbGRUcmVlOiBbXSwKICAgICAgLy/moJHlvaLlr7nor53moYbmnaHku7blrZfmrrUKICAgICAgZGF0YTogewogICAgICAgIHF4ZGQ6IHt9CiAgICAgIH0sCiAgICAgIGlucHV0U3VmZml4V2lkdGg6IDAsCiAgICAgIHBsYWNlaG9sZGVyQm86ICcnLAogICAgICBxdWlja1NlYXJjaDogJycsCiAgICAgIC8v5aGr5YaZ5o+Q56S6CiAgICAgIGNvbmRpdGlvbkJpbmQ6IFtdLAogICAgICAvL+WPguaVsOafpeivouWtl+autQogICAgICBub2RlS2V5OiAnSURfJywKICAgICAgLy/moJHlvaLmlbDmja7niLZJZAogICAgICBjdXN0b21EaWFsb2dTaG93TGlzdDogZmFsc2UsCiAgICAgIGN1c3RvbURpYWxvZ1Nob3dUcmVlOiBmYWxzZSwKICAgICAgc2VsZWN0T3JnUHJvcHM6IHsKICAgICAgICBsYWJlbDogJ25hbWUnCiAgICAgIH0sCiAgICAgIHN0eWxlOiAnJywKICAgICAgLy/lr7nor53moYblrr3pq5gKICAgICAgc2VsZWN0T3JnczogbnVsbCwKICAgICAgaW5wdXRTdWZmaXhIZWlnaHQ6IDMzLAogICAgICBjb25maWc6IG51bGwsCiAgICAgIHVwZGF0aW5nOiBmYWxzZSwKICAgICAgZGlzcGxheWZpZWxkOiBbXSwKICAgICAgLy/mmL7npLrlrZfmrrUKICAgICAgY3VzdG9tRGlhbG9nOiB7fSwKICAgICAgcXVlcnlQYXJhbTogJycsCiAgICAgIC8v5p+l6K+i5p2h5Lu26L6T5YWl55qE5YC8CiAgICAgIHByb3BzMTogW10sCiAgICAgIHNob3dEYXRhOiBbXSwKICAgICAgY2hlY2tCb3hEYXRhQWxsOiBbXSwKICAgICAgLy/pgInkuK3lr7nosaHnmoTpm4blkIgKICAgICAgZGVmYXVsdFByb3BzOiB7CiAgICAgICAgY2hpbGRyZW46ICdjaGlsZHJlbicsCiAgICAgICAgbGFiZWw6ICdsYWJlbCcsCiAgICAgICAgaXNMZWFmOiAnaXNMZWFmJwogICAgICB9LAogICAgICBwcm9wc0RhdGE6IFtdLAogICAgICBxdWVyeXNTaG93OiBmYWxzZSwKICAgICAgLy/mmK/lkKbmmL7npLrmkJzntKLmoYYKICAgICAgdW5kZWZpbmVkYTogJycsCiAgICAgIGlzQ3VycmVudENoYW5nZTogZmFsc2UsCiAgICAgIC8v5piv5ZCm5LiN5omn6KGMIG9yZ1RhYmxlU2VsZWN0aW9u5pa55rOVCiAgICAgIHBhZ2luYXRpb246IHsKICAgICAgICBwYWdlOiAxLAogICAgICAgIHBhZ2VTaXplOiAyMCwKICAgICAgICB0b3RhbDogMAogICAgICB9LAogICAgICBwYXJhbTogW10sCiAgICAgIC8v57uR5a6a55qE6KGo5Y2V5a2X5q61CiAgICAgIHRyZWVMaXN0OiBbXSwKICAgICAgZGlzcGxheUZpZWxkOiB7fSwKICAgICAgcXVlcnlQYXJhbXM6IFtdLAogICAgICBwbGFjZWhvbGRlcnM6IFtdLAogICAgICBvbGRzZWxlY3RPcmdzOiBbXSwKICAgICAgY29tYmluYXRpb25UcmVlRGF0YTogW10sCiAgICAgIGNvbWJpVHJlZURpc3BsYXlGaWVsZDogW10sCiAgICAgIGNvbWJpbmF0aW9uVHJlZVF1ZXJ5czogW10sCiAgICAgIGNvbWJpbmF0aW9uUnVsZToge30sCiAgICAgIHRvZ2dsZUJ0bjogJ2VsLWljb24tYXJyb3ctbGVmdCcsCiAgICAgIHRyZWVTaG93OiB0cnVlLAogICAgICB0cmFuc3Rpb25XaWR0aDogJzI1JScsCiAgICAgIGxlZnRUcmVlVGl0bGU6ICcnLAogICAgICB3cml0ZWFibGU6IHRydWUKICAgIH07CiAgfSwKICB3YXRjaDogewogICAgcHJvcHMxOiBmdW5jdGlvbiBwcm9wczEobmV3VmFsLCBvbGRWYWwpIHsKICAgICAgLy/moJHlvaIKICAgICAgaWYgKHRoaXMuc2hvd0RhdGEgIT0gdW5kZWZpbmVkICYmIHRoaXMuc2hvd0RhdGEubGVuZ3RoID4gMCkgewogICAgICAgIHZhciB0aGlzXyA9IHRoaXM7CiAgICAgICAgdmFyIGRhdGEgPSBbXTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc2hvd0RhdGEubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGRhdGEucHVzaCh0aGlzLnNob3dEYXRhW2ldKTsKICAgICAgICB9CiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgZGF0YS5sZW5ndGg7IF9pKyspIHsKICAgICAgICAgICAgdGhpc18uJHJlZnMudHJlZS5zZXRDaGVja2VkKGRhdGFbX2ldLCB0cnVlKTsKICAgICAgICAgICAgdGhpc18uY2hlY2tOb2RlKGRhdGFbX2ldLCB0aGlzXyk7CiAgICAgICAgICB9CiAgICAgICAgfSwgMjAwKTsKICAgICAgfQogICAgfQogIH0sCiAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHsKICAgIHZhciBfaG90ZW50VWlVdGlscyRnZXRTdWIgPSBob3RlbnRVaVV0aWxzLmdldFN1YlNjb3BlRWxBbmRJbmRleCh0aGlzLiRlbCksCiAgICAgIHN1YlNjb3BlRWwgPSBfaG90ZW50VWlVdGlscyRnZXRTdWIuc3ViU2NvcGVFbCwKICAgICAgaW5kZXggPSBfaG90ZW50VWlVdGlscyRnZXRTdWIuaW5kZXg7CiAgICBpZiAoc3ViU2NvcGVFbCAmJiAoc3ViU2NvcGVFbC5nZXRBdHRyaWJ1dGUoJ3Jvd19yZWFkb25seScpID09ICd0cnVlJyB8fCBzdWJTY29wZUVsLmdldEF0dHJpYnV0ZSgncm93X3JlYWRvbmx5JykgPT09IHRydWUpKSB7CiAgICAgIHRoaXMud3JpdGVhYmxlID0gZmFsc2U7CiAgICB9CiAgICAvL+iOt+WPluWvueivneahhuaMiemSruWQjeensOWuveW6pgogICAgaWYgKHRoaXMuJHJlZnMuaW5wdXRTdWZmaXgpIHsKICAgICAgdGhpcy5pbnB1dFN1ZmZpeFdpZHRoID0gdGhpcy4kcmVmcy5pbnB1dFN1ZmZpeC5vZmZzZXRXaWR0aCArIDE7CiAgICB9CiAgfSwKICBjb21wdXRlZDogbWFwU3RhdGUoewogICAgLy8gcGFnaW5hdGlvbjogc3RhdGUgPT4gc3RhdGUuZGlhbG9nLnBhZ2luYXRpb24sCiAgICB0b3RhbDogZnVuY3Rpb24gdG90YWwoc3RhdGUpIHsKICAgICAgcmV0dXJuIHN0YXRlLmRpYWxvZy50b3RhbDsKICAgIH0sCiAgICBkaWFsb2dEYXRhOiBmdW5jdGlvbiBkaWFsb2dEYXRhKHN0YXRlKSB7CiAgICAgIHJldHVybiBzdGF0ZS5kaWFsb2cucm93czsKICAgIH0sCiAgICBpbnB1dFZhbDogZnVuY3Rpb24gaW5wdXRWYWwoKSB7CiAgICAgIGlmICghdGhpcy52YWx1ZSB8fCB0aGlzLnZhbHVlID09ICd8fFtdJykgewogICAgICAgIHRoaXMuY2hlY2tCb3hEYXRhQWxsID0gW107CiAgICAgICAgLy8gdGhpcy5zaG93RGF0YSA9IFtdOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9IGVsc2UgewogICAgICAgIHZhciBuYW1lQXJ5ID0gdGhpcy52YWx1ZS5zcGxpdCgnLCcpOwogICAgICAgIGlmICh0aGlzLnZhbHVlLmluZGV4T2YoJ3x8JykgPiAwKSB7CiAgICAgICAgICBuYW1lQXJ5ID0gdGhpcy52YWx1ZS5zcGxpdCgnfHwnKVswXS5zcGxpdCgnLCcpOwogICAgICAgICAgLy8gdGhpcy5zaG93RGF0YT1KU09OLnBhcnNlKHRoaXMudmFsdWUuc3BsaXQoInx8IilbMV0pOwogICAgICAgIH0KICAgICAgICAvLyAgdGhpcy5zaG93RGF0YSA9dGhpcy5zZWxlY3RPcmdzOwogICAgICAgIHZhciBpZEFyeSA9IG51bGw7CiAgICAgICAgdmFyIGFjY291bnRBcnkgPSBudWxsOwogICAgICAgIHZhciByZXN1bHQgPSBbXTsKICAgICAgICBuYW1lQXJ5LmZvckVhY2goZnVuY3Rpb24gKG0sIGkpIHsKICAgICAgICAgIHZhciBuID0gewogICAgICAgICAgICB2YWx1ZTogbQogICAgICAgICAgfTsKICAgICAgICAgIHJlc3VsdC5wdXNoKG4pOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH0KICAgIH0sCiAgICBpbnB1dFdyaXRlYWJsZTogZnVuY3Rpb24gaW5wdXRXcml0ZWFibGUoKSB7CiAgICAgIHJldHVybiB0aGlzLndyaXRlYWJsZSA/IHV0aWxzLmdldFdyaXRlYWJsZSh0aGlzLnBlcm1pc3Npb25fc3ViKSA6IHRoaXMud3JpdGVhYmxlOwogICAgfSwKICAgIGlucHV0VmFsaWRhdGU6IGZ1bmN0aW9uIGlucHV0VmFsaWRhdGUoKSB7CiAgICAgIHZhciB2YWxpZGF0ZU9iaiA9IHRoaXMuJHN0b3JlLnN0YXRlLmluZGV4LnZhbGlkYXRlOwogICAgICByZXR1cm4gdXRpbHMuYWRkUmVxdWlyZWRPck5vdCh0aGlzLnBlcm1pc3Npb25fc3ViLCB0aGlzLnZhbGlkYXRlLCB2YWxpZGF0ZU9iaiwgdGhpcyk7CiAgICB9LAogICAgaW5wdXROYW1lOiBmdW5jdGlvbiBpbnB1dE5hbWUoKSB7CiAgICAgIHZhciBsYWJlbGRlc2MgPSAnJzsKICAgICAgaWYgKHRoaXMuJHNsb3RzICYmIHRoaXMuJHNsb3RzLmxhYmVsZGVzYyAmJiB0aGlzLiRzbG90cy5sYWJlbGRlc2NbMF0uY2hpbGRyZW4gJiYgdGhpcy4kc2xvdHMubGFiZWxkZXNjWzBdLmNoaWxkcmVuWzBdLnRleHQpIHsKICAgICAgICBsYWJlbGRlc2MgPSB0aGlzLiRzbG90cy5sYWJlbGRlc2NbMF0uY2hpbGRyZW5bMF0udGV4dDsKICAgICAgICByZXR1cm4gdGhpcy5uYW1lID8gdGhpcy5uYW1lIDogdXRpbHMuZ2V0TmFtZSgpICsgJy0nICsgbGFiZWxkZXNjOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiB0aGlzLm5hbWUgPyB0aGlzLm5hbWUgOiB1dGlscy5nZXROYW1lKCk7CiAgICAgIH0KICAgIH0sCiAgICAvLyDmmK/lkKbmnInlm57loavorr7nva4KICAgIGJpbmRTZXQ6IGZ1bmN0aW9uIGJpbmRTZXQoKSB7CiAgICAgIHJldHVybiB0aGlzLnNlbGVjdG9yY29uZmlnID8gdGhpcy5zZWxlY3RvcmNvbmZpZy5iaW5kIDogbnVsbDsKICAgIH0KICB9KSwKICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkKCkgewogICAgaWYgKCF0aGlzLnBsYWNlaG9sZGVyKSB7CiAgICAgIHRoaXMucGxhY2Vob2xkZXJCbyA9ICfor7fpgInmi6nlhoXlrrknOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5wbGFjZWhvbGRlckJvID0gdGhpcy5wbGFjZWhvbGRlcjsKICAgIH0KICAgIHRoaXMuJHZhbGlkYXRvciA9IHRoaXMuJHJvb3QuJHZhbGlkYXRvcjsKICB9LAogIG1ldGhvZHM6IHsKICAgIHNlbGVjdEFsbDogZnVuY3Rpb24gc2VsZWN0QWxsKHNlbGVjdGlvbikgewogICAgICBpZiAodGhpcy5vbGRzZWxlY3RPcmdzICE9IG51bGwgJiYgc2VsZWN0aW9uLmxlbmd0aCA+IDApIHsKICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHNlbGVjdGlvbi5sZW5ndGg7IHgrKykgewogICAgICAgICAgaWYgKHRoaXMuaW5kZXhBcnJheSh0aGlzLm9sZHNlbGVjdE9yZ3MsIHNlbGVjdGlvblt4XSkgPT09IC0xKSB7CiAgICAgICAgICAgIHRoaXMub2xkc2VsZWN0T3Jncy5wdXNoKHNlbGVjdGlvblt4XSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMuc2VsZWN0T3JncyA9IF8uY2xvbmVEZWVwKHRoaXMub2xkc2VsZWN0T3Jncyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5zZWxlY3RPcmdzID0gXy5jbG9uZURlZXAoc2VsZWN0aW9uKTsKICAgICAgfQogICAgfSwKICAgIGNoZWNrTm9kZTogZnVuY3Rpb24gY2hlY2tOb2RlKGRhdGEsIHRoaXNfLCBwbm9kZSkgewogICAgICBpZiAoZGF0YS5QaWQpIHsKICAgICAgICB2YXIgbm9kZSA9IHRoaXNfLiRyZWZzLnRyZWUuZ2V0Tm9kZShkYXRhLlBpZCk7CiAgICAgICAgbm9kZS5pbmRldGVybWluYXRlID0gdHJ1ZTsKICAgICAgICBpZiAobm9kZS5kYXRhLlBpZCkgewogICAgICAgICAgdGhpc18uJHJlZnMudHJlZS5nZXROb2RlKG5vZGUuZGF0YS5QaWQpLmluZGV0ZXJtaW5hdGUgPSB0cnVlOwogICAgICAgICAgdGhpcy5jaGVja05vZGUodGhpc18uJHJlZnMudHJlZS5nZXROb2RlKG5vZGUuZGF0YS5QaWQpLmRhdGEsIHRoaXNfLCB0aGlzXy4kcmVmcy50cmVlLmdldE5vZGUobm9kZS5kYXRhLlBpZCkpOwogICAgICAgIH0KICAgICAgICBpZiAoIW5vZGUuaW5kZXRlcm1pbmF0ZSkgewogICAgICAgICAgbm9kZS5pbmRldGVybWluYXRlID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAocG5vZGUgJiYgIXBub2RlLmluZGV0ZXJtaW5hdGUpIHsKICAgICAgICBwbm9kZS5pbmRldGVybWluYXRlID0gdHJ1ZTsKICAgICAgfQogICAgfSwKICAgIC8v5Zue6L2m5p+l6K+iCiAgICBzZWFyY2hFbnRlckZ1bjogZnVuY3Rpb24gc2VhcmNoRW50ZXJGdW4oZSkgewogICAgICB2YXIga2V5Q29kZSA9IHdpbmRvdy5ldmVudCA/IGUua2V5Q29kZSA6IGUud2hpY2g7CiAgICAgIGlmIChrZXlDb2RlID09IDEzKSB7CiAgICAgICAgdGhpcy5zZWFyY2goKTsKICAgICAgfQogICAgfSwKICAgIGhhbmRsZVNpemVDaGFuZ2U6IGZ1bmN0aW9uIGhhbmRsZVNpemVDaGFuZ2Uoc2l6ZSkgewogICAgICB0aGlzLmlzQ3VycmVudENoYW5nZSA9IHRydWU7CiAgICAgIC8v5q+P6aG15LiL5ouJ5pi+56S65pWw5o2uCiAgICAgIHRoaXMucGFnaW5hdGlvbi5wYWdlU2l6ZSA9IHNpemU7CiAgICAgIHRoaXMuc2VhcmNoKCk7CiAgICB9LAogICAgaGFuZGxlQ3VycmVudENoYW5nZTogZnVuY3Rpb24gaGFuZGxlQ3VycmVudENoYW5nZShjdXJyZW50UGFnZSkgewogICAgICB2YXIgdGhpc18gPSB0aGlzOwogICAgICBpZiAodGhpcy5zZWxlY3RPcmdzICE9IHVuZGVmaW5lZCAmJiB0aGlzLnNlbGVjdE9yZ3MubGVuZ3RoID4gMCkgewogICAgICAgIHRoaXMuc2VsZWN0T3Jncy5mb3JFYWNoKGZ1bmN0aW9uIChyb3cpIHsKICAgICAgICAgIHZhciByZXMgPSB0aGlzXy5pbmRleEFycmF5KHRoaXNfLmNoZWNrQm94RGF0YUFsbCwgcm93KTsKICAgICAgICAgIGlmIChyZXMgPT0gLTEpIHsKICAgICAgICAgICAgdGhpc18uY2hlY2tCb3hEYXRhQWxsLnB1c2gocm93KTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQogICAgICB0aGlzLmlzQ3VycmVudENoYW5nZSA9IHRydWU7CiAgICAgIC8v54K55Ye756ys5Yeg6aG1CiAgICAgIHRoaXMucGFnaW5hdGlvbi5wYWdlID0gY3VycmVudFBhZ2U7CiAgICAgIHRoaXMuc2VhcmNoKCk7CiAgICB9LAogICAgY2hlY2tMaXN0OiBmdW5jdGlvbiBjaGVja0xpc3QoKSB7CiAgICAgIHZhciB0aGlzXyA9IHRoaXM7CiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgIC8v5YiX6KGoCiAgICAgICAgaWYgKHRoaXNfLmNoZWNrQm94RGF0YUFsbCAhPSB1bmRlZmluZWQgJiYgdGhpc18uY2hlY2tCb3hEYXRhQWxsLmxlbmd0aCA+IDApIHsKICAgICAgICAgIHRoaXNfLmNoZWNrQm94RGF0YUFsbC5mb3JFYWNoKGZ1bmN0aW9uIChyb3cpIHsKICAgICAgICAgICAgdmFyIHJlcyA9IHRoaXNfLmluZGV4QXJyYXkodGhpc18uZGlhbG9nRGF0YSwgcm93KTsKICAgICAgICAgICAgdGhpc18udW5kZWZpbmVkYSA9IHJlczsKICAgICAgICAgICAgaWYgKHJlcyAhPSAtMSkgewogICAgICAgICAgICAgIHRoaXNfLmlzQ3VycmVudENoYW5nZSA9IHRydWU7CiAgICAgICAgICAgICAgdGhpc18udG9nZ2xlUm93U2VsZWN0aW9uKHJlcywgdHJ1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfSwgMzAwKTsKICAgIH0sCiAgICB0b2dnbGVSb3dTZWxlY3Rpb246IGZ1bmN0aW9uIHRvZ2dsZVJvd1NlbGVjdGlvbihyZXMsIHZhbCkgewogICAgICB0aGlzLiRyZWZzLm9yZ1RhYmxlLnRvZ2dsZVJvd1NlbGVjdGlvbih0aGlzLmRpYWxvZ0RhdGFbcmVzXSwgdmFsKTsKICAgIH0sCiAgICBzaG93RGlhbG9nOiBmdW5jdGlvbiBzaG93RGlhbG9nKGl0ZW0pIHsKICAgICAgdmFyIF90aGlzMiA9IHRoaXM7CiAgICAgIHZhciB0aGlzXyA9IHRoaXM7CiAgICAgIHZhciBhbGlhcyA9IHRoaXMuY3VzdGRpYWxvZy5jdXN0RGlhbG9nLmFsaWFzOwogICAgICB0aGlzLiRzdG9yZS5kaXNwYXRjaCgnZm9ybS9nZXRCeUFsaWFzJywgYWxpYXMpLnRoZW4oZnVuY3Rpb24gKGN1c3RvbURpYWxvZykgewogICAgICAgIGlmICghY3VzdG9tRGlhbG9nIHx8ICFjdXN0b21EaWFsb2cuYWxpYXMpIHsKICAgICAgICAgIE1lc3NhZ2UuZXJyb3IoJ+WvueivneahhuWIq+WQjeOAkCcgKyBhbGlhcyArICfjgJHkuI3lrZjlnKjvvIEnKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKGN1c3RvbURpYWxvZy5zdHlsZSA9PSAxKSB7CiAgICAgICAgICB2YXIgZGlzcGxheWxpc3QgPSBKU09OLnBhcnNlKGN1c3RvbURpYWxvZy5kaXNwbGF5ZmllbGQpOwogICAgICAgICAgdGhpc18ubm9kZUtleSA9IGRpc3BsYXlsaXN0LmlkOwogICAgICAgIH0KICAgICAgICAvL+WvueivneahhuaMieihqOWNleWtl+auteafpeivou+8iOWPguaVsOS8oOWFpeeahO+8iQogICAgICAgIHZhciBiaW5kTGlzdCA9IHRoaXNfLmN1c3RkaWFsb2cuY3VzdERpYWxvZy5jb25kaXRpb25zOwogICAgICAgIHRoaXNfLnBhcmFtID0gW107IC8v57uR5a6a55qE6KGo5Y2V5a2X5q61CiAgICAgICAgaWYgKGJpbmRMaXN0Lmxlbmd0aCA+IDApIHsKICAgICAgICAgIGJpbmRMaXN0LmZvckVhY2goZnVuY3Rpb24gKGVsZSkgewogICAgICAgICAgICAvL+e7keWumuihqOWNleWtl+autQogICAgICAgICAgICBpZiAoZWxlLmRlZmF1bHRUeXBlID09ICczJyAmJiBlbGUuYmluZCkgewogICAgICAgICAgICAgIHZhciBvYmogPSB7fTsKICAgICAgICAgICAgICBvYmouZmllbGQgPSBlbGUuZmllbGQ7CiAgICAgICAgICAgICAgb2JqLmJpbmQgPSBlbGUuYmluZDsKICAgICAgICAgICAgICB0aGlzXy5wYXJhbS5wdXNoKG9iaik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICAvL+WIpOaWreWvueivneahhuafpeivouaYr+WQpuacieadoeS7tgogICAgICAgIHZhciB1c2VySW5wdXRMaXN0ID0gSlNPTi5wYXJzZShjdXN0b21EaWFsb2cuY29uZGl0aW9uZmllbGQpOwogICAgICAgIHRoaXNfLnF1aWNrU2VhcmNoID0gJyc7IC8v5aGr5YaZ5o+Q56S6IHBsYWNlaG9sZGVyCiAgICAgICAgdGhpc18uY29uZGl0aW9uQmluZCA9IFtdOwogICAgICAgIHZhciBxdWVyeVBhcmFtcyA9IFtdOwogICAgICAgIHZhciBwbGFjZWhvbGRlcnMgPSBbXTsKICAgICAgICBpZiAodXNlcklucHV0TGlzdC5sZW5ndGggPiAwKSB7CiAgICAgICAgICB1c2VySW5wdXRMaXN0LmZvckVhY2goZnVuY3Rpb24gKGVsZSkgewogICAgICAgICAgICB2YXIgb2JqID0ge307CiAgICAgICAgICAgIC8v5p2h5Lu25p+l6K+i5Y+C5pWw77yI55So5oi36L6T5YWl55qE77yJIOaWh+acrOahhui+k+WFpQogICAgICAgICAgICBpZiAoZWxlLmRlZmF1bHRUeXBlID09ICcxJykgewogICAgICAgICAgICAgIG9ialtlbGUuZmllbGRdID0gJyc7CiAgICAgICAgICAgICAgcXVlcnlQYXJhbXMucHVzaChvYmopOwogICAgICAgICAgICAgIHRoaXNfLmNvbmRpdGlvbkJpbmQucHVzaChlbGUpOwogICAgICAgICAgICAgIHBsYWNlaG9sZGVycy5wdXNoKCfor7fovpPlhaUnICsgZWxlLmNvbW1lbnQpOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICAgIF90aGlzMi4kc2V0KF90aGlzMiwgJ3F1ZXJ5UGFyYW1zJywgcXVlcnlQYXJhbXMpOwogICAgICAgICAgX3RoaXMyLiRzZXQoX3RoaXMyLCAncGxhY2Vob2xkZXJzJywgcGxhY2Vob2xkZXJzKTsKICAgICAgICB9CiAgICAgICAgLy/liKTmlq3mmK/lkKbmmL7npLrmnaHku7bmn6Xor6LovpPlhaXmoYYKICAgICAgICBpZiAodGhpc18ucXVpY2tTZWFyY2ggIT0gJycpIHsKICAgICAgICAgIHRoaXNfLnF1ZXJ5c1Nob3cgPSB0cnVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzXy5xdWVyeXNTaG93ID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgdGhpc18ucXVpY2tTZWFyY2ggPSAn6K+36L6T5YWlJyArIF90aGlzMi5xdWlja1NlYXJjaCArICfmn6Xor6InOwogICAgICAgIHRoaXNfLnN0eWxlID0gJ2hlaWdodDonICsgY3VzdG9tRGlhbG9nLmhlaWdodCArICdweCc7CiAgICAgICAgaWYgKHdpbmRvdy5zY3JlZW4uaGVpZ2h0ICYmIHdpbmRvdy5zY3JlZW4uaGVpZ2h0IDw9IDkwMCkgewogICAgICAgICAgX3RoaXMyLnN0eWxlID0gJ2hlaWdodDo0NDBweCc7CiAgICAgICAgfQogICAgICAgIGlmIChjdXN0b21EaWFsb2cuc3R5bGUgPT0gMCB8fCBjdXN0b21EaWFsb2cuc3R5bGUgPT0gMikgewogICAgICAgICAgLy/liJfooagKICAgICAgICAgIHRoaXNfLmN1c3RvbURpYWxvZ1Nob3coewogICAgICAgICAgICBhbGlhczogYWxpYXMsCiAgICAgICAgICAgIGN1c3RvbURpYWxvZzogY3VzdG9tRGlhbG9nCiAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgaWYgKGN1c3RvbURpYWxvZy5zdHlsZSA9PSAxKSB7CiAgICAgICAgICAvL+agkeW9ogogICAgICAgICAgdGhpc18ucGFnZVBhcmFtID0gewogICAgICAgICAgICBhbGlhczogYWxpYXMsCiAgICAgICAgICAgIGN1c3RvbURpYWxvZzogY3VzdG9tRGlhbG9nCiAgICAgICAgICB9OwogICAgICAgICAgdGhpc18uY3VzdG9tRGlhbG9nID0gY3VzdG9tRGlhbG9nOwogICAgICAgICAgdmFyIHBhcmFtID0ge307CiAgICAgICAgICB0aGlzXy5jb25kaXRpb25maWVsZFRyZWUgPSBbXTsKICAgICAgICAgIC8v5Yik5pat5piv5ZCm5a2Y5Zyo5p2h5Lu2CiAgICAgICAgICBpZiAoY3VzdG9tRGlhbG9nLmNvbmRpdGlvbmZpZWxkKSB7CiAgICAgICAgICAgIHRoaXNfLmNvbmRpdGlvbmZpZWxkVHJlZSA9IEpTT04ucGFyc2UoY3VzdG9tRGlhbG9nLmNvbmRpdGlvbmZpZWxkKTsKICAgICAgICAgICAgaWYgKHRoaXNfLmNvbmRpdGlvbmZpZWxkVHJlZS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IHRoaXNfLmNvbmRpdGlvbmZpZWxkVHJlZS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgICAgICAgLy/liKTmlq3mnaHku7blrZfmrrXmmK/lkKbmmK/liqjmgIHkvKDlhaXvvIhkZWZhdWx0VHlwZe+8mjTvvJrliqjmgIHkvKDlhaXvvIwy77ya5Zu65a6a5YC8IO+8iQogICAgICAgICAgICAgICAgaWYgKHRoaXNfLmNvbmRpdGlvbmZpZWxkVHJlZVtpXS5kZWZhdWx0VHlwZSA9PSAnNCcpIHsKICAgICAgICAgICAgICAgICAgcGFyYW1bdGhpc18uY29uZGl0aW9uZmllbGRUcmVlW2ldLmZpZWxkXSA9IHRoaXNfLmNvbmRpdGlvbmZpZWxkVHJlZVtpXS5jb21tZW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgLy/mnInliqjmgIHkvKDlhaXnmoTlrZfmrrUKICAgICAgICAgIGlmIChKU09OLnN0cmluZ2lmeShwYXJhbSkgIT0gJ3t9JykgewogICAgICAgICAgICB0aGlzXy5kaWFsb2dWaXNpYmxlID0gdHJ1ZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8v5peg5Yqo5oCB5Lyg5YWl55qE5a2X5q61CiAgICAgICAgICAgIHRoaXNfLmN1c3RvbURpYWxvZ1RyZWVTaG93KHRoaXNfLnBhZ2VQYXJhbSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KTsKICAgIH0sCiAgICAvL+aJk+W8gOagkeW9ouWKqOaAgeWPguaVsOi+k+WFpeWAvOeahOWvueivneahhgogICAgaGFuZGxlU2F2ZTogZnVuY3Rpb24gaGFuZGxlU2F2ZSgpIHsKICAgICAgdGhpcy5jdXN0b21EaWFsb2dUcmVlU2hvdyh0aGlzLnBhZ2VQYXJhbSk7CiAgICAgIHRoaXMuZGlhbG9nVmlzaWJsZSA9IGZhbHNlOwogICAgfSwKICAgIC8v5YWz6Zet5qCR5b2i5Yqo5oCB5Y+C5pWw6L6T5YWl5YC855qE5a+56K+d5qGGCiAgICBoYW5kbGVDbG9zZTogZnVuY3Rpb24gaGFuZGxlQ2xvc2UoKSB7CiAgICAgIHRoaXMuZGlhbG9nVmlzaWJsZSA9IGZhbHNlOwogICAgfSwKICAgIC8v5Yik5pat5pWw5o2u5piv5ZCm5YyF5ZCr5p+Q5Liq5a+56LGh77yM5bm26L+U5Zue5pWw5o2u5YyF5ZCr5a+56LGh55qE5LiL5qCHCiAgICBpbmRleEFycmF5OiBmdW5jdGlvbiBpbmRleEFycmF5KGFycmF5LCBpdGVtKSB7CiAgICAgIGlmIChhcnJheS5sZW5ndGggPT0gMCkgewogICAgICAgIHJldHVybiAtMTsKICAgICAgfQogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KGFycmF5W2ldKSA9PSBKU09OLnN0cmluZ2lmeShpdGVtKSkgewogICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiAtMTsKICAgIH0sCiAgICAvL+eCueWHu+WIl+ihqOafkOS4gOS4quWkjemAieahhuaXtuinpuWPkQogICAgb25UYWJsZVNlbGVjdDogZnVuY3Rpb24gb25UYWJsZVNlbGVjdChyb3dzLCByb3cpIHsKICAgICAgdGhpcy5pc0N1cnJlbnRDaGFuZ2UgPSBmYWxzZTsKICAgICAgLy/liKTmlq3ngrnlh7vliJfooajmlbDmja7ml7blpI3pgInmoYbmmK/lkKbli77pgIkgIHNlbGVjdGVk77yadHJ1ZeS4jeWLvumAie+8jGZhbHNl5Yu+6YCJCiAgICAgIHZhciBzZWxlY3RlZCA9IHRoaXMuc2VsZWN0T3JncyAmJiB0aGlzLnNlbGVjdE9yZ3MubGVuZ3RoID4gMCAmJiB0aGlzLmluZGV4QXJyYXkodGhpcy5zZWxlY3RPcmdzLCByb3cpICE9PSAtMTsKICAgICAgaWYgKHNlbGVjdGVkKSB7CiAgICAgICAgdGhpcy5pc0N1cnJlbnRDaGFuZ2UgPSB0cnVlOwogICAgICAgIHZhciByZXMgPSB0aGlzLmluZGV4QXJyYXkodGhpcy5zZWxlY3RPcmdzLCByb3cpOwogICAgICAgIHRoaXMuc2VsZWN0T3Jncy5zcGxpY2UocmVzLCAxKTsKICAgICAgfQogICAgfSwKICAgIC8v54K55Ye75YiX6KGo5p+Q5LiA5p2h5pWw5o2u5pe26Kem5Y+RCiAgICBvcmdSb3dDbGljazogZnVuY3Rpb24gb3JnUm93Q2xpY2socm93LCBjb2x1bW4sIGV2ZW50KSB7CiAgICAgIGlmICh0aGlzLmN1c3RvbURpYWxvZy5zZWxlY3ROdW0gPT09IDEpIHsKICAgICAgICAkKGV2ZW50LmN1cnJlbnRUYXJnZXQuY2hpbGRyZW5bMF0uY2hpbGRyZW5bMF0uY2hpbGRyZW5bMF0pLnRyaWdnZXIoJ2NsaWNrJyk7CiAgICAgICAgdGhpcy5zZWxlY3RPcmdzID0gW107CiAgICAgICAgdGhpcy5zZWxlY3RPcmdzLnB1c2gocm93KTsKICAgICAgfSBlbHNlIGlmICh0aGlzLmN1c3RvbURpYWxvZy5zZWxlY3ROdW0gIT0gMSkgewogICAgICAgIHRoaXMuaXNDdXJyZW50Q2hhbmdlID0gZmFsc2U7CiAgICAgICAgLy/liKTmlq3ngrnlh7vliJfooajmlbDmja7ml7blpI3pgInmoYbmmK/lkKbli77pgIkgIHNlbGVjdGVk77yadHJ1ZeS4jeWLvumAie+8jGZhbHNl5Yu+6YCJCiAgICAgICAgdmFyIHNlbGVjdGVkID0gdGhpcy5zZWxlY3RPcmdzICYmIHRoaXMuc2VsZWN0T3Jncy5sZW5ndGggPiAwICYmIHRoaXMuaW5kZXhBcnJheSh0aGlzLnNlbGVjdE9yZ3MsIHJvdykgIT09IC0xOwogICAgICAgIGlmIChzZWxlY3RlZCkgewogICAgICAgICAgdGhpcy5pc0N1cnJlbnRDaGFuZ2UgPSB0cnVlOwogICAgICAgICAgdmFyIHJlcyA9IHRoaXMuaW5kZXhBcnJheSh0aGlzLnNlbGVjdE9yZ3MsIHJvdyk7CiAgICAgICAgICB0aGlzLnNlbGVjdE9yZ3Muc3BsaWNlKHJlcywgMSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuJHJlZnMub3JnVGFibGUudG9nZ2xlUm93U2VsZWN0aW9uKHJvdyk7CiAgICAgIH0KICAgIH0sCiAgICAvL+WIl+ihqOWkjemAieahhuacieaUueWPmOaXtuinpuWPkQogICAgb3JnVGFibGVTZWxlY3Rpb246IGZ1bmN0aW9uIG9yZ1RhYmxlU2VsZWN0aW9uKHNlbGVjdGlvbikgewogICAgICAvL+WFqOmAieeahOaDheWGteeJueauiuWkhOeQhijkuLrkuobkuI7ljp/mnKzlip/og73pgLvovpHkuI3lhrLnqoEs5YWI5aSN5Yi25LiA5Lu95pen55qE6YCJ5Lit5pWw5o2uLueEtuWQjuaLv+WIsOWFqOmAieS6i+S7tuS4reWOu+iuoeeulykKICAgICAgdGhpcy5vbGRzZWxlY3RPcmdzID0gXy5jbG9uZURlZXAodGhpcy5zZWxlY3RPcmdzKTsKICAgICAgLy/lpJrpgIkKICAgICAgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLnNlbGVjdE51bSAhPSAxICYmICF0aGlzLmlzQ3VycmVudENoYW5nZSkgewogICAgICAgIGlmIChzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLmxlbmd0aCA+IDApIHsKICAgICAgICAgIGlmIChzZWxlY3Rpb24ubGVuZ3RoID09IDEgJiYgKCF0aGlzLnNlbGVjdE9yZ3MgfHwgdGhpcy5zZWxlY3RPcmdzLmxlbmd0aCA9PSAwKSkgewogICAgICAgICAgICB0aGlzLnNlbGVjdE9yZ3MgPSBzZWxlY3Rpb247CiAgICAgICAgICB9IGVsc2UgaWYgKCghdGhpcy5zZWxlY3RPcmdzIHx8IHRoaXMuc2VsZWN0T3Jncy5sZW5ndGggPT0gMCkgJiYgc2VsZWN0aW9uLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLnNlbGVjdE9yZ3MpIHsKICAgICAgICAgICAgICB0aGlzLnNlbGVjdE9yZ3MgPSBbXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKHZhciBpID0gc2VsZWN0aW9uLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RPcmdzLnB1c2goc2VsZWN0aW9uW2ldKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzQ3VycmVudENoYW5nZSAmJiBzZWxlY3Rpb24ubGVuZ3RoID49IDEwKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5zZWxlY3RPcmdzKSB7CiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RPcmdzID0gW107CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgZm9yICh2YXIgdSA9IHRoaXMuc2VsZWN0T3Jncy5sZW5ndGggLSAxOyB1ID49IDA7IHUtLSkgewogICAgICAgICAgICAgICAgdmFyIHJlcyA9IHRoaXMuaW5kZXhBcnJheShzZWxlY3Rpb24sIHRoaXMuc2VsZWN0T3Jnc1t1XSk7CiAgICAgICAgICAgICAgICBpZiAocmVzICE9IC0xKSB7CiAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0T3Jncy5zcGxpY2UocmVzLCAxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgc2VsZWN0aW9uLmxlbmd0aDsgX2kyKyspIHsKICAgICAgICAgICAgICB0aGlzLnNlbGVjdE9yZ3MucHVzaChzZWxlY3Rpb25bX2kyXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZvciAodmFyIF9pMyA9IHNlbGVjdGlvbi5sZW5ndGggLSAxOyBfaTMgPj0gMDsgX2kzLS0pIHsKICAgICAgICAgICAgICB0aGlzLnNlbGVjdE9yZ3MucHVzaChzZWxlY3Rpb25bX2kzXSk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICBkaWFsb2dDb25maXJtOiBmdW5jdGlvbiBkaWFsb2dDb25maXJtKCkgewogICAgICB0aGlzLnF1ZXJ5UGFyYW0gPSAnJzsKICAgICAgdGhpcy5jdXN0b21EaWFsb2dTaG93TGlzdCA9IGZhbHNlOwogICAgICB0aGlzLmNhbGFjSW5wdXRTdWZmaXhIZWlnaHQoKTsKICAgICAgdGhpcy5zeW5jSW5wdXRWYWx1ZSgpOwogICAgICAvLyB0aGlzLiRzdG9yZS5kaXNwYXRjaCgiZGlhbG9nL3NldERpYWxvZ0RhdGEiLCBbXSk7CiAgICB9LAogICAgLy/ph43nva4KICAgIHJlc2V0OiBmdW5jdGlvbiByZXNldCgpIHsKICAgICAgdmFyIF90aGlzMyA9IHRoaXM7CiAgICAgIHRoaXMucXVlcnlQYXJhbXMuZm9yRWFjaChmdW5jdGlvbiAocGFyYW1PYmopIHsKICAgICAgICBmb3IgKHZhciBrZXkgaW4gcGFyYW1PYmopIHsKICAgICAgICAgIF90aGlzMy5xdWVyeVBhcmFtc1trZXldID0gJyc7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgLy/nu4TlkIjmoJHph43nva4KICAgICAgdmFyIG5vZGVzID0gdGhpcy4kcmVmcy5jb21iaW5hdGlvblRyZWUuc3RvcmUubm9kZXNNYXA7CiAgICAgIGZvciAodmFyIGtleSBpbiBub2RlcykgewogICAgICAgIG5vZGVzW2tleV0uZXhwYW5kZWQgPSBmYWxzZTsKICAgICAgfQogICAgICB0aGlzLmNvbWJpbmF0aW9uVHJlZVF1ZXJ5cy5zcGxpY2UoMCk7CiAgICAgIHRoaXMuc2VhcmNoKHRydWUpOwogICAgfSwKICAgIC8v5p+l6K+iCiAgICBzZWFyY2g6IGZ1bmN0aW9uIHNlYXJjaChyZXNldFBhZ2ludGlvbikgewogICAgICB2YXIgX3RoaXM0ID0gdGhpczsKICAgICAgdmFyIHF1ZXJ5cyA9IFtdOyAvL+afpeivouadoeS7tgogICAgICB2YXIgcXVlcnlGaWx0ZXIgPSB7fTsKICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KHRoaXMucGFnaW5hdGlvbikgPT0gJ3t9JykgewogICAgICAgIHRoaXMucGFnaW5hdGlvbiA9IHsKICAgICAgICAgIHBhZ2U6ICcxJywKICAgICAgICAgIHBhZ2VTaXplOiAnMTAnLAogICAgICAgICAgc2hvd1RvdGFsOiAndHJ1ZScKICAgICAgICB9OwogICAgICB9CiAgICAgIHZhciBwYWdlQmVhbiA9IHsKICAgICAgICBwYWdlQmVhbjogdGhpcy5wYWdpbmF0aW9uCiAgICAgIH07CiAgICAgIGlmIChyZXNldFBhZ2ludGlvbikgewogICAgICAgIHBhZ2VCZWFuLnBhZ2VCZWFuID0gewogICAgICAgICAgcGFnZTogJzEnLAogICAgICAgICAgcGFnZVNpemU6ICcxMCcsCiAgICAgICAgICBzaG93VG90YWw6ICd0cnVlJwogICAgICAgIH07CiAgICAgIH0KICAgICAgLy/nlKjmiLfovpPlhaXnmoQKICAgICAgaWYgKHRoaXMucXVlcnlQYXJhbXMubGVuZ3RoICE9IDAgJiYgdGhpcy5xdWVyeVBhcmFtc1swXSAhPSAnJykgewogICAgICAgIHRoaXMuY29uZGl0aW9uQmluZC5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtLCBpbmRleCkgewogICAgICAgICAgcXVlcnlzLnB1c2goewogICAgICAgICAgICBwcm9wZXJ0eTogaXRlbS5maWVsZCwKICAgICAgICAgICAgdmFsdWU6IF90aGlzNC5xdWVyeVBhcmFtc1tpdGVtLmZpZWxkXSwKICAgICAgICAgICAgZ3JvdXA6ICdtYWluJywKICAgICAgICAgICAgb3BlcmF0aW9uOiAnTElLRScsCiAgICAgICAgICAgIHJlbGF0aW9uOiAnQU5EJwogICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgLy/lj4LmlbDkvKDlhaXnmoTmn6Xor6Lmi7zmjqUKICAgICAgaWYgKHRoaXMucGFyYW0pIHsKICAgICAgICB2YXIgcEluc3QgPSB1dGlscy5nZXRPbmxpbmVGb3JtSW5zdGFuY2UodGhpcyk7CiAgICAgICAgdGhpcy5wYXJhbS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICBxdWVyeXMucHVzaCh7CiAgICAgICAgICAgIHByb3BlcnR5OiBpdGVtLmZpZWxkLAogICAgICAgICAgICB2YWx1ZTogdXRpbHMuZ2V0VmFsdWVCeVBhdGgocEluc3QsIGl0ZW0uYmluZCksCiAgICAgICAgICAgIGdyb3VwOiAnbWFpbicsCiAgICAgICAgICAgIG9wZXJhdGlvbjogJ0xJS0UnLAogICAgICAgICAgICByZWxhdGlvbjogJ0FORCcKICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIC8v5p2l6Ieq57uE5ZCI5a+56K+d5qGG55qECiAgICAgIGlmICh0aGlzLmNvbWJpbmF0aW9uVHJlZVF1ZXJ5cyAmJiB0aGlzLmNvbWJpbmF0aW9uVHJlZVF1ZXJ5cy5sZW5ndGggIT0gMCkgewogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jb21iaW5hdGlvblRyZWVRdWVyeXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHF1ZXJ5cy5wdXNoKHRoaXMuY29tYmluYXRpb25UcmVlUXVlcnlzW2ldKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHF1ZXJ5cy5sZW5ndGggPiAwKSB7CiAgICAgICAgcXVlcnlGaWx0ZXIgPSB0aGlzLmhhbmRsZVBvc3REYXRhKHsKICAgICAgICAgIHBhZ2VCZWFuOiBwYWdlQmVhbi5wYWdlQmVhbiwKICAgICAgICAgIHF1ZXJ5czogcXVlcnlzCiAgICAgICAgfSk7CiAgICAgICAgdGhpcy5jdXN0b21EaWFsb2cucGFnZUJlYW4gPSBxdWVyeUZpbHRlcjsKICAgICAgICB0aGlzLiRzdG9yZS5kaXNwYXRjaCgnZGlhbG9nL2dldGxpc3RKc29uJywgdGhpcy5jdXN0b21EaWFsb2cpLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgX3RoaXM0LmNoZWNrTGlzdCgpOwogICAgICAgIH0pOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuY3VzdG9tRGlhbG9nLnBhZ2VCZWFuID0gcGFnZUJlYW47CiAgICAgICAgdGhpcy4kc3RvcmUuZGlzcGF0Y2goJ2RpYWxvZy9nZXRsaXN0SnNvbicsIHRoaXMuY3VzdG9tRGlhbG9nKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgIF90aGlzNC5jaGVja0xpc3QoKTsKICAgICAgICB9KTsKICAgICAgfQogICAgfSwKICAgIC8vIOWkhOeQhlBPU1Tor7fmsYLml7bnmoTlj4LmlbAKICAgIGhhbmRsZVBvc3REYXRhOiBmdW5jdGlvbiBoYW5kbGVQb3N0RGF0YShxdWVyeUZpbHRlcikgewogICAgICBpZiAoIXRoaXMuY3VzdG9tRGlhbG9nLmRhdGFQYXJhbSB8fCB0aGlzLmN1c3RvbURpYWxvZy5kYXRhUGFyYW0uY29uc3RydWN0b3IgIT0gU3RyaW5nKSB7CiAgICAgICAgcmV0dXJuIHF1ZXJ5RmlsdGVyOwogICAgICB9CiAgICAgIC8vIOaehOW7uuS4iuS4i+aWh+aVsOaNruWvueixoQogICAgICB2YXIgY3R4ID0ge307CiAgICAgIHF1ZXJ5RmlsdGVyICYmIHF1ZXJ5RmlsdGVyLnF1ZXJ5cy5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50KSB7CiAgICAgICAgY3R4W2VsZW1lbnQucHJvcGVydHldID0gZWxlbWVudC52YWx1ZTsKICAgICAgfSk7CiAgICAgIHZhciBleHAgPSBob3RlbnRVaVV0aWxzLnBhcnNlRXhwKHRoaXMuY3VzdG9tRGlhbG9nLmRhdGFQYXJhbSwgY3R4KTsKICAgICAgdHJ5IHsKICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShleHApOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgQ3VzdG9tUXVlcnkuX3Rocm93RXhjZXB0aW9uKCJQT1NUXHU1M0MyXHU2NTcwXHU0RTBEXHU2NjJGXHU2NzA5XHU2NTQ4XHU3Njg0SlNPTlx1NjgzQ1x1NUYwRiIuY29uY2F0KHF1ZXJ5LmRhdGFQYXJhbSkpOwogICAgICB9CiAgICB9LAogICAgZG9RdWVyeTogZnVuY3Rpb24gZG9RdWVyeShwYXJhbSkgewogICAgICB2YXIgX3RoaXM1ID0gdGhpczsKICAgICAgcmV0dXJuIF9hc3luY1RvR2VuZXJhdG9yKC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlKCkgewogICAgICAgIHZhciBwYXJhbUxvYWREYXRhLCBwSW5zdCwgaSwgYmluZFZhbCwgb2JqLCBxdWVyeVVybCwgcmVxdWVzdE1ldGhvZDsKICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHsKICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7CiAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICBwYXJhbUxvYWREYXRhID0gW107CiAgICAgICAgICAgICAgcEluc3QgPSB1dGlscy5nZXRPbmxpbmVGb3JtSW5zdGFuY2UoX3RoaXM1KTsgLy/ojrflj5blhbPogZTmn6Xor6Lnu5HlrprnmoTooajljZXlj4LmlbAKICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGFyYW0uY29uZGl0aW9uZmllbGQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGlmIChwYXJhbS5jb25kaXRpb25maWVsZFtpXS5maWVsZFBhdGggIT0gJycpIHsKICAgICAgICAgICAgICAgICAgYmluZFZhbCA9IHV0aWxzLmdldFZhbHVlQnlQYXRoKHBJbnN0LCBwYXJhbS5jb25kaXRpb25maWVsZFtpXS5maWVsZFBhdGgsIG51bGwpOwogICAgICAgICAgICAgICAgICBvYmogPSB7CiAgICAgICAgICAgICAgICAgICAga2V5OiBwYXJhbS5jb25kaXRpb25maWVsZFtpXS5maWVsZCwKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogYmluZFZhbAogICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICBwYXJhbUxvYWREYXRhLnB1c2gob2JqKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcXVlcnlVcmwgPSBwYXJhbS5kc1R5cGUgPT0gJ2RhdGFTb3VyY2UnID8gJyR7Zm9ybX0vZm9ybS9jdXN0b21RdWVyeS92MS9kb1F1ZXJ5P2FsaWFzPScgKyBwYXJhbS5hbGlhcyArICcmcGFnZT0xJyA6IHBhcmFtLnVybDsKICAgICAgICAgICAgICByZXF1ZXN0TWV0aG9kID0gJ1BPU1QnOyAvL+WmguaenOWFs+iBlOaVsOaNruWIl+ihqOafpeivouaVsOaNruS4jeaYr+aVsOaNrua6kOWImeivt+axguaWueazleS4unJlc3RmdWzphY3nva7nmoTor7fmsYLmlrnlvI8KICAgICAgICAgICAgICBpZiAocGFyYW0uZHNUeXBlICE9ICdkYXRhU291cmNlJykgewogICAgICAgICAgICAgICAgcmVxdWVzdE1ldGhvZCA9IHBhcmFtLnJlcXVlc3RUeXBlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAvL+afpeivouaVsOaNrgogICAgICAgICAgICAgIHJlcS5yZXF1ZXN0KHsKICAgICAgICAgICAgICAgIHVybDogcXVlcnlVcmwsCiAgICAgICAgICAgICAgICBtZXRob2Q6IHJlcXVlc3RNZXRob2QsCiAgICAgICAgICAgICAgICBkYXRhOiBwYXJhbUxvYWREYXRhCiAgICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAocmVzKSB7CiAgICAgICAgICAgICAgICAvL+WIpOaWreaYr+WQpuacieWFs+iBlOafpeivouaVsOaNrui/lOWbngogICAgICAgICAgICAgICAgaWYgKHJlcy5kYXRhLnJvd3MubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAvL+iOt+WPluWFs+iBlOafpeivoui/lOWbnueahOihqOWNleWPguaVsAogICAgICAgICAgICAgICAgICBmb3IgKHZhciBpbyA9IDA7IGlvIDwgcGFyYW0ucmVzdWx0ZmllbGQubGVuZ3RoOyBpbysrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtLnJlc3VsdGZpZWxkW2lvXS5maWVsZFBhdGggIT0gJycpIHsKICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWwgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcmVzLmRhdGEucm93cy5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzLmRhdGEucm93c1tqXVtwYXJhbS5yZXN1bHRmaWVsZFtpb10uZmllbGRdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gdmFsICsgcmVzLmRhdGEucm93c1tqXVtwYXJhbS5yZXN1bHRmaWVsZFtpb10uZmllbGRdICsgJywnOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB2YWwgPSB2YWwuc3Vic3RyaW5nKDAsIHZhbC5sZW5ndGggLSAxKTsKICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXRoQXJyID0gcGFyYW0ucmVzdWx0ZmllbGRbaW9dLmZpZWxkUGF0aC5zcGxpdCgnLicpOwogICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGhBcnIubGVuZ3RoID09IDMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy/kuLvooagKICAgICAgICAgICAgICAgICAgICAgICAgdXRpbHMuc2V0VmFsdWVCeVBhdGgocEluc3QsIHBhcmFtLnJlc3VsdGZpZWxkW2lvXS5maWVsZFBhdGgsIHZhbCwgbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhdGhBcnIubGVuZ3RoID09IDQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy/lrZDooagKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN1YkRhdGEgPSBwSW5zdC5kYXRhW3BhdGhBcnJbMV1dW3BhdGhBcnJbMl1dOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ViRGF0YS5sZW5ndGggPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIC8v5a2Q6KGo5rKh5pWw5o2u55qE5oOF5Ya1CiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN1YlRhYk5hbWUgPSBwYXRoQXJyWzJdLnJlcGxhY2UoJ3N1Yl8nLCAnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgLy/lvpfliLDlrZDooajnmoTmiYDmnInlrZfmrrUKICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3ViSW5pdERhdGEgPSBwSW5zdC5kYXRhW3BhdGhBcnJbMV1dLmluaXREYXRhW3N1YlRhYk5hbWVdIHx8IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgIC8v5oqK5pWw57uE6YeM6Z2i55qE5YC85Li6IG51bGwg6L2s5o2i5Li656m65a2X56ym5LiyCiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0ciA9IEpTT04uc3RyaW5naWZ5KHN1YkluaXREYXRhKS5yZXBsYWNlKC9udWxsL2csICciIicpOwogICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfc3ViRGF0YSA9IEpTT04ucGFyc2Uoc3RyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gX3N1YkRhdGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v54K55re75Yqg5pe25Yik5pat6KaB5paw5aKe5a2Q6KGo6K6w5b2V5Lit55qE5a2Z6KGo5piv5ZCm5pyJ5YC8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5LmluZGV4T2YoJ3N1Yl8nKSA9PSAwICYmIF9zdWJEYXRhW2tleV0ubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc3ViRGF0YVtrZXldID0gW107IC8v5pyJ5YiZ5riF56m6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL+eCuea3u+WKoOaXtuWIpOaWreimgeaWsOWinuWtkOihqOiusOW9leS4reeahOWtl+auteaYr+WQpuacieWAvAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9zdWJEYXRhW2tleV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3N1YkRhdGFba2V5XSA9ICcnOyAvL+acieWImea4heepugogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAvL+aWsOWinuS4gOadoeaVsOaNrgogICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0LmRhdGFbcGF0aEFyclsxXV1bcGF0aEFyclsyXV0ucHVzaChfc3ViRGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgLy/lr7nor53moYblhbPogZTmn6Xor6Lov5Tlm57nmoTlgLzotYvlgLznu5nnu5HlrprnmoTlrZfmrrUKICAgICAgICAgICAgICAgICAgICAgICAgICB1dGlscy5zZXRWYWx1ZUJ5UGF0aChwSW5zdCwgcGFyYW0ucmVzdWx0ZmllbGRbaW9dLmZpZWxkUGF0aCwgdmFsLCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAvL+WtkOihqOacieaVsOaNrueahOaDheWGtQogICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHAgPSAwOyBwIDwgc3ViRGF0YS5sZW5ndGg7IHArKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy/lr7nor53moYblhbPogZTmn6Xor6Lov5Tlm57nmoTlgLzotYvlgLznu5nnu5HlrprnmoTlrZfmrrUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWxzLnNldFZhbHVlQnlQYXRoKHBJbnN0LCBwYXJhbS5yZXN1bHRmaWVsZFtpb10uZmllbGRQYXRoLCB2YWwsIHApOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgLy/msqHmnInov5Tlm57nmoTlgLzliJnmuIXnqboKICAgICAgICAgICAgICAgICAgLy/ojrflj5blhbPogZTmn6Xor6Lov5Tlm57nmoTooajljZXlj4LmlbAKICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaW9wID0gMDsgaW9wIDwgcGFyYW0ucmVzdWx0ZmllbGQubGVuZ3RoOyBpb3ArKykgewogICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbS5yZXN1bHRmaWVsZFtpb3BdLmZpZWxkUGF0aCAhPSAnJykgewogICAgICAgICAgICAgICAgICAgICAgdmFyIF9wYXRoQXJyID0gcGFyYW0ucmVzdWx0ZmllbGRbaW9wXS5maWVsZFBhdGguc3BsaXQoJy4nKTsKICAgICAgICAgICAgICAgICAgICAgIGlmIChfcGF0aEFyci5sZW5ndGggPT0gMykgewogICAgICAgICAgICAgICAgICAgICAgICAvL+S4u+ihqAogICAgICAgICAgICAgICAgICAgICAgICAvL+i1i+WAvOe7mee7keWumueahOWtl+autQogICAgICAgICAgICAgICAgICAgICAgICB1dGlscy5zZXRWYWx1ZUJ5UGF0aChwSW5zdCwgcGFyYW0ucmVzdWx0ZmllbGRbaW9wXS5maWVsZFBhdGgsICcnLCBudWxsKTsKICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoX3BhdGhBcnIubGVuZ3RoID09IDQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy/lrZDooagKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9zdWJEYXRhMiA9IHBJbnN0LmRhdGFbX3BhdGhBcnJbMV1dW19wYXRoQXJyWzJdXTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgX3AgPSAwOyBfcCA8IF9zdWJEYXRhMi5sZW5ndGg7IF9wKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAvL+WvueivneahhuWFs+iBlOafpeivoui/lOWbnueahOWAvOi1i+WAvOe7mee7keWumueahOWtl+autQogICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWxzLnNldFZhbHVlQnlQYXRoKHBJbnN0LCBwYXJhbS5yZXN1bHRmaWVsZFtpb3BdLmZpZWxkUGF0aCwgJycsIF9wKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICBjYXNlIDc6CiAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTsKICAgICAgICAgIH0KICAgICAgICB9LCBfY2FsbGVlKTsKICAgICAgfSkpKCk7CiAgICB9LAogICAgLy8g5ZCM5q2l6YCJ5oup57uT5p6cCiAgICBzeW5jSW5wdXRWYWx1ZTogZnVuY3Rpb24gc3luY0lucHV0VmFsdWUoKSB7CiAgICAgIHZhciBfdGhpczYgPSB0aGlzOwogICAgICB2YXIgdGhpc0luZGV4ID0gbnVsbDsgLy/lvZPliY3mlbDmja7miYDlnKjkuIvmoIcKICAgICAgdmFyIHBhcmVudEluZGV4ID0gbnVsbDsgLy/niLboioLngrnmiYDlnKjkuIvmoIcKICAgICAgaWYgKHRoaXMuJGVsKSB7CiAgICAgICAgdGhpc0luZGV4ID0gdXRpbHMuZ2V0U29tZUF0dHJpYnV0ZUZyb21QYXJlbnRFbGVtZW50KHRoaXMuJGVsLCAnZGF0YS1pbmRleCcpOwogICAgICAgIHBhcmVudEluZGV4ID0gdXRpbHMuZ2V0U29tZUF0dHJpYnV0ZUZyb21QYXJlbnRFbGVtZW50KHRoaXMuJHBhcmVudC4kZWwsICdkYXRhLWluZGV4Jyk7CiAgICAgIH0KICAgICAgdmFyIHJldHVyblN0ciA9IEpTT04ucGFyc2UodGhpcy5jdXN0b21EaWFsb2cucmVzdWx0ZmllbGQpOwogICAgICAvL+aLv+WIsOi/lOWbnueahOWtl+autQogICAgICB2YXIgZmllbGQgPSBuZXcgQXJyYXkoW3JldHVyblN0ci5sZW5ndGhdKTsKICAgICAgdmFyIGNvbW1lbnQgPSBuZXcgQXJyYXkoW3JldHVyblN0ci5sZW5ndGhdKTsKICAgICAgdmFyIHN0ciA9IFtdOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJldHVyblN0ci5sZW5ndGg7IGkrKykgewogICAgICAgIGZpZWxkW2ldID0gdGhpcy5jdXN0b21EaWFsb2cuZHNUeXBlID09ICdkYXRhU291cmNlJyA/IHJldHVyblN0cltpXS5maWVsZC50b0xvd2VyQ2FzZSgpIDogcmV0dXJuU3RyW2ldLmZpZWxkOwogICAgICAgIGNvbW1lbnRbaV0gPSB0aGlzLmN1c3RvbURpYWxvZy5kc1R5cGUgPT0gJ2RhdGFTb3VyY2UnID8gcmV0dXJuU3RyW2ldLmNvbW1lbnQudG9Mb3dlckNhc2UoKSA6IHJldHVyblN0cltpXS5jb21tZW50OwogICAgICB9CiAgICAgIHZhciB0aGlzXyA9IHRoaXM7CiAgICAgIHZhciBzID0gdGhpcy5zZWxlY3RPcmdzOwogICAgICB0aGlzLnNob3dEYXRhID0gX3RvQ29uc3VtYWJsZUFycmF5KHRoaXMuc2VsZWN0T3Jncyk7CiAgICAgIHRoaXMuY2hlY2tCb3hEYXRhQWxsID0gX3RvQ29uc3VtYWJsZUFycmF5KHRoaXMuc2VsZWN0T3Jncyk7CiAgICAgIGlmICh0aGlzLmN1c3RvbURpYWxvZy5zZWxlY3ROdW0gPT09IDEpIHsKICAgICAgICBzID0gdGhpcy5zZWxlY3RPcmdzOwogICAgICB9CiAgICAgIGlmICh0aGlzLmN1c3RvbURpYWxvZy5zZWxlY3ROdW0gPT09IDEpIHsKICAgICAgICB2YXIgdGVtcCA9ICcnOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29tbWVudC5sZW5ndGg7IGkrKykgewogICAgICAgICAgdmFyIHNGaWVsZCA9IHNbMF1bZmllbGRbaV1dID09PSB1bmRlZmluZWQgPyAnJyA6IHNbMF1bZmllbGRbaV1dOwogICAgICAgICAgdmFyIGVuY29kZVN0ciA9IGVuY29kZVVSSUNvbXBvbmVudChzRmllbGQpOwogICAgICAgICAgdGVtcCArPSAnIicgKyBjb21tZW50W2ldICsgJyI6IicgKyBlbmNvZGVTdHIgKyAnIiwnOwogICAgICAgIH0KICAgICAgICBpZiAodGVtcCAhPSAnJykgewogICAgICAgICAgdGVtcCA9ICd7JyArIHRlbXAuc3Vic3RyaW5nKDAsIHRlbXAubGVuZ3RoIC0gMSkgKyAnfSc7CiAgICAgICAgfQogICAgICAgIHN0ci5wdXNoKHV0aWxzLnBhcnNlVG9Kc29uKHRlbXApKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHZhciB0ZW1wID0gJyc7CiAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNvbW1lbnQubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgdmFyIF9lbmNvZGVTdHIgPSBlbmNvZGVVUklDb21wb25lbnQoc1tpXVtmaWVsZFtqXV0pOwogICAgICAgICAgICB0ZW1wICs9ICciJyArIGNvbW1lbnRbal0gKyAnIjoiJyArIF9lbmNvZGVTdHIgKyAnIiwnOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHRlbXAgIT0gJycpIHsKICAgICAgICAgICAgdGVtcCA9ICd7JyArIHRlbXAuc3Vic3RyaW5nKDAsIHRlbXAubGVuZ3RoIC0gMSkgKyAnfSc7CiAgICAgICAgICB9CiAgICAgICAgICBzdHIucHVzaCh1dGlscy5wYXJzZVRvSnNvbih0ZW1wKSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIHRoaXMuJGVtaXQoImlucHV0IiwgSlNPTi5zdHJpbmdpZnkoc3RyKSk7CiAgICAgIHZhciBwSW5zdCA9IHV0aWxzLmdldE9ubGluZUZvcm1JbnN0YW5jZSh0aGlzKTsKICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgdGhpcy5jdXN0ZGlhbG9nLmN1c3REaWFsb2cubWFwcGluZ0NvbmYuZm9yRWFjaChmdW5jdGlvbiAoY29uKSB7CiAgICAgICAgdmFyIHZhbCA9ICcnOwogICAgICAgIHZhciBmcm9tID0gJyc7CiAgICAgICAgaWYgKF90aGlzLmN1c3RvbURpYWxvZy5kc1R5cGUgPT0gJ3Jlc3RmdWwnKSB7CiAgICAgICAgICBmcm9tID0gY29uLmZyb207CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGZyb20gPSBjb24uZnJvbS50b0xvd2VyQ2FzZSgpOwogICAgICAgIH0KICAgICAgICBzdHIuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkgewogICAgICAgICAgdmFsICs9IGRlY29kZVVSSUNvbXBvbmVudChpdGVtW2Zyb21dKSArICcsJzsKICAgICAgICB9KTsKICAgICAgICBpZiAoX3RoaXM2LmF0dGVyID09ICdkYXRhLicgKyBjb25bJ3RhcmdldCddWzBdKSB7CiAgICAgICAgICB2YWwgPSB2YWwuc3Vic3RyaW5nKDAsIHZhbC5sZW5ndGggLSAxKTsKICAgICAgICAgIHV0aWxzLnNldFZhbHVlQnlQYXRoKHBJbnN0LCAnZGF0YS4nICsgY29uWyd0YXJnZXQnXVswXSwgdmFsLCB0aGlzSW5kZXgpOwogICAgICAgIH0gZWxzZSBpZiAoX3RoaXM2LmF0dGVyID09ICdzZWFyY2hGb3JtLicgKyBjb25bJ3RhcmdldCddWzBdKSB7CiAgICAgICAgICB1dGlscy5zZXRWYWx1ZUJ5UGF0aChwSW5zdCwgJ3NlYXJjaEZvcm0uJyArIGNvblsndGFyZ2V0J11bMF0sIHZhbC5zdWJzdHJpbmcoMCwgdmFsLmxlbmd0aCAtIDEpLCB0aGlzSW5kZXgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB2YXIgY29uZmlnQXR0ciA9IGNvblsndGFyZ2V0J11bMF0uc3BsaXQoJy4nKTsKICAgICAgICAgIHZhciBwYXRoID0gY29uWyd0YXJnZXQnXVswXTsKICAgICAgICAgIGlmIChjb25maWdBdHRyLmxlbmd0aCA9PSA0ICYmIHBhcmVudEluZGV4ID49IDApIHsKICAgICAgICAgICAgLy/lrZnooajmlbDmja7otYvlgLwKICAgICAgICAgICAgcGF0aCA9IGNvbmZpZ0F0dHJbMF0gKyAnLicgKyBjb25maWdBdHRyWzFdICsgJ1snICsgcGFyZW50SW5kZXggKyAnXS4nICsgY29uZmlnQXR0clsyXSArICcuJyArIGNvbmZpZ0F0dHJbM107CiAgICAgICAgICB9CiAgICAgICAgICBpZiAocEluc3QuZGF0YSkgewogICAgICAgICAgICB1dGlscy5zZXRWYWx1ZUJ5UGF0aChwSW5zdCwgJ2RhdGEuJyArIHBhdGgsIHZhbC5zdWJzdHJpbmcoMCwgdmFsLmxlbmd0aCAtIDEpLCB0aGlzSW5kZXgpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdXRpbHMuc2V0VmFsdWVCeVBhdGgocEluc3QsICdtb2RlbC4nICsgcGF0aCwgdmFsLnN1YnN0cmluZygwLCB2YWwubGVuZ3RoIC0gMSksIHRoaXNJbmRleCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KTsKICAgICAgLy/liKTmlq3lr7nor53moYbmmK/lkKbnu5HlrprkuoblhbPogZTmn6Xor6IKICAgICAgdmFyIGN1c3RRdWVyeUpzb24gPSB0aGlzLmN1c3RkaWFsb2cuY3VzdERpYWxvZy5jdXN0UXVlcnlKc29uOwogICAgICBpZiAoY3VzdFF1ZXJ5SnNvbi5sZW5ndGggPiAwKSB7CiAgICAgICAgZm9yICh2YXIgX2k0ID0gMDsgX2k0IDwgY3VzdFF1ZXJ5SnNvbi5sZW5ndGg7IF9pNCsrKSB7CiAgICAgICAgICBpZiAoY3VzdFF1ZXJ5SnNvbltfaTRdLmNvbmRpdGlvbmZpZWxkLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgdGhpcy5kb1F1ZXJ5KGN1c3RRdWVyeUpzb25bX2k0XSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbJyArIGN1c3RRdWVyeUpzb25bX2k0XS5jb21tZW50ICsgJ13lhbPogZTmn6Xor6Llj5blgLzlj4LmlbDmnKrnu5HlrprooajljZXlrZfmrrUnKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAvL+WPlua2iOaMiemSrgogICAgZGlhbG9nQ2FuY2VsOiBmdW5jdGlvbiBkaWFsb2dDYW5jZWwoKSB7CiAgICAgIHZhciBfdGhpczcgPSB0aGlzOwogICAgICB2YXIgdGhpc18gPSB0aGlzOwogICAgICB0aGlzXy5xdWVyeVBhcmFtID0gJyc7CiAgICAgIHRoaXNfLiRzdG9yZS5kaXNwYXRjaCgnZGlhbG9nL3NldERpYWxvZ0RhdGEnLCBbXSkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgdGhpc18uY3VzdG9tRGlhbG9nU2hvd0xpc3QgPSBmYWxzZTsKICAgICAgICAvL+WIpOaWreaYr+WQpuaYr+eCueWHu+S6huehruiupOWGjeeCueWHu+WPlua2iOeahCAgaW5wdXRWYWzmsqHmnInlgLzliJnooajnpLrnm7TmjqXngrnlh7vnmoTlj5bmtogKICAgICAgICBpZiAoIXRoaXNfLmlucHV0VmFsKSB7CiAgICAgICAgICB0aGlzXy5zZWxlY3RPcmdzID0gW107CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXNfLnNlbGVjdE9yZ3MgPSBfdG9Db25zdW1hYmxlQXJyYXkodGhpc18uc2hvd0RhdGEpOwogICAgICAgICAgX3RoaXM3LmNoZWNrQm94RGF0YUFsbCA9IF90b0NvbnN1bWFibGVBcnJheSh0aGlzXy5zZWxlY3RPcmdzKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSwKICAgIGRpYWxvZ1RyZWVDb25maXJtOiBmdW5jdGlvbiBkaWFsb2dUcmVlQ29uZmlybSgpIHsKICAgICAgdmFyIF90aGlzOCA9IHRoaXM7CiAgICAgIHRoaXMuY2FsYWNJbnB1dFN1ZmZpeEhlaWdodCgpOwogICAgICB2YXIgdGhpc0luZGV4ID0gbnVsbDsgLy/lvZPliY3mlbDmja7miYDlnKjkuIvmoIcKICAgICAgdmFyIHBhcmVudEluZGV4ID0gbnVsbDsgLy/niLboioLngrnmiYDlnKjkuIvmoIcKICAgICAgaWYgKHRoaXMuJGVsKSB7CiAgICAgICAgdGhpc0luZGV4ID0gdXRpbHMuZ2V0U29tZUF0dHJpYnV0ZUZyb21QYXJlbnRFbGVtZW50KHRoaXMuJGVsLCAnZGF0YS1pbmRleCcpOwogICAgICAgIHBhcmVudEluZGV4ID0gdXRpbHMuZ2V0U29tZUF0dHJpYnV0ZUZyb21QYXJlbnRFbGVtZW50KHRoaXMuJHBhcmVudC4kZWwsICdkYXRhLWluZGV4Jyk7CiAgICAgIH0KICAgICAgdGhpcy4kc3RvcmUuZGlzcGF0Y2goJ2RpYWxvZy9zZXREaWFsb2dEYXRhJywgW10pOwogICAgICB2YXIgcmV0dXJuU3RyID0gSlNPTi5wYXJzZSh0aGlzLmN1c3RvbURpYWxvZy5yZXN1bHRmaWVsZCk7CiAgICAgIHZhciBmaWVsZCA9IG5ldyBBcnJheShbcmV0dXJuU3RyLmxlbmd0aF0pOwogICAgICB2YXIgY29tbWVudCA9IG5ldyBBcnJheShbcmV0dXJuU3RyLmxlbmd0aF0pOwogICAgICB2YXIgc3RyID0gW107CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmV0dXJuU3RyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgZmllbGRbaV0gPSByZXR1cm5TdHJbaV0uZmllbGQ7CiAgICAgICAgY29tbWVudFtpXSA9IHJldHVyblN0cltpXS5jb21tZW50OwogICAgICB9CiAgICAgIGlmICh0aGlzLmN1c3RvbURpYWxvZy5zZWxlY3ROdW0gPT09IDEpIHsKICAgICAgICB2YXIgbm9kZXMgPSB0aGlzLnByb3BzRGF0YVswXTsKICAgICAgICB2YXIgdGVtcCA9ICcnOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29tbWVudC5sZW5ndGg7IGkrKykgewogICAgICAgICAgdGVtcCArPSAnIicgKyBjb21tZW50W2ldICsgJyI6IicgKyBub2Rlc1tmaWVsZFtpXV0gKyAnIiwnOwogICAgICAgIH0KICAgICAgICBpZiAodGVtcCAhPSAnJykgewogICAgICAgICAgdGVtcCA9ICd7JyArIHRlbXAuc3Vic3RyaW5nKDAsIHRlbXAubGVuZ3RoIC0gMSkgKyAnfSc7CiAgICAgICAgfQogICAgICAgIHN0ci5wdXNoKHV0aWxzLnBhcnNlVG9Kc29uKHRlbXApKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB2YXIgbm9kZXMgPSB0aGlzLnByb3BzRGF0YTsKICAgICAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtLCBrKSB7CiAgICAgICAgICB2YXIgdGVtcCA9ICcnOwogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb21tZW50Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHRlbXAgKz0gJyInICsgY29tbWVudFtpXSArICciOiInICsgbm9kZXNbZmllbGRbaV1dICsgJyIsJzsKICAgICAgICAgICAgdGVtcCArPSAnIicgKyBjb21tZW50W2ldICsgJyI6IicgKyBub2Rlc1trXVtmaWVsZFtpXV0gKyAnIiwnOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHRlbXAgIT0gJycpIHsKICAgICAgICAgICAgdGVtcCA9ICd7JyArIHRlbXAuc3Vic3RyaW5nKDAsIHRlbXAubGVuZ3RoIC0gMSkgKyAnfSc7CiAgICAgICAgICB9CiAgICAgICAgICBzdHIucHVzaCh1dGlscy5wYXJzZVRvSnNvbih0ZW1wKSk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgdmFyIHBJbnN0ID0gdXRpbHMuZ2V0T25saW5lRm9ybUluc3RhbmNlKHRoaXMpOwogICAgICB0aGlzLmN1c3RkaWFsb2cuY3VzdERpYWxvZy5tYXBwaW5nQ29uZi5mb3JFYWNoKGZ1bmN0aW9uIChjb24pIHsKICAgICAgICB2YXIgdmFsID0gJyc7CiAgICAgICAgc3RyLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICAgIHZhbCArPSBpdGVtW2Nvbi5mcm9tXSArICcsJzsKICAgICAgICB9KTsKICAgICAgICBpZiAoX3RoaXM4LmF0dGVyID09ICdkYXRhLicgKyBjb25bJ3RhcmdldCddWzBdKSB7CiAgICAgICAgICB1dGlscy5zZXRWYWx1ZUJ5UGF0aChwSW5zdCwgJ2RhdGEuJyArIGNvblsndGFyZ2V0J11bMF0sIHZhbC5zdWJzdHJpbmcoMCwgdmFsLmxlbmd0aCAtIDEpLCB0aGlzSW5kZXgpOwogICAgICAgIH0gZWxzZSBpZiAoX3RoaXM4LmF0dGVyID09ICdzZWFyY2hGb3JtLicgKyBjb25bJ3RhcmdldCddWzBdKSB7CiAgICAgICAgICB1dGlscy5zZXRWYWx1ZUJ5UGF0aChwSW5zdCwgJ3NlYXJjaEZvcm0uJyArIGNvblsndGFyZ2V0J11bMF0sIHZhbC5zdWJzdHJpbmcoMCwgdmFsLmxlbmd0aCAtIDEpLCB0aGlzSW5kZXgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB2YXIgY29uZmlnQXR0ciA9IGNvblsndGFyZ2V0J11bMF0uc3BsaXQoJy4nKTsKICAgICAgICAgIHZhciBwYXRoID0gY29uWyd0YXJnZXQnXVswXTsKICAgICAgICAgIGlmIChjb25maWdBdHRyLmxlbmd0aCA9PSA0ICYmIHBhcmVudEluZGV4ID49IDApIHsKICAgICAgICAgICAgLy/lrZnooajmlbDmja7otYvlgLwKICAgICAgICAgICAgcGF0aCA9IGNvbmZpZ0F0dHJbMF0gKyAnLicgKyBjb25maWdBdHRyWzFdICsgJ1snICsgcGFyZW50SW5kZXggKyAnXS4nICsgY29uZmlnQXR0clsyXSArICcuJyArIGNvbmZpZ0F0dHJbM107CiAgICAgICAgICB9CiAgICAgICAgICBpZiAocEluc3QuZGF0YSkgewogICAgICAgICAgICB1dGlscy5zZXRWYWx1ZUJ5UGF0aChwSW5zdCwgJ2RhdGEuJyArIHBhdGgsIHZhbC5zdWJzdHJpbmcoMCwgdmFsLmxlbmd0aCAtIDEpLCB0aGlzSW5kZXgpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdXRpbHMuc2V0VmFsdWVCeVBhdGgocEluc3QsICdtb2RlbC4nICsgcGF0aCwgdmFsLnN1YnN0cmluZygwLCB2YWwubGVuZ3RoIC0gMSksIHRoaXNJbmRleCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KTsKICAgICAgLy90aGlzLiRlbWl0KCJpbnB1dCIsIEpTT04uc3RyaW5naWZ5KHN0cikpOwogICAgICB0aGlzLnNob3dEYXRhID0gX3RvQ29uc3VtYWJsZUFycmF5KHRoaXMucHJvcHNEYXRhKTsgLy/lm57mmL7nmoTlgLwKICAgICAgdGhpcy5jdXN0b21EaWFsb2dTaG93VHJlZSA9IGZhbHNlOwogICAgfSwKICAgIGRpYWxvZ0NhbmNlbFRyZWU6IGZ1bmN0aW9uIGRpYWxvZ0NhbmNlbFRyZWUoKSB7CiAgICAgIHRoaXMuJHN0b3JlLmRpc3BhdGNoKCdkaWFsb2cvc2V0RGlhbG9nRGF0YScsIFtdKTsKICAgICAgdGhpcy5jdXN0b21EaWFsb2dTaG93VHJlZSA9IGZhbHNlOwogICAgfSwKICAgIGdldENoZWNrZWQ6IGZ1bmN0aW9uIGdldENoZWNrZWQoZGF0YSwgY2hlY2tlZCwgaW5kZXRlcm1pbmF0ZSkgewogICAgICBpZiAodGhpcy5jdXN0b21EaWFsb2cuc2VsZWN0TnVtID09PSAxKSB7CiAgICAgICAgdGhpcy5wcm9wc0RhdGEgPSBbXTsKICAgICAgICB0aGlzLnByb3BzRGF0YS5wdXNoKGRhdGEpOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMucHJvcHNEYXRhID0gdGhpcy4kcmVmcy50cmVlLmdldENoZWNrZWROb2RlcygpOwogICAgICB9CiAgICB9LAogICAgdHJlZUNsaWNrOiBmdW5jdGlvbiB0cmVlQ2xpY2soZGF0YSwgbiwgaSkgewogICAgICBpZiAodGhpcy5jdXN0b21EaWFsb2cuc2VsZWN0TnVtID09PSAxKSB7CiAgICAgICAgdGhpcy5wcm9wc0RhdGEgPSBbXTsKICAgICAgICB0aGlzLnByb3BzRGF0YS5wdXNoKGRhdGEpOwogICAgICB9CiAgICB9LAogICAgY2xlYXJBbGxTZWxlY3RPcmdzOiBmdW5jdGlvbiBjbGVhckFsbFNlbGVjdE9yZ3MoKSB7CiAgICAgIHRoaXMuc2VsZWN0T3JncyA9IG51bGw7CiAgICAgIHRoaXMuJHJlZnMub3JnVGFibGUuY2xlYXJTZWxlY3Rpb24oKTsKICAgIH0sCiAgICByZW1vdmVTZWxlY3RPcmc6IGZ1bmN0aW9uIHJlbW92ZVNlbGVjdE9yZyhpdGVtKSB7CiAgICAgIHZhciBfdGhpczkgPSB0aGlzOwogICAgICBpZiAodGhpcy5jdXN0b21EaWFsb2cuc2VsZWN0TnVtID09PSAxKSB7CiAgICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCAnJyk7CiAgICAgICAgdGhpcy5zZWxlY3RPcmdzLnNwbGljZShpdGVtLCAxKTsKICAgICAgICB0aGlzLnNob3dEYXRhLnNwbGljZShpdGVtLCAxKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLmlucHV0VmFsLnNwbGljZShpdGVtLCAxKTsKICAgICAgICAvLyBsZXQgcmVtb3ZlSWQgPSB0aGlzLnNob3dEYXRhW2l0ZW1dOwogICAgICAgIC8v5qCR5b2iCiAgICAgICAgaWYgKHRoaXMucHJvcHNEYXRhLmxlbmd0aCA+IDApIHsKICAgICAgICAgIHRoaXMucHJvcHNEYXRhLnNwbGljZShpdGVtLCAxKTsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuc2hvd0RhdGEubGVuZ3RoID4gMCkgewogICAgICAgICAgdGhpcy5zaG93RGF0YS5zcGxpY2UoaXRlbSwgMSk7CiAgICAgICAgfQogICAgICAgIC8v5YiX6KGoCiAgICAgICAgaWYgKHRoaXMuc2VsZWN0T3JncyAhPSBudWxsKSB7CiAgICAgICAgICB0aGlzLnNlbGVjdE9yZ3Muc3BsaWNlKGl0ZW0sIDEpOwogICAgICAgICAgdGhpcy5jaGVja0JveERhdGFBbGwuc3BsaWNlKGl0ZW0sIDEpOwogICAgICAgICAgdGhpcy5zZWxlY3RPcmdzLmZvckVhY2goZnVuY3Rpb24gKHJvdykgewogICAgICAgICAgICAvLyBpZihpdGVtLmlkID09cmVtb3ZlSWQgKXsKICAgICAgICAgICAgX3RoaXM5LmlzQ3VycmVudENoYW5nZSA9IHRydWU7CiAgICAgICAgICAgIF90aGlzOS50b2dnbGVSb3dTZWxlY3Rpb24ocm93LCBmYWxzZSk7CiAgICAgICAgICAgIC8vIH0KICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICB0aGlzLmNhbGFjSW5wdXRTdWZmaXhIZWlnaHQoKTsKICAgICAgICB2YXIgdmFsdWUgPSAnJzsKICAgICAgICB0aGlzLmlucHV0VmFsLmZvckVhY2goZnVuY3Rpb24gKHZhbCkgewogICAgICAgICAgdmFsdWUgKz0gdmFsLnZhbHVlICsgJywnOwogICAgICAgIH0pOwogICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPiAwKSB7CiAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZygwLCB2YWx1ZS5sZW5ndGggLSAxKTsKICAgICAgICB9CiAgICAgICAgaWYgKHZhbHVlICE9ICcnKSB7CiAgICAgICAgICB2YWx1ZSA9IHZhbHVlICsgJ3x8JyArIEpTT04uc3RyaW5naWZ5KHRoaXMuc2hvd0RhdGEpOwogICAgICAgIH0KICAgICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbHVlKTsKICAgICAgfQogICAgICB0aGlzLnN5bmNJbnB1dFZhbHVlKCk7CiAgICB9LAogICAgY2FsYWNJbnB1dFN1ZmZpeEhlaWdodDogZnVuY3Rpb24gY2FsYWNJbnB1dFN1ZmZpeEhlaWdodCgpIHsKICAgICAgdmFyIF90aGlzMTAgPSB0aGlzOwogICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAoIV90aGlzMTAuJHJlZnMudGFnU3BhbnMpIHJldHVybjsKICAgICAgICBpZiAoX3RoaXMxMC4kcmVmcy50YWdTcGFucy5vZmZzZXRIZWlnaHQpIHsKICAgICAgICAgIF90aGlzMTAuaW5wdXRTdWZmaXhIZWlnaHQgPSBfdGhpczEwLiRyZWZzLnRhZ1NwYW5zLm9mZnNldEhlaWdodCArIDU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIF90aGlzMTAuaW5wdXRTdWZmaXhIZWlnaHQgPSAzMDsKICAgICAgICB9CiAgICAgICAgLy8g6Kem5Y+R6aqM6K+BCiAgICAgICAgX3RoaXMxMC4kdmFsaWRhdG9yLnZhbGlkYXRlKCk7CiAgICAgIH0sIDApOwogICAgfSwKICAgIGN1c3RvbURpYWxvZ1Nob3c6IGZ1bmN0aW9uIGN1c3RvbURpYWxvZ1Nob3cocGFnZVBhcmFtKSB7CiAgICAgIHRoaXMuY3VzdG9tRGlhbG9nU2hvd0xpc3QgPSB0cnVlOwogICAgICB0aGlzLmN1c3RvbURpYWxvZyA9IHBhZ2VQYXJhbS5jdXN0b21EaWFsb2c7CiAgICAgIHRoaXMuY3VzdG9tRGlhbG9nLnF1ZXJ5VXJsID0gdGhpcy5jdXN0b21EaWFsb2cuZHNUeXBlID09ICdkYXRhU291cmNlJyA/ICcke2Zvcm19L2Zvcm0vY3VzdG9tRGlhbG9nL3YxL2dldExpc3REYXRhP2FsaWFzPScgKyB0aGlzLmN1c3RvbURpYWxvZy5hbGlhcyArICcmbWFwUGFyYW09JyArICh0aGlzLmN1c3RvbURpYWxvZy5tYXBQYXJhbSA/IHRoaXMuY3VzdG9tRGlhbG9nLm1hcFBhcmFtIDogJycpIDogdGhpcy5jdXN0b21EaWFsb2cudXJsOwogICAgICBpZiAodGhpcy5kaWFsb2dEYXRhLmxlbmd0aCA8IDEpIHsKICAgICAgICB0aGlzLnNlYXJjaCgpOwogICAgICAgIHRoaXMuZGlzcGxheWZpZWxkID0gSlNPTi5wYXJzZShwYWdlUGFyYW0uY3VzdG9tRGlhbG9nLmRpc3BsYXlmaWVsZCk7CiAgICAgICAgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLmRzVHlwZSA9PSAnZGF0YVNvdXJjZScpIHsKICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5kaXNwbGF5ZmllbGQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZmllbGRbaV0uZmllbGQgPSB0aGlzLmRpc3BsYXlmaWVsZFtpXS5maWVsZC50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICh0aGlzLmRpYWxvZ0RhdGEubGVuZ3RoID4gMSkgewogICAgICAgIHRoaXMuc2VhcmNoKCk7CiAgICAgIH0KICAgICAgaWYgKHRoaXMuZGlhbG9nRGF0YS5sZW5ndGggPiAwICYmIHRoaXMuZGlzcGxheWZpZWxkLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgdGhpcy5zZWFyY2goKTsKICAgICAgICB0aGlzLmRpc3BsYXlmaWVsZCA9IEpTT04ucGFyc2UocGFnZVBhcmFtLmN1c3RvbURpYWxvZy5kaXNwbGF5ZmllbGQpOwogICAgICAgIGlmICh0aGlzLmN1c3RvbURpYWxvZy5kc1R5cGUgPT0gJ2RhdGFTb3VyY2UnKSB7CiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZGlzcGxheWZpZWxkLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHRoaXMuZGlzcGxheWZpZWxkW2ldLmZpZWxkID0gdGhpcy5kaXNwbGF5ZmllbGRbaV0uZmllbGQudG9Mb3dlckNhc2UoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICBjdXN0b21EaWFsb2dUcmVlU2hvdzogZnVuY3Rpb24gY3VzdG9tRGlhbG9nVHJlZVNob3cocGFnZVBhcmFtKSB7CiAgICAgIHZhciBjdXN0b21EaWFsb2cgPSB0aGlzLmN1c3RvbURpYWxvZzsKICAgICAgdmFyIG1hcFBhcmFtT2JqID0ge307IC8v5pWw5o2u5p2l5rqQ5piv5pWw5o2u5rqQ77yM5LiU5pyJ5Yqo5oCB5Y+C5pWw5Lyg5YWl5pe26LCD55SoCiAgICAgIHZhciBtYXBQYXJhbSA9ICcnOwogICAgICB2YXIgZGVmYXVsdFBWYWx1ZSA9ICcnOyAvL+eItklE5YC8CiAgICAgIGlmICh0aGlzLmNvbmRpdGlvbmZpZWxkVHJlZS5sZW5ndGggPiAwKSB7CiAgICAgICAgZm9yICh2YXIgX2k1ID0gMDsgX2k1IDwgdGhpcy5jb25kaXRpb25maWVsZFRyZWUubGVuZ3RoOyBfaTUrKykgewogICAgICAgICAgaWYgKHRoaXMuY29uZGl0aW9uZmllbGRUcmVlW19pNV0uZGVmYXVsdFR5cGUgPT0gJzQnKSB7CiAgICAgICAgICAgIC8v5Yqo5oCB5Lyg5YWlCiAgICAgICAgICAgIC8v5b6X5Yiw6L6T5YWl55qE5p2h5Lu25a2X5q615YC8CiAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmNvbmRpdGlvbmZpZWxkVHJlZVtfaTVdLnBhcmFtVmFsOwogICAgICAgICAgICBpZiAoIXZhbCkgewogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8v5b6X5Yiw5p2h5Lu25a2X5q61S0VZCiAgICAgICAgICAgIHZhciBrZXkgPSB0aGlzLmNvbmRpdGlvbmZpZWxkVHJlZVtfaTVdLmZpZWxkOwogICAgICAgICAgICBtYXBQYXJhbU9ialtrZXldID0gdmFsOwogICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmRpdGlvbmZpZWxkVHJlZVtfaTVdLmRlZmF1bHRUeXBlID09ICcyJykgewogICAgICAgICAgICAvL+WbuuWumuWAvAogICAgICAgICAgICAvL+W+l+WIsOi+k+WFpeeahOadoeS7tuWtl+auteWAvAogICAgICAgICAgICB2YXIgX3ZhbCA9IHRoaXMuY29uZGl0aW9uZmllbGRUcmVlW19pNV0uZGVmYXVsdFZhbHVlOwogICAgICAgICAgICBpZiAoIV92YWwpIHsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvL+W+l+WIsOadoeS7tuWtl+autUtFWQogICAgICAgICAgICB2YXIgX2tleSA9IHRoaXMuY29uZGl0aW9uZmllbGRUcmVlW19pNV0uZmllbGQ7CiAgICAgICAgICAgIG1hcFBhcmFtT2JqW19rZXldID0gX3ZhbDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KG1hcFBhcmFtT2JqKSAhPSAne30nKSB7CiAgICAgICAgICAvL+iOt+WPluWvueivneahhumFjee9rueahOeItklE5a2X5q61CiAgICAgICAgICB2YXIgcGlkID0gSlNPTi5wYXJzZSh0aGlzLmN1c3RvbURpYWxvZy5kaXNwbGF5ZmllbGQpLnBpZDsKICAgICAgICAgIGZvciAodmFyIG0gaW4gbWFwUGFyYW1PYmopIHsKICAgICAgICAgICAgaWYgKHBpZCA9PSBtKSB7CiAgICAgICAgICAgICAgZGVmYXVsdFBWYWx1ZSA9IG1hcFBhcmFtT2JqW21dOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBtYXBQYXJhbSA9IEpTT04uc3RyaW5naWZ5KG1hcFBhcmFtT2JqKTsKICAgICAgICAgIG1hcFBhcmFtID0gbWFwUGFyYW0uc3Vic3RyaW5nKDEsIG1hcFBhcmFtLmxlbmd0aCAtIDEpOwogICAgICAgIH0KICAgICAgfQogICAgICB2YXIgcmVxdWVzdFR5cGUgPSBjdXN0b21EaWFsb2cuZHNUeXBlID09ICdkYXRhU291cmNlJyA/ICdHRVQnIDogY3VzdG9tRGlhbG9nLnJlcXVlc3RUeXBlID8gY3VzdG9tRGlhbG9nLnJlcXVlc3RUeXBlIDogJ1BPU1QnOwogICAgICB2YXIgdXJsID0gJyR7Zm9ybX0vZm9ybS9jdXN0b21EaWFsb2cvdjEvZ2V0VHJlZURhdGE/YWxpYXM9JyArIHBhZ2VQYXJhbS5hbGlhcyArICcmbWFwUGFyYW09JyArIG1hcFBhcmFtOwogICAgICB2YXIgcGFyYW1zT2JqID0ge307CiAgICAgIGlmIChjdXN0b21EaWFsb2cuZHNUeXBlICE9ICdkYXRhU291cmNlJykgewogICAgICAgIHVybCA9IGN1c3RvbURpYWxvZy51cmw7CiAgICAgICAgdmFyIHRlbXBsYXRlUGEgPSBjdXN0b21EaWFsb2cuZGF0YVBhcmFtOwogICAgICAgIGlmIChjdXN0b21EaWFsb2cuY29uZGl0aW9uZmllbGQpIHsKICAgICAgICAgIHZhciBjb25kaXRpb25zID0gSlNPTi5wYXJzZShjdXN0b21EaWFsb2cuY29uZGl0aW9uZmllbGQpOwogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25kaXRpb25zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHZhciBjb24gPSBjb25kaXRpb25zW2ldOwogICAgICAgICAgICBpZiAocmVxdWVzdFR5cGUgPT0gJ1BPU1QnKSB7CiAgICAgICAgICAgICAgaWYgKHRlbXBsYXRlUGEpIHsKICAgICAgICAgICAgICAgIHRlbXBsYXRlUGEgPSB0ZW1wbGF0ZVBhLnJlcGxhY2UobmV3IFJlZ0V4cCgnXFx7JyArIGNvbi5maWVsZCArICdcXH0nLCAnZycpLCBjb24uZGVmYXVsdFZhbHVlKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcGFyYW1zT2JqW2Nvbi5maWVsZF0gPSBjb24uZGVmYXVsdFZhbHVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB2YXIgbGpDaGFyID0gdXJsLmluZGV4T2YoJz8nKSA9PSAtMSA/ICc/JyA6ICcmJzsKICAgICAgICAgICAgICB1cmwgPSB1cmwgKyBsakNoYXIgKyBjb24uZmllbGQgKyAnPScgKyBjb24uZGVmYXVsdFZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodGVtcGxhdGVQYSkgewogICAgICAgICAgICBwYXJhbXNPYmogPSBKU09OLnBhcnNlKHRlbXBsYXRlUGEpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICB2YXIgcmVxdWVzdFBhcmFtcyA9IHt9OwogICAgICByZXF1ZXN0UGFyYW1zLnJlcXVlc3RUeXBlID0gcmVxdWVzdFR5cGU7CiAgICAgIHJlcXVlc3RQYXJhbXMudXJsID0gdXJsOwogICAgICByZXF1ZXN0UGFyYW1zLnBhcmFtc09iaiA9IHBhcmFtc09iajsKICAgICAgdGhpcy5zZWFyY2hUcmVlKHJlcXVlc3RQYXJhbXMsIGRlZmF1bHRQVmFsdWUpOwogICAgICB0aGlzLmN1c3RvbURpYWxvZ1Nob3dUcmVlID0gdHJ1ZTsKICAgIH0sCiAgICAvL+agkeW9ouafpeivogogICAgc2VhcmNoVHJlZTogZnVuY3Rpb24gc2VhcmNoVHJlZShyZXF1ZXN0UGFyYW1zLCBkZWZhdWx0UFZhbHVlKSB7CiAgICAgIHZhciB0aGlzXyA9IHRoaXM7CiAgICAgIHZhciBxdWVyeSA9IHJlcXVlc3RQYXJhbXMucmVxdWVzdFR5cGUgPT0gJ1BPU1QnID8gcmVxLnBvc3QocmVxdWVzdFBhcmFtcy51cmwsIHJlcXVlc3RQYXJhbXMucGFyYW1zT2JqKSA6IHJlcS5nZXQocmVxdWVzdFBhcmFtcy51cmwpOwogICAgICBxdWVyeS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgIC8v5pi+56S65a2X5q616YWN572uCiAgICAgICAgdmFyIGRpc3BsYXlmaWVsZCA9IEpTT04ucGFyc2UodGhpc18uY3VzdG9tRGlhbG9nLmRpc3BsYXlmaWVsZCk7CiAgICAgICAgdGhpc18uZGlzcGxheUZpZWxkID0gZGlzcGxheWZpZWxkOwogICAgICAgIC8v5oqK5a+56K+d5qGG6YWN572u55qE5pi+56S65a2X5q615pi+56S65ZCN56ew6LWL5YC857uZ5qCR5b2i55qE5pi+56S65YC8CiAgICAgICAgdGhpc18uZGVmYXVsdFByb3BzLmxhYmVsID0gZGlzcGxheWZpZWxkLmRpc3BsYXlOYW1lOwogICAgICAgIHRoaXNfLnRyZWVMaXN0ID0gcmVzcG9uc2UuZGF0YTsKICAgICAgICAvL+W+l+WIsOimgeWKoOi9veagkeeahOS/oeaBrwogICAgICAgIGlmIChkZWZhdWx0UFZhbHVlKSB7CiAgICAgICAgICBkaXNwbGF5ZmllbGQucHZhbHVlID0gZGVmYXVsdFBWYWx1ZTsKICAgICAgICB9CiAgICAgICAgdGhpc18ucHJvcHMxID0gdGhpc18udG9UcmVlRGF0YShyZXNwb25zZS5kYXRhLCBkaXNwbGF5ZmllbGQuaWQsIGRpc3BsYXlmaWVsZC5waWQsIGRpc3BsYXlmaWVsZC5kaXNwbGF5TmFtZSwgZGlzcGxheWZpZWxkLnB2YWx1ZSA/IGRpc3BsYXlmaWVsZC5wdmFsdWUgOiAwKTsKICAgICAgfSk7CiAgICB9LAogICAgLy/liqDovb3moJHnmoTkv6Hmga8KICAgIHRvVHJlZURhdGE6IGZ1bmN0aW9uIHRvVHJlZURhdGEoZGF0YSwgaWQsIHBpZCwgbmFtZSwgcHZhbHVlKSB7CiAgICAgIC8vIOW7uueri+S4quagkeW9oue7k+aehCzpnIDopoHlrprkuYnkuKrmnIDpobblsYLnmoTniLboioLngrnvvIxwdmFsdWXmmK8wCiAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZURhdGFUb1RyZWUoZGF0YSwgcGlkLCBpZCwgbmFtZSwgcHZhbHVlKTsKICAgIH0sCiAgICB0cmFuc2xhdGVEYXRhVG9UcmVlOiBmdW5jdGlvbiB0cmFuc2xhdGVEYXRhVG9UcmVlKGRhdGEsIHBpZCwgaWQsIG5hbWUsIHB2YWx1ZSkgewogICAgICAvL+aKiuagkeaVsOaNruacieWtkOiKgueCueeahOaVsOaNruWFqOmDqOi/h+a7pOaOie+8iOWPqueVmeeItuiKgueCueeahOaVsOaNru+8iQogICAgICB2YXIgcGFyZW50cyA9IGRhdGEuZmlsdGVyKGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgIHJldHVybiB2YWx1ZVtpZF0gPT0gdmFsdWVbcGlkXSB8fCB2YWx1ZVtwaWRdID09IG51bGwgfHwgdmFsdWVbcGlkXSA9PSBwdmFsdWU7CiAgICAgIH0pOwogICAgICBpZiAoIXBhcmVudHMpIHsKICAgICAgICBwYXJlbnRzID0gZGF0YS5maWx0ZXIoZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgICByZXR1cm4gdmFsdWVbcGlkXSAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWVbcGlkXSAhPSBudWxsICYmIHZhbHVlW2lkXSAhPSB2YWx1ZVtwaWRdOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIHJldHVybiBwYXJlbnRzOwogICAgfSwKICAgIGxvYWRUcmVlOiBmdW5jdGlvbiBsb2FkVHJlZShub2RlLCByZXNvbHZlKSB7CiAgICAgIHZhciBfdGhpczExID0gdGhpczsKICAgICAgaWYgKG5vZGUpIHsKICAgICAgICB2YXIgdGhpc18gPSB0aGlzOwogICAgICAgIHZhciBkaXNwbGF5RmllbGQgPSB0aGlzXy5jdXN0b21EaWFsb2cuc3R5bGUgPT0gMiA/IHRoaXNfLmNvbWJpVHJlZURpc3BsYXlGaWVsZCA6IHRoaXNfLmRpc3BsYXlGaWVsZDsKICAgICAgICByZXNvbHZlKHRoaXMudHJlZUxpc3QuZmlsdGVyKGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgICAgcmV0dXJuIHZhbHVlW2Rpc3BsYXlGaWVsZC5waWRdID09PSBub2RlLmRhdGFbZGlzcGxheUZpZWxkLmlkXTsKICAgICAgICB9KSk7CiAgICAgICAgaWYgKHRoaXMuc2hvd0RhdGEgJiYgdGhpcy5zaG93RGF0YS5sZW5ndGggPiAwKSB7CiAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgX3RoaXMxMS5zaG93RGF0YS5mb3JFYWNoKGZ1bmN0aW9uICh2KSB7CiAgICAgICAgICAgICAgaWYgKHYuUGlkID09IG5vZGUua2V5KSB7CiAgICAgICAgICAgICAgICB0aGlzXy4kcmVmcy50cmVlLnNldENoZWNrZWQodiwgdHJ1ZSk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXNfLmNoZWNrTm9kZSh2LCB0aGlzXyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgIH0sIDQwMCk7CiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgYWZ0ZXJPcGVuOiBmdW5jdGlvbiBhZnRlck9wZW4oKSB7CiAgICAgIC8v5omT5byA5a+56K+d5qGG5LmL5ZCO5Yqg6L295qCRCiAgICAgIHRoaXMubG9hZENvbWJpbmF0aW9uVHJlZSgpOwogICAgfSwKICAgIGxvYWRDb21iaW5hdGlvblRyZWU6IGZ1bmN0aW9uIGxvYWRDb21iaW5hdGlvblRyZWUoKSB7CiAgICAgIHZhciBfdGhpczEyID0gdGhpczsKICAgICAgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLnN0eWxlICE9IDIpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdmFyIGNvbWJpbmF0aW9uUnVsZSA9IEpTT04ucGFyc2UodGhpcy5jdXN0b21EaWFsb2cuY29tYmluYXRpb25SdWxlKTsKICAgICAgdGhpcy5jb21iaW5hdGlvblJ1bGUgPSBjb21iaW5hdGlvblJ1bGU7CiAgICAgIHZhciB0cmVlQWxpYXMgPSBjb21iaW5hdGlvblJ1bGUubGVmdFRyZWU7CiAgICAgIC8v6I635Y+W5a+56K+d5qGG5pWw5o2uCiAgICAgIHJlcS5nZXQoJyR7Zm9ybX0vZm9ybS9jdXN0b21EaWFsb2cvdjEvZ2V0QnlBbGlhcz9hbGlhcz0nICsgdHJlZUFsaWFzKS50aGVuKGZ1bmN0aW9uIChyZXNwKSB7CiAgICAgICAgdmFyIHRyZWVEaWFsb2cgPSByZXNwLmRhdGE7CiAgICAgICAgX3RoaXMxMi5sZWZ0VHJlZVRpdGxlID0gdHJlZURpYWxvZy5uYW1lOwogICAgICAgIHZhciByZXFQYXJhbSA9IHt9OwogICAgICAgIHZhciByZXF1ZXN0VHlwZSA9IHRyZWVEaWFsb2cuZHNUeXBlID09ICdkYXRhU291cmNlJyA/ICdHRVQnIDogdHJlZURpYWxvZy5yZXF1ZXN0VHlwZSA/IHRyZWVEaWFsb2cucmVxdWVzdFR5cGUgOiAnUE9TVCc7CiAgICAgICAgdmFyIHVybCA9ICcke2Zvcm19L2Zvcm0vY3VzdG9tRGlhbG9nL3YxL2dldFRyZWVEYXRhP2FsaWFzPScgKyB0cmVlQWxpYXMgKyAnJm1hcFBhcmFtPSc7CiAgICAgICAgdmFyIHBhcmFtc09iaiA9IHt9OwogICAgICAgIGlmICh0cmVlRGlhbG9nLmRzVHlwZSAhPSAnZGF0YVNvdXJjZScpIHsKICAgICAgICAgIHVybCA9IHRyZWVEaWFsb2cudXJsOwogICAgICAgICAgdmFyIHRlbXBsYXRlUGEgPSB0cmVlRGlhbG9nLmRhdGFQYXJhbTsKICAgICAgICAgIGlmICh0cmVlRGlhbG9nLmNvbmRpdGlvbmZpZWxkKSB7CiAgICAgICAgICAgIHZhciBjb25kaXRpb25zID0gSlNPTi5wYXJzZSh0cmVlRGlhbG9nLmNvbmRpdGlvbmZpZWxkKTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25kaXRpb25zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgdmFyIGNvbiA9IGNvbmRpdGlvbnNbaV07CiAgICAgICAgICAgICAgaWYgKHJlcXVlc3RUeXBlID09ICdQT1NUJykgewogICAgICAgICAgICAgICAgaWYgKHRlbXBsYXRlUGEpIHsKICAgICAgICAgICAgICAgICAgdGVtcGxhdGVQYSA9IHRlbXBsYXRlUGEucmVwbGFjZShuZXcgUmVnRXhwKCdcXHsnICsgY29uLmZpZWxkICsgJ1xcfScsICdnJyksIGNvbi5kZWZhdWx0VmFsdWUpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgcGFyYW1zT2JqW2Nvbi5maWVsZF0gPSBjb24uZGVmYXVsdFZhbHVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB2YXIgbGpDaGFyID0gdXJsLmluZGV4T2YoJz8nKSA9PSAtMSA/ICc/JyA6ICcmJzsKICAgICAgICAgICAgICAgIHVybCA9IHVybCArIGxqQ2hhciArIGNvbi5maWVsZCArICc9JyArIGNvbi5kZWZhdWx0VmFsdWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0ZW1wbGF0ZVBhKSB7CiAgICAgICAgICAgICAgcGFyYW1zT2JqID0gSlNPTi5wYXJzZSh0ZW1wbGF0ZVBhKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB2YXIgcmVxdWVzdFBhcmFtcyA9IHt9OwogICAgICAgIHJlcXVlc3RQYXJhbXMucmVxdWVzdFR5cGUgPSByZXF1ZXN0VHlwZTsKICAgICAgICByZXF1ZXN0UGFyYW1zLnVybCA9IHVybDsKICAgICAgICByZXF1ZXN0UGFyYW1zLnBhcmFtc09iaiA9IHBhcmFtc09iajsKICAgICAgICBfdGhpczEyLiRzdG9yZS5kaXNwYXRjaCgnZGlhbG9nL2dldFRyZWVEYXRhJywgcmVxdWVzdFBhcmFtcykudGhlbihmdW5jdGlvbiAocmVzcCkgewogICAgICAgICAgaWYgKHRyZWVEaWFsb2cuZGlzcGxheWZpZWxkICYmIHRyZWVEaWFsb2cucmVzdWx0ZmllbGQpIHsKICAgICAgICAgICAgdmFyIGRpc3BsYXlGaWVsZCA9IEpTT04ucGFyc2UodHJlZURpYWxvZy5kaXNwbGF5ZmllbGQpOwogICAgICAgICAgICB2YXIgcmVzdWx0ZmllbGQgPSBKU09OLnBhcnNlKHRyZWVEaWFsb2cucmVzdWx0ZmllbGQpOwogICAgICAgICAgICBfdGhpczEyLmRlZmF1bHRQcm9wcy5sYWJlbCA9IGRpc3BsYXlGaWVsZC5kaXNwbGF5TmFtZTsKICAgICAgICAgICAgX3RoaXMxMi50cmVlTGlzdCA9IHJlc3A7CiAgICAgICAgICAgIF90aGlzMTIuY29tYmlUcmVlRGlzcGxheUZpZWxkID0gZGlzcGxheUZpZWxkOwogICAgICAgICAgICBfdGhpczEyLmNvbWJpbmF0aW9uVHJlZURhdGEgPSBfdGhpczEyLnRvVHJlZURhdGEocmVzcCwgZGlzcGxheUZpZWxkLmlkLCBkaXNwbGF5RmllbGQucGlkLCBkaXNwbGF5RmllbGQuZGlzcGxheU5hbWUsIGRpc3BsYXlGaWVsZC5wdmFsdWUgPyBkaXNwbGF5RmllbGQucHZhbHVlIDogJzAnLCByZXN1bHRmaWVsZCk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgfSwKICAgIGNvbWJpVHJlZUNsaWNrOiBmdW5jdGlvbiBjb21iaVRyZWVDbGljayhwYXJhbU9iaiwgbm9kZSwgbm9kZUNvbXBvbmVudCkgewogICAgICAvL+e7hOWQiOWvueivneahhueCueWHu+W3puagkQogICAgICAvL+a4heepuuaXp+eahAogICAgICB0aGlzLmNvbWJpbmF0aW9uVHJlZVF1ZXJ5cy5zcGxpY2UoMCk7CiAgICAgIHZhciBjb21iaW5hdGlvblJ1bGUgPSBKU09OLnBhcnNlKHRoaXMuY3VzdG9tRGlhbG9nLmNvbWJpbmF0aW9uUnVsZSk7CiAgICAgIGlmICghY29tYmluYXRpb25SdWxlLnJ1bGVzIHx8IGNvbWJpbmF0aW9uUnVsZS5ydWxlcy5sZW5ndGggPT0gMCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB2YXIgcnVsZXMgPSBjb21iaW5hdGlvblJ1bGUucnVsZXM7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcnVsZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgdmFsdWUgPSBwYXJhbU9ialtydWxlc1tpXS50cmVlRmllbGRdOwogICAgICAgIHZhciBwcm9wZXJ0eSA9IHJ1bGVzW2ldLmxpc3RGaWVsZDsKICAgICAgICB0aGlzLmNvbWJpbmF0aW9uVHJlZVF1ZXJ5cy5wdXNoKHsKICAgICAgICAgIHByb3BlcnR5OiBwcm9wZXJ0eSwKICAgICAgICAgIHZhbHVlOiB2YWx1ZSwKICAgICAgICAgIGdyb3VwOiAndHJlZUdyb3VwJywKICAgICAgICAgIG9wZXJhdGlvbjogdGhpcy5nZXRPcGVyYXRpb24ocnVsZXNbaV0uY29uZGl0aW9uKSwKICAgICAgICAgIHJlbGF0aW9uOiAnQU5EJwogICAgICAgIH0pOwogICAgICB9CiAgICAgIHRoaXMuc2VhcmNoKCk7CiAgICB9LAogICAgLy/ojrflj5bov5DnrpfnrKblj7cKICAgIGdldE9wZXJhdGlvbjogZnVuY3Rpb24gZ2V0T3BlcmF0aW9uKG9sZCkgewogICAgICBpZiAoIW9sZCkgewogICAgICAgIHJldHVybiAnJzsKICAgICAgfQogICAgICBpZiAob2xkID09ICdFUScpIHsKICAgICAgICByZXR1cm4gJ0VRVUFMJzsKICAgICAgfQogICAgICBpZiAob2xkID09ICdMSycpIHsKICAgICAgICByZXR1cm4gJ0xJS0UnOwogICAgICB9CiAgICAgIGlmIChvbGQgPT0gJ0xGSycpIHsKICAgICAgICByZXR1cm4gJ0xJS0UnOwogICAgICB9CiAgICAgIGlmIChvbGQgPT0gJ0lOJykgewogICAgICAgIHJldHVybiAnSU4nOwogICAgICB9CiAgICB9LAogICAgdG9nZ2xlVHJlZTogZnVuY3Rpb24gdG9nZ2xlVHJlZSgpIHsKICAgICAgaWYgKHRoaXMudHJlZVNob3cpIHsKICAgICAgICB0aGlzLnRyZWVTaG93ID0gZmFsc2U7CiAgICAgICAgdGhpcy50cmFuc3Rpb25XaWR0aCA9ICcwJSc7CiAgICAgICAgdGhpcy50b2dnbGVCdG4gPSAnZWwtaWNvbi1hcnJvdy1yaWdodCc7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy50cmVlU2hvdyA9IHRydWU7CiAgICAgICAgdGhpcy50cmFuc3Rpb25XaWR0aCA9ICcyNSUnOwogICAgICAgIHRoaXMudG9nZ2xlQnRuID0gJ2VsLWljb24tYXJyb3ctbGVmdCc7CiAgICAgIH0KICAgIH0KICB9Cn07"},null]}