PlatformQuickH5.js 52 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360
  1. (function() {
  2. var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
  3. var __module = nodeEnv ? module : {exports:{}};
  4. var __filename = 'preview-scripts/assets/script/plat/PlatformQuickH5.js';
  5. var __require = nodeEnv ? function (request) {
  6. return cc.require(request);
  7. } : function (request) {
  8. return __quick_compile_project__.require(request, __filename);
  9. };
  10. function __define (exports, require, module) {
  11. if (!nodeEnv) {__quick_compile_project__.registerModule(__filename, module);}"use strict";
  12. cc._RF.push(module, '1e480cluJpNUYJKaPN4wOLI', 'PlatformQuickH5');
  13. // script/plat/PlatformQuickH5.ts
  14. "use strict";
  15. var __extends = (this && this.__extends) || (function () {
  16. var extendStatics = function (d, b) {
  17. extendStatics = Object.setPrototypeOf ||
  18. ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
  19. function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
  20. return extendStatics(d, b);
  21. };
  22. return function (d, b) {
  23. extendStatics(d, b);
  24. function __() { this.constructor = d; }
  25. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  26. };
  27. })();
  28. Object.defineProperty(exports, "__esModule", { value: true });
  29. var gameCfg_1 = require("../common/gameCfg");
  30. var gameMethod_1 = require("../common/gameMethod");
  31. var Xyc_1 = require("../common/Xyc");
  32. var Config_1 = require("../Config");
  33. var EventConst_1 = require("../data/const/EventConst");
  34. var TypeConst_1 = require("../data/const/TypeConst");
  35. var GameDataCenter_1 = require("../data/GameDataCenter");
  36. var GameController_1 = require("../GameController");
  37. var UIHelp_1 = require("../logic/ui/UIHelp");
  38. var EventMng_1 = require("../manager/EventMng");
  39. var PlatformBase_1 = require("./PlatformBase");
  40. var HttpRequest_1 = require("../network/HttpRequest");
  41. var PlatformQuickH5 = /** @class */ (function (_super) {
  42. __extends(PlatformQuickH5, _super);
  43. function PlatformQuickH5() {
  44. var _this = _super.call(this) || this;
  45. cc.game.on(cc.game.EVENT_SHOW, function () {
  46. if (_this.isGoPay) {
  47. _this.isGoPay = false;
  48. if (Config_1.default.paySuccAdokId != null) {
  49. clearInterval(Config_1.default.paySuccAdokId);
  50. Config_1.default.paySuccAdokId = null;
  51. }
  52. Config_1.default.paySuccAdokIndex = 0;
  53. Config_1.default.paySuccAdokId = setInterval(function () {
  54. Config_1.default.paySuccAdokIndex++;
  55. if (Config_1.default.paySuccAdokIndex >= 5) {
  56. clearInterval(Config_1.default.paySuccAdokId);
  57. Config_1.default.paySuccAdokId = null;
  58. }
  59. GameDataCenter_1.default.time.sendAdok();
  60. }, 1000);
  61. }
  62. GameDataCenter_1.default.audio.resumeMusic();
  63. });
  64. cc.game.on(cc.game.EVENT_HIDE, function () {
  65. GameDataCenter_1.default.audio.pauseMusic();
  66. });
  67. QuickSDK.setSwitchAccountNotification(function (callbackData) {
  68. console.log("SwitchAccount data=>", JSON.stringify(callbackData));
  69. GameController_1.default.clear();
  70. cc.game.restart();
  71. });
  72. QuickSDK.setLogoutNotification(function () {
  73. GameController_1.default.clear();
  74. cc.game.restart();
  75. });
  76. return _this;
  77. }
  78. PlatformQuickH5.prototype.showLoginView = function () {
  79. var _this = this;
  80. console.log("初始化&登录SDK");
  81. EventMng_1.default.emit(EventConst_1.LoadEvent.LOAD_PROGRESS, 0.25, "login");
  82. try {
  83. var localStorage = cc.sys.localStorage.getItem("model_login");
  84. var localData = {};
  85. if (!gameMethod_1.gameMethod.isEmpty(localStorage)) {
  86. localData = JSON.parse(localStorage);
  87. }
  88. var policyAgree = localData["policy_agree"];
  89. if (!gameMethod_1.gameMethod.isEmpty(policyAgree) && policyAgree == "1") {
  90. this.SdkInitLogin();
  91. }
  92. else {
  93. QuickSDK.showPrivace(function (retMsg) {
  94. console.log("privace data=>", JSON.stringify(retMsg));
  95. if (retMsg === null || retMsg === void 0 ? void 0 : retMsg.status) {
  96. _this.SdkInitLogin();
  97. }
  98. else {
  99. QuickSDK.callExtFunction("exit", {});
  100. }
  101. });
  102. }
  103. }
  104. catch (error) {
  105. UIHelp_1.default.ShowTips("----" + error);
  106. }
  107. };
  108. PlatformQuickH5.prototype.SdkInitLogin = function () {
  109. var _this = this;
  110. var packageInfo = gameCfg_1.default.packageInfo.getItem(Config_1.default.pid);
  111. var productCode = packageInfo.params[0]; //QuickSDK后台自动分配
  112. var productKey = packageInfo.params[1]; //QuickSDK后台自动分配
  113. var isNative = false;
  114. this.isMiniClient(); //设置登录平台
  115. QuickSDK.init(productCode, productKey, isNative, function () {
  116. console.log("初始化成功");
  117. setTimeout(function () {
  118. QuickSDK.login(function (result) {
  119. console.log("login data=", JSON.stringify(result));
  120. // EventMng.emit(LoadEvent.LOAD_MESSAGE, JSON.stringify(result))
  121. if (result.status) {
  122. var data = result.data;
  123. _this.username = data.username;
  124. _this.channelId = data.channelId.toString();
  125. EventMng_1.default.emit(EventConst_1.LoadEvent.LOAD_PROGRESS, 0.75, "login");
  126. var params_1 = {
  127. pid: Config_1.default.pid,
  128. param: [data.uid, data.token, data.channelId]
  129. };
  130. setTimeout(function () {
  131. GameController_1.default.network.send(Xyc_1.PlayerLogin.url, params_1, function (result) {
  132. console.log("后段验证返回");
  133. if (result.type != 1) {
  134. if (gameMethod_1.gameMethod.isEmpty(result.win) || gameMethod_1.gameMethod.isEmpty(result.win.msgOut)) {
  135. GameDataCenter_1.default.plat.showErrDialog(TypeConst_1.GameErrCode.errGamePlatLogin);
  136. }
  137. return;
  138. }
  139. EventMng_1.default.emit(EventConst_1.LoadEvent.LOAD_PROGRESS, 1, "login");
  140. if (result.type == 1 && result.platBack) {
  141. _this.openId = result.platBack.openid;
  142. _this.loginParams = [result.platBack.token];
  143. console.log("后端验证成功", _this.openId);
  144. _this.login();
  145. }
  146. else {
  147. console.log("PlayerLogin.url 返回数据异常");
  148. if (gameMethod_1.gameMethod.isEmpty(result.win) || gameMethod_1.gameMethod.isEmpty(result.win.msgOut)) {
  149. GameDataCenter_1.default.plat.showErrDialog(TypeConst_1.GameErrCode.errGamePlatLogin);
  150. }
  151. }
  152. });
  153. }, 1000);
  154. }
  155. else {
  156. UIHelp_1.default.ShowTips("登录失败");
  157. }
  158. });
  159. }, 1000);
  160. });
  161. };
  162. PlatformQuickH5.prototype.pay = function (orderId, order10cs, param) {
  163. var _this = this;
  164. var _a, _b, _c;
  165. var packageInfo = gameCfg_1.default.packageInfo.getItem(Config_1.default.pid);
  166. var productCode = packageInfo.params[0]; //QuickSDK后台自动分配
  167. var serverName = GameDataCenter_1.default.user.getServerNameBySid((_c = (_b = (_a = GameDataCenter_1.default.sevBack) === null || _a === void 0 ? void 0 : _a.userInfo) === null || _b === void 0 ? void 0 : _b.a) === null || _c === void 0 ? void 0 : _c.sid) || GameDataCenter_1.default.sevBack.userInfo.a.sid;
  168. var orderInfo = {
  169. productCode: productCode,
  170. uid: GameDataCenter_1.default.plat.instance.openId,
  171. username: this.username,
  172. userRoleId: GameDataCenter_1.default.sevBack.userInfo.a.uuid,
  173. userRoleName: GameDataCenter_1.default.sevBack.userInfo.a.name,
  174. serverId: parseInt(GameDataCenter_1.default.sevBack.userInfo.a.sid),
  175. userServer: serverName,
  176. userLevel: GameDataCenter_1.default.sevBack.userInfo.a.level,
  177. cpOrderNo: orderId,
  178. amount: param.price,
  179. subject: param.productName,
  180. desc: param.productName,
  181. callbackUrl: '',
  182. extrasParams: order10cs,
  183. goodsId: param.productId,
  184. count: 1,
  185. quantifier: '个',
  186. };
  187. var orderInfoJson = JSON.stringify(orderInfo);
  188. this.isGoPay = true;
  189. QuickSDK.pay(orderInfoJson, function (payStatusObject) {
  190. console.log("创建订单成功:", JSON.stringify(payStatusObject));
  191. _this.isGoPay = false;
  192. if (Config_1.default.paySuccAdokId != null) {
  193. clearInterval(Config_1.default.paySuccAdokId);
  194. Config_1.default.paySuccAdokId = null;
  195. }
  196. Config_1.default.paySuccAdokIndex = 0;
  197. Config_1.default.paySuccAdokId = setInterval(function () {
  198. Config_1.default.paySuccAdokIndex++;
  199. if (Config_1.default.paySuccAdokIndex >= 5) {
  200. clearInterval(Config_1.default.paySuccAdokId);
  201. Config_1.default.paySuccAdokId = null;
  202. }
  203. GameDataCenter_1.default.time.sendAdok();
  204. }, 1000);
  205. });
  206. this.dealYanChi();
  207. };
  208. // 充值延迟到账,前端只能循环处理
  209. PlatformQuickH5.prototype.dealYanChi = function () {
  210. var _this = this;
  211. if (Config_1.default.paySuccAdokId != null) {
  212. clearInterval(Config_1.default.paySuccAdokId);
  213. Config_1.default.paySuccAdokId = null;
  214. }
  215. Config_1.default.paySuccAdokIndex = 0;
  216. Config_1.default.paySuccAdokId = setInterval(function () {
  217. Config_1.default.paySuccAdokIndex++;
  218. if (Config_1.default.paySuccAdokIndex >= 15) {
  219. clearInterval(Config_1.default.paySuccAdokId);
  220. Config_1.default.paySuccAdokId = null;
  221. _this.isGoPay = false;
  222. }
  223. GameDataCenter_1.default.time.sendAdok();
  224. }, 1000);
  225. };
  226. // 上报角色数据
  227. PlatformQuickH5.prototype.reportRole = function (event) {
  228. // • 初始化成功后调⽤. • 进⼊区服、创⻆、⻆⾊等级更新、战⼒更新时调⽤.
  229. if (GameDataCenter_1.default.sevBack == null) {
  230. return;
  231. }
  232. if (GameDataCenter_1.default.sevBack.userInfo == null) {
  233. return;
  234. }
  235. console.log("上报角色数据:", event);
  236. var onlineTime = 0;
  237. if (GameDataCenter_1.default.time.onlineTime > 0) {
  238. onlineTime = GameDataCenter_1.default.time.sevTime - GameDataCenter_1.default.time.onlineTime;
  239. }
  240. var isCreateRole = false;
  241. var level = GameDataCenter_1.default.sevBack.userInfo.a.level;
  242. switch (event) {
  243. case TypeConst_1.ReportRoleType.create:
  244. isCreateRole = true;
  245. break;
  246. case TypeConst_1.ReportRoleType.levelup:
  247. break;
  248. case TypeConst_1.ReportRoleType.offline:
  249. break;
  250. case TypeConst_1.ReportRoleType.online:
  251. break;
  252. case TypeConst_1.ReportRoleType.other:
  253. break;
  254. default:
  255. break;
  256. }
  257. var power = GameDataCenter_1.default.sevBack.userInfo.a.power;
  258. var serverName = GameDataCenter_1.default.user.getServerNameBySid(GameDataCenter_1.default.sevBack.userInfo.a.sid) || GameDataCenter_1.default.sevBack.userInfo.a.sid;
  259. if (this.channelId == "4804" || this.channelId == "4771") {
  260. //专服1-混A上报角色需要加密
  261. var roleInfo6_1 = {
  262. uid: GameDataCenter_1.default.plat.instance.openId,
  263. username: this.username,
  264. serverId: GameDataCenter_1.default.sevBack.userInfo.a.sid,
  265. serverName: serverName,
  266. userRoleId: GameDataCenter_1.default.sevBack.userInfo.a.uuid,
  267. userRoleName: GameDataCenter_1.default.sevBack.userInfo.a.name,
  268. userRoleLevel: level,
  269. vipLevel: 0,
  270. gameRolePower: power,
  271. channel_role_sign: "",
  272. isCreateRole: isCreateRole,
  273. roleCreateTime: GameDataCenter_1.default.sevBack.userInfo.a.regtime,
  274. userRoleBalance: 0,
  275. partyId: 0,
  276. partyName: '无',
  277. };
  278. var verifyStr = "uid=" + roleInfo6_1.uid + "&username=" + roleInfo6_1.username + "&serverId=" + roleInfo6_1.serverId + "&serverName=" + roleInfo6_1.serverName + "&userRoleId=" + roleInfo6_1.userRoleId + "&userRoleName=" + roleInfo6_1.userRoleName + "&userRoleLevel=" + roleInfo6_1.userRoleLevel + "&vipLevel=" + roleInfo6_1.vipLevel + "&gameRolePower=" + roleInfo6_1.gameRolePower + "&key=";
  279. // console.log("verifyStr:",verifyStr)
  280. var url = gameCfg_1.default.packageInfo.getItem(Config_1.default.pid).wayhttp + "player/sbVerify";
  281. HttpRequest_1.default.POST(url, {}, { str: verifyStr }, function (result) {
  282. console.log("player/sbVerify=>", result);
  283. roleInfo6_1.channel_role_sign = result.sign;
  284. var roleInfoJson6 = JSON.stringify(roleInfo6_1);
  285. // set_userinfo 设置⻆⾊基本信息,如头像、昵称
  286. QuickSDK.uploadGameRoleInfo(roleInfoJson6, function () {
  287. });
  288. });
  289. }
  290. else {
  291. var roleInfo = {
  292. isCreateRole: isCreateRole,
  293. roleCreateTime: GameDataCenter_1.default.sevBack.userInfo.a.regtime,
  294. uid: GameDataCenter_1.default.plat.instance.openId,
  295. username: this.username,
  296. serverId: GameDataCenter_1.default.sevBack.userInfo.a.sid,
  297. serverName: serverName,
  298. userRoleName: GameDataCenter_1.default.sevBack.userInfo.a.name,
  299. userRoleId: GameDataCenter_1.default.sevBack.userInfo.a.uuid,
  300. userRoleBalance: 0,
  301. vipLevel: 1,
  302. userRoleLevel: level,
  303. gameRolePower: power,
  304. partyId: 0,
  305. partyName: '无',
  306. };
  307. var roleInfoJson = JSON.stringify(roleInfo);
  308. // set_userinfo 设置⻆⾊基本信息,如头像、昵称
  309. QuickSDK.uploadGameRoleInfo(roleInfoJson, function () {
  310. });
  311. }
  312. };
  313. PlatformQuickH5.prototype.checkMsg = function (str, cb) {
  314. cb();
  315. };
  316. PlatformQuickH5.prototype.restart = function (force) {
  317. QuickSDK.logout(function () {
  318. });
  319. };
  320. PlatformQuickH5.prototype.openUrl = function (url) {
  321. QuickSDK.callUrl(url);
  322. };
  323. /**
  324. * 是否微端
  325. */
  326. PlatformQuickH5.prototype.isMiniClient = function () {
  327. //UA: Mozilla/5.0 (iPhone; CPU iPhone OS 17_6_1 like MacoS X) AppleWebKit/605.1.15(KHTML, like Gecko)Mobile/15E148
  328. // Mozilla/5.0 (iPhone; CPU iPhone 0S 17_6_1 like Mac OS X)AppleWebKit/605.1.15(KHTML, like Gecko) obile/15E148 color:gray".match(/\(i[^;]+;( U;)?CPU.+Mac OS X
  329. var u = navigator.userAgent;
  330. var isAndroid = u.indexOf("Android") > -1 || u.indexOf("Adr") > -1;
  331. if (isAndroid) {
  332. GameDataCenter_1.default.plat.instance.deviceOS = TypeConst_1.PlatFormDevType.androidH5;
  333. }
  334. var isIos = u.indexOf("iPhone") > -1 && u.indexOf("Safari") == -1;
  335. if (isIos) {
  336. GameDataCenter_1.default.plat.instance.deviceOS = TypeConst_1.PlatFormDevType.iosH5;
  337. }
  338. if (cc.sys.os == cc.sys.OS_IOS) {
  339. GameDataCenter_1.default.plat.instance.deviceOS = TypeConst_1.PlatFormDevType.iosH5;
  340. }
  341. return isAndroid || isIos;
  342. };
  343. return PlatformQuickH5;
  344. }(PlatformBase_1.default));
  345. exports.default = PlatformQuickH5;
  346. cc._RF.pop();
  347. }
  348. if (nodeEnv) {
  349. __define(__module.exports, __require, __module);
  350. }
  351. else {
  352. __quick_compile_project__.registerModuleFunc(__filename, function () {
  353. __define(__module.exports, __require, __module);
  354. });
  355. }
  356. })();
  357. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0cy9zY3JpcHQvcGxhdC9QbGF0Zm9ybVF1aWNrSDUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBMkNBLDZDQUF3QztBQUN4QyxtREFBa0Q7QUFDbEQscUNBQTZEO0FBRTdELG9DQUErQjtBQUMvQix1REFBcUQ7QUFDckQscURBQXdHO0FBQ3hHLHlEQUFvRDtBQUNwRCxvREFBK0M7QUFDL0MsNkNBQXdDO0FBQ3hDLGdEQUEyQztBQUMzQywrQ0FBMEM7QUFDMUMsc0RBQWlEO0FBRWpEO0lBQTZDLG1DQUFZO0lBS3JEO1FBQUEsWUFDSSxpQkFBTyxTQWdDVjtRQS9CRyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUMzQixJQUFJLEtBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQ2QsS0FBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUE7Z0JBQ3BCLElBQUksZ0JBQU0sQ0FBQyxhQUFhLElBQUksSUFBSSxFQUFFO29CQUM5QixhQUFhLENBQUMsZ0JBQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQTtvQkFDbkMsZ0JBQU0sQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFBO2lCQUM5QjtnQkFDRCxnQkFBTSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQTtnQkFDM0IsZ0JBQU0sQ0FBQyxhQUFhLEdBQUcsV0FBVyxDQUFDO29CQUMvQixnQkFBTSxDQUFDLGdCQUFnQixFQUFFLENBQUE7b0JBQ3pCLElBQUksZ0JBQU0sQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLEVBQUU7d0JBQzlCLGFBQWEsQ0FBQyxnQkFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFBO3dCQUNuQyxnQkFBTSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUE7cUJBQzlCO29CQUNELHdCQUFjLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFBO2dCQUNsQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENB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LENBQUM7SUFDOUIsQ0FBQztJQUNMLHNCQUFDO0FBQUQsQ0FoVEEsQUFnVEMsQ0FoVDRDLHNCQUFZLEdBZ1R4RCIsImZpbGUiOiIiLCJzb3VyY2VSb290IjoiLyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICog5Y+Y5oCB54mIaDXniYjmnKwgc2Rr6YWN572uXG4gKiBcblxu5b6u5L+h5YaF6Lez6L2s5YWl5Y+j5pivXG5cbuWcqG1haW4uanPnmoTmnIDkuIrpnaJcbndpbmRvdy5fX3plcm9fXyA9IHtcbiAgICBcInBhY2thZ2VJRFwiOiBcIjExMDFcIixcbn1cblxu5ZyobWFpbi5qc+eahG9uU3RhcnTliqDkuIpcbmNjLmFzc2V0TWFuYWdlci5kb3dubG9hZGVyLmFwcGVuZFRpbWVTdGFtcCA9IHRydWVcbuW8gOWQr+i1hOa6kOaXtumXtOaIs++8iOaaguaXtuS4jemcgOimge+8jOW9seWTjeeOqeWutuS9k+mqjO+8iVxuXG4gIOino+WGs+e9kemhteeZvei+ueeahOmXrumimCDmlL7lnKhodG1s55qEYm9keemHjFxuICA8c3R5bGU+IFxuICAgIGJvZHkge1xuICAgICBkaXNwbGF5OmJsb2NrO1xuICAgICBtYXJnaW46MHB4O1xuICAgIH1cbiAgPC9zdHlsZT5cbiAgLy/op6PlhrPnvZHpobXnvJPlrZjnmoTpl67popjvvIjmmoLml7bnmoTvvIlcbiAgICBcbiAgICB2YXIgZ2V0UXVlcnkyID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIHZhciByZWcgPSBuZXcgUmVnRXhwKFwiKF58JilcIiArIG5hbWUgKyBcIj0oW14mXSopKCZ8JClcIiwgXCJpXCIpO1xuICAgICAgdmFyIHIgPSB3aW5kb3cubG9jYXRpb24uc2VhcmNoLnN1YnN0cigxKS5tYXRjaChyZWcpO1xuICAgICAgaWYgKHIgIT0gbnVsbCkgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChyWzJdKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB2YXIgbWFpbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGltZSA9IHBhcnNlSW50KGdldFF1ZXJ5MihcInRpbWVcIikgfHwgXCIwXCIpO1xuICAgICAgdmFyIF9jdXJUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICBpZiAoIV90aW1lKSB7IFxuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVwbGFjZSgnaHR0cHM6Ly9jZG5qeXh5LmhhcHBpbHlnYW1lLmNvbS93ZWJNb2JpbGUvaW5kZXguaHRtbD90aW1lPScgKyBfY3VyVGltZSk7Ly/ms6jmhI/opoHmjaLlr7nlupTnmoTkuJPmnI3pk77mjqVcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBtYWluKCk7XG7lvJXlhaVTREs65ZyoaHRtbOS4rea3u+WKoOS4gOS4qnNjcmlwdOagh+etvuWwseWPr+S7peS6hlxuPHNjcmlwdCBzcmM9XCJodHRwczovL3Nka2FwaS5oYXBwaWx5Z2FtZS5jb20vc3RhdGljL2xpYi9wcC9saWJRdWlja1NES192Mi5qc1wiPjwvc2NyaXB0PlxuICovXG5pbXBvcnQgTWludCBmcm9tIFwiLi4vdXRpbHMvbWludEZpbHRlci9pbmRleFwiO1xuaW1wb3J0IEdhbWVjZmcgZnJvbSBcIi4uL2NvbW1vbi9nYW1lQ2ZnXCI7XG5pbXBvcnQgeyBnYW1lTWV0aG9kIH0gZnJvbSBcIi4uL2NvbW1vbi9nYW1lTWV0aG9kXCI7XG5pbXBvcnQgeyBQbGF5ZXJMb2dpbiwgUGxheWVyTG9naW5QcmFtIH0gZnJvbSBcIi4uL2NvbW1vbi9YeWNcIjtcbmltcG9ydCB7IFNldkJhY2sgfSBmcm9tIFwiLi4vY29tbW9uL1h5c1wiO1xuaW1wb3J0IENvbmZpZyBmcm9tIFwiLi4vQ29uZmlnXCI7XG5pbXBvcnQgeyBMb2FkRXZlbnQgfSBmcm9tIFwiLi4vZGF0YS9jb25zdC9FdmVudENvbnN0XCI7XG5pbXBvcnQgeyBHYW1lRXJyQ29kZSwgUGF5UHJvZHVjdFBhcmFtLCBSZXBvcnRSb2xlVHlwZSwgUGxhdEZvcm1EZXZUeXBlIH0gZnJvbSBcIi4uL2RhdGEvY29uc3QvVHlwZUNvbnN0XCI7XG5pbXBvcnQgR2FtZURhdGFDZW50ZXIgZnJvbSBcIi4uL2RhdGEvR2FtZURhdGFDZW50ZXJcIjtcbmltcG9ydCBHYW1lQ29udHJvbGxlciBmcm9tIFwiLi4vR2FtZUNvbnRyb2xsZXJcIjtcbmltcG9ydCBVSUhlbHAgZnJvbSBcIi4uL2xvZ2ljL3VpL1VJSGVscFwiO1xuaW1wb3J0IEV2ZW50TW5nIGZyb20gXCIuLi9tYW5hZ2VyL0V2ZW50TW5nXCI7XG5pbXBvcnQgUGxhdGZvcm1CYXNlIGZyb20gXCIuL1BsYXRmb3JtQmFzZVwiO1xuaW1wb3J0IEh0dHBSZXF1ZXN0IGZyb20gXCIuLi9uZXR3b3JrL0h0dHBSZXF1ZXN0XCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBsYXRmb3JtUXVpY2tINSBleHRlbmRzIFBsYXRmb3JtQmFzZSB7XG4gICAgaXNHb1BheTogYm9vbGVhblxuICAgIG1pbnQ6IE1pbnQ7XG4gICAgdXNlcm5hbWU6IFwiXCJcbiAgICBjaGFubmVsSWQ6IHN0cmluZ1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpXG4gICAgICAgIGNjLmdhbWUub24oY2MuZ2FtZS5FVkVOVF9TSE9XLCAoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc0dvUGF5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0dvUGF5ID0gZmFsc2VcbiAgICAgICAgICAgICAgICBpZiAoQ29uZmlnLnBheVN1Y2NBZG9rSWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKENvbmZpZy5wYXlTdWNjQWRva0lkKVxuICAgICAgICAgICAgICAgICAgICBDb25maWcucGF5U3VjY0Fkb2tJZCA9IG51bGxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQ29uZmlnLnBheVN1Y2NBZG9rSW5kZXggPSAwXG4gICAgICAgICAgICAgICAgQ29uZmlnLnBheVN1Y2NBZG9rSWQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIENvbmZpZy5wYXlTdWNjQWRva0luZGV4KytcbiAgICAgICAgICAgICAgICAgICAgaWYgKENvbmZpZy5wYXlTdWNjQWRva0luZGV4ID49IDUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoQ29uZmlnLnBheVN1Y2NBZG9rSWQpXG4gICAgICAgICAgICAgICAgICAgICAgICBDb25maWcucGF5U3VjY0Fkb2tJZCA9IG51bGxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBHYW1lRGF0YUNlbnRlci50aW1lLnNlbmRBZG9rKClcbiAgICAgICAgICAgICAgICB9LCAxMDAwKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgR2FtZURhdGFDZW50ZXIuYXVkaW8ucmVzdW1lTXVzaWMoKTtcbiAgICAgICAgfSlcbiAgICAgICAgY2MuZ2FtZS5vbihjYy5nYW1lLkVWRU5UX0hJREUsICgpID0+IHtcbiAgICAgICAgICAgIEdhbWVEYXRhQ2VudGVyLmF1ZGlvLnBhdXNlTXVzaWMoKTtcbiAgICAgICAgfSlcbiAgICAgICAgUXVpY2tTREsuc2V0U3dpdGNoQWNjb3VudE5vdGlmaWNhdGlvbihmdW5jdGlvbiAoY2FsbGJhY2tEYXRhKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIlN3aXRjaEFjY291bnQgZGF0YT0+XCIsIEpTT04uc3RyaW5naWZ5KGNhbGxiYWNrRGF0YSkpXG4gICAgICAgICAgICBHYW1lQ29udHJvbGxlci5jbGVhcigpXG4gICAgICAgICAgICBjYy5nYW1lLnJlc3RhcnQoKVxuICAgICAgICB9KTtcbiAgICAgICAgUXVpY2tTREsuc2V0TG9nb3V0Tm90aWZpY2F0aW9uKCgpID0+IHtcbiAgICAgICAgICAgIEdhbWVDb250cm9sbGVyLmNsZWFyKClcbiAgICAgICAgICAgIGNjLmdhbWUucmVzdGFydCgpXG4gICAgICAgIH0pXG4gICAgfVxuICAgIHNob3dMb2dpblZpZXcoKTogdm9pZCB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwi5Yid5aeL5YyWJueZu+W9lVNES1wiKVxuICAgICAgICBFdmVudE1uZy5lbWl0KExvYWRFdmVudC5MT0FEX1BST0dSRVNTLCAwLjI1LCBcImxvZ2luXCIpXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgbG9jYWxTdG9yYWdlID0gY2Muc3lzLmxvY2FsU3RvcmFnZS5nZXRJdGVtKGBtb2RlbF9sb2dpbmApO1xuICAgICAgICAgICAgbGV0IGxvY2FsRGF0YSA9IHt9O1xuICAgICAgICAgICAgaWYgKCFnYW1lTWV0aG9kLmlzRW1wdHkobG9jYWxTdG9yYWdlKSkge1xuICAgICAgICAgICAgICAgIGxvY2FsRGF0YSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBwb2xpY3lBZ3JlZSA9IGxvY2FsRGF0YVtcInBvbGljeV9hZ3JlZVwiXTtcbiAgICAgICAgICAgIGlmICghZ2FtZU1ldGhvZC5pc0VtcHR5KHBvbGljeUFncmVlKSAmJiBwb2xpY3lBZ3JlZSA9PSBcIjFcIikge1xuICAgICAgICAgICAgICAgIHRoaXMuU2RrSW5pdExvZ2luKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIFF1aWNrU0RLLnNob3dQcml2YWNlKChyZXRNc2c6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInByaXZhY2UgZGF0YT0+XCIsIEpTT04uc3RyaW5naWZ5KHJldE1zZykpXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXRNc2c/LnN0YXR1cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5TZGtJbml0TG9naW4oKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFF1aWNrU0RLLmNhbGxFeHRGdW5jdGlvbihcImV4aXRcIiwge30pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIFVJSGVscC5TaG93VGlwcyhcIi0tLS1cIiArIGVycm9yKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgU2RrSW5pdExvZ2luKCkge1xuICAgICAgICBsZXQgcGFja2FnZUluZm8gPSBHYW1lY2ZnLnBhY2thZ2VJbmZvLmdldEl0ZW0oQ29uZmlnLnBpZClcbiAgICAgICAgdmFyIHByb2R1Y3RDb2RlID0gcGFja2FnZUluZm8ucGFyYW1zWzBdOyAgICAgICAgLy9RdWlja1NES+WQjuWPsOiHquWKqOWIhumFjSBcbiAgICAgICAgdmFyIHByb2R1Y3RLZXkgPSBwYWNrYWdlSW5mby5wYXJhbXNbMV07ICAgICAgICAvL1F1aWNrU0RL5ZCO5Y+w6Ieq5Yqo5YiG6YWNXG4gICAgICAgIGxldCBpc05hdGl2ZSA9IGZhbHNlXG4gICAgICAgIHRoaXMuaXNNaW5pQ2xpZW50KCk7Ly/orr7nva7nmbvlvZXlubPlj7BcbiAgICAgICAgUXVpY2tTREsuaW5pdChwcm9kdWN0Q29kZSwgcHJvZHVjdEtleSwgaXNOYXRpdmUsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5Yid5aeL5YyW5oiQ5YqfXCIpXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBRdWlja1NESy5sb2dpbigocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJsb2dpbiBkYXRhPVwiLCBKU09OLnN0cmluZ2lmeShyZXN1bHQpKVxuICAgICAgICAgICAgICAgICAgICAvLyBFdmVudE1uZy5lbWl0KExvYWRFdmVudC5MT0FEX01FU1NBR0UsIEpTT04uc3RyaW5naWZ5KHJlc3VsdCkpXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IHJlc3VsdC5kYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVzZXJuYW1lID0gZGF0YS51c2VybmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFubmVsSWQgPSBkYXRhLmNoYW5uZWxJZC50b1N0cmluZygpXG4gICAgICAgICAgICAgICAgICAgICAgICBFdmVudE1uZy5lbWl0KExvYWRFdmVudC5MT0FEX1BST0dSRVNTLCAwLjc1LCBcImxvZ2luXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGFyYW1zOiBQbGF5ZXJMb2dpblByYW0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkOiBDb25maWcucGlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtOiBbZGF0YS51aWQsIGRhdGEudG9rZW4sIGRhdGEuY2hhbm5lbElkXVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgR2FtZUNvbnRyb2xsZXIubmV0d29yay5zZW5kKFBsYXllckxvZ2luLnVybCwgcGFyYW1zLCAocmVzdWx0OiBTZXZCYWNrKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5ZCO5q616aqM6K+B6L+U5ZueXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQudHlwZSAhPSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KHJlc3VsdC53aW4pIHx8IGdhbWVNZXRob2QuaXNFbXB0eShyZXN1bHQud2luLm1zZ091dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHYW1lRGF0YUNlbnRlci5wbGF0LnNob3dFcnJEaWFsb2coR2FtZUVyckNvZGUuZXJyR2FtZVBsYXRMb2dpbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50TW5nLmVtaXQoTG9hZEV2ZW50LkxPQURfUFJPR1JFU1MsIDEsIFwibG9naW5cIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC50eXBlID09IDEgJiYgcmVzdWx0LnBsYXRCYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wZW5JZCA9IHJlc3VsdC5wbGF0QmFjay5vcGVuaWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9naW5QYXJhbXMgPSBbcmVzdWx0LnBsYXRCYWNrLnRva2VuXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLlkI7nq6/pqozor4HmiJDlip9cIiwgdGhpcy5vcGVuSWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2luKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiUGxheWVyTG9naW4udXJsIOi/lOWbnuaVsOaNruW8guW4uFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdhbWVNZXRob2QuaXNFbXB0eShyZXN1bHQud2luKSB8fCBnYW1lTWV0aG9kLmlzRW1wdHkocmVzdWx0Lndpbi5tc2dPdXQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2FtZURhdGFDZW50ZXIucGxhdC5zaG93RXJyRGlhbG9nKEdhbWVFcnJDb2RlLmVyckdhbWVQbGF0TG9naW4pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgMTAwMClcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFVJSGVscC5TaG93VGlwcyhcIueZu+W9leWksei0pVwiKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0sIDEwMDApXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcGF5KG9yZGVySWQ6IHN0cmluZywgb3JkZXIxMGNzOiBzdHJpbmcsIHBhcmFtOiBQYXlQcm9kdWN0UGFyYW0pOiB2b2lkIHtcbiAgICAgICAgbGV0IHBhY2thZ2VJbmZvID0gR2FtZWNmZy5wYWNrYWdlSW5mby5nZXRJdGVtKENvbmZpZy5waWQpXG4gICAgICAgIHZhciBwcm9kdWN0Q29kZSA9IHBhY2thZ2VJbmZvLnBhcmFtc1swXTsgICAgICAgIC8vUXVpY2tTREvlkI7lj7Doh6rliqjliIbphY0gXG4gICAgICAgIGxldCBzZXJ2ZXJOYW1lID0gR2FtZURhdGFDZW50ZXIudXNlci5nZXRTZXJ2ZXJOYW1lQnlTaWQoR2FtZURhdGFDZW50ZXIuc2V2QmFjaz8udXNlckluZm8/LmE/LnNpZCkgfHwgR2FtZURhdGFDZW50ZXIuc2V2QmFjay51c2VySW5mby5hLnNpZDtcbiAgICAgICAgbGV0IG9yZGVySW5mbyA9IHtcbiAgICAgICAgICAgIHByb2R1Y3RDb2RlOiBwcm9kdWN0Q29kZSxcbiAgICAgICAgICAgIHVpZDogR2FtZURhdGFDZW50ZXIucGxhdC5pbnN0YW5jZS5vcGVuSWQsXG4gICAgICAgICAgICB1c2VybmFtZTogdGhpcy51c2VybmFtZSxcbiAgICAgICAgICAgIHVzZXJSb2xlSWQ6IEdhbWVEYXRhQ2VudGVyLnNldkJhY2sudXNlckluZm8uYS51dWlkLFxuICAgICAgICAgICAgdXNlclJvbGVOYW1lOiBHYW1lRGF0YUNlbnRlci5zZXZCYWNrLnVzZXJJbmZvLmEubmFtZSxcbiAgICAgICAgICAgIHNlcnZlcklkOiBwYXJzZUludChHYW1lRGF0YUNlbnRlci5zZXZCYWNrLnVzZXJJbmZvLmEuc2lkKSxcbiAgICAgICAgICAgIHVzZXJTZXJ2ZXI6IHNlcnZlck5hbWUsXG4gICAgICAgICAgICB1c2VyTGV2ZWw6IEdhbWVEYXRhQ2VudGVyLnNldkJhY2sudXNlckluZm8uYS5sZXZlbCxcbiAgICAgICAgICAgIGNwT3JkZXJObzogb3JkZXJJZCxcbiAgICAgICAgICAgIGFtb3VudDogcGFyYW0ucHJpY2UsXG4gICAgICAgICAgICBzdWJqZWN0OiBwYXJhbS5wcm9kdWN0TmFtZSxcbiAgICAgICAgICAgIGRlc2M6IHBhcmFtLnByb2R1Y3ROYW1lLC8vcGFyYW0ucHJvZHVjdERlc2MsXG4gICAgICAgICAgICBjYWxsYmFja1VybDogJycsXG4gICAgICAgICAgICBleHRyYXNQYXJhbXM6IG9yZGVyMTBjcyxcbiAgICAgICAgICAgIGdvb2RzSWQ6IHBhcmFtLnByb2R1Y3RJZCxcbiAgICAgICAgICAgIGNvdW50OiAxLFxuICAgICAgICAgICAgcXVhbnRpZmllcjogJ+S4qicsXG4gICAgICAgIH1cblxuICAgICAgICB2YXIgb3JkZXJJbmZvSnNvbiA9IEpTT04uc3RyaW5naWZ5KG9yZGVySW5mbyk7XG4gICAgICAgIHRoaXMuaXNHb1BheSA9IHRydWVcbiAgICAgICAgUXVpY2tTREsucGF5KG9yZGVySW5mb0pzb24sIChwYXlTdGF0dXNPYmplY3Q6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCLliJvlu7rorqLljZXmiJDlip86XCIsIEpTT04uc3RyaW5naWZ5KHBheVN0YXR1c09iamVjdCkpXG4gICAgICAgICAgICB0aGlzLmlzR29QYXkgPSBmYWxzZVxuICAgICAgICAgICAgaWYgKENvbmZpZy5wYXlTdWNjQWRva0lkICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKENvbmZpZy5wYXlTdWNjQWRva0lkKVxuICAgICAgICAgICAgICAgIENvbmZpZy5wYXlTdWNjQWRva0lkID0gbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQ29uZmlnLnBheVN1Y2NBZG9rSW5kZXggPSAwXG4gICAgICAgICAgICBDb25maWcucGF5U3VjY0Fkb2tJZCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAgICAgICBDb25maWcucGF5U3VjY0Fkb2tJbmRleCsrXG4gICAgICAgICAgICAgICAgaWYgKENvbmZpZy5wYXlTdWNjQWRva0luZGV4ID49IDUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChDb25maWcucGF5U3VjY0Fkb2tJZClcbiAgICAgICAgICAgICAgICAgICAgQ29uZmlnLnBheVN1Y2NBZG9rSWQgPSBudWxsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEdhbWVEYXRhQ2VudGVyLnRpbWUuc2VuZEFkb2soKVxuICAgICAgICAgICAgfSwgMTAwMClcbiAgICAgICAgfSlcbiAgICAgICAgdGhpcy5kZWFsWWFuQ2hpKCk7XG4gICAgfVxuXG4gICAgLy8g5YWF5YC85bu26L+f5Yiw6LSm77yM5YmN56uv5Y+q6IO95b6q546v5aSE55CGXG4gICAgZGVhbFlhbkNoaSgpIHtcbiAgICAgICAgaWYgKENvbmZpZy5wYXlTdWNjQWRva0lkICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoQ29uZmlnLnBheVN1Y2NBZG9rSWQpXG4gICAgICAgICAgICBDb25maWcucGF5U3VjY0Fkb2tJZCA9IG51bGxcbiAgICAgICAgfVxuICAgICAgICBDb25maWcucGF5U3VjY0Fkb2tJbmRleCA9IDBcbiAgICAgICAgQ29uZmlnLnBheVN1Y2NBZG9rSWQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICBDb25maWcucGF5U3VjY0Fkb2tJbmRleCsrXG4gICAgICAgICAgICBpZiAoQ29uZmlnLnBheVN1Y2NBZG9rSW5kZXggPj0gMTUpIHtcbiAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKENvbmZpZy5wYXlTdWNjQWRva0lkKVxuICAgICAgICAgICAgICAgIENvbmZpZy5wYXlTdWNjQWRva0lkID0gbnVsbFxuICAgICAgICAgICAgICAgIHRoaXMuaXNHb1BheSA9IGZhbHNlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBHYW1lRGF0YUNlbnRlci50aW1lLnNlbmRBZG9rKClcbiAgICAgICAgfSwgMTAwMClcbiAgICB9XG4gICAgLy8g5LiK5oql6KeS6Imy5pWw5o2uXG4gICAgcmVwb3J0Um9sZShldmVudDogUmVwb3J0Um9sZVR5cGUpOiB2b2lkIHtcbiAgICAgICAgLy8g4oCiIOWIneWni+WMluaIkOWKn+WQjuiwg+K9pC4g4oCiIOi/m+K8iuWMuuacjeOAgeWIm+K7huOAgeK7huK+iuetiee6p+abtOaWsOOAgeaImOK8kuabtOaWsOaXtuiwg+K9pC5cbiAgICAgICAgaWYgKEdhbWVEYXRhQ2VudGVyLnNldkJhY2sgPT0gbnVsbCkgeyByZXR1cm4gfVxuICAgICAgICBpZiAoR2FtZURhdGFDZW50ZXIuc2V2QmFjay51c2VySW5mbyA9PSBudWxsKSB7IHJldHVybiB9XG4gICAgICAgIGNvbnNvbGUubG9nKFwi5LiK5oql6KeS6Imy5pWw5o2uOlwiLCBldmVudClcbiAgICAgICAgbGV0IG9ubGluZVRpbWUgPSAwXG4gICAgICAgIGlmIChHYW1lRGF0YUNlbnRlci50aW1lLm9ubGluZVRpbWUgPiAwKSB7XG4gICAgICAgICAgICBvbmxpbmVUaW1lID0gR2FtZURhdGFDZW50ZXIudGltZS5zZXZUaW1lIC0gR2FtZURhdGFDZW50ZXIudGltZS5vbmxpbmVUaW1lXG4gICAgICAgIH1cbiAgICAgICAgbGV0IGlzQ3JlYXRlUm9sZSA9IGZhbHNlXG4gICAgICAgIGxldCBsZXZlbCA9IEdhbWVEYXRhQ2VudGVyLnNldkJhY2sudXNlckluZm8uYS5sZXZlbFxuICAgICAgICBzd2l0Y2ggKGV2ZW50KSB7XG4gICAgICAgICAgICBjYXNlIFJlcG9ydFJvbGVUeXBlLmNyZWF0ZTpcbiAgICAgICAgICAgICAgICBpc0NyZWF0ZVJvbGUgPSB0cnVlXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFJlcG9ydFJvbGVUeXBlLmxldmVsdXA6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFJlcG9ydFJvbGVUeXBlLm9mZmxpbmU6XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUmVwb3J0Um9sZVR5cGUub25saW5lOlxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFJlcG9ydFJvbGVUeXBlLm90aGVyOlxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwb3dlciA9IEdhbWVEYXRhQ2VudGVyLnNldkJhY2sudXNlckluZm8uYS5wb3dlcjtcbiAgICAgICAgbGV0IHNlcnZlck5hbWUgPSBHYW1lRGF0YUNlbnRlci51c2VyLmdldFNlcnZlck5hbWVCeVNpZChHYW1lRGF0YUNlbnRlci5zZXZCYWNrLnVzZXJJbmZvLmEuc2lkKSB8fCBHYW1lRGF0YUNlbnRlci5zZXZCYWNrLnVzZXJJbmZvLmEuc2lkO1xuXG4gICAgICAgIGlmICh0aGlzLmNoYW5uZWxJZCA9PSBcIjQ4MDRcIiB8fCB0aGlzLmNoYW5uZWxJZCA9PSBcIjQ3NzFcIikge1xuICAgICAgICAgICAgLy/kuJPmnI0xLea3t0HkuIrmiqXop5LoibLpnIDopoHliqDlr4ZcbiAgICAgICAgICAgIGxldCByb2xlSW5mbzYgPSB7XG4gICAgICAgICAgICAgICAgdWlkOiBHYW1lRGF0YUNlbnRlci5wbGF0Lmluc3RhbmNlLm9wZW5JZCxcbiAgICAgICAgICAgICAgICB1c2VybmFtZTogdGhpcy51c2VybmFtZSxcbiAgICAgICAgICAgICAgICBzZXJ2ZXJJZDogR2FtZURhdGFDZW50ZXIuc2V2QmFjay51c2VySW5mby5hLnNpZCxcbiAgICAgICAgICAgICAgICBzZXJ2ZXJOYW1lOiBzZXJ2ZXJOYW1lLFxuICAgICAgICAgICAgICAgIHVzZXJSb2xlSWQ6IEdhbWVEYXRhQ2VudGVyLnNldkJhY2sudXNlckluZm8uYS51dWlkLFxuICAgICAgICAgICAgICAgIHVzZXJSb2xlTmFtZTogR2FtZURhdGFDZW50ZXIuc2V2QmFjay51c2VySW5mby5hLm5hbWUsXG4gICAgICAgICAgICAgICAgdXNlclJvbGVMZXZlbDogbGV2ZWwsXG4gICAgICAgICAgICAgICAgdmlwTGV2ZWw6IDAsXG4gICAgICAgICAgICAgICAgZ2FtZVJvbGVQb3dlcjogcG93ZXIsXG4gICAgICAgICAgICAgICAgY2hhbm5lbF9yb2xlX3NpZ246IFwiXCIsXG4gICAgICAgICAgICAgICAgaXNDcmVhdGVSb2xlOiBpc0NyZWF0ZVJvbGUsXG4gICAgICAgICAgICAgICAgcm9sZUNyZWF0ZVRpbWU6IEdhbWVEYXRhQ2VudGVyLnNldkJhY2sudXNlckluZm8uYS5yZWd0aW1lLFxuICAgICAgICAgICAgICAgIHVzZXJSb2xlQmFsYW5jZTogMCxcbiAgICAgICAgICAgICAgICBwYXJ0eUlkOiAwLFxuICAgICAgICAgICAgICAgIHBhcnR5TmFtZTogJ+aXoCcsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbGV0IHZlcmlmeVN0ciA9IFwidWlkPVwiICsgcm9sZUluZm82LnVpZCArIFwiJnVzZXJuYW1lPVwiICsgcm9sZUluZm82LnVzZXJuYW1lICsgXCImc2VydmVySWQ9XCIgKyByb2xlSW5mbzYuc2VydmVySWQgKyBcIiZzZXJ2ZXJOYW1lPVwiICsgcm9sZUluZm82LnNlcnZlck5hbWUgKyBcIiZ1c2VyUm9sZUlkPVwiICsgcm9sZUluZm82LnVzZXJSb2xlSWQgKyBcIiZ1c2VyUm9sZU5hbWU9XCIgKyByb2xlSW5mbzYudXNlclJvbGVOYW1lICsgXCImdXNlclJvbGVMZXZlbD1cIiArIHJvbGVJbmZvNi51c2VyUm9sZUxldmVsICsgXCImdmlwTGV2ZWw9XCIgKyByb2xlSW5mbzYudmlwTGV2ZWwgKyBcIiZnYW1lUm9sZVBvd2VyPVwiICsgcm9sZUluZm82LmdhbWVSb2xlUG93ZXIgKyBcIiZrZXk9XCJcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwidmVyaWZ5U3RyOlwiLHZlcmlmeVN0cilcbiAgICAgICAgICAgIGxldCB1cmwgPSBHYW1lY2ZnLnBhY2thZ2VJbmZvLmdldEl0ZW0oQ29uZmlnLnBpZCkud2F5aHR0cCArIFwicGxheWVyL3NiVmVyaWZ5XCJcbiAgICAgICAgICAgIEh0dHBSZXF1ZXN0LlBPU1QodXJsLCB7fSwgeyBzdHI6IHZlcmlmeVN0ciB9LCAocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInBsYXllci9zYlZlcmlmeT0+XCIsIHJlc3VsdClcbiAgICAgICAgICAgICAgICByb2xlSW5mbzYuY2hhbm5lbF9yb2xlX3NpZ24gPSByZXN1bHQuc2lnblxuICAgICAgICAgICAgICAgIHZhciByb2xlSW5mb0pzb242ID0gSlNPTi5zdHJpbmdpZnkocm9sZUluZm82KTtcbiAgICAgICAgICAgICAgICAvLyBzZXRfdXNlcmluZm8g6K6+572u4ruG4r6K5Z+65pys5L+h5oGv77yM5aaC5aS05YOP44CB5pi156ewXG4gICAgICAgICAgICAgICAgUXVpY2tTREsudXBsb2FkR2FtZVJvbGVJbmZvKHJvbGVJbmZvSnNvbjYsICgpID0+IHtcblxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHJvbGVJbmZvID0ge1xuICAgICAgICAgICAgICAgIGlzQ3JlYXRlUm9sZTogaXNDcmVhdGVSb2xlLFxuICAgICAgICAgICAgICAgIHJvbGVDcmVhdGVUaW1lOiBHYW1lRGF0YUNlbnRlci5zZXZCYWNrLnVzZXJJbmZvLmEucmVndGltZSxcbiAgICAgICAgICAgICAgICB1aWQ6IEdhbWVEYXRhQ2VudGVyLnBsYXQuaW5zdGFuY2Uub3BlbklkLFxuICAgICAgICAgICAgICAgIHVzZXJuYW1lOiB0aGlzLnVzZXJuYW1lLFxuICAgICAgICAgICAgICAgIHNlcnZlcklkOiBHYW1lRGF0YUNlbnRlci5zZXZCYWNrLnVzZXJJbmZvLmEuc2lkLFxuICAgICAgICAgICAgICAgIHNlcnZlck5hbWU6IHNlcnZlck5hbWUsXG4gICAgICAgICAgICAgICAgdXNlclJvbGVOYW1lOiBHYW1lRGF0YUNlbnRlci5zZXZCYWNrLnVzZXJJbmZvLmEubmFtZSxcbiAgICAgICAgICAgICAgICB1c2VyUm9sZUlkOiBHYW1lRGF0YUNlbnRlci5zZXZCYWNrLnVzZXJJbmZvLmEudXVpZCxcbiAgICAgICAgICAgICAgICB1c2VyUm9sZUJhbGFuY2U6IDAsXG4gICAgICAgICAgICAgICAgdmlwTGV2ZWw6IDEsXG4gICAgICAgICAgICAgICAgdXNlclJvbGVMZXZlbDogbGV2ZWwsXG4gICAgICAgICAgICAgICAgZ2FtZVJvbGVQb3dlcjogcG93ZXIsXG4gICAgICAgICAgICAgICAgcGFydHlJZDogMCxcbiAgICAgICAgICAgICAgICBwYXJ0eU5hbWU6ICfml6AnLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdmFyIHJvbGVJbmZvSnNvbiA9IEpTT04uc3RyaW5naWZ5KHJvbGVJbmZvKTtcbiAgICAgICAgICAgIC8vIHNldF91c2VyaW5mbyDorr7nva7iu4bivorln7rmnKzkv6Hmga/vvIzlpoLlpLTlg4/jgIHmmLXnp7BcbiAgICAgICAgICAgIFF1aWNrU0RLLnVwbG9hZEdhbWVSb2xlSW5mbyhyb2xlSW5mb0pzb24sICgpID0+IHtcblxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH1cbiAgICBjaGVja01zZyhzdHI6IHN0cmluZywgY2I6IEZ1bmN0aW9uKTogdm9pZCB7XG4gICAgICAgIGNiKClcbiAgICB9XG5cbiAgICByZXN0YXJ0KGZvcmNlPzogYm9vbGVhbikge1xuICAgICAgICBRdWlja1NESy5sb2dvdXQoKCkgPT4ge1xuXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgb3BlblVybCh1cmw6IHN0cmluZykge1xuICAgICAgICBRdWlja1NESy5jYWxsVXJsKHVybCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5piv5ZCm5b6u56uvXG4gICAgICovXG4gICAgaXNNaW5pQ2xpZW50KCkge1xuICAgICAgICAvL1VBOiBNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDE3XzZfMSBsaWtlIE1hY29TIFgpIEFwcGxlV2ViS2l0LzYwNS4xLjE1KEtIVE1MLCBsaWtlIEdlY2tvKU1vYmlsZS8xNUUxNDhcbiAgICAgICAgLy8gICAgTW96aWxsYS81LjAgKGlQaG9uZTsgQ1BVIGlQaG9uZSAwUyAxN182XzEgbGlrZSBNYWMgT1MgWClBcHBsZVdlYktpdC82MDUuMS4xNShLSFRNTCwgbGlrZSBHZWNrbykgb2JpbGUvMTVFMTQ4IGNvbG9yOmdyYXlcIi5tYXRjaCgvXFwoaVteO10rOyggVTspP0NQVS4rTWFjIE9TIFhcbiAgICAgICAgbGV0IHUgPSBuYXZpZ2F0b3IudXNlckFnZW50O1xuICAgICAgICBsZXQgaXNBbmRyb2lkID0gdS5pbmRleE9mKFwiQW5kcm9pZFwiKSA+IC0xIHx8IHUuaW5kZXhPZihcIkFkclwiKSA+IC0xO1xuICAgICAgICBpZiAoaXNBbmRyb2lkKSB7XG4gICAgICAgICAgICBHYW1lRGF0YUNlbnRlci5wbGF0Lmluc3RhbmNlLmRldmljZU9TID0gUGxhdEZvcm1EZXZUeXBlLmFuZHJvaWRINVxuICAgICAgICB9XG4gICAgICAgIGxldCBpc0lvcyA9IHUuaW5kZXhPZihcImlQaG9uZVwiKSA+IC0xICYmIHUuaW5kZXhPZihcIlNhZmFyaVwiKSA9PSAtMTtcbiAgICAgICAgaWYgKGlzSW9zKSB7XG4gICAgICAgICAgICBHYW1lRGF0YUNlbnRlci5wbGF0Lmluc3RhbmNlLmRldmljZU9TID0gUGxhdEZvcm1EZXZUeXBlLmlvc0g1XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNjLnN5cy5vcyA9PSBjYy5zeXMuT1NfSU9TKSB7XG4gICAgICAgICAgICBHYW1lRGF0YUNlbnRlci5wbGF0Lmluc3RhbmNlLmRldmljZU9TID0gUGxhdEZvcm1EZXZUeXBlLmlvc0g1XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzQW5kcm9pZCB8fCBpc0lvcztcbiAgICB9XG59Il19