{"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\\eipControl\\EipDialog.vue?vue&type=script&lang=js&","dependencies":[{"path":"D:\\jenkins\\workspace\\ljzc-fvue\\src\\components\\eipControl\\EipDialog.vue","mtime":1705040076727},{"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:aW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tICJEOi9qZW5raW5zL3dvcmtzcGFjZS9sanpjLWZ2dWUvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5LmpzIjsKaW1wb3J0IF9hc3luY1RvR2VuZXJhdG9yIGZyb20gIkQ6L2plbmtpbnMvd29ya3NwYWNlL2xqemMtZnZ1ZS9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vYXN5bmNUb0dlbmVyYXRvci5qcyI7CmltcG9ydCAicmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkucHVzaC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmcuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLmZvci1lYWNoLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuZnVuY3Rpb24ubmFtZS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC5leGVjLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnNlYXJjaC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5rZXlzLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuanNvbi5zdHJpbmdpZnkuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5zcGxpY2UuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcucmVwbGFjZS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC5jb25zdHJ1Y3Rvci5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC5kb3QtYWxsLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLnN0aWNreS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC50by1zdHJpbmcuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5maWx0ZXIuanMiOwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwoKaW1wb3J0IHsgbWFwU3RhdGUgfSBmcm9tICd2dWV4JzsKaW1wb3J0IHV0aWxzIGZyb20gJ0AvdXRpbHMuanMnOwppbXBvcnQgaG90ZW50VWlVdGlscyBmcm9tICdAL2hvdGVudC11aS11dGlsLmpzJzsKaW1wb3J0IHsgTWVzc2FnZSB9IGZyb20gJ2VsZW1lbnQtdWknOwppbXBvcnQgcmVxIGZyb20gJ0AvcmVxdWVzdC5qcyc7CmltcG9ydCBzdWJfcGlvX21peGluIGZyb20gIkAvc3ViLXBlcm1pc3Npb24tbWl4aW4uanMiOwppbXBvcnQgRWlwVGFnIGZyb20gJ0AvY29tcG9uZW50cy9laXBDb250cm9sL0VpcFRhZy52dWUnOwppbXBvcnQgRWlwU2VsZWN0RGlhIGZyb20gJ0AvY29tcG9uZW50cy9laXBDb250cm9sL0VpcFNlbGVjdERpYS52dWUnOwpleHBvcnQgZGVmYXVsdCB7CiAgY29tcG9uZW50czogewogICAgRWlwVGFnOiBFaXBUYWcsCiAgICBFaXBTZWxlY3REaWE6IEVpcFNlbGVjdERpYQogIH0sCiAgbmFtZTogJ2VpcC1kaWFsb2cnLAogIHByb3BzOiBbJ3ZhbGlkYXRlJywgJ3ZhbHVlJywgJ25hbWUnLCAncGVybWlzc2lvbicsICdhdHRlcicsICdzaW5nbGUnLCAnc2VsZWN0b3Jjb25maWcnLCAnY3VzdGRpYWxvZycsICdwbGFjZWhvbGRlcicsICd0b29sdGlwcGxhY2VtZW50J10sCiAgbWl4aW5zOiBbc3ViX3Bpb19taXhpbl0sCiAgLy/mt7flhaXmlrnlvI/lvJXlhaXooajljZXnu4Tku7bkuK3lhazlhbHlsZ7mgKfvvIzlpITnkIblrZDooajjgIHlrZnooajooYzlhoXogZTliqjvvIjliIfpnaLkv67mlLlwZXJtaXNzaW9uX3N1Yu+8iQogIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7CiAgICByZXR1cm4gewogICAgICBkaWFsb2dWaXNpYmxlOiBmYWxzZSwKICAgICAgLy/miZPlvIDmoJHlvaLovpPlhaXliqjmgIHlj4LmlbDlgLznmoTlr7nor53moYYKICAgICAgcGFnZVBhcmFtOiB7fSwKICAgICAgLy/moJHlvaLlr7nor53moYblj4LmlbAKICAgICAgY29uZGl0aW9uZmllbGRUcmVlOiBbXSwKICAgICAgLy/moJHlvaLlr7nor53moYbmnaHku7blrZfmrrUKICAgICAgZGF0YTogewogICAgICAgIHF4ZGQ6IHt9CiAgICAgIH0sCiAgICAgIGlucHV0U3VmZml4V2lkdGg6IDAsCiAgICAgIHBsYWNlaG9sZGVyQm86ICcnLAogICAgICBxdWlja1NlYXJjaDogJycsCiAgICAgIC8v5aGr5YaZ5o+Q56S6CiAgICAgIGNvbmRpdGlvbkJpbmQ6IFtdLAogICAgICAvL+WPguaVsOafpeivouWtl+autQogICAgICBub2RlS2V5OiAnSURfJywKICAgICAgLy/moJHlvaLmlbDmja7niLZJZAogICAgICBjdXN0b21EaWFsb2dTaG93TGlzdDogZmFsc2UsCiAgICAgIGN1c3RvbURpYWxvZ1Nob3dUcmVlOiBmYWxzZSwKICAgICAgc2VsZWN0T3JnUHJvcHM6IHsKICAgICAgICBsYWJlbDogJ25hbWUnCiAgICAgIH0sCiAgICAgIHN0eWxlOiAnJywKICAgICAgLy/lr7nor53moYblrr3pq5gKICAgICAgc2VsZWN0T3JnczogbnVsbCwKICAgICAgaW5wdXRTdWZmaXhIZWlnaHQ6IDMzLAogICAgICBjb25maWc6IG51bGwsCiAgICAgIHVwZGF0aW5nOiBmYWxzZSwKICAgICAgZGlzcGxheWZpZWxkOiBbXSwKICAgICAgLy/mmL7npLrlrZfmrrUKICAgICAgY3VzdG9tRGlhbG9nOiB7fSwKICAgICAgcXVlcnlQYXJhbTogJycsCiAgICAgIC8v5p+l6K+i5p2h5Lu26L6T5YWl55qE5YC8CiAgICAgIHByb3BzMTogW10sCiAgICAgIHNob3dEYXRhOiBbXSwKICAgICAgY2hlY2tCb3hEYXRhQWxsOiBbXSwKICAgICAgLy/pgInkuK3lr7nosaHnmoTpm4blkIgKICAgICAgZGVmYXVsdFByb3BzOiB7CiAgICAgICAgY2hpbGRyZW46ICdjaGlsZHJlbicsCiAgICAgICAgbGFiZWw6ICdsYWJlbCcsCiAgICAgICAgaXNMZWFmOiAiaXNMZWFmIgogICAgICB9LAogICAgICBwcm9wc0RhdGE6IFtdLAogICAgICBxdWVyeXNTaG93OiBmYWxzZSwKICAgICAgLy/mmK/lkKbmmL7npLrmkJzntKLmoYYKICAgICAgdW5kZWZpbmVkYTogJycsCiAgICAgIGlzQ3VycmVudENoYW5nZTogZmFsc2UsCiAgICAgIC8v5piv5ZCm5LiN5omn6KGMIG9yZ1RhYmxlU2VsZWN0aW9u5pa55rOVCiAgICAgIHBhZ2luYXRpb246IHsKICAgICAgICBwYWdlOiAxLAogICAgICAgIHBhZ2VTaXplOiAyMCwKICAgICAgICB0b3RhbDogMAogICAgICB9LAogICAgICBwYXJhbTogW10sCiAgICAgIC8v57uR5a6a55qE6KGo5Y2V5a2X5q61CiAgICAgIHRyZWVMaXN0OiBbXSwKICAgICAgZGlzcGxheUZpZWxkOiB7fSwKICAgICAgcXVlcnlQYXJhbXM6IFtdLAogICAgICBwbGFjZWhvbGRlcnM6IFtdLAogICAgICBvbGRzZWxlY3RPcmdzOiBbXSwKICAgICAgY29tYmluYXRpb25UcmVlRGF0YTogW10sCiAgICAgIGNvbWJpVHJlZURpc3BsYXlGaWVsZDogW10sCiAgICAgIGNvbWJpbmF0aW9uVHJlZVF1ZXJ5czogW10sCiAgICAgIGNvbWJpbmF0aW9uUnVsZToge30sCiAgICAgIHRvZ2dsZUJ0bjogImVsLWljb24tYXJyb3ctbGVmdCIsCiAgICAgIHRyZWVTaG93OiB0cnVlLAogICAgICB0cmFuc3Rpb25XaWR0aDogIjI1JSIsCiAgICAgIGxlZnRUcmVlVGl0bGU6ICIiLAogICAgICB3cml0ZWFibGU6IHRydWUKICAgIH07CiAgfSwKICB3YXRjaDogewogICAgcHJvcHMxOiBmdW5jdGlvbiBwcm9wczEobmV3VmFsLCBvbGRWYWwpIHsKICAgICAgLy/moJHlvaIKICAgICAgaWYgKHRoaXMuc2hvd0RhdGEgIT0gdW5kZWZpbmVkICYmIHRoaXMuc2hvd0RhdGEubGVuZ3RoID4gMCkgewogICAgICAgIHZhciB0aGlzXyA9IHRoaXM7CiAgICAgICAgdmFyIGRhdGEgPSBbXTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc2hvd0RhdGEubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGRhdGEucHVzaCh0aGlzLnNob3dEYXRhW2ldKTsKICAgICAgICB9CiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgZGF0YS5sZW5ndGg7IF9pKyspIHsKICAgICAgICAgICAgdGhpc18uJHJlZnMudHJlZS5zZXRDaGVja2VkKGRhdGFbX2ldLCB0cnVlKTsKICAgICAgICAgICAgdGhpc18uY2hlY2tOb2RlKGRhdGFbX2ldLCB0aGlzXyk7CiAgICAgICAgICB9CiAgICAgICAgfSwgMjAwKTsKICAgICAgfQogICAgfQogIH0sCiAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHsKICAgIHZhciBfaG90ZW50VWlVdGlscyRnZXRTdWIgPSBob3RlbnRVaVV0aWxzLmdldFN1YlNjb3BlRWxBbmRJbmRleCh0aGlzLiRlbCksCiAgICAgIHN1YlNjb3BlRWwgPSBfaG90ZW50VWlVdGlscyRnZXRTdWIuc3ViU2NvcGVFbCwKICAgICAgaW5kZXggPSBfaG90ZW50VWlVdGlscyRnZXRTdWIuaW5kZXg7CiAgICBpZiAoc3ViU2NvcGVFbCAmJiAoc3ViU2NvcGVFbC5nZXRBdHRyaWJ1dGUoInJvd19yZWFkb25seSIpID09ICd0cnVlJyB8fCBzdWJTY29wZUVsLmdldEF0dHJpYnV0ZSgicm93X3JlYWRvbmx5IikgPT09IHRydWUpKSB7CiAgICAgIHRoaXMud3JpdGVhYmxlID0gZmFsc2U7CiAgICB9CiAgICAvL+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+8iQogICAgICAgICAgICAgICAgaWYgKHRoaXNfLmNvbmRpdGlvbmZpZWxkVHJlZVtpXS5kZWZhdWx0VHlwZSA9PSAiNCIpIHsKICAgICAgICAgICAgICAgICAgcGFyYW1bdGhpc18uY29uZGl0aW9uZmllbGRUcmVlW2ldLmZpZWxkXSA9IHRoaXNfLmNvbmRpdGlvbmZpZWxkVHJlZVtpXS5jb21tZW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgLy/mnInliqjmgIHkvKDlhaXnmoTlrZfmrrUKICAgICAgICAgIGlmIChKU09OLnN0cmluZ2lmeShwYXJhbSkgIT0gInt9IikgewogICAgICAgICAgICB0aGlzXy5kaWFsb2dWaXNpYmxlID0gdHJ1ZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8v5peg5Yqo5oCB5Lyg5YWl55qE5a2X5q61CiAgICAgICAgICAgIHRoaXNfLmN1c3RvbURpYWxvZ1RyZWVTaG93KHRoaXNfLnBhZ2VQYXJhbSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KTsKICAgIH0sCiAgICAvL+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+aVsOaNruWvueixoQogICAgICB2YXIgY3R4ID0ge307CiAgICAgIHF1ZXJ5RmlsdGVyICYmIHF1ZXJ5RmlsdGVyLnF1ZXJ5cy5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50KSB7CiAgICAgICAgY3R4W2VsZW1lbnQucHJvcGVydHldID0gZWxlbWVudC52YWx1ZTsKICAgICAgfSk7CiAgICAgIHZhciBleHAgPSBob3RlbnRVaVV0aWxzLnBhcnNlRXhwKHRoaXMuY3VzdG9tRGlhbG9nLmRhdGFQYXJhbSwgY3R4KTsKICAgICAgdHJ5IHsKICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShleHApOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgQ3VzdG9tUXVlcnkuX3Rocm93RXhjZXB0aW9uKCJQT1NUXHU1M0MyXHU2NTcwXHU0RTBEXHU2NjJGXHU2NzA5XHU2NTQ4XHU3Njg0SlNPTlx1NjgzQ1x1NUYwRiIuY29uY2F0KHF1ZXJ5LmRhdGFQYXJhbSkpOwogICAgICB9CiAgICB9LAogICAgZG9RdWVyeTogZnVuY3Rpb24gZG9RdWVyeShwYXJhbSkgewogICAgICB2YXIgX3RoaXM1ID0gdGhpczsKICAgICAgcmV0dXJuIF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZSgpIHsKICAgICAgICB2YXIgcGFyYW1Mb2FkRGF0YSwgcEluc3QsIGksIGJpbmRWYWwsIG9iaiwgcXVlcnlVcmwsIHJlcXVlc3RNZXRob2Q7CiAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7CiAgICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkgewogICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgcGFyYW1Mb2FkRGF0YSA9IFtdOwogICAgICAgICAgICAgIHBJbnN0ID0gdXRpbHMuZ2V0T25saW5lRm9ybUluc3RhbmNlKF90aGlzNSk7IC8v6I635Y+W5YWz6IGU5p+l6K+i57uR5a6a55qE6KGo5Y2V5Y+C5pWwCiAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBhcmFtLmNvbmRpdGlvbmZpZWxkLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAocGFyYW0uY29uZGl0aW9uZmllbGRbaV0uZmllbGRQYXRoICE9ICcnKSB7CiAgICAgICAgICAgICAgICAgIGJpbmRWYWwgPSB1dGlscy5nZXRWYWx1ZUJ5UGF0aChwSW5zdCwgcGFyYW0uY29uZGl0aW9uZmllbGRbaV0uZmllbGRQYXRoLCBudWxsKTsKICAgICAgICAgICAgICAgICAgb2JqID0gewogICAgICAgICAgICAgICAgICAgIGtleTogcGFyYW0uY29uZGl0aW9uZmllbGRbaV0uZmllbGQsCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGJpbmRWYWwKICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgcGFyYW1Mb2FkRGF0YS5wdXNoKG9iaik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHF1ZXJ5VXJsID0gcGFyYW0uZHNUeXBlID09ICdkYXRhU291cmNlJyA/ICcke2Zvcm19L2Zvcm0vY3VzdG9tUXVlcnkvdjEvZG9RdWVyeT9hbGlhcz0nICsgcGFyYW0uYWxpYXMgKyAnJnBhZ2U9MScgOiBwYXJhbS51cmw7CiAgICAgICAgICAgICAgcmVxdWVzdE1ldGhvZCA9ICdQT1NUJzsgLy/lpoLmnpzlhbPogZTmlbDmja7liJfooajmn6Xor6LmlbDmja7kuI3mmK/mlbDmja7mupDliJnor7fmsYLmlrnms5XkuLpyZXN0ZnVs6YWN572u55qE6K+35rGC5pa55byPCiAgICAgICAgICAgICAgaWYgKHBhcmFtLmRzVHlwZSAhPSAnZGF0YVNvdXJjZScpIHsKICAgICAgICAgICAgICAgIHJlcXVlc3RNZXRob2QgPSBwYXJhbS5yZXF1ZXN0VHlwZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgLy/mn6Xor6LmlbDmja4KICAgICAgICAgICAgICByZXEucmVxdWVzdCh7CiAgICAgICAgICAgICAgICB1cmw6IHF1ZXJ5VXJsLAogICAgICAgICAgICAgICAgbWV0aG9kOiByZXF1ZXN0TWV0aG9kLAogICAgICAgICAgICAgICAgZGF0YTogcGFyYW1Mb2FkRGF0YQogICAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlcykgewogICAgICAgICAgICAgICAgLy/liKTmlq3mmK/lkKbmnInlhbPogZTmn6Xor6LmlbDmja7ov5Tlm54KICAgICAgICAgICAgICAgIGlmIChyZXMuZGF0YS5yb3dzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgLy/ojrflj5blhbPogZTmn6Xor6Lov5Tlm57nmoTooajljZXlj4LmlbAKICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaW8gPSAwOyBpbyA8IHBhcmFtLnJlc3VsdGZpZWxkLmxlbmd0aDsgaW8rKykgewogICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbS5yZXN1bHRmaWVsZFtpb10uZmllbGRQYXRoICE9ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHJlcy5kYXRhLnJvd3MubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcy5kYXRhLnJvd3Nbal1bcGFyYW0ucmVzdWx0ZmllbGRbaW9dLmZpZWxkXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHZhbCArIHJlcy5kYXRhLnJvd3Nbal1bcGFyYW0ucmVzdWx0ZmllbGRbaW9dLmZpZWxkXSArICcsJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgdmFsID0gdmFsLnN1YnN0cmluZygwLCB2YWwubGVuZ3RoIC0gMSk7CiAgICAgICAgICAgICAgICAgICAgICB2YXIgcGF0aEFyciA9IHBhcmFtLnJlc3VsdGZpZWxkW2lvXS5maWVsZFBhdGguc3BsaXQoJy4nKTsKICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXRoQXJyLmxlbmd0aCA9PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8v5Li76KGoCiAgICAgICAgICAgICAgICAgICAgICAgIHV0aWxzLnNldFZhbHVlQnlQYXRoKHBJbnN0LCBwYXJhbS5yZXN1bHRmaWVsZFtpb10uZmllbGRQYXRoLCB2YWwsIG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXRoQXJyLmxlbmd0aCA9PSA0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8v5a2Q6KGoCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdWJEYXRhID0gcEluc3QuZGF0YVtwYXRoQXJyWzFdXVtwYXRoQXJyWzJdXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YkRhdGEubGVuZ3RoID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAvL+WtkOihqOayoeaVsOaNrueahOaDheWGtQogICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdWJUYWJOYW1lID0gcGF0aEFyclsyXS5yZXBsYWNlKCdzdWJfJywgJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgIC8v5b6X5Yiw5a2Q6KGo55qE5omA5pyJ5a2X5q61CiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN1YkluaXREYXRhID0gcEluc3QuZGF0YVtwYXRoQXJyWzFdXS5pbml0RGF0YVtzdWJUYWJOYW1lXSB8fCB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAvL+aKiuaVsOe7hOmHjOmdoueahOWAvOS4uiBudWxsIOi9rOaNouS4uuepuuWtl+espuS4sgogICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdHIgPSBKU09OLnN0cmluZ2lmeShzdWJJbml0RGF0YSkucmVwbGFjZSgvbnVsbC9nLCAnIiInKTsKICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX3N1YkRhdGEgPSBKU09OLnBhcnNlKHN0cik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIF9zdWJEYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL+eCuea3u+WKoOaXtuWIpOaWreimgeaWsOWinuWtkOihqOiusOW9leS4reeahOWtmeihqOaYr+WQpuacieWAvAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleS5pbmRleE9mKCdzdWJfJykgPT0gMCAmJiBfc3ViRGF0YVtrZXldLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3N1YkRhdGFba2V5XSA9IFtdOyAvL+acieWImea4heepugogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy/ngrnmt7vliqDml7bliKTmlq3opoHmlrDlop7lrZDooajorrDlvZXkuK3nmoTlrZfmrrXmmK/lkKbmnInlgLwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfc3ViRGF0YVtrZXldKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zdWJEYXRhW2tleV0gPSAnJzsgLy/mnInliJnmuIXnqboKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgLy/mlrDlop7kuIDmnaHmlbDmja4KICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdC5kYXRhW3BhdGhBcnJbMV1dW3BhdGhBcnJbMl1dLnB1c2goX3N1YkRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgIC8v5a+56K+d5qGG5YWz6IGU5p+l6K+i6L+U5Zue55qE5YC86LWL5YC857uZ57uR5a6a55qE5a2X5q61CiAgICAgICAgICAgICAgICAgICAgICAgICAgdXRpbHMuc2V0VmFsdWVCeVBhdGgocEluc3QsIHBhcmFtLnJlc3VsdGZpZWxkW2lvXS5maWVsZFBhdGgsIHZhbCwgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgLy/lrZDooajmnInmlbDmja7nmoTmg4XlhrUKICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBwID0gMDsgcCA8IHN1YkRhdGEubGVuZ3RoOyBwKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v5a+56K+d5qGG5YWz6IGU5p+l6K+i6L+U5Zue55qE5YC86LWL5YC857uZ57uR5a6a55qE5a2X5q61CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGlscy5zZXRWYWx1ZUJ5UGF0aChwSW5zdCwgcGFyYW0ucmVzdWx0ZmllbGRbaW9dLmZpZWxkUGF0aCwgdmFsLCBwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIC8v5rKh5pyJ6L+U5Zue55qE5YC85YiZ5riF56m6CiAgICAgICAgICAgICAgICAgIC8v6I635Y+W5YWz6IGU5p+l6K+i6L+U5Zue55qE6KGo5Y2V5Y+C5pWwCiAgICAgICAgICAgICAgICAgIGZvciAodmFyIGlvcCA9IDA7IGlvcCA8IHBhcmFtLnJlc3VsdGZpZWxkLmxlbmd0aDsgaW9wKyspIHsKICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW0ucmVzdWx0ZmllbGRbaW9wXS5maWVsZFBhdGggIT0gJycpIHsKICAgICAgICAgICAgICAgICAgICAgIHZhciBfcGF0aEFyciA9IHBhcmFtLnJlc3VsdGZpZWxkW2lvcF0uZmllbGRQYXRoLnNwbGl0KCcuJyk7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoX3BhdGhBcnIubGVuZ3RoID09IDMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy/kuLvooagKICAgICAgICAgICAgICAgICAgICAgICAgLy/otYvlgLznu5nnu5HlrprnmoTlrZfmrrUKICAgICAgICAgICAgICAgICAgICAgICAgdXRpbHMuc2V0VmFsdWVCeVBhdGgocEluc3QsIHBhcmFtLnJlc3VsdGZpZWxkW2lvcF0uZmllbGRQYXRoLCAnJywgbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKF9wYXRoQXJyLmxlbmd0aCA9PSA0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8v5a2Q6KGoCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfc3ViRGF0YTIgPSBwSW5zdC5kYXRhW19wYXRoQXJyWzFdXVtfcGF0aEFyclsyXV07CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIF9wID0gMDsgX3AgPCBfc3ViRGF0YTIubGVuZ3RoOyBfcCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgLy/lr7nor53moYblhbPogZTmn6Xor6Lov5Tlm57nmoTlgLzotYvlgLznu5nnu5HlrprnmoTlrZfmrrUKICAgICAgICAgICAgICAgICAgICAgICAgICB1dGlscy5zZXRWYWx1ZUJ5UGF0aChwSW5zdCwgcGFyYW0ucmVzdWx0ZmllbGRbaW9wXS5maWVsZFBhdGgsICcnLCBfcCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgY2FzZSA3OgogICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7CiAgICAgICAgICB9CiAgICAgICAgfSwgX2NhbGxlZSk7CiAgICAgIH0pKSgpOwogICAgfSwKICAgIC8vIOWQjOatpemAieaLqee7k+aenAogICAgc3luY0lucHV0VmFsdWU6IGZ1bmN0aW9uIHN5bmNJbnB1dFZhbHVlKCkgewogICAgICB2YXIgX3RoaXM2ID0gdGhpczsKICAgICAgdmFyIHRoaXNJbmRleCA9IG51bGw7IC8v5b2T5YmN5pWw5o2u5omA5Zyo5LiL5qCHCiAgICAgIHZhciBwYXJlbnRJbmRleCA9IG51bGw7IC8v54i26IqC54K55omA5Zyo5LiL5qCHCiAgICAgIGlmICh0aGlzLiRlbCkgewogICAgICAgIHRoaXNJbmRleCA9IHV0aWxzLmdldFNvbWVBdHRyaWJ1dGVGcm9tUGFyZW50RWxlbWVudCh0aGlzLiRlbCwgJ2RhdGEtaW5kZXgnKTsKICAgICAgICBwYXJlbnRJbmRleCA9IHV0aWxzLmdldFNvbWVBdHRyaWJ1dGVGcm9tUGFyZW50RWxlbWVudCh0aGlzLiRwYXJlbnQuJGVsLCAnZGF0YS1pbmRleCcpOwogICAgICB9CiAgICAgIHZhciByZXR1cm5TdHIgPSBKU09OLnBhcnNlKHRoaXMuY3VzdG9tRGlhbG9nLnJlc3VsdGZpZWxkKTsKICAgICAgLy/mi7/liLDov5Tlm57nmoTlrZfmrrUKICAgICAgdmFyIGZpZWxkID0gbmV3IEFycmF5KFtyZXR1cm5TdHIubGVuZ3RoXSk7CiAgICAgIHZhciBjb21tZW50ID0gbmV3IEFycmF5KFtyZXR1cm5TdHIubGVuZ3RoXSk7CiAgICAgIHZhciBzdHIgPSBbXTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXR1cm5TdHIubGVuZ3RoOyBpKyspIHsKICAgICAgICBmaWVsZFtpXSA9IHRoaXMuY3VzdG9tRGlhbG9nLmRzVHlwZSA9PSAnZGF0YVNvdXJjZScgPyByZXR1cm5TdHJbaV0uZmllbGQudG9Mb3dlckNhc2UoKSA6IHJldHVyblN0cltpXS5maWVsZDsKICAgICAgICBjb21tZW50W2ldID0gdGhpcy5jdXN0b21EaWFsb2cuZHNUeXBlID09ICdkYXRhU291cmNlJyA/IHJldHVyblN0cltpXS5jb21tZW50LnRvTG93ZXJDYXNlKCkgOiByZXR1cm5TdHJbaV0uY29tbWVudDsKICAgICAgfQogICAgICB2YXIgdGhpc18gPSB0aGlzOwogICAgICB2YXIgcyA9IHRoaXMuc2VsZWN0T3JnczsKICAgICAgdGhpcy5zaG93RGF0YSA9IF90b0NvbnN1bWFibGVBcnJheSh0aGlzLnNlbGVjdE9yZ3MpOwogICAgICB0aGlzLmNoZWNrQm94RGF0YUFsbCA9IF90b0NvbnN1bWFibGVBcnJheSh0aGlzLnNlbGVjdE9yZ3MpOwogICAgICBpZiAodGhpcy5jdXN0b21EaWFsb2cuc2VsZWN0TnVtID09PSAxKSB7CiAgICAgICAgcyA9IHRoaXMuc2VsZWN0T3JnczsKICAgICAgfQogICAgICBpZiAodGhpcy5jdXN0b21EaWFsb2cuc2VsZWN0TnVtID09PSAxKSB7CiAgICAgICAgdmFyIHRlbXAgPSAnJzsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbW1lbnQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHZhciBzRmllbGQgPSBzWzBdW2ZpZWxkW2ldXSA9PT0gdW5kZWZpbmVkID8gJycgOiBzWzBdW2ZpZWxkW2ldXTsKICAgICAgICAgIHZhciBlbmNvZGVTdHIgPSBlbmNvZGVVUklDb21wb25lbnQoc0ZpZWxkKTsKICAgICAgICAgIHRlbXAgKz0gJyInICsgY29tbWVudFtpXSArICciOiInICsgZW5jb2RlU3RyICsgJyIsJzsKICAgICAgICB9CiAgICAgICAgaWYgKHRlbXAgIT0gJycpIHsKICAgICAgICAgIHRlbXAgPSAneycgKyB0ZW1wLnN1YnN0cmluZygwLCB0ZW1wLmxlbmd0aCAtIDEpICsgJ30nOwogICAgICAgIH0KICAgICAgICBzdHIucHVzaCh1dGlscy5wYXJzZVRvSnNvbih0ZW1wKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2YXIgdGVtcCA9ICcnOwogICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjb21tZW50Lmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgIHZhciBfZW5jb2RlU3RyID0gZW5jb2RlVVJJQ29tcG9uZW50KHNbaV1bZmllbGRbal1dKTsKICAgICAgICAgICAgdGVtcCArPSAnIicgKyBjb21tZW50W2pdICsgJyI6IicgKyBfZW5jb2RlU3RyICsgJyIsJzsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0ZW1wICE9ICcnKSB7CiAgICAgICAgICAgIHRlbXAgPSAneycgKyB0ZW1wLnN1YnN0cmluZygwLCB0ZW1wLmxlbmd0aCAtIDEpICsgJ30nOwogICAgICAgICAgfQogICAgICAgICAgc3RyLnB1c2godXRpbHMucGFyc2VUb0pzb24odGVtcCkpOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyB0aGlzLiRlbWl0KCJpbnB1dCIsIEpTT04uc3RyaW5naWZ5KHN0cikpOwogICAgICB2YXIgcEluc3QgPSB1dGlscy5nZXRPbmxpbmVGb3JtSW5zdGFuY2UodGhpcyk7CiAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgIHRoaXMuY3VzdGRpYWxvZy5jdXN0RGlhbG9nLm1hcHBpbmdDb25mLmZvckVhY2goZnVuY3Rpb24gKGNvbikgewogICAgICAgIHZhciB2YWwgPSAnJzsKICAgICAgICB2YXIgZnJvbSA9ICcnOwogICAgICAgIGlmIChfdGhpcy5jdXN0b21EaWFsb2cuZHNUeXBlID09ICdyZXN0ZnVsJykgewogICAgICAgICAgZnJvbSA9IGNvbi5mcm9tOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBmcm9tID0gY29uLmZyb20udG9Mb3dlckNhc2UoKTsKICAgICAgICB9CiAgICAgICAgc3RyLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICAgIHZhbCArPSBkZWNvZGVVUklDb21wb25lbnQoaXRlbVtmcm9tXSkgKyAnLCc7CiAgICAgICAgfSk7CiAgICAgICAgaWYgKF90aGlzNi5hdHRlciA9PSAnZGF0YS4nICsgY29uWyd0YXJnZXQnXVswXSkgewogICAgICAgICAgdmFsID0gdmFsLnN1YnN0cmluZygwLCB2YWwubGVuZ3RoIC0gMSk7CiAgICAgICAgICB1dGlscy5zZXRWYWx1ZUJ5UGF0aChwSW5zdCwgJ2RhdGEuJyArIGNvblsndGFyZ2V0J11bMF0sIHZhbCwgdGhpc0luZGV4KTsKICAgICAgICB9IGVsc2UgaWYgKF90aGlzNi5hdHRlciA9PSAnc2VhcmNoRm9ybS4nICsgY29uWyd0YXJnZXQnXVswXSkgewogICAgICAgICAgdXRpbHMuc2V0VmFsdWVCeVBhdGgocEluc3QsICdzZWFyY2hGb3JtLicgKyBjb25bJ3RhcmdldCddWzBdLCB2YWwuc3Vic3RyaW5nKDAsIHZhbC5sZW5ndGggLSAxKSwgdGhpc0luZGV4KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFyIGNvbmZpZ0F0dHIgPSBjb25bJ3RhcmdldCddWzBdLnNwbGl0KCIuIik7CiAgICAgICAgICB2YXIgcGF0aCA9IGNvblsndGFyZ2V0J11bMF07CiAgICAgICAgICBpZiAoY29uZmlnQXR0ci5sZW5ndGggPT0gNCAmJiBwYXJlbnRJbmRleCA+PSAwKSB7CiAgICAgICAgICAgIC8v5a2Z6KGo5pWw5o2u6LWL5YC8CiAgICAgICAgICAgIHBhdGggPSBjb25maWdBdHRyWzBdICsgIi4iICsgY29uZmlnQXR0clsxXSArICJbIiArIHBhcmVudEluZGV4ICsgIl0uIiArIGNvbmZpZ0F0dHJbMl0gKyAiLiIgKyBjb25maWdBdHRyWzNdOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHBJbnN0LmRhdGEpIHsKICAgICAgICAgICAgdXRpbHMuc2V0VmFsdWVCeVBhdGgocEluc3QsICdkYXRhLicgKyBwYXRoLCB2YWwuc3Vic3RyaW5nKDAsIHZhbC5sZW5ndGggLSAxKSwgdGhpc0luZGV4KTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHV0aWxzLnNldFZhbHVlQnlQYXRoKHBJbnN0LCAnbW9kZWwuJyArIHBhdGgsIHZhbC5zdWJzdHJpbmcoMCwgdmFsLmxlbmd0aCAtIDEpLCB0aGlzSW5kZXgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICAgIC8v5Yik5pat5a+56K+d5qGG5piv5ZCm57uR5a6a5LqG5YWz6IGU5p+l6K+iCiAgICAgIHZhciBjdXN0UXVlcnlKc29uID0gdGhpcy5jdXN0ZGlhbG9nLmN1c3REaWFsb2cuY3VzdFF1ZXJ5SnNvbjsKICAgICAgaWYgKGN1c3RRdWVyeUpzb24ubGVuZ3RoID4gMCkgewogICAgICAgIGZvciAodmFyIF9pNCA9IDA7IF9pNCA8IGN1c3RRdWVyeUpzb24ubGVuZ3RoOyBfaTQrKykgewogICAgICAgICAgaWYgKGN1c3RRdWVyeUpzb25bX2k0XS5jb25kaXRpb25maWVsZC5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIHRoaXMuZG9RdWVyeShjdXN0UXVlcnlKc29uW19pNF0pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5lcnJvcignWycgKyBjdXN0UXVlcnlKc29uW19pNF0uY29tbWVudCArICdd5YWz6IGU5p+l6K+i5Y+W5YC85Y+C5pWw5pyq57uR5a6a6KGo5Y2V5a2X5q61Jyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgLy/lj5bmtojmjInpkq4KICAgIGRpYWxvZ0NhbmNlbDogZnVuY3Rpb24gZGlhbG9nQ2FuY2VsKCkgewogICAgICB2YXIgX3RoaXM3ID0gdGhpczsKICAgICAgdmFyIHRoaXNfID0gdGhpczsKICAgICAgdGhpc18ucXVlcnlQYXJhbSA9ICcnOwogICAgICB0aGlzXy4kc3RvcmUuZGlzcGF0Y2goJ2RpYWxvZy9zZXREaWFsb2dEYXRhJywgW10pLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgIHRoaXNfLmN1c3RvbURpYWxvZ1Nob3dMaXN0ID0gZmFsc2U7CiAgICAgICAgLy/liKTmlq3mmK/lkKbmmK/ngrnlh7vkuobnoa7orqTlho3ngrnlh7vlj5bmtojnmoQgIGlucHV0VmFs5rKh5pyJ5YC85YiZ6KGo56S655u05o6l54K55Ye755qE5Y+W5raICiAgICAgICAgaWYgKCF0aGlzXy5pbnB1dFZhbCkgewogICAgICAgICAgdGhpc18uc2VsZWN0T3JncyA9IFtdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzXy5zZWxlY3RPcmdzID0gX3RvQ29uc3VtYWJsZUFycmF5KHRoaXNfLnNob3dEYXRhKTsKICAgICAgICAgIF90aGlzNy5jaGVja0JveERhdGFBbGwgPSBfdG9Db25zdW1hYmxlQXJyYXkodGhpc18uc2VsZWN0T3Jncyk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0sCiAgICBkaWFsb2dUcmVlQ29uZmlybTogZnVuY3Rpb24gZGlhbG9nVHJlZUNvbmZpcm0oKSB7CiAgICAgIHZhciBfdGhpczggPSB0aGlzOwogICAgICB0aGlzLmNhbGFjSW5wdXRTdWZmaXhIZWlnaHQoKTsKICAgICAgdmFyIHRoaXNJbmRleCA9IG51bGw7IC8v5b2T5YmN5pWw5o2u5omA5Zyo5LiL5qCHCiAgICAgIHZhciBwYXJlbnRJbmRleCA9IG51bGw7IC8v54i26IqC54K55omA5Zyo5LiL5qCHCiAgICAgIGlmICh0aGlzLiRlbCkgewogICAgICAgIHRoaXNJbmRleCA9IHV0aWxzLmdldFNvbWVBdHRyaWJ1dGVGcm9tUGFyZW50RWxlbWVudCh0aGlzLiRlbCwgJ2RhdGEtaW5kZXgnKTsKICAgICAgICBwYXJlbnRJbmRleCA9IHV0aWxzLmdldFNvbWVBdHRyaWJ1dGVGcm9tUGFyZW50RWxlbWVudCh0aGlzLiRwYXJlbnQuJGVsLCAnZGF0YS1pbmRleCcpOwogICAgICB9CiAgICAgIHRoaXMuJHN0b3JlLmRpc3BhdGNoKCdkaWFsb2cvc2V0RGlhbG9nRGF0YScsIFtdKTsKICAgICAgdmFyIHJldHVyblN0ciA9IEpTT04ucGFyc2UodGhpcy5jdXN0b21EaWFsb2cucmVzdWx0ZmllbGQpOwogICAgICB2YXIgZmllbGQgPSBuZXcgQXJyYXkoW3JldHVyblN0ci5sZW5ndGhdKTsKICAgICAgdmFyIGNvbW1lbnQgPSBuZXcgQXJyYXkoW3JldHVyblN0ci5sZW5ndGhdKTsKICAgICAgdmFyIHN0ciA9IFtdOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJldHVyblN0ci5sZW5ndGg7IGkrKykgewogICAgICAgIGZpZWxkW2ldID0gcmV0dXJuU3RyW2ldLmZpZWxkOwogICAgICAgIGNvbW1lbnRbaV0gPSByZXR1cm5TdHJbaV0uY29tbWVudDsKICAgICAgfQogICAgICBpZiAodGhpcy5jdXN0b21EaWFsb2cuc2VsZWN0TnVtID09PSAxKSB7CiAgICAgICAgdmFyIG5vZGVzID0gdGhpcy5wcm9wc0RhdGFbMF07CiAgICAgICAgdmFyIHRlbXAgPSAnJzsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbW1lbnQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHRlbXAgKz0gJyInICsgY29tbWVudFtpXSArICciOiInICsgbm9kZXNbZmllbGRbaV1dICsgJyIsJzsKICAgICAgICB9CiAgICAgICAgaWYgKHRlbXAgIT0gJycpIHsKICAgICAgICAgIHRlbXAgPSAneycgKyB0ZW1wLnN1YnN0cmluZygwLCB0ZW1wLmxlbmd0aCAtIDEpICsgJ30nOwogICAgICAgIH0KICAgICAgICBzdHIucHVzaCh1dGlscy5wYXJzZVRvSnNvbih0ZW1wKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIG5vZGVzID0gdGhpcy5wcm9wc0RhdGE7CiAgICAgICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSwgaykgewogICAgICAgICAgdmFyIHRlbXAgPSAnJzsKICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29tbWVudC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB0ZW1wICs9ICciJyArIGNvbW1lbnRbaV0gKyAnIjoiJyArIG5vZGVzW2ZpZWxkW2ldXSArICciLCc7CiAgICAgICAgICAgIHRlbXAgKz0gJyInICsgY29tbWVudFtpXSArICciOiInICsgbm9kZXNba11bZmllbGRbaV1dICsgJyIsJzsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0ZW1wICE9ICcnKSB7CiAgICAgICAgICAgIHRlbXAgPSAneycgKyB0ZW1wLnN1YnN0cmluZygwLCB0ZW1wLmxlbmd0aCAtIDEpICsgJ30nOwogICAgICAgICAgfQogICAgICAgICAgc3RyLnB1c2godXRpbHMucGFyc2VUb0pzb24odGVtcCkpOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIHZhciBwSW5zdCA9IHV0aWxzLmdldE9ubGluZUZvcm1JbnN0YW5jZSh0aGlzKTsKICAgICAgdGhpcy5jdXN0ZGlhbG9nLmN1c3REaWFsb2cubWFwcGluZ0NvbmYuZm9yRWFjaChmdW5jdGlvbiAoY29uKSB7CiAgICAgICAgdmFyIHZhbCA9ICcnOwogICAgICAgIHN0ci5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICB2YWwgKz0gaXRlbVtjb24uZnJvbV0gKyAnLCc7CiAgICAgICAgfSk7CiAgICAgICAgaWYgKF90aGlzOC5hdHRlciA9PSAnZGF0YS4nICsgY29uWyd0YXJnZXQnXVswXSkgewogICAgICAgICAgdXRpbHMuc2V0VmFsdWVCeVBhdGgocEluc3QsICdkYXRhLicgKyBjb25bJ3RhcmdldCddWzBdLCB2YWwuc3Vic3RyaW5nKDAsIHZhbC5sZW5ndGggLSAxKSwgdGhpc0luZGV4KTsKICAgICAgICB9IGVsc2UgaWYgKF90aGlzOC5hdHRlciA9PSAnc2VhcmNoRm9ybS4nICsgY29uWyd0YXJnZXQnXVswXSkgewogICAgICAgICAgdXRpbHMuc2V0VmFsdWVCeVBhdGgocEluc3QsICdzZWFyY2hGb3JtLicgKyBjb25bJ3RhcmdldCddWzBdLCB2YWwuc3Vic3RyaW5nKDAsIHZhbC5sZW5ndGggLSAxKSwgdGhpc0luZGV4KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFyIGNvbmZpZ0F0dHIgPSBjb25bJ3RhcmdldCddWzBdLnNwbGl0KCIuIik7CiAgICAgICAgICB2YXIgcGF0aCA9IGNvblsndGFyZ2V0J11bMF07CiAgICAgICAgICBpZiAoY29uZmlnQXR0ci5sZW5ndGggPT0gNCAmJiBwYXJlbnRJbmRleCA+PSAwKSB7CiAgICAgICAgICAgIC8v5a2Z6KGo5pWw5o2u6LWL5YC8CiAgICAgICAgICAgIHBhdGggPSBjb25maWdBdHRyWzBdICsgIi4iICsgY29uZmlnQXR0clsxXSArICJbIiArIHBhcmVudEluZGV4ICsgIl0uIiArIGNvbmZpZ0F0dHJbMl0gKyAiLiIgKyBjb25maWdBdHRyWzNdOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHBJbnN0LmRhdGEpIHsKICAgICAgICAgICAgdXRpbHMuc2V0VmFsdWVCeVBhdGgocEluc3QsICdkYXRhLicgKyBwYXRoLCB2YWwuc3Vic3RyaW5nKDAsIHZhbC5sZW5ndGggLSAxKSwgdGhpc0luZGV4KTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHV0aWxzLnNldFZhbHVlQnlQYXRoKHBJbnN0LCAnbW9kZWwuJyArIHBhdGgsIHZhbC5zdWJzdHJpbmcoMCwgdmFsLmxlbmd0aCAtIDEpLCB0aGlzSW5kZXgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICAgIC8vdGhpcy4kZW1pdCgiaW5wdXQiLCBKU09OLnN0cmluZ2lmeShzdHIpKTsKICAgICAgdGhpcy5zaG93RGF0YSA9IF90b0NvbnN1bWFibGVBcnJheSh0aGlzLnByb3BzRGF0YSk7IC8v5Zue5pi+55qE5YC8CiAgICAgIHRoaXMuY3VzdG9tRGlhbG9nU2hvd1RyZWUgPSBmYWxzZTsKICAgIH0sCiAgICBkaWFsb2dDYW5jZWxUcmVlOiBmdW5jdGlvbiBkaWFsb2dDYW5jZWxUcmVlKCkgewogICAgICB0aGlzLiRzdG9yZS5kaXNwYXRjaCgnZGlhbG9nL3NldERpYWxvZ0RhdGEnLCBbXSk7CiAgICAgIHRoaXMuY3VzdG9tRGlhbG9nU2hvd1RyZWUgPSBmYWxzZTsKICAgIH0sCiAgICBnZXRDaGVja2VkOiBmdW5jdGlvbiBnZXRDaGVja2VkKGRhdGEsIGNoZWNrZWQsIGluZGV0ZXJtaW5hdGUpIHsKICAgICAgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLnNlbGVjdE51bSA9PT0gMSkgewogICAgICAgIHRoaXMucHJvcHNEYXRhID0gW107CiAgICAgICAgdGhpcy5wcm9wc0RhdGEucHVzaChkYXRhKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLnByb3BzRGF0YSA9IHRoaXMuJHJlZnMudHJlZS5nZXRDaGVja2VkTm9kZXMoKTsKICAgICAgfQogICAgfSwKICAgIHRyZWVDbGljazogZnVuY3Rpb24gdHJlZUNsaWNrKGRhdGEsIG4sIGkpIHsKICAgICAgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLnNlbGVjdE51bSA9PT0gMSkgewogICAgICAgIHRoaXMucHJvcHNEYXRhID0gW107CiAgICAgICAgdGhpcy5wcm9wc0RhdGEucHVzaChkYXRhKTsKICAgICAgfQogICAgfSwKICAgIGNsZWFyQWxsU2VsZWN0T3JnczogZnVuY3Rpb24gY2xlYXJBbGxTZWxlY3RPcmdzKCkgewogICAgICB0aGlzLnNlbGVjdE9yZ3MgPSBudWxsOwogICAgICB0aGlzLiRyZWZzLm9yZ1RhYmxlLmNsZWFyU2VsZWN0aW9uKCk7CiAgICB9LAogICAgcmVtb3ZlU2VsZWN0T3JnOiBmdW5jdGlvbiByZW1vdmVTZWxlY3RPcmcoaXRlbSkgewogICAgICB2YXIgX3RoaXM5ID0gdGhpczsKICAgICAgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLnNlbGVjdE51bSA9PT0gMSkgewogICAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgJycpOwogICAgICAgIHRoaXMuc2VsZWN0T3Jncy5zcGxpY2UoaXRlbSwgMSk7CiAgICAgICAgdGhpcy5zaG93RGF0YS5zcGxpY2UoaXRlbSwgMSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5pbnB1dFZhbC5zcGxpY2UoaXRlbSwgMSk7CiAgICAgICAgLy8gbGV0IHJlbW92ZUlkID0gdGhpcy5zaG93RGF0YVtpdGVtXTsKICAgICAgICAvL+agkeW9ogogICAgICAgIGlmICh0aGlzLnByb3BzRGF0YS5sZW5ndGggPiAwKSB7CiAgICAgICAgICB0aGlzLnByb3BzRGF0YS5zcGxpY2UoaXRlbSwgMSk7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLnNob3dEYXRhLmxlbmd0aCA+IDApIHsKICAgICAgICAgIHRoaXMuc2hvd0RhdGEuc3BsaWNlKGl0ZW0sIDEpOwogICAgICAgIH0KICAgICAgICAvL+WIl+ihqAogICAgICAgIGlmICh0aGlzLnNlbGVjdE9yZ3MgIT0gbnVsbCkgewogICAgICAgICAgdGhpcy5zZWxlY3RPcmdzLnNwbGljZShpdGVtLCAxKTsKICAgICAgICAgIHRoaXMuY2hlY2tCb3hEYXRhQWxsLnNwbGljZShpdGVtLCAxKTsKICAgICAgICAgIHRoaXMuc2VsZWN0T3Jncy5mb3JFYWNoKGZ1bmN0aW9uIChyb3cpIHsKICAgICAgICAgICAgLy8gaWYoaXRlbS5pZCA9PXJlbW92ZUlkICl7CiAgICAgICAgICAgIF90aGlzOS5pc0N1cnJlbnRDaGFuZ2UgPSB0cnVlOwogICAgICAgICAgICBfdGhpczkudG9nZ2xlUm93U2VsZWN0aW9uKHJvdywgZmFsc2UpOwogICAgICAgICAgICAvLyB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgdGhpcy5jYWxhY0lucHV0U3VmZml4SGVpZ2h0KCk7CiAgICAgICAgdmFyIHZhbHVlID0gJyc7CiAgICAgICAgdGhpcy5pbnB1dFZhbC5mb3JFYWNoKGZ1bmN0aW9uICh2YWwpIHsKICAgICAgICAgIHZhbHVlICs9IHZhbC52YWx1ZSArICcsJzsKICAgICAgICB9KTsKICAgICAgICBpZiAodmFsdWUubGVuZ3RoID4gMCkgewogICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zdWJzdHJpbmcoMCwgdmFsdWUubGVuZ3RoIC0gMSk7CiAgICAgICAgfQogICAgICAgIGlmICh2YWx1ZSAhPSAnJykgewogICAgICAgICAgdmFsdWUgPSB2YWx1ZSArICd8fCcgKyBKU09OLnN0cmluZ2lmeSh0aGlzLnNob3dEYXRhKTsKICAgICAgICB9CiAgICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWx1ZSk7CiAgICAgIH0KICAgICAgdGhpcy5zeW5jSW5wdXRWYWx1ZSgpOwogICAgfSwKICAgIGNhbGFjSW5wdXRTdWZmaXhIZWlnaHQ6IGZ1bmN0aW9uIGNhbGFjSW5wdXRTdWZmaXhIZWlnaHQoKSB7CiAgICAgIHZhciBfdGhpczEwID0gdGhpczsKICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKCFfdGhpczEwLiRyZWZzLnRhZ1NwYW5zKSByZXR1cm47CiAgICAgICAgaWYgKF90aGlzMTAuJHJlZnMudGFnU3BhbnMub2Zmc2V0SGVpZ2h0KSB7CiAgICAgICAgICBfdGhpczEwLmlucHV0U3VmZml4SGVpZ2h0ID0gX3RoaXMxMC4kcmVmcy50YWdTcGFucy5vZmZzZXRIZWlnaHQgKyA1OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBfdGhpczEwLmlucHV0U3VmZml4SGVpZ2h0ID0gMzA7CiAgICAgICAgfQogICAgICAgIC8vIOinpuWPkemqjOivgQogICAgICAgIF90aGlzMTAuJHZhbGlkYXRvci52YWxpZGF0ZSgpOwogICAgICB9LCAwKTsKICAgIH0sCiAgICBjdXN0b21EaWFsb2dTaG93OiBmdW5jdGlvbiBjdXN0b21EaWFsb2dTaG93KHBhZ2VQYXJhbSkgewogICAgICB0aGlzLmN1c3RvbURpYWxvZ1Nob3dMaXN0ID0gdHJ1ZTsKICAgICAgdGhpcy5jdXN0b21EaWFsb2cgPSBwYWdlUGFyYW0uY3VzdG9tRGlhbG9nOwogICAgICB0aGlzLmN1c3RvbURpYWxvZy5xdWVyeVVybCA9IHRoaXMuY3VzdG9tRGlhbG9nLmRzVHlwZSA9PSAnZGF0YVNvdXJjZScgPyAnJHtmb3JtfS9mb3JtL2N1c3RvbURpYWxvZy92MS9nZXRMaXN0RGF0YT9hbGlhcz0nICsgdGhpcy5jdXN0b21EaWFsb2cuYWxpYXMgKyAnJm1hcFBhcmFtPScgKyAodGhpcy5jdXN0b21EaWFsb2cubWFwUGFyYW0gPyB0aGlzLmN1c3RvbURpYWxvZy5tYXBQYXJhbSA6ICcnKSA6IHRoaXMuY3VzdG9tRGlhbG9nLnVybDsKICAgICAgaWYgKHRoaXMuZGlhbG9nRGF0YS5sZW5ndGggPCAxKSB7CiAgICAgICAgdGhpcy5zZWFyY2goKTsKICAgICAgICB0aGlzLmRpc3BsYXlmaWVsZCA9IEpTT04ucGFyc2UocGFnZVBhcmFtLmN1c3RvbURpYWxvZy5kaXNwbGF5ZmllbGQpOwogICAgICAgIGlmICh0aGlzLmN1c3RvbURpYWxvZy5kc1R5cGUgPT0gJ2RhdGFTb3VyY2UnKSB7CiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZGlzcGxheWZpZWxkLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHRoaXMuZGlzcGxheWZpZWxkW2ldLmZpZWxkID0gdGhpcy5kaXNwbGF5ZmllbGRbaV0uZmllbGQudG9Mb3dlckNhc2UoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAodGhpcy5kaWFsb2dEYXRhLmxlbmd0aCA+IDEpIHsKICAgICAgICB0aGlzLnNlYXJjaCgpOwogICAgICB9CiAgICAgIGlmICh0aGlzLmRpYWxvZ0RhdGEubGVuZ3RoID4gMCAmJiB0aGlzLmRpc3BsYXlmaWVsZC5sZW5ndGggPT0gMCkgewogICAgICAgIHRoaXMuc2VhcmNoKCk7CiAgICAgICAgdGhpcy5kaXNwbGF5ZmllbGQgPSBKU09OLnBhcnNlKHBhZ2VQYXJhbS5jdXN0b21EaWFsb2cuZGlzcGxheWZpZWxkKTsKICAgICAgICBpZiAodGhpcy5jdXN0b21EaWFsb2cuZHNUeXBlID09ICdkYXRhU291cmNlJykgewogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRpc3BsYXlmaWVsZC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB0aGlzLmRpc3BsYXlmaWVsZFtpXS5maWVsZCA9IHRoaXMuZGlzcGxheWZpZWxkW2ldLmZpZWxkLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgY3VzdG9tRGlhbG9nVHJlZVNob3c6IGZ1bmN0aW9uIGN1c3RvbURpYWxvZ1RyZWVTaG93KHBhZ2VQYXJhbSkgewogICAgICB2YXIgY3VzdG9tRGlhbG9nID0gdGhpcy5jdXN0b21EaWFsb2c7CiAgICAgIHZhciBtYXBQYXJhbU9iaiA9IHt9OyAvL+aVsOaNruadpea6kOaYr+aVsOaNrua6kO+8jOS4lOacieWKqOaAgeWPguaVsOS8oOWFpeaXtuiwg+eUqAogICAgICB2YXIgbWFwUGFyYW0gPSAiIjsKICAgICAgdmFyIGRlZmF1bHRQVmFsdWUgPSAiIjsgLy/niLZJROWAvAogICAgICBpZiAodGhpcy5jb25kaXRpb25maWVsZFRyZWUubGVuZ3RoID4gMCkgewogICAgICAgIGZvciAodmFyIF9pNSA9IDA7IF9pNSA8IHRoaXMuY29uZGl0aW9uZmllbGRUcmVlLmxlbmd0aDsgX2k1KyspIHsKICAgICAgICAgIGlmICh0aGlzLmNvbmRpdGlvbmZpZWxkVHJlZVtfaTVdLmRlZmF1bHRUeXBlID09ICI0IikgewogICAgICAgICAgICAvL+WKqOaAgeS8oOWFpQogICAgICAgICAgICAvL+W+l+WIsOi+k+WFpeeahOadoeS7tuWtl+auteWAvAogICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5jb25kaXRpb25maWVsZFRyZWVbX2k1XS5wYXJhbVZhbDsKICAgICAgICAgICAgaWYgKCF2YWwpIHsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvL+W+l+WIsOadoeS7tuWtl+autUtFWQogICAgICAgICAgICB2YXIga2V5ID0gdGhpcy5jb25kaXRpb25maWVsZFRyZWVbX2k1XS5maWVsZDsKICAgICAgICAgICAgbWFwUGFyYW1PYmpba2V5XSA9IHZhbDsKICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25kaXRpb25maWVsZFRyZWVbX2k1XS5kZWZhdWx0VHlwZSA9PSAiMiIpIHsKICAgICAgICAgICAgLy/lm7rlrprlgLwKICAgICAgICAgICAgLy/lvpfliLDovpPlhaXnmoTmnaHku7blrZfmrrXlgLwKICAgICAgICAgICAgdmFyIF92YWwgPSB0aGlzLmNvbmRpdGlvbmZpZWxkVHJlZVtfaTVdLmRlZmF1bHRWYWx1ZTsKICAgICAgICAgICAgaWYgKCFfdmFsKSB7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy/lvpfliLDmnaHku7blrZfmrrVLRVkKICAgICAgICAgICAgdmFyIF9rZXkgPSB0aGlzLmNvbmRpdGlvbmZpZWxkVHJlZVtfaTVdLmZpZWxkOwogICAgICAgICAgICBtYXBQYXJhbU9ialtfa2V5XSA9IF92YWw7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChKU09OLnN0cmluZ2lmeShtYXBQYXJhbU9iaikgIT0gInt9IikgewogICAgICAgICAgLy/ojrflj5blr7nor53moYbphY3nva7nmoTniLZJROWtl+autQogICAgICAgICAgdmFyIHBpZCA9IEpTT04ucGFyc2UodGhpcy5jdXN0b21EaWFsb2cuZGlzcGxheWZpZWxkKS5waWQ7CiAgICAgICAgICBmb3IgKHZhciBtIGluIG1hcFBhcmFtT2JqKSB7CiAgICAgICAgICAgIGlmIChwaWQgPT0gbSkgewogICAgICAgICAgICAgIGRlZmF1bHRQVmFsdWUgPSBtYXBQYXJhbU9ialttXTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgbWFwUGFyYW0gPSBKU09OLnN0cmluZ2lmeShtYXBQYXJhbU9iaik7CiAgICAgICAgICBtYXBQYXJhbSA9IG1hcFBhcmFtLnN1YnN0cmluZygxLCBtYXBQYXJhbS5sZW5ndGggLSAxKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdmFyIHJlcXVlc3RUeXBlID0gY3VzdG9tRGlhbG9nLmRzVHlwZSA9PSAnZGF0YVNvdXJjZScgPyAnR0VUJyA6IGN1c3RvbURpYWxvZy5yZXF1ZXN0VHlwZSA/IGN1c3RvbURpYWxvZy5yZXF1ZXN0VHlwZSA6ICdQT1NUJzsKICAgICAgdmFyIHVybCA9ICcke2Zvcm19L2Zvcm0vY3VzdG9tRGlhbG9nL3YxL2dldFRyZWVEYXRhP2FsaWFzPScgKyBwYWdlUGFyYW0uYWxpYXMgKyAnJm1hcFBhcmFtPScgKyBtYXBQYXJhbTsKICAgICAgdmFyIHBhcmFtc09iaiA9IHt9OwogICAgICBpZiAoY3VzdG9tRGlhbG9nLmRzVHlwZSAhPSAnZGF0YVNvdXJjZScpIHsKICAgICAgICB1cmwgPSBjdXN0b21EaWFsb2cudXJsOwogICAgICAgIHZhciB0ZW1wbGF0ZVBhID0gY3VzdG9tRGlhbG9nLmRhdGFQYXJhbTsKICAgICAgICBpZiAoY3VzdG9tRGlhbG9nLmNvbmRpdGlvbmZpZWxkKSB7CiAgICAgICAgICB2YXIgY29uZGl0aW9ucyA9IEpTT04ucGFyc2UoY3VzdG9tRGlhbG9nLmNvbmRpdGlvbmZpZWxkKTsKICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29uZGl0aW9ucy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB2YXIgY29uID0gY29uZGl0aW9uc1tpXTsKICAgICAgICAgICAgaWYgKHJlcXVlc3RUeXBlID09ICdQT1NUJykgewogICAgICAgICAgICAgIGlmICh0ZW1wbGF0ZVBhKSB7CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZVBhID0gdGVtcGxhdGVQYS5yZXBsYWNlKG5ldyBSZWdFeHAoJ1xceycgKyBjb24uZmllbGQgKyAnXFx9JywgJ2cnKSwgY29uLmRlZmF1bHRWYWx1ZSk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHBhcmFtc09ialtjb24uZmllbGRdID0gY29uLmRlZmF1bHRWYWx1ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdmFyIGxqQ2hhciA9IHVybC5pbmRleE9mKCc/JykgPT0gLTEgPyAnPycgOiAnJic7CiAgICAgICAgICAgICAgdXJsID0gdXJsICsgbGpDaGFyICsgY29uLmZpZWxkICsgJz0nICsgY29uLmRlZmF1bHRWYWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKHRlbXBsYXRlUGEpIHsKICAgICAgICAgICAgcGFyYW1zT2JqID0gSlNPTi5wYXJzZSh0ZW1wbGF0ZVBhKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgdmFyIHJlcXVlc3RQYXJhbXMgPSB7fTsKICAgICAgcmVxdWVzdFBhcmFtcy5yZXF1ZXN0VHlwZSA9IHJlcXVlc3RUeXBlOwogICAgICByZXF1ZXN0UGFyYW1zLnVybCA9IHVybDsKICAgICAgcmVxdWVzdFBhcmFtcy5wYXJhbXNPYmogPSBwYXJhbXNPYmo7CiAgICAgIHRoaXMuc2VhcmNoVHJlZShyZXF1ZXN0UGFyYW1zLCBkZWZhdWx0UFZhbHVlKTsKICAgICAgdGhpcy5jdXN0b21EaWFsb2dTaG93VHJlZSA9IHRydWU7CiAgICB9LAogICAgLy/moJHlvaLmn6Xor6IKICAgIHNlYXJjaFRyZWU6IGZ1bmN0aW9uIHNlYXJjaFRyZWUocmVxdWVzdFBhcmFtcywgZGVmYXVsdFBWYWx1ZSkgewogICAgICB2YXIgdGhpc18gPSB0aGlzOwogICAgICB2YXIgcXVlcnkgPSByZXF1ZXN0UGFyYW1zLnJlcXVlc3RUeXBlID09ICdQT1NUJyA/IHJlcS5wb3N0KHJlcXVlc3RQYXJhbXMudXJsLCByZXF1ZXN0UGFyYW1zLnBhcmFtc09iaikgOiByZXEuZ2V0KHJlcXVlc3RQYXJhbXMudXJsKTsKICAgICAgcXVlcnkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICAvL+aYvuekuuWtl+autemFjee9rgogICAgICAgIHZhciBkaXNwbGF5ZmllbGQgPSBKU09OLnBhcnNlKHRoaXNfLmN1c3RvbURpYWxvZy5kaXNwbGF5ZmllbGQpOwogICAgICAgIHRoaXNfLmRpc3BsYXlGaWVsZCA9IGRpc3BsYXlmaWVsZDsKICAgICAgICAvL+aKiuWvueivneahhumFjee9rueahOaYvuekuuWtl+auteaYvuekuuWQjeensOi1i+WAvOe7meagkeW9oueahOaYvuekuuWAvAogICAgICAgIHRoaXNfLmRlZmF1bHRQcm9wcy5sYWJlbCA9IGRpc3BsYXlmaWVsZC5kaXNwbGF5TmFtZTsKICAgICAgICB0aGlzXy50cmVlTGlzdCA9IHJlc3BvbnNlLmRhdGE7CiAgICAgICAgLy/lvpfliLDopoHliqDovb3moJHnmoTkv6Hmga8KICAgICAgICBpZiAoZGVmYXVsdFBWYWx1ZSkgewogICAgICAgICAgZGlzcGxheWZpZWxkLnB2YWx1ZSA9IGRlZmF1bHRQVmFsdWU7CiAgICAgICAgfQogICAgICAgIHRoaXNfLnByb3BzMSA9IHRoaXNfLnRvVHJlZURhdGEocmVzcG9uc2UuZGF0YSwgZGlzcGxheWZpZWxkLmlkLCBkaXNwbGF5ZmllbGQucGlkLCBkaXNwbGF5ZmllbGQuZGlzcGxheU5hbWUsIGRpc3BsYXlmaWVsZC5wdmFsdWUgPyBkaXNwbGF5ZmllbGQucHZhbHVlIDogMCk7CiAgICAgIH0pOwogICAgfSwKICAgIC8v5Yqg6L295qCR55qE5L+h5oGvCiAgICB0b1RyZWVEYXRhOiBmdW5jdGlvbiB0b1RyZWVEYXRhKGRhdGEsIGlkLCBwaWQsIG5hbWUsIHB2YWx1ZSkgewogICAgICAvLyDlu7rnq4vkuKrmoJHlvaLnu5PmnoQs6ZyA6KaB5a6a5LmJ5Liq5pyA6aG25bGC55qE54i26IqC54K577yMcHZhbHVl5pivMAogICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVEYXRhVG9UcmVlKGRhdGEsIHBpZCwgaWQsIG5hbWUsIHB2YWx1ZSk7CiAgICB9LAogICAgdHJhbnNsYXRlRGF0YVRvVHJlZTogZnVuY3Rpb24gdHJhbnNsYXRlRGF0YVRvVHJlZShkYXRhLCBwaWQsIGlkLCBuYW1lLCBwdmFsdWUpIHsKICAgICAgLy/miormoJHmlbDmja7mnInlrZDoioLngrnnmoTmlbDmja7lhajpg6jov4fmu6TmjonvvIjlj6rnlZnniLboioLngrnnmoTmlbDmja7vvIkKICAgICAgdmFyIHBhcmVudHMgPSBkYXRhLmZpbHRlcihmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgICByZXR1cm4gdmFsdWVbaWRdID09IHZhbHVlW3BpZF0gfHwgdmFsdWVbcGlkXSA9PSBudWxsIHx8IHZhbHVlW3BpZF0gPT0gcHZhbHVlOwogICAgICB9KTsKICAgICAgaWYgKCFwYXJlbnRzKSB7CiAgICAgICAgcGFyZW50cyA9IGRhdGEuZmlsdGVyKGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgICAgcmV0dXJuIHZhbHVlW3BpZF0gIT09ICd1bmRlZmluZWQnICYmIHZhbHVlW3BpZF0gIT0gbnVsbCAmJiB2YWx1ZVtpZF0gIT0gdmFsdWVbcGlkXTsKICAgICAgICB9KTsKICAgICAgfQogICAgICByZXR1cm4gcGFyZW50czsKICAgIH0sCiAgICBsb2FkVHJlZTogZnVuY3Rpb24gbG9hZFRyZWUobm9kZSwgcmVzb2x2ZSkgewogICAgICB2YXIgX3RoaXMxMSA9IHRoaXM7CiAgICAgIGlmIChub2RlKSB7CiAgICAgICAgdmFyIHRoaXNfID0gdGhpczsKICAgICAgICB2YXIgZGlzcGxheUZpZWxkID0gdGhpc18uY3VzdG9tRGlhbG9nLnN0eWxlID09IDIgPyB0aGlzXy5jb21iaVRyZWVEaXNwbGF5RmllbGQgOiB0aGlzXy5kaXNwbGF5RmllbGQ7CiAgICAgICAgcmVzb2x2ZSh0aGlzLnRyZWVMaXN0LmZpbHRlcihmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgICAgIHJldHVybiB2YWx1ZVtkaXNwbGF5RmllbGQucGlkXSA9PT0gbm9kZS5kYXRhW2Rpc3BsYXlGaWVsZC5pZF07CiAgICAgICAgfSkpOwogICAgICAgIGlmICh0aGlzLnNob3dEYXRhICYmIHRoaXMuc2hvd0RhdGEubGVuZ3RoID4gMCkgewogICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIF90aGlzMTEuc2hvd0RhdGEuZm9yRWFjaChmdW5jdGlvbiAodikgewogICAgICAgICAgICAgIGlmICh2LlBpZCA9PSBub2RlLmtleSkgewogICAgICAgICAgICAgICAgdGhpc18uJHJlZnMudHJlZS5zZXRDaGVja2VkKHYsIHRydWUpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzXy5jaGVja05vZGUodiwgdGhpc18pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICB9LCA0MDApOwogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIGFmdGVyT3BlbjogZnVuY3Rpb24gYWZ0ZXJPcGVuKCkgewogICAgICAvL+aJk+W8gOWvueivneahhuS5i+WQjuWKoOi9veagkQogICAgICB0aGlzLmxvYWRDb21iaW5hdGlvblRyZWUoKTsKICAgIH0sCiAgICBsb2FkQ29tYmluYXRpb25UcmVlOiBmdW5jdGlvbiBsb2FkQ29tYmluYXRpb25UcmVlKCkgewogICAgICB2YXIgX3RoaXMxMiA9IHRoaXM7CiAgICAgIGlmICh0aGlzLmN1c3RvbURpYWxvZy5zdHlsZSAhPSAyKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHZhciBjb21iaW5hdGlvblJ1bGUgPSBKU09OLnBhcnNlKHRoaXMuY3VzdG9tRGlhbG9nLmNvbWJpbmF0aW9uUnVsZSk7CiAgICAgIHRoaXMuY29tYmluYXRpb25SdWxlID0gY29tYmluYXRpb25SdWxlOwogICAgICB2YXIgdHJlZUFsaWFzID0gY29tYmluYXRpb25SdWxlLmxlZnRUcmVlOwogICAgICAvL+iOt+WPluWvueivneahhuaVsOaNrgogICAgICByZXEuZ2V0KCcke2Zvcm19L2Zvcm0vY3VzdG9tRGlhbG9nL3YxL2dldEJ5QWxpYXM/YWxpYXM9JyArIHRyZWVBbGlhcykudGhlbihmdW5jdGlvbiAocmVzcCkgewogICAgICAgIHZhciB0cmVlRGlhbG9nID0gcmVzcC5kYXRhOwogICAgICAgIF90aGlzMTIubGVmdFRyZWVUaXRsZSA9IHRyZWVEaWFsb2cubmFtZTsKICAgICAgICB2YXIgcmVxUGFyYW0gPSB7fTsKICAgICAgICB2YXIgcmVxdWVzdFR5cGUgPSB0cmVlRGlhbG9nLmRzVHlwZSA9PSAnZGF0YVNvdXJjZScgPyAnR0VUJyA6IHRyZWVEaWFsb2cucmVxdWVzdFR5cGUgPyB0cmVlRGlhbG9nLnJlcXVlc3RUeXBlIDogJ1BPU1QnOwogICAgICAgIHZhciB1cmwgPSAnJHtmb3JtfS9mb3JtL2N1c3RvbURpYWxvZy92MS9nZXRUcmVlRGF0YT9hbGlhcz0nICsgdHJlZUFsaWFzICsgIiZtYXBQYXJhbT0iOwogICAgICAgIHZhciBwYXJhbXNPYmogPSB7fTsKICAgICAgICBpZiAodHJlZURpYWxvZy5kc1R5cGUgIT0gJ2RhdGFTb3VyY2UnKSB7CiAgICAgICAgICB1cmwgPSB0cmVlRGlhbG9nLnVybDsKICAgICAgICAgIHZhciB0ZW1wbGF0ZVBhID0gdHJlZURpYWxvZy5kYXRhUGFyYW07CiAgICAgICAgICBpZiAodHJlZURpYWxvZy5jb25kaXRpb25maWVsZCkgewogICAgICAgICAgICB2YXIgY29uZGl0aW9ucyA9IEpTT04ucGFyc2UodHJlZURpYWxvZy5jb25kaXRpb25maWVsZCk7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29uZGl0aW9ucy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgIHZhciBjb24gPSBjb25kaXRpb25zW2ldOwogICAgICAgICAgICAgIGlmIChyZXF1ZXN0VHlwZSA9PSAnUE9TVCcpIHsKICAgICAgICAgICAgICAgIGlmICh0ZW1wbGF0ZVBhKSB7CiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUGEgPSB0ZW1wbGF0ZVBhLnJlcGxhY2UobmV3IFJlZ0V4cCgnXFx7JyArIGNvbi5maWVsZCArICdcXH0nLCAnZycpLCBjb24uZGVmYXVsdFZhbHVlKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIHBhcmFtc09ialtjb24uZmllbGRdID0gY29uLmRlZmF1bHRWYWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdmFyIGxqQ2hhciA9IHVybC5pbmRleE9mKCc/JykgPT0gLTEgPyAnPycgOiAnJic7CiAgICAgICAgICAgICAgICB1cmwgPSB1cmwgKyBsakNoYXIgKyBjb24uZmllbGQgKyAnPScgKyBjb24uZGVmYXVsdFZhbHVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGVtcGxhdGVQYSkgewogICAgICAgICAgICAgIHBhcmFtc09iaiA9IEpTT04ucGFyc2UodGVtcGxhdGVQYSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdmFyIHJlcXVlc3RQYXJhbXMgPSB7fTsKICAgICAgICByZXF1ZXN0UGFyYW1zLnJlcXVlc3RUeXBlID0gcmVxdWVzdFR5cGU7CiAgICAgICAgcmVxdWVzdFBhcmFtcy51cmwgPSB1cmw7CiAgICAgICAgcmVxdWVzdFBhcmFtcy5wYXJhbXNPYmogPSBwYXJhbXNPYmo7CiAgICAgICAgX3RoaXMxMi4kc3RvcmUuZGlzcGF0Y2goJ2RpYWxvZy9nZXRUcmVlRGF0YScsIHJlcXVlc3RQYXJhbXMpLnRoZW4oZnVuY3Rpb24gKHJlc3ApIHsKICAgICAgICAgIGlmICh0cmVlRGlhbG9nLmRpc3BsYXlmaWVsZCAmJiB0cmVlRGlhbG9nLnJlc3VsdGZpZWxkKSB7CiAgICAgICAgICAgIHZhciBkaXNwbGF5RmllbGQgPSBKU09OLnBhcnNlKHRyZWVEaWFsb2cuZGlzcGxheWZpZWxkKTsKICAgICAgICAgICAgdmFyIHJlc3VsdGZpZWxkID0gSlNPTi5wYXJzZSh0cmVlRGlhbG9nLnJlc3VsdGZpZWxkKTsKICAgICAgICAgICAgX3RoaXMxMi5kZWZhdWx0UHJvcHMubGFiZWwgPSBkaXNwbGF5RmllbGQuZGlzcGxheU5hbWU7CiAgICAgICAgICAgIF90aGlzMTIudHJlZUxpc3QgPSByZXNwOwogICAgICAgICAgICBfdGhpczEyLmNvbWJpVHJlZURpc3BsYXlGaWVsZCA9IGRpc3BsYXlGaWVsZDsKICAgICAgICAgICAgX3RoaXMxMi5jb21iaW5hdGlvblRyZWVEYXRhID0gX3RoaXMxMi50b1RyZWVEYXRhKHJlc3AsIGRpc3BsYXlGaWVsZC5pZCwgZGlzcGxheUZpZWxkLnBpZCwgZGlzcGxheUZpZWxkLmRpc3BsYXlOYW1lLCBkaXNwbGF5RmllbGQucHZhbHVlID8gZGlzcGxheUZpZWxkLnB2YWx1ZSA6ICcwJywgcmVzdWx0ZmllbGQpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9KTsKICAgIH0sCiAgICBjb21iaVRyZWVDbGljazogZnVuY3Rpb24gY29tYmlUcmVlQ2xpY2socGFyYW1PYmosIG5vZGUsIG5vZGVDb21wb25lbnQpIHsKICAgICAgLy/nu4TlkIjlr7nor53moYbngrnlh7vlt6bmoJEKICAgICAgLy/muIXnqbrml6fnmoQKICAgICAgdGhpcy5jb21iaW5hdGlvblRyZWVRdWVyeXMuc3BsaWNlKDApOwogICAgICB2YXIgY29tYmluYXRpb25SdWxlID0gSlNPTi5wYXJzZSh0aGlzLmN1c3RvbURpYWxvZy5jb21iaW5hdGlvblJ1bGUpOwogICAgICBpZiAoIWNvbWJpbmF0aW9uUnVsZS5ydWxlcyB8fCBjb21iaW5hdGlvblJ1bGUucnVsZXMubGVuZ3RoID09IDApIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdmFyIHJ1bGVzID0gY29tYmluYXRpb25SdWxlLnJ1bGVzOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJ1bGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIHZhbHVlID0gcGFyYW1PYmpbcnVsZXNbaV0udHJlZUZpZWxkXTsKICAgICAgICB2YXIgcHJvcGVydHkgPSBydWxlc1tpXS5saXN0RmllbGQ7CiAgICAgICAgdGhpcy5jb21iaW5hdGlvblRyZWVRdWVyeXMucHVzaCh7CiAgICAgICAgICBwcm9wZXJ0eTogcHJvcGVydHksCiAgICAgICAgICB2YWx1ZTogdmFsdWUsCiAgICAgICAgICBncm91cDogInRyZWVHcm91cCIsCiAgICAgICAgICBvcGVyYXRpb246IHRoaXMuZ2V0T3BlcmF0aW9uKHJ1bGVzW2ldLmNvbmRpdGlvbiksCiAgICAgICAgICByZWxhdGlvbjogIkFORCIKICAgICAgICB9KTsKICAgICAgfQogICAgICB0aGlzLnNlYXJjaCgpOwogICAgfSwKICAgIC8v6I635Y+W6L+Q566X56ym5Y+3CiAgICBnZXRPcGVyYXRpb246IGZ1bmN0aW9uIGdldE9wZXJhdGlvbihvbGQpIHsKICAgICAgaWYgKCFvbGQpIHsKICAgICAgICByZXR1cm4gIiI7CiAgICAgIH0KICAgICAgaWYgKG9sZCA9PSAiRVEiKSB7CiAgICAgICAgcmV0dXJuICJFUVVBTCI7CiAgICAgIH0KICAgICAgaWYgKG9sZCA9PSAiTEsiKSB7CiAgICAgICAgcmV0dXJuICJMSUtFIjsKICAgICAgfQogICAgICBpZiAob2xkID09ICJMRksiKSB7CiAgICAgICAgcmV0dXJuICJMSUtFIjsKICAgICAgfQogICAgICBpZiAob2xkID09ICJJTiIpIHsKICAgICAgICByZXR1cm4gIklOIjsKICAgICAgfQogICAgfSwKICAgIHRvZ2dsZVRyZWU6IGZ1bmN0aW9uIHRvZ2dsZVRyZWUoKSB7CiAgICAgIGlmICh0aGlzLnRyZWVTaG93KSB7CiAgICAgICAgdGhpcy50cmVlU2hvdyA9IGZhbHNlOwogICAgICAgIHRoaXMudHJhbnN0aW9uV2lkdGggPSAiMCUiOwogICAgICAgIHRoaXMudG9nZ2xlQnRuID0gImVsLWljb24tYXJyb3ctcmlnaHQiOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMudHJlZVNob3cgPSB0cnVlOwogICAgICAgIHRoaXMudHJhbnN0aW9uV2lkdGggPSAiMjUlIjsKICAgICAgICB0aGlzLnRvZ2dsZUJ0biA9ICJlbC1pY29uLWFycm93LWxlZnQiOwogICAgICB9CiAgICB9CiAgfQp9Ow=="},null]}