{"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\\EipSunDialog.vue?vue&type=script&lang=js&","dependencies":[{"path":"D:\\jenkins\\workspace\\ljzc-fvue\\src\\components\\eipControl\\EipSunDialog.vue","mtime":1705040076774},{"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:aW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tICJEOi9qZW5raW5zL3dvcmtzcGFjZS9sanpjLWZ2dWUvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5LmpzIjsKaW1wb3J0IF9hc3luY1RvR2VuZXJhdG9yIGZyb20gIkQ6L2plbmtpbnMvd29ya3NwYWNlL2xqemMtZnZ1ZS9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vYXN5bmNUb0dlbmVyYXRvci5qcyI7CmltcG9ydCAicmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkucHVzaC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmcuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLmZvci1lYWNoLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuZnVuY3Rpb24ubmFtZS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC5leGVjLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnNlYXJjaC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5rZXlzLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuanNvbi5zdHJpbmdpZnkuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5zcGxpY2UuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcucmVwbGFjZS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmVycm9yLmNhdXNlLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLmNvbnN0cnVjdG9yLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLmRvdC1hbGwuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuc3RpY2t5LmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLnRvLXN0cmluZy5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZpbHRlci5qcyI7Ci8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCgppbXBvcnQgeyBtYXBTdGF0ZSB9IGZyb20gInZ1ZXgiOwppbXBvcnQgdXRpbHMgZnJvbSAiQC91dGlscy5qcyI7CmltcG9ydCBob3RlbnRVaVV0aWxzIGZyb20gIkAvaG90ZW50LXVpLXV0aWwuanMiOwppbXBvcnQgeyBNZXNzYWdlIH0gZnJvbSAiZWxlbWVudC11aSI7CmltcG9ydCByZXEgZnJvbSAiQC9yZXF1ZXN0LmpzIjsKaW1wb3J0IHN1Yl9waW9fbWl4aW4gZnJvbSAiQC9zdWItcGVybWlzc2lvbi1taXhpbi5qcyI7CmltcG9ydCBFaXBUYWcgZnJvbSAiQC9jb21wb25lbnRzL2VpcENvbnRyb2wvRWlwVGFnLnZ1ZSI7CmltcG9ydCBFaXBTZWxlY3REaWEgZnJvbSAiQC9jb21wb25lbnRzL2VpcENvbnRyb2wvRWlwU2VsZWN0RGlhLnZ1ZSI7CmV4cG9ydCBkZWZhdWx0IHsKICBjb21wb25lbnRzOiB7CiAgICBFaXBUYWc6IEVpcFRhZywKICAgIEVpcFNlbGVjdERpYTogRWlwU2VsZWN0RGlhCiAgfSwKICBuYW1lOiAiZWlwLWRpYWxvZyIsCiAgcHJvcHM6IFsidmFsaWRhdGUiLCAidmFsdWUiLCAibmFtZSIsICJwZXJtaXNzaW9uIiwgImF0dGVyIiwgInNpbmdsZSIsICJzZWxlY3RvcmNvbmZpZyIsICJjdXN0ZGlhbG9nIiwgInBsYWNlaG9sZGVyIiwgInRvb2x0aXBwbGFjZW1lbnQiLCAnaW5pdEZpbGxEYXRhJywgJ2luaXRGaWxsRGF0YVR5cGUnLCAncmVsYXRpb24nLCAnbWF4Um93J10sCiAgbWl4aW5zOiBbc3ViX3Bpb19taXhpbl0sCiAgLy/mt7flhaXmlrnlvI/lvJXlhaXooajljZXnu4Tku7bkuK3lhazlhbHlsZ7mgKfvvIzlpITnkIblrZDooajjgIHlrZnooajooYzlhoXogZTliqjvvIjliIfpnaLkv67mlLlwZXJtaXNzaW9uX3N1Yu+8iQogIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7CiAgICByZXR1cm4gewogICAgICBkYXRhOiB7CiAgICAgICAgcXhkZDoge30KICAgICAgfSwKICAgICAgaW5wdXRTdWZmaXhXaWR0aDogMCwKICAgICAgcGxhY2Vob2xkZXJCbzogIiIsCiAgICAgIHF1aWNrU2VhcmNoOiAiIiwKICAgICAgLy/loavlhpnmj5DnpLoKICAgICAgY29uZGl0aW9uQmluZDogW10sCiAgICAgIC8v5Y+C5pWw5p+l6K+i5a2X5q61CiAgICAgIG5vZGVLZXk6ICJJRF8iLAogICAgICAvL+agkeW9ouaVsOaNrueItklkCiAgICAgIGN1c3RvbURpYWxvZ1Nob3dMaXN0OiBmYWxzZSwKICAgICAgY3VzdG9tRGlhbG9nU2hvd1RyZWU6IGZhbHNlLAogICAgICBzZWxlY3RPcmdQcm9wczogewogICAgICAgIGxhYmVsOiAibmFtZSIKICAgICAgfSwKICAgICAgc3R5bGU6ICIiLAogICAgICAvL+WvueivneahhuWuvemrmAogICAgICBzZWxlY3RPcmdzOiBudWxsLAogICAgICBpbnB1dFN1ZmZpeEhlaWdodDogMzMsCiAgICAgIGNvbmZpZzogbnVsbCwKICAgICAgdXBkYXRpbmc6IGZhbHNlLAogICAgICBkaXNwbGF5ZmllbGQ6IFtdLAogICAgICAvL+aYvuekuuWtl+autQogICAgICBjdXN0b21EaWFsb2c6IHt9LAogICAgICBxdWVyeVBhcmFtOiAiIiwKICAgICAgLy/mn6Xor6LmnaHku7bovpPlhaXnmoTlgLwKICAgICAgcHJvcHMxOiBbXSwKICAgICAgc2hvd0RhdGE6IFtdLAogICAgICBjaGVja0JveERhdGFBbGw6IFtdLAogICAgICAvL+mAieS4reWvueixoeeahOmbhuWQiAogICAgICBkZWZhdWx0UHJvcHM6IHsKICAgICAgICBjaGlsZHJlbjogImNoaWxkcmVuIiwKICAgICAgICBsYWJlbDogImxhYmVsIgogICAgICB9LAogICAgICBwcm9wc0RhdGE6IFtdLAogICAgICBxdWVyeXNTaG93OiBmYWxzZSwKICAgICAgLy/mmK/lkKbmmL7npLrmkJzntKLmoYYKICAgICAgdW5kZWZpbmVkYTogIiIsCiAgICAgIGlzQ3VycmVudENoYW5nZTogZmFsc2UsCiAgICAgIC8v5piv5ZCm5LiN5omn6KGMIG9yZ1RhYmxlU2VsZWN0aW9u5pa55rOVCiAgICAgIHBhZ2luYXRpb246IHsKICAgICAgICBwYWdlOiAxLAogICAgICAgIHBhZ2VTaXplOiAyMCwKICAgICAgICB0b3RhbDogMAogICAgICB9LAogICAgICBwYXJhbTogW10sCiAgICAgIC8v57uR5a6a55qE6KGo5Y2V5a2X5q61CiAgICAgIHRyZWVMaXN0OiBbXSwKICAgICAgZGlzcGxheUZpZWxkOiB7fSwKICAgICAgcXVlcnlQYXJhbXM6IFtdLAogICAgICBwbGFjZWhvbGRlcnM6IFtdLAogICAgICBvbGRzZWxlY3RPcmdzOiBbXSwKICAgICAgY29tYmluYXRpb25UcmVlRGF0YTogW10sCiAgICAgIGNvbWJpVHJlZURpc3BsYXlGaWVsZDogW10sCiAgICAgIGNvbWJpbmF0aW9uVHJlZVF1ZXJ5czogW10sCiAgICAgIGNvbWJpbmF0aW9uUnVsZToge30sCiAgICAgIHRvZ2dsZUJ0bjogImVsLWljb24tYXJyb3ctbGVmdCIsCiAgICAgIHRyZWVTaG93OiB0cnVlLAogICAgICB0cmFuc3Rpb25XaWR0aDogIjI1JSIsCiAgICAgIGxlZnRUcmVlVGl0bGU6ICIiLAogICAgICB3cml0ZWFibGU6IHRydWUsCiAgICAgIGlzU2hvdzogdHJ1ZQogICAgfTsKICB9LAogIHdhdGNoOiB7CiAgICBwcm9wczE6IGZ1bmN0aW9uIHByb3BzMShuZXdWYWwsIG9sZFZhbCkgewogICAgICAvL+agkeW9ogogICAgICBpZiAodGhpcy5zaG93RGF0YSAhPSB1bmRlZmluZWQgJiYgdGhpcy5zaG93RGF0YS5sZW5ndGggPiAwKSB7CiAgICAgICAgdmFyIHRoaXNfID0gdGhpczsKICAgICAgICB2YXIgZGF0YSA9IFtdOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5zaG93RGF0YS5sZW5ndGg7IGkrKykgewogICAgICAgICAgZGF0YS5wdXNoKHRoaXMuc2hvd0RhdGFbaV0pOwogICAgICAgIH0KICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBkYXRhLmxlbmd0aDsgX2krKykgewogICAgICAgICAgICB0aGlzXy4kcmVmcy50cmVlLnNldENoZWNrZWQoZGF0YVtfaV0sIHRydWUpOwogICAgICAgICAgICB0aGlzXy5jaGVja05vZGUoZGF0YVtfaV0sIHRoaXNfKTsKICAgICAgICAgIH0KICAgICAgICB9LCAyMDApOwogICAgICB9CiAgICB9CiAgfSwKICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkgewogICAgaWYgKHRoaXMuaW5pdEZpbGxEYXRhKSB7CiAgICAgIHRoaXMuaW5pdFRlbXBsYXRlRGF0YSgpOwogICAgfQogICAgdmFyIHJlcXVlc3RUeXBlID0gd2luZG93LmxvY2F0aW9uLmhyZWYuc3BsaXQoJz8nKVswXS5zcGxpdCgnLycpOwogICAgdmFyIGlzRG9uZUxpc3QgPSB3aW5kb3cubG9jYXRpb24uaHJlZi5zcGxpdCgnLycpOwogICAgaWYgKHJlcXVlc3RUeXBlW3JlcXVlc3RUeXBlLmxlbmd0aCAtIDFdID09ICdnZXQnIHx8IHJlcXVlc3RUeXBlW3JlcXVlc3RUeXBlLmxlbmd0aCAtIDJdID09ICdnZXQnIHx8IGlzRG9uZUxpc3RbaXNEb25lTGlzdC5sZW5ndGggLSAxXSA9PSAnZG9uZUxpc3QnKSB7CiAgICAgIHRoaXMuaXNTaG93ID0gZmFsc2U7CiAgICB9CiAgfSwKICBjb21wdXRlZDogbWFwU3RhdGUoewogICAgdG90YWw6IGZ1bmN0aW9uIHRvdGFsKHN0YXRlKSB7CiAgICAgIHJldHVybiBzdGF0ZS5kaWFsb2cudG90YWw7CiAgICB9LAogICAgZGlhbG9nRGF0YTogZnVuY3Rpb24gZGlhbG9nRGF0YShzdGF0ZSkgewogICAgICByZXR1cm4gc3RhdGUuZGlhbG9nLnJvd3M7CiAgICB9LAogICAgaW5wdXRWYWw6IGZ1bmN0aW9uIGlucHV0VmFsKCkgewogICAgICBpZiAoIXRoaXMudmFsdWUgfHwgdGhpcy52YWx1ZSA9PSAifHxbXSIpIHsKICAgICAgICB0aGlzLmNoZWNrQm94RGF0YUFsbCA9IFtdOwogICAgICAgIC8vIHRoaXMuc2hvd0RhdGEgPSBbXTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfSBlbHNlIHsKICAgICAgICB2YXIgbmFtZUFyeSA9IHRoaXMudmFsdWUuc3BsaXQoIiwiKTsKICAgICAgICBpZiAodGhpcy52YWx1ZS5pbmRleE9mKCJ8fCIpID4gMCkgewogICAgICAgICAgbmFtZUFyeSA9IHRoaXMudmFsdWUuc3BsaXQoInx8IilbMF0uc3BsaXQoIiwiKTsKICAgICAgICAgIC8vIHRoaXMuc2hvd0RhdGE9SlNPTi5wYXJzZSh0aGlzLnZhbHVlLnNwbGl0KCJ8fCIpWzFdKTsKICAgICAgICB9CiAgICAgICAgLy8gIHRoaXMuc2hvd0RhdGEgPXRoaXMuc2VsZWN0T3JnczsKICAgICAgICB2YXIgaWRBcnkgPSBudWxsOwogICAgICAgIHZhciBhY2NvdW50QXJ5ID0gbnVsbDsKICAgICAgICB2YXIgcmVzdWx0ID0gW107CiAgICAgICAgbmFtZUFyeS5mb3JFYWNoKGZ1bmN0aW9uIChtLCBpKSB7CiAgICAgICAgICB2YXIgbiA9IHsKICAgICAgICAgICAgdmFsdWU6IG0KICAgICAgICAgIH07CiAgICAgICAgICByZXN1bHQucHVzaChuKTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9CiAgICB9LAogICAgaW5wdXRXcml0ZWFibGU6IGZ1bmN0aW9uIGlucHV0V3JpdGVhYmxlKCkgewogICAgICByZXR1cm4gdGhpcy53cml0ZWFibGUgPyB1dGlscy5nZXRXcml0ZWFibGUodGhpcy5wZXJtaXNzaW9uX3N1YikgOiB0aGlzLndyaXRlYWJsZTsKICAgIH0sCiAgICBpbnB1dFZhbGlkYXRlOiBmdW5jdGlvbiBpbnB1dFZhbGlkYXRlKCkgewogICAgICB2YXIgdmFsaWRhdGVPYmogPSB0aGlzLiRzdG9yZS5zdGF0ZS5pbmRleC52YWxpZGF0ZTsKICAgICAgcmV0dXJuIHV0aWxzLmFkZFJlcXVpcmVkT3JOb3QodGhpcy5wZXJtaXNzaW9uX3N1YiwgdGhpcy52YWxpZGF0ZSwgdmFsaWRhdGVPYmosIHRoaXMpOwogICAgfSwKICAgIGlucHV0TmFtZTogZnVuY3Rpb24gaW5wdXROYW1lKCkgewogICAgICB2YXIgbGFiZWxkZXNjID0gIiI7CiAgICAgIGlmICh0aGlzLiRzbG90cyAmJiB0aGlzLiRzbG90cy5sYWJlbGRlc2MgJiYgdGhpcy4kc2xvdHMubGFiZWxkZXNjWzBdLmNoaWxkcmVuICYmIHRoaXMuJHNsb3RzLmxhYmVsZGVzY1swXS5jaGlsZHJlblswXS50ZXh0KSB7CiAgICAgICAgbGFiZWxkZXNjID0gdGhpcy4kc2xvdHMubGFiZWxkZXNjWzBdLmNoaWxkcmVuWzBdLnRleHQ7CiAgICAgICAgcmV0dXJuIHRoaXMubmFtZSA/IHRoaXMubmFtZSA6IHV0aWxzLmdldE5hbWUoKSArICItIiArIGxhYmVsZGVzYzsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gdGhpcy5uYW1lID8gdGhpcy5uYW1lIDogdXRpbHMuZ2V0TmFtZSgpOwogICAgICB9CiAgICB9LAogICAgLy8g5piv5ZCm5pyJ5Zue5aGr6K6+572uCiAgICBiaW5kU2V0OiBmdW5jdGlvbiBiaW5kU2V0KCkgewogICAgICByZXR1cm4gdGhpcy5zZWxlY3RvcmNvbmZpZyA/IHRoaXMuc2VsZWN0b3Jjb25maWcuYmluZCA6IG51bGw7CiAgICB9CiAgfSksCiAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHsKICAgIGlmICghdGhpcy5wbGFjZWhvbGRlcikgewogICAgICB0aGlzLnBsYWNlaG9sZGVyQm8gPSAi6K+36YCJ5oup5YaF5a65IjsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMucGxhY2Vob2xkZXJCbyA9IHRoaXMucGxhY2Vob2xkZXI7CiAgICB9CiAgICB0aGlzLiR2YWxpZGF0b3IgPSB0aGlzLiRyb290LiR2YWxpZGF0b3I7CiAgfSwKICBtZXRob2RzOiB7CiAgICBzZWxlY3RBbGw6IGZ1bmN0aW9uIHNlbGVjdEFsbChzZWxlY3Rpb24pIHsKICAgICAgaWYgKHRoaXMub2xkc2VsZWN0T3JncyAhPSBudWxsICYmIHNlbGVjdGlvbi5sZW5ndGggPiAwKSB7CiAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCBzZWxlY3Rpb24ubGVuZ3RoOyB4KyspIHsKICAgICAgICAgIGlmICh0aGlzLmluZGV4QXJyYXkodGhpcy5vbGRzZWxlY3RPcmdzLCBzZWxlY3Rpb25beF0pID09PSAtMSkgewogICAgICAgICAgICB0aGlzLm9sZHNlbGVjdE9yZ3MucHVzaChzZWxlY3Rpb25beF0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aGlzLnNlbGVjdE9yZ3MgPSBfLmNsb25lRGVlcCh0aGlzLm9sZHNlbGVjdE9yZ3MpOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuc2VsZWN0T3JncyA9IF8uY2xvbmVEZWVwKHNlbGVjdGlvbik7CiAgICAgIH0KICAgIH0sCiAgICBjaGVja05vZGU6IGZ1bmN0aW9uIGNoZWNrTm9kZShkYXRhLCB0aGlzXywgcG5vZGUpIHsKICAgICAgaWYgKGRhdGEuUGlkKSB7CiAgICAgICAgdmFyIG5vZGUgPSB0aGlzXy4kcmVmcy50cmVlLmdldE5vZGUoZGF0YS5QaWQpOwogICAgICAgIG5vZGUuaW5kZXRlcm1pbmF0ZSA9IHRydWU7CiAgICAgICAgaWYgKG5vZGUuZGF0YS5QaWQpIHsKICAgICAgICAgIHRoaXNfLiRyZWZzLnRyZWUuZ2V0Tm9kZShub2RlLmRhdGEuUGlkKS5pbmRldGVybWluYXRlID0gdHJ1ZTsKICAgICAgICAgIHRoaXMuY2hlY2tOb2RlKHRoaXNfLiRyZWZzLnRyZWUuZ2V0Tm9kZShub2RlLmRhdGEuUGlkKS5kYXRhLCB0aGlzXywgdGhpc18uJHJlZnMudHJlZS5nZXROb2RlKG5vZGUuZGF0YS5QaWQpKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFub2RlLmluZGV0ZXJtaW5hdGUpIHsKICAgICAgICAgIG5vZGUuaW5kZXRlcm1pbmF0ZSA9IHRydWU7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHBub2RlICYmICFwbm9kZS5pbmRldGVybWluYXRlKSB7CiAgICAgICAgcG5vZGUuaW5kZXRlcm1pbmF0ZSA9IHRydWU7CiAgICAgIH0KICAgIH0sCiAgICAvL+Wbnui9puafpeivogogICAgc2VhcmNoRW50ZXJGdW46IGZ1bmN0aW9uIHNlYXJjaEVudGVyRnVuKGUpIHsKICAgICAgdmFyIGtleUNvZGUgPSB3aW5kb3cuZXZlbnQgPyBlLmtleUNvZGUgOiBlLndoaWNoOwogICAgICBpZiAoa2V5Q29kZSA9PSAxMykgewogICAgICAgIHRoaXMuc2VhcmNoKCk7CiAgICAgIH0KICAgIH0sCiAgICBoYW5kbGVTaXplQ2hhbmdlOiBmdW5jdGlvbiBoYW5kbGVTaXplQ2hhbmdlKHNpemUpIHsKICAgICAgdGhpcy5pc0N1cnJlbnRDaGFuZ2UgPSB0cnVlOwogICAgICAvL+avj+mhteS4i+aLieaYvuekuuaVsOaNrgogICAgICB0aGlzLnBhZ2luYXRpb24ucGFnZVNpemUgPSBzaXplOwogICAgICB0aGlzLnNlYXJjaCgpOwogICAgfSwKICAgIGhhbmRsZUN1cnJlbnRDaGFuZ2U6IGZ1bmN0aW9uIGhhbmRsZUN1cnJlbnRDaGFuZ2UoY3VycmVudFBhZ2UpIHsKICAgICAgdmFyIHRoaXNfID0gdGhpczsKICAgICAgaWYgKHRoaXMuc2VsZWN0T3JncyAhPSB1bmRlZmluZWQgJiYgdGhpcy5zZWxlY3RPcmdzLmxlbmd0aCA+IDApIHsKICAgICAgICB0aGlzLnNlbGVjdE9yZ3MuZm9yRWFjaChmdW5jdGlvbiAocm93KSB7CiAgICAgICAgICB2YXIgcmVzID0gdGhpc18uaW5kZXhBcnJheSh0aGlzXy5jaGVja0JveERhdGFBbGwsIHJvdyk7CiAgICAgICAgICBpZiAocmVzID09IC0xKSB7CiAgICAgICAgICAgIHRoaXNfLmNoZWNrQm94RGF0YUFsbC5wdXNoKHJvdyk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgdGhpcy5pc0N1cnJlbnRDaGFuZ2UgPSB0cnVlOwogICAgICAvL+eCueWHu+esrOWHoOmhtQogICAgICB0aGlzLnBhZ2luYXRpb24ucGFnZSA9IGN1cnJlbnRQYWdlOwogICAgICB0aGlzLnNlYXJjaCgpOwogICAgfSwKICAgIGNoZWNrTGlzdDogZnVuY3Rpb24gY2hlY2tMaXN0KCkgewogICAgICB2YXIgdGhpc18gPSB0aGlzOwogICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAvL+WIl+ihqAogICAgICAgIGlmICh0aGlzXy5jaGVja0JveERhdGFBbGwgIT0gdW5kZWZpbmVkICYmIHRoaXNfLmNoZWNrQm94RGF0YUFsbC5sZW5ndGggPiAwKSB7CiAgICAgICAgICB0aGlzXy5jaGVja0JveERhdGFBbGwuZm9yRWFjaChmdW5jdGlvbiAocm93KSB7CiAgICAgICAgICAgIHZhciByZXMgPSB0aGlzXy5pbmRleEFycmF5KHRoaXNfLmRpYWxvZ0RhdGEsIHJvdyk7CiAgICAgICAgICAgIHRoaXNfLnVuZGVmaW5lZGEgPSByZXM7CiAgICAgICAgICAgIGlmIChyZXMgIT0gLTEpIHsKICAgICAgICAgICAgICB0aGlzXy5pc0N1cnJlbnRDaGFuZ2UgPSB0cnVlOwogICAgICAgICAgICAgIHRoaXNfLnRvZ2dsZVJvd1NlbGVjdGlvbihyZXMsIHRydWUpOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0sIDMwMCk7CiAgICB9LAogICAgdG9nZ2xlUm93U2VsZWN0aW9uOiBmdW5jdGlvbiB0b2dnbGVSb3dTZWxlY3Rpb24ocmVzLCB2YWwpIHsKICAgICAgdGhpcy4kcmVmcy5vcmdUYWJsZS50b2dnbGVSb3dTZWxlY3Rpb24odGhpcy5kaWFsb2dEYXRhW3Jlc10sIHZhbCk7CiAgICB9LAogICAgc2hvd0RpYWxvZzogZnVuY3Rpb24gc2hvd0RpYWxvZyhpdGVtKSB7CiAgICAgIHZhciBfdGhpczIgPSB0aGlzOwogICAgICB2YXIgdGhpc18gPSB0aGlzOwogICAgICAvL+esrOS6jOasoeeCueWHu+WtkOihqOWbnuWhq+WvueivneahhiDnrKzkuIDmrKHpgInkuK3nmoTmlbDmja7kuI3mmK/pgInkuK3nirbmgIEKICAgICAgaWYgKHRoaXNfLnNlbGVjdE9yZ3MpIHsKICAgICAgICB0aGlzXy5zZWxlY3RPcmdzLmVtcHR5KCk7CiAgICAgICAgdGhpc18uY2hlY2tCb3hEYXRhQWxsLmVtcHR5KCk7CiAgICAgIH0KICAgICAgdmFyIGFsaWFzID0gdGhpcy5jdXN0ZGlhbG9nLmN1c3REaWFsb2cuYWxpYXM7CiAgICAgIHRoaXMuJHN0b3JlLmRpc3BhdGNoKCJmb3JtL2dldEJ5QWxpYXMiLCBhbGlhcykudGhlbihmdW5jdGlvbiAoY3VzdG9tRGlhbG9nKSB7CiAgICAgICAgaWYgKCFjdXN0b21EaWFsb2cgfHwgIWN1c3RvbURpYWxvZy5hbGlhcykgewogICAgICAgICAgTWVzc2FnZS5lcnJvcigi5a+56K+d5qGG5Yir5ZCN44CQIiArIGFsaWFzICsgIuOAkeS4jeWtmOWcqO+8gSIpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoY3VzdG9tRGlhbG9nLnN0eWxlID09IDEpIHsKICAgICAgICAgIHZhciBkaXNwbGF5bGlzdCA9IEpTT04ucGFyc2UoY3VzdG9tRGlhbG9nLmRpc3BsYXlmaWVsZCk7CiAgICAgICAgICB0aGlzXy5ub2RlS2V5ID0gZGlzcGxheWxpc3QuaWQ7CiAgICAgICAgfQogICAgICAgIC8v5a+56K+d5qGG5oyJ6KGo5Y2V5a2X5q615p+l6K+i77yI5Y+C5pWw5Lyg5YWl55qE77yJCiAgICAgICAgdmFyIGJpbmRMaXN0ID0gdGhpc18uY3VzdGRpYWxvZy5jdXN0RGlhbG9nLmNvbmRpdGlvbnM7CiAgICAgICAgdGhpc18ucGFyYW0gPSBbXTsgLy/nu5HlrprnmoTooajljZXlrZfmrrUKICAgICAgICBpZiAoYmluZExpc3QubGVuZ3RoID4gMCkgewogICAgICAgICAgYmluZExpc3QuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7CiAgICAgICAgICAgIC8v57uR5a6a6KGo5Y2V5a2X5q61CiAgICAgICAgICAgIGlmIChlbGUuZGVmYXVsdFR5cGUgPT0gIjMiICYmIGVsZS5iaW5kKSB7CiAgICAgICAgICAgICAgdmFyIG9iaiA9IHt9OwogICAgICAgICAgICAgIG9iai5maWVsZCA9IGVsZS5maWVsZDsKICAgICAgICAgICAgICBvYmouYmluZCA9IGVsZS5iaW5kOwogICAgICAgICAgICAgIHRoaXNfLnBhcmFtLnB1c2gob2JqKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIC8v5Yik5pat5a+56K+d5qGG5p+l6K+i5piv5ZCm5pyJ5p2h5Lu2CiAgICAgICAgdmFyIHVzZXJJbnB1dExpc3QgPSBKU09OLnBhcnNlKGN1c3RvbURpYWxvZy5jb25kaXRpb25maWVsZCk7CiAgICAgICAgdGhpc18ucXVpY2tTZWFyY2ggPSAiIjsgLy/loavlhpnmj5DnpLogcGxhY2Vob2xkZXIKICAgICAgICB0aGlzXy5jb25kaXRpb25CaW5kID0gW107CiAgICAgICAgdmFyIHF1ZXJ5UGFyYW1zID0gW107CiAgICAgICAgdmFyIHBsYWNlaG9sZGVycyA9IFtdOwogICAgICAgIGlmICh1c2VySW5wdXRMaXN0Lmxlbmd0aCA+IDApIHsKICAgICAgICAgIHVzZXJJbnB1dExpc3QuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7CiAgICAgICAgICAgIHZhciBvYmogPSB7fTsKICAgICAgICAgICAgLy/mnaHku7bmn6Xor6Llj4LmlbDvvIjnlKjmiLfovpPlhaXnmoTvvIkg5paH5pys5qGG6L6T5YWlCiAgICAgICAgICAgIGlmIChlbGUuZGVmYXVsdFR5cGUgPT0gIjEiKSB7CiAgICAgICAgICAgICAgb2JqW2VsZS5maWVsZF0gPSAiIjsKICAgICAgICAgICAgICBxdWVyeVBhcmFtcy5wdXNoKG9iaik7CiAgICAgICAgICAgICAgdGhpc18uY29uZGl0aW9uQmluZC5wdXNoKGVsZSk7CiAgICAgICAgICAgICAgcGxhY2Vob2xkZXJzLnB1c2goIuivt+i+k+WFpSIgKyBlbGUuY29tbWVudCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgICAgX3RoaXMyLiRzZXQoX3RoaXMyLCAicXVlcnlQYXJhbXMiLCBxdWVyeVBhcmFtcyk7CiAgICAgICAgICBfdGhpczIuJHNldChfdGhpczIsICJwbGFjZWhvbGRlcnMiLCBwbGFjZWhvbGRlcnMpOwogICAgICAgIH0KICAgICAgICAvL+WIpOaWreaYr+WQpuaYvuekuuadoeS7tuafpeivoui+k+WFpeahhgogICAgICAgIGlmICh0aGlzXy5xdWlja1NlYXJjaCAhPSAiIikgewogICAgICAgICAgdGhpc18ucXVlcnlzU2hvdyA9IHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXNfLnF1ZXJ5c1Nob3cgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgdGhpc18ucXVpY2tTZWFyY2ggPSAi6K+36L6T5YWlIiArIF90aGlzMi5xdWlja1NlYXJjaCArICLmn6Xor6IiOwogICAgICAgIHRoaXNfLnN0eWxlID0gImhlaWdodDoiICsgY3VzdG9tRGlhbG9nLmhlaWdodCArICJweCI7CiAgICAgICAgaWYgKHdpbmRvdy5zY3JlZW4uaGVpZ2h0ICYmIHdpbmRvdy5zY3JlZW4uaGVpZ2h0IDw9IDkwMCkgewogICAgICAgICAgX3RoaXMyLnN0eWxlID0gImhlaWdodDo0NDBweCI7CiAgICAgICAgfQogICAgICAgIGlmIChjdXN0b21EaWFsb2cuc3R5bGUgPT0gMCB8fCBjdXN0b21EaWFsb2cuc3R5bGUgPT0gMikgewogICAgICAgICAgLy/liJfooagKICAgICAgICAgIHRoaXNfLmN1c3RvbURpYWxvZ1Nob3coewogICAgICAgICAgICBhbGlhczogYWxpYXMsCiAgICAgICAgICAgIGN1c3RvbURpYWxvZzogY3VzdG9tRGlhbG9nCiAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgaWYgKGN1c3RvbURpYWxvZy5zdHlsZSA9PSAxKSB7CiAgICAgICAgICAvL+agkeW9ogogICAgICAgICAgdGhpc18uY3VzdG9tRGlhbG9nVHJlZVNob3coewogICAgICAgICAgICBhbGlhczogYWxpYXMsCiAgICAgICAgICAgIGN1c3RvbURpYWxvZzogY3VzdG9tRGlhbG9nCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSwKICAgIC8v5Yik5pat5pWw5o2u5piv5ZCm5YyF5ZCr5p+Q5Liq5a+56LGh77yM5bm26L+U5Zue5pWw5o2u5YyF5ZCr5a+56LGh55qE5LiL5qCHCiAgICBpbmRleEFycmF5OiBmdW5jdGlvbiBpbmRleEFycmF5KGFycmF5LCBpdGVtKSB7CiAgICAgIGlmIChhcnJheS5sZW5ndGggPT0gMCkgewogICAgICAgIHJldHVybiAtMTsKICAgICAgfQogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KGFycmF5W2ldKSA9PSBKU09OLnN0cmluZ2lmeShpdGVtKSkgewogICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiAtMTsKICAgIH0sCiAgICAvL+eCueWHu+WIl+ihqOafkOS4gOS4quWkjemAieahhuaXtuinpuWPkQogICAgb25UYWJsZVNlbGVjdDogZnVuY3Rpb24gb25UYWJsZVNlbGVjdChyb3dzLCByb3cpIHsKICAgICAgdGhpcy5pc0N1cnJlbnRDaGFuZ2UgPSBmYWxzZTsKICAgICAgLy/liKTmlq3ngrnlh7vliJfooajmlbDmja7ml7blpI3pgInmoYbmmK/lkKbli77pgIkgIHNlbGVjdGVk77yadHJ1ZeS4jeWLvumAie+8jGZhbHNl5Yu+6YCJCiAgICAgIHZhciBzZWxlY3RlZCA9IHRoaXMuc2VsZWN0T3JncyAmJiB0aGlzLnNlbGVjdE9yZ3MubGVuZ3RoID4gMCAmJiB0aGlzLmluZGV4QXJyYXkodGhpcy5zZWxlY3RPcmdzLCByb3cpICE9PSAtMTsKICAgICAgaWYgKHNlbGVjdGVkKSB7CiAgICAgICAgdGhpcy5pc0N1cnJlbnRDaGFuZ2UgPSB0cnVlOwogICAgICAgIHZhciByZXMgPSB0aGlzLmluZGV4QXJyYXkodGhpcy5zZWxlY3RPcmdzLCByb3cpOwogICAgICAgIHRoaXMuc2VsZWN0T3Jncy5zcGxpY2UocmVzLCAxKTsKICAgICAgfQogICAgfSwKICAgIC8v54K55Ye75YiX6KGo5p+Q5LiA5p2h5pWw5o2u5pe26Kem5Y+RCiAgICBvcmdSb3dDbGljazogZnVuY3Rpb24gb3JnUm93Q2xpY2socm93LCBjb2x1bW4sIGV2ZW50KSB7CiAgICAgIGlmICh0aGlzLmN1c3RvbURpYWxvZy5zZWxlY3ROdW0gPT09IDEpIHsKICAgICAgICAkKGV2ZW50LmN1cnJlbnRUYXJnZXQuY2hpbGRyZW5bMF0uY2hpbGRyZW5bMF0uY2hpbGRyZW5bMF0pLnRyaWdnZXIoImNsaWNrIik7CiAgICAgICAgdGhpcy5zZWxlY3RPcmdzID0gW107CiAgICAgICAgdGhpcy5zZWxlY3RPcmdzLnB1c2gocm93KTsKICAgICAgfSBlbHNlIGlmICh0aGlzLmN1c3RvbURpYWxvZy5zZWxlY3ROdW0gIT0gMSkgewogICAgICAgIHRoaXMuaXNDdXJyZW50Q2hhbmdlID0gZmFsc2U7CiAgICAgICAgLy/liKTmlq3ngrnlh7vliJfooajmlbDmja7ml7blpI3pgInmoYbmmK/lkKbli77pgIkgIHNlbGVjdGVk77yadHJ1ZeS4jeWLvumAie+8jGZhbHNl5Yu+6YCJCiAgICAgICAgdmFyIHNlbGVjdGVkID0gdGhpcy5zZWxlY3RPcmdzICYmIHRoaXMuc2VsZWN0T3Jncy5sZW5ndGggPiAwICYmIHRoaXMuaW5kZXhBcnJheSh0aGlzLnNlbGVjdE9yZ3MsIHJvdykgIT09IC0xOwogICAgICAgIGlmIChzZWxlY3RlZCkgewogICAgICAgICAgdGhpcy5pc0N1cnJlbnRDaGFuZ2UgPSB0cnVlOwogICAgICAgICAgdmFyIHJlcyA9IHRoaXMuaW5kZXhBcnJheSh0aGlzLnNlbGVjdE9yZ3MsIHJvdyk7CiAgICAgICAgICB0aGlzLnNlbGVjdE9yZ3Muc3BsaWNlKHJlcywgMSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuJHJlZnMub3JnVGFibGUudG9nZ2xlUm93U2VsZWN0aW9uKHJvdyk7CiAgICAgIH0KICAgIH0sCiAgICAvL+WIl+ihqOWkjemAieahhuacieaUueWPmOaXtuinpuWPkQogICAgb3JnVGFibGVTZWxlY3Rpb246IGZ1bmN0aW9uIG9yZ1RhYmxlU2VsZWN0aW9uKHNlbGVjdGlvbikgewogICAgICAvL+WFqOmAieeahOaDheWGteeJueauiuWkhOeQhijkuLrkuobkuI7ljp/mnKzlip/og73pgLvovpHkuI3lhrLnqoEs5YWI5aSN5Yi25LiA5Lu95pen55qE6YCJ5Lit5pWw5o2uLueEtuWQjuaLv+WIsOWFqOmAieS6i+S7tuS4reWOu+iuoeeulykKICAgICAgdGhpcy5vbGRzZWxlY3RPcmdzID0gXy5jbG9uZURlZXAodGhpcy5zZWxlY3RPcmdzKTsKICAgICAgLy/lpJrpgIkKICAgICAgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLnNlbGVjdE51bSAhPSAxICYmICF0aGlzLmlzQ3VycmVudENoYW5nZSkgewogICAgICAgIGlmIChzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLmxlbmd0aCA+IDApIHsKICAgICAgICAgIGlmIChzZWxlY3Rpb24ubGVuZ3RoID09IDEgJiYgKCF0aGlzLnNlbGVjdE9yZ3MgfHwgdGhpcy5zZWxlY3RPcmdzLmxlbmd0aCA9PSAwKSkgewogICAgICAgICAgICB0aGlzLnNlbGVjdE9yZ3MgPSBzZWxlY3Rpb247CiAgICAgICAgICB9IGVsc2UgaWYgKCghdGhpcy5zZWxlY3RPcmdzIHx8IHRoaXMuc2VsZWN0T3Jncy5sZW5ndGggPT0gMCkgJiYgc2VsZWN0aW9uLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLnNlbGVjdE9yZ3MpIHsKICAgICAgICAgICAgICB0aGlzLnNlbGVjdE9yZ3MgPSBbXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKHZhciBpID0gc2VsZWN0aW9uLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RPcmdzLnB1c2goc2VsZWN0aW9uW2ldKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzQ3VycmVudENoYW5nZSAmJiBzZWxlY3Rpb24ubGVuZ3RoID49IDEwKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5zZWxlY3RPcmdzKSB7CiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RPcmdzID0gW107CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgZm9yICh2YXIgdSA9IHRoaXMuc2VsZWN0T3Jncy5sZW5ndGggLSAxOyB1ID49IDA7IHUtLSkgewogICAgICAgICAgICAgICAgdmFyIHJlcyA9IHRoaXMuaW5kZXhBcnJheShzZWxlY3Rpb24sIHRoaXMuc2VsZWN0T3Jnc1t1XSk7CiAgICAgICAgICAgICAgICBpZiAocmVzICE9IC0xKSB7CiAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0T3Jncy5zcGxpY2UocmVzLCAxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgc2VsZWN0aW9uLmxlbmd0aDsgX2kyKyspIHsKICAgICAgICAgICAgICB0aGlzLnNlbGVjdE9yZ3MucHVzaChzZWxlY3Rpb25bX2kyXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZvciAodmFyIF9pMyA9IHNlbGVjdGlvbi5sZW5ndGggLSAxOyBfaTMgPj0gMDsgX2kzLS0pIHsKICAgICAgICAgICAgICB0aGlzLnNlbGVjdE9yZ3MucHVzaChzZWxlY3Rpb25bX2kzXSk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICBkaWFsb2dDb25maXJtOiBmdW5jdGlvbiBkaWFsb2dDb25maXJtKCkgewogICAgICBpZiAoIXRoaXMuc2VsZWN0T3JncyB8fCB0aGlzLnNlbGVjdE9yZ3MubGVuZ3RoID09IDApIHsKICAgICAgICB0aGlzLiRtZXNzYWdlLmVycm9yKCLor7fpgInmi6nmlbDmja7lm57loasiKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdGhpcy5xdWVyeVBhcmFtID0gIiI7CiAgICAgIHRoaXMuY3VzdG9tRGlhbG9nU2hvd0xpc3QgPSBmYWxzZTsKICAgICAgdGhpcy5jYWxhY0lucHV0U3VmZml4SGVpZ2h0KCk7CiAgICAgIHRoaXMuc3luY0lucHV0VmFsdWUoKTsKICAgIH0sCiAgICAvL+mHjee9rgogICAgcmVzZXQ6IGZ1bmN0aW9uIHJlc2V0KCkgewogICAgICB2YXIgX3RoaXMzID0gdGhpczsKICAgICAgdGhpcy5xdWVyeVBhcmFtcy5mb3JFYWNoKGZ1bmN0aW9uIChwYXJhbU9iaikgewogICAgICAgIGZvciAodmFyIGtleSBpbiBwYXJhbU9iaikgewogICAgICAgICAgX3RoaXMzLnF1ZXJ5UGFyYW1zW2tleV0gPSAiIjsKICAgICAgICB9CiAgICAgIH0pOwogICAgICAvL+e7hOWQiOagkemHjee9rgogICAgICBpZiAodGhpcy4kcmVmcy5jb21iaW5hdGlvblRyZWUpIHsKICAgICAgICB2YXIgbm9kZXMgPSB0aGlzLiRyZWZzLmNvbWJpbmF0aW9uVHJlZS5zdG9yZS5ub2Rlc01hcDsKICAgICAgICBmb3IgKHZhciBrZXkgaW4gbm9kZXMpIHsKICAgICAgICAgIG5vZGVzW2tleV0uZXhwYW5kZWQgPSBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy5jb21iaW5hdGlvblRyZWVRdWVyeXMuc3BsaWNlKDApOwogICAgICB0aGlzLnNlYXJjaCh0cnVlKTsKICAgIH0sCiAgICAvL+afpeivogogICAgc2VhcmNoOiBmdW5jdGlvbiBzZWFyY2gocmVzZXRQYWdpbnRpb24pIHsKICAgICAgdmFyIF90aGlzNCA9IHRoaXM7CiAgICAgIHZhciBxdWVyeXMgPSBbXTsgLy/mn6Xor6LmnaHku7YKICAgICAgdmFyIHF1ZXJ5RmlsdGVyID0ge307CiAgICAgIGlmIChKU09OLnN0cmluZ2lmeSh0aGlzLnBhZ2luYXRpb24pID09ICJ7fSIpIHsKICAgICAgICB0aGlzLnBhZ2luYXRpb24gPSB7CiAgICAgICAgICBwYWdlOiAxLAogICAgICAgICAgcGFnZVNpemU6IDIwLAogICAgICAgICAgc2hvd1RvdGFsOiAidHJ1ZSIKICAgICAgICB9OwogICAgICB9CiAgICAgIHZhciBwYWdlQmVhbiA9IHsKICAgICAgICBwYWdlQmVhbjogdGhpcy5wYWdpbmF0aW9uCiAgICAgIH07CiAgICAgIGlmIChyZXNldFBhZ2ludGlvbikgewogICAgICAgIHBhZ2VCZWFuLnBhZ2VCZWFuID0gewogICAgICAgICAgcGFnZTogMSwKICAgICAgICAgIHBhZ2VTaXplOiAyMCwKICAgICAgICAgIHNob3dUb3RhbDogInRydWUiCiAgICAgICAgfTsKICAgICAgfQogICAgICAvL+eUqOaIt+i+k+WFpeeahAogICAgICBpZiAodGhpcy5xdWVyeVBhcmFtcy5sZW5ndGggIT0gMCAmJiB0aGlzLnF1ZXJ5UGFyYW1zWzBdICE9ICIiKSB7CiAgICAgICAgdGhpcy5jb25kaXRpb25CaW5kLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0sIGluZGV4KSB7CiAgICAgICAgICBxdWVyeXMucHVzaCh7CiAgICAgICAgICAgIHByb3BlcnR5OiBpdGVtLmZpZWxkLAogICAgICAgICAgICB2YWx1ZTogX3RoaXM0LnF1ZXJ5UGFyYW1zW2l0ZW0uZmllbGRdLAogICAgICAgICAgICBncm91cDogIm1haW4iLAogICAgICAgICAgICBvcGVyYXRpb246ICJMSUtFIiwKICAgICAgICAgICAgcmVsYXRpb246ICJBTkQiCiAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgfQogICAgICAvL+WPguaVsOS8oOWFpeeahOafpeivouaLvOaOpQogICAgICBpZiAodGhpcy5wYXJhbSkgewogICAgICAgIHZhciBwSW5zdCA9IHV0aWxzLmdldE9ubGluZUZvcm1JbnN0YW5jZSh0aGlzKTsKICAgICAgICB0aGlzLnBhcmFtLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICAgIHF1ZXJ5cy5wdXNoKHsKICAgICAgICAgICAgcHJvcGVydHk6IGl0ZW0uZmllbGQsCiAgICAgICAgICAgIHZhbHVlOiB1dGlscy5nZXRWYWx1ZUJ5UGF0aChwSW5zdCwgaXRlbS5iaW5kKSwKICAgICAgICAgICAgZ3JvdXA6ICJtYWluIiwKICAgICAgICAgICAgb3BlcmF0aW9uOiAiTElLRSIsCiAgICAgICAgICAgIHJlbGF0aW9uOiAiQU5EIgogICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgLy/mnaXoh6rnu4TlkIjlr7nor53moYbnmoQKICAgICAgaWYgKHRoaXMuY29tYmluYXRpb25UcmVlUXVlcnlzICYmIHRoaXMuY29tYmluYXRpb25UcmVlUXVlcnlzLmxlbmd0aCAhPSAwKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbWJpbmF0aW9uVHJlZVF1ZXJ5cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgcXVlcnlzLnB1c2godGhpcy5jb21iaW5hdGlvblRyZWVRdWVyeXNbaV0pOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAocXVlcnlzLmxlbmd0aCA+IDApIHsKICAgICAgICBxdWVyeUZpbHRlciA9IHsKICAgICAgICAgIHBhZ2VCZWFuOiBwYWdlQmVhbi5wYWdlQmVhbiwKICAgICAgICAgIHF1ZXJ5czogcXVlcnlzCiAgICAgICAgfTsKICAgICAgICB0aGlzLmN1c3RvbURpYWxvZy5wYWdlQmVhbiA9IHF1ZXJ5RmlsdGVyOwogICAgICAgIHRoaXMuJHN0b3JlLmRpc3BhdGNoKCJkaWFsb2cvZ2V0bGlzdEpzb24iLCB0aGlzLmN1c3RvbURpYWxvZykudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICBfdGhpczQuY2hlY2tMaXN0KCk7CiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5jdXN0b21EaWFsb2cucGFnZUJlYW4gPSBwYWdlQmVhbjsKICAgICAgICB0aGlzLiRzdG9yZS5kaXNwYXRjaCgiZGlhbG9nL2dldGxpc3RKc29uIiwgdGhpcy5jdXN0b21EaWFsb2cpLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgX3RoaXM0LmNoZWNrTGlzdCgpOwogICAgICAgIH0pOwogICAgICB9CiAgICB9LAogICAgZG9RdWVyeTogZnVuY3Rpb24gZG9RdWVyeShwYXJhbSkgewogICAgICB2YXIgX3RoaXM1ID0gdGhpczsKICAgICAgcmV0dXJuIF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZSgpIHsKICAgICAgICB2YXIgcGFyYW1Mb2FkRGF0YSwgcEluc3QsIGksIGJpbmRWYWwsIG9iaiwgcXVlcnlVcmwsIHJlcXVlc3RNZXRob2Q7CiAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7CiAgICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkgewogICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgcGFyYW1Mb2FkRGF0YSA9IFtdOwogICAgICAgICAgICAgIHBJbnN0ID0gdXRpbHMuZ2V0T25saW5lRm9ybUluc3RhbmNlKF90aGlzNSk7IC8v6I635Y+W5YWz6IGU5p+l6K+i57uR5a6a55qE6KGo5Y2V5Y+C5pWwCiAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBhcmFtLmNvbmRpdGlvbmZpZWxkLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAocGFyYW0uY29uZGl0aW9uZmllbGRbaV0uZmllbGRQYXRoICE9ICIiKSB7CiAgICAgICAgICAgICAgICAgIGJpbmRWYWwgPSB1dGlscy5nZXRWYWx1ZUJ5UGF0aChwSW5zdCwgcGFyYW0uY29uZGl0aW9uZmllbGRbaV0uZmllbGRQYXRoLCBudWxsKTsKICAgICAgICAgICAgICAgICAgb2JqID0gewogICAgICAgICAgICAgICAgICAgIGtleTogcGFyYW0uY29uZGl0aW9uZmllbGRbaV0uZmllbGQsCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGJpbmRWYWwKICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgcGFyYW1Mb2FkRGF0YS5wdXNoKG9iaik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHF1ZXJ5VXJsID0gcGFyYW0uZHNUeXBlID09ICJkYXRhU291cmNlIiA/ICIke2Zvcm19L2Zvcm0vY3VzdG9tUXVlcnkvdjEvZG9RdWVyeT9hbGlhcz0iICsgcGFyYW0uYWxpYXMgKyAiJnBhZ2U9MSIgOiBwYXJhbS51cmw7CiAgICAgICAgICAgICAgcmVxdWVzdE1ldGhvZCA9ICJQT1NUIjsgLy/lpoLmnpzlhbPogZTmlbDmja7liJfooajmn6Xor6LmlbDmja7kuI3mmK/mlbDmja7mupDliJnor7fmsYLmlrnms5XkuLpyZXN0ZnVs6YWN572u55qE6K+35rGC5pa55byPCiAgICAgICAgICAgICAgaWYgKHBhcmFtLmRzVHlwZSAhPSAiZGF0YVNvdXJjZSIpIHsKICAgICAgICAgICAgICAgIHJlcXVlc3RNZXRob2QgPSBwYXJhbS5yZXF1ZXN0VHlwZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgLy/mn6Xor6LmlbDmja4KICAgICAgICAgICAgICByZXEucmVxdWVzdCh7CiAgICAgICAgICAgICAgICB1cmw6IHF1ZXJ5VXJsLAogICAgICAgICAgICAgICAgbWV0aG9kOiByZXF1ZXN0TWV0aG9kLAogICAgICAgICAgICAgICAgZGF0YTogcGFyYW1Mb2FkRGF0YQogICAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlcykgewogICAgICAgICAgICAgICAgLy/liKTmlq3mmK/lkKbmnInlhbPogZTmn6Xor6LmlbDmja7ov5Tlm54KICAgICAgICAgICAgICAgIGlmIChyZXMuZGF0YS5yb3dzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgLy/ojrflj5blhbPogZTmn6Xor6Lov5Tlm57nmoTooajljZXlj4LmlbAKICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaW8gPSAwOyBpbyA8IHBhcmFtLnJlc3VsdGZpZWxkLmxlbmd0aDsgaW8rKykgewogICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbS5yZXN1bHRmaWVsZFtpb10uZmllbGRQYXRoICE9ICIiKSB7CiAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsID0gIiI7CiAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHJlcy5kYXRhLnJvd3MubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcy5kYXRhLnJvd3Nbal1bcGFyYW0ucmVzdWx0ZmllbGRbaW9dLmZpZWxkXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHZhbCArIHJlcy5kYXRhLnJvd3Nbal1bcGFyYW0ucmVzdWx0ZmllbGRbaW9dLmZpZWxkXSArICIsIjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgdmFsID0gdmFsLnN1YnN0cmluZygwLCB2YWwubGVuZ3RoIC0gMSk7CiAgICAgICAgICAgICAgICAgICAgICB2YXIgcGF0aEFyciA9IHBhcmFtLnJlc3VsdGZpZWxkW2lvXS5maWVsZFBhdGguc3BsaXQoIi4iKTsKICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXRoQXJyLmxlbmd0aCA9PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8v5Li76KGoCiAgICAgICAgICAgICAgICAgICAgICAgIHV0aWxzLnNldFZhbHVlQnlQYXRoKHBJbnN0LCBwYXJhbS5yZXN1bHRmaWVsZFtpb10uZmllbGRQYXRoLCB2YWwsIG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXRoQXJyLmxlbmd0aCA9PSA0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8v5a2Q6KGoCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdWJEYXRhID0gcEluc3QuZGF0YVtwYXRoQXJyWzFdXVtwYXRoQXJyWzJdXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YkRhdGEubGVuZ3RoID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAvL+WtkOihqOayoeaVsOaNrueahOaDheWGtQogICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdWJUYWJOYW1lID0gcGF0aEFyclsyXS5yZXBsYWNlKCJzdWJfIiwgIiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgIC8v5b6X5Yiw5a2Q6KGo55qE5omA5pyJ5a2X5q61CiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN1YkluaXREYXRhID0gcEluc3QuZGF0YVtwYXRoQXJyWzFdXS5pbml0RGF0YVtzdWJUYWJOYW1lXSB8fCB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAvL+aKiuaVsOe7hOmHjOmdoueahOWAvOS4uiBudWxsIOi9rOaNouS4uuepuuWtl+espuS4sgogICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdHIgPSBKU09OLnN0cmluZ2lmeShzdWJJbml0RGF0YSkucmVwbGFjZSgvbnVsbC9nLCAnIiInKTsKICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX3N1YkRhdGEgPSBKU09OLnBhcnNlKHN0cik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIF9zdWJEYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL+eCuea3u+WKoOaXtuWIpOaWreimgeaWsOWinuWtkOihqOiusOW9leS4reeahOWtmeihqOaYr+WQpuacieWAvAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleS5pbmRleE9mKCJzdWJfIikgPT0gMCAmJiBfc3ViRGF0YVtrZXldLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3N1YkRhdGFba2V5XSA9IFtdOyAvL+acieWImea4heepugogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy/ngrnmt7vliqDml7bliKTmlq3opoHmlrDlop7lrZDooajorrDlvZXkuK3nmoTlrZfmrrXmmK/lkKbmnInlgLwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfc3ViRGF0YVtrZXldKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zdWJEYXRhW2tleV0gPSAiIjsgLy/mnInliJnmuIXnqboKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgLy/mlrDlop7kuIDmnaHmlbDmja4KICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdC5kYXRhW3BhdGhBcnJbMV1dW3BhdGhBcnJbMl1dLnB1c2goX3N1YkRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgIC8v5a+56K+d5qGG5YWz6IGU5p+l6K+i6L+U5Zue55qE5YC86LWL5YC857uZ57uR5a6a55qE5a2X5q61CiAgICAgICAgICAgICAgICAgICAgICAgICAgdXRpbHMuc2V0VmFsdWVCeVBhdGgocEluc3QsIHBhcmFtLnJlc3VsdGZpZWxkW2lvXS5maWVsZFBhdGgsIHZhbCwgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgLy/lrZDooajmnInmlbDmja7nmoTmg4XlhrUKICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBwID0gMDsgcCA8IHN1YkRhdGEubGVuZ3RoOyBwKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v5a+56K+d5qGG5YWz6IGU5p+l6K+i6L+U5Zue55qE5YC86LWL5YC857uZ57uR5a6a55qE5a2X5q61CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGlscy5zZXRWYWx1ZUJ5UGF0aChwSW5zdCwgcGFyYW0ucmVzdWx0ZmllbGRbaW9dLmZpZWxkUGF0aCwgdmFsLCBwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIC8v5rKh5pyJ6L+U5Zue55qE5YC85YiZ5riF56m6CiAgICAgICAgICAgICAgICAgIC8v6I635Y+W5YWz6IGU5p+l6K+i6L+U5Zue55qE6KGo5Y2V5Y+C5pWwCiAgICAgICAgICAgICAgICAgIGZvciAodmFyIGlvcCA9IDA7IGlvcCA8IHBhcmFtLnJlc3VsdGZpZWxkLmxlbmd0aDsgaW9wKyspIHsKICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW0ucmVzdWx0ZmllbGRbaW9wXS5maWVsZFBhdGggIT0gIiIpIHsKICAgICAgICAgICAgICAgICAgICAgIHZhciBfcGF0aEFyciA9IHBhcmFtLnJlc3VsdGZpZWxkW2lvcF0uZmllbGRQYXRoLnNwbGl0KCIuIik7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoX3BhdGhBcnIubGVuZ3RoID09IDMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy/kuLvooagKICAgICAgICAgICAgICAgICAgICAgICAgLy/otYvlgLznu5nnu5HlrprnmoTlrZfmrrUKICAgICAgICAgICAgICAgICAgICAgICAgdXRpbHMuc2V0VmFsdWVCeVBhdGgocEluc3QsIHBhcmFtLnJlc3VsdGZpZWxkW2lvcF0uZmllbGRQYXRoLCAiIiwgbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKF9wYXRoQXJyLmxlbmd0aCA9PSA0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8v5a2Q6KGoCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfc3ViRGF0YTIgPSBwSW5zdC5kYXRhW19wYXRoQXJyWzFdXVtfcGF0aEFyclsyXV07CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIF9wID0gMDsgX3AgPCBfc3ViRGF0YTIubGVuZ3RoOyBfcCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgLy/lr7nor53moYblhbPogZTmn6Xor6Lov5Tlm57nmoTlgLzotYvlgLznu5nnu5HlrprnmoTlrZfmrrUKICAgICAgICAgICAgICAgICAgICAgICAgICB1dGlscy5zZXRWYWx1ZUJ5UGF0aChwSW5zdCwgcGFyYW0ucmVzdWx0ZmllbGRbaW9wXS5maWVsZFBhdGgsICIiLCBfcCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgY2FzZSA3OgogICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7CiAgICAgICAgICB9CiAgICAgICAgfSwgX2NhbGxlZSk7CiAgICAgIH0pKSgpOwogICAgfSwKICAgIC8vIOWQjOatpemAieaLqee7k+aenAogICAgc3luY0lucHV0VmFsdWU6IGZ1bmN0aW9uIHN5bmNJbnB1dFZhbHVlKCkgewogICAgICB2YXIgcmV0dXJuU3RyID0gSlNPTi5wYXJzZSh0aGlzLmN1c3RvbURpYWxvZy5yZXN1bHRmaWVsZCk7CiAgICAgIC8v5ou/5Yiw6L+U5Zue55qE5a2X5q61CiAgICAgIHZhciBmaWVsZCA9IG5ldyBBcnJheShbcmV0dXJuU3RyLmxlbmd0aF0pOwogICAgICB2YXIgY29tbWVudCA9IG5ldyBBcnJheShbcmV0dXJuU3RyLmxlbmd0aF0pOwogICAgICB2YXIgc3RyID0gW107CiAgICAgIHZhciBpZHMgPSBbXTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXR1cm5TdHIubGVuZ3RoOyBpKyspIHsKICAgICAgICBmaWVsZFtpXSA9IHRoaXMuY3VzdG9tRGlhbG9nLmRzVHlwZSA9PSAnZGF0YVNvdXJjZScgPyByZXR1cm5TdHJbaV0uZmllbGQudG9Mb3dlckNhc2UoKSA6IHJldHVyblN0cltpXS5maWVsZDsKICAgICAgICBjb21tZW50W2ldID0gdGhpcy5jdXN0b21EaWFsb2cuZHNUeXBlID09ICdkYXRhU291cmNlJyA/IHJldHVyblN0cltpXS5jb21tZW50LnRvTG93ZXJDYXNlKCkgOiByZXR1cm5TdHJbaV0uY29tbWVudDsKICAgICAgfQogICAgICB2YXIgdGhpc18gPSB0aGlzOwogICAgICB0aGlzLnNlbGVjdE9yZ3MuZm9yRWFjaChmdW5jdGlvbiAocm93KSB7CiAgICAgICAgaWYgKHRoaXNfLmNoZWNrQm94RGF0YUFsbCB8fCB0aGlzXy5jaGVja0JveERhdGFBbGwubGVuZ3RoIDwgMSkgewogICAgICAgICAgdGhpc18uY2hlY2tCb3hEYXRhQWxsLnB1c2gocm93KTsKICAgICAgICB9IGVsc2UgaWYgKEpTT04uc3RyaW5naWZ5KHRoaXNfLmluZGV4QXJyYXkpLmluZGV4T2YoSlNPTi5zdHJpbmdpZnkocm93KSkgPT0gLTEpIHsKICAgICAgICAgIHRoaXNfLmNoZWNrQm94RGF0YUFsbC5wdXNoKHJvdyk7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgdmFyIHMgPSB0aGlzLnNlbGVjdE9yZ3M7CiAgICAgIGlmICh0aGlzLmN1c3RvbURpYWxvZy5zZWxlY3ROdW0gPT09IDEpIHsKICAgICAgICB2YXIgdGVtcCA9ICcnOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29tbWVudC5sZW5ndGg7IGkrKykgewogICAgICAgICAgdmFyIGVuY29kZVN0ciA9IGVuY29kZVVSSUNvbXBvbmVudChzWzBdW2ZpZWxkW2ldXSk7CiAgICAgICAgICB0ZW1wICs9ICciJyArIGNvbW1lbnRbaV0gKyAnIjoiJyArIGVuY29kZVN0ciArICciLCc7CiAgICAgICAgfQogICAgICAgIGlmICh0ZW1wICE9ICcnKSB7CiAgICAgICAgICB0ZW1wID0gJ3snICsgdGVtcC5zdWJzdHJpbmcoMCwgdGVtcC5sZW5ndGggLSAxKSArICd9JzsKICAgICAgICB9CiAgICAgICAgc3RyLnB1c2goSlNPTi5wYXJzZSh0ZW1wKSk7CiAgICAgICAgaWRzLnB1c2goc1swXS5pZCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2YXIgdGVtcCA9ICcnOwogICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjb21tZW50Lmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgIHZhciBfZW5jb2RlU3RyID0gZW5jb2RlVVJJQ29tcG9uZW50KHNbaV1bZmllbGRbal1dKTsKICAgICAgICAgICAgdGVtcCArPSAnIicgKyBjb21tZW50W2pdICsgJyI6IicgKyBfZW5jb2RlU3RyICsgJyIsJzsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0ZW1wICE9ICcnKSB7CiAgICAgICAgICAgIHRlbXAgPSAneycgKyB0ZW1wLnN1YnN0cmluZygwLCB0ZW1wLmxlbmd0aCAtIDEpICsgJ30nOwogICAgICAgICAgfQogICAgICAgICAgc3RyLnB1c2goSlNPTi5wYXJzZSh0ZW1wKSk7CiAgICAgICAgICBpZHMucHVzaChzW2ldLmlkKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdmFyIHJldHVybkRhdGEgPSBzdHI7CiAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgIHZhciBmb3JtSW5zdCA9IHV0aWxzLmdldE9ubGluZUZvcm1JbnN0YW5jZSh0aGlzKTsKICAgICAgdHJ5IHsKICAgICAgICB2YXIgcmV0dXJuU2l6ZSA9IHJldHVybkRhdGEubGVuZ3RoOwogICAgICAgIC8v5Yik5pat5piv5ZCm5piv5LiA5a+55LiA5a2Z6KGoCiAgICAgICAgaWYgKF90aGlzLnJlbGF0aW9uICYmIF90aGlzLnJlbGF0aW9uID09ICdvbmV0b29uZScpIHsKICAgICAgICAgIGlmIChyZXR1cm5TaXplID4gMSkgewogICAgICAgICAgICB0aGlzXy4kbWVzc2FnZS5lcnJvcigi5LiA5a+55LiA5a2Z6KGo5Y+q6IO96YCJ5oup5LiA5p2h5pWw5o2uIik7CiAgICAgICAgICAgIHRoaXNfLmN1c3RvbURpYWxvZ1Nob3dMaXN0ID0gdHJ1ZTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm5EYXRhLmZvckVhY2goZnVuY3Rpb24gKHJvdykgewogICAgICAgICAgdmFyIHRhcmdldEFycmF5ID0gbnVsbDsKICAgICAgICAgIHZhciBzdWJMaW5lRGF0YSA9IHt9OwogICAgICAgICAgX3RoaXMuY3VzdGRpYWxvZy5jdXN0RGlhbG9nLm1hcHBpbmdDb25mLmZvckVhY2goZnVuY3Rpb24gKGNvbikgewogICAgICAgICAgICBpZiAoY29uLnRhcmdldFswXSkgewogICAgICAgICAgICAgIHRhcmdldEFycmF5ID0gY29uLnRhcmdldFswXS5zcGxpdCgiLiIpOwogICAgICAgICAgICAgIHZhciBmcm9tID0gIiI7CiAgICAgICAgICAgICAgaWYgKF90aGlzLmN1c3RvbURpYWxvZy5kc1R5cGUgPT0gInJlc3RmdWwiKSB7CiAgICAgICAgICAgICAgICBmcm9tID0gY29uLmZyb207CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGZyb20gPSBjb24uZnJvbS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBzdWJMaW5lRGF0YVt0YXJnZXRBcnJheVt0YXJnZXRBcnJheS5sZW5ndGggLSAxXV0gPSBkZWNvZGVVUklDb21wb25lbnQocm93W2Zyb21dKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgICBpZiAodGFyZ2V0QXJyYXkpIHsKICAgICAgICAgICAgLy/lrZDooajnmoTkuIvmoIcKICAgICAgICAgICAgdmFyIHN1YkluZGV4ID0gdXRpbHMuZ2V0U29tZUF0dHJpYnV0ZUZyb21QYXJlbnRFbGVtZW50KF90aGlzLiRlbCwgImRhdGEtaW5kZXgiKTsKICAgICAgICAgICAgLy/liKTmlq3lrZnooajmmK/lkKbnrYnkuo7nqboKICAgICAgICAgICAgaWYgKCFmb3JtSW5zdFsiZGF0YSJdW3RhcmdldEFycmF5WzBdXVt0YXJnZXRBcnJheVsxXV1bc3ViSW5kZXhdW3RhcmdldEFycmF5WzJdXSkgewogICAgICAgICAgICAgIC8v5aaC5p6c562J5LqO56m65YiZ6K6p5a6D562J5LqO56m65pWw57uECiAgICAgICAgICAgICAgZm9ybUluc3RbImRhdGEiXVt0YXJnZXRBcnJheVswXV1bdGFyZ2V0QXJyYXlbMV1dW3N1YkluZGV4XVt0YXJnZXRBcnJheVsyXV0gPSBuZXcgQXJyYXkoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgc3ViQm8gPSBmb3JtSW5zdFsiZGF0YSJdW3RhcmdldEFycmF5WzBdXVt0YXJnZXRBcnJheVsxXV1bc3ViSW5kZXhdW3RhcmdldEFycmF5WzJdXTsKICAgICAgICAgICAgLy/liKTmlq3mmK/lkKblpKfkuo7lrZnooajmlbDmja7mnIDlpKfooYzmlbAKICAgICAgICAgICAgaWYgKHRoaXNfLm1heFJvdyAhPSAwICYmIHN1YkJvLmxlbmd0aCArIHJldHVyblNpemUgPiB0aGlzXy5tYXhSb3cpIHsKICAgICAgICAgICAgICB0aGlzXy4kbWVzc2FnZS5lcnJvcigi5a2Z6KGo5pWw5o2u5bey6LaF6L+H5pyA5aSn6KGM5pWw44CQIiArIHRoaXNfLm1heFJvdyArICLjgJEiKTsKICAgICAgICAgICAgICB0aGlzXy5jdXN0b21EaWFsb2dTaG93TGlzdCA9IHRydWU7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJFbmRJdGVyYXRpdmUiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvL+WIpOaWreaYr+WQpuaYr+S4gOWvueS4gOWtmeihqAogICAgICAgICAgICBpZiAoX3RoaXMucmVsYXRpb24gJiYgX3RoaXMucmVsYXRpb24gPT0gIm9uZXRvb25lIikgewogICAgICAgICAgICAgIHN1YkJvLmVtcHR5KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3ViQm8ucHVzaChzdWJMaW5lRGF0YSk7CiAgICAgICAgICAgIHJldHVyblNpemUtLTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGlmIChlLm1lc3NhZ2UgIT0gIkVuZEl0ZXJhdGl2ZSIpIHRocm93IGU7CiAgICAgIH0KICAgICAgOwogICAgfSwKICAgIC8v5Y+W5raI5oyJ6ZKuCiAgICBkaWFsb2dDYW5jZWw6IGZ1bmN0aW9uIGRpYWxvZ0NhbmNlbCgpIHsKICAgICAgdmFyIF90aGlzNiA9IHRoaXM7CiAgICAgIHZhciB0aGlzXyA9IHRoaXM7CiAgICAgIHRoaXNfLnF1ZXJ5UGFyYW0gPSAiIjsKICAgICAgdGhpc18uJHN0b3JlLmRpc3BhdGNoKCJkaWFsb2cvc2V0RGlhbG9nRGF0YSIsIFtdKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICB0aGlzXy5jdXN0b21EaWFsb2dTaG93TGlzdCA9IGZhbHNlOwogICAgICAgIC8v5Yik5pat5piv5ZCm5piv54K55Ye75LqG56Gu6K6k5YaN54K55Ye75Y+W5raI55qEICBpbnB1dFZhbOayoeacieWAvOWImeihqOekuuebtOaOpeeCueWHu+eahOWPlua2iAogICAgICAgIGlmICghdGhpc18uaW5wdXRWYWwpIHsKICAgICAgICAgIHRoaXNfLnNlbGVjdE9yZ3MgPSBbXTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpc18uc2VsZWN0T3JncyA9IF90b0NvbnN1bWFibGVBcnJheSh0aGlzXy5zaG93RGF0YSk7CiAgICAgICAgICBfdGhpczYuY2hlY2tCb3hEYXRhQWxsID0gX3RvQ29uc3VtYWJsZUFycmF5KHRoaXNfLnNlbGVjdE9yZ3MpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9LAogICAgZGlhbG9nVHJlZUNvbmZpcm06IGZ1bmN0aW9uIGRpYWxvZ1RyZWVDb25maXJtKCkgewogICAgICB2YXIgX3RoaXM3ID0gdGhpczsKICAgICAgdmFyIHRoaXNfID0gdGhpczsKICAgICAgaWYgKHRoaXNfLnByb3BzRGF0YS5sZW5ndGggPT0gMCkgewogICAgICAgIHRoaXNfLiRtZXNzYWdlLmVycm9yKCLor7fpgInmi6nmlbDmja7lm57loasiKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdGhpcy4kc3RvcmUuZGlzcGF0Y2goJ2RpYWxvZy9zZXREaWFsb2dEYXRhJywgW10pOwogICAgICB2YXIgcmV0dXJuU3RyID0gSlNPTi5wYXJzZSh0aGlzLmN1c3RvbURpYWxvZy5yZXN1bHRmaWVsZCk7CiAgICAgIHZhciBmaWVsZCA9IG5ldyBBcnJheShbcmV0dXJuU3RyLmxlbmd0aF0pOwogICAgICB2YXIgY29tbWVudCA9IG5ldyBBcnJheShbcmV0dXJuU3RyLmxlbmd0aF0pOwogICAgICB2YXIgc3RyID0gW107CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmV0dXJuU3RyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgZmllbGRbaV0gPSByZXR1cm5TdHJbaV0uZmllbGQ7CiAgICAgICAgY29tbWVudFtpXSA9IHJldHVyblN0cltpXS5jb21tZW50OwogICAgICB9CiAgICAgIGlmICh0aGlzLmN1c3RvbURpYWxvZy5zZWxlY3ROdW0gPT09IDEpIHsKICAgICAgICB2YXIgbm9kZXMgPSB0aGlzLnByb3BzRGF0YVswXTsKICAgICAgICB2YXIgdGVtcCA9ICcnOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29tbWVudC5sZW5ndGg7IGkrKykgewogICAgICAgICAgdGVtcCArPSAnIicgKyBjb21tZW50W2ldICsgJyI6IicgKyBub2Rlc1tmaWVsZFtpXV0gKyAnIiwnOwogICAgICAgIH0KICAgICAgICBpZiAodGVtcCAhPSAnJykgewogICAgICAgICAgdGVtcCA9ICd7JyArIHRlbXAuc3Vic3RyaW5nKDAsIHRlbXAubGVuZ3RoIC0gMSkgKyAnfSc7CiAgICAgICAgfQogICAgICAgIHN0ci5wdXNoKEpTT04ucGFyc2UodGVtcCkpOwogICAgICB9IGVsc2UgewogICAgICAgIHZhciBub2RlcyA9IHRoaXMucHJvcHNEYXRhOwogICAgICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0sIGspIHsKICAgICAgICAgIHZhciB0ZW1wID0gJyc7CiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbW1lbnQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdGVtcCArPSAnIicgKyBjb21tZW50W2ldICsgJyI6IicgKyBub2Rlc1tmaWVsZFtpXV0gKyAnIiwnOwogICAgICAgICAgICB0ZW1wICs9ICciJyArIGNvbW1lbnRbaV0gKyAnIjoiJyArIG5vZGVzW2tdW2ZpZWxkW2ldXSArICciLCc7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodGVtcCAhPSAnJykgewogICAgICAgICAgICB0ZW1wID0gJ3snICsgdGVtcC5zdWJzdHJpbmcoMCwgdGVtcC5sZW5ndGggLSAxKSArICd9JzsKICAgICAgICAgIH0KICAgICAgICAgIHN0ci5wdXNoKEpTT04ucGFyc2UodGVtcCkpOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIHZhciByZXR1cm5EYXRhID0gc3RyOwogICAgICB2YXIgZm9ybUluc3QgPSB1dGlscy5nZXRPbmxpbmVGb3JtSW5zdGFuY2UodGhpcyk7CiAgICAgIHRyeSB7CiAgICAgICAgdmFyIHJldHVyblNpemUgPSByZXR1cm5EYXRhLmxlbmd0aDsKICAgICAgICAvL+WIpOaWreaYr+WQpuaYr+S4gOWvueS4gOWtmeihqAogICAgICAgIGlmICh0aGlzXy5yZWxhdGlvbiAmJiB0aGlzXy5yZWxhdGlvbiA9PSAnb25ldG9vbmUnKSB7CiAgICAgICAgICBpZiAocmV0dXJuU2l6ZSA+IDEpIHsKICAgICAgICAgICAgdGhpc18uJG1lc3NhZ2UuZXJyb3IoIuS4gOWvueS4gOWtmeihqOWPquiDvemAieaLqeS4gOadoeaVsOaNriIpOwogICAgICAgICAgICB0aGlzXy5jdXN0b21EaWFsb2dTaG93VHJlZSA9IHRydWU7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuRGF0YS5mb3JFYWNoKGZ1bmN0aW9uIChyb3cpIHsKICAgICAgICAgIHZhciB0YXJnZXRBcnJheSA9IG51bGw7CiAgICAgICAgICB2YXIgc3ViTGluZURhdGEgPSB7fTsKICAgICAgICAgIHZhciBwYXRoQXJyYXkgPSBudWxsOwogICAgICAgICAgX3RoaXM3LmN1c3RkaWFsb2cuY3VzdERpYWxvZy5tYXBwaW5nQ29uZi5mb3JFYWNoKGZ1bmN0aW9uIChjb24pIHsKICAgICAgICAgICAgdGFyZ2V0QXJyYXkgPSBudWxsOwogICAgICAgICAgICBpZiAoY29uLnRhcmdldFswXSkgewogICAgICAgICAgICAgIHRhcmdldEFycmF5ID0gY29uLnRhcmdldFswXS5zcGxpdCgiLiIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChjb24udGFyZ2V0WzBdICYmICFwYXRoQXJyYXkpIHsKICAgICAgICAgICAgICBwYXRoQXJyYXkgPSBjb24udGFyZ2V0WzBdLnNwbGl0KCIuIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGZyb20gPSAiIjsKICAgICAgICAgICAgaWYgKHRoaXNfLmN1c3RvbURpYWxvZy5kc1R5cGUgPT0gInJlc3RmdWwiKSB7CiAgICAgICAgICAgICAgZnJvbSA9IGNvbi5mcm9tOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGZyb20gPSBjb24uZnJvbTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGFyZ2V0QXJyYXkpIHsKICAgICAgICAgICAgICBzdWJMaW5lRGF0YVt0YXJnZXRBcnJheVt0YXJnZXRBcnJheS5sZW5ndGggLSAxXV0gPSByb3dbZnJvbV07CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgICAgaWYgKHBhdGhBcnJheSkgewogICAgICAgICAgICAvL+WtkOihqOeahOS4i+aghwogICAgICAgICAgICB2YXIgc3ViSW5kZXggPSB1dGlscy5nZXRTb21lQXR0cmlidXRlRnJvbVBhcmVudEVsZW1lbnQodGhpc18uJGVsLCAiZGF0YS1pbmRleCIpOwogICAgICAgICAgICAvL+WIpOaWreWtmeihqOaYr+WQpuetieS6juepugogICAgICAgICAgICBpZiAoIWZvcm1JbnN0WyJkYXRhIl1bcGF0aEFycmF5WzBdXVtwYXRoQXJyYXlbMV1dW3N1YkluZGV4XVtwYXRoQXJyYXlbMl1dKSB7CiAgICAgICAgICAgICAgLy/lpoLmnpznrYnkuo7nqbrliJnorqnlroPnrYnkuo7nqbrmlbDnu4QKICAgICAgICAgICAgICBmb3JtSW5zdFsiZGF0YSJdW3BhdGhBcnJheVswXV1bcGF0aEFycmF5WzFdXVtzdWJJbmRleF1bcGF0aEFycmF5WzJdXSA9IG5ldyBBcnJheSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBzdWJCbyA9IGZvcm1JbnN0WyJkYXRhIl1bcGF0aEFycmF5WzBdXVtwYXRoQXJyYXlbMV1dW3N1YkluZGV4XVtwYXRoQXJyYXlbMl1dOwogICAgICAgICAgICAvL+WIpOaWreaYr+WQpuWkp+S6juWtmeihqOaVsOaNruacgOWkp+ihjOaVsAogICAgICAgICAgICBpZiAodGhpc18ubWF4Um93ICE9IDAgJiYgc3ViQm8ubGVuZ3RoICsgcmV0dXJuU2l6ZSA+IHRoaXNfLm1heFJvdykgewogICAgICAgICAgICAgIHRoaXNfLiRtZXNzYWdlLmVycm9yKCLlrZnooajmlbDmja7lt7LotoXov4fmnIDlpKfooYzmlbDjgJAiICsgdGhpc18ubWF4Um93ICsgIuOAkSIpOwogICAgICAgICAgICAgIHRoaXNfLmN1c3RvbURpYWxvZ1Nob3dUcmVlID0gdHJ1ZTsKICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkVuZEl0ZXJhdGl2ZSIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8v5Yik5pat5piv5ZCm5piv5LiA5a+55LiA5a2Z6KGoCiAgICAgICAgICAgIGlmICh0aGlzXy5yZWxhdGlvbiAmJiB0aGlzXy5yZWxhdGlvbiA9PSAib25ldG9vbmUiKSB7CiAgICAgICAgICAgICAgc3ViQm8uZW1wdHkoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdWJCby5wdXNoKHN1YkxpbmVEYXRhKTsKICAgICAgICAgICAgcmV0dXJuU2l6ZS0tOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIHRoaXMuY3VzdG9tRGlhbG9nU2hvd1RyZWUgPSBmYWxzZTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGlmIChlLm1lc3NhZ2UgIT0gIkVuZEl0ZXJhdGl2ZSIpIHRocm93IGU7CiAgICAgIH0KICAgICAgOwogICAgfSwKICAgIGRpYWxvZ0NhbmNlbFRyZWU6IGZ1bmN0aW9uIGRpYWxvZ0NhbmNlbFRyZWUoKSB7CiAgICAgIHRoaXMuJHN0b3JlLmRpc3BhdGNoKCJkaWFsb2cvc2V0RGlhbG9nRGF0YSIsIFtdKTsKICAgICAgdGhpcy5jdXN0b21EaWFsb2dTaG93VHJlZSA9IGZhbHNlOwogICAgfSwKICAgIGdldENoZWNrZWQ6IGZ1bmN0aW9uIGdldENoZWNrZWQoZGF0YSwgY2hlY2tlZCwgaW5kZXRlcm1pbmF0ZSkgewogICAgICBpZiAodGhpcy5jdXN0b21EaWFsb2cuc2VsZWN0TnVtID09PSAxKSB7CiAgICAgICAgdGhpcy5wcm9wc0RhdGEgPSBbXTsKICAgICAgICB0aGlzLnByb3BzRGF0YS5wdXNoKGRhdGEpOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMucHJvcHNEYXRhID0gdGhpcy4kcmVmcy50cmVlLmdldENoZWNrZWROb2RlcygpOwogICAgICB9CiAgICB9LAogICAgdHJlZUNsaWNrOiBmdW5jdGlvbiB0cmVlQ2xpY2soZGF0YSwgbiwgaSkgewogICAgICBpZiAodGhpcy5jdXN0b21EaWFsb2cuc2VsZWN0TnVtID09PSAxKSB7CiAgICAgICAgdGhpcy5wcm9wc0RhdGEgPSBbXTsKICAgICAgICB0aGlzLnByb3BzRGF0YS5wdXNoKGRhdGEpOwogICAgICB9CiAgICB9LAogICAgY2xlYXJBbGxTZWxlY3RPcmdzOiBmdW5jdGlvbiBjbGVhckFsbFNlbGVjdE9yZ3MoKSB7CiAgICAgIHRoaXMuc2VsZWN0T3JncyA9IG51bGw7CiAgICAgIHRoaXMuJHJlZnMub3JnVGFibGUuY2xlYXJTZWxlY3Rpb24oKTsKICAgIH0sCiAgICByZW1vdmVTZWxlY3RPcmc6IGZ1bmN0aW9uIHJlbW92ZVNlbGVjdE9yZyhpdGVtKSB7CiAgICAgIHZhciBfdGhpczggPSB0aGlzOwogICAgICBpZiAodGhpcy5jdXN0b21EaWFsb2cuc2VsZWN0TnVtID09PSAxKSB7CiAgICAgICAgdGhpcy4kZW1pdCgiaW5wdXQiLCAiIik7CiAgICAgICAgdGhpcy5zZWxlY3RPcmdzLnNwbGljZShpdGVtLCAxKTsKICAgICAgICB0aGlzLnNob3dEYXRhLnNwbGljZShpdGVtLCAxKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLmlucHV0VmFsLnNwbGljZShpdGVtLCAxKTsKICAgICAgICAvLyBsZXQgcmVtb3ZlSWQgPSB0aGlzLnNob3dEYXRhW2l0ZW1dOwogICAgICAgIC8v5qCR5b2iCiAgICAgICAgaWYgKHRoaXMucHJvcHNEYXRhLmxlbmd0aCA+IDApIHsKICAgICAgICAgIHRoaXMucHJvcHNEYXRhLnNwbGljZShpdGVtLCAxKTsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuc2hvd0RhdGEubGVuZ3RoID4gMCkgewogICAgICAgICAgdGhpcy5zaG93RGF0YS5zcGxpY2UoaXRlbSwgMSk7CiAgICAgICAgfQogICAgICAgIC8v5YiX6KGoCiAgICAgICAgaWYgKHRoaXMuc2VsZWN0T3JncyAhPSBudWxsKSB7CiAgICAgICAgICB0aGlzLnNlbGVjdE9yZ3Muc3BsaWNlKGl0ZW0sIDEpOwogICAgICAgICAgdGhpcy5jaGVja0JveERhdGFBbGwuc3BsaWNlKGl0ZW0sIDEpOwogICAgICAgICAgdGhpcy5zZWxlY3RPcmdzLmZvckVhY2goZnVuY3Rpb24gKHJvdykgewogICAgICAgICAgICAvLyBpZihpdGVtLmlkID09cmVtb3ZlSWQgKXsKICAgICAgICAgICAgX3RoaXM4LmlzQ3VycmVudENoYW5nZSA9IHRydWU7CiAgICAgICAgICAgIF90aGlzOC50b2dnbGVSb3dTZWxlY3Rpb24ocm93LCBmYWxzZSk7CiAgICAgICAgICAgIC8vIH0KICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICB0aGlzLmNhbGFjSW5wdXRTdWZmaXhIZWlnaHQoKTsKICAgICAgICB2YXIgdmFsdWUgPSAiIjsKICAgICAgICB0aGlzLmlucHV0VmFsLmZvckVhY2goZnVuY3Rpb24gKHZhbCkgewogICAgICAgICAgdmFsdWUgKz0gdmFsLnZhbHVlICsgIiwiOwogICAgICAgIH0pOwogICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPiAwKSB7CiAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZygwLCB2YWx1ZS5sZW5ndGggLSAxKTsKICAgICAgICB9CiAgICAgICAgaWYgKHZhbHVlICE9ICIiKSB7CiAgICAgICAgICB2YWx1ZSA9IHZhbHVlICsgInx8IiArIEpTT04uc3RyaW5naWZ5KHRoaXMuc2hvd0RhdGEpOwogICAgICAgIH0KICAgICAgICB0aGlzLiRlbWl0KCJpbnB1dCIsIHZhbHVlKTsKICAgICAgfQogICAgICB0aGlzLnN5bmNJbnB1dFZhbHVlKCk7CiAgICB9LAogICAgY2FsYWNJbnB1dFN1ZmZpeEhlaWdodDogZnVuY3Rpb24gY2FsYWNJbnB1dFN1ZmZpeEhlaWdodCgpIHsKICAgICAgdmFyIF90aGlzOSA9IHRoaXM7CiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgIGlmICghX3RoaXM5LiRyZWZzLnRhZ1NwYW5zKSByZXR1cm47CiAgICAgICAgaWYgKF90aGlzOS4kcmVmcy50YWdTcGFucy5vZmZzZXRIZWlnaHQpIHsKICAgICAgICAgIF90aGlzOS5pbnB1dFN1ZmZpeEhlaWdodCA9IF90aGlzOS4kcmVmcy50YWdTcGFucy5vZmZzZXRIZWlnaHQgKyA1OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBfdGhpczkuaW5wdXRTdWZmaXhIZWlnaHQgPSAzMDsKICAgICAgICB9CiAgICAgICAgLy8g6Kem5Y+R6aqM6K+BCiAgICAgICAgX3RoaXM5LiR2YWxpZGF0b3IudmFsaWRhdGUoKTsKICAgICAgfSwgMCk7CiAgICB9LAogICAgY3VzdG9tRGlhbG9nU2hvdzogZnVuY3Rpb24gY3VzdG9tRGlhbG9nU2hvdyhwYWdlUGFyYW0pIHsKICAgICAgdGhpcy5jdXN0b21EaWFsb2dTaG93TGlzdCA9IHRydWU7CiAgICAgIHRoaXMuY3VzdG9tRGlhbG9nID0gcGFnZVBhcmFtLmN1c3RvbURpYWxvZzsKICAgICAgdGhpcy5jdXN0b21EaWFsb2cucXVlcnlVcmwgPSB0aGlzLmN1c3RvbURpYWxvZy5kc1R5cGUgPT0gImRhdGFTb3VyY2UiID8gIiR7Zm9ybX0vZm9ybS9jdXN0b21EaWFsb2cvdjEvZ2V0TGlzdERhdGE/YWxpYXM9IiArIHRoaXMuY3VzdG9tRGlhbG9nLmFsaWFzICsgIiZtYXBQYXJhbT0iICsgKHRoaXMuY3VzdG9tRGlhbG9nLm1hcFBhcmFtID8gdGhpcy5jdXN0b21EaWFsb2cubWFwUGFyYW0gOiAiIikgOiB0aGlzLmN1c3RvbURpYWxvZy51cmw7CiAgICAgIGlmICh0aGlzLmRpYWxvZ0RhdGEubGVuZ3RoIDwgMSkgewogICAgICAgIHRoaXMucGFnaW5hdGlvbiA9IHsKICAgICAgICAgIHBhZ2U6IDEsCiAgICAgICAgICBwYWdlU2l6ZTogMjAsCiAgICAgICAgICBzaG93VG90YWw6ICJ0cnVlIgogICAgICAgIH07CiAgICAgICAgdGhpcy5zZWFyY2goKTsKICAgICAgICB0aGlzLmRpc3BsYXlmaWVsZCA9IEpTT04ucGFyc2UocGFnZVBhcmFtLmN1c3RvbURpYWxvZy5kaXNwbGF5ZmllbGQpOwogICAgICAgIGlmICh0aGlzLmN1c3RvbURpYWxvZy5kc1R5cGUgPT0gImRhdGFTb3VyY2UiKSB7CiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZGlzcGxheWZpZWxkLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHRoaXMuZGlzcGxheWZpZWxkW2ldLmZpZWxkID0gdGhpcy5kaXNwbGF5ZmllbGRbaV0uZmllbGQudG9Mb3dlckNhc2UoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAodGhpcy5kaWFsb2dEYXRhLmxlbmd0aCA+IDEpIHsKICAgICAgICB0aGlzLnNlYXJjaCgpOwogICAgICB9CiAgICAgIGlmICh0aGlzLmRpYWxvZ0RhdGEubGVuZ3RoID4gMCAmJiB0aGlzLmRpc3BsYXlmaWVsZC5sZW5ndGggPT0gMCkgewogICAgICAgIHRoaXMuc2VhcmNoKCk7CiAgICAgICAgdGhpcy5kaXNwbGF5ZmllbGQgPSBKU09OLnBhcnNlKHBhZ2VQYXJhbS5jdXN0b21EaWFsb2cuZGlzcGxheWZpZWxkKTsKICAgICAgICBpZiAodGhpcy5jdXN0b21EaWFsb2cuZHNUeXBlID09ICJkYXRhU291cmNlIikgewogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRpc3BsYXlmaWVsZC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB0aGlzLmRpc3BsYXlmaWVsZFtpXS5maWVsZCA9IHRoaXMuZGlzcGxheWZpZWxkW2ldLmZpZWxkLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgY3VzdG9tRGlhbG9nVHJlZVNob3c6IGZ1bmN0aW9uIGN1c3RvbURpYWxvZ1RyZWVTaG93KHBhZ2VQYXJhbSkgewogICAgICB0aGlzLmN1c3RvbURpYWxvZyA9IHBhZ2VQYXJhbS5jdXN0b21EaWFsb2c7CiAgICAgIHZhciBjdXN0b21EaWFsb2cgPSB0aGlzLmN1c3RvbURpYWxvZzsKICAgICAgdmFyIG1hcFBhcmFtID0gIiI7CiAgICAgIGlmIChwYWdlUGFyYW0ucGFyYW0gIT0gdW5kZWZpbmVkKSB7CiAgICAgICAgbWFwUGFyYW0gPSBKU09OLnN0cmluZ2lmeShwYWdlUGFyYW0ucGFyYW0pOwogICAgICAgIG1hcFBhcmFtID0gbWFwUGFyYW0uc3Vic3RyaW5nKDEsIG1hcFBhcmFtLmxlbmd0aCAtIDEpOwogICAgICB9CiAgICAgIHZhciByZXF1ZXN0VHlwZSA9IGN1c3RvbURpYWxvZy5kc1R5cGUgPT0gImRhdGFTb3VyY2UiID8gIkdFVCIgOiBjdXN0b21EaWFsb2cucmVxdWVzdFR5cGUgPyBjdXN0b21EaWFsb2cucmVxdWVzdFR5cGUgOiAiUE9TVCI7CiAgICAgIHZhciB1cmwgPSAiJHtmb3JtfS9mb3JtL2N1c3RvbURpYWxvZy92MS9nZXRUcmVlRGF0YT9hbGlhcz0iICsgcGFnZVBhcmFtLmFsaWFzICsgIiZtYXBQYXJhbT0iICsgbWFwUGFyYW07CiAgICAgIHZhciBwYXJhbXNPYmogPSB7fTsKICAgICAgaWYgKGN1c3RvbURpYWxvZy5kc1R5cGUgIT0gImRhdGFTb3VyY2UiKSB7CiAgICAgICAgdXJsID0gY3VzdG9tRGlhbG9nLnVybDsKICAgICAgICB2YXIgdGVtcGxhdGVQYSA9IGN1c3RvbURpYWxvZy5kYXRhUGFyYW07CiAgICAgICAgaWYgKGN1c3RvbURpYWxvZy5jb25kaXRpb25maWVsZCkgewogICAgICAgICAgdmFyIGNvbmRpdGlvbnMgPSBKU09OLnBhcnNlKGN1c3RvbURpYWxvZy5jb25kaXRpb25maWVsZCk7CiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbmRpdGlvbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdmFyIGNvbiA9IGNvbmRpdGlvbnNbaV07CiAgICAgICAgICAgIGlmIChyZXF1ZXN0VHlwZSA9PSAiUE9TVCIpIHsKICAgICAgICAgICAgICBpZiAodGVtcGxhdGVQYSkgewogICAgICAgICAgICAgICAgdGVtcGxhdGVQYSA9IHRlbXBsYXRlUGEucmVwbGFjZShuZXcgUmVnRXhwKCJcXHsiICsgY29uLmZpZWxkICsgIlxcfSIsICJnIiksIGNvbi5kZWZhdWx0VmFsdWUpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBwYXJhbXNPYmpbY29uLmZpZWxkXSA9IGNvbi5kZWZhdWx0VmFsdWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHZhciBsakNoYXIgPSB1cmwuaW5kZXhPZigiPyIpID09IC0xID8gIj8iIDogIiYiOwogICAgICAgICAgICAgIHVybCA9IHVybCArIGxqQ2hhciArIGNvbi5maWVsZCArICI9IiArIGNvbi5kZWZhdWx0VmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmICh0ZW1wbGF0ZVBhKSB7CiAgICAgICAgICAgIHBhcmFtc09iaiA9IEpTT04ucGFyc2UodGVtcGxhdGVQYSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHZhciByZXF1ZXN0UGFyYW1zID0ge307CiAgICAgIHJlcXVlc3RQYXJhbXMucmVxdWVzdFR5cGUgPSByZXF1ZXN0VHlwZTsKICAgICAgcmVxdWVzdFBhcmFtcy51cmwgPSB1cmw7CiAgICAgIHJlcXVlc3RQYXJhbXMucGFyYW1zT2JqID0gcGFyYW1zT2JqOwogICAgICB0aGlzLnNlYXJjaFRyZWUocmVxdWVzdFBhcmFtcyk7CiAgICAgIHRoaXMuY3VzdG9tRGlhbG9nU2hvd1RyZWUgPSB0cnVlOwogICAgfSwKICAgIC8v5qCR5b2i5p+l6K+iCiAgICBzZWFyY2hUcmVlOiBmdW5jdGlvbiBzZWFyY2hUcmVlKHJlcXVlc3RQYXJhbXMpIHsKICAgICAgdmFyIHRoaXNfID0gdGhpczsKICAgICAgdmFyIHF1ZXJ5ID0gcmVxdWVzdFBhcmFtcy5yZXF1ZXN0VHlwZSA9PSAiUE9TVCIgPyByZXEucG9zdChyZXF1ZXN0UGFyYW1zLnVybCwgcmVxdWVzdFBhcmFtcy5wYXJhbXNPYmopIDogcmVxLmdldChyZXF1ZXN0UGFyYW1zLnVybCk7CiAgICAgIHF1ZXJ5LnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgLy/mmL7npLrlrZfmrrXphY3nva4KICAgICAgICB2YXIgZGlzcGxheWZpZWxkID0gSlNPTi5wYXJzZSh0aGlzXy5jdXN0b21EaWFsb2cuZGlzcGxheWZpZWxkKTsKICAgICAgICB0aGlzXy5kaXNwbGF5RmllbGQgPSBkaXNwbGF5ZmllbGQ7CiAgICAgICAgLy/miorlr7nor53moYbphY3nva7nmoTmmL7npLrlrZfmrrXmmL7npLrlkI3np7DotYvlgLznu5nmoJHlvaLnmoTmmL7npLrlgLwKICAgICAgICB0aGlzXy5kZWZhdWx0UHJvcHMubGFiZWwgPSBkaXNwbGF5ZmllbGQuZGlzcGxheU5hbWU7CiAgICAgICAgdGhpc18udHJlZUxpc3QgPSByZXNwb25zZS5kYXRhOwogICAgICAgIC8v5b6X5Yiw6KaB5Yqg6L295qCR55qE5L+h5oGvCiAgICAgICAgdGhpc18ucHJvcHMxID0gdGhpc18udG9UcmVlRGF0YShyZXNwb25zZS5kYXRhLCBkaXNwbGF5ZmllbGQuaWQsIGRpc3BsYXlmaWVsZC5waWQsIGRpc3BsYXlmaWVsZC5kaXNwbGF5TmFtZSwgZGlzcGxheWZpZWxkLnB2YWx1ZSA/IGRpc3BsYXlmaWVsZC5wdmFsdWUgOiAwKTsKICAgICAgfSk7CiAgICB9LAogICAgLy/liqDovb3moJHnmoTkv6Hmga8KICAgIHRvVHJlZURhdGE6IGZ1bmN0aW9uIHRvVHJlZURhdGEoZGF0YSwgaWQsIHBpZCwgbmFtZSwgcHZhbHVlKSB7CiAgICAgIC8vIOW7uueri+S4quagkeW9oue7k+aehCzpnIDopoHlrprkuYnkuKrmnIDpobblsYLnmoTniLboioLngrnvvIxwdmFsdWXmmK8wCiAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZURhdGFUb1RyZWUoZGF0YSwgcGlkLCBpZCwgbmFtZSwgcHZhbHVlKTsKICAgIH0sCiAgICB0cmFuc2xhdGVEYXRhVG9UcmVlOiBmdW5jdGlvbiB0cmFuc2xhdGVEYXRhVG9UcmVlKGRhdGEsIHBpZCwgaWQsIG5hbWUsIHB2YWx1ZSkgewogICAgICAvL+aKiuagkeaVsOaNruacieWtkOiKgueCueeahOaVsOaNruWFqOmDqOi/h+a7pOaOie+8iOWPqueVmeeItuiKgueCueeahOaVsOaNru+8iQogICAgICB2YXIgcGFyZW50cyA9IGRhdGEuZmlsdGVyKGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgIHJldHVybiB2YWx1ZVtpZF0gPT0gdmFsdWVbcGlkXSB8fCB2YWx1ZVtwaWRdID09IG51bGwgfHwgdmFsdWVbcGlkXSA9PSBwdmFsdWU7CiAgICAgIH0pOwogICAgICBpZiAoIXBhcmVudHMpIHsKICAgICAgICBwYXJlbnRzID0gZGF0YS5maWx0ZXIoZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgICByZXR1cm4gdmFsdWVbcGlkXSAhPT0gInVuZGVmaW5lZCIgJiYgdmFsdWVbcGlkXSAhPSBudWxsICYmIHZhbHVlW2lkXSAhPSB2YWx1ZVtwaWRdOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIHJldHVybiBwYXJlbnRzOwogICAgfSwKICAgIGxvYWRUcmVlOiBmdW5jdGlvbiBsb2FkVHJlZShub2RlLCByZXNvbHZlKSB7CiAgICAgIHZhciBfdGhpczEwID0gdGhpczsKICAgICAgaWYgKG5vZGUpIHsKICAgICAgICB2YXIgdGhpc18gPSB0aGlzOwogICAgICAgIHZhciBkaXNwbGF5RmllbGQgPSB0aGlzXy5jdXN0b21EaWFsb2cuc3R5bGUgPT0gMiA/IHRoaXNfLmNvbWJpVHJlZURpc3BsYXlGaWVsZCA6IHRoaXNfLmRpc3BsYXlGaWVsZDsKICAgICAgICByZXNvbHZlKHRoaXMudHJlZUxpc3QuZmlsdGVyKGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgICAgcmV0dXJuIHZhbHVlW2Rpc3BsYXlGaWVsZC5waWRdID09PSBub2RlLmRhdGFbZGlzcGxheUZpZWxkLmlkXTsKICAgICAgICB9KSk7CiAgICAgICAgaWYgKHRoaXMuc2hvd0RhdGEgJiYgdGhpcy5zaG93RGF0YS5sZW5ndGggPiAwKSB7CiAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgX3RoaXMxMC5zaG93RGF0YS5mb3JFYWNoKGZ1bmN0aW9uICh2KSB7CiAgICAgICAgICAgICAgaWYgKHYuUGlkID09IG5vZGUua2V5KSB7CiAgICAgICAgICAgICAgICB0aGlzXy4kcmVmcy50cmVlLnNldENoZWNrZWQodiwgdHJ1ZSk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXNfLmNoZWNrTm9kZSh2LCB0aGlzXyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgIH0sIDQwMCk7CiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgYWZ0ZXJPcGVuOiBmdW5jdGlvbiBhZnRlck9wZW4oKSB7CiAgICAgIC8v5omT5byA5a+56K+d5qGG5LmL5ZCO5Yqg6L295qCRCiAgICAgIHRoaXMubG9hZENvbWJpbmF0aW9uVHJlZSgpOwogICAgfSwKICAgIGxvYWRDb21iaW5hdGlvblRyZWU6IGZ1bmN0aW9uIGxvYWRDb21iaW5hdGlvblRyZWUoKSB7CiAgICAgIHZhciBfdGhpczExID0gdGhpczsKICAgICAgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLnN0eWxlICE9IDIpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdmFyIGNvbWJpbmF0aW9uUnVsZSA9IEpTT04ucGFyc2UodGhpcy5jdXN0b21EaWFsb2cuY29tYmluYXRpb25SdWxlKTsKICAgICAgdGhpcy5jb21iaW5hdGlvblJ1bGUgPSBjb21iaW5hdGlvblJ1bGU7CiAgICAgIHZhciB0cmVlQWxpYXMgPSBjb21iaW5hdGlvblJ1bGUubGVmdFRyZWU7CiAgICAgIC8v6I635Y+W5a+56K+d5qGG5pWw5o2uCiAgICAgIHJlcS5nZXQoIiR7Zm9ybX0vZm9ybS9jdXN0b21EaWFsb2cvdjEvZ2V0QnlBbGlhcz9hbGlhcz0iICsgdHJlZUFsaWFzKS50aGVuKGZ1bmN0aW9uIChyZXNwKSB7CiAgICAgICAgdmFyIHRyZWVEaWFsb2cgPSByZXNwLmRhdGE7CiAgICAgICAgX3RoaXMxMS5sZWZ0VHJlZVRpdGxlID0gdHJlZURpYWxvZy5uYW1lOwogICAgICAgIHZhciByZXFQYXJhbSA9IHt9OwogICAgICAgIHZhciByZXF1ZXN0VHlwZSA9IHRyZWVEaWFsb2cuZHNUeXBlID09ICJkYXRhU291cmNlIiA/ICJHRVQiIDogdHJlZURpYWxvZy5yZXF1ZXN0VHlwZSA/IHRyZWVEaWFsb2cucmVxdWVzdFR5cGUgOiAiUE9TVCI7CiAgICAgICAgdmFyIHVybCA9ICIke2Zvcm19L2Zvcm0vY3VzdG9tRGlhbG9nL3YxL2dldFRyZWVEYXRhP2FsaWFzPSIgKyB0cmVlQWxpYXMgKyAiJm1hcFBhcmFtPSI7CiAgICAgICAgdmFyIHBhcmFtc09iaiA9IHt9OwogICAgICAgIGlmICh0cmVlRGlhbG9nLmRzVHlwZSAhPSAiZGF0YVNvdXJjZSIpIHsKICAgICAgICAgIHVybCA9IHRyZWVEaWFsb2cudXJsOwogICAgICAgICAgdmFyIHRlbXBsYXRlUGEgPSB0cmVlRGlhbG9nLmRhdGFQYXJhbTsKICAgICAgICAgIGlmICh0cmVlRGlhbG9nLmNvbmRpdGlvbmZpZWxkKSB7CiAgICAgICAgICAgIHZhciBjb25kaXRpb25zID0gSlNPTi5wYXJzZSh0cmVlRGlhbG9nLmNvbmRpdGlvbmZpZWxkKTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25kaXRpb25zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgdmFyIGNvbiA9IGNvbmRpdGlvbnNbaV07CiAgICAgICAgICAgICAgaWYgKHJlcXVlc3RUeXBlID09ICJQT1NUIikgewogICAgICAgICAgICAgICAgaWYgKHRlbXBsYXRlUGEpIHsKICAgICAgICAgICAgICAgICAgdGVtcGxhdGVQYSA9IHRlbXBsYXRlUGEucmVwbGFjZShuZXcgUmVnRXhwKCJcXHsiICsgY29uLmZpZWxkICsgIlxcfSIsICJnIiksIGNvbi5kZWZhdWx0VmFsdWUpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgcGFyYW1zT2JqW2Nvbi5maWVsZF0gPSBjb24uZGVmYXVsdFZhbHVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB2YXIgbGpDaGFyID0gdXJsLmluZGV4T2YoIj8iKSA9PSAtMSA/ICI/IiA6ICImIjsKICAgICAgICAgICAgICAgIHVybCA9IHVybCArIGxqQ2hhciArIGNvbi5maWVsZCArICI9IiArIGNvbi5kZWZhdWx0VmFsdWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0ZW1wbGF0ZVBhKSB7CiAgICAgICAgICAgICAgcGFyYW1zT2JqID0gSlNPTi5wYXJzZSh0ZW1wbGF0ZVBhKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB2YXIgcmVxdWVzdFBhcmFtcyA9IHt9OwogICAgICAgIHJlcXVlc3RQYXJhbXMucmVxdWVzdFR5cGUgPSByZXF1ZXN0VHlwZTsKICAgICAgICByZXF1ZXN0UGFyYW1zLnVybCA9IHVybDsKICAgICAgICByZXF1ZXN0UGFyYW1zLnBhcmFtc09iaiA9IHBhcmFtc09iajsKICAgICAgICBfdGhpczExLiRzdG9yZS5kaXNwYXRjaCgiZGlhbG9nL2dldFRyZWVEYXRhIiwgcmVxdWVzdFBhcmFtcykudGhlbihmdW5jdGlvbiAocmVzcCkgewogICAgICAgICAgaWYgKHRyZWVEaWFsb2cuZGlzcGxheWZpZWxkICYmIHRyZWVEaWFsb2cucmVzdWx0ZmllbGQpIHsKICAgICAgICAgICAgdmFyIGRpc3BsYXlGaWVsZCA9IEpTT04ucGFyc2UodHJlZURpYWxvZy5kaXNwbGF5ZmllbGQpOwogICAgICAgICAgICB2YXIgcmVzdWx0ZmllbGQgPSBKU09OLnBhcnNlKHRyZWVEaWFsb2cucmVzdWx0ZmllbGQpOwogICAgICAgICAgICBfdGhpczExLmRlZmF1bHRQcm9wcy5sYWJlbCA9IGRpc3BsYXlGaWVsZC5kaXNwbGF5TmFtZTsKICAgICAgICAgICAgX3RoaXMxMS50cmVlTGlzdCA9IHJlc3A7CiAgICAgICAgICAgIF90aGlzMTEuY29tYmlUcmVlRGlzcGxheUZpZWxkID0gZGlzcGxheUZpZWxkOwogICAgICAgICAgICBfdGhpczExLmNvbWJpbmF0aW9uVHJlZURhdGEgPSBfdGhpczExLnRvVHJlZURhdGEocmVzcCwgZGlzcGxheUZpZWxkLmlkLCBkaXNwbGF5RmllbGQucGlkLCBkaXNwbGF5RmllbGQuZGlzcGxheU5hbWUsIGRpc3BsYXlGaWVsZC5wdmFsdWUgPyBkaXNwbGF5RmllbGQucHZhbHVlIDogIjAiLCByZXN1bHRmaWVsZCk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgfSwKICAgIGNvbWJpVHJlZUNsaWNrOiBmdW5jdGlvbiBjb21iaVRyZWVDbGljayhwYXJhbU9iaiwgbm9kZSwgbm9kZUNvbXBvbmVudCkgewogICAgICAvL+e7hOWQiOWvueivneahhueCueWHu+W3puagkQogICAgICAvL+a4heepuuaXp+eahAogICAgICB0aGlzLmNvbWJpbmF0aW9uVHJlZVF1ZXJ5cy5zcGxpY2UoMCk7CiAgICAgIHZhciBjb21iaW5hdGlvblJ1bGUgPSBKU09OLnBhcnNlKHRoaXMuY3VzdG9tRGlhbG9nLmNvbWJpbmF0aW9uUnVsZSk7CiAgICAgIGlmICghY29tYmluYXRpb25SdWxlLnJ1bGVzIHx8IGNvbWJpbmF0aW9uUnVsZS5ydWxlcy5sZW5ndGggPT0gMCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB2YXIgcnVsZXMgPSBjb21iaW5hdGlvblJ1bGUucnVsZXM7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcnVsZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgdmFsdWUgPSBwYXJhbU9ialtydWxlc1tpXS50cmVlRmllbGRdOwogICAgICAgIHZhciBwcm9wZXJ0eSA9IHJ1bGVzW2ldLmxpc3RGaWVsZDsKICAgICAgICB0aGlzLmNvbWJpbmF0aW9uVHJlZVF1ZXJ5cy5wdXNoKHsKICAgICAgICAgIHByb3BlcnR5OiBwcm9wZXJ0eSwKICAgICAgICAgIHZhbHVlOiB2YWx1ZSwKICAgICAgICAgIGdyb3VwOiAidHJlZUdyb3VwIiwKICAgICAgICAgIG9wZXJhdGlvbjogdGhpcy5nZXRPcGVyYXRpb24ocnVsZXNbaV0uY29uZGl0aW9uKSwKICAgICAgICAgIHJlbGF0aW9uOiAiQU5EIgogICAgICAgIH0pOwogICAgICB9CiAgICAgIHRoaXMuc2VhcmNoKCk7CiAgICB9LAogICAgLy/ojrflj5bov5DnrpfnrKblj7cKICAgIGdldE9wZXJhdGlvbjogZnVuY3Rpb24gZ2V0T3BlcmF0aW9uKG9sZCkgewogICAgICBpZiAoIW9sZCkgewogICAgICAgIHJldHVybiAiIjsKICAgICAgfQogICAgICBpZiAob2xkID09ICJFUSIpIHsKICAgICAgICByZXR1cm4gIkVRVUFMIjsKICAgICAgfQogICAgICBpZiAob2xkID09ICJMSyIpIHsKICAgICAgICByZXR1cm4gIkxJS0UiOwogICAgICB9CiAgICAgIGlmIChvbGQgPT0gIkxGSyIpIHsKICAgICAgICByZXR1cm4gIkxJS0UiOwogICAgICB9CiAgICAgIGlmIChvbGQgPT0gIklOIikgewogICAgICAgIHJldHVybiAiSU4iOwogICAgICB9CiAgICB9LAogICAgdG9nZ2xlVHJlZTogZnVuY3Rpb24gdG9nZ2xlVHJlZSgpIHsKICAgICAgaWYgKHRoaXMudHJlZVNob3cpIHsKICAgICAgICB0aGlzLnRyZWVTaG93ID0gZmFsc2U7CiAgICAgICAgdGhpcy50cmFuc3Rpb25XaWR0aCA9ICIwJSI7CiAgICAgICAgdGhpcy50b2dnbGVCdG4gPSAiZWwtaWNvbi1hcnJvdy1yaWdodCI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy50cmVlU2hvdyA9IHRydWU7CiAgICAgICAgdGhpcy50cmFuc3Rpb25XaWR0aCA9ICIyNSUiOwogICAgICAgIHRoaXMudG9nZ2xlQnRuID0gImVsLWljb24tYXJyb3ctbGVmdCI7CiAgICAgIH0KICAgIH0KICB9Cn07"},null]}