ad-custom-lib
Version:
This is an UI custom library based on Adminlte library with purpose for personal use, if you need a full template of Primeng please visit https://github.com/mledour/angular-admin-lte
409 lines • 35.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { ChangeDetectorRef, Component, ContentChild, ContentChildren, EventEmitter, Input, NgZone, Output, QueryList, Renderer2, TemplateRef, ViewChild, ViewChildren } from '@angular/core';
import { removeListeners, removeSubscriptions } from '../helpers';
import { AccordionToggleDirective } from './accordion.directive';
/*
*
*/
export class AccordionHeaderComponent {
}
AccordionHeaderComponent.decorators = [
{ type: Component, args: [{
selector: 'mk-accordion-header',
template: '<ng-template #templateRef><ng-content></ng-content></ng-template>'
}] }
];
AccordionHeaderComponent.propDecorators = {
templateRef: [{ type: ViewChild, args: ['templateRef', { static: true },] }]
};
if (false) {
/** @type {?} */
AccordionHeaderComponent.prototype.templateRef;
}
/*
*
*/
export class AccordionContentComponent {
}
AccordionContentComponent.decorators = [
{ type: Component, args: [{
selector: 'mk-accordion-content',
template: '<ng-template #templateRef><ng-content></ng-content></ng-template>'
}] }
];
AccordionContentComponent.propDecorators = {
templateRef: [{ type: ViewChild, args: ['templateRef', { static: true },] }]
};
if (false) {
/** @type {?} */
AccordionContentComponent.prototype.templateRef;
}
/*
*
*/
export class AccordionComponent {
constructor() {
this.contentStyleClass = 'box-body';
this.headerStyleClass = 'box-header with-border';
}
/**
* \@method ngOnInit
* @return {?}
*/
ngOnInit() {
this.headerStyleColor = this.headerColor;
if (!this.header && !this.accordionHeaderComponent) {
throw new Error('Attribute "header" OR Component "mk-+accordion-header" is required for component "mk-+accordion"');
}
if (this.accordionContentComponent) {
this.contentTemplateRef = this.accordionContentComponent.templateRef;
}
else {
this.contentTemplateRef = this.templateRef;
}
}
}
AccordionComponent.decorators = [
{ type: Component, args: [{
selector: 'mk-accordion',
template: '<ng-template #templateRef><ng-content></ng-content></ng-template>'
}] }
];
AccordionComponent.propDecorators = {
borderColor: [{ type: Input }],
contentColor: [{ type: Input }],
contentStyleClass: [{ type: Input }],
header: [{ type: Input }],
headerColor: [{ type: Input }],
headerColorHover: [{ type: Input }],
headerStyleClass: [{ type: Input }],
accordionHeaderComponent: [{ type: ContentChild, args: [AccordionHeaderComponent, { static: true },] }],
accordionContentComponent: [{ type: ContentChild, args: [AccordionContentComponent, { static: true },] }],
templateRef: [{ type: ViewChild, args: ['templateRef', { static: true },] }]
};
if (false) {
/** @type {?} */
AccordionComponent.prototype.contentTemplateRef;
/** @type {?} */
AccordionComponent.prototype.headerStyleColor;
/** @type {?} */
AccordionComponent.prototype.isCollapsing;
/** @type {?} */
AccordionComponent.prototype.isCollapsed;
/** @type {?} */
AccordionComponent.prototype.index;
/** @type {?} */
AccordionComponent.prototype.borderColor;
/** @type {?} */
AccordionComponent.prototype.contentColor;
/** @type {?} */
AccordionComponent.prototype.contentStyleClass;
/** @type {?} */
AccordionComponent.prototype.header;
/** @type {?} */
AccordionComponent.prototype.headerColor;
/** @type {?} */
AccordionComponent.prototype.headerColorHover;
/** @type {?} */
AccordionComponent.prototype.headerStyleClass;
/** @type {?} */
AccordionComponent.prototype.accordionHeaderComponent;
/** @type {?} */
AccordionComponent.prototype.accordionContentComponent;
/** @type {?} */
AccordionComponent.prototype.templateRef;
}
/*
*
*/
export class AccordionGroupComponent {
/**
* \@method constructor
* @param {?} changeDetectorRef [description]
* @param {?} ngZone [description]
* @param {?} renderer2 [description]
*/
constructor(changeDetectorRef, ngZone, renderer2) {
this.changeDetectorRef = changeDetectorRef;
this.ngZone = ngZone;
this.renderer2 = renderer2;
this.activeIndex = [0];
// @TODO change types for listeners to all files
this.listeners = [];
// @TODO change types for subscriptions to all files
this.subscriptions = [];
this.styleClass = 'box-group';
this.onCollapseStart = new EventEmitter();
this.onCollapseDone = new EventEmitter();
}
/**
* @param {?} value
* @return {?}
*/
set _activeIndex(value) {
this.activeIndex = value instanceof Array ? value : [value];
}
/**
* [headerMouseLeave description]
* \@method headerMouseLeave
* @param {?} accordion [description]
* @return {?}
*/
static headerMouseLeave(accordion) {
accordion.headerStyleColor = accordion.headerColor;
}
/**
* [headerMouseEnter description]
* \@method headerMouseEnter
* @param {?} accordion [description]
* @return {?}
*/
static headerMouseEnter(accordion) {
if (accordion.headerColorHover) {
accordion.headerStyleColor = accordion.headerColorHover;
}
}
/**
* \@method ngAfterViewInit
* @return {?}
*/
ngAfterContentInit() {
this.setAccordionsIndex();
this.updateAccordionIsCollapsed();
this.subscriptions.push(this.accordionComponents.changes.subscribe((/**
* @return {?}
*/
() => {
this.setAccordionsIndex();
})));
}
/**
* \@method ngAfterViewInit
* @return {?}
*/
ngAfterViewInit() {
this.setAccordionsToggle();
this.subscriptions.push(this.accordionToggleDirectives.changes.subscribe((/**
* @return {?}
*/
() => {
this.setAccordionsToggle();
})));
}
/**
* [ngOnChanges description]
* \@method ngOnChanges
* @param {?} changes [description]
* @return {?} [description]
*/
ngOnChanges(changes) {
if (changes._activeIndex.firstChange === false) {
this.updateAccordionIsCollapsed();
}
}
/**
* \@method ngOnDestroy
* @return {?}
*/
ngOnDestroy() {
removeListeners(this.listeners);
removeSubscriptions(this.subscriptions);
}
/**
* [toggleAccordion description]
* \@method toggleAccordion
* @param {?} event [description]
* @param {?} toggleIndex [description]
* @return {?}
*/
toggleAccordion(event, toggleIndex) {
event.preventDefault();
/** @type {?} */
const indexOf = this.activeIndex['indexOf'](toggleIndex);
if (indexOf === -1) {
if (this.isMultiple) {
this.activeIndex.push(toggleIndex);
}
else {
this.activeIndex = [toggleIndex];
}
}
else {
if (this.isMultiple) {
this.activeIndex.splice(indexOf, 1);
}
else {
this.activeIndex = [];
}
}
this.updateAccordionIsCollapsed();
}
/**
* [collapseStart description]
* \@method collapseStart
* @param {?} event [description]
* @param {?} accordion [description]
* @return {?}
*/
collapseStart(event, accordion) {
accordion.isCollapsing = true;
this.onCollapseStart.emit({ animationEvent: event, index: accordion.index });
}
/**
* [collapseDone description]
* \@method collapseDone
* @param {?} event [description]
* @param {?} accordion [description]
* @return {?}
*/
collapseDone(event, accordion) {
accordion.isCollapsing = false;
this.onCollapseDone.emit({ animationEvent: event, index: accordion.index });
}
/**
* [setAccordionsIndex description]
* \@method setAccordionsIndex
* @private
* @return {?}
*/
setAccordionsIndex() {
this.accordionComponents.forEach((/**
* @param {?} accordion
* @param {?} index
* @return {?}
*/
(accordion, index) => {
accordion.index = index;
}));
}
/**
* [setAccordionsToggle description]
* \@method setAccordionsToggle
* @private
* @return {?}
*/
setAccordionsToggle() {
this.listeners = removeListeners(this.listeners);
this.ngZone.runOutsideAngular((/**
* @return {?}
*/
() => {
this.accordionToggleDirectives.forEach((/**
* @param {?} accordionToggle
* @return {?}
*/
(accordionToggle) => {
this.listeners.push(this.renderer2.listen(accordionToggle.elementRef.nativeElement, 'click', (/**
* @param {?} event
* @return {?}
*/
(event) => {
this.toggleAccordion(event, accordionToggle.accordionComponent.index);
this.changeDetectorRef.detectChanges();
})));
this.listeners.push(this.renderer2.listen(accordionToggle.elementRef.nativeElement, 'mouseenter', (/**
* @return {?}
*/
() => {
AccordionGroupComponent.headerMouseEnter(accordionToggle.accordionComponent);
this.changeDetectorRef.detectChanges();
})));
this.listeners.push(this.renderer2.listen(accordionToggle.elementRef.nativeElement, 'mouseleave', (/**
* @return {?}
*/
() => {
AccordionGroupComponent.headerMouseLeave(accordionToggle.accordionComponent);
this.changeDetectorRef.detectChanges();
})));
}));
}));
}
/**
* [updateAccordionIsCollapsed description]
* \@method updateAccordionIsCollapsed
* @private
* @return {?}
*/
updateAccordionIsCollapsed() {
this.accordionComponents.forEach((/**
* @param {?} accordion
* @param {?} index
* @return {?}
*/
(accordion, index) => {
accordion.isCollapsed = this.activeIndex.indexOf(index) === -1;
}));
}
}
AccordionGroupComponent.decorators = [
{ type: Component, args: [{
selector: 'mk-accordion-group',
template: "<div [ngClass]=\"styleClass\">\r\n <div *ngFor=\"let accordion of accordionComponents\" class=\"panel box\" [mkColor]=\"accordion.borderColor\"\r\n mkColorProperty=\"border-top-color\" mkColorPrefix=\"box\">\r\n <div [ngClass]=\"accordion.headerStyleClass\"\r\n [class.no-border]=\"accordion.isCollapsed && !accordion.isCollapsing\">\r\n <h4 class=\"box-title\">\r\n <a [mkAccordionToggle]=\"accordion\" href=\"#\" [mkFontColor]=\"accordion.headerStyleColor\"\r\n [class.collapsed]=\"accordion.isCollapsed\">\r\n {{accordion.header}}\r\n <ng-template *ngIf=\"!accordion.header\"\r\n [ngTemplateOutlet]=\"accordion.accordionHeaderComponent?.templateRef\"></ng-template>\r\n </a>\r\n </h4>\r\n </div>\r\n <div class=\"panel-collapse\" [mkCollapseAnimation]=\"accordion.isCollapsed\"\r\n (mkCollapseAnimation.start)=\"collapseStart($event, accordion)\"\r\n (mkCollapseAnimation.done)=\"collapseDone($event, accordion)\">\r\n <div [ngClass]=\"accordion.contentStyleClass\" [mkFontColor]=\"accordion.contentColor\">\r\n <ng-template [ngTemplateOutlet]=\"accordion.contentTemplateRef\"></ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n</div>"
}] }
];
/** @nocollapse */
AccordionGroupComponent.ctorParameters = () => [
{ type: ChangeDetectorRef },
{ type: NgZone },
{ type: Renderer2 }
];
AccordionGroupComponent.propDecorators = {
_activeIndex: [{ type: Input, args: ['activeIndex',] }],
isMultiple: [{ type: Input }],
styleClass: [{ type: Input }],
onCollapseStart: [{ type: Output }],
onCollapseDone: [{ type: Output }],
accordionComponents: [{ type: ContentChildren, args: [AccordionComponent,] }],
accordionToggleDirectives: [{ type: ViewChildren, args: [AccordionToggleDirective,] }]
};
if (false) {
/**
* @type {?}
* @private
*/
AccordionGroupComponent.prototype.activeIndex;
/**
* @type {?}
* @private
*/
AccordionGroupComponent.prototype.listeners;
/**
* @type {?}
* @private
*/
AccordionGroupComponent.prototype.subscriptions;
/** @type {?} */
AccordionGroupComponent.prototype.isMultiple;
/** @type {?} */
AccordionGroupComponent.prototype.styleClass;
/** @type {?} */
AccordionGroupComponent.prototype.onCollapseStart;
/** @type {?} */
AccordionGroupComponent.prototype.onCollapseDone;
/** @type {?} */
AccordionGroupComponent.prototype.accordionComponents;
/**
* @type {?}
* @private
*/
AccordionGroupComponent.prototype.accordionToggleDirectives;
/**
* @type {?}
* @private
*/
AccordionGroupComponent.prototype.changeDetectorRef;
/**
* @type {?}
* @private
*/
AccordionGroupComponent.prototype.ngZone;
/**
* @type {?}
* @private
*/
AccordionGroupComponent.prototype.renderer2;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjb3JkaW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2FkLWN1c3RvbS1saWIvIiwic291cmNlcyI6WyJsaWIvYWNjb3JkaW9uL2FjY29yZGlvbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUVBLE9BQU8sRUFDOEIsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQzVGLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFnQyxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFDeEUsV0FBVyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQ3RELE1BQU0sZUFBZSxDQUFDO0FBR3ZCLE9BQU8sRUFBRSxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDbEUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sdUJBQXVCLENBQUM7Ozs7QUFTakUsTUFBTSxPQUFPLHdCQUF3Qjs7O1lBSnBDLFNBQVMsU0FBQztnQkFDUCxRQUFRLEVBQUUscUJBQXFCO2dCQUMvQixRQUFRLEVBQUUsbUVBQW1FO2FBQ2hGOzs7MEJBRUksU0FBUyxTQUFDLGFBQWEsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Ozs7SUFBMUMsK0NBQWlGOzs7OztBQVdyRixNQUFNLE9BQU8seUJBQXlCOzs7WUFKckMsU0FBUyxTQUFDO2dCQUNQLFFBQVEsRUFBRSxzQkFBc0I7Z0JBQ2hDLFFBQVEsRUFBRSxtRUFBbUU7YUFDaEY7OzswQkFFSSxTQUFTLFNBQUMsYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTs7OztJQUExQyxnREFBaUY7Ozs7O0FBV3JGLE1BQU0sT0FBTyxrQkFBa0I7SUFKL0I7UUFhb0Isc0JBQWlCLEdBQUcsVUFBVSxDQUFDO1FBSS9CLHFCQUFnQixHQUFHLHdCQUF3QixDQUFDO0lBdUJoRSxDQUFDOzs7OztJQWJHLFFBQVE7UUFDSixJQUFJLENBQUMsZ0JBQWdCLEdBQUcs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QUNQLENBQUM7OztZQS9MSixTQUFTLFNBQUM7Z0JBQ1AsUUFBUSxFQUFFLG9CQUFvQjtnQkFDOUIsZzNDQUF5QzthQUM1Qzs7OztZQXJGb0MsaUJBQWlCO1lBQzdCLE1BQU07WUFBbUQsU0FBUzs7OzJCQTZGdEYsS0FBSyxTQUFDLGFBQWE7eUJBR25CLEtBQUs7eUJBQ0wsS0FBSzs4QkFFTCxNQUFNOzZCQUNOLE1BQU07a0NBRU4sZUFBZSxTQUFDLGtCQUFrQjt3Q0FFbEMsWUFBWSxTQUFDLHdCQUF3Qjs7Ozs7OztJQWxCdEMsOENBQStCOzs7OztJQUUvQiw0Q0FBd0M7Ozs7O0lBRXhDLGdEQUFnRDs7SUFNaEQsNkNBQW9DOztJQUNwQyw2Q0FBeUM7O0lBRXpDLGtEQUFzRDs7SUFDdEQsaURBQXFEOztJQUVyRCxzREFBK0Y7Ozs7O0lBRS9GLDREQUErRzs7Ozs7SUFTM0csb0RBQTRDOzs7OztJQUM1Qyx5Q0FBc0I7Ozs7O0lBQ3RCLDRDQUE0QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5cclxuaW1wb3J0IHtcclxuICAgIEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIENvbnRlbnRDaGlsZCwgQ29udGVudENoaWxkcmVuLFxyXG4gICAgRXZlbnRFbWl0dGVyLCBJbnB1dCwgTmdab25lLCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIFF1ZXJ5TGlzdCwgUmVuZGVyZXIyLFxyXG4gICAgU2ltcGxlQ2hhbmdlcywgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCwgVmlld0NoaWxkcmVuXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5pbXBvcnQgeyBBbmltYXRpb25FdmVudCB9IGZyb20gJy4uL2FuaW1hdGlvbnMvYW5pbWF0aW9ucy5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyByZW1vdmVMaXN0ZW5lcnMsIHJlbW92ZVN1YnNjcmlwdGlvbnMgfSBmcm9tICcuLi9oZWxwZXJzJztcclxuaW1wb3J0IHsgQWNjb3JkaW9uVG9nZ2xlRGlyZWN0aXZlIH0gZnJvbSAnLi9hY2NvcmRpb24uZGlyZWN0aXZlJztcclxuXHJcbi8qXHJcbiAqXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnbWstYWNjb3JkaW9uLWhlYWRlcicsXHJcbiAgICB0ZW1wbGF0ZTogJzxuZy10ZW1wbGF0ZSAjdGVtcGxhdGVSZWY+PG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PjwvbmctdGVtcGxhdGU+J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQWNjb3JkaW9uSGVhZGVyQ29tcG9uZW50IHtcclxuICAgIEBWaWV3Q2hpbGQoJ3RlbXBsYXRlUmVmJywgeyBzdGF0aWM6IHRydWUgfSkgcHVibGljIHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG59XHJcblxyXG5cclxuLypcclxuICpcclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdtay1hY2NvcmRpb24tY29udGVudCcsXHJcbiAgICB0ZW1wbGF0ZTogJzxuZy10ZW1wbGF0ZSAjdGVtcGxhdGVSZWY+PG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PjwvbmctdGVtcGxhdGU+J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQWNjb3JkaW9uQ29udGVudENvbXBvbmVudCB7XHJcbiAgICBAVmlld0NoaWxkKCd0ZW1wbGF0ZVJlZicsIHsgc3RhdGljOiB0cnVlIH0pIHB1YmxpYyB0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8YW55PjtcclxufVxyXG5cclxuXHJcbi8qXHJcbiAqXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnbWstYWNjb3JkaW9uJyxcclxuICAgIHRlbXBsYXRlOiAnPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZVJlZj48bmctY29udGVudD48L25nLWNvbnRlbnQ+PC9uZy10ZW1wbGF0ZT4nXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBY2NvcmRpb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gICAgcHVibGljIGNvbnRlbnRUZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8QWNjb3JkaW9uQ29udGVudENvbXBvbmVudD47XHJcbiAgICBwdWJsaWMgaGVhZGVyU3R5bGVDb2xvcjogc3RyaW5nO1xyXG4gICAgcHVibGljIGlzQ29sbGFwc2luZzogYm9vbGVhbjtcclxuICAgIHB1YmxpYyBpc0NvbGxhcHNlZDogYm9vbGVhbjtcclxuICAgIHB1YmxpYyBpbmRleDogbnVtYmVyO1xyXG5cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBib3JkZXJDb2xvcjogc3RyaW5nO1xyXG4gICAgQElucHV0KCkgcHVibGljIGNvbnRlbnRDb2xvcjogc3RyaW5nO1xyXG4gICAgQElucHV0KCkgcHVibGljIGNvbnRlbnRTdHlsZUNsYXNzID0gJ2JveC1ib2R5JztcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBoZWFkZXI6IHN0cmluZztcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBoZWFkZXJDb2xvcjogc3RyaW5nO1xyXG4gICAgQElucHV0KCkgcHVibGljIGhlYWRlckNvbG9ySG92ZXI6IHN0cmluZztcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBoZWFkZXJTdHlsZUNsYXNzID0gJ2JveC1oZWFkZXIgd2l0aC1ib3JkZXInO1xyXG5cclxuICAgIEBDb250ZW50Q2hpbGQoQWNjb3JkaW9uSGVhZGVyQ29tcG9uZW50LCB7IHN0YXRpYzogdHJ1ZSB9KSBwdWJsaWMgYWNjb3JkaW9uSGVhZGVyQ29tcG9uZW50OiBBY2NvcmRpb25IZWFkZXJDb21wb25lbnQ7XHJcbiAgICBAQ29udGVudENoaWxkKEFjY29yZGlvbkNvbnRlbnRDb21wb25lbnQsIHsgc3RhdGljOiB0cnVlIH0pIHB1YmxpYyBhY2NvcmRpb25Db250ZW50Q29tcG9uZW50OiBBY2NvcmRpb25Db250ZW50Q29tcG9uZW50O1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ3RlbXBsYXRlUmVmJywgeyBzdGF0aWM6IHRydWUgfSkgcHVibGljIHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQG1ldGhvZCBuZ09uSW5pdFxyXG4gICAgICovXHJcbiAgICBuZ09uSW5pdCgpIHtcclxuICAgICAgICB0aGlzLmhlYWRlclN0eWxlQ29sb3IgPSB0aGlzLmhlYWRlckNvbG9yO1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuaGVhZGVyICYmICF0aGlzLmFjY29yZGlvbkhlYWRlckNvbXBvbmVudCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0F0dHJpYnV0ZSBcImhlYWRlclwiIE9SIENvbXBvbmVudCBcIm1rLSthY2NvcmRpb24taGVhZGVyXCIgaXMgcmVxdWlyZWQgZm9yIGNvbXBvbmVudCBcIm1rLSthY2NvcmRpb25cIicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYWNjb3JkaW9uQ29udGVudENvbXBvbmVudCkge1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRUZW1wbGF0ZVJlZiA9IHRoaXMuYWNjb3JkaW9uQ29udGVudENvbXBvbmVudC50ZW1wbGF0ZVJlZjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRUZW1wbGF0ZVJlZiA9IHRoaXMudGVtcGxhdGVSZWY7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG5cclxuLypcclxuICpcclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdtay1hY2NvcmRpb24tZ3JvdXAnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2FjY29yZGlvbi5jb21wb25lbnQuaHRtbCdcclxufSlcclxuZXhwb3J0IGNsYXNzIEFjY29yZGlvbkdyb3VwQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xyXG4gICAgcHJpdmF0ZSBhY3RpdmVJbmRleDogYW55ID0gWzBdO1xyXG4gICAgLy8gQFRPRE8gY2hhbmdlIHR5cGVzIGZvciBsaXN0ZW5lcnMgdG8gYWxsIGZpbGVzXHJcbiAgICBwcml2YXRlIGxpc3RlbmVyczogQXJyYXk8RnVuY3Rpb24+ID0gW107XHJcbiAgICAvLyBAVE9ETyBjaGFuZ2UgdHlwZXMgZm9yIHN1YnNjcmlwdGlvbnMgdG8gYWxsIGZpbGVzXHJcbiAgICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IEFycmF5PFN1YnNjcmlwdGlvbj4gPSBbXTtcclxuXHJcblxyXG4gICAgQElucHV0KCdhY3RpdmVJbmRleCcpIHNldCBfYWN0aXZlSW5kZXgodmFsdWUpIHtcclxuICAgICAgICB0aGlzLmFjdGl2ZUluZGV4ID0gdmFsdWUgaW5zdGFuY2VvZiBBcnJheSA/IHZhbHVlIDogW3ZhbHVlXTtcclxuICAgIH1cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBpc011bHRpcGxlOiBib29sZWFuO1xyXG4gICAgQElucHV0KCkgcHVibGljIHN0eWxlQ2xhc3MgPSAnYm94LWdyb3VwJztcclxuXHJcbiAgICBAT3V0cHV0KCkgcHVibGljIG9uQ29sbGFwc2VTdGFydCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgb25Db2xsYXBzZURvbmUgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gICAgQENvbnRlbnRDaGlsZHJlbihBY2NvcmRpb25Db21wb25lbnQpIHB1YmxpYyBhY2NvcmRpb25Db21wb25lbnRzOiBRdWVyeUxpc3Q8QWNjb3JkaW9uQ29tcG9uZW50PjtcclxuXHJcbiAgICBAVmlld0NoaWxkcmVuKEFjY29yZGlvblRvZ2dsZURpcmVjdGl2ZSkgcHJpdmF0ZSBhY2NvcmRpb25Ub2dnbGVEaXJlY3RpdmVzOiBRdWVyeUxpc3Q8QWNjb3JkaW9uVG9nZ2xlRGlyZWN0aXZlPjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBtZXRob2QgY29uc3RydWN0b3JcclxuICAgICAqIEBwYXJhbSBjaGFuZ2VEZXRlY3RvclJlZiBbZGVzY3JpcHRpb25dXHJcbiAgICAgKiBAcGFyYW0gbmdab25lICAgICAgICAgICAgW2Rlc2NyaXB0aW9uXVxyXG4gICAgICogQHBhcmFtIHJlbmRlcmVyMiAgICAgICAgIFtkZXNjcmlwdGlvbl1cclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICAgICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcclxuICAgICAgICBwcml2YXRlIHJlbmRlcmVyMjogUmVuZGVyZXIyXHJcbiAgICApIHsgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogW2hlYWRlck1vdXNlTGVhdmUgZGVzY3JpcHRpb25dXHJcbiAgICAgKiBAbWV0aG9kIGhlYWRlck1vdXNlTGVhdmVcclxuICAgICAqIEBwYXJhbSBhY2NvcmRpb24gW2Rlc2NyaXB0aW9uXVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGhlYWRlck1vdXNlTGVhdmUoYWNjb3JkaW9uOiBBY2NvcmRpb25Db21wb25lbnQpOiB2b2lkIHtcclxuICAgICAgICBhY2NvcmRpb24uaGVhZGVyU3R5bGVDb2xvciA9IGFjY29yZGlvbi5oZWFkZXJDb2xvcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFtoZWFkZXJNb3VzZUVudGVyIGRlc2NyaXB0aW9uXVxyXG4gICAgICogQG1ldGhvZCBoZWFkZXJNb3VzZUVudGVyXHJcbiAgICAgKiBAcGFyYW0gYWNjb3JkaW9uIFtkZXNjcmlwdGlvbl1cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBoZWFkZXJNb3VzZUVudGVyKGFjY29yZGlvbjogQWNjb3JkaW9uQ29tcG9uZW50KTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGFjY29yZGlvbi5oZWFkZXJDb2xvckhvdmVyKSB7XHJcbiAgICAgICAgICAgIGFjY29yZGlvbi5oZWFkZXJTdHlsZUNvbG9yID0gYWNjb3JkaW9uLmhlYWRlckNvbG9ySG92ZXI7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQG1ldGhvZCBuZ0FmdGVyVmlld0luaXRcclxuICAgICAqL1xyXG4gICAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xyXG4gICAgICAgIHRoaXMuc2V0QWNjb3JkaW9uc0luZGV4KCk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVBY2NvcmRpb25Jc0NvbGxhcHNlZCgpO1xyXG5cclxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaCh0aGlzLmFjY29yZGlvbkNvbXBvbmVudHMuY2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNldEFjY29yZGlvbnNJbmRleCgpO1xyXG4gICAgICAgIH0pKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBtZXRob2QgbmdBZnRlclZpZXdJbml0XHJcbiAgICAgKi9cclxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgICAgICB0aGlzLnNldEFjY29yZGlvbnNUb2dnbGUoKTtcclxuXHJcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2godGhpcy5hY2NvcmRpb25Ub2dnbGVEaXJlY3RpdmVzLmNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zZXRBY2NvcmRpb25zVG9nZ2xlKCk7XHJcbiAgICAgICAgfSkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogW25nT25DaGFuZ2VzIGRlc2NyaXB0aW9uXVxyXG4gICAgICogQG1ldGhvZCBuZ09uQ2hhbmdlc1xyXG4gICAgICogQHBhcmFtIGNoYW5nZXMgW2Rlc2NyaXB0aW9uXVxyXG4gICAgICogQHJldHVybiBbZGVzY3JpcHRpb25dXHJcbiAgICAgKi9cclxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgICAgICBpZiAoY2hhbmdlcy5fYWN0aXZlSW5kZXguZmlyc3RDaGFuZ2UgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQWNjb3JkaW9uSXNDb2xsYXBzZWQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAbWV0aG9kIG5nT25EZXN0cm95XHJcbiAgICAgKi9cclxuICAgIG5nT25EZXN0cm95KCkge1xyXG4gICAgICAgIHJlbW92ZUxpc3RlbmVycyh0aGlzLmxpc3RlbmVycyk7XHJcbiAgICAgICAgcmVtb3ZlU3Vic2NyaXB0aW9ucyh0aGlzLnN1YnNjcmlwdGlvbnMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogW3RvZ2dsZUFjY29yZGlvbiBkZXNjcmlwdGlvbl1cclxuICAgICAqIEBtZXRob2QgdG9nZ2xlQWNjb3JkaW9uXHJcbiAgICAgKiBAcGFyYW0gZXZlbnQgICAgICAgW2Rlc2NyaXB0aW9uXVxyXG4gICAgICogQHBhcmFtIHRvZ2dsZUluZGV4IFtkZXNjcmlwdGlvbl1cclxuICAgICAqL1xyXG4gICAgcHVibGljIHRvZ2dsZUFjY29yZGlvbihldmVudDogRXZlbnQsIHRvZ2dsZUluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgICAgICBjb25zdCBpbmRleE9mID0gdGhpcy5hY3RpdmVJbmRleFsnaW5kZXhPZiddKHRvZ2dsZUluZGV4KTtcclxuICAgICAgICBpZiAoaW5kZXhPZiA9PT0gLTEpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNNdWx0aXBsZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVJbmRleC5wdXNoKHRvZ2dsZUluZGV4KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlSW5kZXggPSBbdG9nZ2xlSW5kZXhdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNNdWx0aXBsZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVJbmRleC5zcGxpY2UoaW5kZXhPZiwgMSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZUluZGV4ID0gW107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy51cGRhdGVBY2NvcmRpb25Jc0NvbGxhcHNlZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogW2NvbGxhcHNlU3RhcnQgZGVzY3JpcHRpb25dXHJcbiAgICAgKiBAbWV0aG9kIGNvbGxhcHNlU3RhcnRcclxuICAgICAqIEBwYXJhbSBldmVudCBbZGVzY3JpcHRpb25dXHJcbiAgICAgKiBAcGFyYW0gYWNjb3JkaW9uIFtkZXNjcmlwdGlvbl1cclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvbGxhcHNlU3RhcnQoZXZlbnQ6IEFuaW1hdGlvbkV2ZW50LCBhY2NvcmRpb246IEFjY29yZGlvbkNvbXBvbmVudCk6IHZvaWQge1xyXG4gICAgICAgIGFjY29yZGlvbi5pc0NvbGxhcHNpbmcgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMub25Db2xsYXBzZVN0YXJ0LmVtaXQoeyBhbmltYXRpb25FdmVudDogZXZlbnQsIGluZGV4OiBhY2NvcmRpb24uaW5kZXggfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBbY29sbGFwc2VEb25lIGRlc2NyaXB0aW9uXVxyXG4gICAgICogQG1ldGhvZCBjb2xsYXBzZURvbmVcclxuICAgICAqIEBwYXJhbSBldmVudCBbZGVzY3JpcHRpb25dXHJcbiAgICAgKiBAcGFyYW0gYWNjb3JkaW9uIFtkZXNjcmlwdGlvbl1cclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvbGxhcHNlRG9uZShldmVudDogQW5pbWF0aW9uRXZlbnQsIGFjY29yZGlvbjogQWNjb3JkaW9uQ29tcG9uZW50KTogdm9pZCB7XHJcbiAgICAgICAgYWNjb3JkaW9uLmlzQ29sbGFwc2luZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMub25Db2xsYXBzZURvbmUuZW1pdCh7IGFuaW1hdGlvbkV2ZW50OiBldmVudCwgaW5kZXg6IGFjY29yZGlvbi5pbmRleCB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFtzZXRBY2NvcmRpb25zSW5kZXggZGVzY3JpcHRpb25dXHJcbiAgICAgKiBAbWV0aG9kIHNldEFjY29yZGlvbnNJbmRleFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHNldEFjY29yZGlvbnNJbmRleCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmFjY29yZGlvbkNvbXBvbmVudHMuZm9yRWFjaCgoYWNjb3JkaW9uOiBBY2NvcmRpb25Db21wb25lbnQsIGluZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgICAgICAgYWNjb3JkaW9uLmluZGV4ID0gaW5kZXg7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBbc2V0QWNjb3JkaW9uc1RvZ2dsZSBkZXNjcmlwdGlvbl1cclxuICAgICAqIEBtZXRob2Qgc2V0QWNjb3JkaW9uc1RvZ2dsZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHNldEFjY29yZGlvbnNUb2dnbGUoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5saXN0ZW5lcnMgPSByZW1vdmVMaXN0ZW5lcnModGhpcy5saXN0ZW5lcnMpO1xyXG5cclxuICAgICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuYWNjb3JkaW9uVG9nZ2xlRGlyZWN0aXZlcy5mb3JFYWNoKChhY2NvcmRpb25Ub2dnbGU6IEFjY29yZGlvblRvZ2dsZURpcmVjdGl2ZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMucHVzaCh0aGlzLnJlbmRlcmVyMi5saXN0ZW4oYWNjb3JkaW9uVG9nZ2xlLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2NsaWNrJywgKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2dnbGVBY2NvcmRpb24oZXZlbnQsIGFjY29yZGlvblRvZ2dsZS5hY2NvcmRpb25Db21wb25lbnQuaW5kZXgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMucHVzaCh0aGlzLnJlbmRlcmVyMi5saXN0ZW4oYWNjb3JkaW9uVG9nZ2xlLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ21vdXNlZW50ZXInLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgQWNjb3JkaW9uR3JvdXBDb21wb25lbnQuaGVhZGVyTW91c2VFbnRlcihhY2NvcmRpb25Ub2dnbGUuYWNjb3JkaW9uQ29tcG9uZW50KTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzLnB1c2godGhpcy5yZW5kZXJlcjIubGlzdGVuKGFjY29yZGlvblRvZ2dsZS5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdtb3VzZWxlYXZlJywgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIEFjY29yZGlvbkdyb3VwQ29tcG9uZW50LmhlYWRlck1vdXNlTGVhdmUoYWNjb3JkaW9uVG9nZ2xlLmFjY29yZGlvbkNvbXBvbmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogW3VwZGF0ZUFjY29yZGlvbklzQ29sbGFwc2VkIGRlc2NyaXB0aW9uXVxyXG4gICAgICogQG1ldGhvZCB1cGRhdGVBY2NvcmRpb25Jc0NvbGxhcHNlZFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHVwZGF0ZUFjY29yZGlvbklzQ29sbGFwc2VkKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuYWNjb3JkaW9uQ29tcG9uZW50cy5mb3JFYWNoKChhY2NvcmRpb246IEFjY29yZGlvbkNvbXBvbmVudCwgaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgICAgICAgICBhY2NvcmRpb24uaXNDb2xsYXBzZWQgPSB0aGlzLmFjdGl2ZUluZGV4LmluZGV4T2YoaW5kZXgpID09PSAtMTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG4iXX0=