long-press.directive.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. /**
  2. * @fileoverview added by tsickle
  3. * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
  4. */
  5. import { Directive, Input, Output, EventEmitter, HostBinding, HostListener } from '@angular/core';
  6. import { fromEvent } from 'rxjs';
  7. import { takeUntil } from 'rxjs/operators';
  8. import { MouseEvent } from '../events';
  9. var LongPressDirective = /** @class */ (function () {
  10. function LongPressDirective() {
  11. this.pressEnabled = true;
  12. this.duration = 500;
  13. this.longPressStart = new EventEmitter();
  14. this.longPressing = new EventEmitter();
  15. this.longPressEnd = new EventEmitter();
  16. this.mouseX = 0;
  17. this.mouseY = 0;
  18. }
  19. Object.defineProperty(LongPressDirective.prototype, "press", {
  20. get: /**
  21. * @return {?}
  22. */
  23. function () {
  24. return this.pressing;
  25. },
  26. enumerable: true,
  27. configurable: true
  28. });
  29. Object.defineProperty(LongPressDirective.prototype, "isLongPress", {
  30. get: /**
  31. * @return {?}
  32. */
  33. function () {
  34. return this.isLongPressing;
  35. },
  36. enumerable: true,
  37. configurable: true
  38. });
  39. /**
  40. * @param {?} event
  41. * @return {?}
  42. */
  43. LongPressDirective.prototype.onMouseDown = /**
  44. * @param {?} event
  45. * @return {?}
  46. */
  47. function (event) {
  48. var _this = this;
  49. // don't do right/middle clicks
  50. if (event.which !== 1 || !this.pressEnabled)
  51. return;
  52. // don't start drag if its on resize handle
  53. /** @type {?} */
  54. var target = (/** @type {?} */ (event.target));
  55. if (target.classList.contains('resize-handle'))
  56. return;
  57. this.mouseX = event.clientX;
  58. this.mouseY = event.clientY;
  59. this.pressing = true;
  60. this.isLongPressing = false;
  61. /** @type {?} */
  62. var mouseup = fromEvent(document, 'mouseup');
  63. this.subscription = mouseup.subscribe((/**
  64. * @param {?} ev
  65. * @return {?}
  66. */
  67. function (ev) { return _this.onMouseup(); }));
  68. this.timeout = setTimeout((/**
  69. * @return {?}
  70. */
  71. function () {
  72. _this.isLongPressing = true;
  73. _this.longPressStart.emit({
  74. event: event,
  75. model: _this.pressModel
  76. });
  77. _this.subscription.add(fromEvent(document, 'mousemove')
  78. .pipe(takeUntil(mouseup))
  79. .subscribe((/**
  80. * @param {?} mouseEvent
  81. * @return {?}
  82. */
  83. function (mouseEvent) { return _this.onMouseMove(mouseEvent); })));
  84. _this.loop(event);
  85. }), this.duration);
  86. this.loop(event);
  87. };
  88. /**
  89. * @param {?} event
  90. * @return {?}
  91. */
  92. LongPressDirective.prototype.onMouseMove = /**
  93. * @param {?} event
  94. * @return {?}
  95. */
  96. function (event) {
  97. if (this.pressing && !this.isLongPressing) {
  98. /** @type {?} */
  99. var xThres = Math.abs(event.clientX - this.mouseX) > 10;
  100. /** @type {?} */
  101. var yThres = Math.abs(event.clientY - this.mouseY) > 10;
  102. if (xThres || yThres) {
  103. this.endPress();
  104. }
  105. }
  106. };
  107. /**
  108. * @param {?} event
  109. * @return {?}
  110. */
  111. LongPressDirective.prototype.loop = /**
  112. * @param {?} event
  113. * @return {?}
  114. */
  115. function (event) {
  116. var _this = this;
  117. if (this.isLongPressing) {
  118. this.timeout = setTimeout((/**
  119. * @return {?}
  120. */
  121. function () {
  122. _this.longPressing.emit({
  123. event: event,
  124. model: _this.pressModel
  125. });
  126. _this.loop(event);
  127. }), 50);
  128. }
  129. };
  130. /**
  131. * @return {?}
  132. */
  133. LongPressDirective.prototype.endPress = /**
  134. * @return {?}
  135. */
  136. function () {
  137. clearTimeout(this.timeout);
  138. this.isLongPressing = false;
  139. this.pressing = false;
  140. this._destroySubscription();
  141. this.longPressEnd.emit({
  142. model: this.pressModel
  143. });
  144. };
  145. /**
  146. * @return {?}
  147. */
  148. LongPressDirective.prototype.onMouseup = /**
  149. * @return {?}
  150. */
  151. function () {
  152. this.endPress();
  153. };
  154. /**
  155. * @return {?}
  156. */
  157. LongPressDirective.prototype.ngOnDestroy = /**
  158. * @return {?}
  159. */
  160. function () {
  161. this._destroySubscription();
  162. };
  163. /**
  164. * @private
  165. * @return {?}
  166. */
  167. LongPressDirective.prototype._destroySubscription = /**
  168. * @private
  169. * @return {?}
  170. */
  171. function () {
  172. if (this.subscription) {
  173. this.subscription.unsubscribe();
  174. this.subscription = undefined;
  175. }
  176. };
  177. LongPressDirective.decorators = [
  178. { type: Directive, args: [{ selector: '[long-press]' },] }
  179. ];
  180. LongPressDirective.propDecorators = {
  181. pressEnabled: [{ type: Input }],
  182. pressModel: [{ type: Input }],
  183. duration: [{ type: Input }],
  184. longPressStart: [{ type: Output }],
  185. longPressing: [{ type: Output }],
  186. longPressEnd: [{ type: Output }],
  187. press: [{ type: HostBinding, args: ['class.press',] }],
  188. isLongPress: [{ type: HostBinding, args: ['class.longpress',] }],
  189. onMouseDown: [{ type: HostListener, args: ['mousedown', ['$event'],] }]
  190. };
  191. return LongPressDirective;
  192. }());
  193. export { LongPressDirective };
  194. if (false) {
  195. /** @type {?} */
  196. LongPressDirective.prototype.pressEnabled;
  197. /** @type {?} */
  198. LongPressDirective.prototype.pressModel;
  199. /** @type {?} */
  200. LongPressDirective.prototype.duration;
  201. /** @type {?} */
  202. LongPressDirective.prototype.longPressStart;
  203. /** @type {?} */
  204. LongPressDirective.prototype.longPressing;
  205. /** @type {?} */
  206. LongPressDirective.prototype.longPressEnd;
  207. /** @type {?} */
  208. LongPressDirective.prototype.pressing;
  209. /** @type {?} */
  210. LongPressDirective.prototype.isLongPressing;
  211. /** @type {?} */
  212. LongPressDirective.prototype.timeout;
  213. /** @type {?} */
  214. LongPressDirective.prototype.mouseX;
  215. /** @type {?} */
  216. LongPressDirective.prototype.mouseY;
  217. /** @type {?} */
  218. LongPressDirective.prototype.subscription;
  219. }
  220. //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9uZy1wcmVzcy5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac3dpbWxhbmUvbmd4LWRhdGF0YWJsZS8iLCJzb3VyY2VzIjpbImxpYi9kaXJlY3RpdmVzL2xvbmctcHJlc3MuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDN0csT0FBTyxFQUE0QixTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFdkM7SUFBQTtRQUVXLGlCQUFZLEdBQVksSUFBSSxDQUFDO1FBRTdCLGFBQVEsR0FBVyxHQUFHLENBQUM7UUFFdEIsbUJBQWMsR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUN2RCxpQkFBWSxHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ3JELGlCQUFZLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFLL0QsV0FBTSxHQUFXLENBQUMsQ0FBQztRQUNuQixXQUFNLEdBQVcsQ0FBQyxDQUFDO0lBbUdyQixDQUFDO0lBL0ZDLHNCQUNJLHFDQUFLOzs7O1FBRFQ7WUFFRSxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDdkIsQ0FBQzs7O09BQUE7SUFFRCxzQkFDSSwyQ0FBVzs7OztRQURmO1lBRUUsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBQzdCLENBQUM7OztPQUFBOzs7OztJQUdELHdDQUFXOzs7O0lBRFgsVUFDWSxLQUFpQjtRQUQ3QixpQkFtQ0M7UUFqQ0MsK0JBQStCO1FBQy9CLElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWTtZQUFFLE9BQU87OztZQUc5QyxNQUFNLEdBQUcsbUJBQWEsS0FBSyxDQUFDLE1BQU0sRUFBQTtRQUN4QyxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQztZQUFFLE9BQU87UUFFdkQsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO1FBQzVCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUU1QixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNyQixJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQzs7WUFFdEIsT0FBTyxHQUFHLFNBQVMsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDO1FBQzlDLElBQUksQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDLFNBQVM7Ozs7UUFBQyxVQUFDLEVBQWMsSUFBSyxPQUFBLEtBQUksQ0FBQyxTQUFTLEVBQUUsRUFBaEIsQ0FBZ0IsRUFBQyxDQUFDO1FBRTVFLElBQUksQ0FBQyxPQUFPLEdBQUcsVUFBVTs7O1FBQUM7WUFDeEIsS0FBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7WUFDM0IsS0FBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUM7Z0JBQ3ZCLEtBQUssT0FBQTtnQkFDTCxLQUFLLEVBQUUsS0FBSSxDQUFDLFVBQVU7YUFDdkIsQ0FBQyxDQUFDO1lBRUgsS0FBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQ25CLFNBQVMsQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDO2lCQUM3QixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUN4QixTQUFTOzs7O1lBQUMsVUFBQyxVQUFzQixJQUFLLE9BQUEsS0FBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsRUFBNUIsQ0FBNEIsRUFBQyxDQUN2RSxDQUFDO1lBRUYsS0FBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuQixDQUFDLEdBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRWxCLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkIsQ0FBQzs7Ozs7SUFFRCx3Q0FBVzs7OztJQUFYLFVBQVksS0FBaUI7UUFDM0IsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTs7Z0JBQ25DLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7O2dCQUNuRCxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFO1lBRXpELElBQUksTUFBTSxJQUFJLE1BQU0sRUFBRTtnQkFDcEIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2FBQ2pCO1NBQ0Y7SUFDSCxDQUFDOzs7OztJQUVELGlDQUFJOzs7O0lBQUosVUFBSyxLQUFpQjtRQUF0QixpQkFVQztRQVRDLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUN2QixJQUFJLENBQUMsT0FBTyxHQUFHLFVBQVU7OztZQUFDO2dCQUN4QixLQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztvQkFDckIsS0FBSyxPQUFBO29CQUNMLEtBQUssRUFBRSxLQUFJLENBQUMsVUFBVTtpQkFDdkIsQ0FBQyxDQUFDO2dCQUNILEtBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbkIsQ0FBQyxHQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQ1I7SUFDSCxDQUFDOzs7O0lBRUQscUNBQVE7OztJQUFSO1FBQ0UsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztRQUM1QixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUN0QixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUU1QixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztZQUNyQixLQUFLLEVBQUUsSUFBSSxDQUFDLFVBQVU7U0FDdkIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7OztJQUVELHNDQUFTOzs7SUFBVDtRQUNFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNsQixDQUFDOzs7O0lBRUQsd0NBQVc7OztJQUFYO1FBQ0UsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDOUIsQ0FBQzs7Ozs7SUFFTyxpREFBb0I7Ozs7SUFBNUI7UUFDRSxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDckIsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsWUFBWSxHQUFHLFNBQVMsQ0FBQztTQUMvQjtJQUNILENBQUM7O2dCQWhIRixTQUFTLFNBQUMsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFOzs7K0JBRXBDLEtBQUs7NkJBQ0wsS0FBSzsyQkFDTCxLQUFLO2lDQUVMLE1BQU07K0JBQ04sTUFBTTsrQkFDTixNQUFNO3dCQVVOLFdBQVcsU0FBQyxhQUFhOzhCQUt6QixXQUFXLFNBQUMsaUJBQWlCOzhCQUs3QixZQUFZLFNBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDOztJQXFGdkMseUJBQUM7Q0FBQSxBQWpIRCxJQWlIQztTQWhIWSxrQkFBa0I7OztJQUM3QiwwQ0FBc0M7O0lBQ3RDLHdDQUF5Qjs7SUFDekIsc0NBQWdDOztJQUVoQyw0Q0FBaUU7O0lBQ2pFLDBDQUErRDs7SUFDL0QsMENBQStEOztJQUUvRCxzQ0FBa0I7O0lBQ2xCLDRDQUF3Qjs7SUFDeEIscUNBQWE7O0lBQ2Isb0NBQW1COztJQUNuQixvQ0FBbUI7O0lBRW5CLDBDQUEyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBIb3N0QmluZGluZywgSG9zdExpc3RlbmVyLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiwgZnJvbUV2ZW50IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBNb3VzZUV2ZW50IH0gZnJvbSAnLi4vZXZlbnRzJztcblxuQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW2xvbmctcHJlc3NdJyB9KVxuZXhwb3J0IGNsYXNzIExvbmdQcmVzc0RpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIHByZXNzRW5hYmxlZDogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIHByZXNzTW9kZWw6IGFueTtcbiAgQElucHV0KCkgZHVyYXRpb246IG51bWJlciA9IDUwMDtcblxuICBAT3V0cHV0KCkgbG9uZ1ByZXNzU3RhcnQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgbG9uZ1ByZXNzaW5nOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGxvbmdQcmVzc0VuZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgcHJlc3Npbmc6IGJvb2xlYW47XG4gIGlzTG9uZ1ByZXNzaW5nOiBib29sZWFuO1xuICB0aW1lb3V0OiBhbnk7XG4gIG1vdXNlWDogbnVtYmVyID0gMDtcbiAgbW91c2VZOiBudW1iZXIgPSAwO1xuXG4gIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MucHJlc3MnKVxuICBnZXQgcHJlc3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucHJlc3Npbmc7XG4gIH1cblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmxvbmdwcmVzcycpXG4gIGdldCBpc0xvbmdQcmVzcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0xvbmdQcmVzc2luZztcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ21vdXNlZG93bicsIFsnJGV2ZW50J10pXG4gIG9uTW91c2VEb3duKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgLy8gZG9uJ3QgZG8gcmlnaHQvbWlkZGxlIGNsaWNrc1xuICAgIGlmIChldmVudC53aGljaCAhPT0gMSB8fCAhdGhpcy5wcmVzc0VuYWJsZWQpIHJldHVybjtcblxuICAgIC8vIGRvbid0IHN0YXJ0IGRyYWcgaWYgaXRzIG9uIHJlc2l6ZSBoYW5kbGVcbiAgICBjb25zdCB0YXJnZXQgPSA8SFRNTEVsZW1lbnQ+ZXZlbnQudGFyZ2V0O1xuICAgIGlmICh0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdyZXNpemUtaGFuZGxlJykpIHJldHVybjtcblxuICAgIHRoaXMubW91c2VYID0gZXZlbnQuY2xpZW50WDtcbiAgICB0aGlzLm1vdXNlWSA9IGV2ZW50LmNsaWVudFk7XG5cbiAgICB0aGlzLnByZXNzaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmlzTG9uZ1ByZXNzaW5nID0gZmFsc2U7XG5cbiAgICBjb25zdCBtb3VzZXVwID0gZnJvbUV2ZW50KGRvY3VtZW50LCAnbW91c2V1cCcpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gbW91c2V1cC5zdWJzY3JpYmUoKGV2OiBNb3VzZUV2ZW50KSA9PiB0aGlzLm9uTW91c2V1cCgpKTtcblxuICAgIHRoaXMudGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5pc0xvbmdQcmVzc2luZyA9IHRydWU7XG4gICAgICB0aGlzLmxvbmdQcmVzc1N0YXJ0LmVtaXQoe1xuICAgICAgICBldmVudCxcbiAgICAgICAgbW9kZWw6IHRoaXMucHJlc3NNb2RlbFxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgICAgZnJvbUV2ZW50KGRvY3VtZW50LCAnbW91c2Vtb3ZlJylcbiAgICAgICAgICAucGlwZSh0YWtlVW50aWwobW91c2V1cCkpXG4gICAgICAgICAgLnN1YnNjcmliZSgobW91c2VFdmVudDogTW91c2VFdmVudCkgPT4gdGhpcy5vbk1vdXNlTW92ZShtb3VzZUV2ZW50KSlcbiAgICAgICk7XG5cbiAgICAgIHRoaXMubG9vcChldmVudCk7XG4gICAgfSwgdGhpcy5kdXJhdGlvbik7XG5cbiAgICB0aGlzLmxvb3AoZXZlbnQpO1xuICB9XG5cbiAgb25Nb3VzZU1vdmUoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wcmVzc2luZyAmJiAhdGhpcy5pc0xvbmdQcmVzc2luZykge1xuICAgICAgY29uc3QgeFRocmVzID0gTWF0aC5hYnMoZXZlbnQuY2xpZW50WCAtIHRoaXMubW91c2VYKSA+IDEwO1xuICAgICAgY29uc3QgeVRocmVzID0gTWF0aC5hYnMoZXZlbnQuY2xpZW50WSAtIHRoaXMubW91c2VZKSA+IDEwO1xuXG4gICAgICBpZiAoeFRocmVzIHx8IHlUaHJlcykge1xuICAgICAgICB0aGlzLmVuZFByZXNzKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbG9vcChldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzTG9uZ1ByZXNzaW5nKSB7XG4gICAgICB0aGlzLnRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5sb25nUHJlc3NpbmcuZW1pdCh7XG4gICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgbW9kZWw6IHRoaXMucHJlc3NNb2RlbFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5sb29wKGV2ZW50KTtcbiAgICAgIH0sIDUwKTtcbiAgICB9XG4gIH1cblxuICBlbmRQcmVzcygpOiB2b2lkIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KTtcbiAgICB0aGlzLmlzTG9uZ1ByZXNzaW5nID0gZmFsc2U7XG4gICAgdGhpcy5wcmVzc2luZyA9IGZhbHNlO1xuICAgIHRoaXMuX2Rlc3Ryb3lTdWJzY3JpcHRpb24oKTtcblxuICAgIHRoaXMubG9uZ1ByZXNzRW5kLmVtaXQoe1xuICAgICAgbW9kZWw6IHRoaXMucHJlc3NNb2RlbFxuICAgIH0pO1xuICB9XG5cbiAgb25Nb3VzZXVwKCk6IHZvaWQge1xuICAgIHRoaXMuZW5kUHJlc3MoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX2Rlc3Ryb3lTdWJzY3JpcHRpb24oKTtcbiAgfVxuXG4gIHByaXZhdGUgX2Rlc3Ryb3lTdWJzY3JpcHRpb24oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG59XG4iXX0=