UNPKG

@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>

324 lines 22.8 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, Input, HostBinding, EventEmitter, Output, TemplateRef } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { NumberChange } from './number-change.class'; // tslint:disable-next-line: component-class-suffix export class Number { /** * Creates an instance of `Number`. */ constructor() { this.containerClass = true; /** * Set to `true` for a disabled number input. */ this.disabled = false; /** * Set to `true` for a loading number component. */ this.skeleton = false; /** * Set to `true` for an invalid number component. */ this.invalid = false; /** * Set to `true` for a valid number component. */ this.valid = false; /** * The unique id for the number component. */ this.id = `number-input-${Number.numberCount}`; /** * Sets the value attribute on the `input` element. */ this.value = 0; /** * Sets the min attribute on the `input` element. */ this.min = null; /** * Sets the max attribute on the `input` element. */ this.max = null; /** * 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 {?} */ (_) => { }); Number.numberCount++; } /** * This is the initial value set to the component * @param {?} value The input value. * @return {?} */ writeValue(value) { this.value = 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; } /** * Adds 1 to the current `value`. * @return {?} */ onIncrement() { if (this.max === null || this.value < this.max) { this.value++; this.emitChangeEvent(); } } /** * Subtracts 1 to the current `value`. * @return {?} */ onDecrement() { if (this.min === null || this.value > this.min) { this.value--; this.emitChangeEvent(); } } /** * Creates a class of `NumberChange` to emit the change in the `Number`. * @return {?} */ emitChangeEvent() { /** @type {?} */ const event = new NumberChange(); event.source = this; event.value = this.value; this.change.emit(event); this.propagateChange(this.value); } /** * @param {?} event * @return {?} */ onNumberInputChange(event) { this.value = event.target.value; this.emitChangeEvent(); } /** * @param {?} value * @return {?} */ isTemplate(value) { return value instanceof TemplateRef; } } /** * Variable used for creating unique ids for number input components. */ Number.numberCount = 0; Number.decorators = [ { type: Component, args: [{ selector: 'suka-number', 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 data-numberinput [attr.data-invalid]="(invalid ? true : null)" [attr.data-valid]="(valid ? true : null)" class="number-input" [ngClass]="{ 'number-input--nolabel': !label, 'number-input--helpertext': helperText, 'skeleton' : skeleton }"> <div class="number-input__input-wrapper"> <input type="number" [id]="id" [value]="value" [attr.min]="min" [attr.max]="max" [disabled]="disabled" [required]="required" (input)="onNumberInputChange($event)"/> <suka-icon *ngIf="!skeleton && invalid" icon="alert-circle" class="number-input__invalid"></suka-icon> <suka-icon *ngIf="!skeleton && valid" icon="check" class="number-input__valid"></suka-icon> <div *ngIf="!skeleton" class="number-input__controls"> <button class="number-input__control-btn up-icon" type="button" aria-live="polite" aria-atomic="true" (click)="onIncrement()"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512" height="16" width="16"><path fill="currentColor" d="M288.662 352H31.338c-17.818 0-26.741-21.543-14.142-34.142l128.662-128.662c7.81-7.81 20.474-7.81 28.284 0l128.662 128.662c12.6 12.599 3.676 34.142-14.142 34.142z"></path></svg> </button> <button class="number-input__control-btn down-icon" type="button" aria-live="polite" aria-atomic="true" (click)="onDecrement()"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512" height="16" width="16"><path fill="currentColor" d="M31.3 192h257.3c17.8 0 26.7 21.5 14.1 34.1L174.1 354.8c-7.8 7.8-20.5 7.8-28.3 0L17.2 226.1C4.6 213.5 13.5 192 31.3 192z"></path></svg> </button> </div> </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> `, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: Number, multi: true } ] }] } ]; /** @nocollapse */ Number.ctorParameters = () => []; Number.propDecorators = { 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 }], min: [{ type: Input }], max: [{ type: Input }], label: [{ type: Input }], helperText: [{ type: Input }], invalidText: [{ type: Input }], change: [{ type: Output }] }; if (false) { /** * Variable used for creating unique ids for number input components. * @type {?} */ Number.numberCount; /** @type {?} */ Number.prototype.containerClass; /** * Set to `true` for a disabled number input. * @type {?} */ Number.prototype.disabled; /** * Set to `true` for a loading number component. * @type {?} */ Number.prototype.skeleton; /** * Set to `true` for an invalid number component. * @type {?} */ Number.prototype.invalid; /** * Set to `true` for a valid number component. * @type {?} */ Number.prototype.valid; /** * The unique id for the number component. * @type {?} */ Number.prototype.id; /** * Reflects the required attribute of the `input` element. * @type {?} */ Number.prototype.required; /** * Sets the value attribute on the `input` element. * @type {?} */ Number.prototype.value; /** * Sets the min attribute on the `input` element. * @type {?} */ Number.prototype.min; /** * Sets the max attribute on the `input` element. * @type {?} */ Number.prototype.max; /** * Sets the text inside the `label` tag. * @type {?} */ Number.prototype.label; /** * Sets the optional helper text. * @type {?} */ Number.prototype.helperText; /** * Sets the invalid text. * @type {?} */ Number.prototype.invalidText; /** * Emits event notifying other classes when a change in state occurs in the input. * @type {?} */ Number.prototype.change; /** * Called when number input is blurred. Needed to properly implement `ControlValueAccessor`. * @type {?} */ Number.prototype.onTouched; /** * Method set in `registerOnChange` to propagate changes back to the form. * @type {?} */ Number.prototype.propagateChange; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVtYmVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BrdXNoa2kvbmctc3VrYS8iLCJzb3VyY2VzIjpbImxpYi9udW1iZXItaW5wdXQvbnVtYmVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsV0FBVyxFQUNYLFlBQVksRUFDWixNQUFNLEVBQ04sV0FBVyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBd0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFxRXJELG1EQUFtRDtBQUNuRCxNQUFNLE9BQU8sTUFBTTs7OztJQWdFakI7UUExRGdDLG1CQUFjLEdBQUcsSUFBSSxDQUFDOzs7O1FBSTdDLGFBQVEsR0FBRyxLQUFLLENBQUM7Ozs7UUFJakIsYUFBUSxHQUFHLEtBQUssQ0FBQzs7OztRQUlqQixZQUFPLEdBQUcsS0FBSyxDQUFDOzs7O1FBSWhCLFVBQUssR0FBRyxLQUFLLENBQUM7Ozs7UUFJZCxPQUFFLEdBQUcsZ0JBQWdCLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQzs7OztRQVExQyxVQUFLLEdBQUcsQ0FBQyxDQUFDOzs7O1FBSVYsUUFBRyxHQUFHLElBQUksQ0FBQzs7OztRQUlYLFFBQUcsR0FBRyxJQUFJLENBQUM7Ozs7O1FBaUJWLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBZ0IsQ0FBQzs7OztRQTBDcEQsY0FBUzs7O1FBQWMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFDOzs7O1FBS2pDLG9CQUFlOzs7O1FBQUcsQ0FBQyxDQUFNLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBQztRQXpDaEMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7Ozs7OztJQU1NLFVBQVUsQ0FBQyxLQUFVO1FBQzFCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLENBQUM7Ozs7OztJQUtNLGdCQUFnQixDQUFDLEVBQU87UUFDN0IsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7SUFDNUIsQ0FBQzs7Ozs7O0lBTU0saUJBQWlCLENBQUMsRUFBTztRQUM5QixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztJQUN0QixDQUFDOzs7Ozs7SUFLRCxnQkFBZ0IsQ0FBQyxVQUFtQjtRQUNsQyxJQUFJLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztJQUM3QixDQUFDOzs7OztJQWVELFdBQVc7UUFDVCxJQUFJLElBQUksQ0FBQyxHQUFHLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUM5QyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDYixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7U0FDeEI7SUFDSCxDQUFDOzs7OztJQUtELFdBQVc7UUFDVCxJQUFJLElBQUksQ0FBQyxHQUFHLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUM5QyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDYixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7U0FDeEI7SUFDSCxDQUFDOzs7OztJQUtELGVBQWU7O2NBQ1AsS0FBSyxHQUFHLElBQUksWUFBWSxFQUFFO1FBQ2hDLEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuQyxDQUFDOzs7OztJQUVELG1CQUFtQixDQUFDLEtBQUs7UUFDdkIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUNoQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDekIsQ0FBQzs7Ozs7SUFFTSxVQUFVLENBQUMsS0FBSztRQUNyQixPQUFPLEtBQUssWUFBWSxXQUFXLENBQUM7SUFDdEMsQ0FBQzs7Ozs7QUE5SU0sa0JBQVcsR0FBRyxDQUFDLENBQUM7O1lBeEV4QixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLGFBQWE7Z0JBQ3ZCLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3RFQ7Z0JBQ0QsU0FBUyxFQUFFO29CQUNUO3dCQUNFLE9BQU8sRUFBRSxpQkFBaUI7d0JBQzFCLFdBQVcsRUFBRSxNQUFNO3dCQUNuQixLQUFLLEVBQUUsSUFBSTtxQkFDWjtpQkFDRjthQUNGOzs7Ozs2QkFRRSxXQUFXLFNBQUMsaUJBQWlCO3VCQUk3QixLQUFLO3VCQUlMLEtBQUs7c0JBSUwsS0FBSztvQkFJTCxLQUFLO2lCQUlMLEtBQUs7dUJBSUwsS0FBSztvQkFJTCxLQUFLO2tCQUlMLEtBQUs7a0JBSUwsS0FBSztvQkFJTCxLQUFLO3lCQUlMLEtBQUs7MEJBSUwsS0FBSztxQkFLTCxNQUFNOzs7Ozs7O0lBdkRQLG1CQUF1Qjs7SUFFdkIsZ0NBQXNEOzs7OztJQUl0RCwwQkFBMEI7Ozs7O0lBSTFCLDBCQUEwQjs7Ozs7SUFJMUIseUJBQXlCOzs7OztJQUl6Qix1QkFBdUI7Ozs7O0lBSXZCLG9CQUFtRDs7Ozs7SUFJbkQsMEJBQTJCOzs7OztJQUkzQix1QkFBbUI7Ozs7O0lBSW5CLHFCQUFvQjs7Ozs7SUFJcEIscUJBQW9COzs7OztJQUlwQix1QkFBMEM7Ozs7O0lBSTFDLDRCQUErQzs7Ozs7SUFJL0MsNkJBQWdEOzs7OztJQUtoRCx3QkFBb0Q7Ozs7O0lBMENwRCwyQkFBaUM7Ozs7O0lBS2pDLGlDQUFrQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIEhvc3RCaW5kaW5nLFxuICBFdmVudEVtaXR0ZXIsXG4gIE91dHB1dCxcbiAgVGVtcGxhdGVSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOR19WQUxVRV9BQ0NFU1NPUiwgQ29udHJvbFZhbHVlQWNjZXNzb3IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBOdW1iZXJDaGFuZ2UgfSBmcm9tICcuL251bWJlci1jaGFuZ2UuY2xhc3MnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzdWthLW51bWJlcicsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGxhYmVsICpuZ0lmPVwic2tlbGV0b24gJiYgbGFiZWxcIiBjbGFzcz1cImxhYmVsIHNrZWxldG9uXCI+PC9sYWJlbD5cbiAgICA8bGFiZWwgKm5nSWY9XCIhc2tlbGV0b24gJiYgbGFiZWxcIiBbZm9yXT1cImlkXCIgY2xhc3M9XCJsYWJlbFwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1RlbXBsYXRlKGxhYmVsKVwiPnt7bGFiZWx9fTwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLXRlbXBsYXRlICpuZ0lmPVwiaXNUZW1wbGF0ZShsYWJlbClcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJsYWJlbFwiPjwvbmctdGVtcGxhdGU+XG4gICAgPC9sYWJlbD5cbiAgICA8ZGl2ICpuZ0lmPVwiIXNrZWxldG9uICYmIGhlbHBlclRleHRcIiBjbGFzcz1cImZvcm1fX2hlbHBlci10ZXh0XCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzVGVtcGxhdGUoaGVscGVyVGV4dClcIj57e2hlbHBlclRleHR9fTwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLXRlbXBsYXRlICpuZ0lmPVwiaXNUZW1wbGF0ZShoZWxwZXJUZXh0KVwiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImhlbHBlclRleHRcIj48L25nLXRlbXBsYXRlPlxuICAgIDwvZGl2PlxuICAgIDxkaXZcbiAgICAgIGRhdGEtbnVtYmVyaW5wdXRcbiAgICAgIFthdHRyLmRhdGEtaW52YWxpZF09XCIoaW52YWxpZCA/IHRydWUgOiBudWxsKVwiXG4gICAgICBbYXR0ci5kYXRhLXZhbGlkXT1cIih2YWxpZCA/IHRydWUgOiBudWxsKVwiXG4gICAgICBjbGFzcz1cIm51bWJlci1pbnB1dFwiXG4gICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICdudW1iZXItaW5wdXQtLW5vbGFiZWwnOiAhbGFiZWwsXG4gICAgICAgICdudW1iZXItaW5wdXQtLWhlbHBlcnRleHQnOiBoZWxwZXJUZXh0LFxuICAgICAgICAnc2tlbGV0b24nIDogc2tlbGV0b25cbiAgICAgIH1cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJudW1iZXItaW5wdXRfX2lucHV0LXdyYXBwZXJcIj5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgW2lkXT1cImlkXCJcbiAgICAgICAgICBbdmFsdWVdPVwidmFsdWVcIlxuICAgICAgICAgIFthdHRyLm1pbl09XCJtaW5cIlxuICAgICAgICAgIFthdHRyLm1heF09XCJtYXhcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgW3JlcXVpcmVkXT1cInJlcXVpcmVkXCJcbiAgICAgICAgICAoaW5wdXQpPVwib25OdW1iZXJJbnB1dENoYW5nZSgkZXZlbnQpXCIvPlxuICAgICAgICA8c3VrYS1pY29uICpuZ0lmPVwiIXNrZWxldG9uICYmIGludmFsaWRcIiBpY29uPVwiYWxlcnQtY2lyY2xlXCIgY2xhc3M9XCJudW1iZXItaW5wdXRfX2ludmFsaWRcIj48L3N1a2EtaWNvbj5cbiAgICAgICAgPHN1a2EtaWNvbiAqbmdJZj1cIiFza2VsZXRvbiAmJiB2YWxpZFwiIGljb249XCJjaGVja1wiIGNsYXNzPVwibnVtYmVyLWlucHV0X192YWxpZFwiPjwvc3VrYS1pY29uPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiIXNrZWxldG9uXCIgY2xhc3M9XCJudW1iZXItaW5wdXRfX2NvbnRyb2xzXCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgY2xhc3M9XCJudW1iZXItaW5wdXRfX2NvbnRyb2wtYnRuIHVwLWljb25cIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBhcmlhLWxpdmU9XCJwb2xpdGVcIlxuICAgICAgICAgICAgYXJpYS1hdG9taWM9XCJ0cnVlXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvbkluY3JlbWVudCgpXCI+XG4gICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDMyMCA1MTJcIiBoZWlnaHQ9XCIxNlwiIHdpZHRoPVwiMTZcIj48cGF0aCBmaWxsPVwiY3VycmVudENvbG9yXCIgZD1cIk0yODguNjYyIDM1MkgzMS4zMzhjLTE3LjgxOCAwLTI2Ljc0MS0yMS41NDMtMTQuMTQyLTM0LjE0MmwxMjguNjYyLTEyOC42NjJjNy44MS03LjgxIDIwLjQ3NC03LjgxIDI4LjI4NCAwbDEyOC42NjIgMTI4LjY2MmMxMi42IDEyLjU5OSAzLjY3NiAzNC4xNDItMTQuMTQyIDM0LjE0MnpcIj48L3BhdGg+PC9zdmc+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgY2xhc3M9XCJudW1iZXItaW5wdXRfX2NvbnRyb2wtYnRuIGRvd24taWNvblwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGFyaWEtbGl2ZT1cInBvbGl0ZVwiXG4gICAgICAgICAgICBhcmlhLWF0b21pYz1cInRydWVcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uRGVjcmVtZW50KClcIj5cbiAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMzIwIDUxMlwiIGhlaWdodD1cIjE2XCIgd2lkdGg9XCIxNlwiPjxwYXRoIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBkPVwiTTMxLjMgMTkyaDI1Ny4zYzE3LjggMCAyNi43IDIxLjUgMTQuMSAzNC4xTDE3NC4xIDM1NC44Yy03LjggNy44LTIwLjUgNy44LTI4LjMgMEwxNy4yIDIyNi4xQzQuNiAyMTMuNSAxMy41IDE5MiAzMS4zIDE5MnpcIj48L3BhdGg+PC9zdmc+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0lmPVwiaW52YWxpZFwiIGNsYXNzPVwiZm9ybS1yZXF1aXJlbWVudFwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzVGVtcGxhdGUoaW52YWxpZFRleHQpXCI+e3tpbnZhbGlkVGV4dH19PC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAqbmdJZj1cImlzVGVtcGxhdGUoaW52YWxpZFRleHQpXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwiaW52YWxpZFRleHRcIj48L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGAsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IE51bWJlcixcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdXG59KVxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBjb21wb25lbnQtY2xhc3Mtc3VmZml4XG5leHBvcnQgY2xhc3MgTnVtYmVyIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICAvKipcbiAgICogVmFyaWFibGUgdXNlZCBmb3IgY3JlYXRpbmcgdW5pcXVlIGlkcyBmb3IgbnVtYmVyIGlucHV0IGNvbXBvbmVudHMuXG4gICAqL1xuICBzdGF0aWMgbnVtYmVyQ291bnQgPSAwO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuZm9ybS1pdGVtJykgY29udGFpbmVyQ2xhc3MgPSB0cnVlO1xuICAvKipcbiAgICogU2V0IHRvIGB0cnVlYCBmb3IgYSBkaXNhYmxlZCBudW1iZXIgaW5wdXQuXG4gICAqL1xuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuICAvKipcbiAgICogU2V0IHRvIGB0cnVlYCBmb3IgYSBsb2FkaW5nIG51bWJlciBjb21wb25lbnQuXG4gICAqL1xuICBASW5wdXQoKSBza2VsZXRvbiA9IGZhbHNlO1xuICAvKipcbiAgICogU2V0IHRvIGB0cnVlYCBmb3IgYW4gaW52YWxpZCBudW1iZXIgY29tcG9uZW50LlxuICAgKi9cbiAgQElucHV0KCkgaW52YWxpZCA9IGZhbHNlO1xuICAvKipcbiAgICogU2V0IHRvIGB0cnVlYCBmb3IgYSB2YWxpZCBudW1iZXIgY29tcG9uZW50LlxuICAgKi9cbiAgQElucHV0KCkgdmFsaWQgPSBmYWxzZTtcbiAgLyoqXG4gICAqIFRoZSB1bmlxdWUgaWQgZm9yIHRoZSBudW1iZXIgY29tcG9uZW50LlxuICAgKi9cbiAgQElucHV0KCkgaWQgPSBgbnVtYmVyLWlucHV0LSR7TnVtYmVyLm51bWJlckNvdW50fWA7XG4gIC8qKlxuICAgKiBSZWZsZWN0cyB0aGUgcmVxdWlyZWQgYXR0cmlidXRlIG9mIHRoZSBgaW5wdXRgIGVsZW1lbnQuXG4gICAqL1xuICBASW5wdXQoKSByZXF1aXJlZDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFNldHMgdGhlIHZhbHVlIGF0dHJpYnV0ZSBvbiB0aGUgYGlucHV0YCBlbGVtZW50LlxuICAgKi9cbiAgQElucHV0KCkgdmFsdWUgPSAwO1xuICAvKipcbiAgICogU2V0cyB0aGUgbWluIGF0dHJpYnV0ZSBvbiB0aGUgYGlucHV0YCBlbGVtZW50LlxuICAgKi9cbiAgQElucHV0KCkgbWluID0gbnVsbDtcbiAgLyoqXG4gICAqIFNldHMgdGhlIG1heCBhdHRyaWJ1dGUgb24gdGhlIGBpbnB1dGAgZWxlbWVudC5cbiAgICovXG4gIEBJbnB1dCgpIG1heCA9IG51bGw7XG4gIC8qKlxuICAgKiBTZXRzIHRoZSB0ZXh0IGluc2lkZSB0aGUgYGxhYmVsYCB0YWcuXG4gICAqL1xuICBASW5wdXQoKSBsYWJlbDogc3RyaW5nIHwgVGVtcGxhdGVSZWY8YW55PjtcbiAgLyoqXG4gICAqIFNldHMgdGhlIG9wdGlvbmFsIGhlbHBlciB0ZXh0LlxuICAgKi9cbiAgQElucHV0KCkgaGVscGVyVGV4dDogc3RyaW5nIHwgVGVtcGxhdGVSZWY8YW55PjtcbiAgLyoqXG4gICAqIFNldHMgdGhlIGludmFsaWQgdGV4dC5cbiAgICovXG4gIEBJbnB1dCgpIGludmFsaWRUZXh0OiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjxhbnk+O1xuICAvKipcbiAgICogRW1pdHMgZXZlbnQgbm90aWZ5aW5nIG90aGVyIGNsYXNzZXMgd2hlbiBhIGNoYW5nZSBpbiBzdGF0ZSBvY2N1cnMgaW4gdGhlIGlucHV0LlxuICAgKi9cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1vdXRwdXQtbmF0aXZlXG4gIEBPdXRwdXQoKSBjaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPE51bWJlckNoYW5nZT4oKTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBgTnVtYmVyYC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIE51bWJlci5udW1iZXJDb3VudCsrO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgdGhlIGluaXRpYWwgdmFsdWUgc2V0IHRvIHRoZSBjb21wb25lbnRcbiAgICogQHBhcmFtIHZhbHVlIFRoZSBpbnB1dCB2YWx1ZS5cbiAgICovXG4gIHB1YmxpYyB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBhIG1ldGhvZCBpbiBvcmRlciB0byBwcm9wYWdhdGUgY2hhbmdlcyBiYWNrIHRvIHRoZSBmb3JtLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSkge1xuICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlID0gZm47XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgdG8gYmUgdHJpZ2dlcmVkIHdoZW4gdGhlIGNvbnRyb2wgaGFzIGJlZW4gdG91Y2hlZC5cbiAgICogQHBhcmFtIGZuIENhbGxiYWNrIHRvIGJlIHRyaWdnZXJlZCB3aGVuIHRoZSBudW1iZXIgaW5wdXQgaXMgdG91Y2hlZC5cbiAgICovXG4gIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KSB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBkaXNhYmxlZCBzdGF0ZSB0aHJvdWdoIHRoZSBtb2RlbFxuICAgKi9cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKSB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gbnVtYmVyIGlucHV0IGlzIGJsdXJyZWQuIE5lZWRlZCB0byBwcm9wZXJseSBpbXBsZW1lbnQgYENvbnRyb2xWYWx1ZUFjY2Vzc29yYC5cbiAgICovXG4gIG9uVG91Y2hlZDogKCkgPT4gYW55ID0gKCkgPT4geyB9O1xuXG4gIC8qKlxuICAgKiBNZXRob2Qgc2V0IGluIGByZWdpc3Rlck9uQ2hhbmdlYCB0byBwcm9wYWdhdGUgY2hhbmdlcyBiYWNrIHRvIHRoZSBmb3JtLlxuICAgKi9cbiAgcHJvcGFnYXRlQ2hhbmdlID0gKF86IGFueSkgPT4geyB9O1xuXG4gIC8qKlxuICAgKiBBZGRzIDEgdG8gdGhlIGN1cnJlbnQgYHZhbHVlYC5cbiAgICovXG4gIG9uSW5jcmVtZW50KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm1heCA9PT0gbnVsbCB8fCB0aGlzLnZhbHVlIDwgdGhpcy5tYXgpIHtcbiAgICAgIHRoaXMudmFsdWUrKztcbiAgICAgIHRoaXMuZW1pdENoYW5nZUV2ZW50KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN1YnRyYWN0cyAxIHRvIHRoZSBjdXJyZW50IGB2YWx1ZWAuXG4gICAqL1xuICBvbkRlY3JlbWVudCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5taW4gPT09IG51bGwgfHwgdGhpcy52YWx1ZSA+IHRoaXMubWluKSB7XG4gICAgICB0aGlzLnZhbHVlLS07XG4gICAgICB0aGlzLmVtaXRDaGFuZ2VFdmVudCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgY2xhc3Mgb2YgYE51bWJlckNoYW5nZWAgdG8gZW1pdCB0aGUgY2hhbmdlIGluIHRoZSBgTnVtYmVyYC5cbiAgICovXG4gIGVtaXRDaGFuZ2VFdmVudCgpOiB2b2lkIHtcbiAgICBjb25zdCBldmVudCA9IG5ldyBOdW1iZXJDaGFuZ2UoKTtcbiAgICBldmVudC5zb3VyY2UgPSB0aGlzO1xuICAgIGV2ZW50LnZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICB0aGlzLmNoYW5nZS5lbWl0KGV2ZW50KTtcbiAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSh0aGlzLnZhbHVlKTtcbiAgfVxuXG4gIG9uTnVtYmVySW5wdXRDaGFuZ2UoZXZlbnQpIHtcbiAgICB0aGlzLnZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICAgIHRoaXMuZW1pdENoYW5nZUV2ZW50KCk7XG4gIH1cblxuICBwdWJsaWMgaXNUZW1wbGF0ZSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmO1xuICB9XG59XG4iXX0=