triggers.js 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. /**
  2. * @fileoverview added by tsickle
  3. * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
  4. */
  5. import { Observable, merge } from 'rxjs';
  6. import { share, filter, delay, map } from 'rxjs/operators';
  7. var Trigger = /** @class */ (function () {
  8. function Trigger(open, close) {
  9. this.open = open;
  10. this.close = close;
  11. if (!close) {
  12. this.close = open;
  13. }
  14. }
  15. /**
  16. * @return {?}
  17. */
  18. Trigger.prototype.isManual = /**
  19. * @return {?}
  20. */
  21. function () { return this.open === 'manual' || this.close === 'manual'; };
  22. return Trigger;
  23. }());
  24. export { Trigger };
  25. if (false) {
  26. /** @type {?} */
  27. Trigger.prototype.open;
  28. /** @type {?} */
  29. Trigger.prototype.close;
  30. }
  31. /** @type {?} */
  32. var DEFAULT_ALIASES = {
  33. 'hover': ['mouseenter', 'mouseleave'],
  34. 'focus': ['focusin', 'focusout'],
  35. };
  36. /**
  37. * @param {?} triggers
  38. * @param {?=} aliases
  39. * @return {?}
  40. */
  41. export function parseTriggers(triggers, aliases) {
  42. if (aliases === void 0) { aliases = DEFAULT_ALIASES; }
  43. /** @type {?} */
  44. var trimmedTriggers = (triggers || '').trim();
  45. if (trimmedTriggers.length === 0) {
  46. return [];
  47. }
  48. /** @type {?} */
  49. var parsedTriggers = trimmedTriggers.split(/\s+/).map((/**
  50. * @param {?} trigger
  51. * @return {?}
  52. */
  53. function (trigger) { return trigger.split(':'); })).map((/**
  54. * @param {?} triggerPair
  55. * @return {?}
  56. */
  57. function (triggerPair) {
  58. /** @type {?} */
  59. var alias = aliases[triggerPair[0]] || triggerPair;
  60. return new Trigger(alias[0], alias[1]);
  61. }));
  62. /** @type {?} */
  63. var manualTriggers = parsedTriggers.filter((/**
  64. * @param {?} triggerPair
  65. * @return {?}
  66. */
  67. function (triggerPair) { return triggerPair.isManual(); }));
  68. if (manualTriggers.length > 1) {
  69. throw 'Triggers parse error: only one manual trigger is allowed';
  70. }
  71. if (manualTriggers.length === 1 && parsedTriggers.length > 1) {
  72. throw 'Triggers parse error: manual trigger can\'t be mixed with other triggers';
  73. }
  74. return parsedTriggers;
  75. }
  76. /**
  77. * @param {?} renderer
  78. * @param {?} nativeElement
  79. * @param {?} triggers
  80. * @param {?} isOpenedFn
  81. * @return {?}
  82. */
  83. export function observeTriggers(renderer, nativeElement, triggers, isOpenedFn) {
  84. return new Observable((/**
  85. * @param {?} subscriber
  86. * @return {?}
  87. */
  88. function (subscriber) {
  89. /** @type {?} */
  90. var listeners = [];
  91. /** @type {?} */
  92. var openFn = (/**
  93. * @return {?}
  94. */
  95. function () { return subscriber.next(true); });
  96. /** @type {?} */
  97. var closeFn = (/**
  98. * @return {?}
  99. */
  100. function () { return subscriber.next(false); });
  101. /** @type {?} */
  102. var toggleFn = (/**
  103. * @return {?}
  104. */
  105. function () { return subscriber.next(!isOpenedFn()); });
  106. triggers.forEach((/**
  107. * @param {?} trigger
  108. * @return {?}
  109. */
  110. function (trigger) {
  111. if (trigger.open === trigger.close) {
  112. listeners.push(renderer.listen(nativeElement, trigger.open, toggleFn));
  113. }
  114. else {
  115. listeners.push(renderer.listen(nativeElement, trigger.open, openFn), renderer.listen(nativeElement, trigger.close, closeFn));
  116. }
  117. }));
  118. return (/**
  119. * @return {?}
  120. */
  121. function () { listeners.forEach((/**
  122. * @param {?} unsubscribeFn
  123. * @return {?}
  124. */
  125. function (unsubscribeFn) { return unsubscribeFn(); })); });
  126. }));
  127. }
  128. /** @type {?} */
  129. var delayOrNoop = (/**
  130. * @template T
  131. * @param {?} time
  132. * @return {?}
  133. */
  134. function (time) { return time > 0 ? delay(time) : (/**
  135. * @param {?} a
  136. * @return {?}
  137. */
  138. function (a) { return a; }); });
  139. var ɵ0 = delayOrNoop;
  140. /**
  141. * @param {?} openDelay
  142. * @param {?} closeDelay
  143. * @param {?} isOpenedFn
  144. * @return {?}
  145. */
  146. export function triggerDelay(openDelay, closeDelay, isOpenedFn) {
  147. return (/**
  148. * @param {?} input$
  149. * @return {?}
  150. */
  151. function (input$) {
  152. /** @type {?} */
  153. var pending = null;
  154. /** @type {?} */
  155. var filteredInput$ = input$.pipe(map((/**
  156. * @param {?} open
  157. * @return {?}
  158. */
  159. function (open) { return ({ open: open }); })), filter((/**
  160. * @param {?} event
  161. * @return {?}
  162. */
  163. function (event) {
  164. /** @type {?} */
  165. var currentlyOpen = isOpenedFn();
  166. if (currentlyOpen !== event.open && (!pending || pending.open === currentlyOpen)) {
  167. pending = event;
  168. return true;
  169. }
  170. if (pending && pending.open !== event.open) {
  171. pending = null;
  172. }
  173. return false;
  174. })), share());
  175. /** @type {?} */
  176. var delayedOpen$ = filteredInput$.pipe(filter((/**
  177. * @param {?} event
  178. * @return {?}
  179. */
  180. function (event) { return event.open; })), delayOrNoop(openDelay));
  181. /** @type {?} */
  182. var delayedClose$ = filteredInput$.pipe(filter((/**
  183. * @param {?} event
  184. * @return {?}
  185. */
  186. function (event) { return !event.open; })), delayOrNoop(closeDelay));
  187. return merge(delayedOpen$, delayedClose$)
  188. .pipe(filter((/**
  189. * @param {?} event
  190. * @return {?}
  191. */
  192. function (event) {
  193. if (event === pending) {
  194. pending = null;
  195. return event.open !== isOpenedFn();
  196. }
  197. return false;
  198. })), map((/**
  199. * @param {?} event
  200. * @return {?}
  201. */
  202. function (event) { return event.open; })));
  203. });
  204. }
  205. /**
  206. * @param {?} renderer
  207. * @param {?} nativeElement
  208. * @param {?} triggers
  209. * @param {?} isOpenedFn
  210. * @param {?} openFn
  211. * @param {?} closeFn
  212. * @param {?=} openDelay
  213. * @param {?=} closeDelay
  214. * @return {?}
  215. */
  216. export function listenToTriggers(renderer, nativeElement, triggers, isOpenedFn, openFn, closeFn, openDelay, closeDelay) {
  217. if (openDelay === void 0) { openDelay = 0; }
  218. if (closeDelay === void 0) { closeDelay = 0; }
  219. /** @type {?} */
  220. var parsedTriggers = parseTriggers(triggers);
  221. if (parsedTriggers.length === 1 && parsedTriggers[0].isManual()) {
  222. return (/**
  223. * @return {?}
  224. */
  225. function () { });
  226. }
  227. /** @type {?} */
  228. var subscription = observeTriggers(renderer, nativeElement, parsedTriggers, isOpenedFn)
  229. .pipe(triggerDelay(openDelay, closeDelay, isOpenedFn))
  230. .subscribe((/**
  231. * @param {?} open
  232. * @return {?}
  233. */
  234. function (open) { return (open ? openFn() : closeFn()); }));
  235. return (/**
  236. * @return {?}
  237. */
  238. function () { return subscription.unsubscribe(); });
  239. }
  240. export { ɵ0 };
  241. //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJpZ2dlcnMuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcC8iLCJzb3VyY2VzIjpbInV0aWwvdHJpZ2dlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBQyxVQUFVLEVBQUUsS0FBSyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUV6RDtJQUNFLGlCQUFtQixJQUFZLEVBQVMsS0FBYztRQUFuQyxTQUFJLEdBQUosSUFBSSxDQUFRO1FBQVMsVUFBSyxHQUFMLEtBQUssQ0FBUztRQUNwRCxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1YsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7U0FDbkI7SUFDSCxDQUFDOzs7O0lBRUQsMEJBQVE7OztJQUFSLGNBQWEsT0FBTyxJQUFJLENBQUMsSUFBSSxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDMUUsY0FBQztBQUFELENBQUMsQUFSRCxJQVFDOzs7O0lBUGEsdUJBQW1COztJQUFFLHdCQUFxQjs7O0lBU2xELGVBQWUsR0FBRztJQUN0QixPQUFPLEVBQUUsQ0FBQyxZQUFZLEVBQUUsWUFBWSxDQUFDO0lBQ3JDLE9BQU8sRUFBRSxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUM7Q0FDakM7Ozs7OztBQUVELE1BQU0sVUFBVSxhQUFhLENBQUMsUUFBZ0IsRUFBRSxPQUF5QjtJQUF6Qix3QkFBQSxFQUFBLHlCQUF5Qjs7UUFDakUsZUFBZSxHQUFHLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRTtJQUUvQyxJQUFJLGVBQWUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQ2hDLE9BQU8sRUFBRSxDQUFDO0tBQ1g7O1FBRUssY0FBYyxHQUFH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SyxDQUFDO1FBQ2YsQ0FBQyxFQUFDLEVBQ0YsR0FBRzs7OztRQUFDLFVBQUEsS0FBSyxJQUFJLE9BQUEsS0FBSyxDQUFDLElBQUksRUFBVixDQUFVLEVBQUMsQ0FBQyxDQUFDO0lBQ3BDLENBQUMsRUFBQztBQUNKLENBQUM7Ozs7Ozs7Ozs7OztBQUVELE1BQU0sVUFBVSxnQkFBZ0IsQ0FDNUIsUUFBYSxFQUFFLGFBQWtCLEVBQUUsUUFBZ0IsRUFBRSxVQUF5QixFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsU0FBYSxFQUM5RyxVQUFjO0lBRG1GLDBCQUFBLEVBQUEsYUFBYTtJQUM5RywyQkFBQSxFQUFBLGNBQWM7O1FBQ1YsY0FBYyxHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQUM7SUFFOUMsSUFBSSxjQUFjLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7UUFDL0Q7OztRQUFPLGNBQU8sQ0FBQyxFQUFDO0tBQ2pCOztRQUVLLFlBQVksR0FBRyxlQUFlLENBQUMsUUFBUSxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsVUFBVSxDQUFDO1NBQy9ELElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztTQUNyRCxTQUFTOzs7O0lBQUMsVUFBQSxJQUFJLElBQUksT0FBQSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQTdCLENBQTZCLEVBQUM7SUFFMUU7OztJQUFPLGNBQU0sT0FBQSxZQUFZLENBQUMsV0FBVyxFQUFFLEVBQTFCLENBQTBCLEVBQUM7QUFDMUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7T2JzZXJ2YWJsZSwgbWVyZ2V9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtzaGFyZSwgZmlsdGVyLCBkZWxheSwgbWFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmV4cG9ydCBjbGFzcyBUcmlnZ2VyIHtcbiAgY29uc3RydWN0b3IocHVibGljIG9wZW46IHN0cmluZywgcHVibGljIGNsb3NlPzogc3RyaW5nKSB7XG4gICAgaWYgKCFjbG9zZSkge1xuICAgICAgdGhpcy5jbG9zZSA9IG9wZW47XG4gICAgfVxuICB9XG5cbiAgaXNNYW51YWwoKSB7IHJldHVybiB0aGlzLm9wZW4gPT09ICdtYW51YWwnIHx8IHRoaXMuY2xvc2UgPT09ICdtYW51YWwnOyB9XG59XG5cbmNvbnN0IERFRkFVTFRfQUxJQVNFUyA9IHtcbiAgJ2hvdmVyJzogWydtb3VzZWVudGVyJywgJ21vdXNlbGVhdmUnXSxcbiAgJ2ZvY3VzJzogWydmb2N1c2luJywgJ2ZvY3Vzb3V0J10sXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VUcmlnZ2Vycyh0cmlnZ2Vyczogc3RyaW5nLCBhbGlhc2VzID0gREVGQVVMVF9BTElBU0VTKTogVHJpZ2dlcltdIHtcbiAgY29uc3QgdHJpbW1lZFRyaWdnZXJzID0gKHRyaWdnZXJzIHx8ICcnKS50cmltKCk7XG5cbiAgaWYgKHRyaW1tZWRUcmlnZ2Vycy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBwYXJzZWRUcmlnZ2VycyA9IHRyaW1tZWRUcmlnZ2Vycy5zcGxpdCgvXFxzKy8pLm1hcCh0cmlnZ2VyID0+IHRyaWdnZXIuc3BsaXQoJzonKSkubWFwKCh0cmlnZ2VyUGFpcikgPT4ge1xuICAgIGxldCBhbGlhcyA9IGFsaWFzZXNbdHJpZ2dlclBhaXJbMF1dIHx8IHRyaWdnZXJQYWlyO1xuICAgIHJldHVybiBuZXcgVHJpZ2dlcihhbGlhc1swXSwgYWxpYXNbMV0pO1xuICB9KTtcblxuICBjb25zdCBtYW51YWxUcmlnZ2VycyA9IHBhcnNlZFRyaWdnZXJzLmZpbHRlcih0cmlnZ2VyUGFpciA9PiB0cmlnZ2VyUGFpci5pc01hbnVhbCgpKTtcblxuICBpZiAobWFudWFsVHJpZ2dlcnMubGVuZ3RoID4gMSkge1xuICAgIHRocm93ICdUcmlnZ2VycyBwYXJzZSBlcnJvcjogb25seSBvbmUgbWFudWFsIHRyaWdnZXIgaXMgYWxsb3dlZCc7XG4gIH1cblxuICBpZiAobWFudWFsVHJpZ2dlcnMubGVuZ3RoID09PSAxICYmIHBhcnNlZFRyaWdnZXJzLmxlbmd0aCA+IDEpIHtcbiAgICB0aHJvdyAnVHJpZ2dlcnMgcGFyc2UgZXJyb3I6IG1hbnVhbCB0cmlnZ2VyIGNhblxcJ3QgYmUgbWl4ZWQgd2l0aCBvdGhlciB0cmlnZ2Vycyc7XG4gIH1cblxuICByZXR1cm4gcGFyc2VkVHJpZ2dlcnM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvYnNlcnZlVHJpZ2dlcnMocmVuZGVyZXI6IGFueSwgbmF0aXZlRWxlbWVudDogYW55LCB0cmlnZ2VyczogVHJpZ2dlcltdLCBpc09wZW5lZEZuOiAoKSA9PiBib29sZWFuKSB7XG4gIHJldHVybiBuZXcgT2JzZXJ2YWJsZTxib29sZWFuPihzdWJzY3JpYmVyID0+IHtcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSBbXTtcbiAgICBjb25zdCBvcGVuRm4gPSAoKSA9PiBzdWJzY3JpYmVyLm5leHQodHJ1ZSk7XG4gICAgY29uc3QgY2xvc2VGbiA9ICgpID0+IHN1YnNjcmliZXIubmV4dChmYWxzZSk7XG4gICAgY29uc3QgdG9nZ2xlRm4gPSAoKSA9PiBzdWJzY3JpYmVyLm5leHQoIWlzT3BlbmVkRm4oKSk7XG5cbiAgICB0cmlnZ2Vycy5mb3JFYWNoKCh0cmlnZ2VyOiBUcmlnZ2VyKSA9PiB7XG4gICAgICBpZiAodHJpZ2dlci5vcGVuID09PSB0cmlnZ2VyLmNsb3NlKSB7XG4gICAgICAgIGxpc3RlbmVycy5wdXNoKHJlbmRlcmVyLmxpc3RlbihuYXRpdmVFbGVtZW50LCB0cmlnZ2VyLm9wZW4sIHRvZ2dsZUZuKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaXN0ZW5lcnMucHVzaChcbiAgICAgICAgICAgIHJlbmRlcmVyLmxpc3RlbihuYXRpdmVFbGVtZW50LCB0cmlnZ2VyLm9wZW4sIG9wZW5GbiksXG4gICAgICAgICAgICByZW5kZXJlci5saXN0ZW4obmF0aXZlRWxlbWVudCwgdHJpZ2dlci5jbG9zZSwgY2xvc2VGbikpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuICgpID0+IHsgbGlzdGVuZXJzLmZvckVhY2godW5zdWJzY3JpYmVGbiA9PiB1bnN1YnNjcmliZUZuKCkpOyB9O1xuICB9KTtcbn1cblxuY29uc3QgZGVsYXlPck5vb3AgPSA8VD4odGltZTogbnVtYmVyKSA9PiB0aW1lID4gMCA/IGRlbGF5PFQ+KHRpbWUpIDogKGE6IE9ic2VydmFibGU8VD4pID0+IGE7XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmlnZ2VyRGVsYXkob3BlbkRlbGF5OiBudW1iZXIsIGNsb3NlRGVsYXk6IG51bWJlciwgaXNPcGVuZWRGbjogKCkgPT4gYm9vbGVhbikge1xuICByZXR1cm4gKGlucHV0JDogT2JzZXJ2YWJsZTxib29sZWFuPikgPT4ge1xuICAgIGxldCBwZW5kaW5nID0gbnVsbDtcbiAgICBjb25zdCBmaWx0ZXJlZElucHV0JCA9IGlucHV0JC5waXBlKFxuICAgICAgICBtYXAob3BlbiA9PiAoe29wZW59KSksIGZpbHRlcihldmVudCA9PiB7XG4gICAgICAgICAgY29uc3QgY3VycmVudGx5T3BlbiA9IGlzT3BlbmVkRm4oKTtcbiAgICAgICAgICBpZiAoY3VycmVudGx5T3BlbiAhPT0gZXZlbnQub3BlbiAmJiAoIXBlbmRpbmcgfHwgcGVuZGluZy5vcGVuID09PSBjdXJyZW50bHlPcGVuKSkge1xuICAgICAgICAgICAgcGVuZGluZyA9IGV2ZW50O1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwZW5kaW5nICYmIHBlbmRpbmcub3BlbiAhPT0gZXZlbnQub3Blbikge1xuICAgICAgICAgICAgcGVuZGluZyA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSksXG4gICAgICAgIHNoYXJlKCkpO1xuICAgIGNvbnN0IGRlbGF5ZWRPcGVuJCA9IGZpbHRlcmVkSW5wdXQkLnBpcGUoZmlsdGVyKGV2ZW50ID0+IGV2ZW50Lm9wZW4pLCBkZWxheU9yTm9vcChvcGVuRGVsYXkpKTtcbiAgICBjb25zdCBkZWxheWVkQ2xvc2UkID0gZmlsdGVyZWRJbnB1dCQucGlwZShmaWx0ZXIoZXZlbnQgPT4gIWV2ZW50Lm9wZW4pLCBkZWxheU9yTm9vcChjbG9zZURlbGF5KSk7XG4gICAgcmV0dXJuIG1lcmdlKGRlbGF5ZWRPcGVuJCwgZGVsYXllZENsb3NlJClcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICBmaWx0ZXIoZXZlbnQgPT4ge1xuICAgICAgICAgICAgICBpZiAoZXZlbnQgPT09IHBlbmRpbmcpIHtcbiAgICAgICAgICAgICAgICBwZW5kaW5nID0gbnVsbDtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXZlbnQub3BlbiAhPT0gaXNPcGVuZWRGbigpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbWFwKGV2ZW50ID0+IGV2ZW50Lm9wZW4pKTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxpc3RlblRvVHJpZ2dlcnMoXG4gICAgcmVuZGVyZXI6IGFueSwgbmF0aXZlRWxlbWVudDogYW55LCB0cmlnZ2Vyczogc3RyaW5nLCBpc09wZW5lZEZuOiAoKSA9PiBib29sZWFuLCBvcGVuRm4sIGNsb3NlRm4sIG9wZW5EZWxheSA9IDAsXG4gICAgY2xvc2VEZWxheSA9IDApIHtcbiAgY29uc3QgcGFyc2VkVHJpZ2dlcnMgPSBwYXJzZVRyaWdnZXJzKHRyaWdnZXJzKTtcblxuICBpZiAocGFyc2VkVHJpZ2dlcnMubGVuZ3RoID09PSAxICYmIHBhcnNlZFRyaWdnZXJzWzBdLmlzTWFudWFsKCkpIHtcbiAgICByZXR1cm4gKCkgPT4ge307XG4gIH1cblxuICBjb25zdCBzdWJzY3JpcHRpb24gPSBvYnNlcnZlVHJpZ2dlcnMocmVuZGVyZXIsIG5hdGl2ZUVsZW1lbnQsIHBhcnNlZFRyaWdnZXJzLCBpc09wZW5lZEZuKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBpcGUodHJpZ2dlckRlbGF5KG9wZW5EZWxheSwgY2xvc2VEZWxheSwgaXNPcGVuZWRGbikpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKG9wZW4gPT4gKG9wZW4gPyBvcGVuRm4oKSA6IGNsb3NlRm4oKSkpO1xuXG4gIHJldHVybiAoKSA9PiBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbn1cbiJdfQ==