ResSpine.js 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. (function() {
  2. var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
  3. var __module = nodeEnv ? module : {exports:{}};
  4. var __filename = 'preview-scripts/assets/script/frameWork/compment/ResSpine.js';
  5. var __require = nodeEnv ? function (request) {
  6. return cc.require(request);
  7. } : function (request) {
  8. return __quick_compile_project__.require(request, __filename);
  9. };
  10. function __define (exports, require, module) {
  11. if (!nodeEnv) {__quick_compile_project__.registerModule(__filename, module);}"use strict";
  12. cc._RF.push(module, 'd4c5dupxW5Hw7tvypXWSElT', 'ResSpine');
  13. // script/frameWork/compment/ResSpine.ts
  14. "use strict";
  15. var __extends = (this && this.__extends) || (function () {
  16. var extendStatics = function (d, b) {
  17. extendStatics = Object.setPrototypeOf ||
  18. ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
  19. function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
  20. return extendStatics(d, b);
  21. };
  22. return function (d, b) {
  23. extendStatics(d, b);
  24. function __() { this.constructor = d; }
  25. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  26. };
  27. })();
  28. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  29. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  30. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  31. else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
  32. return c > 3 && r && Object.defineProperty(target, key, r), r;
  33. };
  34. Object.defineProperty(exports, "__esModule", { value: true });
  35. var ResBaseAsset_1 = require("./ResBaseAsset");
  36. var _a = cc._decorator, ccclass = _a.ccclass, menu = _a.menu, disallowMultiple = _a.disallowMultiple, requireComponent = _a.requireComponent;
  37. /**
  38. * spine组件,自动管理资源的引用计数
  39. */
  40. var ResSpine = /** @class */ (function (_super) {
  41. __extends(ResSpine, _super);
  42. function ResSpine() {
  43. var _this = _super !== null && _super.apply(this, arguments) || this;
  44. _this._spSkeleton = null;
  45. _this._url = '';
  46. return _this;
  47. }
  48. Object.defineProperty(ResSpine.prototype, "spSkeleton", {
  49. get: function () {
  50. var _a, _b;
  51. return this._spSkeleton || (this._spSkeleton = ((_a = this.node) === null || _a === void 0 ? void 0 : _a.getComponent(sp.Skeleton)) || ((_b = this.node) === null || _b === void 0 ? void 0 : _b.addComponent(sp.Skeleton)));
  52. },
  53. enumerable: false,
  54. configurable: true
  55. });
  56. Object.defineProperty(ResSpine.prototype, "skeletonData", {
  57. get: function () {
  58. return this.spSkeleton.skeletonData;
  59. },
  60. enumerable: false,
  61. configurable: true
  62. });
  63. // private m_CompleteFunc: Function;
  64. /**
  65. * 通过 url 设置Spine
  66. * @param bundle
  67. * @param url spine动画 的json文件 路径
  68. * @param extraData
  69. * @returns
  70. */
  71. ResSpine.prototype.setSpineData = function (bundle, url, cb, isPremultipliedAlpha, animationName, loop, speed) {
  72. var _this = this;
  73. if (isPremultipliedAlpha === void 0) { isPremultipliedAlpha = true; }
  74. if (animationName === void 0) { animationName = "standby"; }
  75. if (loop === void 0) { loop = true; }
  76. if (speed === void 0) { speed = 1; }
  77. this._url = url;
  78. this.loadAsset(bundle, url, sp.SkeletonData, function (asset) {
  79. if (asset && _this.spSkeleton && _this.spSkeleton.isValid) {
  80. _this.spSkeleton.skeletonData = asset;
  81. _this.spSkeleton.enableBatch = true;
  82. _this.spSkeleton.premultipliedAlpha = isPremultipliedAlpha;
  83. _this.spSkeleton.loop = loop;
  84. if (_this.spSkeleton.findAnimation(animationName) != null) {
  85. _this.spSkeleton.animation = animationName;
  86. }
  87. _this.spSkeleton.timeScale = speed;
  88. cb && cb(asset);
  89. }
  90. else {
  91. console.warn("\u52A0\u8F7D Spine \u5931\u8D25: " + bundle + " " + url);
  92. cb && cb(null);
  93. }
  94. });
  95. };
  96. ResSpine.prototype.setRoleSpine = function (url1, url2, cb, isPremultipliedAlpha, animationName, loop, speed) {
  97. if (isPremultipliedAlpha === void 0) { isPremultipliedAlpha = true; }
  98. if (animationName === void 0) { animationName = "standby"; }
  99. if (loop === void 0) { loop = true; }
  100. if (speed === void 0) { speed = 1; }
  101. this.setSpineData("spine", url1 + url2 + "/" + url2, cb, isPremultipliedAlpha, animationName, loop, speed);
  102. };
  103. ResSpine.prototype.setAnimation = function (animationName) {
  104. if (this.spSkeleton) {
  105. this.spSkeleton.animation = animationName;
  106. }
  107. };
  108. /**
  109. * 播放动作
  110. * @param aniName 动画名称
  111. * @param loop 是否循环
  112. * @param showLast 显示最后一帧
  113. */
  114. ResSpine.prototype.playAnimation = function (aniName, loop, showLast) {
  115. if (this.spSkeleton) {
  116. if (this.spSkeleton.findAnimation(aniName)) {
  117. this.spSkeleton.setAnimation(0, aniName, loop);
  118. if (showLast) {
  119. this.spSkeleton.timeScale = 100000;
  120. }
  121. }
  122. else {
  123. // console.error("动画名称不存在", this._url, aniName);
  124. }
  125. }
  126. };
  127. /** 是否存在动画 */
  128. ResSpine.prototype.isExistAnimation = function (aniName) {
  129. return this.spSkeleton.findAnimation(aniName) ? true : false;
  130. };
  131. ResSpine.prototype.setTimeScale = function (speed) {
  132. if (this.spSkeleton) {
  133. this.spSkeleton.timeScale = speed;
  134. }
  135. };
  136. ResSpine.prototype.enableBatch = function () {
  137. this.spSkeleton.enableBatch = true;
  138. };
  139. ResSpine.prototype.clearTracks = function () {
  140. if (this.spSkeleton) {
  141. this.spSkeleton.clearTracks();
  142. }
  143. };
  144. ResSpine.prototype.clearRes = function () {
  145. this.spSkeleton.skeletonData = null;
  146. this.resetRes();
  147. };
  148. /** 设置渲染模式 */
  149. ResSpine.prototype.setCacheMode = function (mode) {
  150. this.spSkeleton.setAnimationCacheMode(mode);
  151. };
  152. /** 后续废弃
  153. * 添加播放完成监听
  154. */
  155. ResSpine.prototype.addCompleteListener = function (callback) {
  156. // this.m_CompleteFunc = callback;
  157. this.spSkeleton.setCompleteListener(function (trackEntry, loopCount) {
  158. // this.spSkeleton.setCompleteListener(null);
  159. // if (this.m_CompleteFunc) this.m_CompleteFunc();
  160. // this.m_CompleteFunc = null;
  161. callback(trackEntry, loopCount);
  162. });
  163. };
  164. /**
  165. * 添加播放完成监听
  166. */
  167. ResSpine.prototype.AddSpineCompleteListener = function (callback) {
  168. // this.m_CompleteFunc = callback;
  169. this.spSkeleton.setCompleteListener(function (trackEntry, loopCount) {
  170. var name = trackEntry.animation ? trackEntry.animation.name : '';
  171. callback(name);
  172. });
  173. };
  174. /** 移除完成监听 */
  175. ResSpine.prototype.removeCompleteListener = function () {
  176. var _a;
  177. (_a = this.spSkeleton) === null || _a === void 0 ? void 0 : _a.setCompleteListener(null);
  178. };
  179. /** 添加事件帧监听 */
  180. ResSpine.prototype.addEventListener = function (callback) {
  181. this.spSkeleton.setEventListener(function (trackIndex, event) {
  182. var name = event.data.name;
  183. callback(name);
  184. });
  185. };
  186. /** 移除事件帧监听 */
  187. ResSpine.prototype.removeEventListener = function () {
  188. this.spSkeleton.setEventListener(null);
  189. };
  190. /** 获取插槽节点世界坐标 */
  191. ResSpine.prototype.getSlotWorldPos = function (slotName) {
  192. if (!slotName)
  193. return null;
  194. var slot = this.spSkeleton.findSlot(slotName);
  195. // 输出骨骼点的信息
  196. if (slot) {
  197. // 获取骨骼点的世界变换信息
  198. var worldX = slot.bone.worldX;
  199. var worldY = slot.bone.worldY;
  200. return this.node.convertToWorldSpaceAR(cc.v2(worldX, worldY)); //转换世界坐标
  201. }
  202. else {
  203. // console.error("未找到骨骼点: ", slotName);
  204. return null;
  205. }
  206. };
  207. /** 获取骨骼节点世界坐标 */
  208. ResSpine.prototype.getBoneWorldPos = function (boneName) {
  209. if (!boneName)
  210. return null;
  211. var bone = this.spSkeleton.findBone(boneName);
  212. // 输出骨骼点的信息
  213. if (bone) {
  214. // 获取骨骼点的世界变换信息
  215. var worldX = bone.worldX;
  216. var worldY = bone.worldY;
  217. return this.node.convertToWorldSpaceAR(cc.v2(worldX, worldY)); //转换世界坐标
  218. }
  219. else {
  220. // console.error("未找到骨骼点: ", boneName);
  221. return null;
  222. }
  223. };
  224. ResSpine.prototype.PauseAction = function () {
  225. if (this.spSkeleton && this.spSkeleton.isValid)
  226. this.spSkeleton.paused = true;
  227. };
  228. ResSpine.prototype.ResumeAction = function () {
  229. if (this.spSkeleton && this.spSkeleton.isValid)
  230. this.spSkeleton.paused = false;
  231. };
  232. ResSpine.prototype.StopAction = function () {
  233. if (this.spSkeleton && this.spSkeleton.isValid)
  234. this.spSkeleton.clearTracks();
  235. };
  236. ResSpine = __decorate([
  237. ccclass,
  238. disallowMultiple,
  239. requireComponent(sp.Skeleton),
  240. menu("UI/ResSpine")
  241. ], ResSpine);
  242. return ResSpine;
  243. }(ResBaseAsset_1.ResBaseAsset));
  244. exports.default = ResSpine;
  245. cc._RF.pop();
  246. }
  247. if (nodeEnv) {
  248. __define(__module.exports, __require, __module);
  249. }
  250. else {
  251. __quick_compile_project__.registerModuleFunc(__filename, function () {
  252. __define(__module.exports, __require, __module);
  253. });
  254. }
  255. })();
  256. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0cy9zY3JpcHQvZnJhbWVXb3JrL2NvbXBtZW50L1Jlc1NwaW5lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUNBLCtDQUE4QztBQUV4QyxJQUFBLEtBQXdELEVBQUUsQ0FBQyxVQUFVLEVBQW5FLE9BQU8sYUFBQSxFQUFFLElBQUksVUFBQSxFQUFFLGdCQUFnQixzQkFBQSxFQUFFLGdCQUFnQixzQkFBa0IsQ0FBQztBQUU1RTs7R0FFRztBQUtIO0lBQXNDLDRCQUE2QjtJQUFuRTtRQUFBLHFFQXdMQztRQXZMUSxpQkFBVyxHQUFnQixJQUFJLENBQUM7UUFDaEMsVUFBSSxHQUFXLEVBQUUsQ0FBQzs7SUFzTDNCLENBQUM7SUFyTEEsc0JBQUksZ0NBQVU7YUFBZDs7WUFDQyxPQUFPLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLE9BQUEsSUFBSSxDQUFDLElBQUksMENBQUUsWUFBWSxDQUFDLEVBQUUsQ0FBQyxRQUFRLGFBQUssSUFBSSxDQUFDLElBQUksMENBQUUsWUFBWSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUMsQ0FBQyxDQUFDO1FBQzlILENBQUM7OztPQUFBO0lBQ0Qsc0JBQVcsa0NBQVk7YUFBdkI7WUFDQyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDO1FBQ3JDLENBQUM7OztPQUFBO0lBQ0Qsb0NBQW9DO0lBQ3BDOzs7Ozs7T0FNRztJQUNILCtCQUFZLEdBQVosVUFBK0IsTUFBYyxFQUFFLEdBQVcsRUFBRSxFQUFxQyxFQUFFLG9CQUFvQyxFQUFFLGFBQWlDLEVBQUUsSUFBb0IsRUFBRSxLQUFpQjtRQUFuTixpQkFrQkM7UUFsQmtHLHFDQUFBLEVBQUEsMkJBQW9DO1FBQUUsOEJBQUEsRUFBQSx5QkFBaUM7UUFBRSxxQkFBQSxFQUFBLFdBQW9CO1FBQUUsc0JBQUEsRUFBQSxTQUFpQjtRQUNsTixJQUFJLENBQUMs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Ii8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJY29uVXJsIH0gZnJvbSBcIi4uLy4uL2RhdGEvY29uc3QvUmVzQ29uc3RcIjtcbmltcG9ydCB7IFJlc0Jhc2VBc3NldCB9IGZyb20gXCIuL1Jlc0Jhc2VBc3NldFwiO1xuXG5jb25zdCB7IGNjY2xhc3MsIG1lbnUsIGRpc2FsbG93TXVsdGlwbGUsIHJlcXVpcmVDb21wb25lbnQgfSA9IGNjLl9kZWNvcmF0b3I7XG5cbi8qKlxuICogc3BpbmXnu4Tku7bvvIzoh6rliqjnrqHnkIbotYTmupDnmoTlvJXnlKjorqHmlbBcbiAqL1xuQGNjY2xhc3NcbkBkaXNhbGxvd011bHRpcGxlXG5AcmVxdWlyZUNvbXBvbmVudChzcC5Ta2VsZXRvbilcbkBtZW51KFwiVUkvUmVzU3BpbmVcIilcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlc1NwaW5lIGV4dGVuZHMgUmVzQmFzZUFzc2V0PHNwLlNrZWxldG9uRGF0YT4ge1xuXHRwcml2YXRlIF9zcFNrZWxldG9uOiBzcC5Ta2VsZXRvbiA9IG51bGw7XG5cdHByaXZhdGUgX3VybDogc3RyaW5nID0gJyc7XG5cdGdldCBzcFNrZWxldG9uKCkge1xuXHRcdHJldHVybiB0aGlzLl9zcFNrZWxldG9uIHx8ICh0aGlzLl9zcFNrZWxldG9uID0gdGhpcy5ub2RlPy5nZXRDb21wb25lbnQoc3AuU2tlbGV0b24pIHx8IHRoaXMubm9kZT8uYWRkQ29tcG9uZW50KHNwLlNrZWxldG9uKSk7XG5cdH1cblx0cHVibGljIGdldCBza2VsZXRvbkRhdGEoKSB7XG5cdFx0cmV0dXJuIHRoaXMuc3BTa2VsZXRvbi5za2VsZXRvbkRhdGE7XG5cdH1cblx0Ly8gcHJpdmF0ZSBtX0NvbXBsZXRlRnVuYzogRnVuY3Rpb247XG5cdC8qKlxuXHQgKiDpgJrov4cgdXJsIOiuvue9rlNwaW5lXG5cdCAqIEBwYXJhbSBidW5kbGVcblx0ICogQHBhcmFtIHVybCBzcGluZeWKqOeUuyDnmoRqc29u5paH5Lu2IOi3r+W+hFxuXHQgKiBAcGFyYW0gZXh0cmFEYXRhXG5cdCAqIEByZXR1cm5zXG5cdCAqL1xuXHRzZXRTcGluZURhdGE8RVhUUkFfREFUQSA9IGFueT4oYnVuZGxlOiBzdHJpbmcsIHVybDogc3RyaW5nLCBjYj86IChhc3NldDogc3AuU2tlbGV0b25EYXRhKSA9PiB2b2lkLCBpc1ByZW11bHRpcGxpZWRBbHBoYTogYm9vbGVhbiA9IHRydWUsIGFuaW1hdGlvbk5hbWU6IHN0cmluZyA9IFwic3RhbmRieVwiLCBsb29wOiBib29sZWFuID0gdHJ1ZSwgc3BlZWQ6IG51bWJlciA9IDEpIHtcblx0XHR0aGlzLl91cmwgPSB1cmw7XG5cdFx0dGhpcy5sb2FkQXNzZXQoYnVuZGxlLCB1cmwsIHNwLlNrZWxldG9uRGF0YSwgKGFzc2V0OiBzcC5Ta2VsZXRvbkRhdGEpID0+IHtcblx0XHRcdGlmIChhc3NldCAmJiB0aGlzLnNwU2tlbGV0b24gJiYgdGhpcy5zcFNrZWxldG9uLmlzVmFsaWQpIHtcblx0XHRcdFx0dGhpcy5zcFNrZWxldG9uLnNrZWxldG9uRGF0YSA9IGFzc2V0O1xuXHRcdFx0XHR0aGlzLnNwU2tlbGV0b24uZW5hYmxlQmF0Y2ggPSB0cnVlO1xuXHRcdFx0XHR0aGlzLnNwU2tlbGV0b24ucHJlbXVsdGlwbGllZEFscGhhID0gaXNQcmVtdWx0aXBsaWVkQWxwaGE7XG5cdFx0XHRcdHRoaXMuc3BTa2VsZXRvbi5sb29wID0gbG9vcDtcblx0XHRcdFx0aWYgKHRoaXMuc3BTa2VsZXRvbi5maW5kQW5pbWF0aW9uKGFuaW1hdGlvbk5hbWUpICE9IG51bGwpIHtcblx0XHRcdFx0XHR0aGlzLnNwU2tlbGV0b24uYW5pbWF0aW9uID0gYW5pbWF0aW9uTmFtZTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLnNwU2tlbGV0b24udGltZVNjYWxlID0gc3BlZWQ7XG5cdFx0XHRcdGNiICYmIGNiKGFzc2V0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnNvbGUud2Fybihg5Yqg6L29IFNwaW5lIOWksei0pTogJHtidW5kbGV9ICR7dXJsfWApO1xuXHRcdFx0XHRjYiAmJiBjYihudWxsKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdHNldFJvbGVTcGluZSh1cmwxOiBJY29uVXJsLCB1cmwyOiBzdHJpbmcsIGNiPzogKGFzc2V0OiBzcC5Ta2VsZXRvbkRhdGEpID0+IHZvaWQsIGlzUHJlbXVsdGlwbGllZEFscGhhOiBib29sZWFuID0gdHJ1ZSwgYW5pbWF0aW9uTmFtZTogc3RyaW5nID0gXCJzdGFuZGJ5XCIsIGxvb3A6IGJvb2xlYW4gPSB0cnVlLCBzcGVlZDogbnVtYmVyID0gMSkge1xuXHRcdHRoaXMuc2V0U3BpbmVEYXRhKFwic3BpbmVcIiwgdXJsMSArIHVybDIgKyBcIi9cIiArIHVybDIsIGNiLCBpc1ByZW11bHRpcGxpZWRBbHBoYSwgYW5pbWF0aW9uTmFtZSwgbG9vcCwgc3BlZWQpO1xuXHR9XG5cblx0c2V0QW5pbWF0aW9uKGFuaW1hdGlvbk5hbWU6IHN0cmluZykge1xuXHRcdGlmICh0aGlzLnNwU2tlbGV0b24pIHtcblx0XHRcdHRoaXMuc3BTa2VsZXRvbi5hbmltYXRpb24gPSBhbmltYXRpb25OYW1lO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiDmkq3mlL7liqjkvZxcblx0ICogQHBhcmFtIGFuaU5hbWUg5Yqo55S75ZCN56ewXG5cdCAqIEBwYXJhbSBsb29wIOaYr+WQpuW+queOr1xuXHQgKiBAcGFyYW0gc2hvd0xhc3Qg5pi+56S65pyA5ZCO5LiA5binXG5cdCAqL1xuXHRwbGF5QW5pbWF0aW9uKGFuaU5hbWU6IHN0cmluZywgbG9vcDogYm9vbGVhbiwgc2hvd0xhc3Q/OiBib29sZWFuKSB7XG5cdFx0aWYgKHRoaXMuc3BTa2VsZXRvbikge1xuXHRcdFx0aWYgKHRoaXMuc3BTa2VsZXRvbi5maW5kQW5pbWF0aW9uKGFuaU5hbWUpKSB7XG5cdFx0XHRcdHRoaXMuc3BTa2VsZXRvbi5zZXRBbmltYXRpb24oMCwgYW5pTmFtZSwgbG9vcCk7XG5cdFx0XHRcdGlmIChzaG93TGFzdCkge1xuXHRcdFx0XHRcdHRoaXMuc3BTa2VsZXRvbi50aW1lU2NhbGUgPSAxMDAwMDA7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIGNvbnNvbGUuZXJyb3IoXCLliqjnlLvlkI3np7DkuI3lrZjlnKhcIiwgdGhpcy5fdXJsLCBhbmlOYW1lKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKiog5piv5ZCm5a2Y5Zyo5Yqo55S7ICovXG5cdGlzRXhpc3RBbmltYXRpb24oYW5pTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuc3BTa2VsZXRvbi5maW5kQW5pbWF0aW9uKGFuaU5hbWUpID8gdHJ1ZSA6IGZhbHNlO1xuXHR9XG5cblx0c2V0VGltZVNjYWxlKHNwZWVkOiBudW1iZXIpIHtcblx0XHRpZiAodGhpcy5zcFNrZWxldG9uKSB7XG5cdFx0XHR0aGlzLnNwU2tlbGV0b24udGltZVNjYWxlID0gc3BlZWQ7XG5cdFx0fVxuXHR9XG5cblx0ZW5hYmxlQmF0Y2goKSB7XG5cdFx0dGhpcy5zcFNrZWxldG9uLmVuYWJsZUJhdGNoID0gdHJ1ZTtcblx0fVxuXG5cdGNsZWFyVHJhY2tzKCkge1xuXHRcdGlmICh0aGlzLnNwU2tlbGV0b24pIHtcblx0XHRcdHRoaXMuc3BTa2VsZXRvbi5jbGVhclRyYWNrcygpXG5cdFx0fVxuXHR9XG5cdGNsZWFyUmVzKCkge1xuXHRcdHRoaXMuc3BTa2VsZXRvbi5za2VsZXRvbkRhdGEgPSBudWxsO1xuXHRcdHRoaXMucmVzZXRSZXMoKTtcblx0fVxuXG5cdC8qKiDorr7nva7muLLmn5PmqKHlvI8gKi9cblx0c2V0Q2FjaGVNb2RlKG1vZGU6IHNwLlNrZWxldG9uLkFuaW1hdGlvbkNhY2hlTW9kZSkge1xuXHRcdHRoaXMuc3BTa2VsZXRvbi5zZXRBbmltYXRpb25DYWNoZU1vZGUobW9kZSk7XG5cdH1cblxuXHQvKiog5ZCO57ut5bqf5byDXG5cdCAqIOa3u+WKoOaSreaUvuWujOaIkOebkeWQrCBcblx0ICovXG5cdGFkZENvbXBsZXRlTGlzdGVuZXIoY2FsbGJhY2s6IEZ1bmN0aW9uKSB7XG5cdFx0Ly8gdGhpcy5tX0NvbXBsZXRlRnVuYyA9IGNhbGxiYWNrO1xuXHRcdHRoaXMuc3BTa2VsZXRvbi5zZXRDb21wbGV0ZUxpc3RlbmVyKCh0cmFja0VudHJ5LCBsb29wQ291bnQpID0+IHtcblx0XHRcdC8vIHRoaXMuc3BTa2VsZXRvbi5zZXRDb21wbGV0ZUxpc3RlbmVyKG51bGwpO1xuXHRcdFx0Ly8gaWYgKHRoaXMubV9Db21wbGV0ZUZ1bmMpIHRoaXMubV9Db21wbGV0ZUZ1bmMoKTtcblx0XHRcdC8vIHRoaXMubV9Db21wbGV0ZUZ1bmMgPSBudWxsO1xuXHRcdFx0Y2FsbGJhY2sodHJhY2tFbnRyeSwgbG9vcENvdW50KTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKiBcblx0ICog5re75Yqg5pKt5pS+5a6M5oiQ55uR5ZCsIFxuXHQgKi9cblx0QWRkU3BpbmVDb21wbGV0ZUxpc3RlbmVyKGNhbGxiYWNrOiBGdW5jdGlvbikge1xuXHRcdC8vIHRoaXMubV9Db21wbGV0ZUZ1bmMgPSBjYWxsYmFjaztcblx0XHR0aGlzLnNwU2tlbGV0b24uc2V0Q29tcGxldGVMaXN0ZW5lcigodHJhY2tFbnRyeSwgbG9vcENvdW50KSA9PiB7XG5cdFx0XHRsZXQgbmFtZSA9IHRyYWNrRW50cnkuYW5pbWF0aW9uID8gdHJhY2tFbnRyeS5hbmltYXRpb24ubmFtZSA6ICcnO1xuXHRcdFx0Y2FsbGJhY2sobmFtZSk7XG5cdFx0fSk7XG5cdH1cblxuXHQvKiog56e76Zmk5a6M5oiQ55uR5ZCsICovXG5cdHJlbW92ZUNvbXBsZXRlTGlzdGVuZXIoKSB7XG5cdFx0dGhpcy5zcFNrZWxldG9uPy5zZXRDb21wbGV0ZUxpc3RlbmVyKG51bGwpO1xuXHR9XG5cblx0LyoqIOa3u+WKoOS6i+S7tuW4p+ebkeWQrCAqL1xuXHRhZGRFdmVudExpc3RlbmVyKGNhbGxiYWNrOiBGdW5jdGlvbik6IHZvaWQge1xuXHRcdHRoaXMuc3BTa2VsZXRvbi5zZXRFdmVudExpc3RlbmVyKCh0cmFja0luZGV4LCBldmVudDogYW55KSA9PiB7XG5cdFx0XHRsZXQgbmFtZSA9IGV2ZW50LmRhdGEubmFtZTtcblx0XHRcdGNhbGxiYWNrKG5hbWUpO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqIOenu+mZpOS6i+S7tuW4p+ebkeWQrCAqL1xuXHRyZW1vdmVFdmVudExpc3RlbmVyKCkge1xuXHRcdHRoaXMuc3BTa2VsZXRvbi5zZXRFdmVudExpc3RlbmVyKG51bGwpO1xuXHR9XG5cblx0LyoqIOiOt+WPluaPkuanveiKgueCueS4lueVjOWdkOaghyAqL1xuXHRnZXRTbG90V29ybGRQb3Moc2xvdE5hbWU6IHN0cmluZyk6IGNjLlZlYzIge1xuXHRcdGlmICghc2xvdE5hbWUpIHJldHVybiBudWxsO1xuXHRcdGxldCBzbG90OiBzcC5zcGluZS5TbG90ID0gdGhpcy5zcFNrZWxldG9uLmZpbmRTbG90KHNsb3ROYW1lKTtcblx0XHQvLyDovpPlh7rpqqjpqrzngrnnmoTkv6Hmga9cblx0XHRpZiAoc2xvdCkge1xuXHRcdFx0Ly8g6I635Y+W6aqo6aq854K555qE5LiW55WM5Y+Y5o2i5L+h5oGvXG5cdFx0XHRjb25zdCB3b3JsZFggPSBzbG90LmJvbmUud29ybGRYO1xuXHRcdFx0Y29uc3Qgd29ybGRZID0gc2xvdC5ib25lLndvcmxkWTtcblx0XHRcdHJldHVybiB0aGlzLm5vZGUuY29udmVydFRvV29ybGRTcGFjZUFSKGNjLnYyKHdvcmxkWCwgd29ybGRZKSk7IC8v6L2s5o2i5LiW55WM5Z2Q5qCHXG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIGNvbnNvbGUuZXJyb3IoXCLmnKrmib7liLDpqqjpqrzngrk6IFwiLCBzbG90TmFtZSk7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cdH1cblxuXHQvKiog6I635Y+W6aqo6aq86IqC54K55LiW55WM5Z2Q5qCHICovXG5cdGdldEJvbmVXb3JsZFBvcyhib25lTmFtZTogc3RyaW5nKTogY2MuVmVjMiB7XG5cdFx0aWYgKCFib25lTmFtZSkgcmV0dXJuIG51bGw7XG5cdFx0bGV0IGJvbmU6IHNwLnNwaW5lLkJvbmUgPSB0aGlzLnNwU2tlbGV0b24uZmluZEJvbmUoYm9uZU5hbWUpO1xuXHRcdC8vIOi+k+WHuumqqOmqvOeCueeahOS/oeaBr1xuXHRcdGlmIChib25lKSB7XG5cdFx0XHQvLyDojrflj5bpqqjpqrzngrnnmoTkuJbnlYzlj5jmjaLkv6Hmga9cblx0XHRcdGNvbnN0IHdvcmxkWCA9IGJvbmUud29ybGRYO1xuXHRcdFx0Y29uc3Qgd29ybGRZID0gYm9uZS53b3JsZFk7XG5cdFx0XHRyZXR1cm4gdGhpcy5ub2RlLmNvbnZlcnRUb1dvcmxkU3BhY2VBUihjYy52Mih3b3JsZFgsIHdvcmxkWSkpOyAvL+i9rOaNouS4lueVjOWdkOagh1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBjb25zb2xlLmVycm9yKFwi5pyq5om+5Yiw6aqo6aq854K5OiBcIiwgYm9uZU5hbWUpO1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXHR9XG5cblx0UGF1c2VBY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMuc3BTa2VsZXRvbiAmJiB0aGlzLnNwU2tlbGV0b24uaXNWYWxpZClcblx0XHRcdHRoaXMuc3BTa2VsZXRvbi5wYXVzZWQgPSB0cnVlO1xuXHR9XG5cblx0UmVzdW1lQWN0aW9uKCkge1xuXHRcdGlmICh0aGlzLnNwU2tlbGV0b24gJiYgdGhpcy5zcFNrZWxldG9uLmlzVmFsaWQpXG5cdFx0XHR0aGlzLnNwU2tlbGV0b24ucGF1c2VkID0gZmFsc2U7XG5cdH1cblxuXHRTdG9wQWN0aW9uKCkge1xuXHRcdGlmICh0aGlzLnNwU2tlbGV0b24gJiYgdGhpcy5zcFNrZWxldG9uLmlzVmFsaWQpXG5cdFx0XHR0aGlzLnNwU2tlbGV0b24uY2xlYXJUcmFja3MoKTtcblx0fVxufVxuIl19