@kushki/ng-suka
Version:
<p align="center"> <h1 align="center">Suka Components Angular</h1> <p align="center"> An Angular implementation of the Suka Design System </p> </p>
372 lines (370 loc) • 26.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, HostBinding, Input, Output, EventEmitter, TemplateRef, ViewChild, ElementRef, ViewContainerRef } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { Overlay } from '@angular/cdk/overlay';
import { TemplatePortal } from '@angular/cdk/portal';
export class CalendarDayPicker {
/**
* Creates an instance of `CalendarDayPicker`.
* @param {?} _overlay
* @param {?} _viewContainerRef
*/
constructor(_overlay, _viewContainerRef) {
this._overlay = _overlay;
this._viewContainerRef = _viewContainerRef;
this._selectedDays = [];
this.baseClass = true;
this.containerClass = true;
/**
* Set to `true` for a disabled color input.
*/
this.disabled = false;
/**
* Set to `true` for a loading color input component.
*/
this.skeleton = false;
/**
* Set to `true` for an invalid color input component.
*/
this.invalid = false;
/**
* Set to `true` for a valid color input component.
*/
this.valid = false;
/**
* The unique id for the color input component.
*/
this.id = `calendar-day-picker-${CalendarDayPicker.calendarDayPickerCount}`;
/**
* Sets the value attribute on the `input` element.
*/
this.value = '';
/**
* Sets the placeholder on the `input` element.
*/
this.placeholder = '';
/**
* Emits event notifying other classes when a change in state occurs in the input.
*/
// tslint:disable-next-line: no-output-native
this.change = new EventEmitter();
/**
* Called when number input is blurred. Needed to properly implement `ControlValueAccessor`.
*/
this.onTouched = (/**
* @return {?}
*/
() => { });
/**
* Method set in `registerOnChange` to propagate changes back to the form.
*/
this.propagateChange = (/**
* @param {?} _
* @return {?}
*/
(_) => { });
CalendarDayPicker.calendarDayPickerCount++;
}
/**
* This is the initial value set to the component
* @param {?} value The input value.
* @return {?}
*/
writeValue(value) {
this.value = value || '';
if (value) {
this._selectedDays = JSON.parse('[' + value + ']');
}
}
/**
* Sets a method in order to propagate changes back to the form.
* @param {?} fn
* @return {?}
*/
registerOnChange(fn) {
this.propagateChange = fn;
}
/**
* Registers a callback to be triggered when the control has been touched.
* @param {?} fn Callback to be triggered when the number input is touched.
* @return {?}
*/
registerOnTouched(fn) {
this.onTouched = fn;
}
/**
* Sets the disabled state through the model
* @param {?} isDisabled
* @return {?}
*/
setDisabledState(isDisabled) {
this.disabled = isDisabled;
}
/**
* Creates a class of `NumberChange` to emit the change in the `Number`.
* @return {?}
*/
emitChangeEvent() {
this.change.emit(this.value);
this.propagateChange(this.value);
}
/**
* @param {?} days
* @return {?}
*/
onInputChange(days) {
this.value = JSON.parse('[' + days + ']');
this.emitChangeEvent();
}
/**
* @param {?} days
* @return {?}
*/
onDaysChange(days) {
this.value = days.toString();
this._selectedDays = days;
this.emitChangeEvent();
}
/**
* Opens the color picker dialog
* @return {?}
*/
openCalendarDayOverlay() {
if (!this._overlayRef) {
/** @type {?} */
const positionStrategy = this._overlay
.position()
.flexibleConnectedTo(this.origin)
.withPositions([{
originX: 'start',
originY: 'bottom',
overlayX: 'start',
overlayY: 'top',
offsetY: 8,
}]);
this._overlayRef = this._overlay.create({
hasBackdrop: true,
backdropClass: 'cdk-overlay-transparent-backdrop',
positionStrategy,
});
this._overlayRef.backdropClick().subscribe((/**
* @return {?}
*/
() => this._overlayRef.detach()));
this._portal = new TemplatePortal(this.dialog, this._viewContainerRef);
}
this._overlayRef.attach(this._portal);
}
/**
* Closes the calendar day dialog
* @return {?}
*/
closeCalendarDayOverlay() {
this._overlayRef.detach();
}
/**
* Checks if it is a template
* @param {?} value
* @return {?}
*/
isTemplate(value) {
return value instanceof TemplateRef;
}
}
/**
* Variable used for creating unique ids for color input components.
*/
CalendarDayPicker.calendarDayPickerCount = 0;
CalendarDayPicker.decorators = [
{ type: Component, args: [{
selector: 'suka-calendar-day-picker',
template: `
<label *ngIf="skeleton && label" class="label skeleton"></label>
<label *ngIf="!skeleton && label" [for]="id" class="label">
<ng-container *ngIf="!isTemplate(label)">{{label}}</ng-container>
<ng-template *ngIf="isTemplate(label)" [ngTemplateOutlet]="label"></ng-template>
</label>
<div *ngIf="!skeleton && helperText" class="form__helper-text">
<ng-container *ngIf="!isTemplate(helperText)">{{helperText}}</ng-container>
<ng-template *ngIf="isTemplate(helperText)" [ngTemplateOutlet]="helperText"></ng-template>
</div>
<div
[attr.data-invalid]="(invalid ? true : null)"
[attr.data-valid]="(valid ? true : null)"
class="calendar-day-picker"
[ngClass]="{
'calendar-day-picker--nolabel': !label,
'calendar-day-picker--helpertext': helperText,
'skeleton' : skeleton,
'calendar-day-picker--disabled': disabled
}">
<div class="calendar-day-picker__input-wrapper">
<input
#origin
type="text"
[id]="id"
[placeholder]="placeholder"
[value]="value"
[disabled]="disabled"
[required]="required"
(focus)="openCalendarDayOverlay()"
(change)="onInputChange($event)"/>
<suka-icon *ngIf="!skeleton && invalid" icon="alert-circle" class="calendar-day-picker__invalid"></suka-icon>
<suka-icon *ngIf="!skeleton && valid" icon="check" class="calendar-day-picker__valid"></suka-icon>
</div>
<div *ngIf="invalid" class="form-requirement">
<ng-container *ngIf="!isTemplate(invalidText)">{{invalidText}}</ng-container>
<ng-template *ngIf="isTemplate(invalidText)" [ngTemplateOutlet]="invalidText"></ng-template>
</div>
</div>
<ng-template #calendarDayOverlay>
<suka-calendar-day-overlay
[days]="_selectedDays"
(daysChange)="onDaysChange($event)"
>
</suka-calendar-day-overlay>
</ng-template>
`,
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: CalendarDayPicker,
multi: true
}
]
}] }
];
/** @nocollapse */
CalendarDayPicker.ctorParameters = () => [
{ type: Overlay },
{ type: ViewContainerRef }
];
CalendarDayPicker.propDecorators = {
baseClass: [{ type: HostBinding, args: ['class.calendar-day-picker',] }],
containerClass: [{ type: HostBinding, args: ['class.form-item',] }],
disabled: [{ type: Input }],
skeleton: [{ type: Input }],
invalid: [{ type: Input }],
valid: [{ type: Input }],
id: [{ type: Input }],
required: [{ type: Input }],
value: [{ type: Input }],
placeholder: [{ type: Input }],
label: [{ type: Input }],
helperText: [{ type: Input }],
invalidText: [{ type: Input }],
change: [{ type: Output }],
origin: [{ type: ViewChild, args: ['origin', { static: false },] }],
dialog: [{ type: ViewChild, args: ['calendarDayOverlay', { static: false },] }]
};
if (false) {
/**
* Variable used for creating unique ids for color input components.
* @type {?}
*/
CalendarDayPicker.calendarDayPickerCount;
/**
* @type {?}
* @private
*/
CalendarDayPicker.prototype._overlayRef;
/**
* @type {?}
* @private
*/
CalendarDayPicker.prototype._portal;
/** @type {?} */
CalendarDayPicker.prototype._selectedDays;
/** @type {?} */
CalendarDayPicker.prototype.baseClass;
/** @type {?} */
CalendarDayPicker.prototype.containerClass;
/**
* Set to `true` for a disabled color input.
* @type {?}
*/
CalendarDayPicker.prototype.disabled;
/**
* Set to `true` for a loading color input component.
* @type {?}
*/
CalendarDayPicker.prototype.skeleton;
/**
* Set to `true` for an invalid color input component.
* @type {?}
*/
CalendarDayPicker.prototype.invalid;
/**
* Set to `true` for a valid color input component.
* @type {?}
*/
CalendarDayPicker.prototype.valid;
/**
* The unique id for the color input component.
* @type {?}
*/
CalendarDayPicker.prototype.id;
/**
* Reflects the required attribute of the `input` element.
* @type {?}
*/
CalendarDayPicker.prototype.required;
/**
* Sets the value attribute on the `input` element.
* @type {?}
*/
CalendarDayPicker.prototype.value;
/**
* Sets the placeholder on the `input` element.
* @type {?}
*/
CalendarDayPicker.prototype.placeholder;
/**
* Sets the text inside the `label` tag.
* @type {?}
*/
CalendarDayPicker.prototype.label;
/**
* Sets the optional helper text.
* @type {?}
*/
CalendarDayPicker.prototype.helperText;
/**
* Sets the invalid text.
* @type {?}
*/
CalendarDayPicker.prototype.invalidText;
/**
* Emits event notifying other classes when a change in state occurs in the input.
* @type {?}
*/
CalendarDayPicker.prototype.change;
/** @type {?} */
CalendarDayPicker.prototype.origin;
/** @type {?} */
CalendarDayPicker.prototype.dialog;
/**
* Called when number input is blurred. Needed to properly implement `ControlValueAccessor`.
* @type {?}
*/
CalendarDayPicker.prototype.onTouched;
/**
* Method set in `registerOnChange` to propagate changes back to the form.
* @type {?}
*/
CalendarDayPicker.prototype.propagateChange;
/**
* @type {?}
* @private
*/
CalendarDayPicker.prototype._overlay;
/**
* @type {?}
* @private
*/
CalendarDayPicker.prototype._viewContainerRef;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItZGF5LXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Aa3VzaGtpL25nLXN1a2EvIiwic291cmNlcyI6WyJsaWIvY2FsZW5kYXItZGF5LXBpY2tlci9jYWxlbmRhci1kYXktcGlja2VyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxZQUFZLEVBQTRCLFdBQVcsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVLLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBNkRyRCxNQUFNLE9BQU8saUJBQWlCOzs7Ozs7SUFxRTVCLFlBQ1UsUUFBaUIsRUFDakIsaUJBQW1DO1FBRG5DLGFBQVEsR0FBUixRQUFRLENBQVM7UUFDakIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFrQjtRQS9EN0Msa0JBQWEsR0FBYSxFQUFFLENBQUM7UUFFYSxjQUFTLEdBQUcsSUFBSSxDQUFDO1FBRTNCLG1CQUFjLEdBQUcsSUFBSSxDQUFDOzs7O1FBSTdDLGFBQVEsR0FBRyxLQUFLLENBQUM7Ozs7UUFJakIsYUFBUSxHQUFHLEtBQUssQ0FBQzs7OztRQUlqQixZQUFPLEdBQUcsS0FBSyxDQUFDOzs7O1FBSWhCLFVBQUssR0FBRyxLQUFLLENBQUM7Ozs7UUFJZCxPQUFFLEdBQUcsdUJBQXVCLGlCQUFpQixDQUFDLHNCQUFzQixFQUFFLENBQUM7Ozs7UUFRdkUsVUFBSyxHQUFHLEVBQUUsQ0FBQzs7OztRQUlYLGdCQUFXLEdBQUcsRUFBRSxDQUFDOzs7OztRQWlCaEIsV0FBTSxHQUFHLElBQUksWUFB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QXNDOztJQUV0QyxtQ0FBMkQ7O0lBQzNELG1DQUE2RTs7Ozs7SUFpRDdFLHNDQUFpQzs7Ozs7SUFLakMsNENBQWtDOzs7OztJQWhEaEMscUNBQXlCOzs7OztJQUN6Qiw4Q0FBMkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEhvc3RCaW5kaW5nLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgU2ltcGxlQ2hhbmdlcywgT25DaGFuZ2VzLCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkLCBFbGVtZW50UmVmLCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBPdmVybGF5UmVmLCBPdmVybGF5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHsgVGVtcGxhdGVQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc3VrYS1jYWxlbmRhci1kYXktcGlja2VyJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8bGFiZWwgKm5nSWY9XCJza2VsZXRvbiAmJiBsYWJlbFwiIGNsYXNzPVwibGFiZWwgc2tlbGV0b25cIj48L2xhYmVsPlxuICAgIDxsYWJlbCAqbmdJZj1cIiFza2VsZXRvbiAmJiBsYWJlbFwiIFtmb3JdPVwiaWRcIiBjbGFzcz1cImxhYmVsXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzVGVtcGxhdGUobGFiZWwpXCI+e3tsYWJlbH19PC9uZy1jb250YWluZXI+XG4gICAgICA8bmctdGVtcGxhdGUgKm5nSWY9XCJpc1RlbXBsYXRlKGxhYmVsKVwiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImxhYmVsXCI+PC9uZy10ZW1wbGF0ZT5cbiAgICA8L2xhYmVsPlxuICAgIDxkaXYgKm5nSWY9XCIhc2tlbGV0b24gJiYgaGVscGVyVGV4dFwiIGNsYXNzPVwiZm9ybV9faGVscGVyLXRleHRcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNUZW1wbGF0ZShoZWxwZXJUZXh0KVwiPnt7aGVscGVyVGV4dH19PC9uZy1jb250YWluZXI+XG4gICAgICA8bmctdGVtcGxhdGUgKm5nSWY9XCJpc1RlbXBsYXRlKGhlbHBlclRleHQpXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwiaGVscGVyVGV4dFwiPjwvbmctdGVtcGxhdGU+XG4gICAgPC9kaXY+XG4gICAgPGRpdlxuICAgICAgW2F0dHIuZGF0YS1pbnZhbGlkXT1cIihpbnZhbGlkID8gdHJ1ZSA6IG51bGwpXCJcbiAgICAgIFthdHRyLmRhdGEtdmFsaWRdPVwiKHZhbGlkID8gdHJ1ZSA6IG51bGwpXCJcbiAgICAgIGNsYXNzPVwiY2FsZW5kYXItZGF5LXBpY2tlclwiXG4gICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICdjYWxlbmRhci1kYXktcGlja2VyLS1ub2xhYmVsJzogIWxhYmVsLFxuICAgICAgICAnY2FsZW5kYXItZGF5LXBpY2tlci0taGVscGVydGV4dCc6IGhlbHBlclRleHQsXG4gICAgICAgICdza2VsZXRvbicgOiBza2VsZXRvbixcbiAgICAgICAgJ2NhbGVuZGFyLWRheS1waWNrZXItLWRpc2FibGVkJzogZGlzYWJsZWRcbiAgICAgIH1cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYWxlbmRhci1kYXktcGlja2VyX19pbnB1dC13cmFwcGVyXCI+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgICNvcmlnaW5cbiAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgW2lkXT1cImlkXCJcbiAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgICAgICAgIFt2YWx1ZV09XCJ2YWx1ZVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuICAgICAgICAgIChmb2N1cyk9XCJvcGVuQ2FsZW5kYXJEYXlPdmVybGF5KClcIlxuICAgICAgICAgIChjaGFuZ2UpPVwib25JbnB1dENoYW5nZSgkZXZlbnQpXCIvPlxuXG4gICAgICAgIDxzdWthLWljb24gKm5nSWY9XCIhc2tlbGV0b24gJiYgaW52YWxpZFwiIGljb249XCJhbGVydC1jaXJjbGVcIiBjbGFzcz1cImNhbGVuZGFyLWRheS1waWNrZXJfX2ludmFsaWRcIj48L3N1a2EtaWNvbj5cbiAgICAgICAgPHN1a2EtaWNvbiAqbmdJZj1cIiFza2VsZXRvbiAmJiB2YWxpZFwiIGljb249XCJjaGVja1wiIGNsYXNzPVwiY2FsZW5kYXItZGF5LXBpY2tlcl9fdmFsaWRcIj48L3N1a2EtaWNvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cImludmFsaWRcIiBjbGFzcz1cImZvcm0tcmVxdWlyZW1lbnRcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1RlbXBsYXRlKGludmFsaWRUZXh0KVwiPnt7aW52YWxpZFRleHR9fTwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctdGVtcGxhdGUgKm5nSWY9XCJpc1RlbXBsYXRlKGludmFsaWRUZXh0KVwiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImludmFsaWRUZXh0XCI+PC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPG5nLXRlbXBsYXRlICNjYWxlbmRhckRheU92ZXJsYXk+XG4gICAgICA8c3VrYS1jYWxlbmRhci1kYXktb3ZlcmxheVxuICAgICAgICBbZGF5c109XCJfc2VsZWN0ZWREYXlzXCJcbiAgICAgICAgKGRheXNDaGFuZ2UpPVwib25EYXlzQ2hhbmdlKCRldmVudClcIlxuICAgICAgPlxuICAgICAgPC9zdWthLWNhbGVuZGFyLWRheS1vdmVybGF5PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIGAsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IENhbGVuZGFyRGF5UGlja2VyLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgQ2FsZW5kYXJEYXlQaWNrZXIgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gIC8qKlxuICAgKiBWYXJpYWJsZSB1c2VkIGZvciBjcmVhdGluZyB1bmlxdWUgaWRzIGZvciBjb2xvciBpbnB1dCBjb21wb25lbnRzLlxuICAgKi9cbiAgc3RhdGljIGNhbGVuZGFyRGF5UGlja2VyQ291bnQgPSAwO1xuICBwcml2YXRlIF9vdmVybGF5UmVmOiBPdmVybGF5UmVmO1xuICBwcml2YXRlIF9wb3J0YWw6IFRlbXBsYXRlUG9ydGFsPGFueT47XG5cbiAgX3NlbGVjdGVkRGF5czogbnVtYmVyW10gPSBbXTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmNhbGVuZGFyLWRheS1waWNrZXInKSBiYXNlQ2xhc3MgPSB0cnVlO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuZm9ybS1pdGVtJykgY29udGFpbmVyQ2xhc3MgPSB0cnVlO1xuICAvKipcbiAgICogU2V0IHRvIGB0cnVlYCBmb3IgYSBkaXNhYmxlZCBjb2xvciBpbnB1dC5cbiAgICovXG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG4gIC8qKlxuICAgKiBTZXQgdG8gYHRydWVgIGZvciBhIGxvYWRpbmcgY29sb3IgaW5wdXQgY29tcG9uZW50LlxuICAgKi9cbiAgQElucHV0KCkgc2tlbGV0b24gPSBmYWxzZTtcbiAgLyoqXG4gICAqIFNldCB0byBgdHJ1ZWAgZm9yIGFuIGludmFsaWQgY29sb3IgaW5wdXQgY29tcG9uZW50LlxuICAgKi9cbiAgQElucHV0KCkgaW52YWxpZCA9IGZhbHNlO1xuICAvKipcbiAgICogU2V0IHRvIGB0cnVlYCBmb3IgYSB2YWxpZCBjb2xvciBpbnB1dCBjb21wb25lbnQuXG4gICAqL1xuICBASW5wdXQoKSB2YWxpZCA9IGZhbHNlO1xuICAvKipcbiAgICogVGhlIHVuaXF1ZSBpZCBmb3IgdGhlIGNvbG9yIGlucHV0IGNvbXBvbmVudC5cbiAgICovXG4gIEBJbnB1dCgpIGlkID0gYGNhbGVuZGFyLWRheS1waWNrZXItJHtDYWxlbmRhckRheVBpY2tlci5jYWxlbmRhckRheVBpY2tlckNvdW50fWA7XG4gIC8qKlxuICAgKiBSZWZsZWN0cyB0aGUgcmVxdWlyZWQgYXR0cmlidXRlIG9mIHRoZSBgaW5wdXRgIGVsZW1lbnQuXG4gICAqL1xuICBASW5wdXQoKSByZXF1aXJlZDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFNldHMgdGhlIHZhbHVlIGF0dHJpYnV0ZSBvbiB0aGUgYGlucHV0YCBlbGVtZW50LlxuICAgKi9cbiAgQElucHV0KCkgdmFsdWUgPSAnJztcbiAgLyoqXG4gICAqIFNldHMgdGhlIHBsYWNlaG9sZGVyIG9uIHRoZSBgaW5wdXRgIGVsZW1lbnQuXG4gICAqL1xuICBASW5wdXQoKSBwbGFjZWhvbGRlciA9ICcnO1xuICAvKipcbiAgICogU2V0cyB0aGUgdGV4dCBpbnNpZGUgdGhlIGBsYWJlbGAgdGFnLlxuICAgKi9cbiAgQElucHV0KCkgbGFiZWw6IHN0cmluZyB8IFRlbXBsYXRlUmVmPGFueT47XG4gIC8qKlxuICAgKiBTZXRzIHRoZSBvcHRpb25hbCBoZWxwZXIgdGV4dC5cbiAgICovXG4gIEBJbnB1dCgpIGhlbHBlclRleHQ6IHN0cmluZyB8IFRlbXBsYXRlUmVmPGFueT47XG4gIC8qKlxuICAgKiBTZXRzIHRoZSBpbnZhbGlkIHRleHQuXG4gICAqL1xuICBASW5wdXQoKSBpbnZhbGlkVGV4dDogc3RyaW5nIHwgVGVtcGxhdGVSZWY8YW55PjtcbiAgLyoqXG4gICAqIEVtaXRzIGV2ZW50IG5vdGlmeWluZyBvdGhlciBjbGFzc2VzIHdoZW4gYSBjaGFuZ2UgaW4gc3RhdGUgb2NjdXJzIGluIHRoZSBpbnB1dC5cbiAgICovXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tb3V0cHV0LW5hdGl2ZVxuICBAT3V0cHV0KCkgY2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBWaWV3Q2hpbGQoJ29yaWdpbicsIHsgc3RhdGljOiBmYWxzZSB9KSBvcmlnaW46IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ2NhbGVuZGFyRGF5T3ZlcmxheScsIHsgc3RhdGljOiBmYWxzZSB9KSBkaWFsb2c6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgYENhbGVuZGFyRGF5UGlja2VyYC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX292ZXJsYXk6IE92ZXJsYXksXG4gICAgcHJpdmF0ZSBfdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZlxuICApIHtcbiAgICBDYWxlbmRhckRheVBpY2tlci5jYWxlbmRhckRheVBpY2tlckNvdW50Kys7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBpcyB0aGUgaW5pdGlhbCB2YWx1ZSBzZXQgdG8gdGhlIGNvbXBvbmVudFxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIGlucHV0IHZhbHVlLlxuICAgKi9cbiAgcHVibGljIHdyaXRlVmFsdWUodmFsdWU6IGFueSkge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZSB8fCAnJztcblxuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy5fc2VsZWN0ZWREYXlzID0gSlNPTi5wYXJzZSgnWycgKyB2YWx1ZSArICddJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgYSBtZXRob2QgaW4gb3JkZXIgdG8gcHJvcGFnYXRlIGNoYW5nZXMgYmFjayB0byB0aGUgZm9ybS5cbiAgICovXG4gIHB1YmxpYyByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpIHtcbiAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSA9IGZuO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGNhbGxiYWNrIHRvIGJlIHRyaWdnZXJlZCB3aGVuIHRoZSBjb250cm9sIGhhcyBiZWVuIHRvdWNoZWQuXG4gICAqIEBwYXJhbSBmbiBDYWxsYmFjayB0byBiZSB0cmlnZ2VyZWQgd2hlbiB0aGUgbnVtYmVyIGlucHV0IGlzIHRvdWNoZWQuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSkge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgZGlzYWJsZWQgc3RhdGUgdGhyb3VnaCB0aGUgbW9kZWxcbiAgICovXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbikge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIG51bWJlciBpbnB1dCBpcyBibHVycmVkLiBOZWVkZWQgdG8gcHJvcGVybHkgaW1wbGVtZW50IGBDb250cm9sVmFsdWVBY2Nlc3NvcmAuXG4gICAqL1xuICBvblRvdWNoZWQ6ICgpID0+IGFueSA9ICgpID0+IHsgfTtcblxuICAvKipcbiAgICogTWV0aG9kIHNldCBpbiBgcmVnaXN0ZXJPbkNoYW5nZWAgdG8gcHJvcGFnYXRlIGNoYW5nZXMgYmFjayB0byB0aGUgZm9ybS5cbiAgICovXG4gIHByb3BhZ2F0ZUNoYW5nZSA9IChfOiBhbnkpID0+IHsgfTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGNsYXNzIG9mIGBOdW1iZXJDaGFuZ2VgIHRvIGVtaXQgdGhlIGNoYW5nZSBpbiB0aGUgYE51bWJlcmAuXG4gICAqL1xuICBlbWl0Q2hhbmdlRXZlbnQoKTogdm9pZCB7XG4gICAgdGhpcy5jaGFuZ2UuZW1pdCh0aGlzLnZhbHVlKTtcbiAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSh0aGlzLnZhbHVlKTtcbiAgfVxuXG4gIG9uSW5wdXRDaGFuZ2UoZGF5czogc3RyaW5nKSB7XG4gICAgdGhpcy52YWx1ZSA9IEpTT04ucGFyc2UoJ1snICsgZGF5cyArICddJyk7XG4gICAgdGhpcy5lbWl0Q2hhbmdlRXZlbnQoKTtcbiAgfVxuXG4gIG9uRGF5c0NoYW5nZShkYXlzOiBudW1iZXJbXSkge1xuICAgIHRoaXMudmFsdWUgPSBkYXlzLnRvU3RyaW5nKCk7XG4gICAgdGhpcy5fc2VsZWN0ZWREYXlzID0gZGF5cztcbiAgICB0aGlzLmVtaXRDaGFuZ2VFdmVudCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW5zIHRoZSBjb2xvciBwaWNrZXIgZGlhbG9nXG4gICAqL1xuICBvcGVuQ2FsZW5kYXJEYXlPdmVybGF5KCkge1xuICAgIGlmICghdGhpcy5fb3ZlcmxheVJlZikge1xuICAgICAgY29uc3QgcG9zaXRpb25TdHJhdGVneSA9IHRoaXMuX292ZXJsYXlcbiAgICAgICAgLnBvc2l0aW9uKClcbiAgICAgICAgLmZsZXhpYmxlQ29ubmVjdGVkVG8odGhpcy5vcmlnaW4pXG4gICAgICAgIC53aXRoUG9zaXRpb25zKFt7XG4gICAgICAgICAgb3JpZ2luWDogJ3N0YXJ0JyxcbiAgICAgICAgICBvcmlnaW5ZOiAnYm90dG9tJyxcbiAgICAgICAgICBvdmVybGF5WDogJ3N0YXJ0JyxcbiAgICAgICAgICBvdmVybGF5WTogJ3RvcCcsXG4gICAgICAgICAgb2Zmc2V0WTogOCxcbiAgICAgICAgfV0pO1xuXG4gICAgICB0aGlzLl9vdmVybGF5UmVmID0gdGhpcy5fb3ZlcmxheS5jcmVhdGUoe1xuICAgICAgICBoYXNCYWNrZHJvcDogdHJ1ZSxcbiAgICAgICAgYmFja2Ryb3BDbGFzczogJ2Nkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wJyxcbiAgICAgICAgcG9zaXRpb25TdHJhdGVneSxcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLl9vdmVybGF5UmVmLmJhY2tkcm9wQ2xpY2soKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5fb3ZlcmxheVJlZi5kZXRhY2goKSk7XG4gICAgICB0aGlzLl9wb3J0YWwgPSBuZXcgVGVtcGxhdGVQb3J0YWwodGhpcy5kaWFsb2csIHRoaXMuX3ZpZXdDb250YWluZXJSZWYpO1xuXG4gICAgfVxuXG4gICAgdGhpcy5fb3ZlcmxheVJlZi5hdHRhY2godGhpcy5fcG9ydGFsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgdGhlIGNhbGVuZGFyIGRheSBkaWFsb2dcbiAgICovXG4gIGNsb3NlQ2FsZW5kYXJEYXlPdmVybGF5KCkge1xuICAgIHRoaXMuX292ZXJsYXlSZWYuZGV0YWNoKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGl0IGlzIGEgdGVtcGxhdGVcbiAgICovXG4gIHB1YmxpYyBpc1RlbXBsYXRlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgVGVtcGxhdGVSZWY7XG4gIH1cbn1cbiJdfQ==