ngx-modialog-10
Version:
Modal / Dialog for Angular
274 lines • 17.9 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/components/base-dynamic-component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Subject } from 'rxjs';
import { filter } from 'rxjs/operators';
import { createComponent } from '../framework/createComponent';
/** @type {?} */
var BROWSER_PREFIX = ['webkit', 'moz', 'MS', 'o', ''];
/**
* @param {?} eventName
* @param {?} element
* @param {?} cb
* @return {?}
*/
function register(eventName, element, cb) {
BROWSER_PREFIX.forEach((/**
* @param {?} p
* @return {?}
*/
function (p) {
element.addEventListener(p ? p + eventName : eventName.toLowerCase(), cb, false);
}));
}
/**
* A base class for supporting dynamic components.
* There are 3 main support areas:
* 1 - Easy wrapper for dynamic styling via CSS classes and inline styles.
* 2 - Easy wrapper for interception of transition/animation end events.
* 3 - Easy wrapper for component creation and injection.
*
* Dynamic css is done via direct element manipulation (via renderer), it does not use change detection
* or binding. This is to allow better control over animation.
*
* Animation support is limited, only transition/keyframes END even are notified.
* The animation support is needed since currently the angular animation module is limited as well and
* does not support CSS animation that are not pre-parsed and are not in the styles metadata of a component.
*
* Capabilities: Add/Remove styls, Add/Remove classes, listen to animation/transition end event,
* add components
*/
var /**
* A base class for supporting dynamic components.
* There are 3 main support areas:
* 1 - Easy wrapper for dynamic styling via CSS classes and inline styles.
* 2 - Easy wrapper for interception of transition/animation end events.
* 3 - Easy wrapper for component creation and injection.
*
* Dynamic css is done via direct element manipulation (via renderer), it does not use change detection
* or binding. This is to allow better control over animation.
*
* Animation support is limited, only transition/keyframes END even are notified.
* The animation support is needed since currently the angular animation module is limited as well and
* does not support CSS animation that are not pre-parsed and are not in the styles metadata of a component.
*
* Capabilities: Add/Remove styls, Add/Remove classes, listen to animation/transition end event,
* add components
*/
BaseDynamicComponent = /** @class */ (function () {
function BaseDynamicComponent(el, renderer) {
this.el = el;
this.renderer = renderer;
}
/**
* @return {?}
*/
BaseDynamicComponent.prototype.activateAnimationListener = /**
* @return {?}
*/
function () {
var _this = this;
if (this.animationEnd) {
return;
}
this.animationEnd = new Subject();
this.animationEnd$ = this.animationEnd.asObservable();
register('TransitionEnd', this.el.nativeElement, (/**
* @param {?} e
* @return {?}
*/
function (e) { return _this.onEnd(e); }));
register('AnimationEnd', this.el.nativeElement, (/**
* @param {?} e
* @return {?}
*/
function (e) { return _this.onEnd(e); }));
};
/**
* Set a specific inline style on the overlay host element.
* @param prop The style key
* @param value The value, undefined to remove
*/
/**
* Set a specific inline style on the overlay host element.
* @template THIS
* @this {THIS}
* @param {?} prop The style key
* @param {?} value The value, undefined to remove
* @return {THIS}
*/
BaseDynamicComponent.prototype.setStyle = /**
* Set a specific inline style on the overlay host element.
* @template THIS
* @this {THIS}
* @param {?} prop The style key
* @param {?} value The value, undefined to remove
* @return {THIS}
*/
function (prop, value) {
(/** @type {?} */ (this)).renderer.setStyle((/** @type {?} */ (this)).el.nativeElement, prop, value);
return (/** @type {?} */ (this));
};
/**
* @return {?}
*/
BaseDynamicComponent.prototype.forceReflow = /**
* @return {?}
*/
function () {
this.el.nativeElement.offsetWidth;
};
/**
* @param {?} css
* @param {?=} forceReflow
* @return {?}
*/
BaseDynamicComponent.prototype.addClass = /**
* @param {?} css
* @param {?=} forceReflow
* @return {?}
*/
function (css, forceReflow) {
var _this = this;
if (forceReflow === void 0) { forceReflow = false; }
css.split(' ')
.forEach((/**
* @param {?} c
* @return {?}
*/
function (c) { return _this.renderer.addClass(_this.el.nativeElement, c); }));
if (forceReflow) {
this.forceReflow();
}
};
/**
* @param {?} css
* @param {?=} forceReflow
* @return {?}
*/
BaseDynamicComponent.prototype.removeClass = /**
* @param {?} css
* @param {?=} forceReflow
* @return {?}
*/
function (css, forceReflow) {
var _this = this;
if (forceReflow === void 0) { forceReflow = false; }
css.split(' ')
.forEach((/**
* @param {?} c
* @return {?}
*/
function (c) { return _this.renderer.removeClass(_this.el.nativeElement, c); }));
if (forceReflow) {
this.forceReflow();
}
};
/**
* @return {?}
*/
BaseDynamicComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
if (this.animationEnd && !this.animationEnd.closed) {
this.animationEnd.complete();
}
};
/**
* @return {?}
*/
BaseDynamicComponent.prototype.myAnimationEnd$ = /**
* @return {?}
*/
function () {
var _this = this;
return this.animationEnd$.pipe(filter((/**
* @param {?} e
* @return {?}
*/
function (e) { return e.target === _this.el.nativeElement; })));
};
/**
* Add a component, supply a view container ref.
* Note: The components vcRef will result in a sibling.
*/
/**
* Add a component, supply a view container ref.
* Note: The components vcRef will result in a sibling.
* @protected
* @template T
* @param {?} instructions
* @return {?}
*/
BaseDynamicComponent.prototype._addComponent = /**
* Add a component, supply a view container ref.
* Note: The components vcRef will result in a sibling.
* @protected
* @template T
* @param {?} instructions
* @return {?}
*/
function (instructions) {
/** @type {?} */
var cmpRef = createComponent(instructions);
cmpRef.changeDetectorRef.detectChanges();
return cmpRef;
};
/**
* @private
* @param {?} event
* @return {?}
*/
BaseDynamicComponent.prototype.onEnd = /**
* @private
* @param {?} event
* @return {?}
*/
function (event) {
if (!this.animationEnd.closed) {
this.animationEnd.next(event);
}
};
return BaseDynamicComponent;
}());
/**
* A base class for supporting dynamic components.
* There are 3 main support areas:
* 1 - Easy wrapper for dynamic styling via CSS classes and inline styles.
* 2 - Easy wrapper for interception of transition/animation end events.
* 3 - Easy wrapper for component creation and injection.
*
* Dynamic css is done via direct element manipulation (via renderer), it does not use change detection
* or binding. This is to allow better control over animation.
*
* Animation support is limited, only transition/keyframes END even are notified.
* The animation support is needed since currently the angular animation module is limited as well and
* does not support CSS animation that are not pre-parsed and are not in the styles metadata of a component.
*
* Capabilities: Add/Remove styls, Add/Remove classes, listen to animation/transition end event,
* add components
*/
export { BaseDynamicComponent };
if (false) {
/** @type {?} */
BaseDynamicComponent.prototype.animationEnd$;
/**
* @type {?}
* @protected
*/
BaseDynamicComponent.prototype.animationEnd;
/**
* @type {?}
* @protected
*/
BaseDynamicComponent.prototype.el;
/**
* @type {?}
* @protected
*/
BaseDynamicComponent.prototype.renderer;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1keW5hbWljLWNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1tb2RpYWxvZy0xMC8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL2Jhc2UtZHluYW1pYy1jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQVF4QyxPQUFPLEVBQUUsZUFBZSxFQUF1QixNQUFNLDhCQUE4QixDQUFDOztJQUU5RSxjQUFjLEdBQUcsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDOzs7Ozs7O0FBRXZELFNBQVMsUUFBUSxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsRUFBRTtJQUN0QyxjQUFjLENBQUMsT0FBTzs7OztJQUFDLFVBQUEsQ0FBQztRQUN0QixPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ25GLENBQUMsRUFBQyxDQUFDO0FBQ0wsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBbUJEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFLRSw4QkFBc0IsRUFBYyxFQUNkLFFBQW1CO1FBRG5CLE9BQUUsR0FBRixFQUFFLENBQVk7UUFDZCxhQUFRLEdBQVIsUUFBUSxDQUFXO0lBQ3pDLENBQUM7Ozs7SUFFRCx3REFBeUI7OztJQUF6QjtRQUFBLGlCQVFDO1FBUEMsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3JCLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxPQUFPLEVBQW9DLENBQUM7UUFDcEUsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3RELFFBQVEsQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhOzs7O1FBQUUsVUFBQyxDQUFrQixJQUFLLE9BQUEsS0FBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBYixDQUFhLEVBQUMsQ0FBQztRQUN4RixRQUFRLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYTs7OztRQUFFLFVBQUMsQ0FBaUIsSUFBSyxPQUFBLEtBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQWIsQ0FBYSxFQUFDLENBQUM7SUFDeEYsQ0FBQztJQUVEOzs7O09BSUc7Ozs7Ozs7OztJQUNILHVDQUFROzs7Ozs7OztJQUFSLFVBQVMsSUFBWSxFQUFFLEtBQWE7UUFDbEMsbUJBQUEsSUFBSSxFQUFBLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxtQkFBQSxJQUFJLEVBQUEsQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMzRCxPQUFPLG1CQUFBLElBQUksRUFBQSxDQUFDO0lBQ2QsQ0FBQzs7OztJQUVELDBDQUFXOzs7SUFBWDtRQUNFLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQztJQUNwQyxDQUFDOzs7Ozs7SUFFRCx1Q0FBUTs7Ozs7SUFBUixVQUFTLEdBQVcsRUFBRSxXQUE0QjtRQUFsRCxpQkFNQztRQU5xQiw0QkFBQSxFQUFBLG1CQUE0QjtRQUNoRCxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQzthQUNYLE9BQU87Ozs7UUFBQyxVQUFBLENBQUMsSUFBSSxPQUFBLEtBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxFQUFoRCxDQUFnRCxFQUFDLENBQUM7UUFDbEUsSUFBSSxXQUFXLEVBQUU7WUFDZixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDcEI7SUFDSCxDQUFDOzs7Ozs7SUFFRCwwQ0FBVzs7Ozs7SUFBWCxVQUFZLEdBQVcsRUFBRSxXQUE0QjtRQUFyRCxpQkFNQztRQU53Qiw0QkFBQSxFQUFBLG1CQUE0QjtRQUNuRCxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQzthQUNYLE9BQU87Ozs7UUFBQyxVQUFBLENBQUMsSUFBSSxPQUFBLEtBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEtBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxFQUFuRCxDQUFtRCxFQUFDLENBQUM7UUFDckUsSUFBSSxXQUFXLEVBQUU7WUFDZixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDcEI7SUFDSCxDQUFDOzs7O0lBRUQsMENBQVc7OztJQUFYO1FBQ0UsSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUU7WUFDbEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUM5QjtJQUNILENBQUM7Ozs7SUFFRCw4Q0FBZTs7O0lBQWY7UUFBQSxpQkFJQztRQUhDLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQzVCLE1BQU07Ozs7UUFBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxNQUFNLEtBQUssS0FBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQWxDLENBQWtDLEVBQUMsQ0FDaEQsQ0FBQztJQUNKLENBQUM7SUFFRDs7O09BR0c7Ozs7Ozs7OztJQUNPLDRDQUFhOzs7Ozs7OztJQUF2QixVQUEyQixZQUFpQzs7WUFDcEQsTUFBTSxHQUFHLGVBQWUsQ0FBQyxZQUFZLENBQUM7UUFDNUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsRUFBRSxDQUFDO1FBRXpDLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7Ozs7OztJQUdPLG9DQUFLOzs7OztJQUFiLFVBQWMsS0FBdUM7UUFFbkQsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFO1lBQzdCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQy9CO0lBQ0gsQ0FBQztJQUVILDJCQUFDO0FBQUQsQ0FBQyxBQWhGRCxJQWdGQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBL0VDLDZDQUE0RDs7Ozs7SUFFNUQsNENBQWtFOzs7OztJQUV0RCxrQ0FBd0I7Ozs7O0lBQ3hCLHdDQUE2QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7XG4gIENvbXBvbmVudFJlZixcbiAgRWxlbWVudFJlZixcbiAgT25EZXN0cm95LFxuICBSZW5kZXJlcjJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IGNyZWF0ZUNvbXBvbmVudCwgQ3JlYXRlQ29tcG9uZW50QXJncyB9IGZyb20gJy4uL2ZyYW1ld29yay9jcmVhdGVDb21wb25lbnQnO1xuXG5jb25zdCBCUk9XU0VSX1BSRUZJWCA9IFsnd2Via2l0JywgJ21veicsICdNUycsICdvJywgJyddO1xuXG5mdW5jdGlvbiByZWdpc3RlcihldmVudE5hbWUsIGVsZW1lbnQsIGNiKSB7XG4gIEJST1dTRVJfUFJFRklYLmZvckVhY2gocCA9PiB7XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHAgPyBwICsgZXZlbnROYW1lIDogZXZlbnROYW1lLnRvTG93ZXJDYXNlKCksIGNiLCBmYWxzZSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEEgYmFzZSBjbGFzcyBmb3Igc3VwcG9ydGluZyBkeW5hbWljIGNvbXBvbmVudHMuXG4gKiBUaGVyZSBhcmUgMyBtYWluIHN1cHBvcnQgYXJlYXM6XG4gKiAxIC0gRWFzeSB3cmFwcGVyIGZvciBkeW5hbWljIHN0eWxpbmcgdmlhIENTUyBjbGFzc2VzIGFuZCBpbmxpbmUgc3R5bGVzLlxuICogMiAtIEVhc3kgd3JhcHBlciBmb3IgaW50ZXJjZXB0aW9uIG9mIHRyYW5zaXRpb24vYW5pbWF0aW9uIGVuZCBldmVudHMuXG4gKiAzIC0gRWFzeSB3cmFwcGVyIGZvciBjb21wb25lbnQgY3JlYXRpb24gYW5kIGluamVjdGlvbi5cbiAqXG4gKiBEeW5hbWljIGNzcyBpcyBkb25lIHZpYSBkaXJlY3QgZWxlbWVudCBtYW5pcHVsYXRpb24gKHZpYSByZW5kZXJlciksIGl0IGRvZXMgbm90IHVzZSBjaGFuZ2UgZGV0ZWN0aW9uXG4gKiBvciBiaW5kaW5nLiBUaGlzIGlzIHRvIGFsbG93IGJldHRlciBjb250cm9sIG92ZXIgYW5pbWF0aW9uLlxuICpcbiAqIEFuaW1hdGlvbiBzdXBwb3J0IGlzIGxpbWl0ZWQsIG9ubHkgdHJhbnNpdGlvbi9rZXlmcmFtZXMgRU5EIGV2ZW4gYXJlIG5vdGlmaWVkLlxuICogVGhlIGFuaW1hdGlvbiBzdXBwb3J0IGlzIG5lZWRlZCBzaW5jZSBjdXJyZW50bHkgdGhlIGFuZ3VsYXIgYW5pbWF0aW9uIG1vZHVsZSBpcyBsaW1pdGVkIGFzIHdlbGwgYW5kXG4gKiBkb2VzIG5vdCBzdXBwb3J0IENTUyBhbmltYXRpb24gdGhhdCBhcmUgbm90IHByZS1wYXJzZWQgYW5kIGFyZSBub3QgaW4gdGhlIHN0eWxlcyBtZXRhZGF0YSBvZiBhIGNvbXBvbmVudC5cbiAqXG4gKiBDYXBhYmlsaXRpZXM6IEFkZC9SZW1vdmUgc3R5bHMsIEFkZC9SZW1vdmUgY2xhc3NlcywgbGlzdGVuIHRvIGFuaW1hdGlvbi90cmFuc2l0aW9uIGVuZCBldmVudCxcbiAqIGFkZCBjb21wb25lbnRzXG4gKi9cbmV4cG9ydCBjbGFzcyBCYXNlRHluYW1pY0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIGFuaW1hdGlvbkVuZCQ6IE9ic2VydmFibGU8VHJhbnNpdGlvbkV2ZW50IHwgQW5pbWF0aW9uRXZlbnQ+O1xuXG4gIHByb3RlY3RlZCBhbmltYXRpb25FbmQ6IFN1YmplY3Q8VHJhbnNpdGlvbkV2ZW50IHwgQW5pbWF0aW9uRXZlbnQ+O1xuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBlbDogRWxlbWVudFJlZixcbiAgICAgICAgICAgICAgcHJvdGVjdGVkIHJlbmRlcmVyOiBSZW5kZXJlcjIpIHtcbiAgfVxuXG4gIGFjdGl2YXRlQW5pbWF0aW9uTGlzdGVuZXIoKSB7XG4gICAgaWYgKHRoaXMuYW5pbWF0aW9uRW5kKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuYW5pbWF0aW9uRW5kID0gbmV3IFN1YmplY3Q8VHJhbnNpdGlvbkV2ZW50IHwgQW5pbWF0aW9uRXZlbnQ+KCk7XG4gICAgdGhpcy5hbmltYXRpb25FbmQkID0gdGhpcy5hbmltYXRpb25FbmQuYXNPYnNlcnZhYmxlKCk7XG4gICAgcmVnaXN0ZXIoJ1RyYW5zaXRpb25FbmQnLCB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsIChlOiBUcmFuc2l0aW9uRXZlbnQpID0+IHRoaXMub25FbmQoZSkpO1xuICAgIHJlZ2lzdGVyKCdBbmltYXRpb25FbmQnLCB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsIChlOiBBbmltYXRpb25FdmVudCkgPT4gdGhpcy5vbkVuZChlKSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGEgc3BlY2lmaWMgaW5saW5lIHN0eWxlIG9uIHRoZSBvdmVybGF5IGhvc3QgZWxlbWVudC5cbiAgICogQHBhcmFtIHByb3AgVGhlIHN0eWxlIGtleVxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlLCB1bmRlZmluZWQgdG8gcmVtb3ZlXG4gICAqL1xuICBzZXRTdHlsZShwcm9wOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB0aGlzIHtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgcHJvcCwgdmFsdWUpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZm9yY2VSZWZsb3coKSB7XG4gICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoO1xuICB9XG5cbiAgYWRkQ2xhc3MoY3NzOiBzdHJpbmcsIGZvcmNlUmVmbG93OiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICBjc3Muc3BsaXQoJyAnKVxuICAgICAgLmZvckVhY2goYyA9PiB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgYykpO1xuICAgIGlmIChmb3JjZVJlZmxvdykge1xuICAgICAgdGhpcy5mb3JjZVJlZmxvdygpO1xuICAgIH1cbiAgfVxuXG4gIHJlbW92ZUNsYXNzKGNzczogc3RyaW5nLCBmb3JjZVJlZmxvdzogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XG4gICAgY3NzLnNwbGl0KCcgJylcbiAgICAgIC5mb3JFYWNoKGMgPT4gdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsIGMpKTtcbiAgICBpZiAoZm9yY2VSZWZsb3cpIHtcbiAgICAgIHRoaXMuZm9yY2VSZWZsb3coKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hbmltYXRpb25FbmQgJiYgIXRoaXMuYW5pbWF0aW9uRW5kLmNsb3NlZCkge1xuICAgICAgdGhpcy5hbmltYXRpb25FbmQuY29tcGxldGUoKTtcbiAgICB9XG4gIH1cblxuICBteUFuaW1hdGlvbkVuZCQoKTogT2JzZXJ2YWJsZTxBbmltYXRpb25FdmVudCB8IFRyYW5zaXRpb25FdmVudD4ge1xuICAgIHJldHVybiB0aGlzLmFuaW1hdGlvbkVuZCQucGlwZShcbiAgICAgIGZpbHRlcihlID0+IGUudGFyZ2V0ID09PSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBjb21wb25lbnQsIHN1cHBseSBhIHZpZXcgY29udGFpbmVyIHJlZi5cbiAgICogTm90ZTogVGhlIGNvbXBvbmVudHMgdmNSZWYgd2lsbCByZXN1bHQgaW4gYSBzaWJsaW5nLlxuICAgKi9cbiAgcHJvdGVjdGVkIF9hZGRDb21wb25lbnQ8VD4oaW5zdHJ1Y3Rpb25zOiBDcmVhdGVDb21wb25lbnRBcmdzKTogQ29tcG9uZW50UmVmPFQ+IHtcbiAgICBjb25zdCBjbXBSZWYgPSBjcmVhdGVDb21wb25lbnQoaW5zdHJ1Y3Rpb25zKTtcbiAgICBjbXBSZWYuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgcmV0dXJuIGNtcFJlZjtcbiAgfVxuXG5cbiAgcHJpdmF0ZSBvbkVuZChldmVudDogVHJhbnNpdGlvbkV2ZW50IHwgQW5pbWF0aW9uRXZlbnQpOiB2b2lkIHtcblxuICAgIGlmICghdGhpcy5hbmltYXRpb25FbmQuY2xvc2VkKSB7XG4gICAgICB0aGlzLmFuaW1hdGlvbkVuZC5uZXh0KGV2ZW50KTtcbiAgICB9XG4gIH1cblxufVxuIl19