UNPKG

@coreui/angular

Version:

CoreUI Angular Bootstrap 4 components

598 lines 38.5 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, Directive, ElementRef, HostBinding, HostListener, Inject, Input, Renderer2 } from '@angular/core'; import { DOCUMENT } from '@angular/common'; import { Router } from '@angular/router'; import { Replace } from '../shared'; export class NavDropdownDirective { /** * @param {?} el */ constructor(el) { this.el = el; } /** * @return {?} */ toggle() { this.el.nativeElement.classList.toggle('open'); } } NavDropdownDirective.decorators = [ { type: Directive, args: [{ selector: '[appNavDropdown]' },] } ]; /** @nocollapse */ NavDropdownDirective.ctorParameters = () => [ { type: ElementRef } ]; if (false) { /** * @type {?} * @private */ NavDropdownDirective.prototype.el; } /** * Allows the dropdown to be toggled via click. */ export class NavDropdownToggleDirective { /** * @param {?} dropdown */ constructor(dropdown) { this.dropdown = dropdown; } /** * @param {?} $event * @return {?} */ toggleOpen($event) { $event.preventDefault(); this.dropdown.toggle(); } } NavDropdownToggleDirective.decorators = [ { type: Directive, args: [{ selector: '[appNavDropdownToggle]' },] } ]; /** @nocollapse */ NavDropdownToggleDirective.ctorParameters = () => [ { type: NavDropdownDirective } ]; NavDropdownToggleDirective.propDecorators = { toggleOpen: [{ type: HostListener, args: ['click', ['$event'],] }] }; if (false) { /** * @type {?} * @private */ NavDropdownToggleDirective.prototype.dropdown; } export class LinkAttributesDirective { /** * @param {?} document * @param {?} renderer * @param {?} el */ constructor(document, renderer, el) { this.document = document; this.renderer = renderer; this.el = el; } /** * @return {?} */ ngOnInit() { /** @type {?} */ const attribs = this.appLinkAttributes; for (const attr in attribs) { if (attr === 'style' && typeof (attribs[attr]) === 'object') { this.setStyle(attribs[attr]); } else if (attr === 'class') { this.addClass(attribs[attr]); } else { this.setAttrib(attr, attribs[attr]); } } } /** * @private * @param {?} styles * @return {?} */ setStyle(styles) { for (const style in styles) { this.renderer.setStyle(this.el.nativeElement, style, styles[style]); } } /** * @private * @param {?} classes * @return {?} */ addClass(classes) { /** @type {?} */ const classArray = Array.isArray(classes) ? classes : classes.split(' '); classArray.forEach(element => { this.renderer.addClass(this.el.nativeElement, element); }); } /** * @private * @param {?} key * @param {?} value * @return {?} */ setAttrib(key, value) { /** @type {?} */ const newAttr = this.document.createAttribute(key); newAttr.value = value; this.renderer.setAttribute(this.el.nativeElement, key, value); } } LinkAttributesDirective.decorators = [ { type: Directive, args: [{ selector: '[appLinkAttributes]' },] } ]; /** @nocollapse */ LinkAttributesDirective.ctorParameters = () => [ { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] }, { type: Renderer2 }, { type: ElementRef } ]; LinkAttributesDirective.propDecorators = { appLinkAttributes: [{ type: Input }] }; if (false) { /** @type {?} */ LinkAttributesDirective.prototype.appLinkAttributes; /** * @type {?} * @private */ LinkAttributesDirective.prototype.document; /** * @type {?} * @private */ LinkAttributesDirective.prototype.renderer; /** * @type {?} * @private */ LinkAttributesDirective.prototype.el; } export class AppSidebarNavComponent { constructor() { this.role = 'nav'; } /** * @param {?} item * @return {?} */ isDivider(item) { return item.divider ? true : false; } /** * @param {?} item * @return {?} */ isTitle(item) { return item.title ? true : false; } /** * @param {?} changes * @return {?} */ ngOnChanges(changes) { this.navItemsArray = JSON.parse(JSON.stringify(this.navItems)); } } AppSidebarNavComponent.decorators = [ { type: Component, args: [{ selector: 'app-sidebar-nav', template: ` <ul class="nav"> <ng-template ngFor let-navitem [ngForOf]="navItems"> <li *ngIf="isDivider(navitem)" class="nav-divider"></li> <ng-template [ngIf]="isTitle(navitem)"> <app-sidebar-nav-title [title]='navitem'></app-sidebar-nav-title> </ng-template> <ng-template [ngIf]="!isDivider(navitem)&&!isTitle(navitem)"> <app-sidebar-nav-item [item]='navitem'></app-sidebar-nav-item> </ng-template> </ng-template> </ul>` }] } ]; /** @nocollapse */ AppSidebarNavComponent.ctorParameters = () => []; AppSidebarNavComponent.propDecorators = { navItems: [{ type: Input }], true: [{ type: HostBinding, args: ['class.sidebar-nav',] }], role: [{ type: HostBinding, args: ['attr.role',] }] }; if (false) { /** @type {?} */ AppSidebarNavComponent.prototype.navItems; /** @type {?} */ AppSidebarNavComponent.prototype.true; /** @type {?} */ AppSidebarNavComponent.prototype.role; /** @type {?} */ AppSidebarNavComponent.prototype.navItemsArray; } export class AppSidebarNavItemComponent { /** * @param {?} router * @param {?} el */ constructor(router, el) { this.router = router; this.el = el; } /** * @return {?} */ hasClass() { return this.item.class ? true : false; } /** * @return {?} */ isDropdown() { return this.item.children ? true : false; } /** * @return {?} */ thisUrl() { return this.item.url; } /** * @return {?} */ isActive() { return this.router.isActive(this.thisUrl(), false); } /** * @return {?} */ ngOnInit() { Replace(this.el); } } AppSidebarNavItemComponent.decorators = [ { type: Component, args: [{ selector: 'app-sidebar-nav-item', template: ` <li *ngIf="!isDropdown(); else dropdown" [ngClass]="hasClass() ? 'nav-item ' + item.class : 'nav-item'"> <app-sidebar-nav-link [link]='item'></app-sidebar-nav-link> </li> <ng-template #dropdown> <li [ngClass]="hasClass() ? 'nav-item nav-dropdown ' + item.class : 'nav-item nav-dropdown'" [class.open]="isActive()" routerLinkActive="open" appNavDropdown> <app-sidebar-nav-dropdown [link]='item'></app-sidebar-nav-dropdown> </li> </ng-template> ` }] } ]; /** @nocollapse */ AppSidebarNavItemComponent.ctorParameters = () => [ { type: Router }, { type: ElementRef } ]; AppSidebarNavItemComponent.propDecorators = { item: [{ type: Input }] }; if (false) { /** @type {?} */ AppSidebarNavItemComponent.prototype.item; /** * @type {?} * @private */ AppSidebarNavItemComponent.prototype.router; /** * @type {?} * @private */ AppSidebarNavItemComponent.prototype.el; } export class AppSidebarNavLinkComponent { /** * @param {?} document * @param {?} renderer * @param {?} router * @param {?} el */ constructor(document, renderer, router, el) { this.document = document; this.renderer = renderer; this.router = router; this.el = el; } /** * @return {?} */ getClasses() { /** @type {?} */ const disabled = this.isDisabled(); /** @type {?} */ const classes = { 'nav-link': true, 'disabled': disabled, 'btn-link': disabled }; if (this.hasVariant()) { /** @type {?} */ const variant = `nav-link-${this.link.variant}`; classes[variant] = true; } return classes; } /** * @return {?} */ getLinkType() { return this.isDisabled() ? 'disabled' : this.isExternalLink() ? 'external' : ''; } /** * @return {?} */ hasVariant() { return this.link.variant ? true : false; } /** * @return {?} */ isBadge() { return this.link.badge ? true : false; } /** * @return {?} */ isDisabled() { return this.link.attributes && this.link.attributes.disabled ? true : false; } /** * @return {?} */ isExternalLink() { return this.link.url.substring(0, 4) === 'http' ? true : false; } /** * @return {?} */ isIcon() { return this.link.icon ? true : false; } /** * @return {?} */ hideMobile() { if (this.document.body.classList.contains('sidebar-show')) { this.renderer.removeClass(this.document.body, 'sidebar-show'); } } /** * @return {?} */ ngOnInit() { Replace(this.el); } } AppSidebarNavLinkComponent.decorators = [ { type: Component, args: [{ selector: 'app-sidebar-nav-link', template: ` <ng-container [ngSwitch]="getLinkType()"> <a *ngSwitchCase="'disabled'" [attr.disabled]="true" [appLinkAttributes]="link.attributes" href="" [ngClass]="getClasses()"> <i *ngIf="isIcon()" class="nav-icon {{ link.icon }}"></i> {{ link.name }} <span *ngIf="isBadge()" [ngClass]="'badge badge-' + link.badge.variant">{{ link.badge.text }}</span> </a> <a *ngSwitchCase="'external'" [ngClass]="getClasses()" href="{{link.url}}" [appLinkAttributes]="link.attributes"> <i *ngIf="isIcon()" class="nav-icon {{ link.icon }}"></i> {{ link.name }} <span *ngIf="isBadge()" [ngClass]="'badge badge-' + link.badge.variant">{{ link.badge.text }}</span> </a> <a *ngSwitchDefault [ngClass]="getClasses()" [appLinkAttributes]="link.attributes" routerLinkActive="active" [routerLink]="[link.url]" (click)="hideMobile()"> <i *ngIf="isIcon()" class="nav-icon {{ link.icon }}"></i> {{ link.name }} <span *ngIf="isBadge()" [ngClass]="'badge badge-' + link.badge.variant">{{ link.badge.text }}</span> </a> </ng-container> ` }] } ]; /** @nocollapse */ AppSidebarNavLinkComponent.ctorParameters = () => [ { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] }, { type: Renderer2 }, { type: Router }, { type: ElementRef } ]; AppSidebarNavLinkComponent.propDecorators = { link: [{ type: Input }] }; if (false) { /** @type {?} */ AppSidebarNavLinkComponent.prototype.link; /** * @type {?} * @private */ AppSidebarNavLinkComponent.prototype.document; /** * @type {?} * @private */ AppSidebarNavLinkComponent.prototype.renderer; /** * @type {?} * @private */ AppSidebarNavLinkComponent.prototype.router; /** * @type {?} * @private */ AppSidebarNavLinkComponent.prototype.el; } export class AppSidebarNavDropdownComponent { /** * @param {?} router * @param {?} el */ constructor(router, el) { this.router = router; this.el = el; } /** * @return {?} */ isBadge() { return this.link.badge ? true : false; } /** * @return {?} */ isIcon() { return this.link.icon ? true : false; } /** * @return {?} */ ngOnInit() { Replace(this.el); } } AppSidebarNavDropdownComponent.decorators = [ { type: Component, args: [{ selector: 'app-sidebar-nav-dropdown', template: ` <a class="nav-link nav-dropdown-toggle" appNavDropdownToggle> <i *ngIf="isIcon()" class="nav-icon {{ link.icon }}"></i> {{ link.name }} <span *ngIf="isBadge()" [ngClass]="'badge badge-' + link.badge.variant">{{ link.badge.text }}</span> </a> <ul class="nav-dropdown-items"> <ng-template ngFor let-child [ngForOf]="link.children"> <app-sidebar-nav-item [item]='child'></app-sidebar-nav-item> </ng-template> </ul> `, styles: ['.nav-dropdown-toggle { cursor: pointer; }'] }] } ]; /** @nocollapse */ AppSidebarNavDropdownComponent.ctorParameters = () => [ { type: Router }, { type: ElementRef } ]; AppSidebarNavDropdownComponent.propDecorators = { link: [{ type: Input }] }; if (false) { /** @type {?} */ AppSidebarNavDropdownComponent.prototype.link; /** * @type {?} * @private */ AppSidebarNavDropdownComponent.prototype.router; /** * @type {?} * @private */ AppSidebarNavDropdownComponent.prototype.el; } export class AppSidebarNavTitleComponent { /** * @param {?} el * @param {?} renderer */ constructor(el, renderer) { this.el = el; this.renderer = renderer; } /** * @return {?} */ ngOnInit() { /** @type {?} */ const nativeElement = this.el.nativeElement; /** @type {?} */ const li = this.renderer.createElement('li'); /** @type {?} */ const name = this.renderer.createText(this.title.name); this.renderer.addClass(li, 'nav-title'); if (this.title.class) { /** @type {?} */ const classes = this.title.class; this.renderer.addClass(li, classes); } if (this.title.wrapper) { /** @type {?} */ const wrapper = this.renderer.createElement(this.title.wrapper.element); this.renderer.appendChild(wrapper, name); this.renderer.appendChild(li, wrapper); } else { this.renderer.appendChild(li, name); } this.renderer.appendChild(nativeElement, li); Replace(this.el); } } AppSidebarNavTitleComponent.decorators = [ { type: Component, args: [{ selector: 'app-sidebar-nav-title', template: '' }] } ]; /** @nocollapse */ AppSidebarNavTitleComponent.ctorParameters = () => [ { type: ElementRef }, { type: Renderer2 } ]; AppSidebarNavTitleComponent.propDecorators = { title: [{ type: Input }] }; if (false) { /** @type {?} */ AppSidebarNavTitleComponent.prototype.title; /** * @type {?} * @private */ AppSidebarNavTitleComponent.prototype.el; /** * @type {?} * @private */ AppSidebarNavTitleComponent.prototype.renderer; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXNpZGViYXItbmF2LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bjb3JldWkvYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9zaWRlYmFyL2FwcC1zaWRlYmFyLW5hdi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsU0FBUyxFQUNULFVBQVUsRUFDVixXQUFXLEVBQ1gsWUFBWSxFQUFFLE1BQU0sRUFDcEIsS0FBSyxFQUdMLFNBQVMsRUFFVixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXpDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFLcEMsTUFBTSxPQUFPLG9CQUFvQjs7OztJQUUvQixZQUFvQixFQUFjO1FBQWQsT0FBRSxHQUFGLEVBQUUsQ0FBWTtJQUFJLENBQUM7Ozs7SUFFdkMsTUFBTTtRQUNKLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDakQsQ0FBQzs7O1lBVEYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxrQkFBa0I7YUFDN0I7Ozs7WUFqQkMsVUFBVTs7Ozs7OztJQW9CRSxrQ0FBc0I7Ozs7O0FBYXBDLE1BQU0sT0FBTywwQkFBMEI7Ozs7SUFDckMsWUFBb0IsUUFBOEI7UUFBOUIsYUFBUSxHQUFSLFFBQVEsQ0FBc0I7SUFBRyxDQUFDOzs7OztJQUd0RCxVQUFVLENBQUMsTUFBVztRQUNwQixNQUFNLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUN6QixDQUFDOzs7WUFWRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLHdCQUF3QjthQUNuQzs7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ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIERpcmVjdGl2ZSxcclxuICBFbGVtZW50UmVmLFxyXG4gIEhvc3RCaW5kaW5nLFxyXG4gIEhvc3RMaXN0ZW5lciwgSW5qZWN0LFxyXG4gIElucHV0LFxyXG4gIE9uQ2hhbmdlcyxcclxuICBPbkluaXQsXHJcbiAgUmVuZGVyZXIyLFxyXG4gIFNpbXBsZUNoYW5nZXNcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmltcG9ydCB7RE9DVU1FTlR9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcblxyXG5pbXBvcnQgeyBSZXBsYWNlIH0gZnJvbSAnLi4vc2hhcmVkJztcclxuXHJcbkBEaXJlY3RpdmUoe1xyXG4gIHNlbGVjdG9yOiAnW2FwcE5hdkRyb3Bkb3duXSdcclxufSlcclxuZXhwb3J0IGNsYXNzIE5hdkRyb3Bkb3duRGlyZWN0aXZlIHtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbDogRWxlbWVudFJlZikgeyB9XHJcblxyXG4gIHRvZ2dsZSgpIHtcclxuICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCdvcGVuJyk7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuKiBBbGxvd3MgdGhlIGRyb3Bkb3duIHRvIGJlIHRvZ2dsZWQgdmlhIGNsaWNrLlxyXG4qL1xyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1thcHBOYXZEcm9wZG93blRvZ2dsZV0nXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOYXZEcm9wZG93blRvZ2dsZURpcmVjdGl2ZSB7XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBkcm9wZG93bjogTmF2RHJvcGRvd25EaXJlY3RpdmUpIHt9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyckZXZlbnQnXSlcclxuICB0b2dnbGVPcGVuKCRldmVudDogYW55KSB7XHJcbiAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIHRoaXMuZHJvcGRvd24udG9nZ2xlKCk7XHJcbiAgfVxyXG59XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1thcHBMaW5rQXR0cmlidXRlc10nXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBMaW5rQXR0cmlidXRlc0RpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgQElucHV0KCkgYXBwTGlua0F0dHJpYnV0ZXM6IHtba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGRvY3VtZW50OiBhbnksXHJcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXHJcbiAgICBwcml2YXRlIGVsOiBFbGVtZW50UmVmXHJcbiAgKSB7fVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIGNvbnN0IGF0dHJpYnMgPSB0aGlzLmFwcExpbmtBdHRyaWJ1dGVzO1xyXG4gICAgZm9yIChjb25zdCBhdHRyIGluIGF0dHJpYnMpIHtcclxuICAgICAgaWYgKGF0dHIgPT09ICdzdHlsZScgJiYgdHlwZW9mKGF0dHJpYnNbYXR0cl0pID09PSAnb2JqZWN0JyApIHtcclxuICAgICAgICB0aGlzLnNldFN0eWxlKGF0dHJpYnNbYXR0cl0pO1xyXG4gICAgICB9IGVsc2UgaWYgKGF0dHIgPT09ICdjbGFzcycpIHtcclxuICAgICAgICB0aGlzLmFkZENsYXNzKGF0dHJpYnNbYXR0cl0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc2V0QXR0cmliKGF0dHIsIGF0dHJpYnNbYXR0cl0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldFN0eWxlKHN0eWxlcykge1xyXG4gICAgZm9yIChjb25zdCBzdHlsZSBpbiBzdHlsZXMpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsIHN0eWxlLCBzdHlsZXNbc3R5bGVdICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFkZENsYXNzKGNsYXNzZXMpIHtcclxuICAgIGNvbnN0IGNsYXNzQXJyYXkgPSBBcnJheS5pc0FycmF5KGNsYXNzZXMpID8gY2xhc3NlcyA6IGNsYXNzZXMuc3BsaXQoJyAnKTtcclxuICAgIGNsYXNzQXJyYXkuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsIGVsZW1lbnQgKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRBdHRyaWIoa2V5LCB2YWx1ZSkge1xyXG4gICAgY29uc3QgbmV3QXR0ciA9IHRoaXMuZG9jdW1lbnQuY3JlYXRlQXR0cmlidXRlKGtleSk7XHJcbiAgICBuZXdBdHRyLnZhbHVlID0gdmFsdWU7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsIGtleSwgdmFsdWUgKTtcclxuICB9XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLXNpZGViYXItbmF2JyxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPHVsIGNsYXNzPVwibmF2XCI+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSBuZ0ZvciBsZXQtbmF2aXRlbSBbbmdGb3JPZl09XCJuYXZJdGVtc1wiPlxyXG4gICAgICAgIDxsaSAqbmdJZj1cImlzRGl2aWRlcihuYXZpdGVtKVwiIGNsYXNzPVwibmF2LWRpdmlkZXJcIj48L2xpPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJpc1RpdGxlKG5hdml0ZW0pXCI+XHJcbiAgICAgICAgICA8YXBwLXNpZGViYXItbmF2LXRpdGxlIFt0aXRsZV09J25hdml0ZW0nPjwvYXBwLXNpZGViYXItbmF2LXRpdGxlPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cIiFpc0RpdmlkZXIobmF2aXRlbSkmJiFpc1RpdGxlKG5hdml0ZW0pXCI+XHJcbiAgICAgICAgICA8YXBwLXNpZGViYXItbmF2LWl0ZW0gW2l0ZW1dPSduYXZpdGVtJz48L2FwcC1zaWRlYmFyLW5hdi1pdGVtPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICA8L3VsPmBcclxufSlcclxuZXhwb3J0IGNsYXNzIEFwcFNpZGViYXJOYXZDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xyXG4gIEBJbnB1dCgpIG5hdkl0ZW1zOiBBcnJheTxhbnk+O1xyXG5cclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnNpZGViYXItbmF2JykgdHJ1ZTtcclxuICBASG9zdEJpbmRpbmcoJ2F0dHIucm9sZScpIHJvbGUgPSAnbmF2JztcclxuXHJcbiAgcHVibGljIG5hdkl0ZW1zQXJyYXk6IEFycmF5PGFueT47XHJcblxyXG4gIHB1YmxpYyBpc0RpdmlkZXIoaXRlbSkge1xyXG4gICAgcmV0dXJuIGl0ZW0uZGl2aWRlciA/IHRydWUgOiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc1RpdGxlKGl0ZW0pIHtcclxuICAgIHJldHVybiBpdGVtLnRpdGxlID8gdHJ1ZSA6IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIHRoaXMubmF2SXRlbXNBcnJheSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5uYXZJdGVtcykpO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoKSB7IH1cclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhcHAtc2lkZWJhci1uYXYtaXRlbScsXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgIDxsaSAqbmdJZj1cIiFpc0Ryb3Bkb3duKCk7IGVsc2UgZHJvcGRvd25cIiBbbmdDbGFzc109XCJoYXNDbGFzcygpID8gJ25hdi1pdGVtICcgKyBpdGVtLmNsYXNzIDogJ25hdi1pdGVtJ1wiPlxyXG4gICAgICA8YXBwLXNpZGViYXItbmF2LWxpbmsgW2xpbmtdPSdpdGVtJz48L2FwcC1zaWRlYmFyLW5hdi1saW5rPlxyXG4gICAgPC9saT5cclxuICAgIDxuZy10ZW1wbGF0ZSAjZHJvcGRvd24+XHJcbiAgICAgIDxsaSBbbmdDbGFzc109XCJoYXNDbGFzcygpID8gJ25hdi1pdGVtIG5hdi1kcm9wZG93biAnICsgaXRlbS5jbGFzcyA6ICduYXYtaXRlbSBuYXYtZHJvcGRvd24nXCJcclxuICAgICAgICAgIFtjbGFzcy5vcGVuXT1cImlzQWN0aXZlKClcIlxyXG4gICAgICAgICAgcm91dGVyTGlua0FjdGl2ZT1cIm9wZW5cIlxyXG4gICAgICAgICAgYXBwTmF2RHJvcGRvd24+XHJcbiAgICAgICAgPGFwcC1zaWRlYmFyLW5hdi1kcm9wZG93biBbbGlua109J2l0ZW0nPjwvYXBwLXNpZGViYXItbmF2LWRyb3Bkb3duPlxyXG4gICAgICA8L2xpPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIGBcclxufSlcclxuZXhwb3J0IGNsYXNzIEFwcFNpZGViYXJOYXZJdGVtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICBASW5wdXQoKSBpdGVtOiBhbnk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCBwcml2YXRlIHJvdXRlcjogUm91dGVyLCBwcml2YXRlIGVsOiBFbGVtZW50UmVmICkgeyB9XHJcblxyXG4gIHB1YmxpYyBoYXNDbGFzcygpIHtcclxuICAgIHJldHVybiB0aGlzLml0ZW0uY2xhc3MgPyB0cnVlIDogZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaXNEcm9wZG93bigpIHtcclxuICAgIHJldHVybiB0aGlzLml0ZW0uY2hpbGRyZW4gPyB0cnVlIDogZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdGhpc1VybCgpIHtcclxuICAgIHJldHVybiB0aGlzLml0ZW0udXJsO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzQWN0aXZlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMucm91dGVyLmlzQWN0aXZlKHRoaXMudGhpc1VybCgpLCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIFJlcGxhY2UodGhpcy5lbCk7XHJcbiAgfVxyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC1zaWRlYmFyLW5hdi1saW5rJyxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiZ2V0TGlua1R5cGUoKVwiPlxyXG4gICAgICA8YSAqbmdTd2l0Y2hDYXNlPVwiJ2Rpc2FibGVkJ1wiXHJcbiAgICAgIFthdHRyLmRpc2FibGVkXT1cInRydWVcIlxyXG4gICAgICBbYXBwTGlua0F0dHJpYnV0ZXNdPVwibGluay5hdHRyaWJ1dGVzXCJcclxuICAgICAgaHJlZj1cIlwiXHJcbiAgICAgIFtuZ0NsYXNzXT1cImdldENsYXNzZXMoKVwiPlxyXG4gICAgICAgIDxpICpuZ0lmPVwiaXNJY29uKClcIiBjbGFzcz1cIm5hdi1pY29uIHt7IGxpbmsuaWNvbiB9fVwiPjwvaT5cclxuICAgICAgICB7eyBsaW5rLm5hbWUgfX1cclxuICAgICAgICA8c3BhbiAqbmdJZj1cImlzQmFkZ2UoKVwiIFtuZ0NsYXNzXT1cIidiYWRnZSBiYWRnZS0nICsgbGluay5iYWRnZS52YXJpYW50XCI+e3sgbGluay5iYWRnZS50ZXh0IH19PC9zcGFuPlxyXG4gICAgICA8L2E+XHJcbiAgICAgIDxhICpuZ1N3aXRjaENhc2U9XCInZXh0ZXJuYWwnXCIgW25nQ2xhc3NdPVwiZ2V0Q2xhc3NlcygpXCIgaHJlZj1cInt7bGluay51cmx9fVwiIFthcHBMaW5rQXR0cmlidXRlc109XCJsaW5rLmF0dHJpYnV0ZXNcIj5cclxuICAgICAgICA8aSAqbmdJZj1cImlzSWNvbigpXCIgY2xhc3M9XCJuYXYtaWNvbiB7eyBsaW5rLmljb24gfX1cIj48L2k+XHJcbiAgICAgICAge3sgbGluay5uYW1lIH19XHJcbiAgICAgICAgPHNwYW4gKm5nSWY9XCJpc0JhZGdlKClcIiBbbmdDbGFzc109XCInYmFkZ2UgYmFkZ2UtJyArIGxpbmsuYmFkZ2UudmFyaWFudFwiPnt7IGxpbmsuYmFkZ2UudGV4dCB9fTwvc3Bhbj5cclxuICAgICAgPC9hPlxyXG4gICAgICA8YSAqbmdTd2l0Y2hEZWZhdWx0XHJcbiAgICAgICAgW25nQ2xhc3NdPVwiZ2V0Q2xhc3NlcygpXCJcclxuICAgICAgICBbYXBwTGlua0F0dHJpYnV0ZXNdPVwibGluay5hdHRyaWJ1dGVzXCJcclxuICAgICAgICByb3V0ZXJMaW5rQWN0aXZlPVwiYWN0aXZlXCJcclxuICAgICAgICBbcm91dGVyTGlua109XCJbbGluay51cmxdXCJcclxuICAgICAgICAoY2xpY2spPVwiaGlkZU1vYmlsZSgpXCI+XHJcbiAgICAgICAgPGkgKm5nSWY9XCJpc0ljb24oKVwiIGNsYXNzPVwibmF2LWljb24ge3sgbGluay5pY29uIH19XCI+PC9pPlxyXG4gICAgICAgIHt7IGxpbmsubmFtZSB9fVxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwiaXNCYWRnZSgpXCIgW25nQ2xhc3NdPVwiJ2JhZGdlIGJhZGdlLScgKyBsaW5rLmJhZGdlLnZhcmlhbnRcIj57eyBsaW5rLmJhZGdlLnRleHQgfX08L3NwYW4+XHJcbiAgICAgIDwvYT5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gIGBcclxufSlcclxuZXhwb3J0IGNsYXNzIEFwcFNpZGViYXJOYXZMaW5rQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICBASW5wdXQoKSBsaW5rOiBhbnk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb2N1bWVudDogYW55LFxyXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgZWw6IEVsZW1lbnRSZWZcclxuICApIHsgfVxyXG5cclxuICBwdWJsaWMgZ2V0Q2xhc3NlcygpIHtcclxuICAgIGNvbnN0IGRpc2FibGVkID0gdGhpcy5pc0Rpc2FibGVkKCk7XHJcbiAgICBjb25zdCBjbGFzc2VzID0ge1xyXG4gICAgICAnbmF2LWxpbmsnOiB0cnVlLFxyXG4gICAgICAnZGlzYWJsZWQnOiBkaXNhYmxlZCxcclxuICAgICAgJ2J0bi1saW5rJzogZGlzYWJsZWRcclxuICAgIH07XHJcbiAgICBpZiAodGhpcy5oYXNWYXJpYW50KCkpIHtcclxuICAgICAgY29uc3QgdmFyaWFudCA9IGBuYXYtbGluay0ke3RoaXMubGluay52YXJpYW50fWA7XHJcbiAgICAgIGNsYXNzZXNbdmFyaWFudF0gPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNsYXNzZXM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0TGlua1R5cGUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5pc0Rpc2FibGVkKCkgPyAnZGlzYWJsZWQnIDogdGhpcy5pc0V4dGVybmFsTGluaygpID8gJ2V4dGVybmFsJyA6ICcnO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGhhc1ZhcmlhbnQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5saW5rLnZhcmlhbnQgPyB0cnVlIDogZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaXNCYWRnZSgpIHtcclxuICAgIHJldHVybiB0aGlzLmxpbmsuYmFkZ2UgPyB0cnVlIDogZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaXNEaXNhYmxlZCgpIHtcclxuICAgIHJldHVybiB0aGlzLmxpbmsuYXR0cmlidXRlcyAmJiB0aGlzLmxpbmsuYXR0cmlidXRlcy5kaXNhYmxlZCA/IHRydWUgOiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc0V4dGVybmFsTGluaygpIHtcclxuICAgIHJldHVybiB0aGlzLmxpbmsudXJsLnN1YnN0cmluZygwLCA0KSA9PT0gJ2h0dHAnID8gdHJ1ZSA6IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzSWNvbigpIHtcclxuICAgIHJldHVybiB0aGlzLmxpbmsuaWNvbiA/IHRydWUgOiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBoaWRlTW9iaWxlKCkge1xyXG4gICAgaWYgKHRoaXMuZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoJ3NpZGViYXItc2hvdycpKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5kb2N1bWVudC5ib2R5LCAnc2lkZWJhci1zaG93Jyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIFJlcGxhY2UodGhpcy5lbCk7XHJcbiAgfVxyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC1zaWRlYmFyLW5hdi1kcm9wZG93bicsXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgIDxhIGNsYXNzPVwibmF2LWxpbmsgbmF2LWRyb3Bkb3duLXRvZ2dsZVwiIGFwcE5hdkRyb3Bkb3duVG9nZ2xlPlxyXG4gICAgICA8aSAqbmdJZj1cImlzSWNvbigpXCIgY2xhc3M9XCJuYXYtaWNvbiB7eyBsaW5rLmljb24gfX1cIj48L2k+XHJcbiAgICAgIHt7IGxpbmsubmFtZSB9fVxyXG4gICAgICA8c3BhbiAqbmdJZj1cImlzQmFkZ2UoKVwiIFtuZ0NsYXNzXT1cIidiYWRnZSBiYWRnZS0nICsgbGluay5iYWRnZS52YXJpYW50XCI+e3sgbGluay5iYWRnZS50ZXh0IH19PC9zcGFuPlxyXG4gICAgPC9hPlxyXG4gICAgPHVsIGNsYXNzPVwibmF2LWRyb3Bkb3duLWl0ZW1zXCI+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSBuZ0ZvciBsZXQtY2hpbGQgW25nRm9yT2ZdPVwibGluay5jaGlsZHJlblwiPlxyXG4gICAgICAgIDxhcHAtc2lkZWJhci1uYXYtaXRlbSBbaXRlbV09J2NoaWxkJz48L2FwcC1zaWRlYmFyLW5hdi1pdGVtPlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPC91bD5cclxuICBgLFxyXG4gIHN0eWxlczogWycubmF2LWRyb3Bkb3duLXRvZ2dsZSB7IGN1cnNvcjogcG9pbnRlcjsgfSddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBcHBTaWRlYmFyTmF2RHJvcGRvd25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIEBJbnB1dCgpIGxpbms6IGFueTtcclxuXHJcbiAgcHVibGljIGlzQmFkZ2UoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5saW5rLmJhZGdlID8gdHJ1ZSA6IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzSWNvbigpIHtcclxuICAgIHJldHVybiB0aGlzLmxpbmsuaWNvbiA/IHRydWUgOiBmYWxzZTtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKCBwcml2YXRlIHJvdXRlcjogUm91dGVyLCBwcml2YXRlIGVsOiBFbGVtZW50UmVmICkgeyB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgUmVwbGFjZSh0aGlzLmVsKTtcclxuICB9XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLXNpZGViYXItbmF2LXRpdGxlJyxcclxuICB0ZW1wbGF0ZTogJydcclxufSlcclxuZXhwb3J0IGNsYXNzIEFwcFNpZGViYXJOYXZUaXRsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgQElucHV0KCkgdGl0bGU6IGFueTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbDogRWxlbWVudFJlZiwgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICBjb25zdCBuYXRpdmVFbGVtZW50OiBIVE1MRWxlbWVudCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudDtcclxuICAgIGNvbnN0IGxpID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdsaScpO1xyXG4gICAgY29uc3QgbmFtZSA9IHRoaXMucmVuZGVyZXIuY3JlYXRlVGV4dCh0aGlzLnRpdGxlLm5hbWUpO1xyXG5cclxuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MobGksICduYXYtdGl0bGUnKTtcclxuXHJcbiAgICBpZiAoIHRoaXMudGl0bGUuY2xhc3MgKSB7XHJcbiAgICAgIGNvbnN0IGNsYXNzZXMgPSB0aGlzLnRpdGxlLmNsYXNzO1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGxpLCBjbGFzc2VzKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIHRoaXMudGl0bGUud3JhcHBlciApIHtcclxuICAgICAgY29uc3Qgd3JhcHBlciA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCh0aGlzLnRpdGxlLndyYXBwZXIuZWxlbWVudCk7XHJcblxyXG4gICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHdyYXBwZXIsIG5hbWUpO1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKGxpLCB3cmFwcGVyKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQobGksIG5hbWUpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChuYXRpdmVFbGVtZW50LCBsaSk7XHJcbiAgICBSZXBsYWNlKHRoaXMuZWwpO1xyXG4gIH1cclxufVxyXG4iXX0=