{"remainingRequest":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\thread-loader\\dist\\cjs.js!D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\babel-loader\\lib\\index.js!D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\@vue\\cli-plugin-eslint\\node_modules\\eslint-loader\\index.js??ref--13-0!D:\\jenkins\\workspace\\dataShare-fvue\\src\\store\\storeProcess.js","dependencies":[{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\src\\store\\storeProcess.js","mtime":1733309212454},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\babel.config.js","mtime":1733906004399},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\thread-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\babel-loader\\lib\\index.js","mtime":456789000000},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\@vue\\cli-plugin-eslint\\node_modules\\eslint-loader\\index.js","mtime":499162500000}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:aW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tICJEOi9qZW5raW5zL3dvcmtzcGFjZS9kYXRhU2hhcmUtZnZ1ZS9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXkuanMiOwppbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tICJEOi9qZW5raW5zL3dvcmtzcGFjZS9kYXRhU2hhcmUtZnZ1ZS9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMi5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5Lm1hcC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnB1c2guanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5zcGxpY2UuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5pdGVyYXRvci5jb25zdHJ1Y3Rvci5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLml0ZXJhdG9yLmZvci1lYWNoLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuaXRlcmF0b3IubWFwLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuanNvbi5zdHJpbmdpZnkuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3Qua2V5cy5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmcuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLmZvci1lYWNoLmpzIjsKaW1wb3J0IHByb2Nlc3MgZnJvbSAiQC9hcGkvcHJvY2Vzcy5qcyI7CmltcG9ydCB7IE1lc3NhZ2UgfSBmcm9tICdlbGVtZW50LXVpJzsKaW1wb3J0IHsgTG9hZGluZyB9IGZyb20gImVsZW1lbnQtdWkiOwp2YXIgc3RhdGUgPSB7CiAgcGFnaW5hdGlvbjoge30sCiAgLy/liIbpobXlj4LmlbAKICByb3dzOiBbXSwKICAvL+WIl+ihqOaVsOaNrgogIHRvdGFsOiAwLAogIC8v5YiX6KGo5pWw5o2u5oC75p2h5pWwCiAgdHJlZTogW10sCiAgLy/mtYHnqIvliIbnsbvmlbDmja4KICByb3dzQnRuOiBbXSwKICAvL+aTjeS9nOaMiemSrgogIGFwcHJvdmFsSXRlbTogW10sCiAgLy/lrqHmibnluLjnlKjor60KICBvcGluaW9uczogW10sCiAgLy/lrqHmibnorrDlvZUKICBub2RlczogW10sCiAgLy/ku7vliqHoioLngrkKICBjaGVja2VkTm9kZXM6IFtdLAogIC8v6Lef6Liq5LqG55qE5Lu75Yqh6IqC54K5CiAgYnBtRXhlU3RhY2tzVXNlck5vZGU6IFtdLAogIC8v5Y+v6amz5Zue55qE5Lu75Yqh6IqC54K5CiAgcmVsYXRlZEluZm9ybWF0aW9uOiB7fSwKICAvL+ebuOWFs+S/oeaBrwogIGR1ZVRpbWU6IHt9LAogIC8v5Lu75Yqh5bu25pyf5raI5oGvCiAgbmV4dEV4ZWN1dG9yOiBudWxsLAogIC8vIOmhuuW6j+etvue9siDkuIvkuIDmraXmiafooYzkuroKICBmb3JjZUxvY2s6IGZhbHNlLAogIC8v5piv5ZCm5by65Yi2562+5pS2CiAgc2lnbmF0dXJlQ29uZmlnOiB7CiAgICBzdGF0dXM6ICdkaXNhYmxlJywKICAgIGZpZWxkOiAnJywKICAgIGlzQ292ZXI6IGZhbHNlLAogICAgc2VjcmV0RnJlZTogZmFsc2UsCiAgICBwYXNzd29yZDogJycKICB9IC8v562+56ug6YWN572uIHN0YXR1czpkaXNhYmxlKOacquWQr+eUqCnvvIxzdGFydO+8iOW8gOWni++8ie+8jGluZyjov5vooYzkuK0p77yMc3VjY2VzcyjmiJDlip8p77yMZmFpbCjlpLHotKUpCn07CnZhciBnZXR0ZXJzID0ge307CnZhciBhY3Rpb25zID0gewogIC8v5pu05paw5q+P6aG15LiL5ouJ5pi+56S65pWw5o2uCiAgc2V0UGFnaW5hdGlvblNpemU6IGZ1bmN0aW9uIHNldFBhZ2luYXRpb25TaXplKF9yZWYsIHNpemUpIHsKICAgIHZhciBjb21taXQgPSBfcmVmLmNvbW1pdCwKICAgICAgc3RhdGUgPSBfcmVmLnN0YXRlOwogICAgY29tbWl0KCJzZXRQYWdpbmF0aW9uU2l6ZSIsIHNpemUpOwogIH0sCiAgLy/mm7TmlrDnrKzlh6DpobUKICBzZXRQYWdpbmF0aW9uUGFnZU51bTogZnVuY3Rpb24gc2V0UGFnaW5hdGlvblBhZ2VOdW0oX3JlZjIsIGN1cnJlbnRQYWdlKSB7CiAgICB2YXIgY29tbWl0ID0gX3JlZjIuY29tbWl0LAogICAgICBzdGF0ZSA9IF9yZWYyLnN0YXRlOwogICAgY29tbWl0KCJzZXRQYWdpbmF0aW9uUGFnZU51bSIsIGN1cnJlbnRQYWdlKTsKICB9LAogIC8v6I635Y+W5rWB56iL5YiG57G75YiX6KGoCiAgZ2V0Rmxvd1RyZWU6IGZ1bmN0aW9uIGdldEZsb3dUcmVlKF9yZWYzKSB7CiAgICB2YXIgY29tbWl0ID0gX3JlZjMuY29tbWl0LAogICAgICBzdGF0ZSA9IF9yZWYzLnN0YXRlOwogICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgcHJvY2Vzcy5nZXRGbG93VHJlZShmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICByZXNvbHZlKHJlc3BvbnNlLmRhdGEpOwogICAgICAgIGNvbW1pdCgic2V0Rmxvd1RyZWVzIiwgcmVzcG9uc2UuZGF0YSk7CiAgICAgIH0pOwogICAgfSk7CiAgfSwKICAvL+iOt+WPluW+heWKnuWIl+ihqAogIGdldFRvZG9CeVBhZ2luYXRpb246IGZ1bmN0aW9uIGdldFRvZG9CeVBhZ2luYXRpb24oX3JlZjQsIHBhZ2luYXRpb24pIHsKICAgIHZhciBjb21taXQgPSBfcmVmNC5jb21taXQsCiAgICAgIHN0YXRlID0gX3JlZjQuc3RhdGU7CiAgICBjb21taXQoImNsZWFyTGlzdERhdGEiKTsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIHByb2Nlc3MuZ2V0VG9kb0J5UGFnaW5hdGlvbihwYWdpbmF0aW9uLCBmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICBjb21taXQoInNldFJvd3MiLCByZXNwb25zZS5kYXRhLnJvd3MpOyAvL+W+heWKnuaVsOaNrgogICAgICAgIGNvbW1pdCgic2V0VG90YWwiLCByZXNwb25zZS5kYXRhLnRvdGFsKTsgLy/mgLvmlbDmja7mnaHmlbAKICAgICAgICB2YXIgcGFnZUJlYW4gPSB7CiAgICAgICAgICAicGFnZSI6IHJlc3BvbnNlLmRhdGEucGFnZSwKICAgICAgICAgICJwYWdlU2l6ZSI6IHJlc3BvbnNlLmRhdGEucGFnZVNpemUsCiAgICAgICAgICAic2hvd1RvdGFsIjogInRydWUiCiAgICAgICAgfTsgLy/mjqXlj6Pmlrnms5Xov5Tlm57nmoRwYWdlQmVhbgogICAgICAgIGNvbW1pdCgic2V0UGFnaW5hdGlvbiIsIHBhZ2VCZWFuKTsgLy/mmL7npLrnrKzlh6DpobXvvIzmr4/pobXmmL7npLrlpJrlsJHmnaEKICAgICAgICByZXNvbHZlKHJlc3BvbnNlLmRhdGEucm93cyk7CiAgICAgIH0pOwogICAgfSk7CiAgfSwKICAvL+iOt+WPlumihuWvvOW+heWKnuWIl+ihqAogIGdldExlYWRlclRvZG9CeVBhZ2luYXRpb246IGZ1bmN0aW9uIGdldExlYWRlclRvZG9CeVBhZ2luYXRpb24oX3JlZjUsIHBhZ2luYXRpb24pIHsKICAgIHZhciBjb21taXQgPSBfcmVmNS5jb21taXQsCiAgICAgIHN0YXRlID0gX3JlZjUuc3RhdGU7CiAgICBjb21taXQoImNsZWFyTGlzdERhdGEiKTsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIHByb2Nlc3MuZ2V0TGVhZGVyVG9kb0J5UGFnaW5hdGlvbihwYWdpbmF0aW9uLCBmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICBjb21taXQoInNldFJvd3MiLCByZXNwb25zZS5kYXRhLnJvd3MpOyAvL+W+heWKnuaVsOaNrgogICAgICAgIGNvbW1pdCgic2V0VG90YWwiLCByZXNwb25zZS5kYXRhLnRvdGFsKTsgLy/mgLvmlbDmja7mnaHmlbAKICAgICAgICB2YXIgcGFnZUJlYW4gPSB7CiAgICAgICAgICAicGFnZSI6IHJlc3BvbnNlLmRhdGEucGFnZSwKICAgICAgICAgICJwYWdlU2l6ZSI6IHJlc3BvbnNlLmRhdGEucGFnZVNpemUsCiAgICAgICAgICAic2hvd1RvdGFsIjogInRydWUiCiAgICAgICAgfTsgLy/mjqXlj6Pmlrnms5Xov5Tlm57nmoRwYWdlQmVhbgogICAgICAgIGNvbW1pdCgic2V0UGFnaW5hdGlvbiIsIHBhZ2VCZWFuKTsgLy/mmL7npLrnrKzlh6DpobXvvIzmr4/pobXmmL7npLrlpJrlsJHmnaEKICAgICAgICByZXNvbHZlKHJlc3BvbnNlLmRhdGEpOwogICAgICB9KTsKICAgIH0pOwogIH0sCiAgLy/ojrflj5bmiJHovazlip7nmoTliJfooagKICBnZXREZWxlZ2F0ZTogZnVuY3Rpb24gZ2V0RGVsZWdhdGUoX3JlZjYsIHBhZ2luYXRpb24pIHsKICAgIHZhciBjb21taXQgPSBfcmVmNi5jb21taXQsCiAgICAgIHN0YXRlID0gX3JlZjYuc3RhdGU7CiAgICBjb21taXQoImNsZWFyTGlzdERhdGEiKTsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIHByb2Nlc3MuZ2V0RGVsZWdhdGUocGFnaW5hdGlvbiwgZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgY29tbWl0KCJzZXRSb3dzIiwgcmVzcG9uc2UuZGF0YS5yb3dzKTsgLy/lvoXlip7mlbDmja4KICAgICAgICBjb21taXQoInNldFRvdGFsIiwgcmVzcG9uc2UuZGF0YS50b3RhbCk7IC8v5oC75pWw5o2u5p2h5pWwCiAgICAgICAgdmFyIHBhZ2VCZWFuID0gewogICAgICAgICAgInBhZ2UiOiByZXNwb25zZS5kYXRhLnBhZ2UsCiAgICAgICAgICAicGFnZVNpemUiOiByZXNwb25zZS5kYXRhLnBhZ2VTaXplLAogICAgICAgICAgInNob3dUb3RhbCI6ICJ0cnVlIgogICAgICAgIH07IC8v5o6l5Y+j5pa55rOV6L+U5Zue55qEcGFnZUJlYW4KICAgICAgICBjb21taXQoInNldFBhZ2luYXRpb24iLCBwYWdlQmVhbik7IC8v5pi+56S656ys5Yeg6aG177yM5q+P6aG15pi+56S65aSa5bCR5p2hCiAgICAgICAgcmVzb2x2ZShyZXNwb25zZS5kYXRhLnJvd3MpOwogICAgICB9KTsKICAgIH0pOwogIH0sCiAgLy/ojrflj5bmiJHkvKDpmIXnmoTku7vliqHliJfooagKICBnZXRNeU5vdGljZVJlYWRMaXN0OiBmdW5jdGlvbiBnZXRNeU5vdGljZVJlYWRMaXN0KF9yZWY3LCBwYWdpbmF0aW9uKSB7CiAgICB2YXIgY29tbWl0ID0gX3JlZjcuY29tbWl0LAogICAgICBzdGF0ZSA9IF9yZWY3LnN0YXRlOwogICAgY29tbWl0KCJjbGVhckxpc3REYXRhIik7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICBwcm9jZXNzLmdldE15Tm90aWNlUmVhZExpc3QocGFnaW5hdGlvbiwgZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgY29tbWl0KCJzZXRSb3dzIiwgcmVzcG9uc2UuZGF0YS5yb3dzKTsgLy/lvoXlip7mlbDmja4KICAgICAgICBjb21taXQoInNldFRvdGFsIiwgcmVzcG9uc2UuZGF0YS50b3RhbCk7IC8v5oC75pWw5o2u5p2h5pWwCiAgICAgICAgdmFyIHBhZ2VCZWFuID0gewogICAgICAgICAgInBhZ2UiOiByZXNwb25zZS5kYXRhLnBhZ2UsCiAgICAgICAgICAicGFnZVNpemUiOiByZXNwb25zZS5kYXRhLnBhZ2VTaXplLAogICAgICAgICAgInNob3dUb3RhbCI6ICJ0cnVlIgogICAgICAgIH07IC8v5o6l5Y+j5pa55rOV6L+U5Zue55qEcGFnZUJlYW4KICAgICAgICBjb21taXQoInNldFBhZ2luYXRpb24iLCBwYWdlQmVhbik7IC8v5pi+56S656ys5Yeg6aG177yM5q+P6aG15pi+56S65aSa5bCR5p2hCiAgICAgICAgcmVzb2x2ZShyZXNwb25zZS5kYXRhLnJvd3MpOwogICAgICB9KTsKICAgIH0pOwogIH0sCiAgLy/liKDpmaTkvKDpmIXku7vliqEKICBkZWxCcG1UYXNrTm90aWNlQnlJZDogZnVuY3Rpb24gZGVsQnBtVGFza05vdGljZUJ5SWQoX3JlZjgsIGlkKSB7CiAgICB2YXIgY29tbWl0ID0gX3JlZjguY29tbWl0LAogICAgICBzdGF0ZSA9IF9yZWY4LnN0YXRlOwogICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgcHJvY2Vzcy5kZWxCcG1UYXNrTm90aWNlQnlJZChpZCwgZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEuc3RhdGUpIHsKICAgICAgICAgIE1lc3NhZ2Uuc3VjY2Vzcyh7CiAgICAgICAgICAgIGR1cmF0aW9uOiAxNTAwLAogICAgICAgICAgICBtZXNzYWdlOiByZXNwb25zZS5kYXRhLm1lc3NhZ2UsCiAgICAgICAgICAgIG9uQ2xvc2U6IGZ1bmN0aW9uIG9uQ2xvc2UoKSB7CiAgICAgICAgICAgICAgcmVzb2x2ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSk7CiAgfSwKICAvL+iOt+WPluW+hemYheWIl+ihqAogIGdldE5vdGljZVRvZG9SZWFkTGlzdDogZnVuY3Rpb24gZ2V0Tm90aWNlVG9kb1JlYWRMaXN0KF9yZWY5LCBwYWdpbmF0aW9uKSB7CiAgICB2YXIgY29tbWl0ID0gX3JlZjkuY29tbWl0LAogICAgICBzdGF0ZSA9IF9yZWY5LnN0YXRlOwogICAgY29tbWl0KCJjbGVhckxpc3REYXRhIik7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICBwcm9jZXNzLmdldE5vdGljZVRvZG9SZWFkTGlzdChwYWdpbmF0aW9uLCBmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICBjb21taXQoInNldFJvd3MiLCByZXNwb25zZS5kYXRhLnJvd3MpOyAvL+W+heWKnuaVsOaNrgogICAgICAgIGNvbW1pdCgic2V0VG90YWwiLCByZXNwb25zZS5kYXRhLnRvdGFsKTsgLy/mgLvmlbDmja7mnaHmlbAKICAgICAgICB2YXIgcGFnZUJlYW4gPSB7CiAgICAgICAgICAicGFnZSI6IHJlc3BvbnNlLmRhdGEucGFnZSwKICAgICAgICAgICJwYWdlU2l6ZSI6IHJlc3BvbnNlLmRhdGEucGFnZVNpemUsCiAgICAgICAgICAic2hvd1RvdGFsIjogInRydWUiCiAgICAgICAgfTsgLy/mjqXlj6Pmlrnms5Xov5Tlm57nmoRwYWdlQmVhbgogICAgICAgIGNvbW1pdCgic2V0UGFnaW5hdGlvbiIsIHBhZ2VCZWFuKTsgLy/mmL7npLrnrKzlh6DpobXvvIzmr4/pobXmmL7npLrlpJrlsJHmnaEKICAgICAgICByZXNvbHZlKHJlc3BvbnNlLmRhdGEucm93cyk7CiAgICAgIH0pOwogICAgfSk7CiAgfSwKICAvL+iOt+WPluW3sumYheWIl+ihqAogIGdldE5vdGljZURvbmVSZWFkTGlzdDogZnVuY3Rpb24gZ2V0Tm90aWNlRG9uZVJlYWRMaXN0KF9yZWYxMCwgcGFnaW5hdGlvbikgewogICAgdmFyIGNvbW1pdCA9IF9yZWYxMC5jb21taXQsCiAgICAgIHN0YXRlID0gX3JlZjEwLnN0YXRlOwogICAgY29tbWl0KCJjbGVhckxpc3REYXRhIik7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICBwcm9jZXNzLmdldE5vdGljZURvbmVSZWFkTGlzdChwYWdpbmF0aW9uLCBmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICBjb21taXQoInNldFJvd3MiLCByZXNwb25zZS5kYXRhLnJvd3MpOyAvL+W+heWKnuaVsOaNrgogICAgICAgIGNvbW1pdCgic2V0VG90YWwiLCByZXNwb25zZS5kYXRhLnRvdGFsKTsgLy/mgLvmlbDmja7mnaHmlbAKICAgICAgICB2YXIgcGFnZUJlYW4gPSB7CiAgICAgICAgICAicGFnZSI6IHJlc3BvbnNlLmRhdGEucGFnZSwKICAgICAgICAgICJwYWdlU2l6ZSI6IHJlc3BvbnNlLmRhdGEucGFnZVNpemUsCiAgICAgICAgICAic2hvd1RvdGFsIjogInRydWUiCiAgICAgICAgfTsgLy/mjqXlj6Pmlrnms5Xov5Tlm57nmoRwYWdlQmVhbgogICAgICAgIGNvbW1pdCgic2V0UGFnaW5hdGlvbiIsIHBhZ2VCZWFuKTsgLy/mmL7npLrnrKzlh6DpobXvvIzmr4/pobXmmL7npLrlpJrlsJHmnaEKICAgICAgICByZXNvbHZlKHJlc3BvbnNlLmRhdGEucm93cyk7CiAgICAgIH0pOwogICAgfSk7CiAgfSwKICAvL+iOt+WPluW3suWKnuWIl+ihqAogIGdldERvbmVCeVBhZ2luYXRpb246IGZ1bmN0aW9uIGdldERvbmVCeVBhZ2luYXRpb24oX3JlZjExLCBwYWdpbmF0aW9uKSB7CiAgICB2YXIgY29tbWl0ID0gX3JlZjExLmNvbW1pdCwKICAgICAgc3RhdGUgPSBfcmVmMTEuc3RhdGU7CiAgICBjb21taXQoImNsZWFyTGlzdERhdGEiKTsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIHByb2Nlc3MuZ2V0RG9uZUJ5UGFnaW5hdGlvbihwYWdpbmF0aW9uLCBmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICB2YXIgcmV2b2tlRGF0YSA9IFtdOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzcG9uc2UuZGF0YS5yb3dzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBpZiAoIShyZXNwb25zZS5kYXRhLnJvd3NbaV0uc3RhdHVzICE9ICdydW5uaW5nJyB8fCByZXNwb25zZS5kYXRhLnJvd3NbaV0ub3BpbmlvblN0YXR1cyAhPSAnYWdyZWUnKSB8fCByZXNwb25zZS5kYXRhLnJvd3NbaV0ub3BpbmlvblN0YXR1cyA9PSAnaW5xdScpIHsKICAgICAgICAgICAgcmVzcG9uc2UuZGF0YS5yb3dzW2ldLnJldm9rZSA9IHRydWU7CiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcmV2b2tlRGF0YS5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgIGlmIChyZXZva2VEYXRhW2pdLmlkID09IHJlc3BvbnNlLmRhdGEucm93c1tpXS5pZCAmJiByZXZva2VEYXRhW2pdLnRhc2tLZXkgPT0gcmVzcG9uc2UuZGF0YS5yb3dzW2ldLnRhc2tLZXkgJiYgcmVzcG9uc2UuZGF0YS5yb3dzW2ldLnJldm9rZSA9PSB0cnVlKSB7CiAgICAgICAgICAgICAgICByZXNwb25zZS5kYXRhLnJvd3NbaV0ucmV2b2tlID0gZmFsc2U7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldm9rZURhdGEucHVzaChyZXNwb25zZS5kYXRhLnJvd3NbaV0pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmVzcG9uc2UuZGF0YS5yb3dzW2ldLnJldm9rZSA9IGZhbHNlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB2YXIgZGF0YVJvd3MgPSByZXNwb25zZS5kYXRhLnJvd3M7CiAgICAgICAgY29tbWl0KCJzZXRSb3dzIiwgZGF0YVJvd3MpOyAvL+W3suWKnuaVsOaNrgogICAgICAgIGNvbW1pdCgic2V0VG90YWwiLCByZXNwb25zZS5kYXRhLnRvdGFsKTsgLy/mgLvmlbDmja7mnaHmlbAKICAgICAgICB2YXIgcGFnZUJlYW4gPSB7CiAgICAgICAgICAicGFnZSI6IHJlc3BvbnNlLmRhdGEucGFnZSwKICAgICAgICAgICJwYWdlU2l6ZSI6IHJlc3BvbnNlLmRhdGEucGFnZVNpemUsCiAgICAgICAgICAic2hvd1RvdGFsIjogInRydWUiCiAgICAgICAgfTsgLy/mjqXlj6Pmlrnms5Xov5Tlm57nmoRwYWdlQmVhbgogICAgICAgIGNvbW1pdCgic2V0UGFnaW5hdGlvbiIsIHBhZ2VCZWFuKTsgLy/mmL7npLrnrKzlh6DpobXvvIzmr4/pobXmmL7npLrlpJrlsJHmnaEKICAgICAgICByZXNvbHZlKHJlc3BvbnNlLmRhdGEucm93cyk7CiAgICAgIH0pOwogICAgfSk7CiAgfSwKICAvL+iOt+WPluaIkeeahOivt+axguWIl+ihqAogIGdldE15UmVxdWVzdEJ5UGFnaW5hdGlvbjogZnVuY3Rpb24gZ2V0TXlSZXF1ZXN0QnlQYWdpbmF0aW9uKF9yZWYxMiwgcGFnaW5hdGlvbikgewogICAgdmFyIGNvbW1pdCA9IF9yZWYxMi5jb21taXQsCiAgICAgIHN0YXRlID0gX3JlZjEyLnN0YXRlOwogICAgY29tbWl0KCJjbGVhckxpc3REYXRhIik7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICBwcm9jZXNzLmdldE15UmVxdWVzdEJ5UGFnaW5hdGlvbihwYWdpbmF0aW9uLCBmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICBjb21taXQoInNldFJvd3MiLCByZXNwb25zZS5kYXRhLnJvd3MpOyAvL+W+heWKnuaVsOaNrgogICAgICAgIGNvbW1pdCgic2V0VG90YWwiLCByZXNwb25zZS5kYXRhLnRvdGFsKTsgLy/mgLvmlbDmja7mnaHmlbAKICAgICAgICB2YXIgcGFnZUJlYW4gPSB7CiAgICAgICAgICAicGFnZSI6IHJlc3BvbnNlLmRhdGEucGFnZSwKICAgICAgICAgICJwYWdlU2l6ZSI6IHJlc3BvbnNlLmRhdGEucGFnZVNpemUsCiAgICAgICAgICAic2hvd1RvdGFsIjogInRydWUiCiAgICAgICAgfTsgLy/mjqXlj6Pmlrnms5Xov5Tlm57nmoRwYWdlQmVhbgogICAgICAgIGNvbW1pdCgic2V0UGFnaW5hdGlvbiIsIHBhZ2VCZWFuKTsgLy/mmL7npLrnrKzlh6DpobXvvIzmr4/pobXmmL7npLrlpJrlsJHmnaEKICAgICAgICByZXNvbHZlKHJlc3BvbnNlLmRhdGEucm93cyk7CiAgICAgIH0pOwogICAgfSk7CiAgfSwKICAvL+iOt+WPluaWsOW7uua1geeoi+WIl+ihqAogIGdldEZsb3dMaXN0QnlQYWdpbmF0aW9uOiBmdW5jdGlvbiBnZXRGbG93TGlzdEJ5UGFnaW5hdGlvbihfcmVmMTMsIHBhZ2luYXRpb24pIHsKICAgIHZhciBjb21taXQgPSBfcmVmMTMuY29tbWl0LAogICAgICBzdGF0ZSA9IF9yZWYxMy5zdGF0ZTsKICAgIGNvbW1pdCgiY2xlYXJMaXN0RGF0YSIpOwogICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgcHJvY2Vzcy5nZXRGbG93TGlzdEJ5UGFnaW5hdGlvbihwYWdpbmF0aW9uLCBmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICBjb21taXQoInNldFJvd3MiLCByZXNwb25zZS5kYXRhLnJvd3MpOyAvL+W+heWKnuaVsOaNrgogICAgICAgIGNvbW1pdCgic2V0VG90YWwiLCByZXNwb25zZS5kYXRhLnRvdGFsKTsgLy/mgLvmlbDmja7mnaHmlbAKICAgICAgICB2YXIgcGFnZUJlYW4gPSB7CiAgICAgICAgICAicGFnZSI6IHJlc3BvbnNlLmRhdGEucGFnZSwKICAgICAgICAgICJwYWdlU2l6ZSI6IHJlc3BvbnNlLmRhdGEucGFnZVNpemUsCiAgICAgICAgICAic2hvd1RvdGFsIjogInRydWUiCiAgICAgICAgfTsgLy/mjqXlj6Pmlrnms5Xov5Tlm57nmoRwYWdlQmVhbgogICAgICAgIGNvbW1pdCgic2V0UGFnaW5hdGlvbiIsIHBhZ2VCZWFuKTsgLy/mmL7npLrnrKzlh6DpobXvvIzmr4/pobXmmL7npLrlpJrlsJHmnaEKICAgICAgICByZXNvbHZlKHJlc3BvbnNlLmRhdGEucm93cyk7CiAgICAgIH0pOwogICAgfSk7CiAgfSwKICAvL+aSpOWbngogIHJldm9rZUluc3RhbmNlOiBmdW5jdGlvbiByZXZva2VJbnN0YW5jZShfcmVmMTQsIGRhdGEpIHsKICAgIHZhciBjb21taXQgPSBfcmVmMTQuY29tbWl0LAogICAgICBzdGF0ZSA9IF9yZWYxNC5zdGF0ZTsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIHByb2Nlc3MucmV2b2tlSW5zdGFuY2UoZGF0YSwgZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEuc3RhdGUpIHsKICAgICAgICAgIE1lc3NhZ2Uuc3VjY2Vzcyh7CiAgICAgICAgICAgIGR1cmF0aW9uOiAxNTAwLAogICAgICAgICAgICBtZXNzYWdlOiByZXNwb25zZS5kYXRhLm1lc3NhZ2UsCiAgICAgICAgICAgIG9uQ2xvc2U6IGZ1bmN0aW9uIG9uQ2xvc2UoKSB7CiAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZS5kYXRhLnZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0pOwogIH0sCiAgLy/lrqHmibnmn6XnnIvpobXpnaLmkqTlm54KICByZXZva2VJbnN0YW5jZUJ0bjogZnVuY3Rpb24gcmV2b2tlSW5zdGFuY2VCdG4oX3JlZjE1LCBkYXRhLCBpc0hhbmQpIHsKICAgIHZhciBjb21taXQgPSBfcmVmMTUuY29tbWl0LAogICAgICBzdGF0ZSA9IF9yZWYxNS5zdGF0ZTsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIHByb2Nlc3MucmV2b2tlSW5zdGFuY2UoZGF0YSwgZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEuc3RhdGUpIHsKICAgICAgICAgIE1lc3NhZ2Uuc3VjY2Vzcyh7CiAgICAgICAgICAgIGR1cmF0aW9uOiAxNTAwLAogICAgICAgICAgICBtZXNzYWdlOiByZXNwb25zZS5kYXRhLm1lc3NhZ2UsCiAgICAgICAgICAgIG9uQ2xvc2U6IGZ1bmN0aW9uIG9uQ2xvc2UoKSB7CiAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhLmlzSGFuZFJldm9rZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9KTsKICB9LAogIC8v6I635Y+W5a6h5om55pON5L2c5oyJ6ZKuCiAgdGFza0RldGFpbDogZnVuY3Rpb24gdGFza0RldGFpbChfcmVmMTYsIHBhcmFtcykgewogICAgdmFyIGNvbW1pdCA9IF9yZWYxNi5jb21taXQsCiAgICAgIHN0YXRlID0gX3JlZjE2LnN0YXRlOwogICAgcHJvY2Vzcy50YXNrRGV0YWlsKHBhcmFtcywgZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgIHJlc3BvbnNlLmRhdGEuaXNBZGRTaWduID0gcGFyYW1zLmlzQWRkU2lnbjsKICAgICAgY29tbWl0KCJzZXRCdXR0b25Sb3dzIiwgcmVzcG9uc2UuZGF0YSk7CiAgICAgIGNvbW1pdCgic2V0TmV4dEV4ZWN1dG9yIiwgcmVzcG9uc2UuZGF0YS5tYXApOwogICAgfSk7CiAgfSwKICAvL+iOt+WPluWuoeaJueW4uOeUqOivrQogIGdldEFwcHJvdmFsQnlEZWZLZXlBbmRUeXBlSWQ6IGZ1bmN0aW9uIGdldEFwcHJvdmFsQnlEZWZLZXlBbmRUeXBlSWQoX3JlZjE3LCBkZWZLZXkpIHsKICAgIHZhciBjb21taXQgPSBfcmVmMTcuY29tbWl0LAogICAgICBzdGF0ZSA9IF9yZWYxNy5zdGF0ZTsKICAgIHByb2Nlc3MuZ2V0QXBwcm92YWxCeURlZktleUFuZFR5cGVJZChkZWZLZXksIGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICBjb21taXQoInNldEFwcHJvdmFsSXRlbSIsIHJlc3BvbnNlLmRhdGEpOwogICAgfSk7CiAgfSwKICAvL+iOt+WPluWuoeaJueiusOW9lQogIGdldE9waW5pb25zQnlJZDogZnVuY3Rpb24gZ2V0T3BpbmlvbnNCeUlkKF9yZWYxOCwgcGFyYW0pIHsKICAgIHZhciBjb21taXQgPSBfcmVmMTguY29tbWl0LAogICAgICBzdGF0ZSA9IF9yZWYxOC5zdGF0ZTsKICAgIHByb2Nlc3MuZ2V0T3BpbmlvbnNCeUlkKHBhcmFtLCBmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgcmVzcG9uc2UucGFyYW0gPSBwYXJhbTsKICAgICAgY29tbWl0KCJzZXRPcGluaW9ucyIsIHJlc3BvbnNlKTsKICAgIH0pOwogIH0sCiAgLy/ojrflj5blj6/ot5/ouKrnmoTku7vliqHoioLngrkKICB0YXNrTm9kZTogZnVuY3Rpb24gdGFza05vZGUoX3JlZjE5LCBkYXRhKSB7CiAgICB2YXIgY29tbWl0ID0gX3JlZjE5LmNvbW1pdCwKICAgICAgc3RhdGUgPSBfcmVmMTkuc3RhdGU7CiAgICBwcm9jZXNzLnRhc2tOb2RlKGRhdGEuZGVmSWQsIGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICB2YXIgbm9kZXMgPSByZXNwb25zZS5kYXRhLmJwbURlZkxheW91dC5saXN0TGF5b3V0OwogICAgICB2YXIgbm9kZXNDb3B5ID0gW107CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICBpZiAobm9kZXNbaV0ubm9kZVR5cGUgIT0gJ1NUQVJUJyAmJiBub2Rlc1tpXS5ub2RlVHlwZSAhPSAnRU5EJyAmJiBub2Rlc1tpXS5ub2RlVHlwZSAhPSAnSU5DTFVTSVZFR0FURVdBWScgJiYgbm9kZXNbaV0ubm9kZVR5cGUgIT0gJ0VYQ0xVU0lWRUdBVEVXQVknICYmIG5vZGVzW2ldLm5vZGVUeXBlICE9ICdQQVJBTExFTEdBVEVXQVknKSB7CiAgICAgICAgICBub2Rlc0NvcHkucHVzaChfb2JqZWN0U3ByZWFkKHt9LCBub2Rlc1tpXSkpOwogICAgICAgIH0KICAgICAgfQogICAgICBjb21taXQoInNldE5vZGVzIiwgbm9kZXNDb3B5KTsKICAgICAgLy/moLnmja7mtYHnqIvlrp7kvotpZOiOt+WPluW3sui3n+i4queahOiKgueCuQogICAgICBwcm9jZXNzLmdldEZvbGxvd2VkTm9kZShkYXRhLnByb0luc3QsIGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgIHZhciBmb2xsb3dlZE5vZGVJZHMgPSByZXNwb25zZS5kYXRhLnZhbHVlIHx8ICcnOwogICAgICAgIHZhciBjaGVja2VkID0gW107CiAgICAgICAgc3RhdGUubm9kZXMuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkgewogICAgICAgICAgaWYgKGZvbGxvd2VkTm9kZUlkcy5pbmRleE9mKGl0ZW0ubm9kZUlkKSA+IC0xKSB7CiAgICAgICAgICAgIGNoZWNrZWQucHVzaChpdGVtLm5vZGVJZCk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgY29tbWl0KCJzZXRDaGVja2VkTm9kZXMiLCBjaGVja2VkKTsKICAgICAgfSk7CiAgICB9KTsKICB9LAogIC8v6YCJ5oup5Lu75Yqh6IqC54K55pe26YCJ5oup6K+l5aSN6YCJ5qGGCiAgc2V0Q2hlY2tlZFB1c2g6IGZ1bmN0aW9uIHNldENoZWNrZWRQdXNoKF9yZWYyMCwgdmFsdWUpIHsKICAgIHZhciBjb21taXQgPSBfcmVmMjAuY29tbWl0LAogICAgICBzdGF0ZSA9IF9yZWYyMC5zdGF0ZTsKICAgIGNvbW1pdCgic2V0Q2hlY2tlZFB1c2giLCB2YWx1ZSk7CiAgfSwKICBzZXRDaGVja2VkU3BsaWNlOiBmdW5jdGlvbiBzZXRDaGVja2VkU3BsaWNlKF9yZWYyMSwgdmFsdWUpIHsKICAgIHZhciBjb21taXQgPSBfcmVmMjEuY29tbWl0LAogICAgICBzdGF0ZSA9IF9yZWYyMS5zdGF0ZTsKICAgIGNvbW1pdCgic2V0Q2hlY2tlZFNwbGljZSIsIHZhbHVlKTsKICB9LAogIC8v5qC55o2u5Lu75YqhSUTojrflj5bku7vliqHmmI7nu4YKICBnZXRUYXNrQnlJZDogZnVuY3Rpb24gZ2V0VGFza0J5SWQoX3JlZjIyLCBpZCkgewogICAgdmFyIGNvbW1pdCA9IF9yZWYyMi5jb21taXQsCiAgICAgIHN0YXRlID0gX3JlZjIyLnN0YXRlOwogICAgdmFyIGxvYWRpbmcgPSBMb2FkaW5nLnNlcnZpY2UoewogICAgICBmdWxsc2NyZWVuOiB0cnVlLAogICAgICBsb2NrOiB0cnVlLAogICAgICB0ZXh0OiAn6KGo5Y2V5pWw5o2u5Yqg6L295Lit77yM6K+36ICQ5b+D562J5b6FLi4uJywKICAgICAgc3Bpbm5lcjogJ2VsLWljb24tbG9hZGluZycsCiAgICAgIGJhY2tncm91bmQ6ICdyZ2JhKDAsIDAsIDAsIDAuNyknCiAgICB9KTsgLy/lvIDlp4sKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIGxvYWRpbmcuY2xvc2UoKTsgLy8g57uT5p2fCiAgICAgIHByb2Nlc3MuZ2V0VGFza0J5SWQoaWQsIGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgIHJlc29sdmUocmVzcG9uc2UuZGF0YSk7CiAgICAgIH0pOwogICAgfSk7CiAgfSwKICAvL+agueaNruS7u+WKoUlE6I635Y+W5Lu75Yqh5piO57uGCiAgZ2V0Tm90aWNlOiBmdW5jdGlvbiBnZXROb3RpY2UoX3JlZjIzLCBpZCkgewogICAgdmFyIGNvbW1pdCA9IF9yZWYyMy5jb21taXQsCiAgICAgIHN0YXRlID0gX3JlZjIzLnN0YXRlOwogICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgcHJvY2Vzcy5nZXROb3RpY2UoaWQsIGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgIHJlc29sdmUocmVzcG9uc2UuZGF0YSk7CiAgICAgIH0pOwogICAgfSk7CiAgfSwKICAvL+agueaNruWunuS+i2lk6I635Y+W5a6e5L6L5a+56LGhCiAgZ2V0SW5zdGFuY2VCeUluc3RJZDogZnVuY3Rpb24gZ2V0SW5zdGFuY2VCeUluc3RJZChfcmVmMjQsIGlkKSB7CiAgICB2YXIgY29tbWl0ID0gX3JlZjI0LmNvbW1pdCwKICAgICAgc3RhdGUgPSBfcmVmMjQuc3RhdGU7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICBwcm9jZXNzLmdldEluc3RhbmNlQnlJbnN0SWQoaWQsIGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgIHJlc29sdmUocmVzcG9uc2UuZGF0YSk7CiAgICAgIH0pOwogICAgfSk7CiAgfSwKICAvL+agueaNruWunuS+i0lE5Yik5pat5rWB56iL5piv5ZCm57uT5p2fCiAgaXNFbmQ6IGZ1bmN0aW9uIGlzRW5kKF9yZWYyNSwgaWQpIHsKICAgIHZhciBjb21taXQgPSBfcmVmMjUuY29tbWl0LAogICAgICBzdGF0ZSA9IF9yZWYyNS5zdGF0ZTsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIHByb2Nlc3MuaXNFbmQoaWQsIGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgIGlmIChyZXNwb25zZS5kYXRhLnN0YXRlKSB7CiAgICAgICAgICByZXNvbHZlKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJlamVjdCgpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9KTsKICB9LAogIC8v5paw5aKeLOabtOaWsOS7u+WKoei3n+i4quihqOaVsOaNrgogIHRhc2tGb2xsb3dTYXZlOiBmdW5jdGlvbiB0YXNrRm9sbG93U2F2ZShfcmVmMjYsIGRhdGEpIHsKICAgIHZhciBjb21taXQgPSBfcmVmMjYuY29tbWl0LAogICAgICBzdGF0ZSA9IF9yZWYyNi5zdGF0ZTsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIHByb2Nlc3MudGFza0ZvbGxvd1NhdmUoZGF0YSwgZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEuc3RhdGUpIHsKICAgICAgICAgIE1lc3NhZ2Uuc3VjY2Vzcyh7CiAgICAgICAgICAgIGR1cmF0aW9uOiAxNTAwLAogICAgICAgICAgICBtZXNzYWdlOiByZXNwb25zZS5kYXRhLm1lc3NhZ2UsCiAgICAgICAgICAgIG9uQ2xvc2U6IGZ1bmN0aW9uIG9uQ2xvc2UoKSB7CiAgICAgICAgICAgICAgcmVzb2x2ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSk7CiAgfSwKICAvL+mps+Wbnuiuvue9rgogIHRhc2tUb1JlamVjdDogZnVuY3Rpb24gdGFza1RvUmVqZWN0KF9yZWYyNywgZGF0YSkgewogICAgdmFyIGNvbW1pdCA9IF9yZWYyNy5jb21taXQsCiAgICAgIHN0YXRlID0gX3JlZjI3LnN0YXRlOwogICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgcHJvY2Vzcy50YXNrVG9SZWplY3QoZGF0YSwgZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgY29tbWl0KCJzZXRCcG1FeGVTdGFja3NVc2VyTm9kZSIsIHJlc3BvbnNlLmRhdGEuYnBtRXhlU3RhY2tzVXNlck5vZGUpOwogICAgICAgIHJlc29sdmUocmVzcG9uc2UuZGF0YSk7CiAgICAgIH0pOwogICAgfSk7CiAgfSwKICAvL+S/neWtmOmps+Wbnuiuvue9rgogIHJlamVjdENvbXBsZXRlOiBmdW5jdGlvbiByZWplY3RDb21wbGV0ZShfcmVmMjgsIGRhdGEpIHsKICAgIHZhciBjb21taXQgPSBfcmVmMjguY29tbWl0LAogICAgICBzdGF0ZSA9IF9yZWYyOC5zdGF0ZTsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIHByb2Nlc3MucmVqZWN0Q29tcGxldGUoZGF0YSwgZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEuc3RhdGUpIHsKICAgICAgICAgIE1lc3NhZ2Uuc3VjY2Vzcyh7CiAgICAgICAgICAgIGR1cmF0aW9uOiAxNTAwLAogICAgICAgICAgICBtZXNzYWdlOiByZXNwb25zZS5kYXRhLm1lc3NhZ2UsCiAgICAgICAgICAgIG9uQ2xvc2U6IGZ1bmN0aW9uIG9uQ2xvc2UoKSB7CiAgICAgICAgICAgICAgcmVzb2x2ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSk7CiAgfSwKICAvL+S/neWtmOi9rOWKnuiuvue9rgogIGRlbGVnYXRlOiBmdW5jdGlvbiBkZWxlZ2F0ZShfcmVmMjksIGRhdGEpIHsKICAgIHZhciBjb21taXQgPSBfcmVmMjkuY29tbWl0LAogICAgICBzdGF0ZSA9IF9yZWYyOS5zdGF0ZTsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIHByb2Nlc3MuZGVsZWdhdGUoZGF0YSwgZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEuc3RhdGUpIHsKICAgICAgICAgIE1lc3NhZ2Uuc3VjY2Vzcyh7CiAgICAgICAgICAgIGR1cmF0aW9uOiAxNTAwLAogICAgICAgICAgICBtZXNzYWdlOiByZXNwb25zZS5kYXRhLm1lc3NhZ2UsCiAgICAgICAgICAgIG9uQ2xvc2U6IGZ1bmN0aW9uIG9uQ2xvc2UoKSB7CiAgICAgICAgICAgICAgcmVzb2x2ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSk7CiAgfSwKICAvL+a1geeoi+S8oOmYhQogIHRyYW5zVG9Nb3JlOiBmdW5jdGlvbiB0cmFuc1RvTW9yZShfcmVmMzAsIGRhdGEpIHsKICAgIHZhciBjb21taXQgPSBfcmVmMzAuY29tbWl0LAogICAgICBzdGF0ZSA9IF9yZWYzMC5zdGF0ZTsKICAgIHZhciBsb2FkaW5nID0gTG9hZGluZy5zZXJ2aWNlKHsKICAgICAgZnVsbHNjcmVlbjogdHJ1ZSwKICAgICAgbG9jazogdHJ1ZSwKICAgICAgdGV4dDogJ+ato+WcqOWkhOeQhuS4re+8jOivt+iAkOW/g+etieW+hS4uLicsCiAgICAgIHNwaW5uZXI6ICdlbC1pY29uLWxvYWRpbmcnLAogICAgICBiYWNrZ3JvdW5kOiAncmdiYSgwLCAwLCAwLCAwLjcpJwogICAgfSk7IC8v5byA5aeLCiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICBwcm9jZXNzLnRyYW5zVG9Nb3JlKGRhdGEsIGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgIGxvYWRpbmcuY2xvc2UoKTsgLy8g57uT5p2fCiAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEuc3RhdGUpIHsKICAgICAgICAgIE1lc3NhZ2Uuc3VjY2Vzcyh7CiAgICAgICAgICAgIGR1cmF0aW9uOiAxNTAwLAogICAgICAgICAgICBtZXNzYWdlOiByZXNwb25zZS5kYXRhLm1lc3NhZ2UsCiAgICAgICAgICAgIG9uQ2xvc2U6IGZ1bmN0aW9uIG9uQ2xvc2UoKSB7CiAgICAgICAgICAgICAgcmVzb2x2ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSk7CiAgfSwKICAvL+W+geivouiuvue9rgogIHRhc2tUb0lucXU6IGZ1bmN0aW9uIHRhc2tUb0lucXUoX3JlZjMxLCBkYXRhKSB7CiAgICB2YXIgY29tbWl0ID0gX3JlZjMxLmNvbW1pdCwKICAgICAgc3RhdGUgPSBfcmVmMzEuc3RhdGU7CiAgICB2YXIgbG9hZGluZyA9IExvYWRpbmcuc2VydmljZSh7CiAgICAgIGZ1bGxzY3JlZW46IHRydWUsCiAgICAgIGxvY2s6IHRydWUsCiAgICAgIHRleHQ6ICfmraPlnKjlpITnkIbkuK3vvIzor7fogJDlv4PnrYnlvoUuLi4nLAogICAgICBzcGlubmVyOiAnZWwtaWNvbi1sb2FkaW5nJywKICAgICAgYmFja2dyb3VuZDogJ3JnYmEoMCwgMCwgMCwgMC43KScKICAgIH0pOyAvL+W8gOWniwogICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgcHJvY2Vzcy50YXNrVG9JbnF1KGRhdGEsIGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgIGxvYWRpbmcuY2xvc2UoKTsgLy8g57uT5p2fCiAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEuc3RhdGUpIHsKICAgICAgICAgIE1lc3NhZ2Uuc3VjY2Vzcyh7CiAgICAgICAgICAgIGR1cmF0aW9uOiAxNTAwLAogICAgICAgICAgICBtZXNzYWdlOiByZXNwb25zZS5kYXRhLm1lc3NhZ2UsCiAgICAgICAgICAgIG9uQ2xvc2U6IGZ1bmN0aW9uIG9uQ2xvc2UoKSB7CiAgICAgICAgICAgICAgcmVzb2x2ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSk7CiAgfSwKICAvL+a1geeoi+e7iOatogogIGRvRW5kUHJvY2VzczogZnVuY3Rpb24gZG9FbmRQcm9jZXNzKF9yZWYzMiwgZGF0YSkgewogICAgdmFyIGNvbW1pdCA9IF9yZWYzMi5jb21taXQsCiAgICAgIHN0YXRlID0gX3JlZjMyLnN0YXRlOwogICAgdmFyIGxvYWRpbmcgPSBMb2FkaW5nLnNlcnZpY2UoewogICAgICBmdWxsc2NyZWVuOiB0cnVlLAogICAgICBsb2NrOiB0cnVlLAogICAgICB0ZXh0OiAn5q2j5Zyo5aSE55CG5Lit77yM6K+36ICQ5b+D562J5b6FLi4uJywKICAgICAgc3Bpbm5lcjogJ2VsLWljb24tbG9hZGluZycsCiAgICAgIGJhY2tncm91bmQ6ICdyZ2JhKDAsIDAsIDAsIDAuNyknCiAgICB9KTsgLy/lvIDlp4sKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIHByb2Nlc3MuZG9FbmRQcm9jZXNzKGRhdGEsIGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgIGxvYWRpbmcuY2xvc2UoKTsgLy8g57uT5p2fCiAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEuc3RhdGUpIHsKICAgICAgICAgIE1lc3NhZ2Uuc3VjY2Vzcyh7CiAgICAgICAgICAgIGR1cmF0aW9uOiAxNTAwLAogICAgICAgICAgICBtZXNzYWdlOiByZXNwb25zZS5kYXRhLm1lc3NhZ2UsCiAgICAgICAgICAgIG9uQ2xvc2U6IGZ1bmN0aW9uIG9uQ2xvc2UoKSB7CiAgICAgICAgICAgICAgcmVzb2x2ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSk7CiAgfSwKICAvL+a1gei9rOiuvue9rgogIHRhc2tUb1RyYW5zOiBmdW5jdGlvbiB0YXNrVG9UcmFucyhfcmVmMzMsIGRhdGEpIHsKICAgIHZhciBjb21taXQgPSBfcmVmMzMuY29tbWl0LAogICAgICBzdGF0ZSA9IF9yZWYzMy5zdGF0ZTsKICAgIHZhciBsb2FkaW5nID0gTG9hZGluZy5zZXJ2aWNlKHsKICAgICAgZnVsbHNjcmVlbjogdHJ1ZSwKICAgICAgbG9jazogdHJ1ZSwKICAgICAgdGV4dDogJ+ato+WcqOWkhOeQhuS4re+8jOivt+iAkOW/g+etieW+hS4uLicsCiAgICAgIHNwaW5uZXI6ICdlbC1pY29uLWxvYWRpbmcnLAogICAgICBiYWNrZ3JvdW5kOiAncmdiYSgwLCAwLCAwLCAwLjcpJwogICAgfSk7IC8v5byA5aeLCiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICBwcm9jZXNzLnRhc2tUb1RyYW5zKGRhdGEsIGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgIGxvYWRpbmcuY2xvc2UoKTsgLy8g57uT5p2fCiAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEuc3RhdGUpIHsKICAgICAgICAgIE1lc3NhZ2Uuc3VjY2Vzcyh7CiAgICAgICAgICAgIGR1cmF0aW9uOiAxNTAwLAogICAgICAgICAgICBtZXNzYWdlOiByZXNwb25zZS5kYXRhLm1lc3NhZ2UsCiAgICAgICAgICAgIG9uQ2xvc2U6IGZ1bmN0aW9uIG9uQ2xvc2UoKSB7CiAgICAgICAgICAgICAgcmVzb2x2ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSk7CiAgfSwKICAvL+aZrumAmuS7u+WKoeWKoOetvgogIHVzZXJUYXNrVG9TaWduOiBmdW5jdGlvbiB1c2VyVGFza1RvU2lnbihfcmVmMzQsIGRhdGEpIHsKICAgIHZhciBjb21taXQgPSBfcmVmMzQuY29tbWl0LAogICAgICBzdGF0ZSA9IF9yZWYzNC5zdGF0ZTsKICAgIHZhciBsb2FkaW5nID0gTG9hZGluZy5zZXJ2aWNlKHsKICAgICAgZnVsbHNjcmVlbjogdHJ1ZSwKICAgICAgbG9jazogdHJ1ZSwKICAgICAgdGV4dDogJ+ato+WcqOWkhOeQhuS4re+8jOivt+iAkOW/g+etieW+hS4uLicsCiAgICAgIHNwaW5uZXI6ICdlbC1pY29uLWxvYWRpbmcnLAogICAgICBiYWNrZ3JvdW5kOiAncmdiYSgwLCAwLCAwLCAwLjcpJwogICAgfSk7IC8v5byA5aeLCiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICBwcm9jZXNzLnVzZXJUYXNrVG9TaWduKGRhdGEsIGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgIGxvYWRpbmcuY2xvc2UoKTsgLy8g57uT5p2fCiAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEuc3RhdGUpIHsKICAgICAgICAgIE1lc3NhZ2Uuc3VjY2Vzcyh7CiAgICAgICAgICAgIGR1cmF0aW9uOiAxNTAwLAogICAgICAgICAgICBtZXNzYWdlOiByZXNwb25zZS5kYXRhLm1lc3NhZ2UsCiAgICAgICAgICAgIG9uQ2xvc2U6IGZ1bmN0aW9uIG9uQ2xvc2UoKSB7CiAgICAgICAgICAgICAgcmVzb2x2ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSk7CiAgfSwKICAvL+a1geeoi+WbvgogIGdldEJwbUltYWdlOiBmdW5jdGlvbiBnZXRCcG1JbWFnZShfcmVmMzUsIGRhdGEpIHsKICAgIHZhciBjb21taXQgPSBfcmVmMzUuY29tbWl0LAogICAgICBzdGF0ZSA9IF9yZWYzNS5zdGF0ZTsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIHByb2Nlc3MuaW5zdGFuY2VGbG93SW1hZ2UoZGF0YSwgZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgdmFyIGRlZklkID0gcmVzcG9uc2UuZGF0YS5pbnN0YW5jZUlkID8gJycgOiByZXNwb25zZS5kYXRhLmRlZklkOwogICAgICAgIHByb2Nlc3MuZ2V0QnBtSW1hZ2UoJycsIHJlc3BvbnNlLmRhdGEuaW5zdGFuY2VJZCwgZGVmSWQsIGZ1bmN0aW9uIChyZXMpIHsKICAgICAgICAgIHZhciBkYXRhID0gewogICAgICAgICAgICAicm93cyI6IHJlc3BvbnNlLmRhdGEsCiAgICAgICAgICAgICJpbWciOiByZXMuZGF0YQogICAgICAgICAgfTsKICAgICAgICAgIHJlc29sdmUoZGF0YSk7CiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgfSk7CiAgfSwKICAvL+W+geivouiuvue9rgogIHRhc2tUb0lucXVSZXBseTogZnVuY3Rpb24gdGFza1RvSW5xdVJlcGx5KF9yZWYzNiwgZGF0YSkgewogICAgdmFyIGNvbW1pdCA9IF9yZWYzNi5jb21taXQsCiAgICAgIHN0YXRlID0gX3JlZjM2LnN0YXRlOwogICAgdmFyIGxvYWRpbmcgPSBMb2FkaW5nLnNlcnZpY2UoewogICAgICBmdWxsc2NyZWVuOiB0cnVlLAogICAgICBsb2NrOiB0cnVlLAogICAgICB0ZXh0OiAn5q2j5Zyo5aSE55CG5Lit77yM6K+36ICQ5b+D562J5b6FLi4uJywKICAgICAgc3Bpbm5lcjogJ2VsLWljb24tbG9hZGluZycsCiAgICAgIGJhY2tncm91bmQ6ICdyZ2JhKDAsIDAsIDAsIDAuNyknCiAgICB9KTsgLy/lvIDlp4sKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIHByb2Nlc3MudGFza1RvSW5xdVJlcGx5KGRhdGEsIGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgIGxvYWRpbmcuY2xvc2UoKTsgLy8g57uT5p2fCiAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEuc3RhdGUpIHsKICAgICAgICAgIE1lc3NhZ2Uuc3VjY2Vzcyh7CiAgICAgICAgICAgIGR1cmF0aW9uOiAxNTAwLAogICAgICAgICAgICBtZXNzYWdlOiByZXNwb25zZS5kYXRhLm1lc3NhZ2UsCiAgICAgICAgICAgIG9uQ2xvc2U6IGZ1bmN0aW9uIG9uQ2xvc2UoKSB7CiAgICAgICAgICAgICAgcmVzb2x2ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSk7CiAgfSwKICAvL+aZrumAmueUqOaIt+iKgueCueWKoOetvuWPjemmiAogIHVzZXJBZGRTaWduOiBmdW5jdGlvbiB1c2VyQWRkU2lnbihfcmVmMzcsIGRhdGEpIHsKICAgIHZhciBjb21taXQgPSBfcmVmMzcuY29tbWl0LAogICAgICBzdGF0ZSA9IF9yZWYzNy5zdGF0ZTsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIHByb2Nlc3MudXNlckFkZFNpZ24oZGF0YSwgZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEuc3RhdGUpIHsKICAgICAgICAgIE1lc3NhZ2Uuc3VjY2Vzcyh7CiAgICAgICAgICAgIGR1cmF0aW9uOiAxNTAwLAogICAgICAgICAgICBtZXNzYWdlOiByZXNwb25zZS5kYXRhLm1lc3NhZ2UsCiAgICAgICAgICAgIG9uQ2xvc2U6IGZ1bmN0aW9uIG9uQ2xvc2UoKSB7CiAgICAgICAgICAgICAgcmVzb2x2ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSk7CiAgfSwKICAvL+ayn+mAmuiuvue9rgogIGNvbW11bmljYXRlOiBmdW5jdGlvbiBjb21tdW5pY2F0ZShfcmVmMzgsIGRhdGEpIHsKICAgIHZhciBjb21taXQgPSBfcmVmMzguY29tbWl0LAogICAgICBzdGF0ZSA9IF9yZWYzOC5zdGF0ZTsKICAgIHZhciBsb2FkaW5nID0gTG9hZGluZy5zZXJ2aWNlKHsKICAgICAgZnVsbHNjcmVlbjogdHJ1ZSwKICAgICAgbG9jazogdHJ1ZSwKICAgICAgdGV4dDogJ+ato+WcqOWkhOeQhuS4re+8jOivt+iAkOW/g+etieW+hS4uLicsCiAgICAgIHNwaW5uZXI6ICdlbC1pY29uLWxvYWRpbmcnLAogICAgICBiYWNrZ3JvdW5kOiAncmdiYSgwLCAwLCAwLCAwLjcpJwogICAgfSk7IC8v5byA5aeLCiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICBwcm9jZXNzLmNvbW11bmljYXRlKGRhdGEsIGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgIGxvYWRpbmcuY2xvc2UoKTsgLy8g57uT5p2fCiAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEuc3RhdGUpIHsKICAgICAgICAgIE1lc3NhZ2Uuc3VjY2Vzcyh7CiAgICAgICAgICAgIGR1cmF0aW9uOiAxNTAwLAogICAgICAgICAgICBtZXNzYWdlOiByZXNwb25zZS5kYXRhLm1lc3NhZ2UsCiAgICAgICAgICAgIG9uQ2xvc2U6IGZ1bmN0aW9uIG9uQ2xvc2UoKSB7CiAgICAgICAgICAgICAgcmVzb2x2ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSk7CiAgfSwKICAvL+ayn+mAmuWPjemmiAogIGRvTmV4dGNvbW11OiBmdW5jdGlvbiBkb05leHRjb21tdShfcmVmMzksIGRhdGEpIHsKICAgIHZhciBjb21taXQgPSBfcmVmMzkuY29tbWl0LAogICAgICBzdGF0ZSA9IF9yZWYzOS5zdGF0ZTsKICAgIHZhciBsb2FkaW5nID0gTG9hZGluZy5zZXJ2aWNlKHsKICAgICAgZnVsbHNjcmVlbjogdHJ1ZSwKICAgICAgbG9jazogdHJ1ZSwKICAgICAgdGV4dDogJ+ato+WcqOWkhOeQhuS4re+8jOivt+iAkOW/g+etieW+hS4uLicsCiAgICAgIHNwaW5uZXI6ICdlbC1pY29uLWxvYWRpbmcnLAogICAgICBiYWNrZ3JvdW5kOiAncmdiYSgwLCAwLCAwLCAwLjcpJwogICAgfSk7IC8v5byA5aeLCiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICBwcm9jZXNzLmRvTmV4dGNvbW11KGRhdGEsIGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgIGxvYWRpbmcuY2xvc2UoKTsgLy8g57uT5p2fCiAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEuc3RhdGUpIHsKICAgICAgICAgIE1lc3NhZ2Uuc3VjY2Vzcyh7CiAgICAgICAgICAgIGR1cmF0aW9uOiAxNTAwLAogICAgICAgICAgICBtZXNzYWdlOiByZXNwb25zZS5kYXRhLm1lc3NhZ2UsCiAgICAgICAgICAgIG9uQ2xvc2U6IGZ1bmN0aW9uIG9uQ2xvc2UoKSB7CiAgICAgICAgICAgICAgcmVzb2x2ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSk7CiAgfSwKICAvL+S8muetvuS7u+WKoeWKoOetvgogIHRhc2tTaWduVXNlcnM6IGZ1bmN0aW9uIHRhc2tTaWduVXNlcnMoX3JlZjQwLCBkYXRhKSB7CiAgICB2YXIgY29tbWl0ID0gX3JlZjQwLmNvbW1pdCwKICAgICAgc3RhdGUgPSBfcmVmNDAuc3RhdGU7CiAgICB2YXIgbG9hZGluZyA9IExvYWRpbmcuc2VydmljZSh7CiAgICAgIGZ1bGxzY3JlZW46IHRydWUsCiAgICAgIGxvY2s6IHRydWUsCiAgICAgIHRleHQ6ICfmraPlnKjlpITnkIbkuK3vvIzor7fogJDlv4PnrYnlvoUuLi4nLAogICAgICBzcGlubmVyOiAnZWwtaWNvbi1sb2FkaW5nJywKICAgICAgYmFja2dyb3VuZDogJ3JnYmEoMCwgMCwgMCwgMC43KScKICAgIH0pOyAvL+W8gOWniwogICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgcHJvY2Vzcy50YXNrU2lnblVzZXJzKGRhdGEsIGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgIGxvYWRpbmcuY2xvc2UoKTsgLy8g57uT5p2fCiAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEuc3RhdGUpIHsKICAgICAgICAgIE1lc3NhZ2Uuc3VjY2Vzcyh7CiAgICAgICAgICAgIGR1cmF0aW9uOiAxNTAwLAogICAgICAgICAgICBtZXNzYWdlOiByZXNwb25zZS5kYXRhLm1lc3NhZ2UsCiAgICAgICAgICAgIG9uQ2xvc2U6IGZ1bmN0aW9uIG9uQ2xvc2UoKSB7CiAgICAgICAgICAgICAgcmVzb2x2ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSk7CiAgfSwKICAvL+S8oOmYheWbnuWkjQogIGRvTmV4dENvcHl0bzogZnVuY3Rpb24gZG9OZXh0Q29weXRvKF9yZWY0MSwgZGF0YSkgewogICAgdmFyIGNvbW1pdCA9IF9yZWY0MS5jb21taXQsCiAgICAgIHN0YXRlID0gX3JlZjQxLnN0YXRlOwogICAgdmFyIGxvYWRpbmcgPSBMb2FkaW5nLnNlcnZpY2UoewogICAgICBmdWxsc2NyZWVuOiB0cnVlLAogICAgICBsb2NrOiB0cnVlLAogICAgICB0ZXh0OiAn5q2j5Zyo5aSE55CG5Lit77yM6K+36ICQ5b+D562J5b6FLi4uJywKICAgICAgc3Bpbm5lcjogJ2VsLWljb24tbG9hZGluZycsCiAgICAgIGJhY2tncm91bmQ6ICdyZ2JhKDAsIDAsIDAsIDAuNyknCiAgICB9KTsgLy/lvIDlp4sKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIHByb2Nlc3MuZG9OZXh0Q29weXRvKGRhdGEsIGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgIGxvYWRpbmcuY2xvc2UoKTsgLy8g57uT5p2fCiAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEuc3RhdGUpIHsKICAgICAgICAgIE1lc3NhZ2Uuc3VjY2Vzcyh7CiAgICAgICAgICAgIGR1cmF0aW9uOiAxNTAwLAogICAgICAgICAgICBtZXNzYWdlOiByZXNwb25zZS5kYXRhLm1lc3NhZ2UsCiAgICAgICAgICAgIG9uQ2xvc2U6IGZ1bmN0aW9uIG9uQ2xvc2UoKSB7CiAgICAgICAgICAgICAgcmVzb2x2ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSk7CiAgfSwKICAvL+iOt+WPluS7u+WKoeaYr+WQpuiDvemUgeWumgogIGNhbkxvY2s6IGZ1bmN0aW9uIGNhbkxvY2soX3JlZjQyLCBpZCkgewogICAgdmFyIGNvbW1pdCA9IF9yZWY0Mi5jb21taXQsCiAgICAgIHN0YXRlID0gX3JlZjQyLnN0YXRlOwogICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgcHJvY2Vzcy5jYW5Mb2NrKGlkLCBmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICByZXNvbHZlKHJlc3BvbnNlLmRhdGEpOwogICAgICB9KTsKICAgIH0pOwogIH0sCiAgLy/ojrflj5bku7vliqHplIHlrprnirbmgIEKICBsb2NrVW5sb2NrOiBmdW5jdGlvbiBsb2NrVW5sb2NrKF9yZWY0MywgaWQpIHsKICAgIHZhciBjb21taXQgPSBfcmVmNDMuY29tbWl0LAogICAgICBzdGF0ZSA9IF9yZWY0My5zdGF0ZTsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIHByb2Nlc3MubG9ja1VubG9jayhpZCwgZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEgPT0gMSkgewogICAgICAgICAgTWVzc2FnZS5zdWNjZXNzKHsKICAgICAgICAgICAgZHVyYXRpb246IDE1MDAsCiAgICAgICAgICAgIG1lc3NhZ2U6ICLlt7Lnrb7mlLYiLAogICAgICAgICAgICBvbkNsb3NlOiBmdW5jdGlvbiBvbkNsb3NlKCkgewogICAgICAgICAgICAgIHJlc29sdmUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5kYXRhID09IDMpIHsKICAgICAgICAgIE1lc3NhZ2Uuc3VjY2Vzcyh7CiAgICAgICAgICAgIGR1cmF0aW9uOiAxNTAwLAogICAgICAgICAgICBtZXNzYWdlOiAi5bey5Y+W5raI562+5pS2IiwKICAgICAgICAgICAgb25DbG9zZTogZnVuY3Rpb24gb25DbG9zZSgpIHsKICAgICAgICAgICAgICByZXNvbHZlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9KTsKICB9LAogIC8v5aSE55CG5Lu75YqhCiAgY29tcGxldGU6IGZ1bmN0aW9uIGNvbXBsZXRlKF9yZWY0NCwgZGF0YSkgewogICAgdmFyIGNvbW1pdCA9IF9yZWY0NC5jb21taXQsCiAgICAgIHN0YXRlID0gX3JlZjQ0LnN0YXRlOwogICAgdmFyIGxvYWRpbmcgPSBMb2FkaW5nLnNlcnZpY2UoewogICAgICBmdWxsc2NyZWVuOiB0cnVlLAogICAgICBsb2NrOiB0cnVlLAogICAgICB0ZXh0OiAn5Lu75Yqh5aSE55CG5Lit77yM6K+36ICQ5b+D562J5b6FLi4uJywKICAgICAgc3Bpbm5lcjogJ2VsLWljb24tbG9hZGluZycsCiAgICAgIGJhY2tncm91bmQ6ICdyZ2JhKDAsIDAsIDAsIDAuNyknCiAgICB9KTsgLy/lvIDlp4sKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIHByb2Nlc3MuY29tcGxldGUoZGF0YSwgZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgbG9hZGluZy5jbG9zZSgpOyAvLyDnu5PmnZ8KICAgICAgICBpZiAocmVzcG9uc2UuZGF0YS5zdGF0ZSkgewogICAgICAgICAgTWVzc2FnZS5zdWNjZXNzKHsKICAgICAgICAgICAgZHVyYXRpb246IDE1MDAsCiAgICAgICAgICAgIG1lc3NhZ2U6IHJlc3BvbnNlLmRhdGEubWVzc2FnZSwKICAgICAgICAgICAgb25DbG9zZTogZnVuY3Rpb24gb25DbG9zZSgpIHsKICAgICAgICAgICAgICByZXNvbHZlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9KTsKICB9LAogIC8v5ZCv5Yqo5rWB56iLCiAgc3RhcnQ6IGZ1bmN0aW9uIHN0YXJ0KF9yZWY0NSwgZGF0YSkgewogICAgdmFyIGNvbW1pdCA9IF9yZWY0NS5jb21taXQsCiAgICAgIHN0YXRlID0gX3JlZjQ1LnN0YXRlOwogICAgdmFyIGxvYWRpbmcgPSBMb2FkaW5nLnNlcnZpY2UoewogICAgICBmdWxsc2NyZWVuOiB0cnVlLAogICAgICBsb2NrOiB0cnVlLAogICAgICB0ZXh0OiAn5rWB56iL5ZCv5Yqo5Lit77yM6K+36ICQ5b+D562J5b6FLi4uJywKICAgICAgc3Bpbm5lcjogJ2VsLWljb24tbG9hZGluZycsCiAgICAgIGJhY2tncm91bmQ6ICdyZ2JhKDAsIDAsIDAsIDAuNyknCiAgICB9KTsgLy/lvIDlp4sKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIHByb2Nlc3Muc3RhcnQoZGF0YSwgZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgbG9hZGluZy5jbG9zZSgpOyAvLyDnu5PmnZ8KICAgICAgICBpZiAocmVzcG9uc2UuZGF0YS5zdGF0ZSkgewogICAgICAgICAgTWVzc2FnZS5zdWNjZXNzKHsKICAgICAgICAgICAgZHVyYXRpb246IDE1MDAsCiAgICAgICAgICAgIG1lc3NhZ2U6IHJlc3BvbnNlLmRhdGEubWVzc2FnZSwKICAgICAgICAgICAgb25DbG9zZTogZnVuY3Rpb24gb25DbG9zZSgpIHsKICAgICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlLmRhdGEpOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmVqZWN0KCk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0pOwogIH0sCiAgLy/kv53lrZjojYnnqL8KICBzYXZlRHJhZnQ6IGZ1bmN0aW9uIHNhdmVEcmFmdChfcmVmNDYsIGRhdGEpIHsKICAgIHZhciBjb21taXQgPSBfcmVmNDYuY29tbWl0LAogICAgICBzdGF0ZSA9IF9yZWY0Ni5zdGF0ZTsKICAgIHZhciBsb2FkaW5nID0gTG9hZGluZy5zZXJ2aWNlKHsKICAgICAgZnVsbHNjcmVlbjogdHJ1ZSwKICAgICAgbG9jazogdHJ1ZSwKICAgICAgdGV4dDogJ+S/neWtmOiNieeov+S4re+8jOivt+iAkOW/g+etieW+hS4uLicsCiAgICAgIHNwaW5uZXI6ICdlbC1pY29uLWxvYWRpbmcnLAogICAgICBiYWNrZ3JvdW5kOiAncmdiYSgwLCAwLCAwLCAwLjcpJwogICAgfSk7IC8v5byA5aeLCiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICBwcm9jZXNzLnNhdmVEcmFmdChkYXRhLCBmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICBsb2FkaW5nLmNsb3NlKCk7IC8vIOe7k+adnwogICAgICAgIGlmIChyZXNwb25zZS5kYXRhLnN0YXRlKSB7CiAgICAgICAgICBNZXNzYWdlLnN1Y2Nlc3MoewogICAgICAgICAgICBkdXJhdGlvbjogMTUwMCwKICAgICAgICAgICAgbWVzc2FnZTogcmVzcG9uc2UuZGF0YS5tZXNzYWdlLAogICAgICAgICAgICBvbkNsb3NlOiBmdW5jdGlvbiBvbkNsb3NlKCkgewogICAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UuZGF0YSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9KTsKICB9LAogIC8v5a6h5om56aG16Z2i5L+d5a2YCiAgc2F2ZVRhc2tEcmFmdDogZnVuY3Rpb24gc2F2ZVRhc2tEcmFmdChfcmVmNDcsIGRhdGEpIHsKICAgIHZhciBjb21taXQgPSBfcmVmNDcuY29tbWl0LAogICAgICBzdGF0ZSA9IF9yZWY0Ny5zdGF0ZTsKICAgIHZhciBsb2FkaW5nID0gTG9hZGluZy5zZXJ2aWNlKHsKICAgICAgZnVsbHNjcmVlbjogdHJ1ZSwKICAgICAgbG9jazogdHJ1ZSwKICAgICAgdGV4dDogJ+S/neWtmOiNieeov+S4re+8jOivt+iAkOW/g+etieW+hS4uLicsCiAgICAgIHNwaW5uZXI6ICdlbC1pY29uLWxvYWRpbmcnLAogICAgICBiYWNrZ3JvdW5kOiAncmdiYSgwLCAwLCAwLCAwLjcpJwogICAgfSk7IC8v5byA5aeLCiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICBwcm9jZXNzLnNhdmVUYXNrRHJhZnQoZGF0YSwgZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgbG9hZGluZy5jbG9zZSgpOyAvLyDnu5PmnZ8KICAgICAgICBpZiAocmVzcG9uc2UuZGF0YS5zdGF0ZSkgewogICAgICAgICAgTWVzc2FnZS5zdWNjZXNzKHsKICAgICAgICAgICAgZHVyYXRpb246IDE1MDAsCiAgICAgICAgICAgIG1lc3NhZ2U6IHJlc3BvbnNlLmRhdGEubWVzc2FnZSwKICAgICAgICAgICAgb25DbG9zZTogZnVuY3Rpb24gb25DbG9zZSgpIHsKICAgICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlLmRhdGEpOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSk7CiAgfSwKICAvL+agueaNrua1geeoi+WunuS+i0lE6I635Y+W55u45YWz5L+h5oGvCiAgZ2V0UmVsYXRlZEluZm9ybWF0aW9uQnlJZDogZnVuY3Rpb24gZ2V0UmVsYXRlZEluZm9ybWF0aW9uQnlJZChfcmVmNDgsIGlkKSB7CiAgICB2YXIgY29tbWl0ID0gX3JlZjQ4LmNvbW1pdCwKICAgICAgc3RhdGUgPSBfcmVmNDguc3RhdGU7CiAgICBwcm9jZXNzLmdldFJlbGF0ZWRJbmZvcm1hdGlvbkJ5SWQoaWQsIGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICBjb21taXQoInNldFJlbGF0ZWRJbmZvcm1hdGlvbiIsIHJlc3BvbnNlLmRhdGEpOwogICAgfSk7CiAgfSwKICAvL+a3u+WKoOmYheivu+iusOW9lQogIGFkZFJlYWRSZWNvcmQ6IGZ1bmN0aW9uIGFkZFJlYWRSZWNvcmQoX3JlZjQ5LCBpZCkgewogICAgdmFyIGNvbW1pdCA9IF9yZWY0OS5jb21taXQsCiAgICAgIHN0YXRlID0gX3JlZjQ5LnN0YXRlOwogICAgcHJvY2Vzcy5hZGRSZWFkUmVjb3JkKGlkLCBmdW5jdGlvbiAocmVzcG9uc2UpIHt9KTsKICB9LAogIC8v5qC55o2u5rWB56iL5a6e5L6LSUTojrflj5bpmIXor7vorrDlvZUKICBnZXRCeVJlY29yZEluc3RJZDogZnVuY3Rpb24gZ2V0QnlSZWNvcmRJbnN0SWQoX3JlZjUwLCBwYWdpbmF0aW9uKSB7CiAgICB2YXIgY29tbWl0ID0gX3JlZjUwLmNvbW1pdCwKICAgICAgc3RhdGUgPSBfcmVmNTAuc3RhdGU7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICBwcm9jZXNzLmdldEJ5UmVjb3JkSW5zdElkKHBhZ2luYXRpb24sIGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgIGlmIChyZXNwb25zZS5kYXRhLnJvd3NbMF0gIT0gbnVsbCkgewogICAgICAgICAgY29tbWl0KCJzZXRSb3dzIiwgcmVzcG9uc2UuZGF0YS5yb3dzKTsgLy/pmIXor7vorrDmlbDmja4KICAgICAgICAgIGNvbW1pdCgic2V0VG90YWwiLCByZXNwb25zZS5kYXRhLnRvdGFsKTsgLy/mgLvmlbDmja7mnaHmlbAKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29tbWl0KCJzZXRSb3dzIiwgW10pOyAvL+mYheivu+iusOaVsOaNrgogICAgICAgICAgY29tbWl0KCJzZXRUb3RhbCIsIDApOyAvL+aAu+aVsOaNruadoeaVsAogICAgICAgIH0KICAgICAgICB2YXIgcGFnZUJlYW4gPSB7CiAgICAgICAgICAicGFnZSI6IHJlc3BvbnNlLmRhdGEucGFnZSwKICAgICAgICAgICJwYWdlU2l6ZSI6IHJlc3BvbnNlLmRhdGEucGFnZVNpemUsCiAgICAgICAgICAic2hvd1RvdGFsIjogInRydWUiCiAgICAgICAgfTsgLy/mjqXlj6Pmlrnms5Xov5Tlm57nmoRwYWdlQmVhbgogICAgICAgIGNvbW1pdCgic2V0UGFnaW5hdGlvbiIsIHBhZ2VCZWFuKTsgLy/mmL7npLrnrKzlh6DpobXvvIzmr4/pobXmmL7npLrlpJrlsJHmnaEKICAgICAgICByZXNvbHZlKCk7CiAgICAgIH0pOwogICAgfSk7CiAgfSwKICAvL+WIoOmZpOiNieeovwogIHJlbW92ZURyYWZ0QnlJZDogZnVuY3Rpb24gcmVtb3ZlRHJhZnRCeUlkKF9yZWY1MSwgaWQpIHsKICAgIHZhciBjb21taXQgPSBfcmVmNTEuY29tbWl0LAogICAgICBzdGF0ZSA9IF9yZWY1MS5zdGF0ZTsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIHByb2Nlc3MucmVtb3ZlRHJhZnRCeUlkKGlkLCBmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICBpZiAocmVzcG9uc2UuZGF0YS5zdGF0ZSkgewogICAgICAgICAgTWVzc2FnZS5zdWNjZXNzKHsKICAgICAgICAgICAgZHVyYXRpb246IDE1MDAsCiAgICAgICAgICAgIG1lc3NhZ2U6IHJlc3BvbnNlLmRhdGEubWVzc2FnZSwKICAgICAgICAgICAgb25DbG9zZTogZnVuY3Rpb24gb25DbG9zZSgpIHsKICAgICAgICAgICAgICByZXNvbHZlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9KTsKICB9LAogIC8v6YC76L6R5Yig6Zmk5rWB56iL5a6e5L6LCiAgZG9FbmRQcm9jZXNzQnlJZDogZnVuY3Rpb24gZG9FbmRQcm9jZXNzQnlJZChfcmVmNTIsIGlkKSB7CiAgICB2YXIgY29tbWl0ID0gX3JlZjUyLmNvbW1pdCwKICAgICAgc3RhdGUgPSBfcmVmNTIuc3RhdGU7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICBwcm9jZXNzLmRvRW5kUHJvY2Vzc0J5SWQoaWQsIGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgIGlmIChyZXNwb25zZS5kYXRhLnN0YXRlKSB7CiAgICAgICAgICBNZXNzYWdlLnN1Y2Nlc3MoewogICAgICAgICAgICBkdXJhdGlvbjogMTUwMCwKICAgICAgICAgICAgbWVzc2FnZTogIue7iOatouaIkOWKnyIsCiAgICAgICAgICAgIG9uQ2xvc2U6IGZ1bmN0aW9uIG9uQ2xvc2UoKSB7CiAgICAgICAgICAgICAgcmVzb2x2ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSk7CiAgfSwKICAvL+agueaNrua1geeoi+WunuS+i0lE57uI5q2i5rWB56iLCiAgcmVzdG9yZTogZnVuY3Rpb24gcmVzdG9yZShfcmVmNTMsIGlkKSB7CiAgICB2YXIgY29tbWl0ID0gX3JlZjUzLmNvbW1pdCwKICAgICAgc3RhdGUgPSBfcmVmNTMuc3RhdGU7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICBwcm9jZXNzLnJlc3RvcmUoaWQsIGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgIGlmIChyZXNwb25zZS5kYXRhLnN0YXRlKSB7CiAgICAgICAgICBNZXNzYWdlLnN1Y2Nlc3MoewogICAgICAgICAgICBkdXJhdGlvbjogMTUwMCwKICAgICAgICAgICAgbWVzc2FnZTogIuWIoOmZpOaIkOWKnyIsCiAgICAgICAgICAgIG9uQ2xvc2U6IGZ1bmN0aW9uIG9uQ2xvc2UoKSB7CiAgICAgICAgICAgICAgcmVzb2x2ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSk7CiAgfSwKICAvL+efpeS8muS7u+WKoeW+heWKnui9rOW3suWKngogIG5vdGljZVR1cm5Eb2RlOiBmdW5jdGlvbiBub3RpY2VUdXJuRG9kZShfcmVmNTQsIGlkKSB7CiAgICB2YXIgY29tbWl0ID0gX3JlZjU0LmNvbW1pdCwKICAgICAgc3RhdGUgPSBfcmVmNTQuc3RhdGU7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICBwcm9jZXNzLm5vdGljZVR1cm5Eb2RlKGlkLCBmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICByZXNvbHZlKCk7CiAgICAgIH0pOwogICAgfSk7CiAgfSwKICAvL+agueaNruS7u+WKoWlk6I635Y+W5pyA5paw55qE5bu25pyf5L+h5oGvCiAgYnBtVGFza0R1ZVRpbWU6IGZ1bmN0aW9uIGJwbVRhc2tEdWVUaW1lKF9yZWY1NSwgaWQpIHsKICAgIHZhciBjb21taXQgPSBfcmVmNTUuY29tbWl0LAogICAgICBzdGF0ZSA9IF9yZWY1NS5zdGF0ZTsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIHByb2Nlc3MuYnBtVGFza0R1ZVRpbWUoaWQsIGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgIGNvbW1pdCgic2V0RHVlVGltZSIsIHJlc3BvbnNlLmRhdGEpOwogICAgICAgIHJlc29sdmUocmVzcG9uc2UuZGF0YSk7CiAgICAgIH0pOwogICAgfSk7CiAgfSwKICAvL+agueaNrmlk6I635Y+W5Yiw5pyf5pe26Ze0CiAgZ2V0RXhwaXJhdGlvbkRhdGU6IGZ1bmN0aW9uIGdldEV4cGlyYXRpb25EYXRlKF9yZWY1NiwgZGF0YSkgewogICAgdmFyIGNvbW1pdCA9IF9yZWY1Ni5jb21taXQsCiAgICAgIHN0YXRlID0gX3JlZjU2LnN0YXRlOwogICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgcHJvY2Vzcy5nZXRFeHBpcmF0aW9uRGF0ZShkYXRhLCBmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICByZXNvbHZlKHJlc3BvbnNlLmRhdGEpOwogICAgICB9KTsKICAgIH0pOwogIH0sCiAgLy/mt7vliqDku7vliqHmnJ/pmZDnu5/orqHkv6Hmga8KICBkdWVUaW1lU2F2ZTogZnVuY3Rpb24gZHVlVGltZVNhdmUoX3JlZjU3LCBkYXRhKSB7CiAgICB2YXIgY29tbWl0ID0gX3JlZjU3LmNvbW1pdCwKICAgICAgc3RhdGUgPSBfcmVmNTcuc3RhdGU7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICBwcm9jZXNzLmR1ZVRpbWVTYXZlKGRhdGEsIGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgIGlmIChyZXNwb25zZS5kYXRhLnN0YXRlKSB7CiAgICAgICAgICBNZXNzYWdlLnN1Y2Nlc3MoewogICAgICAgICAgICBkdXJhdGlvbjogMTUwMCwKICAgICAgICAgICAgbWVzc2FnZTogcmVzcG9uc2UuZGF0YS5tZXNzYWdlLAogICAgICAgICAgICBvbkNsb3NlOiBmdW5jdGlvbiBvbkNsb3NlKCkgewogICAgICAgICAgICAgIHJlc29sdmUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0pOwogIH0sCiAgLy/ojrflj5blkI7nu63lj6/ot7PovazoioLngrkKICBnZXRBZnRlckp1bXBOb2RlczogZnVuY3Rpb24gZ2V0QWZ0ZXJKdW1wTm9kZXMoX3JlZjU4LCBkYXRhKSB7CiAgICB2YXIgY29tbWl0ID0gX3JlZjU4LmNvbW1pdCwKICAgICAgc3RhdGUgPSBfcmVmNTguc3RhdGU7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICBwcm9jZXNzLmdldEFmdGVySnVtcE5vZGVzKGRhdGEsIGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgIHJlc29sdmUocmVzcG9uc2UuZGF0YSk7CiAgICAgIH0pOwogICAgfSk7CiAgfSwKICAvL+S/neWtmOihqOWNleaVsOaNrgogIHNhdmVGb3JtRGF0YTogZnVuY3Rpb24gc2F2ZUZvcm1EYXRhKF9yZWY1OSwgZGF0YSkgewogICAgdmFyIGNvbW1pdCA9IF9yZWY1OS5jb21taXQsCiAgICAgIHN0YXRlID0gX3JlZjU5LnN0YXRlOwogICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgcHJvY2Vzcy5zYXZlRm9ybURhdGEoZGF0YSwgZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgcmVzb2x2ZShyZXNwb25zZS5kYXRhKTsKICAgICAgfSk7CiAgICB9KTsKICB9LAogIC8v5qC55o2uaWTojrflj5bliLDmnJ/ml7bpl7QKICBnZXRDdXJOb2RlUHJvcGVydGllczogZnVuY3Rpb24gZ2V0Q3VyTm9kZVByb3BlcnRpZXMoX3JlZjYwLCBkYXRhKSB7CiAgICB2YXIgY29tbWl0ID0gX3JlZjYwLmNvbW1pdCwKICAgICAgc3RhdGUgPSBfcmVmNjAuc3RhdGU7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICBwcm9jZXNzLmdldEN1ck5vZGVQcm9wZXJ0aWVzKGRhdGEsIGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgIHJlc29sdmUocmVzcG9uc2UuZGF0YSk7CiAgICAgIH0pOwogICAgfSk7CiAgfSwKICAvL+iOt+WPlue7n+iuoeWbvuihqAogIGdldEVjaGFydERhdGE6IGZ1bmN0aW9uIGdldEVjaGFydERhdGEoX3JlZjYxLCBwYWdpbmF0aW9uKSB7CiAgICB2YXIgY29tbWl0ID0gX3JlZjYxLmNvbW1pdCwKICAgICAgc3RhdGUgPSBfcmVmNjEuc3RhdGU7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICBwcm9jZXNzLmdldEVjaGFydERhdGEocGFnaW5hdGlvbiwgZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgdmFyIGRhdGEgPSB7CiAgICAgICAgICBvcHRpb25zOiBbXQogICAgICAgIH07CiAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEuc3RhdGUpIHsKICAgICAgICAgIGRhdGEub3B0aW9ucyA9IHJlc3BvbnNlLmRhdGEudmFsdWU7CiAgICAgICAgfQogICAgICAgIHJlc29sdmUoZGF0YSk7CiAgICAgIH0pOwogICAgfSk7CiAgfSwKICAvL+iOt+WPluWuoeaJueaEj+ingQogIGdldE5vZGVvcGluaW9uczogZnVuY3Rpb24gZ2V0Tm9kZW9waW5pb25zKF9yZWY2MiwgcGFnaW5hdGlvbikgewogICAgdmFyIGNvbW1pdCA9IF9yZWY2Mi5jb21taXQsCiAgICAgIHN0YXRlID0gX3JlZjYyLnN0YXRlOwogICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgcHJvY2Vzcy5nZXROb2Rlb3BpbmlvbnMocGFnaW5hdGlvbiwgZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgcmVzb2x2ZShyZXNwb25zZS5kYXRhKTsKICAgICAgfSk7CiAgICB9KTsKICB9LAogIC8v6YCa6L+HYm/mlbDmja7lj5HotbfmtYHnqIsKICBzdGFydEZvcm06IGZ1bmN0aW9uIHN0YXJ0Rm9ybShfcmVmNjMsIHBhZ2luYXRpb24pIHsKICAgIHZhciBjb21taXQgPSBfcmVmNjMuY29tbWl0LAogICAgICBzdGF0ZSA9IF9yZWY2My5zdGF0ZTsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIHByb2Nlc3Muc3RhcnRGb3JtKHBhZ2luYXRpb24sIGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgIHJlc29sdmUocmVzcG9uc2UuZGF0YSk7CiAgICAgIH0pOwogICAgfSk7CiAgfSwKICAvL+iOt+WPluWuoee0p+aApeeKtuaAgemFjee9rgogIGdldFVyZ2VudFN0YXRlQ29uZjogZnVuY3Rpb24gZ2V0VXJnZW50U3RhdGVDb25mKF9yZWY2NCwgcGFyYW0pIHsKICAgIHZhciBjb21taXQgPSBfcmVmNjQuY29tbWl0LAogICAgICBzdGF0ZSA9IF9yZWY2NC5zdGF0ZTsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIHByb2Nlc3MuZ2V0VXJnZW50U3RhdGVDb25mKHBhcmFtLCBmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICByZXNvbHZlKHJlc3BvbnNlLmRhdGEpOwogICAgICB9KTsKICAgIH0pOwogIH0sCiAgLy/moLnmja7mtYHnqIvlrp7kvotJROOAgeWCrOWKnuS6uklE6I635Y+W5YKs5Yqe6K6w5b2VCiAgZ2V0VXJncm50QnlJZDogZnVuY3Rpb24gZ2V0VXJncm50QnlJZChfcmVmNjUsIHBhcmFtKSB7CiAgICB2YXIgY29tbWl0ID0gX3JlZjY1LmNvbW1pdCwKICAgICAgc3RhdGUgPSBfcmVmNjUuc3RhdGU7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICBwcm9jZXNzLmdldFVyZ3JudEJ5SWQocGFyYW0sIGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgIGNvbW1pdCgic2V0Um93cyIsIHJlc3BvbnNlLmRhdGEucm93cyk7IC8v5YKs5Yqe5pWw5o2uCiAgICAgICAgY29tbWl0KCJzZXRUb3RhbCIsIHJlc3BvbnNlLmRhdGEudG90YWwpOyAvL+aAu+aVsOaNruadoeaVsAogICAgICAgIHZhciBwYWdlQmVhbiA9IHsKICAgICAgICAgICJwYWdlIjogcmVzcG9uc2UuZGF0YS5wYWdlLAogICAgICAgICAgInBhZ2VTaXplIjogcmVzcG9uc2UuZGF0YS5wYWdlU2l6ZSwKICAgICAgICAgICJzaG93VG90YWwiOiAidHJ1ZSIKICAgICAgICB9OyAvL+aOpeWPo+aWueazlei/lOWbnueahHBhZ2VCZWFuCiAgICAgICAgY29tbWl0KCJzZXRQYWdpbmF0aW9uIiwgcGFnZUJlYW4pOyAvL+aYvuekuuesrOWHoOmhte+8jOavj+mhteaYvuekuuWkmuWwkeadoQogICAgICAgIHJlc29sdmUocmVzcG9uc2UuZGF0YS5yb3dzKTsKICAgICAgfSk7CiAgICB9KTsKICB9LAogIC8v5qC55o2u5rWB56iL5a6e5L6LSUTojrflj5blvZPliY3ku7vliqHoioLngrnlrqHmibnkuroKICBnZXRFeGN1dG9yTmFtZUJ5SW5zdElkOiBmdW5jdGlvbiBnZXRFeGN1dG9yTmFtZUJ5SW5zdElkKF9yZWY2NiwgaWQpIHsKICAgIHZhciBjb21taXQgPSBfcmVmNjYuY29tbWl0LAogICAgICBzdGF0ZSA9IF9yZWY2Ni5zdGF0ZTsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIHByb2Nlc3MuZ2V0RXhjdXRvck5hbWVCeUluc3RJZChpZCwgZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgcmVzb2x2ZShyZXNwb25zZS5kYXRhKTsKICAgICAgfSk7CiAgICB9KTsKICB9LAogIC8v5qC55o2u5rWB56iL5a6a5LmJaWTojrflj5bmtYHnqIvkv6Hmga8KICBkZWZHZXQ6IGZ1bmN0aW9uIGRlZkdldChfcmVmNjcsIGlkKSB7CiAgICB2YXIgY29tbWl0ID0gX3JlZjY3LmNvbW1pdCwKICAgICAgc3RhdGUgPSBfcmVmNjcuc3RhdGU7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICBwcm9jZXNzLmRlZkdldChpZCwgZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgcmVzb2x2ZShyZXNwb25zZS5kYXRhKTsKICAgICAgfSk7CiAgICB9KTsKICB9LAogIC8v5Y+R6YCB5Lq65bel5YKs5YqeCiAgc2VuZEJwbVRhc2tVcmdlbnQ6IGZ1bmN0aW9uIHNlbmRCcG1UYXNrVXJnZW50KF9yZWY2OCwgZGF0YSkgewogICAgdmFyIGNvbW1pdCA9IF9yZWY2OC5jb21taXQsCiAgICAgIHN0YXRlID0gX3JlZjY4LnN0YXRlOwogICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgcHJvY2Vzcy5zZW5kQnBtVGFza1VyZ2VudChkYXRhLCBmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICBpZiAocmVzcG9uc2UuZGF0YS5zdGF0ZSkgewogICAgICAgICAgTWVzc2FnZS5zdWNjZXNzKHsKICAgICAgICAgICAgZHVyYXRpb246IDE1MDAsCiAgICAgICAgICAgIG1lc3NhZ2U6IHJlc3BvbnNlLmRhdGEubWVzc2FnZSwKICAgICAgICAgICAgb25DbG9zZTogZnVuY3Rpb24gb25DbG9zZSgpIHsKICAgICAgICAgICAgICByZXNvbHZlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9KTsKICB9LAogIC8v5Y+W5Zue6L2s5Yqe5rWB56iLCiAgcmV0cmlldmVCcG1UYXNrOiBmdW5jdGlvbiByZXRyaWV2ZUJwbVRhc2soX3JlZjY5LCBpZCkgewogICAgdmFyIGNvbW1pdCA9IF9yZWY2OS5jb21taXQsCiAgICAgIHN0YXRlID0gX3JlZjY5LnN0YXRlOwogICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgcHJvY2Vzcy5yZXRyaWV2ZUJwbVRhc2soaWQsIGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgIGlmIChyZXNwb25zZS5kYXRhLnN0YXRlKSB7CiAgICAgICAgICBNZXNzYWdlLnN1Y2Nlc3MoewogICAgICAgICAgICBkdXJhdGlvbjogMTUwMCwKICAgICAgICAgICAgbWVzc2FnZTogcmVzcG9uc2UuZGF0YS5tZXNzYWdlLAogICAgICAgICAgICBvbkNsb3NlOiBmdW5jdGlvbiBvbkNsb3NlKCkgewogICAgICAgICAgICAgIHJlc29sdmUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0pOwogIH0sCiAgLy/ojrflj5blt7Llip7nmoTlrp7kvosKICBnZXREb25lQnlJbnN0SWQ6IGZ1bmN0aW9uIGdldERvbmVCeUluc3RJZChfcmVmNzAsIGlkKSB7CiAgICB2YXIgY29tbWl0ID0gX3JlZjcwLmNvbW1pdCwKICAgICAgc3RhdGUgPSBfcmVmNzAuc3RhdGU7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICBwcm9jZXNzLmdldERvbmVCeUluc3RJZChpZCwgZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7CiAgICAgIH0pOwogICAgfSk7CiAgfSwKICAvL+a1gei9rOiuvue9rgogIHRhc2tUb0FwcHJvdmVMaW5lOiBmdW5jdGlvbiB0YXNrVG9BcHByb3ZlTGluZShfcmVmNzEsIGRhdGEpIHsKICAgIHZhciBjb21taXQgPSBfcmVmNzEuY29tbWl0LAogICAgICBzdGF0ZSA9IF9yZWY3MS5zdGF0ZTsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIHByb2Nlc3MudGFza1RvQXBwcm92ZUxpbmUoZGF0YSwgZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEuc3RhdGUpIHsKICAgICAgICAgIE1lc3NhZ2Uuc3VjY2Vzcyh7CiAgICAgICAgICAgIGR1cmF0aW9uOiAxNTAwLAogICAgICAgICAgICBtZXNzYWdlOiByZXNwb25zZS5kYXRhLm1lc3NhZ2UsCiAgICAgICAgICAgIG9uQ2xvc2U6IGZ1bmN0aW9uIG9uQ2xvc2UoKSB7CiAgICAgICAgICAgICAgcmVzb2x2ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSk7CiAgfSwKICB0YXNrVG9TaWduU2VxdWVuY2U6IGZ1bmN0aW9uIHRhc2tUb1NpZ25TZXF1ZW5jZShfcmVmNzIsIGRhdGEpIHsKICAgIHZhciBjb21taXQgPSBfcmVmNzIuY29tbWl0LAogICAgICBzdGF0ZSA9IF9yZWY3Mi5zdGF0ZTsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIHByb2Nlc3MudGFza1RvU2lnblNlcXVlbmNlKGRhdGEsIGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgIGlmIChyZXNwb25zZS5kYXRhLnN0YXRlKSB7CiAgICAgICAgICBNZXNzYWdlLnN1Y2Nlc3MoewogICAgICAgICAgICBkdXJhdGlvbjogMTUwMCwKICAgICAgICAgICAgbWVzc2FnZTogcmVzcG9uc2UuZGF0YS5tZXNzYWdlLAogICAgICAgICAgICBvbkNsb3NlOiBmdW5jdGlvbiBvbkNsb3NlKCkgewogICAgICAgICAgICAgIHJlc29sdmUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0pOwogIH0sCiAgLy8g5o+Q5Lqk5bm26KGM562+572y6K6+572uCiAgdGFza1RvU2lnbkxpbmU6IGZ1bmN0aW9uIHRhc2tUb1NpZ25MaW5lKF9yZWY3MywgZGF0YSkgewogICAgdmFyIGNvbW1pdCA9IF9yZWY3My5jb21taXQsCiAgICAgIHN0YXRlID0gX3JlZjczLnN0YXRlOwogICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgcHJvY2Vzcy50YXNrVG9TaWduTGluZShkYXRhLCBmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICBpZiAocmVzcG9uc2UuZGF0YS5zdGF0ZSkgewogICAgICAgICAgTWVzc2FnZS5zdWNjZXNzKHsKICAgICAgICAgICAgZHVyYXRpb246IDE1MDAsCiAgICAgICAgICAgIG1lc3NhZ2U6IHJlc3BvbnNlLmRhdGEubWVzc2FnZSwKICAgICAgICAgICAgb25DbG9zZTogZnVuY3Rpb24gb25DbG9zZSgpIHsKICAgICAgICAgICAgICByZXNvbHZlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9KTsKICB9LAogIC8v5pKk5Zue5rWB6L2s5Lu75YqhCiAgcmV2b2tlVHJhbnM6IGZ1bmN0aW9uIHJldm9rZVRyYW5zKF9yZWY3NCwgZGF0YSkgewogICAgdmFyIGNvbW1pdCA9IF9yZWY3NC5jb21taXQsCiAgICAgIHN0YXRlID0gX3JlZjc0LnN0YXRlOwogICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgcHJvY2Vzcy5yZXZva2VUcmFucyhkYXRhLCBmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICBpZiAocmVzcG9uc2UuZGF0YS5zdGF0ZSkgewogICAgICAgICAgTWVzc2FnZS5zdWNjZXNzKHsKICAgICAgICAgICAgZHVyYXRpb246IDE1MDAsCiAgICAgICAgICAgIG1lc3NhZ2U6IHJlc3BvbnNlLmRhdGEubWVzc2FnZSwKICAgICAgICAgICAgb25DbG9zZTogZnVuY3Rpb24gb25DbG9zZSgpIHsKICAgICAgICAgICAgICByZXNvbHZlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9KTsKICB9LAogIC8v5pKk5Zue5Lu75YqhIOetvue9suaSpOWbngogIHJldm9rZUN1c3RvbVNpZ246IGZ1bmN0aW9uIHJldm9rZUN1c3RvbVNpZ24oX3JlZjc1LCBkYXRhKSB7CiAgICB2YXIgY29tbWl0ID0gX3JlZjc1LmNvbW1pdCwKICAgICAgc3RhdGUgPSBfcmVmNzUuc3RhdGU7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICBwcm9jZXNzLnJldm9rZUN1c3RvbVNpZ24oZGF0YSwgZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEuc3RhdGUpIHsKICAgICAgICAgIE1lc3NhZ2Uuc3VjY2Vzcyh7CiAgICAgICAgICAgIGR1cmF0aW9uOiAxNTAwLAogICAgICAgICAgICBtZXNzYWdlOiByZXNwb25zZS5kYXRhLm1lc3NhZ2UsCiAgICAgICAgICAgIG9uQ2xvc2U6IGZ1bmN0aW9uIG9uQ2xvc2UoKSB7CiAgICAgICAgICAgICAgcmVzb2x2ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSk7CiAgfSwKICByZXZva2VTaWduTGluZTogZnVuY3Rpb24gcmV2b2tlU2lnbkxpbmUoX3JlZjc2LCBkYXRhKSB7CiAgICB2YXIgY29tbWl0ID0gX3JlZjc2LmNvbW1pdCwKICAgICAgc3RhdGUgPSBfcmVmNzYuc3RhdGU7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICBwcm9jZXNzLnJldm9rZVNpZ25MaW5lKGRhdGEsIGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgIGlmIChyZXNwb25zZS5kYXRhLnN0YXRlKSB7CiAgICAgICAgICBNZXNzYWdlLnN1Y2Nlc3MoewogICAgICAgICAgICBkdXJhdGlvbjogMTUwMCwKICAgICAgICAgICAgbWVzc2FnZTogcmVzcG9uc2UuZGF0YS5tZXNzYWdlLAogICAgICAgICAgICBvbkNsb3NlOiBmdW5jdGlvbiBvbkNsb3NlKCkgewogICAgICAgICAgICAgIHJlc29sdmUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0pOwogIH0sCiAgZ2V0U2lnbkxpbmVzSW5zdElkTm9kZUlkOiBmdW5jdGlvbiBnZXRTaWduTGluZXNJbnN0SWROb2RlSWQoX3JlZjc3LCBkYXRhKSB7CiAgICB2YXIgY29tbWl0ID0gX3JlZjc3LmNvbW1pdCwKICAgICAgc3RhdGUgPSBfcmVmNzcuc3RhdGU7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICBwcm9jZXNzLmdldFNpZ25MaW5lc0luc3RJZE5vZGVJZChkYXRhLCBmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICBpZiAocmVzcG9uc2UuZGF0YSkgewogICAgICAgICAgcmVzb2x2ZShyZXNwb25zZS5kYXRhKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSk7CiAgfSwKICAvL+agueaNruS4u+mUrklE5b6F5Yqe6I635Y+W55+l5Lya5Lu75Yqh5L+h5oGvCiAgZ2V0QnBtVGFza05vdGljZUJ5SWQ6IGZ1bmN0aW9uIGdldEJwbVRhc2tOb3RpY2VCeUlkKF9yZWY3OCwgaWQpIHsKICAgIHZhciBjb21taXQgPSBfcmVmNzguY29tbWl0LAogICAgICBzdGF0ZSA9IF9yZWY3OC5zdGF0ZTsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIHByb2Nlc3MuZ2V0QnBtVGFza05vdGljZUJ5SWQoaWQsIGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgIHJlc29sdmUocmVzcG9uc2UuZGF0YSk7CiAgICAgIH0pOwogICAgfSk7CiAgfSwKICAvL+agueaNruS4u+mUrklE6I635Y+W5bey5Yqe55+l5Lya5Lu75Yqh5L+h5oGvCiAgZ2V0QnBtVGFza05vdGljZURvbmVCeUlkOiBmdW5jdGlvbiBnZXRCcG1UYXNrTm90aWNlRG9uZUJ5SWQoX3JlZjc5LCBpZCkgewogICAgdmFyIGNvbW1pdCA9IF9yZWY3OS5jb21taXQsCiAgICAgIHN0YXRlID0gX3JlZjc5LnN0YXRlOwogICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgcHJvY2Vzcy5nZXRCcG1UYXNrTm90aWNlRG9uZUJ5SWQoaWQsIGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgIHJlc29sdmUocmVzcG9uc2UuZGF0YSk7CiAgICAgIH0pOwogICAgfSk7CiAgfSwKICAvL+agueaNruS7u+WKoUlk6I635Y+W5a6h5om55Y6G5Y+y5pWw5o2u77yI5Y+q5pyJ5LiA5p2h77yJCiAgZ2V0VGFza0tleUJ5VGFza0lkOiBmdW5jdGlvbiBnZXRUYXNrS2V5QnlUYXNrSWQoX3JlZjgwLCBpZCkgewogICAgdmFyIGNvbW1pdCA9IF9yZWY4MC5jb21taXQsCiAgICAgIHN0YXRlID0gX3JlZjgwLnN0YXRlOwogICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgcHJvY2Vzcy5nZXRUYXNrS2V5QnlUYXNrSWQoaWQsIGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgIHJlc29sdmUocmVzcG9uc2UuZGF0YSk7CiAgICAgIH0pOwogICAgfSk7CiAgfSwKICAvL+agueaNruS7u+WKoeiKgueCuUlE5ZKM5rWB56iL5a6e5L6LSUTojrflj5blrqHmibnljoblj7LmlbDmja7vvIjlj6rmnInkuIDmnaHvvIkKICBnZXRUYXNrS2V5QnlOb2RlSWQ6IGZ1bmN0aW9uIGdldFRhc2tLZXlCeU5vZGVJZChfcmVmODEsIGRhdGEpIHsKICAgIHZhciBjb21taXQgPSBfcmVmODEuY29tbWl0LAogICAgICBzdGF0ZSA9IF9yZWY4MS5zdGF0ZTsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIHByb2Nlc3MuZ2V0VGFza0tleUJ5Tm9kZUlkKGRhdGEsIGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgIHJlc29sdmUocmVzcG9uc2UuZGF0YSk7CiAgICAgIH0pOwogICAgfSk7CiAgfSwKICAvL+agueaNrua1geeoi+WumuS5iUlE6I635Y+W6K+l5rWB56iL55qE5YW25a6D5b6F5Yqe77yM5aaC5p6c6I635Y+W5LiN5Yiw77yM5YiZ6L+U5Zue5YW25a6D5b6F5YqeKOi/lOWbnuS4gOadoSkKICBnZXROZXh0VGFza0J5RGVmSWQ6IGZ1bmN0aW9uIGdldE5leHRUYXNrQnlEZWZJZChfcmVmODIsIGRhdGEpIHsKICAgIHZhciBjb21taXQgPSBfcmVmODIuY29tbWl0LAogICAgICBzdGF0ZSA9IF9yZWY4Mi5zdGF0ZTsKICAgIHZhciBsb2FkaW5nID0gTG9hZGluZy5zZXJ2aWNlKHsKICAgICAgZnVsbHNjcmVlbjogdHJ1ZSwKICAgICAgbG9jazogdHJ1ZSwKICAgICAgdGV4dDogJ+ato+WcqOiOt+WPluS4i+S4gOS4quS7u+WKoSzor7fnqI3nrYkuLi4nLAogICAgICBzcGlubmVyOiAnZWwtaWNvbi1sb2FkaW5nJywKICAgICAgYmFja2dyb3VuZDogJ3JnYmEoMCwgMCwgMCwgMC43KScKICAgIH0pOyAvL+W8gOWniwogICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgcHJvY2Vzcy5nZXROZXh0VGFza0J5RGVmSWQoZGF0YSwgZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgaWYgKCFyZXNwb25zZS5kYXRhIHx8ICFyZXNwb25zZS5kYXRhLnZhbHVlKSB7CiAgICAgICAgICBsb2FkaW5nLmNsb3NlKCk7CiAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlLmRhdGEpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgbG9hZGluZy5jbG9zZSgpOwogICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlLmRhdGEpOwogICAgICAgICAgfSwgMjAwMCk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0pOwogIH0sCiAgaW5pdFNpZ25hdHVyZTogZnVuY3Rpb24gaW5pdFNpZ25hdHVyZShfcmVmODMsIGRhdGEpIHsKICAgIHZhciBjb21taXQgPSBfcmVmODMuY29tbWl0LAogICAgICBzdGF0ZSA9IF9yZWY4My5zdGF0ZTsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIGNvbW1pdCgiaW5pdFNpZ25hdHVyZSIsIGRhdGEpOyAvL+WCrOWKnuaVsOaNrgogICAgICByZXNvbHZlKCk7CiAgICB9KTsKICB9LAogIHNldFNpZ25hdHVyZVN0YXR1czogZnVuY3Rpb24gc2V0U2lnbmF0dXJlU3RhdHVzKF9yZWY4NCwgc3RhdHVzKSB7CiAgICB2YXIgY29tbWl0ID0gX3JlZjg0LmNvbW1pdCwKICAgICAgc3RhdGUgPSBfcmVmODQuc3RhdGU7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICBjb21taXQoInNldFNpZ25hdHVyZVN0YXR1cyIsIHN0YXR1cyk7IC8v5YKs5Yqe5pWw5o2uCiAgICAgIHJlc29sdmUoKTsKICAgIH0pOwogIH0sCiAgZG9TaWduYXR1cmU6IGZ1bmN0aW9uIGRvU2lnbmF0dXJlKF9yZWY4NSwgZGF0YSkgewogICAgdmFyIGNvbW1pdCA9IF9yZWY4NS5jb21taXQsCiAgICAgIHN0YXRlID0gX3JlZjg1LnN0YXRlOwogICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgY29tbWl0KCJzZXRTaWduYXR1cmUiLCBkYXRhKTsgLy/lgqzlip7mlbDmja4KICAgICAgcmVzb2x2ZSgpOwogICAgfSk7CiAgfQp9Owp2YXIgbXV0YXRpb25zID0gewogIGNsZWFyTGlzdERhdGE6IGZ1bmN0aW9uIGNsZWFyTGlzdERhdGEoc3RhdGUpIHsKICAgIHN0YXRlLnJvd3MgPSBbXTsKICAgIHN0YXRlLnBhZ2luYXRpb24gPSB7fTsKICB9LAogIHNldFBhZ2luYXRpb246IGZ1bmN0aW9uIHNldFBhZ2luYXRpb24oc3RhdGUsIHBhZ2luYXRpb24pIHsKICAgIHN0YXRlLnBhZ2luYXRpb24gPSBwYWdpbmF0aW9uOwogIH0sCiAgc2V0UGFnaW5hdGlvblNpemU6IGZ1bmN0aW9uIHNldFBhZ2luYXRpb25TaXplKHN0YXRlLCBzaXplKSB7CiAgICBzdGF0ZS5wYWdpbmF0aW9uLnBhZ2VTaXplID0gc2l6ZTsKICB9LAogIHNldFBhZ2luYXRpb25QYWdlTnVtOiBmdW5jdGlvbiBzZXRQYWdpbmF0aW9uUGFnZU51bShzdGF0ZSwgY3VycmVudFBhZ2UpIHsKICAgIHN0YXRlLnBhZ2luYXRpb24ucGFnZSA9IGN1cnJlbnRQYWdlOwogIH0sCiAgc2V0Um93czogZnVuY3Rpb24gc2V0Um93cyhzdGF0ZSwgcm93cykgewogICAgc3RhdGUucm93cyA9IHJvd3M7CiAgfSwKICBzZXRUb3RhbDogZnVuY3Rpb24gc2V0VG90YWwoc3RhdGUsIHRvdGFsKSB7CiAgICBzdGF0ZS50b3RhbCA9IHRvdGFsOwogIH0sCiAgc2V0Rmxvd1RyZWVzOiBmdW5jdGlvbiBzZXRGbG93VHJlZXMoc3RhdGUsIHRyZWUpIHsKICAgIHN0YXRlLnRyZWUgPSB0cmVlOwogIH0sCiAgc2V0QnV0dG9uUm93czogZnVuY3Rpb24gc2V0QnV0dG9uUm93cyhzdGF0ZSwgcm93cykgewogICAgdmFyIHJlcyA9IFtdOwogICAgaWYgKHJvd3MuYnV0dG9ucyAmJiByb3dzLmJ1dHRvbnMubGVuZ3RoID4gMCkgewogICAgICAvL+aYr+eUqOaIt+S7u+WKoTHoioLngrnvvIjljbPlj5HotbfkurroioLngrnvvIkg5Y+q6IO95a2Y5ZyoIOWQjOaEjyAgIOW+geivoiAgICAg5L+d5a2YICDmjInpkq4KICAgICAgLy8gaWYocm93cy5pc05vZGVJZE9uZSl7CiAgICAgIC8vICAgZm9yKGxldCBpID0wO2k8cm93cy5idXR0b25zLmxlbmd0aDtpKyspewogICAgICAvLyAgICAgLy/liKTmlq3mmK/lkKblrZjlnKjlkIzmhI8g5b6B6K+iIOS/neWtmCAg5oyJ6ZKuCiAgICAgIC8vICAgICBpZihyb3dzLmJ1dHRvbnNbaV0uYWxpYXM9PSJhZ3JlZSIgfHwgIHJvd3MuYnV0dG9uc1tpXS5hbGlhcz09InNhdmVEcmFmdCIgfHwgIHJvd3MuYnV0dG9uc1tpXS5hbGlhcz09ImlucXUiKXsKICAgICAgLy8gICAgICAgcmVzLnB1c2gocm93cy5idXR0b25zW2ldKTsKICAgICAgLy8gICAgIH0KICAgICAgLy8gICB9CiAgICAgIC8vIH1lbHNlewogICAgICByZXMgPSBfdG9Db25zdW1hYmxlQXJyYXkocm93cy5idXR0b25zKTsKICAgICAgdmFyIHN0YXJ0VHJhbnMgPSB7fTsKICAgICAgdmFyIGVuZFByb2Nlc3MgPSB7fTsKICAgICAgdmFyIGxvY2tVbmxvY2sgPSB7fTsKICAgICAgdmFyIHNhdmVEcmFmdCA9IHt9OwogICAgICB2YXIgaGFuZ1VwID0ge307CiAgICAgIHZhciBjYW5jZWxIYW5nVXAgPSB7fTsKICAgICAgLy/ph43mlrDmjpLluo8g5oyJ54WnIOWQjOaEjyDlj43lr7kg6amz5ZueIOW+geivoiDovazlip4g5rWB6L2sIOe7iOatoiDnrb7mlLYg5L+d5a2YCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5idXR0b25zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaWYgKHJvd3MuYnV0dG9uc1tpXS5hbGlhcyA9PSAic3RhcnRUcmFucyIpIHsKICAgICAgICAgIC8v5rWB6L2sCiAgICAgICAgICBzdGFydFRyYW5zID0gcm93cy5idXR0b25zW2ldOwogICAgICAgICAgcmVzLnJlbW92ZShyb3dzLmJ1dHRvbnNbaV0pOwogICAgICAgIH0gZWxzZSBpZiAocm93cy5idXR0b25zW2ldLmFsaWFzID09ICJlbmRQcm9jZXNzIikgewogICAgICAgICAgLy/nu4jmraIKICAgICAgICAgIGVuZFByb2Nlc3MgPSByb3dzLmJ1dHRvbnNbaV07CiAgICAgICAgICByZXMucmVtb3ZlKHJvd3MuYnV0dG9uc1tpXSk7CiAgICAgICAgfSBlbHNlIGlmIChyb3dzLmJ1dHRvbnNbaV0uYWxpYXMgPT0gImxvY2tVbmxvY2siKSB7CiAgICAgICAgICAvL+etvuaUtgogICAgICAgICAgbG9ja1VubG9jayA9IHJvd3MuYnV0dG9uc1tpXTsKICAgICAgICAgIHJlcy5yZW1vdmUocm93cy5idXR0b25zW2ldKTsKICAgICAgICAgIGlmIChyb3dzLmJ1dHRvbnNbaV0uaXNMb2NrKSB7CiAgICAgICAgICAgIHN0YXRlLmZvcmNlTG9jayA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChyb3dzLmJ1dHRvbnNbaV0uYWxpYXMgPT0gInNhdmVEcmFmdCIpIHsKICAgICAgICAgIC8v5L+d5a2YCiAgICAgICAgICBzYXZlRHJhZnQgPSByb3dzLmJ1dHRvbnNbaV07CiAgICAgICAgICByZXMucmVtb3ZlKHJvd3MuYnV0dG9uc1tpXSk7CiAgICAgICAgfSBlbHNlIGlmIChyb3dzLmJ1dHRvbnNbaV0uYWxpYXMgPT0gImhhbmdVcCIpIHsKICAgICAgICAgIGhhbmdVcCA9IHJvd3MuYnV0dG9uc1tpXTsKICAgICAgICAgIHJlcy5yZW1vdmUocm93cy5idXR0b25zW2ldKTsKICAgICAgICB9IGVsc2UgaWYgKHJvd3MuYnV0dG9uc1tpXS5hbGlhcyA9PSAiY2FuY2VsSGFuZ1VwIikgewogICAgICAgICAgY2FuY2VsSGFuZ1VwID0gcm93cy5idXR0b25zW2ldOwogICAgICAgICAgcmVzLnJlbW92ZShyb3dzLmJ1dHRvbnNbaV0pOwogICAgICAgIH0KICAgICAgICAvL+WIpOaWreaYr+WQpuaYr+WKoOetvuS7u+WKoQogICAgICAgIGlmIChyb3dzLmlzQWRkU2lnbikgewogICAgICAgICAgaWYgKHJvd3MuYnV0dG9uc1tpXS5hbGlhcyA9PSAiaW5xdSIpIHsKICAgICAgICAgICAgLy/lvoHor6IKICAgICAgICAgICAgcmVzLnJlbW92ZShyb3dzLmJ1dHRvbnNbaV0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICAvL+WIpOaWreaYr+WQpuaYr+WKoOetvuS7u+WKoQogICAgICBpZiAoIXJvd3MuaXNBZGRTaWduKSB7CiAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KHN0YXJ0VHJhbnMpICE9ICJ7fSIpIHsKICAgICAgICAgIHJlcy5wdXNoKHN0YXJ0VHJhbnMpOwogICAgICAgIH0KICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkobG9ja1VubG9jaykgIT0gInt9IikgewogICAgICAgICAgcmVzLnB1c2gobG9ja1VubG9jayk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChKU09OLnN0cmluZ2lmeShlbmRQcm9jZXNzKSAhPSAie30iKSB7CiAgICAgICAgcmVzLnB1c2goZW5kUHJvY2Vzcyk7CiAgICAgIH0KICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KHNhdmVEcmFmdCkgIT0gInt9IikgewogICAgICAgIHJlcy5wdXNoKHNhdmVEcmFmdCk7CiAgICAgIH0KICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KGhhbmdVcCkgIT0gInt9IikgewogICAgICAgIHJlcy5wdXNoKGhhbmdVcCk7CiAgICAgIH0KICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KGNhbmNlbEhhbmdVcCkgIT0gInt9IikgewogICAgICAgIHJlcy5wdXNoKGNhbmNlbEhhbmdVcCk7CiAgICAgIH0KICAgIH0KICAgIC8vIH0KICAgIHN0YXRlLnJvd3NCdG4gPSByZXM7CiAgfSwKICBzZXRBcHByb3ZhbEl0ZW06IGZ1bmN0aW9uIHNldEFwcHJvdmFsSXRlbShzdGF0ZSwgYXBwcm92YWxJdGVtKSB7CiAgICBzdGF0ZS5hcHByb3ZhbEl0ZW0gPSBhcHByb3ZhbEl0ZW07CiAgfSwKICBzZXRPcGluaW9uczogZnVuY3Rpb24gc2V0T3BpbmlvbnMoc3RhdGUsIG9waW5pb25zKSB7CiAgICB2YXIgcGFyYW0gPSBvcGluaW9ucy5wYXJhbTsKICAgIHZhciBkYXRhcyA9IHt9OwogICAgdmFyIHJlcyA9IFtdOwogICAgLy/pmYTku7blkozmraPmloflrZfnrKbkuLLovazlr7nosaEKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3BpbmlvbnMuZGF0YS5sZW5ndGg7IGkrKykgewogICAgICBkYXRhcyA9IG9waW5pb25zLmRhdGFbaV07CiAgICAgIGlmIChvcGluaW9ucy5kYXRhW2ldLmZpbGVzKSB7CiAgICAgICAgZGF0YXMuZmlsZXMgPSBKU09OLnBhcnNlKG9waW5pb25zLmRhdGFbaV0uZmlsZXMpOwogICAgICB9CiAgICAgIGlmIChvcGluaW9ucy5kYXRhW2ldLnpmaWxlcykgewogICAgICAgIGRhdGFzLnpmaWxlcyA9IEpTT04ucGFyc2Uob3BpbmlvbnMuZGF0YVtpXS56ZmlsZXMpOwogICAgICB9CiAgICAgIHJlcy5wdXNoKGRhdGFzKTsKICAgIH0KICAgIC8v5Yik5pat5Lya562+5Lu75Yqh5piv5ZCm6YCJ5oupIOWFgeiuuOWPguiAg+aEj+ingSAgKOmAieaLqeWQpu+8mmZhbHNl77yM5YiZ5a6h5om55pe25LiN5YWB6K645Y+C6ICD5ZCM546v6IqC5YW25LuW5Lya562+5Lq65ZGY55qE5oSP6KeBKQogICAgaWYgKCFwYXJhbS5yZWZlck9waW5pb24gJiYgcGFyYW0ubm9kZVR5cGUgPT0gIlNJR05UQVNLIikgewogICAgICBwcm9jZXNzLnRhc2tOb2RlKHBhcmFtLmRlZklkLCBmdW5jdGlvbiAocikgewogICAgICAgIHZhciBub2RlcyA9IHIuZGF0YS5icG1EZWZMYXlvdXQubGlzdExheW91dDsKICAgICAgICB2YXIgc2lnbk5vZGVzID0gW107IC8v5Lya562+5Lu75Yqh6IqC54K5CiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBub2Rlcy5sZW5ndGg7IGorKykgewogICAgICAgICAgaWYgKG5vZGVzW2pdLm5vZGVUeXBlID09IHBhcmFtLm5vZGVUeXBlKSB7CiAgICAgICAgICAgIHNpZ25Ob2Rlcy5wdXNoKG5vZGVzW2pdKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy/liKDpmaTlhbbku5bkvJrnrb7ku7vliqHlrqHmibnkurrlkZjnmoTlrqHmibnorrDlvZUKICAgICAgICBmb3IgKHZhciBpID0gcmVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHNpZ25Ob2Rlcy5sZW5ndGg7IGorKykgewogICAgICAgICAgICBpZiAoc2lnbk5vZGVzW2pdLm5vZGVJZCA9PSBwYXJhbS5ub2RlSWQgJiYgc2lnbk5vZGVzW2pdLm5vZGVJZCA9PSByZXNbaV0udGFza0tleSAmJiByZXNbaV0udGFza0lkICE9IHBhcmFtLnRhc2tJZCkgewogICAgICAgICAgICAgIHJlcy5zcGxpY2UoaSwgMSk7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0pOwogICAgfQogICAgc3RhdGUub3BpbmlvbnMgPSByZXM7CiAgfSwKICBzZXROb2RlczogZnVuY3Rpb24gc2V0Tm9kZXMoc3RhdGUsIG5vZGVzKSB7CiAgICBzdGF0ZS5ub2RlcyA9IG5vZGVzOwogIH0sCiAgc2V0Q2hlY2tlZE5vZGVzOiBmdW5jdGlvbiBzZXRDaGVja2VkTm9kZXMoc3RhdGUsIGNoZWNrZWROb2RlcykgewogICAgc3RhdGUuY2hlY2tlZE5vZGVzID0gY2hlY2tlZE5vZGVzOwogIH0sCiAgc2V0Q2hlY2tlZFB1c2g6IGZ1bmN0aW9uIHNldENoZWNrZWRQdXNoKHN0YXRlLCB2YWx1ZSkgewogICAgc3RhdGUuY2hlY2tlZE5vZGVzLnB1c2godmFsdWUpOwogIH0sCiAgc2V0Q2hlY2tlZFNwbGljZTogZnVuY3Rpb24gc2V0Q2hlY2tlZFNwbGljZShzdGF0ZSwgdmFsdWUpIHsKICAgIHN0YXRlLmNoZWNrZWROb2Rlcy5zcGxpY2UodmFsdWUsIDEpOwogIH0sCiAgc2V0QnBtRXhlU3RhY2tzVXNlck5vZGU6IGZ1bmN0aW9uIHNldEJwbUV4ZVN0YWNrc1VzZXJOb2RlKHN0YXRlLCBicG1FeGVTdGFja3NVc2VyTm9kZSkgewogICAgc3RhdGUuYnBtRXhlU3RhY2tzVXNlck5vZGUgPSBicG1FeGVTdGFja3NVc2VyTm9kZTsKICB9LAogIHNldFJlbGF0ZWRJbmZvcm1hdGlvbjogZnVuY3Rpb24gc2V0UmVsYXRlZEluZm9ybWF0aW9uKHN0YXRlLCByZWxhdGVkSW5mb3JtYXRpb24pIHsKICAgIHN0YXRlLnJlbGF0ZWRJbmZvcm1hdGlvbiA9IHJlbGF0ZWRJbmZvcm1hdGlvbjsKICB9LAogIHNldER1ZVRpbWU6IGZ1bmN0aW9uIHNldER1ZVRpbWUoc3RhdGUsIGR1ZVRpbWUpIHsKICAgIHN0YXRlLmR1ZVRpbWUgPSBkdWVUaW1lOwogIH0sCiAgc2V0TmV4dEV4ZWN1dG9yOiBmdW5jdGlvbiBzZXROZXh0RXhlY3V0b3Ioc3RhdGUsIG5leHRFeGVjdXRvcikgewogICAgc3RhdGUubmV4dEV4ZWN1dG9yID0gbmV4dEV4ZWN1dG9yOwogIH0sCiAgc2V0U2lnbmF0dXJlOiBmdW5jdGlvbiBzZXRTaWduYXR1cmUoc3RhdGUsIHNpZ25hdHVyZSkgewogICAgc3RhdGUuc2lnbmF0dXJlQ29uZmlnID0gc2lnbmF0dXJlOwogIH0sCiAgc2V0U2lnbmF0dXJlU3RhdHVzOiBmdW5jdGlvbiBzZXRTaWduYXR1cmVTdGF0dXMoc3RhdGUsIHN0YXR1cykgewogICAgc3RhdGUuc2lnbmF0dXJlQ29uZmlnLnN0YXR1cyA9IHN0YXR1czsKICB9LAogIGluaXRTaWduYXR1cmU6IGZ1bmN0aW9uIGluaXRTaWduYXR1cmUoc3RhdGUsIGRhdGEpIHsKICAgIHN0YXRlLnNpZ25hdHVyZUNvbmZpZyA9IHsKICAgICAgc3RhdHVzOiAnZGlzYWJsZScsCiAgICAgIGZpZWxkOiAnJywKICAgICAgaXNDb3ZlcjogZmFsc2UsCiAgICAgIHNlY3JldEZyZWU6IGZhbHNlLAogICAgICBwYXNzd29yZDogJycKICAgIH07CiAgfQp9OwpleHBvcnQgZGVmYXVsdCB7CiAgbmFtZXNwYWNlZDogdHJ1ZSwKICBzdGF0ZTogc3RhdGUsCiAgZ2V0dGVyczogZ2V0dGVycywKICBhY3Rpb25zOiBhY3Rpb25zLAogIG11dGF0aW9uczogbXV0YXRpb25zCn07"},null]}