bundle.js 216 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751
  1. var __extends = (this && this.__extends) || (function () {
  2. var extendStatics = Object.setPrototypeOf ||
  3. ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
  4. function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
  5. return function (d, b) {
  6. extendStatics(d, b);
  7. function __() { this.constructor = d; }
  8. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  9. };
  10. })();
  11. (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
  12. "use strict";
  13. /**This class is automatically generated by LayaAirIDE, please do not make any modifications. */
  14. Object.defineProperty(exports, "__esModule", { value: true });
  15. /*
  16. * 游戏初始化配置;
  17. */
  18. var GameConfig = /** @class */ (function () {
  19. function GameConfig() {
  20. }
  21. GameConfig.init = function () {
  22. var reg = Laya.ClassUtils.regClass;
  23. };
  24. GameConfig.width = 720;
  25. GameConfig.height = 1280;
  26. GameConfig.scaleMode = "fixedwidth";
  27. GameConfig.screenMode = "none";
  28. GameConfig.alignV = "middle";
  29. GameConfig.alignH = "center";
  30. GameConfig.startScene = "game_ui.scene";
  31. GameConfig.sceneRoot = "";
  32. GameConfig.debug = false;
  33. GameConfig.stat = false;
  34. GameConfig.physicsDebug = false;
  35. GameConfig.exportSceneToJson = true;
  36. return GameConfig;
  37. }());
  38. exports.default = GameConfig;
  39. GameConfig.init();
  40. },{}],2:[function(require,module,exports){
  41. "use strict";
  42. Object.defineProperty(exports, "__esModule", { value: true });
  43. var GameConfig_1 = require("./GameConfig");
  44. var ViewManager_1 = require("./game_logic/ViewManager");
  45. var WXSdk_1 = require("./game_module/WXSdk");
  46. var FYHD_Sdk_1 = require("./game_module/FYHD_Sdk");
  47. var GameSceneController_1 = require("./game_logic/GameSceneController");
  48. var Main = /** @class */ (function () {
  49. function Main() {
  50. var _this = this;
  51. //根据IDE设置初始化引擎
  52. if (window["Laya3D"])
  53. Laya3D.init(GameConfig_1.default.width, GameConfig_1.default.height);
  54. else
  55. Laya.init(GameConfig_1.default.width, GameConfig_1.default.height, Laya["WebGL"]);
  56. Laya["Physics"] && Laya["Physics"].enable();
  57. Laya["DebugPanel"] && Laya["DebugPanel"].enable();
  58. Laya.stage.scaleMode = GameConfig_1.default.scaleMode;
  59. Laya.stage.screenMode = GameConfig_1.default.screenMode;
  60. //兼容微信不支持加载scene后缀场景
  61. Laya.URL.exportSceneToJson = GameConfig_1.default.exportSceneToJson;
  62. //打开调试面板(通过IDE设置调试模式,或者url地址增加debug=true参数,均可打开调试面板)
  63. if (GameConfig_1.default.debug || Laya.Utils.getQueryString("debug") == "true")
  64. Laya.enableDebugPanel();
  65. if (GameConfig_1.default.physicsDebug && Laya["PhysicsDebugDraw"])
  66. Laya["PhysicsDebugDraw"].enable();
  67. if (GameConfig_1.default.stat)
  68. Laya.Stat.show();
  69. Laya.alertGlobalError = true;
  70. Main.nowratio = Laya.stage.width / Laya.stage.height;
  71. Main.IsWx = Laya.Browser.onWeiXin;
  72. if (Main.IsWx) {
  73. WXSdk_1.WXSdk.Instance.init(function (shareTicket, shareid, scene, appid) {
  74. _this.onShowHandler(shareTicket, shareid, scene, appid);
  75. });
  76. FYHD_Sdk_1.FYHD_Sdk.InitSdk();
  77. }
  78. //激活资源版本控制,version.json由IDE发布功能自动生成,如果没有也不影响后续流程
  79. Laya.ResourceVersion.enable("version.json", Laya.Handler.create(this, this.onVersionLoaded), Laya.ResourceVersion.FILENAME_VERSION);
  80. this.IsNeedUpdate();
  81. }
  82. Main.prototype.IsNeedUpdate = function () {
  83. if (!Main.IsWx)
  84. return;
  85. var updateManager = Laya.Browser.window.wx.getUpdateManager();
  86. updateManager.onCheckForUpdate(function (res) {
  87. console.log("最新版本:" + res.hasUpdate);
  88. });
  89. updateManager.onUpdateReady(function () {
  90. Laya.Browser.window.wx.showModal({
  91. showCancel: false,
  92. title: '更新提示',
  93. content: '新版本已经准备好,是否重启应用?',
  94. success: function (res) {
  95. updateManager.applyUpdate();
  96. },
  97. fail: function (res) {
  98. updateManager.applyUpdate();
  99. }
  100. });
  101. });
  102. };
  103. Main.prototype.onShowHandler = function (shareTicket, shareId, scene, appid) {
  104. console.log("[LOG]: 分享进入: shareTicket:", shareTicket, ", openId=", shareId, ", scene=", scene);
  105. // if (!Main.mSharePeopleScene) {
  106. // Main.mSharePeopleScene = scene;
  107. // }
  108. // if (!Main.appid) {
  109. // Main.appid = appid;
  110. // }
  111. if (scene != null && scene != "") {
  112. WXSdk_1.WXSdk.Instance.ShareScene = scene;
  113. }
  114. if (shareId != null && shareId != "") {
  115. console.log("设置分享id" + shareId);
  116. WXSdk_1.WXSdk.Instance.setShareId(shareId);
  117. }
  118. };
  119. Main.prototype.onVersionLoaded = function () {
  120. //激活大小图映射,加载小图的时候,如果发现小图在大图合集里面,则优先加载大图合集,而不是小图
  121. Laya.AtlasInfoManager.enable("fileconfig.json", Laya.Handler.create(this, this.onConfigLoaded));
  122. Laya.MouseManager.multiTouchEnabled = false;
  123. };
  124. Main.prototype.onConfigLoaded = function () {
  125. this.LoadUI();
  126. };
  127. Main.prototype.LoadUI = function () {
  128. ViewManager_1.default.Instance.OpenView(ViewManager_1.ViewType.game_ui);
  129. GameSceneController_1.default.Instance.CreateScene();
  130. //this.test();
  131. };
  132. Main.prototype.test = function () {
  133. var v1 = new Laya.Vector3(-3, 0, 1);
  134. var v2 = new Laya.Vector3(0, 0, -1);
  135. var v3 = new Laya.Vector3(0, 0, 0);
  136. Laya.Vector3.cross(v1, v2, v3);
  137. console.log(v3);
  138. };
  139. Main.IsWx = false;
  140. Main.VRE = "1.0.5";
  141. Main.CFG = "CFG";
  142. Main.wxValue = "";
  143. return Main;
  144. }());
  145. exports.Main = Main;
  146. //激活启动类
  147. new Main();
  148. },{"./GameConfig":1,"./game_logic/GameSceneController":5,"./game_logic/ViewManager":11,"./game_module/FYHD_Sdk":13,"./game_module/WXSdk":18}],3:[function(require,module,exports){
  149. "use strict";
  150. Object.defineProperty(exports, "__esModule", { value: true });
  151. var GameDefined_1 = require("../game_module/GameDefined");
  152. var Vector3 = Laya.Vector3;
  153. var Ray = Laya.Ray;
  154. var HitResult = Laya.HitResult;
  155. var GameSceneController_1 = require("./GameSceneController");
  156. var BulletController_1 = require("./BulletController");
  157. var Game_Tool_1 = require("../game_tool/Game_Tool");
  158. var Bullet = /** @class */ (function (_super) {
  159. __extends(Bullet, _super);
  160. function Bullet() {
  161. return _super.call(this) || this;
  162. }
  163. Bullet.prototype.onAwake = function () {
  164. this.self = this.owner;
  165. this.forw = new Vector3(0, 0, 0);
  166. this._transform = this.self.transform;
  167. this._corss = new Vector3(0, 0, 0);
  168. };
  169. Bullet.prototype.CreateRay = function (pos, _rotation) {
  170. if (!this.go) {
  171. this.go = BulletController_1.default.Instance.CreateBullet();
  172. var gs = this.go.getComponent(Bullet);
  173. if (!gs)
  174. this.goS = this.go.addComponent(Bullet);
  175. }
  176. else {
  177. this.go.active = true;
  178. }
  179. this.go.transform.position = pos.clone();
  180. this.go.transform.rotationEuler = _rotation;
  181. // this._transform.getForward(this.forw);
  182. this.go.transform.getForward(this.forw);
  183. this.forw = new Vector3(-this.forw.x, -this.forw.y, -this.forw.z);
  184. var temp = this.forw.clone();
  185. Vector3.normalize(temp, temp);
  186. // this.forw = new Vector3(this.forW.x * this.speed, this.forW.y * this.speed, this.forW.z * this.speed);
  187. // var temp = new Vector3(-this.forw.x * 0.01, -this.forw.y * 0.01, -this.forw.z * 0.01);
  188. pos.x = pos.x + temp.x * 0.01;
  189. pos.y = pos.y + temp.y * 0.01;
  190. pos.z = pos.z + temp.z * 0.01;
  191. if (!this._ray) {
  192. this._ray = new Ray(pos, this.forw);
  193. this._hit = new HitResult();
  194. }
  195. else {
  196. this._ray.origin = pos;
  197. this._ray.direction = this.forw;
  198. }
  199. var isS = GameSceneController_1.default.Instance.game_scene.physicsSimulation.rayCast(this._ray, this._hit);
  200. if (isS) {
  201. var poi = this._hit.point;
  202. var dis = Vector3.distance(pos, poi);
  203. this.go.transform.localScaleZ = dis;
  204. var other = this._hit.collider.owner;
  205. if (other.layer == GameDefined_1.default.player_layer) {
  206. this.goS.SetNextNotActive();
  207. }
  208. else {
  209. var nor = this._hit.normal;
  210. console.log(nor);
  211. Vector3.cross(this.forw, nor, this._corss); //大于0在左方 小于0在右方
  212. var a = Game_Tool_1.default.getReflectAng(this.forw);
  213. var ang = this._transform.rotationEuler.clone();
  214. this._corss.y >= 0 ? ang.y = ang.y + 2 * a : ang.y = ang.y - 2 * a;
  215. this.goS.CreateRay(poi, ang);
  216. }
  217. }
  218. else {
  219. this.go.transform.localScaleZ = 50;
  220. this.goS.SetNextNotActive();
  221. }
  222. };
  223. Bullet.prototype.SetNextNotActive = function () {
  224. if (this.go) {
  225. this.go.active = false;
  226. if (this.goS)
  227. this.goS.SetNextNotActive();
  228. }
  229. };
  230. return Bullet;
  231. }(Laya.Script));
  232. exports.Bullet = Bullet;
  233. },{"../game_module/GameDefined":14,"../game_tool/Game_Tool":20,"./BulletController":4,"./GameSceneController":5}],4:[function(require,module,exports){
  234. "use strict";
  235. Object.defineProperty(exports, "__esModule", { value: true });
  236. var Pool_Manager_1 = require("./Pool_Manager");
  237. var GameDefined_1 = require("../game_module/GameDefined");
  238. var GameSceneController_1 = require("./GameSceneController");
  239. var BulletController = /** @class */ (function () {
  240. function BulletController() {
  241. }
  242. Object.defineProperty(BulletController, "Instance", {
  243. get: function () {
  244. return this.instance || (this.instance = new BulletController());
  245. },
  246. enumerable: true,
  247. configurable: true
  248. });
  249. BulletController.prototype.init = function (bullet) {
  250. bullet.removeSelf();
  251. this.bulletPref = bullet;
  252. Pool_Manager_1.Pool_Manager.Instance.InitData(GameDefined_1.default.poolName.bullet, this.bulletPref);
  253. };
  254. BulletController.prototype.CreateBullet = function () {
  255. //if (this.bullet) return this.bullet;
  256. var go = Pool_Manager_1.Pool_Manager.Instance.SetActiveObject(GameDefined_1.default.poolName.bullet);
  257. GameSceneController_1.default.Instance.game_scene.addChild(go);
  258. // this.bullet = go;
  259. return go;
  260. };
  261. return BulletController;
  262. }());
  263. exports.default = BulletController;
  264. },{"../game_module/GameDefined":14,"./GameSceneController":5,"./Pool_Manager":7}],5:[function(require,module,exports){
  265. "use strict";
  266. Object.defineProperty(exports, "__esModule", { value: true });
  267. var ResourceLoad_1 = require("../game_module/ResourceLoad");
  268. var BulletController_1 = require("./BulletController");
  269. var RoleController_1 = require("./RoleController");
  270. var GameSceneController = /** @class */ (function () {
  271. function GameSceneController() {
  272. this.path = "res/LayaScene_main/Conventional/main.ls";
  273. }
  274. Object.defineProperty(GameSceneController, "Instance", {
  275. get: function () {
  276. return this.instance || (this.instance = new GameSceneController());
  277. },
  278. enumerable: true,
  279. configurable: true
  280. });
  281. GameSceneController.prototype.CreateScene = function () {
  282. var _this = this;
  283. ResourceLoad_1.default.LoadResource([this.path], function () {
  284. var t = Laya.loader.getRes(_this.path);
  285. Laya.stage.addChild(t);
  286. _this.game_scene = t;
  287. var _bullet = t.getChildByName("bullet");
  288. BulletController_1.default.Instance.init(_bullet);
  289. var _role = t.getChildByName("role");
  290. RoleController_1.RoleController.Instance.init(_role);
  291. RoleController_1.RoleController.Instance.CreateRay();
  292. });
  293. };
  294. return GameSceneController;
  295. }());
  296. exports.default = GameSceneController;
  297. },{"../game_module/ResourceLoad":15,"./BulletController":4,"./RoleController":9}],6:[function(require,module,exports){
  298. "use strict";
  299. Object.defineProperty(exports, "__esModule", { value: true });
  300. var Role_1 = require("./Role");
  301. var GameDefined_1 = require("../game_module/GameDefined");
  302. var Vector3 = Laya.Vector3;
  303. var Ray = Laya.Ray;
  304. var HitResult = Laya.HitResult;
  305. var GameSceneController_1 = require("./GameSceneController");
  306. var BulletController_1 = require("./BulletController");
  307. var Bullet_1 = require("./Bullet");
  308. var Game_Tool_1 = require("../game_tool/Game_Tool");
  309. var Player = /** @class */ (function (_super) {
  310. __extends(Player, _super);
  311. function Player() {
  312. return _super.call(this) || this;
  313. }
  314. Player.prototype.onAwake = function () {
  315. _super.prototype.onAwake.call(this);
  316. this._type = GameDefined_1.CheckType.Player;
  317. this.forw = new Vector3(0, 0, 0);
  318. this._corss = new Vector3(0, 0, 0);
  319. };
  320. Player.prototype.CreateRay = function () {
  321. this._transform.getForward(this.forw);
  322. this.forw = new Vector3(-this.forw.x, -this.forw.y, -this.forw.z);
  323. if (!this._ray) {
  324. this._ray = new Ray(this._bulletPos.transform.position, this.forw);
  325. this._hit = new HitResult();
  326. }
  327. else {
  328. this._ray.origin = this._bulletPos.transform.position;
  329. this._ray.direction = this.forw;
  330. }
  331. if (!this.go) {
  332. this.go = BulletController_1.default.Instance.CreateBullet();
  333. var gs = this.go.getComponent(Bullet_1.Bullet);
  334. if (!gs)
  335. this.goS = this.go.addComponent(Bullet_1.Bullet);
  336. }
  337. this.go.transform.position = this._bulletPos.transform.position;
  338. this.go.transform.rotation = this._transform.rotation;
  339. // this.go.transform.getForward(this.forw);
  340. var isS = GameSceneController_1.default.Instance.game_scene.physicsSimulation.rayCast(this._ray, this._hit);
  341. if (isS) {
  342. var poi = this._hit.point;
  343. var dis = Vector3.distance(this._bulletPos.transform.position, poi);
  344. this.go.transform.localScaleZ = dis;
  345. var nor = this._hit.normal;
  346. Vector3.cross(this.forw, nor, this._corss); //大于0在左方 小于0在右方
  347. var a = Game_Tool_1.default.getReflectAng(this.forw);
  348. var ang = this._transform.rotationEuler.clone();
  349. this._corss.y >= 0 ? ang.y = ang.y + 2 * a : ang.y = ang.y - 2 * a;
  350. this.goS.CreateRay(poi, ang);
  351. }
  352. else {
  353. this.go.transform.localScaleZ = 50;
  354. this.goS.SetNextNotActive();
  355. }
  356. // console.log(go.transform.localScaleZ);
  357. };
  358. Player.prototype.RotationSelf = function (rota) {
  359. this._transform.rotate(rota);
  360. this.CreateRay();
  361. };
  362. return Player;
  363. }(Role_1.Role));
  364. exports.Player = Player;
  365. },{"../game_module/GameDefined":14,"../game_tool/Game_Tool":20,"./Bullet":3,"./BulletController":4,"./GameSceneController":5,"./Role":8}],7:[function(require,module,exports){
  366. "use strict";
  367. Object.defineProperty(exports, "__esModule", { value: true });
  368. var Dictionary_1 = require("../game_tool/Dictionary");
  369. var Vector3 = Laya.Vector3;
  370. var Pool_Manager = /** @class */ (function () {
  371. function Pool_Manager() {
  372. this.poolDic = new Dictionary_1.default();
  373. this.prefabDic = new Dictionary_1.default();
  374. }
  375. Object.defineProperty(Pool_Manager, "Instance", {
  376. get: function () {
  377. return Pool_Manager.instance || (Pool_Manager.instance = new Pool_Manager());
  378. },
  379. enumerable: true,
  380. configurable: true
  381. });
  382. // [ "Coin" "Key" "Role" "Body1" "Train" ]
  383. Pool_Manager.prototype.InitData = function (name, prefab) {
  384. if (prefab != null) {
  385. if (!this.prefabDic.has(name))
  386. this.prefabDic.set(name, prefab);
  387. }
  388. };
  389. Pool_Manager.prototype.SetActiveObject = function (name, scale) {
  390. if (this.poolDic.has(name)) {
  391. if (this.poolDic.get(name).length > 0) {
  392. var result = this.poolDic.get(name).shift();
  393. result.active = true;
  394. return result;
  395. }
  396. else {
  397. if (this.prefabDic.has(name)) {
  398. var curObj = Laya.Sprite3D.instantiate(this.prefabDic.get(name));
  399. if (scale != null) {
  400. curObj.transform.localScale = new Vector3(scale, scale, scale);
  401. }
  402. curObj.name = name;
  403. return curObj;
  404. }
  405. else {
  406. return null;
  407. }
  408. }
  409. }
  410. else {
  411. if (this.prefabDic.has(name)) {
  412. var curObj = Laya.Sprite3D.instantiate(this.prefabDic.get(name));
  413. if (scale != null) {
  414. curObj.transform.localScale = new Vector3(scale, scale, scale);
  415. }
  416. curObj.name = name;
  417. return curObj;
  418. }
  419. else {
  420. return null;
  421. }
  422. }
  423. };
  424. //隐藏对象到dic
  425. Pool_Manager.prototype.SetDisableObject = function (go) {
  426. if (go)
  427. go.active = false;
  428. var key = go.name;
  429. if (!this.poolDic.has(key)) {
  430. this.poolDic.set(key, new Array());
  431. }
  432. this.poolDic.get(key).push(go);
  433. };
  434. Pool_Manager.prototype.DestoryObj = function (go) {
  435. if (go)
  436. go.destroy(true);
  437. };
  438. //延时隐藏对象到dic
  439. Pool_Manager.prototype.SetDisableMutiObject = function (go, timer) {
  440. var _this = this;
  441. Laya.timer.once(timer, this, function () {
  442. if (go)
  443. go.active = false;
  444. var key = go.name;
  445. if (!_this.poolDic.has(key)) {
  446. _this.poolDic.set(key, new Array());
  447. }
  448. _this.poolDic.get(key).push(go);
  449. });
  450. };
  451. return Pool_Manager;
  452. }());
  453. exports.Pool_Manager = Pool_Manager;
  454. },{"../game_tool/Dictionary":19}],8:[function(require,module,exports){
  455. "use strict";
  456. Object.defineProperty(exports, "__esModule", { value: true });
  457. var Role = /** @class */ (function (_super) {
  458. __extends(Role, _super);
  459. function Role() {
  460. return _super.call(this) || this;
  461. }
  462. Role.prototype.onAwake = function () {
  463. this.self = this.owner;
  464. this._transform = this.self.transform;
  465. this._bulletPos = this.self.getChildByName("bulltePos");
  466. };
  467. return Role;
  468. }(Laya.Script3D));
  469. exports.Role = Role;
  470. },{}],9:[function(require,module,exports){
  471. "use strict";
  472. Object.defineProperty(exports, "__esModule", { value: true });
  473. var Player_1 = require("./Player");
  474. var RoleController = /** @class */ (function () {
  475. function RoleController() {
  476. }
  477. Object.defineProperty(RoleController, "Instance", {
  478. get: function () {
  479. return this.instasnce || (this.instasnce = new RoleController());
  480. },
  481. enumerable: true,
  482. configurable: true
  483. });
  484. RoleController.prototype.init = function (role) {
  485. if (role) {
  486. this.player = role;
  487. this.playerS = this.player.addComponent(Player_1.Player);
  488. }
  489. };
  490. RoleController.prototype.CreateRay = function () {
  491. if (this.playerS)
  492. this.playerS.CreateRay();
  493. };
  494. RoleController.prototype.RoleRotation = function (rota) {
  495. if (this.playerS)
  496. this.playerS.RotationSelf(rota);
  497. };
  498. return RoleController;
  499. }());
  500. exports.RoleController = RoleController;
  501. },{"./Player":6}],10:[function(require,module,exports){
  502. "use strict";
  503. Object.defineProperty(exports, "__esModule", { value: true });
  504. var SoundManager = Laya.SoundManager;
  505. var WXSdk_1 = require("../game_module/WXSdk");
  506. var SettingController = /** @class */ (function () {
  507. function SettingController() {
  508. this.vibrate = true;
  509. this.sound = true;
  510. this.temp = 0;
  511. this.badMove = "res/Sound/BadMove.mp3";
  512. this.click = "res/Sound/click.mp3";
  513. this.Continue = "res/Sound/Continue.mp3";
  514. this.LevelComp = "res/Sound/LevelComp.mp3";
  515. this.TrainCrash = "res/Sound/TrainCrash.mp3";
  516. this.TrainLoop = "res/Sound/TrainLoop.mp3";
  517. this.TrainStop = "res/Sound/TrainStop.mp3";
  518. this.Coin = "res/Sound/Coin1.mp3";
  519. this.Jump = [
  520. "res/Sound/PassengerJumpIn1.mp3",
  521. "res/Sound/PassengerJumpIn2.mp3",
  522. "res/Sound/PassengerJumpIn3.mp3",
  523. "res/Sound/PassengerJumpIn4.mp3",
  524. "res/Sound/PassengerJumpIn5.mp3",
  525. "res/Sound/PassengerJumpIn6.mp3",
  526. "res/Sound/PassengerJumpIn7.mp3",
  527. "res/Sound/PassengerJumpIn8.mp3",
  528. ];
  529. }
  530. Object.defineProperty(SettingController, "Instance", {
  531. get: function () {
  532. return this.instasnce || (this.instasnce = new SettingController());
  533. },
  534. enumerable: true,
  535. configurable: true
  536. });
  537. SettingController.prototype.SettingSound = function (value) {
  538. if (!this.sound)
  539. return;
  540. SoundManager.setSoundVolume(value);
  541. SoundManager.setMusicVolume(value);
  542. };
  543. SettingController.prototype._playMusic = function (on) {
  544. if (!this.sound)
  545. return;
  546. if (on) {
  547. if (this.soundChannel == null) {
  548. this.soundChannel = SoundManager.playMusic(this.TrainLoop, 0);
  549. this.soundChannel.volume = 0.5;
  550. }
  551. this.soundChannel.resume();
  552. }
  553. else {
  554. if (this.soundChannel) {
  555. this.soundChannel.pause();
  556. }
  557. }
  558. };
  559. SettingController.prototype._playBadMove = function () {
  560. WXSdk_1.WXSdk.ShortVibrate();
  561. if (!this.sound)
  562. return;
  563. SoundManager.playSound(this.badMove);
  564. };
  565. SettingController.prototype._Click = function () {
  566. if (!this.sound)
  567. return;
  568. SoundManager.playSound(this.click);
  569. };
  570. SettingController.prototype._Continue = function (on) {
  571. if (!this.sound)
  572. return;
  573. if (on) {
  574. SoundManager.playSound(this.Continue);
  575. }
  576. else {
  577. SoundManager.stopSound(this.Continue);
  578. }
  579. };
  580. SettingController.prototype._LevelComp = function () {
  581. if (!this.sound)
  582. return;
  583. SoundManager.playSound(this.LevelComp);
  584. };
  585. SettingController.prototype._TrainCrash = function () {
  586. WXSdk_1.WXSdk.LongVibrate();
  587. if (!this.sound)
  588. return;
  589. SoundManager.playSound(this.TrainCrash);
  590. };
  591. SettingController.prototype._TrainStop = function () {
  592. if (!this.sound)
  593. return;
  594. SoundManager.playSound(this.TrainStop);
  595. };
  596. SettingController.prototype._Coin = function () {
  597. WXSdk_1.WXSdk.ShortVibrate();
  598. if (!this.sound)
  599. return;
  600. SoundManager.playSound(this.Coin);
  601. };
  602. SettingController.prototype._Jump = function () {
  603. WXSdk_1.WXSdk.ShortVibrate();
  604. if (!this.sound)
  605. return;
  606. SoundManager.playSound(this.Jump[this.temp]);
  607. this.temp++;
  608. if (this.temp == 8)
  609. this.temp = 0;
  610. };
  611. return SettingController;
  612. }());
  613. exports.SettingController = SettingController;
  614. },{"../game_module/WXSdk":18}],11:[function(require,module,exports){
  615. "use strict";
  616. Object.defineProperty(exports, "__esModule", { value: true });
  617. var Dictionary_1 = require("../game_tool/Dictionary");
  618. var game_ui_1 = require("../game_ui/game_ui");
  619. var ViewType;
  620. (function (ViewType) {
  621. ViewType[ViewType["game_ui"] = 0] = "game_ui";
  622. })(ViewType = exports.ViewType || (exports.ViewType = {}));
  623. var ViewManager = /** @class */ (function () {
  624. function ViewManager() {
  625. this.viewDic = [];
  626. this.addViewDic = new Dictionary_1.default();
  627. this.init();
  628. }
  629. Object.defineProperty(ViewManager, "Instance", {
  630. get: function () {
  631. return this.instance || (this.instance = new ViewManager());
  632. },
  633. enumerable: true,
  634. configurable: true
  635. });
  636. ViewManager.prototype.init = function () {
  637. this.viewDic[ViewType.game_ui] = game_ui_1.game_ui;
  638. };
  639. ViewManager.prototype.OpenView = function (view, data) {
  640. if (this.curView != null) {
  641. this.curView.OnClose();
  642. Laya.stage.removeChild(this.curView);
  643. // var a:Laya.Scene;
  644. // a.destroy()
  645. this.curView.destroy(true);
  646. this.curView = null;
  647. }
  648. this.curView = new this.viewDic[view];
  649. Laya.stage.addChild(this.curView);
  650. // this.curView.resizeHander();
  651. this.curView.OnShow(data);
  652. };
  653. Object.defineProperty(ViewManager.prototype, "getCurView", {
  654. get: function () {
  655. return this.curView;
  656. },
  657. enumerable: true,
  658. configurable: true
  659. });
  660. ViewManager.prototype.AddView = function (view, data) {
  661. if (this.addViewDic.has(view))
  662. return;
  663. var t_view = new this.viewDic[view];
  664. this.addViewDic.set(view, t_view);
  665. Laya.stage.addChild(t_view);
  666. t_view.OnShow(data);
  667. };
  668. ViewManager.prototype.RemoveView = function () {
  669. if (this.curView != null) {
  670. this.curView.OnClose();
  671. Laya.stage.removeChild(this.curView);
  672. this.curView.destroy(true);
  673. this.curView = null;
  674. }
  675. };
  676. ViewManager.prototype.CloseView = function (view) {
  677. if (!this.addViewDic.has(view))
  678. return;
  679. var t_view = this.addViewDic.get(view);
  680. t_view.OnClose();
  681. Laya.stage.removeChild(t_view);
  682. t_view.destroy(true);
  683. this.addViewDic.delete(view);
  684. };
  685. ViewManager.prototype.OpenMask = function () {
  686. if (this.curMask != null) {
  687. return;
  688. }
  689. // this.curMask = new Mask_ui();
  690. if (!this.curMask)
  691. return;
  692. Laya.stage.addChild(this.curMask);
  693. };
  694. ViewManager.prototype.CloseMask = function () {
  695. if (this.curMask != null) {
  696. this.curMask.OnClose();
  697. Laya.stage.removeChild(this.curMask);
  698. this.curMask.destroy(true);
  699. this.curMask = null;
  700. }
  701. };
  702. return ViewManager;
  703. }());
  704. exports.default = ViewManager;
  705. },{"../game_tool/Dictionary":19,"../game_ui/game_ui":21}],12:[function(require,module,exports){
  706. "use strict";
  707. Object.defineProperty(exports, "__esModule", { value: true });
  708. var EventManager = /** @class */ (function () {
  709. function EventManager() {
  710. }
  711. Object.defineProperty(EventManager, "Disispatcher", {
  712. get: function () {
  713. return EventManager.disispatcher || (EventManager.disispatcher = new Laya.EventDispatcher());
  714. },
  715. enumerable: true,
  716. configurable: true
  717. });
  718. EventManager.on = function (type, call, data) {
  719. this.Disispatcher.on(type, call, data);
  720. };
  721. EventManager.off = function (type, call, data) {
  722. this.Disispatcher.off(type, call, data);
  723. };
  724. EventManager.event = function (type, data) {
  725. if (data === void 0) { data = null; }
  726. this.Disispatcher.event(type, data);
  727. };
  728. return EventManager;
  729. }());
  730. exports.EventManager = EventManager;
  731. },{}],13:[function(require,module,exports){
  732. "use strict";
  733. Object.defineProperty(exports, "__esModule", { value: true });
  734. var UserModel_1 = require("./UserModel");
  735. var Main_1 = require("../Main");
  736. var EventManager_1 = require("./EventManager");
  737. var FYHD_Sdk = /** @class */ (function () {
  738. function FYHD_Sdk() {
  739. }
  740. //初始化sdk
  741. FYHD_Sdk.InitSdk = function () {
  742. Laya.Browser.window.sdk.getFyhd().startSdk();
  743. FYHD_Sdk.UserInfoAuth();
  744. };
  745. //用户授权
  746. FYHD_Sdk.UserInfoAuth = function () {
  747. if (!Main_1.Main.IsWx)
  748. return;
  749. Laya.Browser.window.sdk.getFyhd().getFyhdUserInfo(null, false, function (data) {
  750. console.log("无授权回调:" + JSON.stringify(data));
  751. if (data.result.user) {
  752. FYHD_Sdk.openid = data.result.user.openid;
  753. FYHD_Sdk.AuthInfo();
  754. }
  755. });
  756. };
  757. FYHD_Sdk.AuthInfo = function () {
  758. var args = {
  759. openid: FYHD_Sdk.openid,
  760. };
  761. Laya.Browser.window.sdk.getFyhd().loginData(args, function (data) {
  762. console.log("授权上报回调:" + JSON.stringify(data));
  763. FYHD_Sdk.ValueUser();
  764. });
  765. };
  766. FYHD_Sdk.ValueUser = function () {
  767. var args = {
  768. openid: FYHD_Sdk.openid,
  769. };
  770. Laya.Browser.window.sdk.getFyhd().valueuser(args, function (data) {
  771. console.log("有效用户上报:" + JSON.stringify(data));
  772. });
  773. };
  774. //创角色
  775. FYHD_Sdk.RoleData = function () {
  776. if (!Main_1.Main.IsWx)
  777. return;
  778. var args = {
  779. openid: FYHD_Sdk.openid,
  780. role_id: UserModel_1.default.Instance.CurModel.userid,
  781. create_time: UserModel_1.default.Instance.CurModel.ServerTime
  782. };
  783. Laya.Browser.window.sdk.getFyhd().roleData(args, function (data) {
  784. console.log("创建角色:" + JSON.stringify(data));
  785. FYHD_Sdk.Login();
  786. });
  787. };
  788. //登录信息上报
  789. FYHD_Sdk.Login = function () {
  790. if (!Main_1.Main.IsWx)
  791. return;
  792. var openid = FYHD_Sdk.openid ? FYHD_Sdk.openid : UserModel_1.default.Instance.CurModel.openid;
  793. var args = {
  794. openid: openid,
  795. role_id: UserModel_1.default.Instance.CurModel.userid,
  796. create_time: UserModel_1.default.Instance.CurModel.ServerTime.toString()
  797. };
  798. console.log("登录参数:" + JSON.stringify(args));
  799. Laya.Browser.window.sdk.getFyhd().uploginData(args, function (data) {
  800. console.log("登录结果:" + JSON.stringify(data));
  801. // FYHD_Sdk.PushData();
  802. });
  803. };
  804. //点击事件上报
  805. FYHD_Sdk.ClickAd = function (ad_type) {
  806. if (!Main_1.Main.IsWx)
  807. return;
  808. var param = {
  809. ad_type: ad_type,
  810. };
  811. console.log("点击参数:" + param);
  812. Laya.Browser.window.sdk.getFyhd().advertisement(param, function (data) {
  813. console.log("点击结果:" + JSON.stringify(data));
  814. });
  815. };
  816. FYHD_Sdk.PushData = function () {
  817. if (!Main_1.Main.IsWx)
  818. return;
  819. var param = {};
  820. Laya.Browser.window.sdk.getFyhd().shareRecommend(param, function (data) {
  821. if (data.data) {
  822. FYHD_Sdk.pushData = data.data;
  823. FYHD_Sdk.pushData.sort(FYHD_Sdk.ListSort);
  824. EventManager_1.EventManager.event(FYHD_Sdk.ShowAd);
  825. FYHD_Sdk.isHaveDate = true;
  826. }
  827. console.log("获取互推信息:" + JSON.stringify(FYHD_Sdk.pushData));
  828. });
  829. };
  830. FYHD_Sdk.ShowHuTuiJump = function (data) {
  831. if (!Main_1.Main.IsWx)
  832. return;
  833. if (data.jump_type == 2) //二维码跳转方法
  834. {
  835. Laya.Browser.window.wx.previewImage({ current: data.qrcode, urls: [data.qrcode] });
  836. }
  837. else if (data.jump_type == 1) //直跳方法
  838. {
  839. Laya.Browser.window.wx.navigateToMiniProgram({
  840. appId: data.to_appid,
  841. path: data.jump_path,
  842. success: function (res) {
  843. // 打开成功
  844. console.log("上报成功:" + JSON.stringify(res));
  845. FYHD_Sdk.PushClick(data.to_appid);
  846. }
  847. });
  848. }
  849. else if (data.jump_type == 0) //平台跳转方法
  850. {
  851. Laya.Browser.window.wx.navigateToMiniProgram({
  852. appId: data.platform_appid,
  853. path: data.jump_path,
  854. success: function (res) {
  855. // 打开成功
  856. console.log("上报成功:" + JSON.stringify(res));
  857. FYHD_Sdk.PushClick(data.to_appid);
  858. }
  859. });
  860. }
  861. };
  862. FYHD_Sdk.PushClick = function (to_appid) {
  863. if (!Main_1.Main.IsWx)
  864. return;
  865. var param = {
  866. openid: FYHD_Sdk.openid,
  867. to_appid: to_appid,
  868. };
  869. Laya.Browser.window.sdk.getFyhd().sharePlay(param, function (data) {
  870. console.log("点击上报结果:" + JSON.stringify(data));
  871. });
  872. };
  873. FYHD_Sdk.ListSort = function (a, b) {
  874. if (Number(a["panel"]) < Number(b["panel"])) {
  875. return -1;
  876. }
  877. if (Number(a["panel"]) == Number(b["panel"])) {
  878. return 0;
  879. }
  880. if (Number(a["panel"]) > Number(b["panel"])) {
  881. return 1;
  882. }
  883. };
  884. FYHD_Sdk.Ad_ClickType = {
  885. Video: "video_click",
  886. Watch: "watch",
  887. Share: "share",
  888. Banner: "banner",
  889. Push: "push"
  890. };
  891. FYHD_Sdk.pushData = [];
  892. FYHD_Sdk.isHaveDate = false;
  893. FYHD_Sdk.ShowAd = "ShowAd";
  894. return FYHD_Sdk;
  895. }());
  896. exports.FYHD_Sdk = FYHD_Sdk;
  897. },{"../Main":2,"./EventManager":12,"./UserModel":17}],14:[function(require,module,exports){
  898. "use strict";
  899. Object.defineProperty(exports, "__esModule", { value: true });
  900. var GameDefined = /** @class */ (function () {
  901. function GameDefined() {
  902. }
  903. GameDefined.player_layer = 9;
  904. GameDefined.wall_layer = 8;
  905. GameDefined.moster_layer = 10;
  906. GameDefined.boss_layer = 11;
  907. GameDefined.tree_layer = 12;
  908. GameDefined.bomb_layer = 13;
  909. GameDefined.poolName = {
  910. bullet: "bullet"
  911. };
  912. return GameDefined;
  913. }());
  914. exports.default = GameDefined;
  915. var CheckType;
  916. (function (CheckType) {
  917. CheckType[CheckType["Player"] = 0] = "Player";
  918. CheckType[CheckType["Moster"] = 1] = "Moster";
  919. CheckType[CheckType["Boss"] = 2] = "Boss";
  920. CheckType[CheckType["Bomb"] = 3] = "Bomb";
  921. CheckType[CheckType["Tree"] = 4] = "Tree";
  922. })(CheckType = exports.CheckType || (exports.CheckType = {}));
  923. },{}],15:[function(require,module,exports){
  924. "use strict";
  925. Object.defineProperty(exports, "__esModule", { value: true });
  926. var ResourceLoad = /** @class */ (function () {
  927. function ResourceLoad() {
  928. }
  929. ResourceLoad.LoadResource = function (path, complet) {
  930. Laya.loader.retryNum = 2;
  931. Laya.loader.maxLoader = 3;
  932. Laya.loader.retryDelay = 100;
  933. Laya.loader.create(path, new Laya.Handler(this, complet));
  934. Laya.loader.on(Laya.Event.ERROR, this, function (data) {
  935. console.log(data + " 资源加载失败");
  936. });
  937. };
  938. return ResourceLoad;
  939. }());
  940. exports.default = ResourceLoad;
  941. },{}],16:[function(require,module,exports){
  942. "use strict";
  943. Object.defineProperty(exports, "__esModule", { value: true });
  944. var WXSdk_1 = require("./WXSdk");
  945. var FYHD_Sdk_1 = require("./FYHD_Sdk");
  946. var ShareModule = /** @class */ (function () {
  947. function ShareModule() {
  948. }
  949. ShareModule.GoShare = function (callBack) {
  950. ShareModule.ShareTime = new Date().getTime();
  951. console.log("分享点击时间=" + ShareModule.ShareTime);
  952. ShareModule.IsSharing = true;
  953. ShareModule.callback = callBack;
  954. };
  955. ShareModule.OnShowHandle = function () {
  956. if (Laya.Browser.window.wx) {
  957. Laya.Browser.window.wx.onShow(function (option) {
  958. console.log("onshow share start");
  959. console.log("进入微信");
  960. //Laya.timer.scale=1;
  961. if (ShareModule.IsSharing) {
  962. ShareModule.IsSharing = false;
  963. var time = new Date().getTime();
  964. console.log("分享回到游戏时间" + time);
  965. var wait = (time - ShareModule.ShareTime) / 1000;
  966. console.log("分享停留时间为:" + wait);
  967. var shareSuccess = false;
  968. var realSuccess = false;
  969. if (wait >= 2) {
  970. if (Math.random() <= 0.5) {
  971. shareSuccess = true;
  972. FYHD_Sdk_1.FYHD_Sdk.ClickAd(FYHD_Sdk_1.FYHD_Sdk.Ad_ClickType.Share);
  973. if (!ShareModule.callback)
  974. return;
  975. ShareModule.callback(true);
  976. Laya.Browser.window.wx.showToast({ title: "分享成功!" });
  977. }
  978. else {
  979. if (!ShareModule.callback)
  980. return;
  981. if (Math.random() <= 0.5) {
  982. Laya.Browser.window.wx.showToast({ title: "分享失败!" });
  983. }
  984. else {
  985. WXSdk_1.WXSdk.ShowToast("请分享到不同群^-^", false);
  986. }
  987. ShareModule.callback(false);
  988. }
  989. }
  990. }
  991. });
  992. }
  993. };
  994. ShareModule.IsSharing = false;
  995. return ShareModule;
  996. }());
  997. exports.ShareModule = ShareModule;
  998. },{"./FYHD_Sdk":13,"./WXSdk":18}],17:[function(require,module,exports){
  999. "use strict";
  1000. Object.defineProperty(exports, "__esModule", { value: true });
  1001. var UserConfigName;
  1002. (function (UserConfigName) {
  1003. UserConfigName[UserConfigName["train"] = 0] = "train";
  1004. UserConfigName[UserConfigName["sign"] = 1] = "sign";
  1005. UserConfigName[UserConfigName["rewards"] = 2] = "rewards";
  1006. })(UserConfigName = exports.UserConfigName || (exports.UserConfigName = {}));
  1007. //用户信息属性
  1008. var UserAttr;
  1009. (function (UserAttr) {
  1010. UserAttr[UserAttr["equip_train"] = 0] = "equip_train";
  1011. UserAttr[UserAttr["user_id"] = 1] = "user_id";
  1012. UserAttr[UserAttr["stage"] = 2] = "stage";
  1013. UserAttr[UserAttr["get_trains"] = 3] = "get_trains";
  1014. UserAttr[UserAttr["money"] = 4] = "money";
  1015. UserAttr[UserAttr["progress_trains"] = 5] = "progress_trains";
  1016. })(UserAttr = exports.UserAttr || (exports.UserAttr = {}));
  1017. var NetUserModel = /** @class */ (function () {
  1018. function NetUserModel(_token, _config, _appSetting, _user, _userbase, _useInvite, _user_lottery, _user_treasure, t, _user_achievement, _user_sign, _user_arena) {
  1019. this.loginSeverTime = 0;
  1020. this.localTime = Laya.timer.currTimer;
  1021. this.loginSeverTime = t;
  1022. this.m_token = _token;
  1023. this.m_configs = _config;
  1024. this.m_app_setting = _appSetting;
  1025. this.m_user = _user;
  1026. this.m_user_base = _userbase;
  1027. this.m_user_invite = _useInvite;
  1028. this.m_user_lottery = _user_lottery;
  1029. this.m_user_treasure = _user_treasure;
  1030. this.m_user_achievement = _user_achievement;
  1031. this.m_user_sign = _user_sign;
  1032. this.m_user_arena = _user_arena;
  1033. this.userid = this.m_user["user_id"];
  1034. this.openid = this.m_user_base["openid"];
  1035. this.nickname = this.m_user_base["nickname"];
  1036. }
  1037. Object.defineProperty(NetUserModel.prototype, "Cfg", {
  1038. set: function (cfg) {
  1039. this.m_configs = cfg;
  1040. },
  1041. enumerable: true,
  1042. configurable: true
  1043. });
  1044. Object.defineProperty(NetUserModel.prototype, "sharetitle", {
  1045. get: function () {
  1046. if (this.m_app_setting["sharetitle"]) {
  1047. return this.m_app_setting["sharetitle"];
  1048. }
  1049. return "";
  1050. },
  1051. enumerable: true,
  1052. configurable: true
  1053. });
  1054. Object.defineProperty(NetUserModel.prototype, "shareimage", {
  1055. get: function () {
  1056. if (this.m_app_setting["shareimage"]) {
  1057. return this.m_app_setting["shareimage"];
  1058. }
  1059. return "";
  1060. },
  1061. enumerable: true,
  1062. configurable: true
  1063. });
  1064. NetUserModel.prototype.GetCfg = function (type) {
  1065. var _type = UserConfigName[type];
  1066. return this.m_configs[_type];
  1067. };
  1068. NetUserModel.prototype.GetUserAttr = function (_attr) {
  1069. var attr = UserAttr[_attr];
  1070. return this.m_user[attr];
  1071. };
  1072. Object.defineProperty(NetUserModel.prototype, "ServerTime", {
  1073. get: function () {
  1074. var time = Laya.timer.currTimer;
  1075. var stime = this.loginSeverTime + Math.ceil((time - this.localTime) / 1000);
  1076. return stime;
  1077. },
  1078. enumerable: true,
  1079. configurable: true
  1080. });
  1081. Object.defineProperty(NetUserModel.prototype, "GuideLevel", {
  1082. get: function () {
  1083. if (this.m_app_setting["GuideLevel"]) {
  1084. return Number(this.m_app_setting["GuideLevel"]);
  1085. }
  1086. return 1;
  1087. },
  1088. enumerable: true,
  1089. configurable: true
  1090. });
  1091. Object.defineProperty(NetUserModel.prototype, "BannerMoveTime", {
  1092. get: function () {
  1093. if (this.m_app_setting["BannerMoveTime"]) {
  1094. return Number(this.m_app_setting["BannerMoveTime"]);
  1095. }
  1096. return 0;
  1097. },
  1098. enumerable: true,
  1099. configurable: true
  1100. });
  1101. Object.defineProperty(NetUserModel.prototype, "HaveBanner", {
  1102. get: function () {
  1103. if (this.m_app_setting["HaveBanner"]) {
  1104. return Number(this.m_app_setting["HaveBanner"]);
  1105. }
  1106. return 0;
  1107. },
  1108. enumerable: true,
  1109. configurable: true
  1110. });
  1111. Object.defineProperty(NetUserModel.prototype, "IsShare", {
  1112. get: function () {
  1113. if (this.m_app_setting["IsShare"]) {
  1114. return Number(this.m_app_setting["IsShare"]);
  1115. }
  1116. return 0;
  1117. },
  1118. enumerable: true,
  1119. configurable: true
  1120. });
  1121. Object.defineProperty(NetUserModel.prototype, "BtnCanMove", {
  1122. get: function () {
  1123. if (this.m_app_setting["BtnCanMove"]) {
  1124. return Number(this.m_app_setting["BtnCanMove"]);
  1125. }
  1126. return 0;
  1127. },
  1128. enumerable: true,
  1129. configurable: true
  1130. });
  1131. Object.defineProperty(NetUserModel.prototype, "ISShareThenVideo", {
  1132. get: function () {
  1133. if (this.m_app_setting["ISShareThenVideo"]) {
  1134. return Number(this.m_app_setting["ISShareThenVideo"]);
  1135. }
  1136. return 0;
  1137. },
  1138. enumerable: true,
  1139. configurable: true
  1140. });
  1141. Object.defineProperty(NetUserModel.prototype, "OpenSceneValue", {
  1142. get: function () {
  1143. if (this.m_app_setting["OpenSceneValue"]) {
  1144. return Number(this.m_app_setting["OpenSceneValue"]);
  1145. }
  1146. return 0;
  1147. },
  1148. enumerable: true,
  1149. configurable: true
  1150. });
  1151. Object.defineProperty(NetUserModel.prototype, "IsOpenTryOut", {
  1152. get: function () {
  1153. if (this.m_app_setting["IsOpenTryOut"]) {
  1154. var num = Number(this.m_app_setting["IsOpenTryOut"]);
  1155. if (num == 0)
  1156. return 0;
  1157. if (Math.random() < num) {
  1158. return 1;
  1159. }
  1160. else {
  1161. return 0;
  1162. }
  1163. }
  1164. return 0;
  1165. },
  1166. enumerable: true,
  1167. configurable: true
  1168. });
  1169. return NetUserModel;
  1170. }());
  1171. exports.NetUserModel = NetUserModel;
  1172. var UserModel = /** @class */ (function () {
  1173. function UserModel(code, nickname, avatar, gender, country, province, city, device, share_id, scene) {
  1174. UserModel.instance = this;
  1175. this.m_code = code;
  1176. this.m_nickname = nickname ? nickname : "游客";
  1177. this.m_avatar = avatar ? avatar : "";
  1178. this.m_gender = gender ? gender : 0;
  1179. this.m_city = city ? city : "";
  1180. this.m_device = device ? device : "";
  1181. this.m_share_id = share_id ? share_id : "";
  1182. this.m_scene = scene ? scene : "";
  1183. this.m_country = country ? country : "";
  1184. this.m_province = province ? province : "";
  1185. }
  1186. Object.defineProperty(UserModel.prototype, "CurModel", {
  1187. get: function () {
  1188. return this.curModel;
  1189. },
  1190. enumerable: true,
  1191. configurable: true
  1192. });
  1193. Object.defineProperty(UserModel, "Instance", {
  1194. get: function () {
  1195. if (UserModel.instance) {
  1196. return UserModel.instance;
  1197. }
  1198. else {
  1199. UserModel.instance = new UserModel("11", "游客", "", null, "", "", "", "iphone6s", "", "");
  1200. return UserModel.instance;
  1201. }
  1202. },
  1203. enumerable: true,
  1204. configurable: true
  1205. });
  1206. UserModel.prototype.SetUserModel = function (_model) {
  1207. this.curModel = _model;
  1208. };
  1209. return UserModel;
  1210. }());
  1211. exports.default = UserModel;
  1212. },{}],18:[function(require,module,exports){
  1213. "use strict";
  1214. Object.defineProperty(exports, "__esModule", { value: true });
  1215. var Main_1 = require("../Main");
  1216. var ViewManager_1 = require("../game_logic/ViewManager");
  1217. var SettingController_1 = require("../game_logic/SettingController");
  1218. var ShareModule_1 = require("./ShareModule");
  1219. var UserModel_1 = require("./UserModel");
  1220. var WXSdk = /** @class */ (function () {
  1221. function WXSdk() {
  1222. this.shareId = "";
  1223. this.shareScene = "";
  1224. }
  1225. WXSdk.prototype.setShareId = function (tid) {
  1226. if (tid != "" && tid != null) {
  1227. this.shareId = tid;
  1228. console.log("[LOG]: setShareOpenId.tid=", this.shareId);
  1229. }
  1230. };
  1231. Object.defineProperty(WXSdk, "Instance", {
  1232. get: function () {
  1233. return WXSdk.instance || (WXSdk.instance = new WXSdk());
  1234. },
  1235. enumerable: true,
  1236. configurable: true
  1237. });
  1238. Object.defineProperty(WXSdk.prototype, "getShareId", {
  1239. get: function () {
  1240. return this.shareId;
  1241. },
  1242. enumerable: true,
  1243. configurable: true
  1244. });
  1245. Object.defineProperty(WXSdk.prototype, "ShareScene", {
  1246. get: function () {
  1247. return this.shareScene;
  1248. },
  1249. set: function (sceneS) {
  1250. if (sceneS != "" && sceneS != null) {
  1251. this.shareScene = sceneS;
  1252. }
  1253. },
  1254. enumerable: true,
  1255. configurable: true
  1256. });
  1257. WXSdk.prototype.init = function (cb) {
  1258. Laya.Browser.window.wx.showShareMenu({
  1259. withShareTicket: true
  1260. });
  1261. //this.shezhiShareMessage(null, null);
  1262. Laya.Browser.window.wx.onShow(function (option) {
  1263. var shareTicket = option.shareTicket;
  1264. var shareid = option.query.shareid;
  1265. var scene = decodeURIComponent(option.query.scene);
  1266. console.log("全局path=:", option.path);
  1267. console.log("decodeURIComponent", option.query.scene);
  1268. var sceneQuery = JSON.stringify(option.query);
  1269. if (Main_1.Main.wxValue == "") {
  1270. Main_1.Main.wxValue = option.scene;
  1271. }
  1272. console.log("scene", option.scene);
  1273. console.log("sceneQuery", sceneQuery);
  1274. var channel = option.query.channel;
  1275. var appid;
  1276. if (option.referrerInfo) {
  1277. console.log("referrerInfo:" + JSON.stringify(option.referrerInfo));
  1278. appid = option.referrerInfo.appId;
  1279. if (appid) {
  1280. console.log("onShow appis is:", appid);
  1281. }
  1282. else {
  1283. console.log("onShow appis is null");
  1284. }
  1285. }
  1286. else {
  1287. console.log("referrerInfo为空");
  1288. }
  1289. if (channel != null) {
  1290. console.log("onShow channel is:", channel);
  1291. }
  1292. cb(shareTicket, shareid, channel, appid);
  1293. });
  1294. };
  1295. WXSdk.ShareMessage = function (title, imageUrl) {
  1296. if (!Main_1.Main.IsWx)
  1297. return;
  1298. var t = UserModel_1.default.Instance.CurModel.ServerTime;
  1299. var _title = title;
  1300. var _url = imageUrl;
  1301. if (!_title) {
  1302. _title = UserModel_1.default.Instance.CurModel.sharetitle;
  1303. _url = UserModel_1.default.Instance.CurModel.shareimage;
  1304. }
  1305. Laya.Browser.window.wx.onShareAppMessage(function () { return ({
  1306. title: _title,
  1307. imageUrl: _url,
  1308. query: "shareid=" + UserModel_1.default.Instance.CurModel.userid + "_" + t + "_" + Math.floor(9999 * Math.random()).toString()
  1309. }); });
  1310. };
  1311. WXSdk.prototype.wx_login = function (cb) {
  1312. if (WXSdk.Lodining) {
  1313. return;
  1314. }
  1315. WXSdk.Lodining = true;
  1316. console.log("Excute wx.login! shareOpenId: " + this.shareId);
  1317. Laya.Browser.window.wx.login({
  1318. success: function (res) {
  1319. console.log("wx.login: success! res.code=" + res.code);
  1320. if (res.code) {
  1321. WXSdk.Lodining = false;
  1322. console.log("将要传递的参数:" + res);
  1323. cb(res);
  1324. }
  1325. else {
  1326. console.log('获取用户登录态失败!' + res.errMsg);
  1327. cb("error");
  1328. }
  1329. },
  1330. fail: function (res) { console.log("wx.login: failed, res=" + res); WXSdk.Lodining = false; cb("error"); }
  1331. });
  1332. };
  1333. //显示加载信息
  1334. WXSdk.ShowLoading = function (title, isShowWx) {
  1335. if (title === void 0) { title = "加载中..."; }
  1336. if (isShowWx === void 0) { isShowWx = true; }
  1337. if (Laya.Browser.window && Laya.Browser.window.wx) {
  1338. if (isShowWx) {
  1339. Laya.Browser.window.wx.showLoading({ title: title, mask: true });
  1340. }
  1341. ViewManager_1.default.Instance.OpenMask();
  1342. }
  1343. };
  1344. WXSdk.SystemInfo = function () {
  1345. if (Laya.Browser.window.wx) {
  1346. return Laya.Browser.window.wx.getSystemInfoSync();
  1347. }
  1348. };
  1349. // private static button;
  1350. // public static showbjWxGameQuan(flag: boolean): void {
  1351. // if (Laya.Browser.window.wx == null) {
  1352. // return;
  1353. // }
  1354. // if (flag) {
  1355. // if (WeiXinSDK.button == null) {
  1356. // let info = Laya.Browser.window.wx.getSystemInfoSync();
  1357. // if (!info) return;
  1358. // var top = 474 * info.windowHeight / Laya.stage.height;
  1359. // var height = 94 * info.windowHeight / Laya.stage.height;
  1360. // var width = height * 95 / 94;
  1361. // WeiXinSDK.button = Laya.Browser.window.wx.createGameClubButton
  1362. // ({
  1363. // type: "image",
  1364. // image: 'res/wx.png',
  1365. // style:
  1366. // {
  1367. // left: 0,
  1368. // top: top,
  1369. // width: width,
  1370. // height: height
  1371. // }
  1372. // })
  1373. // }
  1374. // WeiXinSDK.button.show();
  1375. // }
  1376. // else {
  1377. // if (WeiXinSDK.button) {
  1378. // WeiXinSDK.button.hide();
  1379. // }
  1380. // }
  1381. // }
  1382. //退出
  1383. // 显示提示信息//
  1384. WXSdk.ShowToast = function (text, icon) {
  1385. if (icon === void 0) { icon = true; }
  1386. if (Laya.Browser.window.wx) {
  1387. var t_icon = icon ? "success" : "none";
  1388. Laya.Browser.window.wx.showToast({ title: text, icon: t_icon });
  1389. }
  1390. else {
  1391. console.log(text);
  1392. }
  1393. };
  1394. //1:pet 2:人物
  1395. // public static XianShi_Model(content: string, callback: Function = null, type = 1, title = "") {
  1396. // if (Laya.Browser.window && Laya.Browser.window.wx) {
  1397. // if (type == 1) {
  1398. // var cancelText = "残忍丢掉";
  1399. // var confirmText = "带上一起";
  1400. // } else {
  1401. // var cancelText = "不想";
  1402. // var confirmText = "想";
  1403. // }
  1404. // Laya.Browser.window.wx.showModal({
  1405. // title: title,
  1406. // content: content,
  1407. // cancelText: cancelText,
  1408. // confirmText: confirmText,
  1409. // success(res) {
  1410. // if (res.confirm) {
  1411. // console.log('用户点击确定');
  1412. // callback(true);
  1413. // } else if (res.cancel) {
  1414. // console.log('用户点击取消');
  1415. // callback(false);
  1416. // }
  1417. // },
  1418. // fail(res?) {
  1419. // console.log('用户点击取消');
  1420. // callback(false);
  1421. // }
  1422. // })
  1423. // }
  1424. // }
  1425. WXSdk.ShortVibrate = function () {
  1426. if (Laya.Browser.window.wx && SettingController_1.SettingController.Instance.vibrate) {
  1427. Laya.Browser.window.wx.vibrateShort({});
  1428. }
  1429. };
  1430. WXSdk.LongVibrate = function () {
  1431. if (Laya.Browser.window.wx && SettingController_1.SettingController.Instance.vibrate) {
  1432. Laya.Browser.window.wx.vibrateLong({});
  1433. }
  1434. };
  1435. WXSdk.HideLoading = function (isShowWx) {
  1436. if (isShowWx === void 0) { isShowWx = true; }
  1437. if (Laya.Browser.window && Laya.Browser.window.wx) {
  1438. if (isShowWx) {
  1439. Laya.Browser.window.wx.hideLoading();
  1440. }
  1441. ViewManager_1.default.Instance.CloseMask();
  1442. }
  1443. };
  1444. WXSdk.Success = function (stageId) {
  1445. if (!Main_1.Main.IsWx)
  1446. return;
  1447. Laya.Browser.window.wx.aldStage.onEnd({
  1448. stageId: stageId,
  1449. stageName: "第" + stageId + "关",
  1450. event: "complete",
  1451. params: {
  1452. desc: "关卡完成" //描述
  1453. }
  1454. });
  1455. };
  1456. //记录阿拉丁事件
  1457. WXSdk.AldEvent = function (eventName, key, value) {
  1458. if (Laya.Browser.window && Laya.Browser.window.wx) {
  1459. if (!key)
  1460. key = "用户id";
  1461. if (!value) {
  1462. value = "";
  1463. console.log(value);
  1464. }
  1465. Laya.Browser.window.wx.aldSendEvent(eventName, { key: value });
  1466. }
  1467. };
  1468. WXSdk.Fail = function (stageId) {
  1469. if (!Main_1.Main.IsWx)
  1470. return;
  1471. Laya.Browser.window.wx.aldStage.onEnd({
  1472. stageId: stageId,
  1473. stageName: "第" + stageId + "关",
  1474. event: "fail",
  1475. params: {
  1476. desc: "关卡失败",
  1477. }
  1478. });
  1479. };
  1480. // public static leveleRuning(stageId: string, userid: string, eventtype: number, itemName: string) {
  1481. // if (Laya.Browser.window && Laya.Browser.window.wx) {
  1482. // //Laya.Browser.window.wx.aldStage.onRunning({"stageId":stageId,"stageName":stageName,"userId":userid});
  1483. // var eventT = eventtype == 0 ? "award" : "revive";
  1484. // Laya.Browser.window.wx.aldStage.onRunning({
  1485. // stageId: stageId,
  1486. // stageName: "第" + stageId + "关",
  1487. // userId: userid,
  1488. // event: eventT,
  1489. // params: {
  1490. // itemName: itemName,
  1491. // }
  1492. // })
  1493. // }
  1494. // }
  1495. WXSdk.Start = function (stageId) {
  1496. if (!Main_1.Main.IsWx)
  1497. return;
  1498. Laya.Browser.window.wx.aldStage.onStart({
  1499. stageId: stageId,
  1500. stageName: "第" + stageId + "关",
  1501. });
  1502. };
  1503. WXSdk.Game_Share = function (callback, channel) {
  1504. if (callback === void 0) { callback = null; }
  1505. if (channel === void 0) { channel = ""; }
  1506. if (!Main_1.Main.IsWx) {
  1507. return;
  1508. }
  1509. var url;
  1510. var title;
  1511. url = UserModel_1.default.Instance.CurModel.shareimage;
  1512. title = UserModel_1.default.Instance.CurModel.sharetitle;
  1513. console.log(url + " " + title);
  1514. if (channel != null) {
  1515. // WeiXinSDK.AldEvent("用户分享");
  1516. }
  1517. var t; // = UserModel.Get_Instance.CurModel.HuoQu_ServerTime;
  1518. var path = "";
  1519. Laya.Browser.window.wx.aldShareAppMessage({
  1520. title: title,
  1521. imageUrl: url,
  1522. query: "shareid=" + UserModel_1.default.Instance.CurModel.userid + "_" + "other" + "_" + t + "_" + Math.floor(9999 * Math.random()).toString(),
  1523. });
  1524. ShareModule_1.ShareModule.GoShare(callback);
  1525. };
  1526. WXSdk.Lodining = false;
  1527. return WXSdk;
  1528. }());
  1529. exports.WXSdk = WXSdk;
  1530. },{"../Main":2,"../game_logic/SettingController":10,"../game_logic/ViewManager":11,"./ShareModule":16,"./UserModel":17}],19:[function(require,module,exports){
  1531. "use strict";
  1532. Object.defineProperty(exports, "__esModule", { value: true });
  1533. var Dictionary = /** @class */ (function () {
  1534. function Dictionary() {
  1535. this._container = {};
  1536. this._length = 0;
  1537. }
  1538. Object.defineProperty(Dictionary.prototype, "container", {
  1539. get: function () {
  1540. return this._container;
  1541. },
  1542. enumerable: true,
  1543. configurable: true
  1544. });
  1545. Object.defineProperty(Dictionary.prototype, "size", {
  1546. //获取字典长度
  1547. get: function () {
  1548. return this._length;
  1549. },
  1550. enumerable: true,
  1551. configurable: true
  1552. });
  1553. //添加
  1554. Dictionary.prototype.set = function (key, value) {
  1555. if (!this._container.hasOwnProperty(key)) {
  1556. this._length++;
  1557. }
  1558. this._container[key] = value;
  1559. };
  1560. //删除
  1561. Dictionary.prototype.delete = function (key) {
  1562. if (this._container.hasOwnProperty(key)) {
  1563. delete this._container[key];
  1564. this._length--;
  1565. }
  1566. };
  1567. //查找
  1568. Dictionary.prototype.has = function (key) {
  1569. return this._container.hasOwnProperty(key) ? true : false;
  1570. };
  1571. //获取
  1572. Dictionary.prototype.get = function (key) {
  1573. if (this._container.hasOwnProperty(key)) {
  1574. return this._container[key];
  1575. }
  1576. else {
  1577. return undefined;
  1578. }
  1579. };
  1580. //清空
  1581. Dictionary.prototype.clear = function () {
  1582. this._container = {};
  1583. this._length = 0;
  1584. };
  1585. return Dictionary;
  1586. }());
  1587. exports.default = Dictionary;
  1588. },{}],20:[function(require,module,exports){
  1589. "use strict";
  1590. Object.defineProperty(exports, "__esModule", { value: true });
  1591. var Game_Tool = /** @class */ (function () {
  1592. function Game_Tool() {
  1593. }
  1594. Game_Tool.GetObjKey = function (obj) {
  1595. if (obj == null)
  1596. return null;
  1597. for (var key in obj) {
  1598. if (obj.hasOwnProperty(key)) {
  1599. return key;
  1600. }
  1601. }
  1602. };
  1603. //返回一个随机整数[min,max]
  1604. Game_Tool.randomInt = function (min, max) {
  1605. return parseInt(Math.random() * (max - min + 1) + min);
  1606. };
  1607. //p1 左向量 p2
  1608. Game_Tool.getAng = function (xx, yy, obl) {
  1609. return 180 / Math.PI * this.getRad(xx, yy, obl);
  1610. };
  1611. //返回角度
  1612. Game_Tool.getRad = function (xx, yy, obl) {
  1613. // 方法一:asin()
  1614. // var rad:Number = xx > 0 ? ((Math.PI * 3)/2 + Math.asin(-yy/obl)) : (Math.PI / 2 - Math.asin(-yy/obl));
  1615. // 方法二:acos()
  1616. var rad = yy < 0 ? Math.acos(xx / obl) : (Math.PI * 2 - Math.acos(xx / obl));
  1617. // 方法三:atan2()
  1618. // var rad:Number = yy < 0 ? Math.atan2(-yy, xx) : Math.PI * 2 + Math.atan2(-yy, xx);
  1619. return rad;
  1620. };
  1621. Game_Tool.getM_Vector = function (v1, v2) {
  1622. var temp = new Laya.Vector3();
  1623. Laya.Vector3.add(v1, v2, temp);
  1624. return new Laya.Vector3(temp.x * 0.5, temp.y * 0.5, temp.z * 0.5);
  1625. };
  1626. Game_Tool.getReflectAng = function (dir) {
  1627. var xx = Math.abs(dir.x);
  1628. var zz = Math.abs(dir.z);
  1629. var obl = Math.sqrt(Math.pow(dir.x, 2) + Math.pow(dir.z, 2));
  1630. return 180 / Math.PI * Math.acos(xx / obl);
  1631. };
  1632. Game_Tool.random_1to1 = function () {
  1633. var iszheng = Math.random() > 0.5 ? -1 : 1;
  1634. return Math.random() * iszheng;
  1635. };
  1636. Game_Tool.get64Encode = function (str) {
  1637. var c1, c2, c3;
  1638. var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  1639. var i = 0, len = str.length, string = '';
  1640. while (i < len) {
  1641. c1 = str.charCodeAt(i++) & 0xff;
  1642. if (i == len) {
  1643. string += base64EncodeChars.charAt(c1 >> 2);
  1644. string += base64EncodeChars.charAt((c1 & 0x3) << 4);
  1645. string += "==";
  1646. break;
  1647. }
  1648. c2 = str.charCodeAt(i++);
  1649. if (i == len) {
  1650. string += base64EncodeChars.charAt(c1 >> 2);
  1651. string += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
  1652. string += base64EncodeChars.charAt((c2 & 0xF) << 2);
  1653. string += "=";
  1654. break;
  1655. }
  1656. c3 = str.charCodeAt(i++);
  1657. string += base64EncodeChars.charAt(c1 >> 2);
  1658. string += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
  1659. string += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >> 6));
  1660. string += base64EncodeChars.charAt(c3 & 0x3F);
  1661. }
  1662. return string;
  1663. };
  1664. return Game_Tool;
  1665. }());
  1666. exports.default = Game_Tool;
  1667. },{}],21:[function(require,module,exports){
  1668. "use strict";
  1669. Object.defineProperty(exports, "__esModule", { value: true });
  1670. var layaMaxUI_1 = require("../ui/layaMaxUI");
  1671. var EventManager_1 = require("../game_module/EventManager");
  1672. var RoleController_1 = require("../game_logic/RoleController");
  1673. var game_ui = /** @class */ (function (_super) {
  1674. __extends(game_ui, _super);
  1675. function game_ui() {
  1676. var _this = _super.call(this) || this;
  1677. _this.isdown = false;
  1678. _this.resizeHander();
  1679. EventManager_1.EventManager.on(Laya.Event.RESIZE, _this, _this.resizeHander);
  1680. return _this;
  1681. }
  1682. game_ui.prototype.resizeHander = function () {
  1683. this.height = Laya.stage.height;
  1684. };
  1685. game_ui.prototype.OnShow = function (data) {
  1686. this.UiEventHandler();
  1687. };
  1688. game_ui.prototype.UiEventHandler = function () {
  1689. this.on(Laya.Event.MOUSE_DOWN, this, this.OnClickDown);
  1690. this.on(Laya.Event.MOUSE_UP, this, this.OnClickUp);
  1691. this.on(Laya.Event.MOUSE_OUT, this, this.OnClickUp);
  1692. };
  1693. game_ui.prototype.OnClickDown = function (e) {
  1694. if (e.target instanceof Laya.UIComponent)
  1695. return;
  1696. this.isdown = true;
  1697. this.on(Laya.Event.MOUSE_MOVE, this, this.OnSlider);
  1698. this.curMousePos = new Laya.Vector2(Laya.MouseManager.instance.mouseX, Laya.MouseManager.instance.mouseY);
  1699. };
  1700. game_ui.prototype.OnClickUp = function () {
  1701. if (!this.isdown)
  1702. return;
  1703. this.isdown = false;
  1704. this.off(Laya.Event.MOUSE_MOVE, this, this.OnSlider);
  1705. };
  1706. game_ui.prototype.OnSlider = function () {
  1707. var MousePos = new Laya.Vector2(Laya.MouseManager.instance.mouseX, Laya.MouseManager.instance.mouseY);
  1708. var offestX = MousePos.x - this.curMousePos.x;
  1709. if (offestX > 0)
  1710. offestX = offestX < 5 ? offestX : 5;
  1711. if (offestX < 0)
  1712. offestX = offestX > -5 ? offestX : -5;
  1713. var rotateDir = new Laya.Vector3(0, -offestX * 0.01, 0);
  1714. RoleController_1.RoleController.Instance.RoleRotation(rotateDir);
  1715. this.curMousePos = new Laya.Vector2(Laya.MouseManager.instance.mouseX, Laya.MouseManager.instance.mouseY);
  1716. ;
  1717. };
  1718. game_ui.prototype.OnClose = function () {
  1719. EventManager_1.EventManager.off(Laya.Event.RESIZE, this, this.resizeHander);
  1720. this.off(Laya.Event.MOUSE_DOWN, this, this.OnClickDown);
  1721. this.off(Laya.Event.MOUSE_UP, this, this.OnClickUp);
  1722. this.off(Laya.Event.MOUSE_OUT, this, this.OnClickUp);
  1723. };
  1724. return game_ui;
  1725. }(layaMaxUI_1.ui.game_uiUI));
  1726. exports.game_ui = game_ui;
  1727. },{"../game_logic/RoleController":9,"../game_module/EventManager":12,"../ui/layaMaxUI":22}],22:[function(require,module,exports){
  1728. "use strict";
  1729. Object.defineProperty(exports, "__esModule", { value: true });
  1730. var Scene = Laya.Scene;
  1731. var REG = Laya.ClassUtils.regClass;
  1732. var ui;
  1733. (function (ui) {
  1734. var game_uiUI = /** @class */ (function (_super) {
  1735. __extends(game_uiUI, _super);
  1736. function game_uiUI() {
  1737. return _super.call(this) || this;
  1738. }
  1739. game_uiUI.prototype.createChildren = function () {
  1740. _super.prototype.createChildren.call(this);
  1741. this.createView(game_uiUI.uiView);
  1742. };
  1743. game_uiUI.uiView = { "type": "Scene", "props": { "width": 720, "height": 1280 }, "loadList": [], "loadList3D": [] };
  1744. return game_uiUI;
  1745. }(Scene));
  1746. ui.game_uiUI = game_uiUI;
  1747. REG("ui.game_uiUI", game_uiUI);
  1748. })(ui = exports.ui || (exports.ui = {}));
  1749. },{}]},{},[2])
  1750. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkQ6L0xheWFCb3gvTGF5YTIuMS4wYmVhdC9MYXlhQWlySURFX2JldGEvcmVzb3VyY2VzL2FwcC9ub2RlX21vZHVsZXMvYnJvd3Nlci1wYWNrL19wcmVsdWRlLmpzIiwic3JjL0dhbWVDb25maWcudHMiLCJzcmMvTWFpbi50cyIsInNyYy9nYW1lX2xvZ2ljL0J1bGxldC50cyIsInNyYy9nYW1lX2xvZ2ljL0J1bGxldENvbnRyb2xsZXIudHMiLCJzcmMvZ2FtZV9sb2dpYy9HYW1lU2NlbmVDb250cm9sbGVyLnRzIiwic3JjL2dhbWVfbG9naWMvUGxheWVyLnRzIiwic3JjL2dhbWVfbG9naWMvUG9vbF9NYW5hZ2VyLnRzIiwic3JjL2dhbWVfbG9naWMvUm9sZS50cyIsInNyYy9nYW1lX2xvZ2ljL1JvbGVDb250cm9sbGVyLnRzIiwic3JjL2dhbWVfbG9naWMvU2V0dGluZ0NvbnRyb2xsZXIudHMiLCJzcmMvZ2FtZV9sb2dpYy9WaWV3TWFuYWdlci50cyIsInNyYy9nYW1lX21vZHVsZS9FdmVudE1hbmFnZXIudHMiLCJzcmMvZ2FtZV9tb2R1bGUvRllIRF9TZGsudHMiLCJzcmMvZ2FtZV9tb2R1bGUvR2FtZURlZmluZWQudHMiLCJzcmMvZ2FtZV9tb2R1bGUvUmVzb3VyY2VMb2FkLnRzIiwic3JjL2dhbWVfbW9kdWxlL1NoYXJlTW9kdWxlLnRzIiwic3JjL2dhbWVfbW9kdWxlL1VzZXJNb2RlbC50cyIsInNyYy9nYW1lX21vZHVsZS9XWFNkay50cyIsInNyYy9nYW1lX3Rvb2wvRGljdGlvbmFyeS50cyIsInNyYy9nYW1lX3Rvb2wvR2FtZV9Ub29sLnRzIiwic3JjL2dhbWVfdWkvZ2FtZV91aS50cyIsInNyYy91aS9sYXlhTWF4VUkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNWQSxnR0FBZ0c7O0FBRWhHOztFQUVFO0FBQ0Y7SUFhSTtJQUFjLENBQUM7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QUMsTUFBTSxFQUFDLE9BQU8sRUFBQyxPQUFPLEVBQUMsRUFBQyxPQUFPLEVBQUMsR0FBRyxFQUFDLFFBQVEsRUFBQyxJQUFJLEVBQUMsRUFBQyxVQUFVLEVBQUMsRUFBRSxFQUFDLFlBQVksRUFBQyxFQUFFLEVBQUMsQ0FBQztRQU1sSCxnQkFBQztLQVBELEFBT0MsQ0FQOEIsS0FBSyxHQU9uQztJQVBZLFlBQVMsWUFPckIsQ0FBQTtJQUNELEdBQUcsQ0FBQyxjQUFjLEVBQUMsU0FBUyxDQUFDLENBQUM7QUFDbEMsQ0FBQyxFQVZhLEVBQUUsR0FBRixVQUFFLEtBQUYsVUFBRSxRQVVmIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7XHJcbiAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBmdW5jdGlvbiAoZCwgYikge1xyXG4gICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XHJcbiAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG4gICAgfTtcclxufSkoKTtcclxuKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gcihlLG4sdCl7ZnVuY3Rpb24gbyhpLGYpe2lmKCFuW2ldKXtpZighZVtpXSl7dmFyIGM9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZTtpZighZiYmYylyZXR1cm4gYyhpLCEwKTtpZih1KXJldHVybiB1KGksITApO3ZhciBhPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIraStcIidcIik7dGhyb3cgYS5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGF9dmFyIHA9bltpXT17ZXhwb3J0czp7fX07ZVtpXVswXS5jYWxsKHAuZXhwb3J0cyxmdW5jdGlvbihyKXt2YXIgbj1lW2ldWzFdW3JdO3JldHVybiBvKG58fHIpfSxwLHAuZXhwb3J0cyxyLGUsbix0KX1yZXR1cm4gbltpXS5leHBvcnRzfWZvcih2YXIgdT1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGk9MDtpPHQubGVuZ3RoO2krKylvKHRbaV0pO3JldHVybiBvfXJldHVybiByfSkoKSIsIi8qKlRoaXMgY2xhc3MgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgTGF5YUFpcklERSwgcGxlYXNlIGRvIG5vdCBtYWtlIGFueSBtb2RpZmljYXRpb25zLiAqL1xyXG5cclxuLypcclxuKiDmuLjmiI/liJ3lp4vljJbphY3nva47XHJcbiovXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdhbWVDb25maWd7XHJcbiAgICBzdGF0aWMgd2lkdGg6bnVtYmVyPTcyMDtcclxuICAgIHN0YXRpYyBoZWlnaHQ6bnVtYmVyPTEyODA7XHJcbiAgICBzdGF0aWMgc2NhbGVNb2RlOnN0cmluZz1cImZpeGVkd2lkdGhcIjtcclxuICAgIHN0YXRpYyBzY3JlZW5Nb2RlOnN0cmluZz1cIm5vbmVcIjtcclxuICAgIHN0YXRpYyBhbGlnblY6c3RyaW5nPVwibWlkZGxlXCI7XHJcbiAgICBzdGF0aWMgYWxpZ25IOnN0cmluZz1cImNlbnRlclwiO1xyXG4gICAgc3RhdGljIHN0YXJ0U2NlbmU6YW55PVwiZ2FtZV91aS5zY2VuZVwiO1xyXG4gICAgc3RhdGljIHNjZW5lUm9vdDpzdHJpbmc9XCJcIjtcclxuICAgIHN0YXRpYyBkZWJ1Zzpib29sZWFuPWZhbHNlO1xyXG4gICAgc3RhdGljIHN0YXQ6Ym9vbGVhbj1mYWxzZTtcclxuICAgIHN0YXRpYyBwaHlzaWNzRGVidWc6Ym9vbGVhbj1mYWxzZTtcclxuICAgIHN0YXRpYyBleHBvcnRTY2VuZVRvSnNvbjpib29sZWFuPXRydWU7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe31cclxuICAgIHN0YXRpYyBpbml0KCl7XHJcbiAgICAgICAgdmFyIHJlZzogRnVuY3Rpb24gPSBMYXlhLkNsYXNzVXRpbHMucmVnQ2xhc3M7XHJcblxyXG4gICAgfVxyXG59XHJcbkdhbWVDb25maWcuaW5pdCgpOyIsImltcG9ydCBHYW1lQ29uZmlnIGZyb20gXCIuL0dhbWVDb25maWdcIjtcclxuaW1wb3J0IFZpZXdNYW5hZ2VyLCB7IFZpZXdUeXBlIH0gZnJvbSBcIi4vZ2FtZV9sb2dpYy9WaWV3TWFuYWdlclwiO1xyXG5pbXBvcnQgUmVzb3VyY2VMb2FkIGZyb20gXCIuL2dhbWVfbW9kdWxlL1Jlc291cmNlTG9hZFwiO1xyXG5pbXBvcnQgR2FtZURlZmluZWQgZnJvbSBcIi4vZ2FtZV9tb2R1bGUvR2FtZURlZmluZWRcIjtcclxuaW1wb3J0IHsgV1hTZGsgfSBmcm9tIFwiLi9nYW1lX21vZHVsZS9XWFNka1wiO1xyXG5pbXBvcnQgeyBGWUhEX1NkayB9IGZyb20gXCIuL2dhbWVfbW9kdWxlL0ZZSERfU2RrXCI7XHJcbmltcG9ydCBBc3NldENvbnRyb2xsZXIgZnJvbSBcIi4vZ2FtZV9sb2dpYy9Bc3NldENvbnRyb2xsZXJcIjtcclxuaW1wb3J0IEdhbWVTY2VuZUNvbnRyb2xsZXIgZnJvbSBcIi4vZ2FtZV9sb2dpYy9HYW1lU2NlbmVDb250cm9sbGVyXCI7XHJcbmV4cG9ydCBjbGFzcyBNYWluIHtcclxuXHJcblx0cHVibGljIHN0YXRpYyBub3dyYXRpbzogbnVtYmVyO1xyXG5cdHB1YmxpYyBzdGF0aWMgSXNXeDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cdHB1YmxpYyBzdGF0aWMgVlJFID0gXCIxLjAuNVwiO1xyXG5cdHB1YmxpYyBzdGF0aWMgQ0ZHID0gXCJDRkdcIjtcclxuXHRwdWJsaWMgc3RhdGljIHd4VmFsdWUgPSBcIlwiO1xyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cdFx0Ly/moLnmja5JREXorr7nva7liJ3lp4vljJblvJXmk45cdFx0XHJcblx0XHRpZiAod2luZG93W1wiTGF5YTNEXCJdKSBMYXlhM0QuaW5pdChHYW1lQ29uZmlnLndpZHRoLCBHYW1lQ29uZmlnLmhlaWdodCk7XHJcblx0XHRlbHNlIExheWEuaW5pdChHYW1lQ29uZmlnLndpZHRoLCBHYW1lQ29uZmlnLmhlaWdodCwgTGF5YVtcIldlYkdMXCJdKTtcclxuXHRcdExheWFbXCJQaHlzaWNzXCJdICYmIExheWFbXCJQaHlzaWNzXCJdLmVuYWJsZSgpO1xyXG5cdFx0TGF5YVtcIkRlYnVnUGFuZWxcIl0gJiYgTGF5YVtcIkRlYnVnUGFuZWxcIl0uZW5hYmxlKCk7XHJcblx0XHRMYXlhLnN0YWdlLnNjYWxlTW9kZSA9IEdhbWVDb25maWcuc2NhbGVNb2RlO1xyXG5cdFx0TGF5YS5zdGFnZS5zY3JlZW5Nb2RlID0gR2FtZUNvbmZpZy5zY3JlZW5Nb2RlO1xyXG5cdFx0Ly/lhbzlrrnlvq7kv6HkuI3mlK/mjIHliqDovb1zY2VuZeWQjue8gOWcuuaZr1xyXG5cdFx0TGF5YS5VUkwuZXhwb3J0U2NlbmVUb0pzb24gPSBHYW1lQ29uZmlnLmV4cG9ydFNjZW5lVG9Kc29uO1xyXG5cclxuXHRcdC8v5omT5byA6LCD6K+V6Z2i5p2/77yI6YCa6L+HSURF6K6+572u6LCD6K+V5qih5byP77yM5oiW6ICFdXJs5Zyw5Z2A5aKe5YqgZGVidWc9dHJ1ZeWPguaVsO+8jOWdh+WPr+aJk+W8gOiwg+ivlemdouadv++8iVxyXG5cdFx0aWYgKEdhbWVDb25maWcuZGVidWcgfHwgTGF5YS5VdGlscy5nZXRRdWVyeVN0cmluZyhcImRlYnVnXCIpID09IFwidHJ1ZVwiKSBMYXlhLmVuYWJsZURlYnVnUGFuZWwoKTtcclxuXHRcdGlmIChHYW1lQ29uZmlnLnBoeXNpY3NEZWJ1ZyAmJiBMYXlhW1wiUGh5c2ljc0RlYnVnRHJhd1wiXSkgTGF5YVtcIlBoeXNpY3NEZWJ1Z0RyYXdcIl0uZW5hYmxlKCk7XHJcblx0XHRpZiAoR2FtZUNvbmZpZy5zdGF0KSBMYXlhLlN0YXQuc2hvdygpO1xyXG5cdFx0TGF5YS5hbGVydEdsb2JhbEVycm9yID0gdHJ1ZTtcclxuXHRcdE1haW4ubm93cmF0aW8gPSBMYXlhLnN0YWdlLndpZHRoIC8gTGF5YS5zdGFnZS5oZWlnaHQ7XHJcblxyXG5cdFx0TWFpbi5Jc1d4ID0gTGF5YS5Ccm93c2VyLm9uV2VpWGluO1xyXG5cclxuXHRcdGlmIChNYWluLklzV3gpIHtcclxuXHRcdFx0V1hTZGsuSW5zdGFuY2UuaW5pdCgoc2hhcmVUaWNrZXQ6IHN0cmluZywgc2hhcmVpZDogc3RyaW5nLCBzY2VuZTogc3RyaW5nLCBhcHBpZDogc3RyaW5nKSA9PiB7XHJcblx0XHRcdFx0dGhpcy5vblNob3dIYW5kbGVyKHNoYXJlVGlja2V0LCBzaGFyZWlkLCBzY2VuZSwgYXBwaWQpO1xyXG5cdFx0XHR9KTtcclxuXHRcdFx0RllIRF9TZGsuSW5pdFNkaygpO1xyXG5cdFx0fVxyXG5cdFx0Ly/mv4DmtLvotYTmupDniYjmnKzmjqfliLbvvIx2ZXJzaW9uLmpzb27nlLFJREXlj5HluIPlip/og73oh6rliqjnlJ/miJDvvIzlpoLmnpzmsqHmnInkuZ/kuI3lvbHlk43lkI7nu63mtYHnqItcclxuXHRcdExheWEuUmVzb3VyY2VWZXJzaW9uLmVuYWJsZShcInZlcnNpb24uanNvblwiLCBMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsIHRoaXMub25WZXJzaW9uTG9hZGVkKSwgTGF5YS5SZXNvdXJjZVZlcnNpb24uRklMRU5BTUVfVkVSU0lPTik7XHJcblx0XHR0aGlzLklzTmVlZFVwZGF0ZSgpO1xyXG5cdH1cclxuXHRwcml2YXRlIElzTmVlZFVwZGF0ZSgpIHtcclxuXHRcdGlmICghTWFpbi5Jc1d4KSByZXR1cm47XHJcblx0XHRjb25zdCB1cGRhdGVNYW5hZ2VyID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eC5nZXRVcGRhdGVNYW5hZ2VyKCk7XHJcblx0XHR1cGRhdGVNYW5hZ2VyLm9uQ2hlY2tGb3JVcGRhdGUoZnVuY3Rpb24gKHJlcykge1xyXG5cdFx0XHRjb25zb2xlLmxvZyhcIuacgOaWsOeJiOacrDpcIiArIHJlcy5oYXNVcGRhdGUpO1xyXG5cdFx0fVxyXG5cdFx0KTtcclxuXHRcdHVwZGF0ZU1hbmFnZXIub25VcGRhdGVSZWFkeShmdW5jdGlvbiAoKSB7XHJcblx0XHRcdExheWEuQnJvd3Nlci53aW5kb3cud3guc2hvd01vZGFsKHtcclxuXHRcdFx0XHRzaG93Q2FuY2VsOiBmYWxzZSxcclxuXHRcdFx0XHR0aXRsZTogJ+abtOaWsOaPkOekuicsXHJcblx0XHRcdFx0Y29udGVudDogJ+aWsOeJiOacrOW3sue7j+WHhuWkh+Wlve+8jOaYr+WQpumHjeWQr+W6lOeUqO+8nycsXHJcblx0XHRcdFx0c3VjY2VzcyhyZXMpIHtcclxuXHRcdFx0XHRcdHVwZGF0ZU1hbmFnZXIuYXBwbHlVcGRhdGUoKTtcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdGZhaWwocmVzPykge1xyXG5cdFx0XHRcdFx0dXBkYXRlTWFuYWdlci5hcHBseVVwZGF0ZSgpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgb25TaG93SGFuZGxlcihzaGFyZVRpY2tldDogc3RyaW5nLCBzaGFyZUlkOiBzdHJpbmcsIHNjZW5lOiBzdHJpbmcsIGFwcGlkOiBzdHJpbmcpIHtcclxuXHRcdGNvbnNvbGUubG9nKFwiW0xPR106IOWIhuS6q+i/m+WFpTogc2hhcmVUaWNrZXQ6XCIsIHNoYXJlVGlja2V0LCBcIiwgb3BlbklkPVwiLCBzaGFyZUlkLCBcIiwgc2NlbmU9XCIsIHNjZW5lKTtcclxuXHRcdC8vIGlmICghTWFpbi5tU2hhcmVQZW9wbGVTY2VuZSkge1xyXG5cdFx0Ly8gXHRNYWluLm1TaGFyZVBlb3BsZVNjZW5lID0gc2NlbmU7XHJcblx0XHQvLyB9XHJcblx0XHQvLyBpZiAoIU1haW4uYXBwaWQpIHtcclxuXHRcdC8vIFx0TWFpbi5hcHBpZCA9IGFwcGlkO1xyXG5cdFx0Ly8gfVxyXG5cdFx0aWYgKHNjZW5lICE9IG51bGwgJiYgc2NlbmUgIT0gXCJcIikge1xyXG5cdFx0XHRXWFNkay5JbnN0YW5jZS5TaGFyZVNjZW5lID0gc2NlbmU7XHJcblx0XHR9XHJcblx0XHRpZiAoc2hhcmVJZCAhPSBudWxsICYmIHNoYXJlSWQgIT0gXCJcIikge1xyXG5cdFx0XHRjb25zb2xlLmxvZyhcIuiuvue9ruWIhuS6q2lkXCIgKyBzaGFyZUlkKTtcclxuXHRcdFx0V1hTZGsuSW5zdGFuY2Uuc2V0U2hhcmVJZChzaGFyZUlkKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdG9uVmVyc2lvbkxvYWRlZCgpOiB2b2lkIHtcclxuXHRcdC8v5r+A5rS75aSn5bCP5Zu+5pig5bCE77yM5Yqg6L295bCP5Zu+55qE5pe25YCZ77yM5aaC5p6c5Y+R546w5bCP5Zu+5Zyo5aSn5Zu+5ZCI6ZuG6YeM6Z2i77yM5YiZ5LyY5YWI5Yqg6L295aSn5Zu+5ZCI6ZuG77yM6ICM5LiN5piv5bCP5Zu+XHJcblx0XHRMYXlhLkF0bGFzSW5mb01hbmFnZXIuZW5hYmxlKFwiZmlsZWNvbmZpZy5qc29uXCIsIExheWEuSGFuZGxlci5jcmVhdGUodGhpcywgdGhpcy5vbkNvbmZpZ0xvYWRlZCkpO1xyXG5cdFx0TGF5YS5Nb3VzZU1hbmFnZXIubXVsdGlUb3VjaEVuYWJsZWQgPSBmYWxzZTtcclxuXHR9XHJcblxyXG5cdG9uQ29uZmlnTG9hZGVkKCk6IHZvaWQge1xyXG5cdFx0dGhpcy5Mb2FkVUkoKTtcclxuXHR9XHJcblx0TG9hZFVJKCkge1xyXG5cdFx0Vmlld01hbmFnZXIuSW5zdGFuY2UuT3BlblZpZXcoVmlld1R5cGUuZ2FtZV91aSk7XHJcblx0XHRHYW1lU2NlbmVDb250cm9sbGVyLkluc3RhbmNlLkNyZWF0ZVNjZW5lKCk7XHJcblx0XHRcdC8vdGhpcy50ZXN0KCk7XHJcblx0fVxyXG5cclxuXHR0ZXN0KCkge1xyXG5cdFx0dmFyIHYxPW5ldyBMYXlhLlZlY3RvcjMoLTMsMCwxKTtcclxuXHRcdHZhciB2Mj1uZXcgTGF5YS5WZWN0b3IzKDAsMCwtMSk7XHJcblx0XHR2YXIgdjM9bmV3IExheWEuVmVjdG9yMygwLDAsMCk7XHJcblx0XHRMYXlhLlZlY3RvcjMuY3Jvc3ModjEsdjIsdjMpO1xyXG5cdFx0Y29uc29sZS5sb2codjMpO1xyXG5cdH1cclxufVxyXG4vL+a/gOa0u+WQr+WKqOexu1xyXG5uZXcgTWFpbigpO1xyXG4iLCJpbXBvcnQgeyBSb2xlIH0gZnJvbSBcIi4vUm9sZVwiO1xyXG5pbXBvcnQgR2FtZURlZmluZWQsIHsgQ2hlY2tUeXBlIH0gZnJvbSBcIi4uL2dhbWVfbW9kdWxlL0dhbWVEZWZpbmVkXCI7XHJcbmltcG9ydCBWZWN0b3IzID0gTGF5YS5WZWN0b3IzO1xyXG5pbXBvcnQgUmF5ID0gTGF5YS5SYXk7XHJcbmltcG9ydCBIaXRSZXN1bHQgPSBMYXlhLkhpdFJlc3VsdDtcclxuaW1wb3J0IEdhbWVTY2VuZUNvbnRyb2xsZXIgZnJvbSBcIi4vR2FtZVNjZW5lQ29udHJvbGxlclwiO1xyXG5pbXBvcnQgQnVsbGV0Q29udHJvbGxlciBmcm9tIFwiLi9CdWxsZXRDb250cm9sbGVyXCI7XHJcbmltcG9ydCBTcHJpdGUzRCA9IExheWEuU3ByaXRlM0Q7XHJcbmltcG9ydCBUcmFuc2Zvcm0zRCA9IExheWEuVHJhbnNmb3JtM0Q7XHJcbmltcG9ydCBHYW1lX1Rvb2wgZnJvbSBcIi4uL2dhbWVfdG9vbC9HYW1lX1Rvb2xcIjtcclxuZXhwb3J0IGNsYXNzIEJ1bGxldCBleHRlbmRzIExheWEuU2NyaXB0IHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfdHJhbnNmb3JtOiBUcmFuc2Zvcm0zRDtcclxuICAgIHByaXZhdGUgc2VsZjogU3ByaXRlM0Q7XHJcbiAgICBvbkF3YWtlKCkge1xyXG4gICAgICAgIHRoaXMuc2VsZiA9IHRoaXMub3duZXIgYXMgU3ByaXRlM0Q7XHJcbiAgICAgICAgdGhpcy5mb3J3ID0gbmV3IFZlY3RvcjMoMCwgMCwgMCk7XHJcbiAgICAgICAgdGhpcy5fdHJhbnNmb3JtID0gdGhpcy5zZWxmLnRyYW5zZm9ybTtcclxuICAgICAgICB0aGlzLl9jb3JzcyA9IG5ldyBWZWN0b3IzKDAsIDAsIDApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZm9ydzogVmVjdG9yMztcclxuICAgIHByaXZhdGUgX3JheTogUmF5O1xyXG4gICAgcHJpdmF0ZSBfaGl0OiBIaXRSZXN1bHQ7XHJcbiAgICBwcml2YXRlIGdvOiBTcHJpdGUzRDtcclxuICAgIHByaXZhdGUgZ29TOiBCdWxsZXQ7XHJcbiAgICBwcml2YXRlIF9jb3JzczogVmVjdG9yMztcclxuICAgIENyZWF0ZVJheShwb3M6IFZlY3RvcjMsIF9yb3RhdGlvbikge1xyXG4gICAgICAgIGlmICghdGhpcy5nbykge1xyXG4gICAgICAgICAgICB0aGlzLmdvID0gQnVsbGV0Q29udHJvbGxlci5JbnN0YW5jZS5DcmVhdGVCdWxsZXQoKTtcclxuICAgICAgICAgICAgdmFyIGdzID0gdGhpcy5nby5nZXRDb21wb25lbnQoQnVsbGV0KTtcclxuICAgICAgICAgICAgaWYgKCFncykgdGhpcy5nb1MgPSB0aGlzLmdvLmFkZENvbXBvbmVudChCdWxsZXQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ28uYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5nby50cmFuc2Zvcm0ucG9zaXRpb24gPSBwb3MuY2xvbmUoKTtcclxuICAgICAgICB0aGlzLmdvLnRyYW5zZm9ybS5yb3RhdGlvbkV1bGVyID0gX3JvdGF0aW9uO1xyXG4gICAgICAgIC8vIHRoaXMuX3RyYW5zZm9ybS5nZXRGb3J3YXJkKHRoaXMuZm9ydyk7XHJcbiAgICAgICAgdGhpcy5nby50cmFuc2Zvcm0uZ2V0Rm9yd2FyZCh0aGlzLmZvcncpO1xyXG4gICAgICAgIHRoaXMuZm9ydyA9IG5ldyBWZWN0b3IzKC10aGlzLmZvcncueCwgLXRoaXMuZm9ydy55LCAtdGhpcy5mb3J3LnopO1xyXG4gICAgICAgIHZhciB0ZW1wPXRoaXMuZm9ydy5jbG9uZSgpO1xyXG4gICAgICAgIFZlY3RvcjMubm9ybWFsaXplKHRlbXAsIHRlbXApO1xyXG4gICAgICAgIC8vICAgIHRoaXMuZm9ydyA9IG5ldyBWZWN0b3IzKHRoaXMuZm9yVy54ICogdGhpcy5zcGVlZCwgdGhpcy5mb3JXLnkgKiB0aGlzLnNwZWVkLCB0aGlzLmZvclcueiAqIHRoaXMuc3BlZWQpO1xyXG5cclxuXHJcbiAgICAgICAvLyB2YXIgdGVtcCA9IG5ldyBWZWN0b3IzKC10aGlzLmZvcncueCAqIDAuMDEsIC10aGlzLmZvcncueSAqIDAuMDEsIC10aGlzLmZvcncueiAqIDAuMDEpO1xyXG5cclxuICAgICAgICBwb3MueCA9IHBvcy54ICsgdGVtcC54KjAuMDE7XHJcbiAgICAgICAgcG9zLnkgPSBwb3MueSArIHRlbXAueSowLjAxO1xyXG4gICAgICAgIHBvcy56ID0gcG9zLnogKyB0ZW1wLnoqMC4wMTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9yYXkpIHtcclxuICAgICAgICAgICAgdGhpcy5fcmF5ID0gbmV3IFJheShwb3MsIHRoaXMuZm9ydyk7XHJcbiAgICAgICAgICAgIHRoaXMuX2hpdCA9IG5ldyBIaXRSZXN1bHQoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9yYXkub3JpZ2luID0gcG9zO1xyXG4gICAgICAgICAgICB0aGlzLl9yYXkuZGlyZWN0aW9uID0gdGhpcy5mb3J3O1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIHZhciBpc1MgPSBHYW1lU2NlbmVDb250cm9sbGVyLkluc3RhbmNlLmdhbWVfc2NlbmUucGh5c2ljc1NpbXVsYXRpb24ucmF5Q2FzdCh0aGlzLl9yYXksIHRoaXMuX2hpdCk7XHJcbiAgICAgICAgaWYgKGlzUykge1xyXG4gICAgICAgICAgICB2YXIgcG9pID0gdGhpcy5faGl0LnBvaW50O1xyXG4gICAgICAgICAgICB2YXIgZGlzID0gVmVjdG9yMy5kaXN0YW5jZShwb3MsIHBvaSk7XHJcbiAgICAgICAgICAgIHRoaXMuZ28udHJhbnNmb3JtLmxvY2FsU2NhbGVaID0gZGlzO1xyXG4gICAgICAgICAgICB2YXIgb3RoZXIgPSB0aGlzLl9oaXQuY29sbGlkZXIub3duZXIgYXMgU3ByaXRlM0Q7XHJcbiAgICAgICAgICAgIGlmIChvdGhlci5sYXllciA9PSBHYW1lRGVmaW5lZC5wbGF5ZXJfbGF5ZXIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ29TLlNldE5leHROb3RBY3RpdmUoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHZhciBub3IgPSB0aGlzLl9oaXQubm9ybWFsO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2cobm9yKTtcclxuICAgICAgICAgICAgICAgIFZlY3RvcjMuY3Jvc3ModGhpcy5mb3J3LCBub3IsIHRoaXMuX2NvcnNzKTsvL+Wkp+S6jjDlnKjlt6bmlrkg5bCP5LqOMOWcqOWPs+aWuVxyXG4gICAgICAgICAgICAgICAgdmFyIGEgPSBHYW1lX1Rvb2wuZ2V0UmVmbGVjdEFuZyh0aGlzLmZvcncpO1xyXG4gICAgICAgICAgICAgICAgdmFyIGFuZyA9IHRoaXMuX3RyYW5zZm9ybS5yb3RhdGlvbkV1bGVyLmNsb25lKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9jb3Jzcy55ID49IDAgPyBhbmcueSA9IGFuZy55ICsgMiAqIGEgOiBhbmcueSA9IGFuZy55IC0gMiAqIGE7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdvUy5DcmVhdGVSYXkocG9pLCBhbmcpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ28udHJhbnNmb3JtLmxvY2FsU2NhbGVaID0gNTA7XHJcbiAgICAgICAgICAgIHRoaXMuZ29TLlNldE5leHROb3RBY3RpdmUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIFNldE5leHROb3RBY3RpdmUoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZ28pIHtcclxuICAgICAgICAgICAgdGhpcy5nby5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZ29TKSB0aGlzLmdvUy5TZXROZXh0Tm90QWN0aXZlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IFNwcml0ZTNEID0gTGF5YS5TcHJpdGUzRDtcclxuaW1wb3J0IHsgUG9vbF9NYW5hZ2VyIH0gZnJvbSBcIi4vUG9vbF9NYW5hZ2VyXCI7XHJcbmltcG9ydCBHYW1lRGVmaW5lZCBmcm9tIFwiLi4vZ2FtZV9tb2R1bGUvR2FtZURlZmluZWRcIjtcclxuaW1wb3J0IEdhbWVTY2VuZUNvbnRyb2xsZXIgZnJvbSBcIi4vR2FtZVNjZW5lQ29udHJvbGxlclwiO1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCdWxsZXRDb250cm9sbGVyIHtcclxuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBCdWxsZXRDb250cm9sbGVyO1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgSW5zdGFuY2UoKTogQnVsbGV0Q29udHJvbGxlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2UgfHwgKHRoaXMuaW5zdGFuY2UgPSBuZXcgQnVsbGV0Q29udHJvbGxlcigpKTtcclxuICAgIH1cclxuICAgIHByaXZhdGUgYnVsbGV0UHJlZjogU3ByaXRlM0Q7XHJcbiAgICBwdWJsaWMgaW5pdChidWxsZXQ6IFNwcml0ZTNEKSB7XHJcbiAgICAgICAgYnVsbGV0LnJlbW92ZVNlbGYoKTtcclxuICAgICAgICB0aGlzLmJ1bGxldFByZWYgPSBidWxsZXQ7XHJcbiAgICAgICAgUG9vbF9NYW5hZ2VyLkluc3RhbmNlLkluaXREYXRhKEdhbWVEZWZpbmVkLnBvb2xOYW1lLmJ1bGxldCwgdGhpcy5idWxsZXRQcmVmKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGJ1bGxldDogU3ByaXRlM0Q7XHJcbiAgICBwdWJsaWMgQ3JlYXRlQnVsbGV0KCk6IFNwcml0ZTNEIHtcclxuICAgICAgICAvL2lmICh0aGlzLmJ1bGxldCkgcmV0dXJuIHRoaXMuYnVsbGV0O1xyXG4gICAgICAgIHZhciBnbyA9IFBvb2xfTWFuYWdlci5JbnN0YW5jZS5TZXRBY3RpdmVPYmplY3QoR2FtZURlZmluZWQucG9vbE5hbWUuYnVsbGV0KTtcclxuICAgICAgICBHYW1lU2NlbmVDb250cm9sbGVyLkluc3RhbmNlLmdhbWVfc2NlbmUuYWRkQ2hpbGQoZ28pO1xyXG4gICAgICAgLy8gdGhpcy5idWxsZXQgPSBnbztcclxuICAgICAgICByZXR1cm4gZ287XHJcbiAgICB9XHJcblxyXG59IiwiaW1wb3J0IFJlc291cmNlTG9hZCBmcm9tIFwiLi4vZ2FtZV9tb2R1bGUvUmVzb3VyY2VMb2FkXCI7XHJcblxyXG5pbXBvcnQgU2NlbmUzRCA9IExheWEuU2NlbmUzRDtcclxuaW1wb3J0IEJ1bGxldENvbnRyb2xsZXIgZnJvbSBcIi4vQnVsbGV0Q29udHJvbGxlclwiO1xyXG5pbXBvcnQgeyBSb2xlQ29udHJvbGxlciB9IGZyb20gXCIuL1JvbGVDb250cm9sbGVyXCI7XHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdhbWVTY2VuZUNvbnRyb2xsZXIge1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IEdhbWVTY2VuZUNvbnRyb2xsZXI7XHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCBJbnN0YW5jZSgpOiBHYW1lU2NlbmVDb250cm9sbGVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZSB8fCAodGhpcy5pbnN0YW5jZSA9IG5ldyBHYW1lU2NlbmVDb250cm9sbGVyKCkpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgZ2FtZV9zY2VuZTogU2NlbmUzRDtcclxuICAgIHB1YmxpYyBwYXRoID0gXCJyZXMvTGF5YVNjZW5lX21haW4vQ29udmVudGlvbmFsL21haW4ubHNcIjtcclxuICAgIHB1YmxpYyBDcmVhdGVTY2VuZSgpIHtcclxuICAgICAgICBSZXNvdXJjZUxvYWQuTG9hZFJlc291cmNlKFt0aGlzLnBhdGhdLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHZhciB0ID0gTGF5YS5sb2FkZXIuZ2V0UmVzKHRoaXMucGF0aCkgYXMgTGF5YS5TY2VuZTNEO1xyXG4gICAgICAgICAgICBMYXlhLnN0YWdlLmFkZENoaWxkKHQpO1xyXG4gICAgICAgICAgICB0aGlzLmdhbWVfc2NlbmUgPSB0O1xyXG4gICAgICAgICAgICB2YXIgX2J1bGxldCA9IHQuZ2V0Q2hpbGRCeU5hbWUoXCJidWxsZXRcIikgYXMgTGF5YS5TcHJpdGUzRDtcclxuICAgICAgICAgICAgQnVsbGV0Q29udHJvbGxlci5JbnN0YW5jZS5pbml0KF9idWxsZXQpO1xyXG4gICAgICAgICAgICB2YXIgX3JvbGUgPSB0LmdldENoaWxkQnlOYW1lKFwicm9sZVwiKSBhcyBMYXlhLlNwcml0ZTNEO1xyXG4gICAgICAgICAgICBSb2xlQ29udHJvbGxlci5JbnN0YW5jZS5pbml0KF9yb2xlKTtcclxuICAgICAgICAgICBcclxuICAgICAgICAgICAgUm9sZUNvbnRyb2xsZXIuSW5zdGFuY2UuQ3JlYXRlUmF5KCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG59IiwiaW1wb3J0IHsgUm9sZSB9IGZyb20gXCIuL1JvbGVcIjtcclxuaW1wb3J0IHsgQ2hlY2tUeXBlIH0gZnJvbSBcIi4uL2dhbWVfbW9kdWxlL0dhbWVEZWZpbmVkXCI7XHJcbmltcG9ydCBWZWN0b3IzID0gTGF5YS5WZWN0b3IzO1xyXG5pbXBvcnQgUmF5ID0gTGF5YS5SYXk7XHJcbmltcG9ydCBIaXRSZXN1bHQgPSBMYXlhLkhpdFJlc3VsdDtcclxuaW1wb3J0IEdhbWVTY2VuZUNvbnRyb2xsZXIgZnJvbSBcIi4vR2FtZVNjZW5lQ29udHJvbGxlclwiO1xyXG5pbXBvcnQgQnVsbGV0Q29udHJvbGxlciBmcm9tIFwiLi9CdWxsZXRDb250cm9sbGVyXCI7XHJcbmltcG9ydCBTcHJpdGUzRCA9IExheWEuU3ByaXRlM0Q7XHJcbmltcG9ydCB7IEJ1bGxldCB9IGZyb20gXCIuL0J1bGxldFwiO1xyXG5pbXBvcnQgR2FtZV9Ub29sIGZyb20gXCIuLi9nYW1lX3Rvb2wvR2FtZV9Ub29sXCI7XHJcbmV4cG9ydCBjbGFzcyBQbGF5ZXIgZXh0ZW5kcyBSb2xlIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgb25Bd2FrZSgpIHtcclxuICAgICAgICBzdXBlci5vbkF3YWtlKCk7XHJcbiAgICAgICAgdGhpcy5fdHlwZSA9IENoZWNrVHlwZS5QbGF5ZXI7XHJcbiAgICAgICAgdGhpcy5mb3J3ID0gbmV3IFZlY3RvcjMoMCwgMCwgMCk7XHJcbiAgICAgICAgdGhpcy5fY29yc3MgPSBuZXcgVmVjdG9yMygwLCAwLCAwKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGZvcnc6IFZlY3RvcjM7XHJcbiAgICBwcml2YXRlIF9yYXk6IFJheTtcclxuICAgIHByaXZhdGUgX2hpdDogSGl0UmVzdWx0O1xyXG5cclxuICAgIHByaXZhdGUgX2NvcnNzOiBWZWN0b3IzO1xyXG5cclxuICAgIHByaXZhdGUgZ286IFNwcml0ZTNEO1xyXG4gICAgcHJpdmF0ZSBnb1M6IEJ1bGxldDtcclxuICAgIENyZWF0ZVJheSgpIHtcclxuICAgICAgICB0aGlzLl90cmFuc2Zvcm0uZ2V0Rm9yd2FyZCh0aGlzLmZvcncpO1xyXG4gICAgICAgIHRoaXMuZm9ydyA9IG5ldyBWZWN0b3IzKC10aGlzLmZvcncueCwgLXRoaXMuZm9ydy55LCAtdGhpcy5mb3J3LnopO1xyXG4gICAgICAgIGlmICghdGhpcy5fcmF5KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3JheSA9IG5ldyBSYXkodGhpcy5fYnVsbGV0UG9zLnRyYW5zZm9ybS5wb3NpdGlvbiwgdGhpcy5mb3J3KTtcclxuICAgICAgICAgICAgdGhpcy5faGl0ID0gbmV3IEhpdFJlc3VsdCgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3JheS5vcmlnaW4gPSB0aGlzLl9idWxsZXRQb3MudHJhbnNmb3JtLnBvc2l0aW9uO1xyXG4gICAgICAgICAgICB0aGlzLl9yYXkuZGlyZWN0aW9uID0gdGhpcy5mb3J3O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuZ28pIHtcclxuICAgICAgICAgICAgdGhpcy5nbyA9IEJ1bGxldENvbnRyb2xsZXIuSW5zdGFuY2UuQ3JlYXRlQnVsbGV0KCk7XHJcbiAgICAgICAgICAgIHZhciBncyA9IHRoaXMuZ28uZ2V0Q29tcG9uZW50KEJ1bGxldCk7XHJcbiAgICAgICAgICAgIGlmICghZ3MpIHRoaXMuZ29TID0gdGhpcy5nby5hZGRDb21wb25lbnQoQnVsbGV0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5nby50cmFuc2Zvcm0ucG9zaXRpb24gPSB0aGlzLl9idWxsZXRQb3MudHJhbnNmb3JtLnBvc2l0aW9uO1xyXG4gICAgICAgIHRoaXMuZ28udHJhbnNmb3JtLnJvdGF0aW9uID0gdGhpcy5fdHJhbnNmb3JtLnJvdGF0aW9uO1xyXG4gICAgICAgIC8vICB0aGlzLmdvLnRyYW5zZm9ybS5nZXRGb3J3YXJkKHRoaXMuZm9ydyk7XHJcbiAgICAgICAgdmFyIGlzUyA9IEdhbWVTY2VuZUNvbnRyb2xsZXIuSW5zdGFuY2UuZ2FtZV9zY2VuZS5waHlzaWNzU2ltdWxhdGlvbi5yYXlDYXN0KHRoaXMuX3JheSwgdGhpcy5faGl0KTtcclxuXHJcbiAgICAgICAgaWYgKGlzUykge1xyXG4gICAgICAgICAgICB2YXIgcG9pID0gdGhpcy5faGl0LnBvaW50O1xyXG4gICAgICAgICAgICB2YXIgZGlzID0gVmVjdG9yMy5kaXN0YW5jZSh0aGlzLl9idWxsZXRQb3MudHJhbnNmb3JtLnBvc2l0aW9uLCBwb2kpO1xyXG4gICAgICAgICAgICB0aGlzLmdvLnRyYW5zZm9ybS5sb2NhbFNjYWxlWiA9IGRpcztcclxuICAgICAgICAgICAgdmFyIG5vciA9IHRoaXMuX2hpdC5ub3JtYWw7XHJcbiAgICAgICAgICAgIFZlY3RvcjMuY3Jvc3ModGhpcy5mb3J3LCBub3IsIHRoaXMuX2NvcnNzKTsvL+Wkp+S6jjDlnKjlt6bmlrkg5bCP5LqOMOWcqOWPs+aWuVxyXG4gICAgICAgICAgICB2YXIgYSA9IEdhbWVfVG9vbC5nZXRSZWZsZWN0QW5nKHRoaXMuZm9ydyk7XHJcbiAgICAgICAgICAgIHZhciBhbmcgPSB0aGlzLl90cmFuc2Zvcm0ucm90YXRpb25FdWxlci5jbG9uZSgpO1xyXG4gICAgICAgICAgICB0aGlzLl9jb3Jzcy55ID49IDAgPyBhbmcueSA9IGFuZy55ICsgMiAqIGEgOiBhbmcueSA9IGFuZy55IC0gMiAqIGE7XHJcbiAgICAgICAgICAgIHRoaXMuZ29TLkNyZWF0ZVJheShwb2ksIGFuZyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5nby50cmFuc2Zvcm0ubG9jYWxTY2FsZVogPSA1MDtcclxuICAgICAgICAgICAgdGhpcy5nb1MuU2V0TmV4dE5vdEFjdGl2ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyAgY29uc29sZS5sb2coZ28udHJhbnNmb3JtLmxvY2FsU2NhbGVaKTtcclxuICAgIH1cclxuXHJcbiAgICBSb3RhdGlvblNlbGYocm90YTogVmVjdG9yMykge1xyXG4gICAgICAgIHRoaXMuX3RyYW5zZm9ybS5yb3RhdGUocm90YSk7XHJcbiAgICAgICAgdGhpcy5DcmVhdGVSYXkoKTtcclxuICAgIH1cclxufSIsImltcG9ydCBEaWN0aW9uYXJ5IGZyb20gXCIuLi9nYW1lX3Rvb2wvRGljdGlvbmFyeVwiO1xyXG5pbXBvcnQgVmVjdG9yMz1MYXlhLlZlY3RvcjM7XHJcbmV4cG9ydCBjbGFzcyBQb29sX01hbmFnZXIge1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IFBvb2xfTWFuYWdlcjtcclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IEluc3RhbmNlKCk6IFBvb2xfTWFuYWdlciB7XHJcbiAgICAgICAgcmV0dXJuIFBvb2xfTWFuYWdlci5pbnN0YW5jZSB8fCAoUG9vbF9NYW5hZ2VyLmluc3RhbmNlID0gbmV3IFBvb2xfTWFuYWdlcigpKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLnBvb2xEaWMgPSBuZXcgRGljdGlvbmFyeSgpO1xyXG4gICAgICAgIHRoaXMucHJlZmFiRGljID0gbmV3IERpY3Rpb25hcnkoKTtcclxuICAgIH1cclxuXHJcbiAgICAvL+WtmOWCqOWkmuS4qlxyXG4gICAgcHJpdmF0ZSBwb29sRGljOiBEaWN0aW9uYXJ5O1xyXG5cclxuICAgIC8v6aKE6K6+5a+56LGhXHJcbiAgICBwcml2YXRlIHByZWZhYkRpYzogRGljdGlvbmFyeTtcclxuXHJcbiAgICAvLyBbIFwiQ29pblwiICBcIktleVwiICBcIlJvbGVcIiAgXCJCb2R5MVwiICAgXCJUcmFpblwiIF1cclxuICAgIHB1YmxpYyBJbml0RGF0YShuYW1lOiBzdHJpbmcsIHByZWZhYikge1xyXG4gICAgICAgIGlmIChwcmVmYWIgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMucHJlZmFiRGljLmhhcyhuYW1lKSlcclxuICAgICAgICAgICAgICAgIHRoaXMucHJlZmFiRGljLnNldChuYW1lLCBwcmVmYWIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHB1YmxpYyBTZXRBY3RpdmVPYmplY3QobmFtZTogc3RyaW5nLHNjYWxlPykge1xyXG4gICAgICAgIGlmICh0aGlzLnBvb2xEaWMuaGFzKG5hbWUpKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnBvb2xEaWMuZ2V0KG5hbWUpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSB0aGlzLnBvb2xEaWMuZ2V0KG5hbWUpLnNoaWZ0KCk7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQuYWN0aXZlPXRydWU7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnByZWZhYkRpYy5oYXMobmFtZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgY3VyT2JqID0gTGF5YS5TcHJpdGUzRC5pbnN0YW50aWF0ZSh0aGlzLnByZWZhYkRpYy5nZXQobmFtZSkpIGFzIExheWEuU3ByaXRlM0Q7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoc2NhbGUhPW51bGwpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJPYmoudHJhbnNmb3JtLmxvY2FsU2NhbGU9bmV3IFZlY3RvcjMoc2NhbGUsc2NhbGUsc2NhbGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjdXJPYmoubmFtZSA9IG5hbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1ck9iajtcclxuICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMucHJlZmFiRGljLmhhcyhuYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGN1ck9iaiA9IExheWEuU3ByaXRlM0QuaW5zdGFudGlhdGUodGhpcy5wcmVmYWJEaWMuZ2V0KG5hbWUpKSBhcyBMYXlhLlNwcml0ZTNEO1xyXG4gICAgICAgICAgICAgICAgaWYoc2NhbGUhPW51bGwpe1xyXG4gICAgICAgICAgICAgICAgICAgIGN1ck9iai50cmFuc2Zvcm0ubG9jYWxTY2FsZT1uZXcgVmVjdG9yMyhzY2FsZSxzY2FsZSxzY2FsZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjdXJPYmoubmFtZSA9IG5hbWU7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VyT2JqO1xyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8v6ZqQ6JeP5a+56LGh5YiwZGljXHJcbiAgICBwdWJsaWMgU2V0RGlzYWJsZU9iamVjdChnbzogTGF5YS5TcHJpdGUzRCkge1xyXG4gICAgICAgIGlmIChnbykgZ28uYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgdmFyIGtleSA9IGdvLm5hbWU7XHJcbiAgICAgICAgaWYgKCF0aGlzLnBvb2xEaWMuaGFzKGtleSkpIHtcclxuICAgICAgICAgICAgdGhpcy5wb29sRGljLnNldChrZXksIG5ldyBBcnJheTxhbnk+KCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnBvb2xEaWMuZ2V0KGtleSkucHVzaChnbyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIERlc3RvcnlPYmooZ286TGF5YS5TcHJpdGUzRCl7XHJcbiAgICAgICAgaWYgKGdvKSBnby5kZXN0cm95KHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8v5bu25pe26ZqQ6JeP5a+56LGh5YiwZGljXHJcbiAgICBwdWJsaWMgU2V0RGlzYWJsZU11dGlPYmplY3QoZ286IExheWEuU3ByaXRlM0QsIHRpbWVyKSB7XHJcbiAgICAgICAgTGF5YS50aW1lci5vbmNlKHRpbWVyLCB0aGlzLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChnbykgZ28uYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHZhciBrZXkgPSBnby5uYW1lO1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMucG9vbERpYy5oYXMoa2V5KSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wb29sRGljLnNldChrZXksIG5ldyBBcnJheTxhbnk+KCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMucG9vbERpYy5nZXQoa2V5KS5wdXNoKGdvKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG59IiwiaW1wb3J0IFNwcml0ZTNEPUxheWEuU3ByaXRlM0Q7XHJcbmltcG9ydCBUcmFuc2Zvcm0zRD1MYXlhLlRyYW5zZm9ybTNEO1xyXG5pbXBvcnQgeyBDaGVja1R5cGUgfSBmcm9tIFwiLi4vZ2FtZV9tb2R1bGUvR2FtZURlZmluZWRcIjtcclxuZXhwb3J0IGNsYXNzIFJvbGUgZXh0ZW5kcyBMYXlhLlNjcmlwdDNEIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHNlbGY6U3ByaXRlM0Q7XHJcbiAgICBwcm90ZWN0ZWQgX3RyYW5zZm9ybTpUcmFuc2Zvcm0zRDtcclxuICAgIHByb3RlY3RlZCBfdHlwZTpDaGVja1R5cGU7XHJcbiAgICBwcm90ZWN0ZWQgX2J1bGxldFBvczpTcHJpdGUzRDtcclxuICAgIG9uQXdha2UoKSB7XHJcbiAgICAgICAgdGhpcy5zZWxmID0gdGhpcy5vd25lciBhcyBTcHJpdGUzRDtcclxuICAgICAgICB0aGlzLl90cmFuc2Zvcm0gPSB0aGlzLnNlbGYudHJhbnNmb3JtO1xyXG4gICAgICAgIHRoaXMuX2J1bGxldFBvcz10aGlzLnNlbGYuZ2V0Q2hpbGRCeU5hbWUoXCJidWxsdGVQb3NcIilhcyBTcHJpdGUzRDtcclxuICAgIH1cclxufSIsIlxyXG5pbXBvcnQgU3ByaXRlM0Q9TGF5YS5TcHJpdGUzRDtcclxuaW1wb3J0IHsgUGxheWVyIH0gZnJvbSBcIi4vUGxheWVyXCI7XHJcbmltcG9ydCBWZWN0b3IzPUxheWEuVmVjdG9yMztcclxuZXhwb3J0IGNsYXNzIFJvbGVDb250cm9sbGVyIHtcclxuICAgIHByaXZhdGUgc3RhdGljIGluc3Rhc25jZTogUm9sZUNvbnRyb2xsZXI7XHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCBJbnN0YW5jZSgpOiBSb2xlQ29udHJvbGxlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFzbmNlIHx8ICh0aGlzLmluc3Rhc25jZSA9IG5ldyBSb2xlQ29udHJvbGxlcigpKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIHBsYXllcjpTcHJpdGUzRDtcclxuICAgIHB1YmxpYyBwbGF5ZXJTOlBsYXllcjtcclxuICAgIHB1YmxpYyBpbml0KHJvbGU6U3ByaXRlM0Qpe1xyXG4gICAgICAgIGlmKHJvbGUpe1xyXG4gICAgICAgICAgICB0aGlzLnBsYXllcj1yb2xlO1xyXG4gICAgICAgICAgICB0aGlzLnBsYXllclM9dGhpcy5wbGF5ZXIuYWRkQ29tcG9uZW50KFBsYXllcik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcHVibGljIENyZWF0ZVJheSgpe1xyXG4gICAgICAgIGlmKHRoaXMucGxheWVyUyl0aGlzLnBsYXllclMuQ3JlYXRlUmF5KCk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgUm9sZVJvdGF0aW9uKHJvdGE6VmVjdG9yMyl7XHJcbiAgICAgICAgaWYodGhpcy5wbGF5ZXJTKXRoaXMucGxheWVyUy5Sb3RhdGlvblNlbGYocm90YSk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgU291bmRNYW5hZ2VyID0gTGF5YS5Tb3VuZE1hbmFnZXI7XHJcbmltcG9ydCB7IFdYU2RrIH0gZnJvbSBcIi4uL2dhbWVfbW9kdWxlL1dYU2RrXCI7XHJcbmV4cG9ydCBjbGFzcyBTZXR0aW5nQ29udHJvbGxlciB7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YXNuY2U6IFNldHRpbmdDb250cm9sbGVyO1xyXG4gICAgcHVibGljIHZpYnJhdGUgPSB0cnVlO1xyXG4gICAgcHVibGljIHNvdW5kPXRydWU7XHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCBJbnN0YW5jZSgpOiBTZXR0aW5nQ29udHJvbGxlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFzbmNlIHx8ICh0aGlzLmluc3Rhc25jZSA9IG5ldyBTZXR0aW5nQ29udHJvbGxlcigpKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBTZXR0aW5nU291bmQodmFsdWU/OiBudW1iZXIpIHtcclxuICAgICAgICAgICBpZighdGhpcy5zb3VuZClyZXR1cm47XHJcbiAgICAgICAgICAgIFNvdW5kTWFuYWdlci5zZXRTb3VuZFZvbHVtZSh2YWx1ZSk7XHJcbiAgICAgICAgICAgIFNvdW5kTWFuYWdlci5zZXRNdXNpY1ZvbHVtZSh2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzb3VuZENoYW5uZWw6IExheWEuU291bmRDaGFubmVsO1xyXG4gICAgcHVibGljIF9wbGF5TXVzaWMob24pIHtcclxuICAgICAgICBpZighdGhpcy5zb3VuZClyZXR1cm47XHJcbiAgICAgICAgaWYgKG9uKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNvdW5kQ2hhbm5lbCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNvdW5kQ2hhbm5lbCA9IFNvdW5kTWFuYWdlci5wbGF5TXVzaWModGhpcy5UcmFpbkxvb3AsIDApO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zb3VuZENoYW5uZWwudm9sdW1lID0gMC41XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5zb3VuZENoYW5uZWwucmVzdW1lKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc291bmRDaGFubmVsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNvdW5kQ2hhbm5lbC5wYXVzZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBfcGxheUJhZE1vdmUoKSB7XHJcbiAgICAgICBcclxuICAgICAgICBXWFNkay5TaG9ydFZpYnJhdGUoKTtcclxuICAgICAgICBpZighdGhpcy5zb3VuZClyZXR1cm47XHJcbiAgICAgICAgU291bmRNYW5hZ2VyLnBsYXlTb3VuZCh0aGlzLmJhZE1vdmUpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBfQ2xpY2soKSB7XHJcbiAgICAgICAgaWYoIXRoaXMuc291bmQpcmV0dXJuO1xyXG4gICAgICAgIFNvdW5kTWFuYWdlci5wbGF5U291bmQodGhpcy5jbGljayk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIF9Db250aW51ZShvbikge1xyXG4gICAgICAgIGlmKCF0aGlzLnNvdW5kKXJldHVybjtcclxuICAgICAgICBpZiAob24pIHtcclxuICAgICAgICAgICAgU291bmRNYW5hZ2VyLnBsYXlTb3VuZCh0aGlzLkNvbnRpbnVlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBTb3VuZE1hbmFnZXIuc3RvcFNvdW5kKHRoaXMuQ29udGludWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIF9MZXZlbENvbXAoKSB7XHJcbiAgICAgICAgaWYoIXRoaXMuc291bmQpcmV0dXJuO1xyXG4gICAgICAgIFNvdW5kTWFuYWdlci5wbGF5U291bmQodGhpcy5MZXZlbENvbXApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBfVHJhaW5DcmFzaCgpIHtcclxuICAgICAgICBXWFNkay5Mb25nVmlicmF0ZSgpO1xyXG4gICAgICAgIGlmKCF0aGlzLnNvdW5kKXJldHVybjtcclxuICAgICAgICBTb3VuZE1hbmFnZXIucGxheVNvdW5kKHRoaXMuVHJhaW5DcmFzaCk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgX1RyYWluU3RvcCgpIHtcclxuICAgICAgICBpZighdGhpcy5zb3VuZClyZXR1cm47XHJcbiAgICAgICAgU291bmRNYW5hZ2VyLnBsYXlTb3VuZCh0aGlzLlRyYWluU3RvcCk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgX0NvaW4oKSB7XHJcbiAgICAgICAgV1hTZGsuU2hvcnRWaWJyYXRlKCk7XHJcbiAgICAgICAgaWYoIXRoaXMuc291bmQpcmV0dXJuO1xyXG4gICAgICAgIFNvdW5kTWFuYWdlci5wbGF5U291bmQodGhpcy5Db2luKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHJpdmF0ZSB0ZW1wID0gMDtcclxuICAgIHB1YmxpYyBfSnVtcCgpIHtcclxuICAgICAgICBXWFNkay5TaG9ydFZpYnJhdGUoKTtcclxuICAgICAgICBpZighdGhpcy5zb3VuZClyZXR1cm47XHJcbiAgICAgICAgU291bmRNYW5hZ2VyLnBsYXlTb3VuZCh0aGlzLkp1bXBbdGhpcy50ZW1wXSk7XHJcbiAgICAgICAgdGhpcy50ZW1wKys7XHJcbiAgICAgICAgaWYgKHRoaXMudGVtcCA9PSA4KSB0aGlzLnRlbXAgPSAwO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYmFkTW92ZSA9IFwicmVzL1NvdW5kL0JhZE1vdmUubXAzXCI7XHJcbiAgICBwcml2YXRlIGNsaWNrID0gXCJyZXMvU291bmQvY2xpY2subXAzXCI7XHJcbiAgICBwcml2YXRlIENvbnRpbnVlID0gXCJyZXMvU291bmQvQ29udGludWUubXAzXCI7XHJcbiAgICBwcml2YXRlIExldmVsQ29tcCA9IFwicmVzL1NvdW5kL0xldmVsQ29tcC5tcDNcIjtcclxuICAgIHByaXZhdGUgVHJhaW5DcmFzaCA9IFwicmVzL1NvdW5kL1RyYWluQ3Jhc2gubXAzXCI7XHJcbiAgICBwcml2YXRlIFRyYWluTG9vcCA9IFwicmVzL1NvdW5kL1RyYWluTG9vcC5tcDNcIjtcclxuICAgIHByaXZhdGUgVHJhaW5TdG9wID0gXCJyZXMvU291bmQvVHJhaW5TdG9wLm1wM1wiO1xyXG4gICAgcHJpdmF0ZSBDb2luPVwicmVzL1NvdW5kL0NvaW4xLm1wM1wiO1xyXG4gICAgcHJpdmF0ZSBKdW1wID1cclxuICAgICAgICBbXHJcbiAgICAgICAgICAgIFwicmVzL1NvdW5kL1Bhc3Nlbmdlckp1bXBJbjEubXAzXCIsXHJcbiAgICAgICAgICAgIFwicmVzL1NvdW5kL1Bhc3Nlbmdlckp1bXBJbjIubXAzXCIsXHJcbiAgICAgICAgICAgIFwicmVzL1NvdW5kL1Bhc3Nlbmdlckp1bXBJbjMubXAzXCIsXHJcbiAgICAgICAgICAgIFwicmVzL1NvdW5kL1Bhc3Nlbmdlckp1bXBJbjQubXAzXCIsXHJcbiAgICAgICAgICAgIFwicmVzL1NvdW5kL1Bhc3Nlbmdlckp1bXBJbjUubXAzXCIsXHJcbiAgICAgICAgICAgIFwicmVzL1NvdW5kL1Bhc3Nlbmdlckp1bXBJbjYubXAzXCIsXHJcbiAgICAgICAgICAgIFwicmVzL1NvdW5kL1Bhc3Nlbmdlckp1bXBJbjcubXAzXCIsXHJcbiAgICAgICAgICAgIFwicmVzL1NvdW5kL1Bhc3Nlbmdlckp1bXBJbjgubXAzXCIsXHJcbiAgICAgICAgXTtcclxuXHJcbn0iLCJpbXBvcnQgRGljdGlvbmFyeSBmcm9tIFwiLi4vZ2FtZV90b29sL0RpY3Rpb25hcnlcIjtcclxuaW1wb3J0IHsgZ2FtZV91aSB9IGZyb20gXCIuLi9nYW1lX3VpL2dhbWVfdWlcIjtcclxuXHJcblxyXG5leHBvcnQgZW51bSBWaWV3VHlwZSB7XHJcbiAgICBnYW1lX3VpXHJcbn1cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmlld01hbmFnZXIge1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IFZpZXdNYW5hZ2VyO1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgSW5zdGFuY2UoKTogVmlld01hbmFnZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmluc3RhbmNlIHx8ICh0aGlzLmluc3RhbmNlID0gbmV3IFZpZXdNYW5hZ2VyKCkpO1xyXG4gICAgfVxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5pbml0KCk7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIHZpZXdEaWMgPSBbXTtcclxuICAgIHByaXZhdGUgY3VyVmlldzogYW55O1xyXG4gICAgcHJpdmF0ZSBhZGRWaWV3RGljID0gbmV3IERpY3Rpb25hcnkoKTtcclxuICAgIGluaXQoKSB7XHJcbiAgICAgICAgdGhpcy52aWV3RGljW1ZpZXdUeXBlLmdhbWVfdWldPWdhbWVfdWk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgT3BlblZpZXcodmlldzogVmlld1R5cGUsIGRhdGE/OiBhbnkpIHtcclxuICAgICAgICBpZiAodGhpcy5jdXJWaWV3ICE9IG51bGwpIHtcclxuICAgICAgICAgICAgdGhpcy5jdXJWaWV3Lk9uQ2xvc2UoKTtcclxuICAgICAgICAgICAgTGF5YS5zdGFnZS5yZW1vdmVDaGlsZCh0aGlzLmN1clZpZXcpO1xyXG4gICAgICAgICAgICAvLyAgICB2YXIgIGE6TGF5YS5TY2VuZTtcclxuICAgICAgICAgICAgLy8gICAgYS5kZXN0cm95KClcclxuICAgICAgICAgICAgdGhpcy5jdXJWaWV3LmRlc3Ryb3kodHJ1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuY3VyVmlldyA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY3VyVmlldyA9IG5ldyB0aGlzLnZpZXdEaWNbdmlld107XHJcblxyXG4gICAgICAgIExheWEuc3RhZ2UuYWRkQ2hpbGQodGhpcy5jdXJWaWV3KTtcclxuICAgICAgICAvLyB0aGlzLmN1clZpZXcucmVzaXplSGFuZGVyKCk7XHJcbiAgICAgICAgdGhpcy5jdXJWaWV3Lk9uU2hvdyhkYXRhKTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBnZXRDdXJWaWV3KCk6IGFueSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VyVmlldztcclxuICAgIH1cclxuICAgIHB1YmxpYyBBZGRWaWV3KHZpZXc6IFZpZXdUeXBlLCBkYXRhPzogYW55KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuYWRkVmlld0RpYy5oYXModmlldykpIHJldHVybjtcclxuICAgICAgICBsZXQgdF92aWV3ID0gbmV3IHRoaXMudmlld0RpY1t2aWV3XTtcclxuICAgICAgICB0aGlzLmFkZFZpZXdEaWMuc2V0KHZpZXcsIHRfdmlldyk7XHJcbiAgICAgICAgTGF5YS5zdGFnZS5hZGRDaGlsZCh0X3ZpZXcpO1xyXG4gICAgICAgIHRfdmlldy5PblNob3coZGF0YSk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgUmVtb3ZlVmlldygpIHtcclxuICAgICAgICBpZiAodGhpcy5jdXJWaWV3ICE9IG51bGwpIHtcclxuICAgICAgICAgICAgdGhpcy5jdXJWaWV3Lk9uQ2xvc2UoKTtcclxuICAgICAgICAgICAgTGF5YS5zdGFnZS5yZW1vdmVDaGlsZCh0aGlzLmN1clZpZXcpO1xyXG4gICAgICAgICAgICB0aGlzLmN1clZpZXcuZGVzdHJveSh0cnVlKTtcclxuICAgICAgICAgICAgdGhpcy5jdXJWaWV3ID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgQ2xvc2VWaWV3KHZpZXc6IFZpZXdUeXBlKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmFkZFZpZXdEaWMuaGFzKHZpZXcpKSByZXR1cm47XHJcbiAgICAgICAgbGV0IHRfdmlldyA9IHRoaXMuYWRkVmlld0RpYy5nZXQodmlldyk7XHJcbiAgICAgICAgdF92aWV3Lk9uQ2xvc2UoKTtcclxuICAgICAgICBMYXlhLnN0YWdlLnJlbW92ZUNoaWxkKHRfdmlldyk7XHJcbiAgICAgICAgdF92aWV3LmRlc3Ryb3kodHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5hZGRWaWV3RGljLmRlbGV0ZSh2aWV3KTtcclxuICAgIH1cclxuICAgIHByaXZhdGUgY3VyTWFzazogYW55O1xyXG4gICAgcHVibGljIE9wZW5NYXNrKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmN1ck1hc2sgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAvLyAgdGhpcy5jdXJNYXNrID0gbmV3IE1hc2tfdWkoKTtcclxuICAgICAgICBpZiAoIXRoaXMuY3VyTWFzaykgcmV0dXJuO1xyXG4gICAgICAgIExheWEuc3RhZ2UuYWRkQ2hpbGQodGhpcy5jdXJNYXNrKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBDbG9zZU1hc2soKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY3VyTWFzayAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VyTWFzay5PbkNsb3NlKCk7XHJcbiAgICAgICAgICAgIExheWEuc3RhZ2UucmVtb3ZlQ2hpbGQodGhpcy5jdXJNYXNrKTtcclxuICAgICAgICAgICAgdGhpcy5jdXJNYXNrLmRlc3Ryb3kodHJ1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuY3VyTWFzayA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxufSIsImV4cG9ydCBjbGFzcyBFdmVudE1hbmFnZXIge1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZGlzaXNwYXRjaGVyOiBMYXlhLkV2ZW50RGlzcGF0Y2hlcjtcclxuICAgIHByaXZhdGUgc3RhdGljIGdldCBEaXNpc3BhdGNoZXIoKTogTGF5YS5FdmVudERpc3BhdGNoZXIge1xyXG4gICAgICAgIHJldHVybiBFdmVudE1hbmFnZXIuZGlzaXNwYXRjaGVyIHx8IChFdmVudE1hbmFnZXIuZGlzaXNwYXRjaGVyID0gbmV3IExheWEuRXZlbnREaXNwYXRjaGVyKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgb24odHlwZTogc3RyaW5nLCBjYWxsOiBhbnksIGRhdGE6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuRGlzaXNwYXRjaGVyLm9uKHR5cGUsIGNhbGwsIGRhdGEpO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHN0YXRpYyBvZmYodHlwZTogc3RyaW5nLCBjYWxsOiBhbnksIGRhdGE6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuRGlzaXNwYXRjaGVyLm9mZih0eXBlLCBjYWxsLCBkYXRhKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzdGF0aWMgZXZlbnQodHlwZTogc3RyaW5nLCBkYXRhOiBhbnkgPSBudWxsKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5EaXNpc3BhdGNoZXIuZXZlbnQodHlwZSwgZGF0YSk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgVXNlck1vZGVsIGZyb20gXCIuL1VzZXJNb2RlbFwiO1xyXG5pbXBvcnQgeyBNYWluIH0gZnJvbSBcIi4uL01haW5cIjtcclxuaW1wb3J0IHsgRXZlbnRNYW5hZ2VyIH0gZnJvbSBcIi4vRXZlbnRNYW5hZ2VyXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgRllIRF9TZGsge1xyXG4gICAgcHVibGljIHN0YXRpYyBBZF9DbGlja1R5cGUgPSB7XHJcbiAgICAgICAgVmlkZW86IFwidmlkZW9fY2xpY2tcIixcclxuICAgICAgICBXYXRjaDogXCJ3YXRjaFwiLFxyXG4gICAgICAgIFNoYXJlOiBcInNoYXJlXCIsXHJcbiAgICAgICAgQmFubmVyOiBcImJhbm5lclwiLFxyXG4gICAgICAgIFB1c2g6IFwicHVzaFwiXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBwdXNoRGF0YSA9IFtdO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgb3BlbmlkOiBzdHJpbmc7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBpc0hhdmVEYXRlID0gZmFsc2U7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBTaG93QWQgPSBcIlNob3dBZFwiO1xyXG4gICAgLy/liJ3lp4vljJZzZGtcclxuICAgIHB1YmxpYyBzdGF0aWMgSW5pdFNkaygpIHtcclxuICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93LnNkay5nZXRGeWhkKCkuc3RhcnRTZGsoKTtcclxuICAgICAgICBGWUhEX1Nkay5Vc2VySW5mb0F1dGgoKTtcclxuICAgIH1cclxuXHJcbiAgICAvL+eUqOaIt+aOiOadg1xyXG4gICAgcHVibGljIHN0YXRpYyBVc2VySW5mb0F1dGgoKSB7XHJcbiAgICAgICAgaWYgKCFNYWluLklzV3gpIHJldHVybjtcclxuICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93LnNkay5nZXRGeWhkKCkuZ2V0RnloZFVzZXJJbmZvKG51bGwsIGZhbHNlLCAoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIuaXoOaOiOadg+WbnuiwgzpcIiArIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcclxuICAgICAgICAgICAgaWYgKGRhdGEucmVzdWx0LnVzZXIpIHtcclxuICAgICAgICAgICAgICAgIEZZSERfU2RrLm9wZW5pZCA9IGRhdGEucmVzdWx0LnVzZXIub3BlbmlkO1xyXG4gICAgICAgICAgICAgICAgRllIRF9TZGsuQXV0aEluZm8oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgQXV0aEluZm8oKSB7XHJcbiAgICAgICAgdmFyIGFyZ3MgPSB7XHJcbiAgICAgICAgICAgIG9wZW5pZDogRllIRF9TZGsub3BlbmlkLFxyXG4gICAgICAgIH1cclxuICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93LnNkay5nZXRGeWhkKCkubG9naW5EYXRhKGFyZ3MsIChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5o6I5p2D5LiK5oql5Zue6LCDOlwiICsgSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xyXG4gICAgICAgICAgICBGWUhEX1Nkay5WYWx1ZVVzZXIoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIHByaXZhdGUgc3RhdGljIFZhbHVlVXNlcigpIHtcclxuICAgICAgICB2YXIgYXJncyA9IHtcclxuICAgICAgICAgICAgb3BlbmlkOiBGWUhEX1Nkay5vcGVuaWQsXHJcbiAgICAgICAgfVxyXG4gICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cuc2RrLmdldEZ5aGQoKS52YWx1ZXVzZXIoYXJncywgKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCLmnInmlYjnlKjmiLfkuIrmiqU6XCIgKyBKU09OLnN0cmluZ2lmeShkYXRhKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy/liJvop5LoibJcclxuICAgIHB1YmxpYyBzdGF0aWMgUm9sZURhdGEoKSB7XHJcbiAgICAgICAgaWYgKCFNYWluLklzV3gpIHJldHVybjtcclxuICAgICAgICB2YXIgYXJncyA9IHtcclxuICAgICAgICAgICAgb3BlbmlkOiBGWUhEX1Nkay5vcGVuaWQsXHJcbiAgICAgICAgICAgIHJvbGVfaWQ6IFVzZXJNb2RlbC5JbnN0YW5jZS5DdXJNb2RlbC51c2VyaWQsXHJcbiAgICAgICAgICAgIGNyZWF0ZV90aW1lOiBVc2VyTW9kZWwuSW5zdGFuY2UuQ3VyTW9kZWwuU2VydmVyVGltZVxyXG4gICAgICAgIH1cclxuICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93LnNkay5nZXRGeWhkKCkucm9sZURhdGEoYXJncywgKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCLliJvlu7rop5LoibI6XCIgKyBKU09OLnN0cmluZ2lmeShkYXRhKSk7XHJcbiAgICAgICAgICAgIEZZSERfU2RrLkxvZ2luKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAvL+eZu+W9leS/oeaBr+S4iuaKpVxyXG4gICAgcHVibGljIHN0YXRpYyBMb2dpbigpIHtcclxuICAgICAgICBpZiAoIU1haW4uSXNXeCkgcmV0dXJuO1xyXG4gICAgICAgIHZhciBvcGVuaWQgPSBGWUhEX1Nkay5vcGVuaWQgPyBGWUhEX1Nkay5vcGVuaWQgOiBVc2VyTW9kZWwuSW5zdGFuY2UuQ3VyTW9kZWwub3BlbmlkO1xyXG4gICAgICAgIHZhciBhcmdzID0ge1xyXG4gICAgICAgICAgICBvcGVuaWQ6IG9wZW5pZCxcclxuICAgICAgICAgICAgcm9sZV9pZDogVXNlck1vZGVsLkluc3RhbmNlLkN1ck1vZGVsLnVzZXJpZCxcclxuICAgICAgICAgICAgY3JlYXRlX3RpbWU6IFVzZXJNb2RlbC5JbnN0YW5jZS5DdXJNb2RlbC5TZXJ2ZXJUaW1lLnRvU3RyaW5nKClcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc29sZS5sb2coXCLnmbvlvZXlj4LmlbA6XCIgKyBKU09OLnN0cmluZ2lmeShhcmdzKSk7XHJcbiAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy5zZGsuZ2V0RnloZCgpLnVwbG9naW5EYXRhKGFyZ3MsIChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi55m75b2V57uT5p6cOlwiICsgSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xyXG4gICAgICAgICAgICAvLyBGWUhEX1Nkay5QdXNoRGF0YSgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8v54K55Ye75LqL5Lu25LiK5oqlXHJcbiAgICBwdWJsaWMgc3RhdGljIENsaWNrQWQoYWRfdHlwZTogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKCFNYWluLklzV3gpIHJldHVybjtcclxuICAgICAgICB2YXIgcGFyYW0gPSB7XHJcbiAgICAgICAgICAgIGFkX3R5cGU6IGFkX3R5cGUsXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnNvbGUubG9nKFwi54K55Ye75Y+C5pWwOlwiICsgcGFyYW0pO1xyXG4gICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cuc2RrLmdldEZ5aGQoKS5hZHZlcnRpc2VtZW50KHBhcmFtLCAoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIueCueWHu+e7k+aenDpcIiArIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIFB1c2hEYXRhKCkge1xyXG4gICAgICAgIGlmICghTWFpbi5Jc1d4KSByZXR1cm47XHJcbiAgICAgICAgdmFyIHBhcmFtID0ge307XHJcbiAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy5zZGsuZ2V0RnloZCgpLnNoYXJlUmVjb21tZW5kKHBhcmFtLCAoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZGF0YS5kYXRhKSB7XHJcbiAgICAgICAgICAgICAgICBGWUhEX1Nkay5wdXNoRGF0YSA9IGRhdGEuZGF0YTtcclxuICAgICAgICAgICAgICAgIEZZSERfU2RrLnB1c2hEYXRhLnNvcnQoRllIRF9TZGsuTGlzdFNvcnQpO1xyXG4gICAgICAgICAgICAgICAgRXZlbnRNYW5hZ2VyLmV2ZW50KEZZSERfU2RrLlNob3dBZCk7XHJcbiAgICAgICAgICAgICAgICBGWUhEX1Nkay5pc0hhdmVEYXRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIuiOt+WPluS6kuaOqOS/oeaBrzpcIiArIEpTT04uc3RyaW5naWZ5KEZZSERfU2RrLnB1c2hEYXRhKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc3RhdGljIFNob3dIdVR1aUp1bXAoZGF0YSkge1xyXG4gICAgICAgIGlmICghTWFpbi5Jc1d4KSByZXR1cm47XHJcbiAgICAgICAgaWYgKGRhdGEuanVtcF90eXBlID09IDIpIC8v5LqM57u056CB6Lez6L2s5pa55rOVXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LnByZXZpZXdJbWFnZSh7IGN1cnJlbnQ6IGRhdGEucXJjb2RlLCB1cmxzOiBbZGF0YS5xcmNvZGVdIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChkYXRhLmp1bXBfdHlwZSA9PSAxKSAvL+ebtOi3s+aWueazlVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5uYXZpZ2F0ZVRvTWluaVByb2dyYW0oe1xyXG4gICAgICAgICAgICAgICAgYXBwSWQ6IGRhdGEudG9fYXBwaWQsXHJcbiAgICAgICAgICAgICAgICBwYXRoOiBkYXRhLmp1bXBfcGF0aCxcclxuICAgICAgICAgICAgICAgIHN1Y2Nlc3MocmVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8g5omT5byA5oiQ5YqfXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLkuIrmiqXmiJDlip86XCIgKyBKU09OLnN0cmluZ2lmeShyZXMpKTtcclxuICAgICAgICAgICAgICAgICAgICBGWUhEX1Nkay5QdXNoQ2xpY2soZGF0YS50b19hcHBpZCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGRhdGEuanVtcF90eXBlID09IDApLy/lubPlj7Dot7Povazmlrnms5VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3gubmF2aWdhdGVUb01pbmlQcm9ncmFtKHtcclxuICAgICAgICAgICAgICAgIGFwcElkOiBkYXRhLnBsYXRmb3JtX2FwcGlkLFxyXG4gICAgICAgICAgICAgICAgcGF0aDogZGF0YS5qdW1wX3BhdGgsXHJcbiAgICAgICAgICAgICAgICBzdWNjZXNzKHJlcykge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIOaJk+W8gOaIkOWKn1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5LiK5oql5oiQ5YqfOlwiICsgSlNPTi5zdHJpbmdpZnkocmVzKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgRllIRF9TZGsuUHVzaENsaWNrKGRhdGEudG9fYXBwaWQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHB1YmxpYyBzdGF0aWMgUHVzaENsaWNrKHRvX2FwcGlkKSB7XHJcbiAgICAgICAgaWYgKCFNYWluLklzV3gpIHJldHVybjtcclxuICAgICAgICB2YXIgcGFyYW0gPSB7XHJcbiAgICAgICAgICAgIG9wZW5pZDogRllIRF9TZGsub3BlbmlkLFxyXG4gICAgICAgICAgICB0b19hcHBpZDogdG9fYXBwaWQsXHJcbiAgICAgICAgfVxyXG4gICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cuc2RrLmdldEZ5aGQoKS5zaGFyZVBsYXkocGFyYW0sIChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi54K55Ye75LiK5oql57uT5p6cOlwiICsgSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIExpc3RTb3J0KGEsIGIpOiBudW1iZXIge1xyXG4gICAgICAgIGlmIChOdW1iZXIoYVtcInBhbmVsXCJdKSA8IE51bWJlcihiW1wicGFuZWxcIl0pKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKE51bWJlcihhW1wicGFuZWxcIl0pID09IE51bWJlcihiW1wicGFuZWxcIl0pKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoTnVtYmVyKGFbXCJwYW5lbFwiXSkgPiBOdW1iZXIoYltcInBhbmVsXCJdKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gMTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iLCJcclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgR2FtZURlZmluZWQge1xyXG4gICAgcHVibGljIHN0YXRpYyBwbGF5ZXJfbGF5ZXI9OTtcclxuICAgIHB1YmxpYyBzdGF0aWMgd2FsbF9sYXllcj04O1xyXG4gICAgcHVibGljIHN0YXRpYyBtb3N0ZXJfbGF5ZXI9MTA7XHJcbiAgICBwdWJsaWMgc3RhdGljIGJvc3NfbGF5ZXI9MTE7XHJcbiAgICBwdWJsaWMgc3RhdGljIHRyZWVfbGF5ZXI9MTI7XHJcbiAgICBwdWJsaWMgc3RhdGljIGJvbWJfbGF5ZXI9MTM7XHJcblxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgcG9vbE5hbWU9e1xyXG4gICAgICAgIGJ1bGxldDpcImJ1bGxldFwiXHJcbiAgICB9XHJcbn1cclxuZXhwb3J0IGVudW0gQ2hlY2tUeXBle1xyXG4gICAgUGxheWVyLFxyXG4gICAgTW9zdGVyLFxyXG4gICAgQm9zcyxcclxuICAgIEJvbWIsXHJcbiAgICBUcmVlXHJcbn1cclxuIiwiXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlc291cmNlTG9hZCB7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBMb2FkUmVzb3VyY2UocGF0aDpBcnJheTxhbnk+LGNvbXBsZXQ/OkZ1bmN0aW9uKXtcclxuICAgICAgICBMYXlhLmxvYWRlci5yZXRyeU51bT0yO1xyXG4gICAgICAgIExheWEubG9hZGVyLm1heExvYWRlcj0zO1xyXG4gICAgICAgIExheWEubG9hZGVyLnJldHJ5RGVsYXk9MTAwO1xyXG4gICAgICAgIExheWEubG9hZGVyLmNyZWF0ZShwYXRoLG5ldyBMYXlhLkhhbmRsZXIodGhpcyxjb21wbGV0KSk7XHJcbiAgICAgICAgTGF5YS5sb2FkZXIub24oTGF5YS5FdmVudC5FUlJPUix0aGlzLChkYXRhKT0+e1xyXG4gICAgICAgICAgIGNvbnNvbGUubG9nKGRhdGErXCIg6LWE5rqQ5Yqg6L295aSx6LSlXCIpO1xyXG4gICAgICAgfSk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBXWFNkayB9IGZyb20gXCIuL1dYU2RrXCI7XHJcbmltcG9ydCB7IEZZSERfU2RrIH0gZnJvbSBcIi4vRllIRF9TZGtcIjtcclxuXHJcblxyXG5leHBvcnQgY2xhc3MgU2hhcmVNb2R1bGUge1xyXG4gICAgcHVibGljIHN0YXRpYyBJc1NoYXJpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBHb1NoYXJlKGNhbGxCYWNrKTogdm9pZCB7XHJcbiAgICAgICAgU2hhcmVNb2R1bGUuU2hhcmVUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCLliIbkuqvngrnlh7vml7bpl7Q9XCIgKyBTaGFyZU1vZHVsZS5TaGFyZVRpbWUpO1xyXG4gICAgICAgIFNoYXJlTW9kdWxlLklzU2hhcmluZyA9IHRydWU7XHJcbiAgICAgICAgU2hhcmVNb2R1bGUuY2FsbGJhY2sgPSBjYWxsQmFjaztcclxuICAgIH1cclxuICAgIHB1YmxpYyBzdGF0aWMgU2hhcmVUaW1lOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgc3RhdGljIE9uU2hvd0hhbmRsZSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAoTGF5YS5Ccm93c2VyLndpbmRvdy53eCkge1xyXG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4Lm9uU2hvdyhmdW5jdGlvbiAob3B0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIm9uc2hvdyBzaGFyZSBzdGFydFwiKTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi6L+b5YWl5b6u5L+hXCIpO1xyXG4gICAgICAgICAgICAgICAgLy9MYXlhLnRpbWVyLnNjYWxlPTE7XHJcbiAgICAgICAgICAgICAgICBpZiAoU2hhcmVNb2R1bGUuSXNTaGFyaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgU2hhcmVNb2R1bGUuSXNTaGFyaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuWIhuS6q+WbnuWIsOa4uOaIj+aXtumXtFwiICsgdGltZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHdhaXQgPSAodGltZSAtIFNoYXJlTW9kdWxlLlNoYXJlVGltZSkgLyAxMDAwO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5YiG5Lqr5YGc55WZ5pe26Ze05Li677yaXCIgKyB3YWl0KTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgc2hhcmVTdWNjZXNzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlYWxTdWNjZXNzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdhaXQgPj0gMikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoTWF0aC5yYW5kb20oKSA8PSAwLjUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlU3VjY2VzcyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWUhEX1Nkay5DbGlja0FkKEZZSERfU2RrLkFkX0NsaWNrVHlwZS5TaGFyZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVNoYXJlTW9kdWxlLmNhbGxiYWNrKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaGFyZU1vZHVsZS5jYWxsYmFjayh0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3guc2hvd1RvYXN0KHsgdGl0bGU6IFwi5YiG5Lqr5oiQ5Yqf77yBXCIgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVNoYXJlTW9kdWxlLmNhbGxiYWNrKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTWF0aC5yYW5kb20oKSA8PSAwLjUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LnNob3dUb2FzdCh7IHRpdGxlOiBcIuWIhuS6q+Wksei0pe+8gVwiIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXWFNkay5TaG93VG9hc3QoXCLor7fliIbkuqvliLDkuI3lkIznvqReLV5cIiwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hhcmVNb2R1bGUuY2FsbGJhY2soZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc3RhdGljIGNhbGxiYWNrO1xyXG59IiwiaW1wb3J0IHsgTWFpbiB9IGZyb20gXCIuLi9NYWluXCI7XHJcbmltcG9ydCBOZXRNYW5hZ2VyIGZyb20gXCIuL05ldE1hbmFnZXJcIjtcclxuaW1wb3J0IHsgRGF0ZUNvbnRyb2xsZXIgfSBmcm9tIFwiLi4vZ2FtZV9sb2dpYy9EYXRlQ29udHJvbGxlclwiO1xyXG5cclxuXHJcbmV4cG9ydCBlbnVtIFVzZXJDb25maWdOYW1lIHtcclxuICAgIHRyYWluLCBzaWduLCByZXdhcmRzXHJcbn1cclxuLy/nlKjmiLfkv6Hmga/lsZ7mgKdcclxuZXhwb3J0IGVudW0gVXNlckF0dHIge1xyXG4gICAgZXF1aXBfdHJhaW4sIHVzZXJfaWQsIHN0YWdlLCBnZXRfdHJhaW5zLCBtb25leSwgcHJvZ3Jlc3NfdHJhaW5zXHJcbn1cclxuZXhwb3J0IGNsYXNzIE5ldFVzZXJNb2RlbCB7XHJcbiAgICBwdWJsaWMgbV91c2VyX2Jhc2U6IE9iamVjdDtcclxuICAgIHB1YmxpYyBtX3VzZXJfaW52aXRlOiBPYmplY3Q7XHJcbiAgICBwdWJsaWMgbV91c2VyX2xvdHRlcnk6IG9iamVjdFxyXG4gICAgcHJpdmF0ZSBsb2dpblNldmVyVGltZTogbnVtYmVyID0gMDtcclxuICAgIHB1YmxpYyBtX3VzZXJfdHJlYXN1cmU6IG9iamVjdDtcclxuICAgIHB1YmxpYyBtX3VzZXJfYWNoaWV2ZW1lbnQ6IG9iamVjdDtcclxuICAgIHB1YmxpYyBtX3VzZXJfc2lnbjogT2JqZWN0O1xyXG4gICAgcHJpdmF0ZSBtX3VzZXJfYXJlbmE6IE9iamVjdDtcclxuICAgIHByaXZhdGUgbG9jYWxUaW1lOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgbmlja25hbWU6IHN0cmluZztcclxuICAgIHB1YmxpYyBvcGVuaWQ6IHN0cmluZztcclxuICAgIHB1YmxpYyB1c2VyaWQ6IHN0cmluZztcclxuICAgIHB1YmxpYyBtX3Rva2VuOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgbV9jb25maWdzOiBPYmplY3Q7XHJcbiAgICBwdWJsaWMgbV9hcHBfc2V0dGluZzogT2JqZWN0O1xyXG4gICAgcHVibGljIG1fdXNlcjogT2JqZWN0O1xyXG4gICAgY29uc3RydWN0b3IoX3Rva2VuOiBzdHJpbmcsIF9jb25maWc6IE9iamVjdCwgX2FwcFNldHRpbmc6IE9iamVjdCwgX3VzZXI6IE9iamVjdCwgX3VzZXJiYXNlOiBPYmplY3QsIF91c2VJbnZpdGU6IE9iamVjdCwgX3VzZXJfbG90dGVyeTogT2JqZWN0LCBfdXNlcl90cmVhc3VyZTogT2JqZWN0LCB0LCBfdXNlcl9hY2hpZXZlbWVudCwgX3VzZXJfc2lnbiwgX3VzZXJfYXJlbmEpIHtcclxuICAgICAgICB0aGlzLmxvY2FsVGltZSA9IExheWEudGltZXIuY3VyclRpbWVyO1xyXG4gICAgICAgIHRoaXMubG9naW5TZXZlclRpbWUgPSB0O1xyXG4gICAgICAgIHRoaXMubV90b2tlbiA9IF90b2tlbjtcclxuICAgICAgICB0aGlzLm1fY29uZmlncyA9IF9jb25maWc7XHJcbiAgICAgICAgdGhpcy5tX2FwcF9zZXR0aW5nID0gX2FwcFNldHRpbmc7XHJcbiAgICAgICAgdGhpcy5tX3VzZXIgPSBfdXNlcjtcclxuICAgICAgICB0aGlzLm1fdXNlcl9iYXNlID0gX3VzZXJiYXNlO1xyXG4gICAgICAgIHRoaXMubV91c2VyX2ludml0ZSA9IF91c2VJbnZpdGU7XHJcbiAgICAgICAgdGhpcy5tX3VzZXJfbG90dGVyeSA9IF91c2VyX2xvdHRlcnk7XHJcbiAgICAgICAgdGhpcy5tX3VzZXJfdHJlYXN1cmUgPSBfdXNlcl90cmVhc3VyZTtcclxuICAgICAgICB0aGlzLm1fdXNlcl9hY2hpZXZlbWVudCA9IF91c2VyX2FjaGlldmVtZW50O1xyXG4gICAgICAgIHRoaXMubV91c2VyX3NpZ24gPSBfdXNlcl9zaWduO1xyXG4gICAgICAgIHRoaXMubV91c2VyX2FyZW5hID0gX3VzZXJfYXJlbmE7XHJcbiAgICAgICAgdGhpcy51c2VyaWQgPSB0aGlzLm1fdXNlcltcInVzZXJfaWRcIl07XHJcbiAgICAgICAgdGhpcy5vcGVuaWQgPSB0aGlzLm1fdXNlcl9iYXNlW1wib3BlbmlkXCJdO1xyXG4gICAgICAgIHRoaXMubmlja25hbWUgPSB0aGlzLm1fdXNlcl9iYXNlW1wibmlja25hbWVcIl07XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IENmZyhjZmcpIHtcclxuICAgICAgICB0aGlzLm1fY29uZmlncyA9IGNmZztcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgc2hhcmV0aXRsZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIGlmICh0aGlzLm1fYXBwX3NldHRpbmdbXCJzaGFyZXRpdGxlXCJdKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1fYXBwX3NldHRpbmdbXCJzaGFyZXRpdGxlXCJdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gXCJcIjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgc2hhcmVpbWFnZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIGlmICh0aGlzLm1fYXBwX3NldHRpbmdbXCJzaGFyZWltYWdlXCJdKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1fYXBwX3NldHRpbmdbXCJzaGFyZWltYWdlXCJdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gXCJcIjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBHZXRDZmcodHlwZTogVXNlckNvbmZpZ05hbWUpOiBhbnkge1xyXG4gICAgICAgIHZhciBfdHlwZSA9IFVzZXJDb25maWdOYW1lW3R5cGVdO1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1fY29uZmlnc1tfdHlwZV07XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgR2V0VXNlckF0dHIoX2F0dHI6IFVzZXJBdHRyKSB7XHJcbiAgICAgICAgdmFyIGF0dHIgPSBVc2VyQXR0cltfYXR0cl07XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubV91c2VyW2F0dHJdO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBTZXJ2ZXJUaW1lKCk6IG51bWJlciB7XHJcbiAgICAgICAgbGV0IHRpbWUgPSBMYXlhLnRpbWVyLmN1cnJUaW1lcjtcclxuICAgICAgICBsZXQgc3RpbWUgPSB0aGlzLmxvZ2luU2V2ZXJUaW1lICsgTWF0aC5jZWlsKCh0aW1lIC0gdGhpcy5sb2NhbFRpbWUpIC8gMTAwMCk7XHJcbiAgICAgICAgcmV0dXJuIHN0aW1lO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBHdWlkZUxldmVsKCk6IG51bWJlciB7XHJcbiAgICAgICAgaWYgKHRoaXMubV9hcHBfc2V0dGluZ1tcIkd1aWRlTGV2ZWxcIl0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIE51bWJlcih0aGlzLm1fYXBwX3NldHRpbmdbXCJHdWlkZUxldmVsXCJdKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIDE7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBCYW5uZXJNb3ZlVGltZSgpOiBudW1iZXIge1xyXG4gICAgICAgIGlmICh0aGlzLm1fYXBwX3NldHRpbmdbXCJCYW5uZXJNb3ZlVGltZVwiXSkge1xyXG4gICAgICAgICAgICByZXR1cm4gTnVtYmVyKHRoaXMubV9hcHBfc2V0dGluZ1tcIkJhbm5lck1vdmVUaW1lXCJdKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IEhhdmVCYW5uZXIoKTogbnVtYmVyIHtcclxuICAgICAgICBpZiAodGhpcy5tX2FwcF9zZXR0aW5nW1wiSGF2ZUJhbm5lclwiXSkge1xyXG4gICAgICAgICAgICByZXR1cm4gTnVtYmVyKHRoaXMubV9hcHBfc2V0dGluZ1tcIkhhdmVCYW5uZXJcIl0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgSXNTaGFyZSgpOiBudW1iZXIge1xyXG4gICAgICAgIGlmICh0aGlzLm1fYXBwX3NldHRpbmdbXCJJc1NoYXJlXCJdKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBOdW1iZXIodGhpcy5tX2FwcF9zZXR0aW5nW1wiSXNTaGFyZVwiXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBCdG5DYW5Nb3ZlKCk6IG51bWJlciB7XHJcbiAgICAgICAgaWYgKHRoaXMubV9hcHBfc2V0dGluZ1tcIkJ0bkNhbk1vdmVcIl0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIE51bWJlcih0aGlzLm1fYXBwX3NldHRpbmdbXCJCdG5DYW5Nb3ZlXCJdKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IElTU2hhcmVUaGVuVmlkZW8oKTogbnVtYmVyIHtcclxuICAgICAgICBpZiAodGhpcy5tX2FwcF9zZXR0aW5nW1wiSVNTaGFyZVRoZW5WaWRlb1wiXSkge1xyXG4gICAgICAgICAgICByZXR1cm4gTnVtYmVyKHRoaXMubV9hcHBfc2V0dGluZ1tcIklTU2hhcmVUaGVuVmlkZW9cIl0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgT3BlblNjZW5lVmFsdWUoKTogbnVtYmVyIHtcclxuICAgICAgICBpZiAodGhpcy5tX2FwcF9zZXR0aW5nW1wiT3BlblNjZW5lVmFsdWVcIl0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIE51bWJlcih0aGlzLm1fYXBwX3NldHRpbmdbXCJPcGVuU2NlbmVWYWx1ZVwiXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgSXNPcGVuVHJ5T3V0KCk6IG51bWJlciB7XHJcbiAgICAgICAgaWYgKHRoaXMubV9hcHBfc2V0dGluZ1tcIklzT3BlblRyeU91dFwiXSkge1xyXG4gICAgICAgICAgICB2YXIgbnVtID0gTnVtYmVyKHRoaXMubV9hcHBfc2V0dGluZ1tcIklzT3BlblRyeU91dFwiXSk7XHJcbiAgICAgICAgICAgIGlmIChudW0gPT0gMCkgcmV0dXJuIDA7XHJcbiAgICAgICAgICAgIGlmIChNYXRoLnJhbmRvbSgpIDwgbnVtKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gMTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHB1YmxpYyBKdW5kZ0NmZ0ZvckNkbihjYWxsYmFsbDogRnVuY3Rpb24pIHtcclxuICAgIC8vICAgICB0aGlzLm1fY29uZmlncyA9IG51bGw7XHJcbiAgICAvLyAgICAgaWYgKHRoaXMubV9jb25maWdzKSB7XHJcbiAgICAvLyAgICAgICAgIGNhbGxiYWxsKCk7XHJcbiAgICAvLyAgICAgfSBlbHNlIHtcclxuICAgIC8vICAgICAgICAgdmFyIGNmZyA9IExheWEuTG9jYWxTdG9yYWdlLmdldEpTT04oTWFpbi5jZmcpO1xyXG4gICAgLy8gICAgICAgICBpZiAoY2ZnKSB7XHJcbiAgICAvLyAgICAgICAgICAgICBpZiAoY2ZnLlZFUiA9PSB0aGlzLkdldENmZ1Zlcikge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIHRoaXMubV9jb25maWdzID0gY2ZnO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiY2Zn5a2Y5ZyoXCIpO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGNhbGxiYWxsKCk7XHJcbiAgICAvLyAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiY2Zn5a2Y5Zyo5L2G5piv6L+H5pyf5LqGXCIpO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIExheWEuTG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oTWFpbi5jZmcpO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIExheWEubG9hZGVyLmxvYWQoXCJjZmcuanNvblwiLCBuZXcgTGF5YS5IYW5kbGVyKHRoaXMsIChkYXRhKSA9PiB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiY2Zn5LiL6L295a6M5oiQXCIpO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YSkge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgTGF5YS5Mb2NhbFN0b3JhZ2Uuc2V0SlNPTihNYWluLmNmZywgZGF0YSk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5tX2NvbmZpZ3MgPSBkYXRhO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBjYWxsYmFsbCgpO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIH0pKTtcclxuICAgIC8vICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgfSBlbHNlIHtcclxuICAgIC8vICAgICAgICAgICAgIExheWEubG9hZGVyLmxvYWQoXCJjZmcuanNvblwiLCBuZXcgTGF5YS5IYW5kbGVyKHRoaXMsIChkYXRhKSA9PiB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJjZmfkuIvovb3lrozmiJBcIik7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgaWYgKGRhdGEpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgTGF5YS5Mb2NhbFN0b3JhZ2Uuc2V0SlNPTihNYWluLmNmZywgZGF0YSk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgICAgIHRoaXMubV9jb25maWdzID0gZGF0YTtcclxuICAgIC8vICAgICAgICAgICAgICAgICBjYWxsYmFsbCgpO1xyXG4gICAgLy8gICAgICAgICAgICAgfSkpO1xyXG4gICAgLy8gICAgICAgICB9XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gfVxyXG5cclxuICAgIC8vIHB1YmxpYyBKdW5kZ0NmZyh2ZXIsIGNhbGxiYWxsOiBGdW5jdGlvbikge1xyXG4gICAgLy8gICAgIHRoaXMubV9jb25maWdzID0gbnVsbDtcclxuICAgIC8vICAgICBpZiAodGhpcy5tX2NvbmZpZ3MpIHtcclxuICAgIC8vICAgICAgICAgY2FsbGJhbGwodHJ1ZSk7XHJcbiAgICAvLyAgICAgfSBlbHNlIHtcclxuICAgIC8vICAgICAgICAgdmFyIGNmZyA9IExheWEuTG9jYWxTdG9yYWdlLmdldEpTT04oTWFpbi5DRkcpO1xyXG4gICAgLy8gICAgICAgICBpZiAoY2ZnKSB7XHJcbiAgICAvLyAgICAgICAgICAgICBpZiAoY2ZnLlZFUiA9PSB2ZXIpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICB0aGlzLkNmZyA9IGNmZztcclxuXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLlt7Lnu4/mi6XmnIks5LiN55So5pu05pawXCIpO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIERhdGVDb250cm9sbGVyLlNldENmZygpO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGNhbGxiYWxsKHRydWUpO1xyXG4gICAgLy8gICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImNmZ+WtmOWcqOS9huaYr+i/h+acn+S6hlwiKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICBMYXlhLkxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKE1haW4uQ0ZHKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICBOZXRNYW5hZ2VyLkluc3RhbmNlLlBvc3RDZmdSZXF1ZXN0KChkYXRhKSA9PiB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGRhdGEuVkVSID0gdmVyO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBMYXlhLkxvY2FsU3RvcmFnZS5zZXRKU09OKE1haW4uQ0ZHLCBkYXRhKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5DZmcgPSBkYXRhO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBEYXRlQ29udHJvbGxlci5TZXRDZmcoKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgY2FsbGJhbGwodHJ1ZSk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgfSwgKGRhdGEpID0+IHtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLphY3nva7ojrflj5blpLHotKVcIiArIGRhdGEpO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBjYWxsYmFsbChmYWxzZSk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgIC8vICAgICAgICAgICAgICAgICB9KTtcclxuICAgIC8vICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgfSBlbHNlIHtcclxuICAgIC8vICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5pys5Zyw5rKh5pyJY2ZnXCIpO1xyXG4gICAgLy8gICAgICAgICAgICAgTmV0TWFuYWdlci5JbnN0YW5jZS5Qb3N0Q2ZnUmVxdWVzdCgoZGF0YSkgPT4ge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiY2ZnXCIgKyBkYXRhKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICBkYXRhLlZFUiA9IHZlcjtcclxuICAgIC8vICAgICAgICAgICAgICAgICBMYXlhLkxvY2FsU3RvcmFnZS5zZXRKU09OKE1haW4uQ0ZHLCBkYXRhKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICB0aGlzLkNmZyA9IGRhdGE7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgRGF0ZUNvbnRyb2xsZXIuU2V0Q2ZnKCk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgY2FsbGJhbGwodHJ1ZSk7XHJcbiAgICAvLyAgICAgICAgICAgICB9LCAoZGF0YSkgPT4ge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi6YWN572u6I635Y+W5aSx6LSlXCIgKyBkYXRhKTtcclxuICAgIC8vICAgICAgICAgICAgIH0pO1xyXG4gICAgLy8gICAgICAgICB9XHJcbiAgICAvLyAgICAgfVxyXG5cclxuICAgIC8vfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBVc2VyTW9kZWwge1xyXG4gICAgcHVibGljIGdldCBDdXJNb2RlbCgpOiBOZXRVc2VyTW9kZWwge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmN1ck1vZGVsO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U7XHJcbiAgICBwdWJsaWMgbV9jb2RlOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgbV9nZW5kZXI6IG51bWJlcjtcclxuICAgIHB1YmxpYyBtX2NvdW50cnk6IHN0cmluZztcclxuICAgIGNvbnN0cnVjdG9yKGNvZGU6IHN0cmluZywgbmlja25hbWU6IHN0cmluZywgYXZhdGFyOiBzdHJpbmcsIGdlbmRlcjogbnVtYmVyLCBjb3VudHJ5OiBzdHJpbmcsIHByb3ZpbmNlOiBzdHJpbmcsIGNpdHk6IHN0cmluZywgZGV2aWNlOiBzdHJpbmcsIHNoYXJlX2lkOiBzdHJpbmcsIHNjZW5lOiBzdHJpbmcpIHtcclxuICAgICAgICBVc2VyTW9kZWwuaW5zdGFuY2UgPSB0aGlzO1xyXG4gICAgICAgIHRoaXMubV9jb2RlID0gY29kZTtcclxuICAgICAgICB0aGlzLm1fbmlja25hbWUgPSBuaWNrbmFtZSA/IG5pY2tuYW1lIDogXCLmuLjlrqJcIjtcclxuICAgICAgICB0aGlzLm1fYXZhdGFyID0gYXZhdGFyID8gYXZhdGFyIDogXCJcIjtcclxuICAgICAgICB0aGlzLm1fZ2VuZGVyID0gZ2VuZGVyID8gZ2VuZGVyIDogMDtcclxuICAgICAgICB0aGlzLm1fY2l0eSA9IGNpdHkgPyBjaXR5IDogXCJcIjtcclxuICAgICAgICB0aGlzLm1fZGV2aWNlID0gZGV2aWNlID8gZGV2aWNlIDogXCJcIjtcclxuICAgICAgICB0aGlzLm1fc2hhcmVfaWQgPSBzaGFyZV9pZCA/IHNoYXJlX2lkIDogXCJcIjtcclxuICAgICAgICB0aGlzLm1fc2NlbmUgPSBzY2VuZSA/IHNjZW5lIDogXCJcIjtcclxuICAgICAgICB0aGlzLm1fY291bnRyeSA9IGNvdW50cnkgPyBjb3VudHJ5IDogXCJcIjtcclxuICAgICAgICB0aGlzLm1fcHJvdmluY2UgPSBwcm92aW5jZSA/IHByb3ZpbmNlIDogXCJcIjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBtX2NpdHk6IHN0cmluZztcclxuICAgIHB1YmxpYyBtX2RldmljZTogc3RyaW5nO1xyXG4gICAgcHVibGljIG1fc2hhcmVfaWQ6IHN0cmluZztcclxuICAgIHB1YmxpYyBtX3NjZW5lOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCBJbnN0YW5jZSgpOiBVc2VyTW9kZWwge1xyXG4gICAgICAgIGlmIChVc2VyTW9kZWwuaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFVzZXJNb2RlbC5pbnN0YW5jZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIFVzZXJNb2RlbC5pbnN0YW5jZSA9IG5ldyBVc2VyTW9kZWwoXCIxMVwiLCBcIua4uOWuolwiLCBcIlwiLCBudWxsLCBcIlwiLCBcIlwiLCBcIlwiLCBcImlwaG9uZTZzXCIsIFwiXCIsIFwiXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gVXNlck1vZGVsLmluc3RhbmNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHB1YmxpYyBtX3Byb3ZpbmNlOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgbV9uaWNrbmFtZTogc3RyaW5nO1xyXG4gICAgcHVibGljIG1fYXZhdGFyOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIGN1ck1vZGVsOiBOZXRVc2VyTW9kZWw7XHJcbiAgICBwdWJsaWMgU2V0VXNlck1vZGVsKF9tb2RlbDogTmV0VXNlck1vZGVsKSB7XHJcbiAgICAgICAgdGhpcy5jdXJNb2RlbCA9IF9tb2RlbDtcclxuICAgIH1cclxuXHJcblxyXG59XHJcbiIsImltcG9ydCB7IE1haW4gfSBmcm9tIFwiLi4vTWFpblwiO1xyXG5pbXBvcnQgVmlld01hbmFnZXIgZnJvbSBcIi4uL2dhbWVfbG9naWMvVmlld01hbmFnZXJcIjtcclxuaW1wb3J0IHsgU2V0dGluZ0NvbnRyb2xsZXIgfSBmcm9tIFwiLi4vZ2FtZV9sb2dpYy9TZXR0aW5nQ29udHJvbGxlclwiO1xyXG5pbXBvcnQgeyBTaGFyZU1vZHVsZSB9IGZyb20gXCIuL1NoYXJlTW9kdWxlXCI7XHJcbmltcG9ydCBVc2VyTW9kZWwgZnJvbSBcIi4vVXNlck1vZGVsXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgV1hTZGsge1xyXG4gICAgcHVibGljIHNldFNoYXJlSWQodGlkKSB7XHJcbiAgICAgICAgaWYgKHRpZCAhPSBcIlwiICYmIHRpZCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2hhcmVJZCA9IHRpZDtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJbTE9HXTogc2V0U2hhcmVPcGVuSWQudGlkPVwiLCB0aGlzLnNoYXJlSWQpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IFdYU2RrO1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgSW5zdGFuY2UoKTogV1hTZGsge1xyXG4gICAgICAgIHJldHVybiBXWFNkay5pbnN0YW5jZSB8fCAoV1hTZGsuaW5zdGFuY2UgPSBuZXcgV1hTZGsoKSk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc3RhdGljIExvZGluaW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgZ2V0IGdldFNoYXJlSWQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2hhcmVJZDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgU2hhcmVTY2VuZShzY2VuZVMpIHtcclxuICAgICAgICBpZiAoc2NlbmVTICE9IFwiXCIgJiYgc2NlbmVTICE9IG51bGwpIHtcclxuICAgICAgICAgICAgdGhpcy5zaGFyZVNjZW5lID0gc2NlbmVTO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHB1YmxpYyBpbml0KGNiOiBhbnkpIHtcclxuICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LnNob3dTaGFyZU1lbnUoe1xyXG4gICAgICAgICAgICB3aXRoU2hhcmVUaWNrZXQ6IHRydWVcclxuICAgICAgICB9KTtcclxuICAgICAgICAvL3RoaXMuc2hlemhpU2hhcmVNZXNzYWdlKG51bGwsIG51bGwpO1xyXG4gICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3gub25TaG93KGZ1bmN0aW9uIChvcHRpb24pIHtcclxuICAgICAgICAgICAgdmFyIHNoYXJlVGlja2V0ID0gb3B0aW9uLnNoYXJlVGlja2V0O1xyXG4gICAgICAgICAgICB2YXIgc2hhcmVpZCA9IG9wdGlvbi5xdWVyeS5zaGFyZWlkO1xyXG4gICAgICAgICAgICB2YXIgc2NlbmUgPSBkZWNvZGVVUklDb21wb25lbnQob3B0aW9uLnF1ZXJ5LnNjZW5lKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCLlhajlsYBwYXRoPTpcIiwgb3B0aW9uLnBhdGgpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcImRlY29kZVVSSUNvbXBvbmVudFwiLCBvcHRpb24ucXVlcnkuc2NlbmUpO1xyXG4gICAgICAgICAgICB2YXIgc2NlbmVRdWVyeSA9IEpTT04uc3RyaW5naWZ5KG9wdGlvbi5xdWVyeSk7XHJcbiAgICAgICAgICAgIGlmIChNYWluLnd4VmFsdWUgPT1cIlwiKSAge1xyXG4gICAgICAgICAgICAgICAgTWFpbi53eFZhbHVlID0gb3B0aW9uLnNjZW5lO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwic2NlbmVcIiwgb3B0aW9uLnNjZW5lKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJzY2VuZVF1ZXJ5XCIsIHNjZW5lUXVlcnkpO1xyXG4gICAgICAgICAgICB2YXIgY2hhbm5lbCA9IG9wdGlvbi5xdWVyeS5jaGFubmVsO1xyXG4gICAgICAgICAgICB2YXIgYXBwaWQ7XHJcbiAgICAgICAgICAgIGlmIChvcHRpb24ucmVmZXJyZXJJbmZvKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJlZmVycmVySW5mbzpcIiArIEpTT04uc3RyaW5naWZ5KG9wdGlvbi5yZWZlcnJlckluZm8pKTtcclxuICAgICAgICAgICAgICAgIGFwcGlkID0gb3B0aW9uLnJlZmVycmVySW5mby5hcHBJZDtcclxuICAgICAgICAgICAgICAgIGlmIChhcHBpZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwib25TaG93IGFwcGlzIGlzOlwiLCBhcHBpZCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwib25TaG93IGFwcGlzIGlzIG51bGxcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJlZmVycmVySW5mb+S4uuepulwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoY2hhbm5lbCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIm9uU2hvdyBjaGFubmVsIGlzOlwiLCBjaGFubmVsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYihzaGFyZVRpY2tldCwgc2hhcmVpZCwgY2hhbm5lbCwgYXBwaWQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBTaGFyZVNjZW5lKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNoYXJlU2NlbmU7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc3RhdGljIFNoYXJlTWVzc2FnZSh0aXRsZT8sIGltYWdlVXJsPykge1xyXG4gICAgICAgIGlmICghTWFpbi5Jc1d4KSByZXR1cm47XHJcbiAgICAgICAgdmFyIHQ6IG51bWJlciA9IFVzZXJNb2RlbC5JbnN0YW5jZS5DdXJNb2RlbC5TZXJ2ZXJUaW1lO1xyXG4gICAgICAgIHZhciBfdGl0bGUgPSB0aXRsZTtcclxuICAgICAgICB2YXIgX3VybCA9IGltYWdlVXJsO1xyXG4gICAgICAgIGlmICghX3RpdGxlKSB7XHJcbiAgICAgICAgICAgIF90aXRsZSA9IFVzZXJNb2RlbC5JbnN0YW5jZS5DdXJNb2RlbC5zaGFyZXRpdGxlO1xyXG4gICAgICAgICAgICBfdXJsID0gVXNlck1vZGVsLkluc3RhbmNlLkN1ck1vZGVsLnNoYXJlaW1hZ2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3gub25TaGFyZUFwcE1lc3NhZ2UoKCkgPT4gKHtcclxuICAgICAgICAgICAgdGl0bGU6IF90aXRsZSxcclxuICAgICAgICAgICAgaW1hZ2VVcmw6IF91cmwsXHJcbiAgICAgICAgICAgIHF1ZXJ5OiBcInNoYXJlaWQ9XCIgKyBVc2VyTW9kZWwuSW5zdGFuY2UuQ3VyTW9kZWwudXNlcmlkICsgXCJfXCIgKyB0ICsgXCJfXCIgKyBNYXRoLmZsb29yKDk5OTkgKiBNYXRoLnJhbmRvbSgpKS50b1N0cmluZygpXHJcbiAgICAgICAgfSkpO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHd4X2xvZ2luKGNiOiBGdW5jdGlvbikge1xyXG4gICAgICAgIGlmIChXWFNkay5Mb2RpbmluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFdYU2RrLkxvZGluaW5nID0gdHJ1ZTtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIkV4Y3V0ZSB3eC5sb2dpbiEgc2hhcmVPcGVuSWQ6IFwiICsgdGhpcy5zaGFyZUlkKTtcclxuICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmxvZ2luKHtcclxuICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKHJlcykge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJ3eC5sb2dpbjogc3VjY2VzcyEgcmVzLmNvZGU9XCIgKyByZXMuY29kZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzLmNvZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBXWFNkay5Mb2RpbmluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5bCG6KaB5Lyg6YCS55qE5Y+C5pWwOlwiICsgcmVzKTtcclxuICAgICAgICAgICAgICAgICAgICBjYihyZXMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+iOt+WPlueUqOaIt+eZu+W9leaAgeWksei0pe+8gScgKyByZXMuZXJyTXNnKTtcclxuICAgICAgICAgICAgICAgICAgICBjYihcImVycm9yXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZmFpbDogZnVuY3Rpb24gKHJlcykgeyBjb25zb2xlLmxvZyhcInd4LmxvZ2luOiBmYWlsZWQsIHJlcz1cIiArIHJlcyk7IFdYU2RrLkxvZGluaW5nID0gZmFsc2U7IGNiKFwiZXJyb3JcIik7IH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIHByaXZhdGUgc2hhcmVJZCA9IFwiXCI7XHJcbiAgICBwcml2YXRlIHNoYXJlU2NlbmUgPSBcIlwiO1xyXG4gICAgLy/mmL7npLrliqDovb3kv6Hmga9cclxuICAgIHB1YmxpYyBzdGF0aWMgU2hvd0xvYWRpbmcodGl0bGU6IHN0cmluZyA9IFwi5Yqg6L295LitLi4uXCIsIGlzU2hvd1d4ID0gdHJ1ZSkge1xyXG4gICAgICAgIGlmIChMYXlhLkJyb3dzZXIud2luZG93ICYmIExheWEuQnJvd3Nlci53aW5kb3cud3gpIHtcclxuICAgICAgICAgICAgaWYgKGlzU2hvd1d4KSB7XHJcbiAgICAgICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LnNob3dMb2FkaW5nKHsgdGl0bGU6IHRpdGxlLCBtYXNrOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLk9wZW5NYXNrKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcHVibGljIHN0YXRpYyBTeXN0ZW1JbmZvKCkge1xyXG4gICAgICAgIGlmIChMYXlhLkJyb3dzZXIud2luZG93Lnd4KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmdldFN5c3RlbUluZm9TeW5jKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gcHJpdmF0ZSBzdGF0aWMgYnV0dG9uO1xyXG4gICAgLy8gcHVibGljIHN0YXRpYyBzaG93YmpXeEdhbWVRdWFuKGZsYWc6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIC8vICAgICBpZiAoTGF5YS5Ccm93c2VyLndpbmRvdy53eCA9PSBudWxsKSB7XHJcbiAgICAvLyAgICAgICAgIHJldHVybjtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgICAgaWYgKGZsYWcpIHtcclxuICAgIC8vICAgICAgICAgaWYgKFdlaVhpblNESy5idXR0b24gPT0gbnVsbCkge1xyXG4gICAgLy8gICAgICAgICAgICAgbGV0IGluZm8gPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmdldFN5c3RlbUluZm9TeW5jKCk7XHJcbiAgICAvLyAgICAgICAgICAgICBpZiAoIWluZm8pIHJldHVybjtcclxuICAgIC8vICAgICAgICAgICAgIHZhciB0b3AgPSA0NzQgKiBpbmZvLndpbmRvd0hlaWdodCAvIExheWEuc3RhZ2UuaGVpZ2h0O1xyXG4gICAgLy8gICAgICAgICAgICAgdmFyIGhlaWdodCA9IDk0ICogaW5mby53aW5kb3dIZWlnaHQgLyBMYXlhLnN0YWdlLmhlaWdodDtcclxuICAgIC8vICAgICAgICAgICAgIHZhciB3aWR0aCA9IGhlaWdodCAqIDk1IC8gOTQ7XHJcbiAgICAvLyAgICAgICAgICAgICBXZWlYaW5TREsuYnV0dG9uID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eC5jcmVhdGVHYW1lQ2x1YkJ1dHRvblxyXG4gICAgLy8gICAgICAgICAgICAgICAgICh7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiaW1hZ2VcIixcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgaW1hZ2U6ICdyZXMvd3gucG5nJyxcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgc3R5bGU6XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDogMCxcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3A6IHRvcCxcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogd2lkdGgsXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBoZWlnaHRcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgICAgICAgICB9KVxyXG5cclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICBXZWlYaW5TREsuYnV0dG9uLnNob3coKTtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgICAgZWxzZSB7XHJcbiAgICAvLyAgICAgICAgIGlmIChXZWlYaW5TREsuYnV0dG9uKSB7XHJcbiAgICAvLyAgICAgICAgICAgICBXZWlYaW5TREsuYnV0dG9uLmhpZGUoKTtcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH1cclxuICAgIC8v6YCA5Ye6XHJcblxyXG5cclxuICAgIC8vIOaYvuekuuaPkOekuuS/oeaBry8vXHJcbiAgICBwdWJsaWMgc3RhdGljIFNob3dUb2FzdCh0ZXh0OiBzdHJpbmcsIGljb24gPSB0cnVlKSB7XHJcbiAgICAgICAgaWYgKExheWEuQnJvd3Nlci53aW5kb3cud3gpIHtcclxuICAgICAgICAgICAgdmFyIHRfaWNvbiA9IGljb24gPyBcInN1Y2Nlc3NcIiA6IFwibm9uZVwiO1xyXG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LnNob3dUb2FzdCh7IHRpdGxlOiB0ZXh0LCBpY29uOiB0X2ljb24gfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyh0ZXh0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvLzE6cGV0IDI65Lq654mpXHJcbiAgICAvLyBwdWJsaWMgc3RhdGljIFhpYW5TaGlfTW9kZWwoY29udGVudDogc3RyaW5nLCBjYWxsYmFjazogRnVuY3Rpb24gPSBudWxsLCB0eXBlID0gMSwgdGl0bGUgPSBcIlwiKSB7XHJcbiAgICAvLyAgICAgaWYgKExheWEuQnJvd3Nlci53aW5kb3cgJiYgTGF5YS5Ccm93c2VyLndpbmRvdy53eCkge1xyXG4gICAgLy8gICAgICAgICBpZiAodHlwZSA9PSAxKSB7XHJcbiAgICAvLyAgICAgICAgICAgICB2YXIgY2FuY2VsVGV4dCA9IFwi5q6L5b+N5Lii5o6JXCI7XHJcbiAgICAvLyAgICAgICAgICAgICB2YXIgY29uZmlybVRleHQgPSBcIuW4puS4iuS4gOi1t1wiO1xyXG4gICAgLy8gICAgICAgICB9IGVsc2Uge1xyXG4gICAgLy8gICAgICAgICAgICAgdmFyIGNhbmNlbFRleHQgPSBcIuS4jeaDs1wiO1xyXG4gICAgLy8gICAgICAgICAgICAgdmFyIGNvbmZpcm1UZXh0ID0gXCLmg7NcIjtcclxuICAgIC8vICAgICAgICAgfVxyXG5cclxuICAgIC8vICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5zaG93TW9kYWwoe1xyXG4gICAgLy8gICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxyXG4gICAgLy8gICAgICAgICAgICAgY29udGVudDogY29udGVudCxcclxuICAgIC8vICAgICAgICAgICAgIGNhbmNlbFRleHQ6IGNhbmNlbFRleHQsXHJcbiAgICAvLyAgICAgICAgICAgICBjb25maXJtVGV4dDogY29uZmlybVRleHQsXHJcbiAgICAvLyAgICAgICAgICAgICBzdWNjZXNzKHJlcykge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGlmIChyZXMuY29uZmlybSkge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn55So5oi354K55Ye756Gu5a6aJyk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHRydWUpO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzLmNhbmNlbCkge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn55So5oi354K55Ye75Y+W5raIJyk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGZhbHNlKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgICB9LFxyXG4gICAgLy8gICAgICAgICAgICAgZmFpbChyZXM/KSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+eUqOaIt+eCueWHu+WPlua2iCcpO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGNhbGxiYWNrKGZhbHNlKTtcclxuICAgIC8vICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgfSlcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyB9XHJcbiAgICBwdWJsaWMgc3RhdGljIFNob3J0VmlicmF0ZSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAoTGF5YS5Ccm93c2VyLndpbmRvdy53eCAmJiBTZXR0aW5nQ29udHJvbGxlci5JbnN0YW5jZS52aWJyYXRlKSB7XHJcbiAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3gudmlicmF0ZVNob3J0KHt9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBMb25nVmlicmF0ZSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAoTGF5YS5Ccm93c2VyLndpbmRvdy53eCAmJiBTZXR0aW5nQ29udHJvbGxlci5JbnN0YW5jZS52aWJyYXRlKSB7XHJcbiAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3gudmlicmF0ZUxvbmcoe30pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHB1YmxpYyBzdGF0aWMgSGlkZUxvYWRpbmcoaXNTaG93V3ggPSB0cnVlKSB7XHJcbiAgICAgICAgaWYgKExheWEuQnJvd3Nlci53aW5kb3cgJiYgTGF5YS5Ccm93c2VyLndpbmRvdy53eCkge1xyXG4gICAgICAgICAgICBpZiAoaXNTaG93V3gpIHtcclxuICAgICAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3guaGlkZUxvYWRpbmcoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBWaWV3TWFuYWdlci5JbnN0YW5jZS5DbG9zZU1hc2soKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc3RhdGljIFN1Y2Nlc3Moc3RhZ2VJZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCFNYWluLklzV3gpIHJldHVybjtcclxuICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmFsZFN0YWdlLm9uRW5kKFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBzdGFnZUlkOiBzdGFnZUlkLCAgICAgLy/lhbPljaFJRCDor6XlrZfmrrXlv4XkvKBcclxuICAgICAgICAgICAgICAgIHN0YWdlTmFtZTogXCLnrKxcIiArIHN0YWdlSWQgKyBcIuWFs1wiLCAvL+WFs+WNoeWQjeensCAg6K+l5a2X5q615b+F5LygXHJcbiAgICAgICAgICAgICAgICBldmVudDogXCJjb21wbGV0ZVwiLCAgIC8v5YWz5Y2h5a6M5oiQICDlhbPljaHov5vooYzkuK3vvIznlKjmiLfop6blj5HnmoTmk43kvZwgICAg6K+l5a2X5q615b+F5LygXHJcbiAgICAgICAgICAgICAgICBwYXJhbXM6XHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjOiBcIuWFs+WNoeWujOaIkFwiICAgLy/mj4/ov7BcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG5cclxuICAgIH1cclxuICAgIC8v6K6w5b2V6Zi/5ouJ5LiB5LqL5Lu2XHJcbiAgICBwdWJsaWMgc3RhdGljIEFsZEV2ZW50KGV2ZW50TmFtZTogc3RyaW5nLCBrZXk/OiBzdHJpbmcsIHZhbHVlPzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKExheWEuQnJvd3Nlci53aW5kb3cgJiYgTGF5YS5Ccm93c2VyLndpbmRvdy53eCkge1xyXG4gICAgICAgICAgICBpZiAoIWtleSkga2V5ID0gXCLnlKjmiLdpZFwiO1xyXG4gICAgICAgICAgICBpZiAoIXZhbHVlKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgdmFsdWUgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2codmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3guYWxkU2VuZEV2ZW50KGV2ZW50TmFtZSwgeyBrZXk6IHZhbHVlIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHB1YmxpYyBzdGF0aWMgRmFpbChzdGFnZUlkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIU1haW4uSXNXeCkgcmV0dXJuO1xyXG4gICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3guYWxkU3RhZ2Uub25FbmQoXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHN0YWdlSWQ6IHN0YWdlSWQsICAgICAvL+WFs+WNoUlEIOivpeWtl+auteW/heS8oFxyXG4gICAgICAgICAgICAgICAgc3RhZ2VOYW1lOiBcIuesrFwiICsgc3RhZ2VJZCArIFwi5YWzXCIsIC8v5YWz5Y2h5ZCN56ewICDor6XlrZfmrrXlv4XkvKBcclxuICAgICAgICAgICAgICAgIGV2ZW50OiBcImZhaWxcIiwgICAvL+WFs+WNoeWujOaIkCAg5YWz5Y2h6L+b6KGM5Lit77yM55So5oi36Kem5Y+R55qE5pON5L2cICAgIOivpeWtl+auteW/heS8oFxyXG4gICAgICAgICAgICAgICAgcGFyYW1zOlxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzYzogXCLlhbPljaHlpLHotKVcIixcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG5cclxuICAgIH1cclxuICAgIC8vIHB1YmxpYyBzdGF0aWMgbGV2ZWxlUnVuaW5nKHN0YWdlSWQ6IHN0cmluZywgdXNlcmlkOiBzdHJpbmcsIGV2ZW50dHlwZTogbnVtYmVyLCBpdGVtTmFtZTogc3RyaW5nKSB7XHJcbiAgICAvLyAgICAgaWYgKExheWEuQnJvd3Nlci53aW5kb3cgJiYgTGF5YS5Ccm93c2VyLndpbmRvdy53eCkge1xyXG4gICAgLy8gICAgICAgICAvL0xheWEuQnJvd3Nlci53aW5kb3cud3guYWxkU3RhZ2Uub25SdW5uaW5nKHtcInN0YWdlSWRcIjpzdGFnZUlkLFwic3RhZ2VOYW1lXCI6c3RhZ2VOYW1lLFwidXNlcklkXCI6dXNlcmlkfSk7XHJcbiAgICAvLyAgICAgICAgIHZhciBldmVudFQgPSBldmVudHR5cGUgPT0gMCA/IFwiYXdhcmRcIiA6IFwicmV2aXZlXCI7XHJcbiAgICAvLyAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3guYWxkU3RhZ2Uub25SdW5uaW5nKHtcclxuICAgIC8vICAgICAgICAgICAgIHN0YWdlSWQ6IHN0YWdlSWQsXHJcbiAgICAvLyAgICAgICAgICAgICBzdGFnZU5hbWU6IFwi56ysXCIgKyBzdGFnZUlkICsgXCLlhbNcIixcclxuICAgIC8vICAgICAgICAgICAgIHVzZXJJZDogdXNlcmlkLFxyXG4gICAgLy8gICAgICAgICAgICAgZXZlbnQ6IGV2ZW50VCxcclxuICAgIC8vICAgICAgICAgICAgIHBhcmFtczoge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGl0ZW1OYW1lOiBpdGVtTmFtZSxcclxuICAgIC8vICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgfSlcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBTdGFydChzdGFnZUlkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIU1haW4uSXNXeCkgcmV0dXJuO1xyXG4gICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3guYWxkU3RhZ2Uub25TdGFydChcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc3RhZ2VJZDogc3RhZ2VJZCwgICAgIC8v5YWz5Y2hSUQg6K+l5a2X5q615b+F5LygXHJcbiAgICAgICAgICAgICAgICBzdGFnZU5hbWU6IFwi56ysXCIgKyBzdGFnZUlkICsgXCLlhbNcIiwgLy/lhbPljaHlkI3np7AgIOivpeWtl+auteW/heS8oFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICB9XHJcblxyXG5cclxuXHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBHYW1lX1NoYXJlKGNhbGxiYWNrOiBGdW5jdGlvbiA9IG51bGwsIGNoYW5uZWw6IHN0cmluZyA9IFwiXCIpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIU1haW4uSXNXeCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciB1cmw7XHJcbiAgICAgICAgdmFyIHRpdGxlO1xyXG4gICAgICAgIHVybCA9IFVzZXJNb2RlbC5JbnN0YW5jZS5DdXJNb2RlbC5zaGFyZWltYWdlO1xyXG4gICAgICAgIHRpdGxlID0gVXNlck1vZGVsLkluc3RhbmNlLkN1ck1vZGVsLnNoYXJldGl0bGU7XHJcbiAgICAgICAgY29uc29sZS5sb2codXJsICsgXCIgIFwiICsgdGl0bGUpO1xyXG5cclxuICAgICAgIFxyXG4gICAgICAgIGlmIChjaGFubmVsICE9IG51bGwpIHtcclxuICAgICAgICAgICAgLy8gV2VpWGluU0RLLkFsZEV2ZW50KFwi55So5oi35YiG5LqrXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgdDogbnVtYmVyOy8vID0gVXNlck1vZGVsLkdldF9JbnN0YW5jZS5DdXJNb2RlbC5IdW9RdV9TZXJ2ZXJUaW1lO1xyXG4gICAgICAgIHZhciBwYXRoID0gXCJcIjtcclxuICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmFsZFNoYXJlQXBwTWVzc2FnZSh7XHJcbiAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcclxuICAgICAgICAgICAgaW1hZ2VVcmw6IHVybCxcclxuICAgICAgICAgICAgcXVlcnk6IFwic2hhcmVpZD1cIiArIFVzZXJNb2RlbC5JbnN0YW5jZS5DdXJNb2RlbC51c2VyaWQgKyBcIl9cIiArIFwib3RoZXJcIiArIFwiX1wiICsgdCArIFwiX1wiICsgTWF0aC5mbG9vcig5OTk5ICogTWF0aC5yYW5kb20oKSkudG9TdHJpbmcoKSxcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgU2hhcmVNb2R1bGUuR29TaGFyZShjYWxsYmFjayk7XHJcblxyXG4gICAgfVxyXG59IiwiXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERpY3Rpb25hcnkge1xyXG4gICAgcHJpdmF0ZSBfbGVuZ3RoOiBudW1iZXI7XHJcblxyXG4gICAgcHJpdmF0ZSBfY29udGFpbmVyOiBhbnk7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5fY29udGFpbmVyID0ge307XHJcbiAgICAgICAgdGhpcy5fbGVuZ3RoID0gMDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGNvbnRhaW5lcigpOiBhbnkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jb250YWluZXI7XHJcbiAgICB9XHJcblxyXG4gICAgLy/ojrflj5blrZflhbjplb/luqYgICAgXHJcbiAgICBwdWJsaWMgZ2V0IHNpemUoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbGVuZ3RoO1xyXG4gICAgfVxyXG5cclxuICAgIC8v5re75YqgXHJcbiAgICBwdWJsaWMgc2V0KGtleTogYW55LCB2YWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9jb250YWluZXIuaGFzT3duUHJvcGVydHkoa2V5KSkgIHtcclxuICAgICAgICAgICAgdGhpcy5fbGVuZ3RoKys7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lcltrZXldID0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy/liKDpmaQgICAgIFxyXG4gICAgcHVibGljIGRlbGV0ZShrZXk6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9jb250YWluZXIuaGFzT3duUHJvcGVydHkoa2V5KSkgIHtcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2NvbnRhaW5lcltrZXldO1xyXG4gICAgICAgICAgICB0aGlzLl9sZW5ndGgtLTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy/mn6Xmib4gICBcclxuICAgIHB1YmxpYyBoYXMoa2V5OiBhbnkpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY29udGFpbmVyLmhhc093blByb3BlcnR5KGtleSkgPyB0cnVlIDogZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy/ojrflj5YgXHJcbiAgICBwdWJsaWMgZ2V0KGtleTogYW55KTogYW55IHtcclxuICAgICAgICBpZiAodGhpcy5fY29udGFpbmVyLmhhc093blByb3BlcnR5KGtleSkpICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb250YWluZXJba2V5XTtcclxuICAgICAgICB9IGVsc2UgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL+a4heepuiAgICBcclxuICAgIHB1YmxpYyBjbGVhcigpIHtcclxuICAgICAgICB0aGlzLl9jb250YWluZXIgPSB7fTtcclxuICAgICAgICB0aGlzLl9sZW5ndGggPSAwO1xyXG4gICAgfVxyXG5cclxuXHJcbn0iLCJcclxuaW1wb3J0IFVzZXJNb2RlbCBmcm9tIFwiLi4vZ2FtZV9tb2R1bGUvVXNlck1vZGVsXCI7XHJcbmltcG9ydCBWZWN0b3IzPUxheWEuVmVjdG9yMztcclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgR2FtZV9Ub29sIHtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIEdldE9iaktleShvYmo6IGFueSkge1xyXG4gICAgICAgIGlmIChvYmogPT0gbnVsbCkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XHJcbiAgICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGtleTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8v6L+U5Zue5LiA5Liq6ZqP5py65pW05pWwW21pbixtYXhdXHJcbiAgICBwdWJsaWMgc3RhdGljIHJhbmRvbUludChtaW46IGFueSwgbWF4OiBhbnkpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiBwYXJzZUludChNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbiArIDEpICsgbWluKTtcclxuICAgIH1cclxuICAgIC8vcDEg5bem5ZCR6YePIHAyXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldEFuZyh4eDogbnVtYmVyLCB5eTogbnVtYmVyLCBvYmw6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIDE4MCAvIE1hdGguUEkgKiB0aGlzLmdldFJhZCh4eCwgeXksIG9ibCk7XHJcbiAgICB9XHJcbiAgICAvL+i/lOWbnuinkuW6plxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRSYWQoeHg6IG51bWJlciwgeXk6IG51bWJlciwgb2JsOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgICAgIC8vIOaWueazleS4gO+8mmFzaW4oKVxyXG4gICAgICAgIC8vIHZhciByYWQ6TnVtYmVyID0geHggPiAwID8gKChNYXRoLlBJICogMykvMiAgKyBNYXRoLmFzaW4oLXl5L29ibCkpIDogKE1hdGguUEkgLyAyIC0gIE1hdGguYXNpbigteXkvb2JsKSk7XHJcbiAgICAgICAgLy8g5pa55rOV5LqM77yaYWNvcygpXHJcbiAgICAgICAgdmFyIHJhZDogbnVtYmVyID0geXkgPCAwID8gTWF0aC5hY29zKHh4IC8gb2JsKSA6IChNYXRoLlBJICogMiAtIE1hdGguYWNvcyh4eCAvIG9ibCkpO1xyXG4gICAgICAgIC8vIOaWueazleS4ie+8mmF0YW4yKClcclxuICAgICAgICAvLyB2YXIgcmFkOk51bWJlciA9IHl5IDwgMCA/IE1hdGguYXRhbjIoLXl5LCB4eCkgOiBNYXRoLlBJICogMiArIE1hdGguYXRhbjIoLXl5LCB4eCk7XHJcbiAgICAgICAgcmV0dXJuIHJhZDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldE1fVmVjdG9yKHYxOiBMYXlhLlZlY3RvcjMsIHYyOiBMYXlhLlZlY3RvcjMpOiBMYXlhLlZlY3RvcjMge1xyXG4gICAgICAgIGxldCB0ZW1wID0gbmV3IExheWEuVmVjdG9yMygpO1xyXG4gICAgICAgIExheWEuVmVjdG9yMy5hZGQodjEsIHYyLCB0ZW1wKTtcclxuICAgICAgICByZXR1cm4gbmV3IExheWEuVmVjdG9yMyh0ZW1wLnggKiAwLjUsIHRlbXAueSAqIDAuNSwgdGVtcC56ICogMC41KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRSZWZsZWN0QW5nKGRpcjpWZWN0b3IzKXtcclxuICAgICAgICB2YXIgeHg9TWF0aC5hYnMoZGlyLngpO1xyXG4gICAgICAgIHZhciB6ej1NYXRoLmFicyhkaXIueik7XHJcbiAgICAgICAgdmFyIG9ibD0gTWF0aC5zcXJ0KE1hdGgucG93KGRpci54LCAyKSArIE1hdGgucG93KGRpci56LCAyKSk7XHJcbiAgICAgICAgcmV0dXJuIDE4MCAvIE1hdGguUEkgKiBNYXRoLmFjb3MoeHggLyBvYmwpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgcmFuZG9tXzF0bzEoKTpudW1iZXJ7IFxyXG4gICAgICAgIHZhciBpc3poZW5nPU1hdGgucmFuZG9tKCk+MC41Py0xOjE7XHJcbiAgICAgICAgcmV0dXJuIE1hdGgucmFuZG9tKCkqaXN6aGVuZztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldDY0RW5jb2RlKHN0cik6IHN0cmluZyB7XHJcbiAgICAgICAgdmFyIGMxLCBjMiwgYzM7XHJcbiAgICAgICAgdmFyIGJhc2U2NEVuY29kZUNoYXJzID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvXCI7XHJcbiAgICAgICAgdmFyIGkgPSAwLCBsZW4gPSBzdHIubGVuZ3RoLCBzdHJpbmcgPSAnJztcclxuICAgICAgICB3aGlsZSAoaSA8IGxlbikge1xyXG4gICAgICAgICAgICBjMSA9IHN0ci5jaGFyQ29kZUF0KGkrKykgJiAweGZmO1xyXG4gICAgICAgICAgICBpZiAoaSA9PSBsZW4pIHtcclxuICAgICAgICAgICAgICAgIHN0cmluZyArPSBiYXNlNjRFbmNvZGVDaGFycy5jaGFyQXQoYzEgPj4gMik7XHJcbiAgICAgICAgICAgICAgICBzdHJpbmcgKz0gYmFzZTY0RW5jb2RlQ2hhcnMuY2hhckF0KChjMSAmIDB4MykgPDwgNCk7XHJcbiAgICAgICAgICAgICAgICBzdHJpbmcgKz0gXCI9PVwiO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYzIgPSBzdHIuY2hhckNvZGVBdChpKyspO1xyXG4gICAgICAgICAgICBpZiAoaSA9PSBsZW4pIHtcclxuICAgICAgICAgICAgICAgIHN0cmluZyArPSBiYXNlNjRFbmNvZGVDaGFycy5jaGFyQXQoYzEgPj4gMik7XHJcbiAgICAgICAgICAgICAgICBzdHJpbmcgKz0gYmFzZTY0RW5jb2RlQ2hhcnMuY2hhckF0KCgoYzEgJiAweDMpIDw8IDQpIHwgKChjMiAmIDB4RjApID4+IDQpKTtcclxuICAgICAgICAgICAgICAgIHN0cmluZyArPSBiYXNlNjRFbmNvZGVDaGFycy5jaGFyQXQoKGMyICYgMHhGKSA8PCAyKTtcclxuICAgICAgICAgICAgICAgIHN0cmluZyArPSBcIj1cIjtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGMzID0gc3RyLmNoYXJDb2RlQXQoaSsrKTtcclxuICAgICAgICAgICAgc3RyaW5nICs9IGJhc2U2NEVuY29kZUNoYXJzLmNoYXJBdChjMSA+PiAyKTtcclxuICAgICAgICAgICAgc3RyaW5nICs9IGJhc2U2NEVuY29kZUNoYXJzLmNoYXJBdCgoKGMxICYgMHgzKSA8PCA0KSB8ICgoYzIgJiAweEYwKSA+PiA0KSk7XHJcbiAgICAgICAgICAgIHN0cmluZyArPSBiYXNlNjRFbmNvZGVDaGFycy5jaGFyQXQoKChjMiAmIDB4RikgPDwgMikgfCAoKGMzICYgMHhDMCkgPj4gNikpO1xyXG4gICAgICAgICAgICBzdHJpbmcgKz0gYmFzZTY0RW5jb2RlQ2hhcnMuY2hhckF0KGMzICYgMHgzRilcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHN0cmluZztcclxuICAgIH1cclxuXHJcbiAgICAvLyBwdWJsaWMgc3RhdGljIFNldEh1VHVpTGlzdChsaXN0OkxheWEuTGlzdCxkYXRhPyxzY3JvbDpudW1iZXI9MSx0eXBlOm51bWJlcj0wKXsgLy9zY3JvbCAxOuerlueahCAgMuaoqueahFxyXG4gICAgLy8gICAgIHZhciBhcnI9ZGF0YT9kYXRhOkZZSERfU2RrLnB1c2hEYXRhO1xyXG4gICAgLy8gICAgIGxpc3Quc2VsZWN0RW5hYmxlID0gZmFsc2U7XHJcbiAgICAvLyAgICAgc2Nyb2w9PTE/bGlzdC52U2Nyb2xsQmFyU2tpbiA9IFwiXCI6bGlzdC5oU2Nyb2xsQmFyU2tpbiA9IFwiXCI7XHJcbiAgICAvLyAgICAgbGlzdC5yZW5kZXJIYW5kbGVyID0gTGF5YS5IYW5kbGVyLmNyZWF0ZSh0aGlzLCB0aGlzLnVwZGF0ZUl0ZW0sIFt0eXBlXSwgZmFsc2UpO1xyXG4gICAgLy8gICAgIGxpc3QuYXJyYXkgPSBhcnI7XHJcbiAgICAvLyAgICAgbGlzdC5yZWZyZXNoKCk7XHJcbiAgICAvLyAgfVxyXG4gICAgLy8gIHByaXZhdGUgc3RhdGljIHVwZGF0ZUl0ZW0odHlwZSxjZWxsOiBMYXlhLkJveCwgaW5kZXg6IG51bWJlcil7XHJcbiAgICAvLyAgICAgIHZhciBhZGl0ZW09Y2VsbC5nZXRDb21wb25lbnQoSHVpVHVpSXRlbSlhcyBIdWlUdWlJdGVtO1xyXG4gICAgLy8gICAgICBhZGl0ZW0uUmVmcmVzaCh0eXBlKTtcclxuICAgIC8vICB9XHJcbiAgICAvLyAgcHVibGljIHN0YXRpYyBtYWtlUmFuZG9tQXJyKGFyckxpc3QsbnVtKXtcclxuICAgIC8vICAgICBpZihudW0+YXJyTGlzdC5sZW5ndGgpe1xyXG4gICAgLy8gICAgICAgIHJldHVybjtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgICAgdmFyIHRlbXBBcnI9YXJyTGlzdC5zbGljZSgwKTtcclxuICAgIC8vICAgICB2YXIgbmV3QXJyTGlzdD1bXTsgICAgXHJcbiAgICAvLyAgICAgZm9yKHZhciBpPTA7aTxudW07aSsrKXtcclxuICAgIC8vICAgICAgICAgdmFyIHJhbmRvbT1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqKHRlbXBBcnIubGVuZ3RoLTEpKTtcclxuICAgIC8vICAgICAgICAgdmFyIGFycj10ZW1wQXJyW3JhbmRvbV07XHJcbiAgICAvLyAgICAgICAgIHRlbXBBcnIuc3BsaWNlKHJhbmRvbSwgMSk7XHJcbiAgICAvLyAgICAgICAgIG5ld0Fyckxpc3QucHVzaChhcnIpOyAgICBcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgICAgcmV0dXJuIG5ld0Fyckxpc3Q7XHJcbiAgICAvLyB9XHJcbiAgICAvLyBwdWJsaWMgc3RhdGljIENvcHlBcnIobyk6YW55e1xyXG4gICAgLy8gICAgIHZhciBhcnI9W107XHJcbiAgICAvLyAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IG8ubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAvLyAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBvW2luZGV4XTtcclxuICAgIC8vICAgICAgICAgYXJyLnB1c2goZWxlbWVudCk7XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gICAgIHJldHVybiBhcnI7XHJcbiAgICAvLyB9XHJcblxyXG5cclxuICAgIC8vIHB1YmxpYyBzdGF0aWMgU2hvd1FpYW5EYW8oKTogYm9vbGVhbiB7XHJcbiAgICAvLyAgICAgbGV0IHRvZGF5WmVybyA9IG5ldyBEYXRlKFVzZXJNb2RlbC5JbnN0YW5jZS5DdXJNb2RlbC5TZXJ2ZXJUaW1lICogMTAwMCk7XHJcbiAgICAvLyAgICAgdG9kYXlaZXJvLnNldEhvdXJzKDAsIDAsIDAsIDApO1xyXG4gICAgLy8gICAgIGlmKCFQbGF5ZXJNYW5hZ2VyLkluc3RhbmNlLnNpZ24pcmV0dXJuIHRydWU7XHJcbiAgICAvLyAgICAgdmFyIGxhc3RUaW1lID0gTnVtYmVyKFBsYXllck1hbmFnZXIuSW5zdGFuY2Uuc2lnbltcInNpZ25fdGltZVwiXSkgKiAxMDAwO1xyXG4gICAgLy8gICAgIGxldCBsYXN0U2lnblRpbWUgPSBuZXcgRGF0ZShsYXN0VGltZSk7XHJcbiAgICAvLyAgICAgaWYgKGxhc3RUaW1lID09IDApIHtcclxuICAgIC8vICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gICAgIGlmIChsYXN0U2lnblRpbWUudmFsdWVPZigpIDwgdG9kYXlaZXJvLnZhbHVlT2YoKSkge1xyXG4gICAgLy8gICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgLy8gfVxyXG59IiwiaW1wb3J0IHsgdWkgfSBmcm9tIFwiLi4vdWkvbGF5YU1heFVJXCI7XHJcbmltcG9ydCB7IEV2ZW50TWFuYWdlciB9IGZyb20gXCIuLi9nYW1lX21vZHVsZS9FdmVudE1hbmFnZXJcIjtcclxuaW1wb3J0IHsgUm9sZUNvbnRyb2xsZXIgfSBmcm9tIFwiLi4vZ2FtZV9sb2dpYy9Sb2xlQ29udHJvbGxlclwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIGdhbWVfdWkgZXh0ZW5kcyB1aS5nYW1lX3VpVUkgaW1wbGVtZW50cyBVSV9JbnRlcmZhY2Uge1xyXG5cclxuXHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICB0aGlzLnJlc2l6ZUhhbmRlcigpO1xyXG4gICAgICAgIEV2ZW50TWFuYWdlci5vbihMYXlhLkV2ZW50LlJFU0laRSwgdGhpcywgdGhpcy5yZXNpemVIYW5kZXIpO1xyXG4gICAgfVxyXG4gICAgcmVzaXplSGFuZGVyKCkge1xyXG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gTGF5YS5zdGFnZS5oZWlnaHQ7XHJcbiAgICB9XHJcbiAgICBPblNob3coZGF0YT86IGFueSkge1xyXG4gICAgICAgIHRoaXMuVWlFdmVudEhhbmRsZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBVaUV2ZW50SGFuZGxlcigpIHtcclxuICAgICAgICB0aGlzLm9uKExheWEuRXZlbnQuTU9VU0VfRE9XTiwgdGhpcywgdGhpcy5PbkNsaWNrRG93bik7XHJcbiAgICAgICAgdGhpcy5vbihMYXlhLkV2ZW50Lk1PVVNFX1VQLCB0aGlzLCB0aGlzLk9uQ2xpY2tVcCk7XHJcbiAgICAgICAgdGhpcy5vbihMYXlhLkV2ZW50Lk1PVVNFX09VVCwgdGhpcywgdGhpcy5PbkNsaWNrVXApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaXNkb3duPWZhbHNlO1xyXG4gICAgT25DbGlja0Rvd24oZTogTGF5YS5FdmVudCkge1xyXG4gICAgICAgIGlmIChlLnRhcmdldCBpbnN0YW5jZW9mIExheWEuVUlDb21wb25lbnQpIHJldHVybjtcclxuICAgICAgICB0aGlzLmlzZG93bj10cnVlO1xyXG4gICAgICAgIHRoaXMub24oTGF5YS5FdmVudC5NT1VTRV9NT1ZFLCB0aGlzLCB0aGlzLk9uU2xpZGVyKTtcclxuICAgICAgICB0aGlzLmN1ck1vdXNlUG9zID0gbmV3IExheWEuVmVjdG9yMihMYXlhLk1vdXNlTWFuYWdlci5pbnN0YW5jZS5tb3VzZVgsIExheWEuTW91c2VNYW5hZ2VyLmluc3RhbmNlLm1vdXNlWSk7XHJcbiAgICB9XHJcbiAgICBPbkNsaWNrVXAoKSB7XHJcbiAgICAgICAgaWYoIXRoaXMuaXNkb3duKXJldHVybjtcclxuICAgICAgICB0aGlzLmlzZG93bj1mYWxzZTtcclxuICAgICAgICB0aGlzLm9mZihMYXlhLkV2ZW50Lk1PVVNFX01PVkUsIHRoaXMsIHRoaXMuT25TbGlkZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIGN1ck1vdXNlUG9zOiBMYXlhLlZlY3RvcjI7XHJcbiAgICBPblNsaWRlcigpIHtcclxuICAgICAgICB2YXIgTW91c2VQb3MgPSBuZXcgTGF5YS5WZWN0b3IyKExheWEuTW91c2VNYW5hZ2VyLmluc3RhbmNlLm1vdXNlWCwgTGF5YS5Nb3VzZU1hbmFnZXIuaW5zdGFuY2UubW91c2VZKTtcclxuICAgICAgICB2YXIgb2ZmZXN0WCA9IE1vdXNlUG9zLnggLSB0aGlzLmN1ck1vdXNlUG9zLng7XHJcbiAgICAgICAgaWYgKG9mZmVzdFggPiAwKSBvZmZlc3RYID0gb2ZmZXN0WCA8IDUgPyBvZmZlc3RYIDogNTtcclxuICAgICAgICBpZiAob2ZmZXN0WCA8IDApIG9mZmVzdFggPSBvZmZlc3RYID4gLTUgPyBvZmZlc3RYIDogLTU7XHJcbiAgICAgICAgdmFyIHJvdGF0ZURpciA9IG5ldyBMYXlhLlZlY3RvcjMoMCwgLW9mZmVzdFggKiAwLjAxLCAwKTtcclxuICAgICAgICBSb2xlQ29udHJvbGxlci5JbnN0YW5jZS5Sb2xlUm90YXRpb24ocm90YXRlRGlyKTtcclxuICAgICAgICB0aGlzLmN1ck1vdXNlUG9zID0gbmV3IExheWEuVmVjdG9yMihMYXlhLk1vdXNlTWFuYWdlci5pbnN0YW5jZS5tb3VzZVgsIExheWEuTW91c2VNYW5hZ2VyLmluc3RhbmNlLm1vdXNlWSk7O1xyXG4gICAgfVxyXG4gICAgT25DbG9zZSgpIHtcclxuICAgICAgICBFdmVudE1hbmFnZXIub2ZmKExheWEuRXZlbnQuUkVTSVpFLCB0aGlzLCB0aGlzLnJlc2l6ZUhhbmRlcik7XHJcbiAgICAgICAgdGhpcy5vZmYoTGF5YS5FdmVudC5NT1VTRV9ET1dOLCB0aGlzLCB0aGlzLk9uQ2xpY2tEb3duKTtcclxuICAgICAgICB0aGlzLm9mZihMYXlhLkV2ZW50Lk1PVVNFX1VQLCB0aGlzLCB0aGlzLk9uQ2xpY2tVcCk7XHJcbiAgICAgICAgdGhpcy5vZmYoTGF5YS5FdmVudC5NT1VTRV9PVVQsIHRoaXMsIHRoaXMuT25DbGlja1VwKTtcclxuICAgIH1cclxufSIsIi8qKlRoaXMgY2xhc3MgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgTGF5YUFpcklERSwgcGxlYXNlIGRvIG5vdCBtYWtlIGFueSBtb2RpZmljYXRpb25zLiAqL1xuaW1wb3J0IFZpZXc9TGF5YS5WaWV3O1xyXG5pbXBvcnQgRGlhbG9nPUxheWEuRGlhbG9nO1xyXG5pbXBvcnQgU2NlbmU9TGF5YS5TY2VuZTtcbnZhciBSRUc6IEZ1bmN0aW9uID0gTGF5YS5DbGFzc1V0aWxzLnJlZ0NsYXNzO1xuZXhwb3J0IG1vZHVsZSB1aSB7XHJcbiAgICBleHBvcnQgY2xhc3MgZ2FtZV91aVVJIGV4dGVuZHMgU2NlbmUge1xyXG4gICAgICAgIHB1YmxpYyBzdGF0aWMgIHVpVmlldzphbnkgPXtcInR5cGVcIjpcIlNjZW5lXCIsXCJwcm9wc1wiOntcIndpZHRoXCI6NzIwLFwiaGVpZ2h0XCI6MTI4MH0sXCJsb2FkTGlzdFwiOltdLFwibG9hZExpc3QzRFwiOltdfTtcclxuICAgICAgICBjb25zdHJ1Y3RvcigpeyBzdXBlcigpfVxyXG4gICAgICAgIGNyZWF0ZUNoaWxkcmVuKCk6dm9pZCB7XHJcbiAgICAgICAgICAgIHN1cGVyLmNyZWF0ZUNoaWxkcmVuKCk7XHJcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlVmlldyhnYW1lX3VpVUkudWlWaWV3KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBSRUcoXCJ1aS5nYW1lX3VpVUlcIixnYW1lX3VpVUkpO1xyXG59XHIiXX0=