ecabs-components 1.1.15 → 1.1.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGhvbmUubW9kZWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZWNhYnMtY29tcG9uZW50cy9zcmMvbGliL2Jhc2UvbW9kZWxzL3Bob25lLm1vZGVscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgUGhvbmVOdW1iZXJGb3JtYXQgPSAnZGVmYXVsdCcgfCAnbmF0aW9uYWwnIHwgJ2ludGVybmF0aW9uYWwnO1xyXG5cclxuZXhwb3J0IHR5cGUgQ291bnRyeSA9IHtcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgaXNvMjogc3RyaW5nO1xyXG4gIGRpYWxDb2RlOiBzdHJpbmc7XHJcbiAgcHJpb3JpdHk6IG51bWJlcjtcclxuICBhcmVhQ29kZXM/OiBzdHJpbmdbXTtcclxuICBmbGFnQ2xhc3M6IHN0cmluZztcclxuICBwbGFjZUhvbGRlcj86IHN0cmluZztcclxufTtcclxuIl19
@@ -0,0 +1,22 @@
1
+ import { Pipe } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class SearchPipe {
4
+ transform(country, searchCriteria) {
5
+ if (!searchCriteria || searchCriteria === '') {
6
+ return true;
7
+ }
8
+ return `${country.name}+${country.dialCode}`
9
+ .toLowerCase()
10
+ .includes(searchCriteria.toLowerCase());
11
+ }
12
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SearchPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
13
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "16.2.12", ngImport: i0, type: SearchPipe, isStandalone: true, name: "search" });
14
+ }
15
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SearchPipe, decorators: [{
16
+ type: Pipe,
17
+ args: [{
18
+ name: 'search',
19
+ standalone: true,
20
+ }]
21
+ }] });
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLnBpcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lY2Ficy1jb21wb25lbnRzL3NyYy9saWIvYmFzZS9waXBlcy9zZWFyY2gucGlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFpQixNQUFNLGVBQWUsQ0FBQzs7QUFPcEQsTUFBTSxPQUFPLFVBQVU7SUFDckIsU0FBUyxDQUFDLE9BQWdCLEVBQUUsY0FBdUI7UUFDakQsSUFBSSxDQUFDLGNBQWMsSUFBSSxjQUFjLEtBQUssRUFBRSxFQUFFO1lBQzVDLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFO2FBQ3pDLFdBQVcsRUFBRTthQUNiLFFBQVEsQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUM1QyxDQUFDO3dHQVRVLFVBQVU7c0dBQVYsVUFBVTs7NEZBQVYsVUFBVTtrQkFKdEIsSUFBSTttQkFBQztvQkFDSixJQUFJLEVBQUUsUUFBUTtvQkFDZCxVQUFVLEVBQUUsSUFBSTtpQkFDakIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQaXBlLCBQaXBlVHJhbnNmb3JtIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvdW50cnkgfSBmcm9tICcuLi9tb2RlbHMvcGhvbmUubW9kZWxzJztcclxuXHJcbkBQaXBlKHtcclxuICBuYW1lOiAnc2VhcmNoJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgU2VhcmNoUGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xyXG4gIHRyYW5zZm9ybShjb3VudHJ5OiBDb3VudHJ5LCBzZWFyY2hDcml0ZXJpYT86IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCFzZWFyY2hDcml0ZXJpYSB8fCBzZWFyY2hDcml0ZXJpYSA9PT0gJycpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGAke2NvdW50cnkubmFtZX0rJHtjb3VudHJ5LmRpYWxDb2RlfWBcclxuICAgICAgLnRvTG93ZXJDYXNlKClcclxuICAgICAgLmluY2x1ZGVzKHNlYXJjaENyaXRlcmlhLnRvTG93ZXJDYXNlKCkpO1xyXG4gIH1cclxufVxyXG4iXX0=
@@ -0,0 +1,23 @@
1
+ import { parsePhoneNumber } from 'libphonenumber-js';
2
+ export const phoneNumberValidator = (control) => {
3
+ const error = { validatePhoneNumber: true };
4
+ let numberInstance;
5
+ if (control.value) {
6
+ try {
7
+ numberInstance = parsePhoneNumber(control.value);
8
+ }
9
+ catch (e) {
10
+ control.setValue(null);
11
+ return error;
12
+ }
13
+ if (numberInstance && !numberInstance.isValid()) {
14
+ control.setValue(null);
15
+ if (!control.touched) {
16
+ control.markAsTouched();
17
+ }
18
+ return error;
19
+ }
20
+ }
21
+ return null;
22
+ };
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGhvbmUtbnVtYmVyLnZhbGlkYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VjYWJzLWNvbXBvbmVudHMvc3JjL2xpYi9iYXNlL3ZhbGlkYXRvcnMvcGhvbmUtbnVtYmVyLnZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQWUsTUFBTSxtQkFBbUIsQ0FBQztBQUVsRSxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLE9BQTJCLEVBQUUsRUFBRTtJQUNsRSxNQUFNLEtBQUssR0FBRyxFQUFFLG1CQUFtQixFQUFFLElBQUksRUFBRSxDQUFDO0lBQzVDLElBQUksY0FBMkIsQ0FBQztJQUNoQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUU7UUFDakIsSUFBSTtZQUNGLGNBQWMsR0FBRyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDbEQ7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNWLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFdkIsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUVELElBQUksY0FBYyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQy9DLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUU7Z0JBQ3BCLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQzthQUN6QjtZQUVELE9BQU8sS0FBSyxDQUFDO1NBQ2Q7S0FDRjtJQUVELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVW50eXBlZEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBwYXJzZVBob25lTnVtYmVyLCBQaG9uZU51bWJlciB9IGZyb20gJ2xpYnBob25lbnVtYmVyLWpzJztcclxuXHJcbmV4cG9ydCBjb25zdCBwaG9uZU51bWJlclZhbGlkYXRvciA9IChjb250cm9sOiBVbnR5cGVkRm9ybUNvbnRyb2wpID0+IHtcclxuICBjb25zdCBlcnJvciA9IHsgdmFsaWRhdGVQaG9uZU51bWJlcjogdHJ1ZSB9O1xyXG4gIGxldCBudW1iZXJJbnN0YW5jZTogUGhvbmVOdW1iZXI7XHJcbiAgaWYgKGNvbnRyb2wudmFsdWUpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIG51bWJlckluc3RhbmNlID0gcGFyc2VQaG9uZU51bWJlcihjb250cm9sLnZhbHVlKTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgY29udHJvbC5zZXRWYWx1ZShudWxsKTtcclxuXHJcbiAgICAgIHJldHVybiBlcnJvcjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAobnVtYmVySW5zdGFuY2UgJiYgIW51bWJlckluc3RhbmNlLmlzVmFsaWQoKSkge1xyXG4gICAgICBjb250cm9sLnNldFZhbHVlKG51bGwpO1xyXG4gICAgICBpZiAoIWNvbnRyb2wudG91Y2hlZCkge1xyXG4gICAgICAgIGNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gZXJyb3I7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4gbnVsbDtcclxufTtcclxuIl19
@@ -0,0 +1,415 @@
1
+ // eslint-disable @typescript-eslint/no-explicit-any
2
+ import { ChangeDetectionStrategy, Component, EventEmitter, HostBinding, Input, Optional, Output, Self, ViewChild, } from '@angular/core';
3
+ import { MatFormFieldControl } from '@angular/material/form-field';
4
+ import { NG_VALIDATORS, } from '@angular/forms';
5
+ import { AsYouType, getExampleNumber, parsePhoneNumberFromString, } from 'libphonenumber-js';
6
+ import { coerceBooleanProperty } from '@angular/cdk/coercion';
7
+ import { ErrorStateMatcher, mixinErrorState, } from '@angular/material/core';
8
+ import { MatMenu } from '@angular/material/menu';
9
+ import { debounceTime, Subject } from 'rxjs';
10
+ import { CountryCode, Examples } from '../base/consts/country-codes';
11
+ import { phoneNumberValidator } from '../base/validators/phone-number.validator';
12
+ import * as i0 from "@angular/core";
13
+ import * as i1 from "../base/consts/country-codes";
14
+ import * as i2 from "@angular/cdk/a11y";
15
+ import * as i3 from "@angular/forms";
16
+ import * as i4 from "@angular/material/core";
17
+ import * as i5 from "@angular/common";
18
+ import * as i6 from "@angular/material/input";
19
+ import * as i7 from "@angular/material/menu";
20
+ import * as i8 from "@angular/material/button";
21
+ import * as i9 from "@angular/material/divider";
22
+ import * as i10 from "../base/pipes/search.pipe";
23
+ class NgxMatIntlTelInputBase {
24
+ _defaultErrorStateMatcher;
25
+ _parentForm;
26
+ _parentFormGroup;
27
+ ngControl;
28
+ stateChanges = new Subject();
29
+ constructor(_defaultErrorStateMatcher, _parentForm, _parentFormGroup, ngControl) {
30
+ this._defaultErrorStateMatcher = _defaultErrorStateMatcher;
31
+ this._parentForm = _parentForm;
32
+ this._parentFormGroup = _parentFormGroup;
33
+ this.ngControl = ngControl;
34
+ }
35
+ }
36
+ const _NgxMatIntlTelInputMixinBase = mixinErrorState(NgxMatIntlTelInputBase);
37
+ export class EcabsBasePhoneComponent extends _NgxMatIntlTelInputMixinBase {
38
+ changeDetectorRef;
39
+ countryCodeData;
40
+ fm;
41
+ elRef;
42
+ ngControl;
43
+ preferredCountries = [];
44
+ enablePlaceholder = true;
45
+ inputPlaceholder;
46
+ cssClass;
47
+ name;
48
+ onlyCountries = [];
49
+ errorStateMatcher = new ErrorStateMatcher();
50
+ enableSearch = false;
51
+ searchPlaceholder;
52
+ describedBy = '';
53
+ debounceTimeMs = 500;
54
+ get format() {
55
+ return this._format;
56
+ }
57
+ get placeholder() {
58
+ return this._placeholder || '';
59
+ }
60
+ get required() {
61
+ return this._required;
62
+ }
63
+ get disabled() {
64
+ return this._disabled;
65
+ }
66
+ countryChanged = new EventEmitter();
67
+ matMenu;
68
+ searchInput;
69
+ id = `ecabs-intl-tel-input-${EcabsBasePhoneComponent.nextId++}`;
70
+ get shouldLabelFloat() {
71
+ return this.focused || !this.empty;
72
+ }
73
+ static nextId = 0;
74
+ _changeSubject = new Subject();
75
+ _placeholder;
76
+ _required = false;
77
+ _disabled = false;
78
+ _previousFormattedNumber;
79
+ _format = 'default';
80
+ stateChanges = new Subject();
81
+ focused = false;
82
+ phoneNumber;
83
+ allCountries = [];
84
+ preferredCountriesInDropDown = [];
85
+ selectedCountry;
86
+ numberInstance;
87
+ value;
88
+ searchCriteria;
89
+ get empty() {
90
+ return !this.phoneNumber;
91
+ }
92
+ set format(value) {
93
+ this._format = value;
94
+ this.phoneNumber = this.formattedPhoneNumber;
95
+ this.stateChanges.next(undefined);
96
+ }
97
+ set placeholder(value) {
98
+ this._placeholder = value;
99
+ this.stateChanges.next(undefined);
100
+ }
101
+ set required(value) {
102
+ this._required = coerceBooleanProperty(value);
103
+ this.stateChanges.next(undefined);
104
+ }
105
+ set disabled(value) {
106
+ this._disabled = coerceBooleanProperty(value);
107
+ this.stateChanges.next(undefined);
108
+ }
109
+ static getPhoneNumberPlaceHolder(countryISOCode) {
110
+ const result = getExampleNumber(countryISOCode, Examples);
111
+ // eslint-disable-next-line no-extra-boolean-cast
112
+ return !!result ? result.number.toString() : undefined;
113
+ }
114
+ onTouched = () => { };
115
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
116
+ propagateChange = (_) => { };
117
+ constructor(changeDetectorRef, countryCodeData, fm, elRef, ngControl, parentForm, parentFormGroup, defaultErrorStateMatcher) {
118
+ super(defaultErrorStateMatcher, parentForm, parentFormGroup, ngControl);
119
+ this.changeDetectorRef = changeDetectorRef;
120
+ this.countryCodeData = countryCodeData;
121
+ this.fm = fm;
122
+ this.elRef = elRef;
123
+ this.ngControl = ngControl;
124
+ fm.monitor(elRef, true).subscribe((origin) => {
125
+ if (this.focused && !origin) {
126
+ this.onTouched();
127
+ }
128
+ this.focused = !!origin;
129
+ this.stateChanges.next(undefined);
130
+ });
131
+ this.fetchCountryData();
132
+ if (this.ngControl != null) {
133
+ this.ngControl.valueAccessor = this;
134
+ }
135
+ }
136
+ ngOnInit() {
137
+ if (!this.searchPlaceholder) {
138
+ this.searchPlaceholder = 'Search ...';
139
+ }
140
+ if (this.preferredCountries.length) {
141
+ this.preferredCountries.forEach((iso2) => {
142
+ const preferredCountry = this.allCountries
143
+ .filter((c) => c.iso2 === iso2)
144
+ .shift();
145
+ if (preferredCountry) {
146
+ this.preferredCountriesInDropDown.push(preferredCountry);
147
+ }
148
+ });
149
+ }
150
+ if (this.onlyCountries.length) {
151
+ this.allCountries = this.allCountries.filter((c) => this.onlyCountries.includes(c.iso2));
152
+ }
153
+ if (this.numberInstance && this.numberInstance.country) {
154
+ // If an existing number is present, we use it to determine selectedCountry
155
+ this.selectedCountry = this.getCountry(this.numberInstance.country);
156
+ }
157
+ else {
158
+ if (this.preferredCountriesInDropDown.length) {
159
+ this.selectedCountry = this.preferredCountriesInDropDown[0];
160
+ }
161
+ else {
162
+ this.selectedCountry = this.allCountries[0];
163
+ }
164
+ }
165
+ this._changeSubject
166
+ .pipe(debounceTime(this.debounceTimeMs))
167
+ .subscribe(() => {
168
+ this.onPhoneNumberChange();
169
+ });
170
+ this.countryChanged.emit(this.selectedCountry);
171
+ this.changeDetectorRef.markForCheck();
172
+ this.stateChanges.next(undefined);
173
+ }
174
+ ngDoCheck() {
175
+ if (this.ngControl) {
176
+ this.updateErrorState();
177
+ }
178
+ }
179
+ ngOnDestroy() {
180
+ this.stateChanges.complete();
181
+ this.fm.stopMonitoring(this.elRef);
182
+ this._changeSubject.complete();
183
+ }
184
+ onPhoneNumberChangeDebounce() {
185
+ this._changeSubject.next(undefined);
186
+ }
187
+ onPhoneNumberChange() {
188
+ try {
189
+ this.numberInstance = parsePhoneNumberFromString(this.phoneNumber?.toString() || '', this.selectedCountry?.iso2.toUpperCase());
190
+ this.formatAsYouTypeIfEnabled();
191
+ this.value = this.numberInstance?.number;
192
+ if (this.numberInstance && this.numberInstance.isValid()) {
193
+ if (this.phoneNumber !== this.formattedPhoneNumber) {
194
+ this.phoneNumber = this.formattedPhoneNumber;
195
+ }
196
+ if (this.selectedCountry?.iso2 !== this.numberInstance.country &&
197
+ !!this.numberInstance.country) {
198
+ this.selectedCountry = this.getCountry(this.numberInstance.country);
199
+ this.countryChanged.emit(this.selectedCountry);
200
+ }
201
+ }
202
+ }
203
+ catch {
204
+ // if no possible numbers are there,
205
+ // then the full number is passed so that validator could be triggered and proper error could be shown
206
+ this.value = this.phoneNumber?.toString();
207
+ }
208
+ this.propagateChange(this.value);
209
+ this.changeDetectorRef.markForCheck();
210
+ }
211
+ onCountrySelect(country) {
212
+ if (this.phoneNumber) {
213
+ this.phoneNumber = this.numberInstance?.nationalNumber;
214
+ }
215
+ this.selectedCountry = country;
216
+ this.countryChanged.emit(this.selectedCountry);
217
+ this.onPhoneNumberChange();
218
+ }
219
+ getCountry(code) {
220
+ return (this.allCountries.find((c) => c.iso2 === code.toLowerCase()) || {
221
+ name: 'UN',
222
+ iso2: 'UN',
223
+ dialCode: '',
224
+ priority: 0,
225
+ areaCodes: undefined,
226
+ flagClass: 'UN',
227
+ placeHolder: '',
228
+ });
229
+ }
230
+ onInputKeyPress(event) {
231
+ const pattern = /[0-9+\- ]/;
232
+ if (!pattern.test(event.key)) {
233
+ event.preventDefault();
234
+ }
235
+ }
236
+ flagClass(lang) {
237
+ return `fi fi-${lang?.slice(-2).toLowerCase()}`;
238
+ }
239
+ registerOnChange(fn) {
240
+ this.propagateChange = fn;
241
+ }
242
+ registerOnTouched(fn) {
243
+ this.onTouched = fn;
244
+ }
245
+ setDisabledState(isDisabled) {
246
+ this.disabled = isDisabled;
247
+ this.changeDetectorRef.markForCheck();
248
+ this.stateChanges.next(undefined);
249
+ }
250
+ writeValue(value) {
251
+ if (value) {
252
+ this.numberInstance = parsePhoneNumberFromString(value);
253
+ if (this.numberInstance) {
254
+ const countryCode = this.numberInstance.country;
255
+ this.phoneNumber = this.formattedPhoneNumber;
256
+ if (!countryCode) {
257
+ return;
258
+ }
259
+ setTimeout(() => {
260
+ this.selectedCountry = this.getCountry(countryCode);
261
+ if (this.selectedCountry.dialCode &&
262
+ !this.preferredCountries.includes(this.selectedCountry.iso2)) {
263
+ this.preferredCountriesInDropDown.push(this.selectedCountry);
264
+ }
265
+ this.countryChanged.emit(this.selectedCountry);
266
+ // Initial value is set
267
+ this.changeDetectorRef.markForCheck();
268
+ this.stateChanges.next(undefined);
269
+ }, 1);
270
+ }
271
+ else {
272
+ this.phoneNumber = value;
273
+ }
274
+ }
275
+ // Value is set from outside using setValue()
276
+ this.changeDetectorRef.markForCheck();
277
+ this.stateChanges.next(undefined);
278
+ }
279
+ setDescribedByIds(ids) {
280
+ this.describedBy = ids.join(' ');
281
+ }
282
+ onContainerClick(event) {
283
+ if (event.target.tagName.toLowerCase() !== 'input') {
284
+ this.elRef.nativeElement.querySelector('input').focus();
285
+ }
286
+ }
287
+ reset() {
288
+ this.phoneNumber = '';
289
+ this.propagateChange(null);
290
+ this.changeDetectorRef.markForCheck();
291
+ this.stateChanges.next(undefined);
292
+ }
293
+ onSearchInput() {
294
+ setTimeout(() => {
295
+ this.searchInput?.nativeElement?.focus();
296
+ }, 200);
297
+ }
298
+ fetchCountryData() {
299
+ this.countryCodeData.allCountries.forEach((c) => {
300
+ const country = {
301
+ name: c[0].toString(),
302
+ iso2: c[1].toString(),
303
+ dialCode: c[2].toString(),
304
+ priority: +c[3] || 0,
305
+ areaCodes: c[4] || undefined,
306
+ flagClass: c[1].toString().toUpperCase(),
307
+ placeHolder: '',
308
+ };
309
+ if (this.enablePlaceholder) {
310
+ country.placeHolder = EcabsBasePhoneComponent.getPhoneNumberPlaceHolder(country.iso2.toUpperCase());
311
+ }
312
+ this.allCountries.push(country);
313
+ });
314
+ }
315
+ get formattedPhoneNumber() {
316
+ if (!this.numberInstance) {
317
+ return this.phoneNumber?.toString() || '';
318
+ }
319
+ switch (this.format) {
320
+ case 'national':
321
+ return this.numberInstance.formatNational();
322
+ case 'international':
323
+ return this.numberInstance.formatInternational();
324
+ default:
325
+ return this.numberInstance.nationalNumber.toString();
326
+ }
327
+ }
328
+ formatAsYouTypeIfEnabled() {
329
+ if (this.format === 'default') {
330
+ return;
331
+ }
332
+ const asYouType = new AsYouType(this.selectedCountry?.iso2.toUpperCase());
333
+ // To avoid caret positioning we apply formatting only if the caret is at the end:
334
+ if (this.phoneNumber
335
+ ?.toString()
336
+ .startsWith(this._previousFormattedNumber || '')) {
337
+ this.phoneNumber = asYouType.input(this.phoneNumber.toString());
338
+ }
339
+ this._previousFormattedNumber = this.phoneNumber?.toString();
340
+ }
341
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: EcabsBasePhoneComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.CountryCode }, { token: i2.FocusMonitor }, { token: i0.ElementRef }, { token: i3.NgControl, optional: true, self: true }, { token: i3.NgForm, optional: true }, { token: i3.FormGroupDirective, optional: true }, { token: i4.ErrorStateMatcher }], target: i0.ɵɵFactoryTarget.Component });
342
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: EcabsBasePhoneComponent, selector: "ecabs-base-phone", inputs: { preferredCountries: "preferredCountries", enablePlaceholder: "enablePlaceholder", inputPlaceholder: "inputPlaceholder", cssClass: "cssClass", name: "name", onlyCountries: "onlyCountries", errorStateMatcher: "errorStateMatcher", enableSearch: "enableSearch", searchPlaceholder: "searchPlaceholder", describedBy: "describedBy", debounceTimeMs: "debounceTimeMs", format: "format", placeholder: "placeholder", required: "required", disabled: "disabled" }, outputs: { countryChanged: "countryChanged" }, host: { properties: { "id": "this.id", "class.ngx-floating": "this.shouldLabelFloat" } }, providers: [
343
+ CountryCode,
344
+ { provide: MatFormFieldControl, useExisting: EcabsBasePhoneComponent },
345
+ {
346
+ provide: NG_VALIDATORS,
347
+ useValue: phoneNumberValidator,
348
+ multi: true,
349
+ },
350
+ ], viewQueries: [{ propertyName: "matMenu", first: true, predicate: MatMenu, descendants: true }, { propertyName: "searchInput", first: true, predicate: ["searchInput"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"ecabs-tel-input-container\">\r\n <button\r\n type=\"button\"\r\n mat-button\r\n [matMenuTriggerFor]=\"menu\"\r\n class=\"country-selector\"\r\n [disabled]=\"disabled\"\r\n >\r\n <span\r\n class=\"country-selector-flag flag\"\r\n [ngClass]=\"flagClass(selectedCountry?.flagClass)\"\r\n ></span>\r\n <span class=\"country-selector-code\" *ngIf=\"selectedCountry?.dialCode\"\r\n >+{{ selectedCountry.dialCode }}</span\r\n >\r\n </button>\r\n <mat-menu #menu=\"matMenu\"\r\n class=\"ecabs-tel-input-mat-menu-panel\"\r\n backdropClass=\"ecabs-tel-input-overlay-backdrop\"\r\n overlayPanelClass=\"ecabs-tel-input-overlay-pane\">\r\n <input\r\n #searchInput\r\n *ngIf=\"enableSearch\"\r\n class=\"country-search\"\r\n [(ngModel)]=\"searchCriteria\"\r\n (ngModelChange)=\"onSearchInput()\"\r\n type=\"text\"\r\n [placeholder]=\"searchPlaceholder\"\r\n (click)=\"$event.stopPropagation()\"\r\n />\r\n <ng-container *ngIf=\"!searchCriteria\">\r\n <button\r\n type=\"button\"\r\n mat-menu-item\r\n class=\"country-list-button\"\r\n *ngFor=\"let country of preferredCountriesInDropDown\"\r\n (click)=\"onCountrySelect(country)\"\r\n >\r\n <div class=\"icon-wrapper\">\r\n <div class=\"flag\" \r\n [ngClass]=\"flagClass(country.flagClass)\"></div>\r\n </div>\r\n <div class=\"label-wrapper\">\r\n {{ country.name }}\r\n <span *ngIf=\"country?.dialCode\">+{{ country.dialCode }}</span>\r\n </div>\r\n </button>\r\n <mat-divider *ngIf=\"preferredCountriesInDropDown?.length\"></mat-divider>\r\n </ng-container>\r\n <ng-container *ngFor=\"let country of allCountries\">\r\n <button\r\n type=\"button\"\r\n mat-menu-item\r\n class=\"country-list-button\"\r\n *ngIf=\"country | search: searchCriteria\"\r\n (click)=\"onCountrySelect(country)\"\r\n >\r\n <div class=\"icon-wrapper\">\r\n <div class=\"flag\" [ngClass]=\"flagClass(country.flagClass)\"></div>\r\n </div>\r\n <div class=\"label-wrapper\">\r\n {{ country.name }} +{{ country.dialCode }}\r\n </div>\r\n </button>\r\n </ng-container>\r\n </mat-menu>\r\n\r\n <input\r\n matInput\r\n type=\"tel\"\r\n autocomplete=\"tel\"\r\n [ngClass]=\"cssClass\"\r\n (blur)=\"onTouched()\"\r\n (keypress)=\"onInputKeyPress($event)\"\r\n [(ngModel)]=\"phoneNumber\"\r\n (ngModelChange)=\"onPhoneNumberChangeDebounce()\"\r\n [errorStateMatcher]=\"errorStateMatcher\"\r\n [placeholder]=\"inputPlaceholder\"\r\n [disabled]=\"disabled\"\r\n [aria-describedby]=\"describedBy\"\r\n />\r\n</div>", styles: ["input:not(.country-search){border:none;background:none;outline:none;font:inherit;width:100%;box-sizing:border-box;padding:0 6px 0 90px;position:relative;z-index:0;margin-top:0!important;margin-bottom:0!important;margin-right:0;margin-left:0}input.country-search{width:100%;height:34px;border:none;border-bottom:1px solid #ddd;font-size:14px;padding:20px 20px 24px;position:sticky;top:0;background-color:#fff;z-index:9}.icon-wrapper{padding-right:24px}.flag{background-size:100% auto;filter:drop-shadow(1px 1px 1px rgba(0,0,0,.54));height:14px;width:24px}.icon-wrapper,.label-wrapper{display:table-cell;vertical-align:middle}.country-selector{border-radius:0;color:#000000de;flex-shrink:0;height:initial;line-height:unset;width:90px;padding:1px;opacity:0;transition:opacity .2s;position:absolute;z-index:1;inset:0 auto 0 0;font-size:inherit;font-weight:inherit;background-position:right center;background-repeat:no-repeat;background-size:18px auto}.country-selector:disabled{color:#00000061}:host.ngx-floating .country-selector{opacity:1!important}.country-selector-flag{display:inline-block;margin-right:.5ex}.country-list-button{color:#000000de;direction:ltr;font-size:16px;font-weight:400;height:initial;line-height:normal;min-height:48px;padding:14px 24px;text-align:left;text-transform:none;width:100%}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i7.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i7.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i7.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "component", type: i8.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i9.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "pipe", type: i10.SearchPipe, name: "search" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
351
+ }
352
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: EcabsBasePhoneComponent, decorators: [{
353
+ type: Component,
354
+ args: [{ selector: 'ecabs-base-phone', standalone: false, providers: [
355
+ CountryCode,
356
+ { provide: MatFormFieldControl, useExisting: EcabsBasePhoneComponent },
357
+ {
358
+ provide: NG_VALIDATORS,
359
+ useValue: phoneNumberValidator,
360
+ multi: true,
361
+ },
362
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"ecabs-tel-input-container\">\r\n <button\r\n type=\"button\"\r\n mat-button\r\n [matMenuTriggerFor]=\"menu\"\r\n class=\"country-selector\"\r\n [disabled]=\"disabled\"\r\n >\r\n <span\r\n class=\"country-selector-flag flag\"\r\n [ngClass]=\"flagClass(selectedCountry?.flagClass)\"\r\n ></span>\r\n <span class=\"country-selector-code\" *ngIf=\"selectedCountry?.dialCode\"\r\n >+{{ selectedCountry.dialCode }}</span\r\n >\r\n </button>\r\n <mat-menu #menu=\"matMenu\"\r\n class=\"ecabs-tel-input-mat-menu-panel\"\r\n backdropClass=\"ecabs-tel-input-overlay-backdrop\"\r\n overlayPanelClass=\"ecabs-tel-input-overlay-pane\">\r\n <input\r\n #searchInput\r\n *ngIf=\"enableSearch\"\r\n class=\"country-search\"\r\n [(ngModel)]=\"searchCriteria\"\r\n (ngModelChange)=\"onSearchInput()\"\r\n type=\"text\"\r\n [placeholder]=\"searchPlaceholder\"\r\n (click)=\"$event.stopPropagation()\"\r\n />\r\n <ng-container *ngIf=\"!searchCriteria\">\r\n <button\r\n type=\"button\"\r\n mat-menu-item\r\n class=\"country-list-button\"\r\n *ngFor=\"let country of preferredCountriesInDropDown\"\r\n (click)=\"onCountrySelect(country)\"\r\n >\r\n <div class=\"icon-wrapper\">\r\n <div class=\"flag\" \r\n [ngClass]=\"flagClass(country.flagClass)\"></div>\r\n </div>\r\n <div class=\"label-wrapper\">\r\n {{ country.name }}\r\n <span *ngIf=\"country?.dialCode\">+{{ country.dialCode }}</span>\r\n </div>\r\n </button>\r\n <mat-divider *ngIf=\"preferredCountriesInDropDown?.length\"></mat-divider>\r\n </ng-container>\r\n <ng-container *ngFor=\"let country of allCountries\">\r\n <button\r\n type=\"button\"\r\n mat-menu-item\r\n class=\"country-list-button\"\r\n *ngIf=\"country | search: searchCriteria\"\r\n (click)=\"onCountrySelect(country)\"\r\n >\r\n <div class=\"icon-wrapper\">\r\n <div class=\"flag\" [ngClass]=\"flagClass(country.flagClass)\"></div>\r\n </div>\r\n <div class=\"label-wrapper\">\r\n {{ country.name }} +{{ country.dialCode }}\r\n </div>\r\n </button>\r\n </ng-container>\r\n </mat-menu>\r\n\r\n <input\r\n matInput\r\n type=\"tel\"\r\n autocomplete=\"tel\"\r\n [ngClass]=\"cssClass\"\r\n (blur)=\"onTouched()\"\r\n (keypress)=\"onInputKeyPress($event)\"\r\n [(ngModel)]=\"phoneNumber\"\r\n (ngModelChange)=\"onPhoneNumberChangeDebounce()\"\r\n [errorStateMatcher]=\"errorStateMatcher\"\r\n [placeholder]=\"inputPlaceholder\"\r\n [disabled]=\"disabled\"\r\n [aria-describedby]=\"describedBy\"\r\n />\r\n</div>", styles: ["input:not(.country-search){border:none;background:none;outline:none;font:inherit;width:100%;box-sizing:border-box;padding:0 6px 0 90px;position:relative;z-index:0;margin-top:0!important;margin-bottom:0!important;margin-right:0;margin-left:0}input.country-search{width:100%;height:34px;border:none;border-bottom:1px solid #ddd;font-size:14px;padding:20px 20px 24px;position:sticky;top:0;background-color:#fff;z-index:9}.icon-wrapper{padding-right:24px}.flag{background-size:100% auto;filter:drop-shadow(1px 1px 1px rgba(0,0,0,.54));height:14px;width:24px}.icon-wrapper,.label-wrapper{display:table-cell;vertical-align:middle}.country-selector{border-radius:0;color:#000000de;flex-shrink:0;height:initial;line-height:unset;width:90px;padding:1px;opacity:0;transition:opacity .2s;position:absolute;z-index:1;inset:0 auto 0 0;font-size:inherit;font-weight:inherit;background-position:right center;background-repeat:no-repeat;background-size:18px auto}.country-selector:disabled{color:#00000061}:host.ngx-floating .country-selector{opacity:1!important}.country-selector-flag{display:inline-block;margin-right:.5ex}.country-list-button{color:#000000de;direction:ltr;font-size:16px;font-weight:400;height:initial;line-height:normal;min-height:48px;padding:14px 24px;text-align:left;text-transform:none;width:100%}\n"] }]
363
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.CountryCode }, { type: i2.FocusMonitor }, { type: i0.ElementRef }, { type: i3.NgControl, decorators: [{
364
+ type: Optional
365
+ }, {
366
+ type: Self
367
+ }] }, { type: i3.NgForm, decorators: [{
368
+ type: Optional
369
+ }] }, { type: i3.FormGroupDirective, decorators: [{
370
+ type: Optional
371
+ }] }, { type: i4.ErrorStateMatcher }]; }, propDecorators: { preferredCountries: [{
372
+ type: Input
373
+ }], enablePlaceholder: [{
374
+ type: Input
375
+ }], inputPlaceholder: [{
376
+ type: Input
377
+ }], cssClass: [{
378
+ type: Input
379
+ }], name: [{
380
+ type: Input
381
+ }], onlyCountries: [{
382
+ type: Input
383
+ }], errorStateMatcher: [{
384
+ type: Input
385
+ }], enableSearch: [{
386
+ type: Input
387
+ }], searchPlaceholder: [{
388
+ type: Input
389
+ }], describedBy: [{
390
+ type: Input
391
+ }], debounceTimeMs: [{
392
+ type: Input
393
+ }], format: [{
394
+ type: Input
395
+ }], placeholder: [{
396
+ type: Input
397
+ }], required: [{
398
+ type: Input
399
+ }], disabled: [{
400
+ type: Input
401
+ }], countryChanged: [{
402
+ type: Output
403
+ }], matMenu: [{
404
+ type: ViewChild,
405
+ args: [MatMenu]
406
+ }], searchInput: [{
407
+ type: ViewChild,
408
+ args: ['searchInput', { static: false }]
409
+ }], id: [{
410
+ type: HostBinding
411
+ }], shouldLabelFloat: [{
412
+ type: HostBinding,
413
+ args: ['class.ngx-floating']
414
+ }] } });
415
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNhYnMtYmFzZS1waG9uZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lY2Ficy1jb21wb25lbnRzL3NyYy9saWIvZWNhYnMtYmFzZS1waG9uZS1pbnB1dC9lY2Ficy1iYXNlLXBob25lLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VjYWJzLWNvbXBvbmVudHMvc3JjL2xpYi9lY2Ficy1iYXNlLXBob25lLWlucHV0L2VjYWJzLWJhc2UtcGhvbmUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsb0RBQW9EO0FBQ3BELE9BQU8sRUFDTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUdULFlBQVksRUFDWixXQUFXLEVBQ1gsS0FBSyxFQUdMLFFBQVEsRUFDUixNQUFNLEVBQ04sSUFBSSxFQUNKLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUVuRSxPQUFPLEVBSUwsYUFBYSxHQUNkLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUNMLFNBQVMsRUFHVCxnQkFBZ0IsRUFFaEIsMEJBQTBCLEdBRTNCLE1BQU0sbUJBQW1CLENBQUM7QUFHM0IsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDOUQsT0FBTyxFQUVMLGlCQUFpQixFQUNqQixlQUFlLEdBR2hCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDckUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7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cmNlc0NvbnRlbnQiOlsiLy8gZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG5pbXBvcnQge1xyXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBEb0NoZWNrLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIEhvc3RCaW5kaW5nLFxyXG4gIElucHV0LFxyXG4gIE9uRGVzdHJveSxcclxuICBPbkluaXQsXHJcbiAgT3B0aW9uYWwsXHJcbiAgT3V0cHV0LFxyXG4gIFNlbGYsXHJcbiAgVmlld0NoaWxkLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXRGb3JtRmllbGRDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XHJcblxyXG5pbXBvcnQge1xyXG4gIEZvcm1Hcm91cERpcmVjdGl2ZSxcclxuICBOZ0NvbnRyb2wsXHJcbiAgTmdGb3JtLFxyXG4gIE5HX1ZBTElEQVRPUlMsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQge1xyXG4gIEFzWW91VHlwZSxcclxuICBDb3VudHJ5Q29kZSBhcyBDQyxcclxuICBFMTY0TnVtYmVyLFxyXG4gIGdldEV4YW1wbGVOdW1iZXIsXHJcbiAgTmF0aW9uYWxOdW1iZXIsXHJcbiAgcGFyc2VQaG9uZU51bWJlckZyb21TdHJpbmcsXHJcbiAgUGhvbmVOdW1iZXIsXHJcbn0gZnJvbSAnbGlicGhvbmVudW1iZXItanMnO1xyXG5cclxuaW1wb3J0IHsgRm9jdXNNb25pdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknO1xyXG5pbXBvcnQgeyBjb2VyY2VCb29sZWFuUHJvcGVydHkgfSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xyXG5pbXBvcnQge1xyXG4gIENhblVwZGF0ZUVycm9yU3RhdGUsXHJcbiAgRXJyb3JTdGF0ZU1hdGNoZXIsXHJcbiAgbWl4aW5FcnJvclN0YXRlLFxyXG4gIF9BYnN0cmFjdENvbnN0cnVjdG9yLFxyXG4gIF9Db25zdHJ1Y3RvcixcclxufSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcclxuaW1wb3J0IHsgTWF0TWVudSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL21lbnUnO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQ291bnRyeUNvZGUsIEV4YW1wbGVzIH0gZnJvbSAnLi4vYmFzZS9jb25zdHMvY291bnRyeS1jb2Rlcyc7XHJcbmltcG9ydCB7IHBob25lTnVtYmVyVmFsaWRhdG9yIH0gZnJvbSAnLi4vYmFzZS92YWxpZGF0b3JzL3Bob25lLW51bWJlci52YWxpZGF0b3InO1xyXG5pbXBvcnQgeyBDb3VudHJ5LCBQaG9uZU51bWJlckZvcm1hdCB9IGZyb20gJy4uL2Jhc2UvbW9kZWxzL3Bob25lLm1vZGVscyc7XHJcblxyXG5jbGFzcyBOZ3hNYXRJbnRsVGVsSW5wdXRCYXNlIHtcclxuICByZWFkb25seSBzdGF0ZUNoYW5nZXMgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyBfZGVmYXVsdEVycm9yU3RhdGVNYXRjaGVyOiBFcnJvclN0YXRlTWF0Y2hlcixcclxuICAgIHB1YmxpYyBfcGFyZW50Rm9ybTogTmdGb3JtLFxyXG4gICAgcHVibGljIF9wYXJlbnRGb3JtR3JvdXA6IEZvcm1Hcm91cERpcmVjdGl2ZSxcclxuICAgIHB1YmxpYyBuZ0NvbnRyb2w6IE5nQ29udHJvbCxcclxuICApIHt9XHJcbn1cclxuXHJcbmRlY2xhcmUgdHlwZSBDYW5VcGRhdGVFcnJvclN0YXRlQ3RvciA9IF9Db25zdHJ1Y3RvcjxDYW5VcGRhdGVFcnJvclN0YXRlPiAmXHJcbiAgX0Fic3RyYWN0Q29uc3RydWN0b3I8Q2FuVXBkYXRlRXJyb3JTdGF0ZT47XHJcblxyXG5jb25zdCBfTmd4TWF0SW50bFRlbElucHV0TWl4aW5CYXNlOiBDYW5VcGRhdGVFcnJvclN0YXRlQ3RvciAmXHJcbiAgdHlwZW9mIE5neE1hdEludGxUZWxJbnB1dEJhc2UgPSBtaXhpbkVycm9yU3RhdGUoTmd4TWF0SW50bFRlbElucHV0QmFzZSk7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2VjYWJzLWJhc2UtcGhvbmUnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9lY2Ficy1iYXNlLXBob25lLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9lY2Ficy1iYXNlLXBob25lLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgc3RhbmRhbG9uZTogZmFsc2UsXHJcbiAgcHJvdmlkZXJzOiBbXHJcbiAgICBDb3VudHJ5Q29kZSxcclxuICAgIHsgcHJvdmlkZTogTWF0Rm9ybUZpZWxkQ29udHJvbCwgdXNlRXhpc3Rpbmc6IEVjYWJzQmFzZVBob25lQ29tcG9uZW50IH0sXHJcbiAgICB7XHJcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsXHJcbiAgICAgIHVzZVZhbHVlOiBwaG9uZU51bWJlclZhbGlkYXRvcixcclxuICAgICAgbXVsdGk6IHRydWUsXHJcbiAgICB9LFxyXG4gIF0sXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgRWNhYnNCYXNlUGhvbmVDb21wb25lbnRcclxuICBleHRlbmRzIF9OZ3hNYXRJbnRsVGVsSW5wdXRNaXhpbkJhc2VcclxuICBpbXBsZW1lbnRzXHJcbiAgICBPbkluaXQsXHJcbiAgICBPbkRlc3Ryb3ksXHJcbiAgICBEb0NoZWNrLFxyXG4gICAgQ2FuVXBkYXRlRXJyb3JTdGF0ZSxcclxuICAgIE1hdEZvcm1GaWVsZENvbnRyb2w8YW55PlxyXG57XHJcbiAgQElucHV0KCkgcHJlZmVycmVkQ291bnRyaWVzOiBzdHJpbmdbXSA9IFtdO1xyXG4gIEBJbnB1dCgpIGVuYWJsZVBsYWNlaG9sZGVyID0gdHJ1ZTtcclxuICBASW5wdXQoKSBpbnB1dFBsYWNlaG9sZGVyOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgQElucHV0KCkgY3NzQ2xhc3M6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICBASW5wdXQoKSBuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgQElucHV0KCkgb25seUNvdW50cmllczogc3RyaW5nW10gPSBbXTtcclxuICBASW5wdXQoKSBvdmVycmlkZSBlcnJvclN0YXRlTWF0Y2hlcjogRXJyb3JTdGF0ZU1hdGNoZXIgPVxyXG4gICAgbmV3IEVycm9yU3RhdGVNYXRjaGVyKCk7XHJcbiAgQElucHV0KCkgZW5hYmxlU2VhcmNoID0gZmFsc2U7XHJcbiAgQElucHV0KCkgc2VhcmNoUGxhY2Vob2xkZXI6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICBASW5wdXQoKSBkZXNjcmliZWRCeSA9ICcnO1xyXG4gIEBJbnB1dCgpIGRlYm91bmNlVGltZU1zID0gNTAwO1xyXG4gIEBJbnB1dCgpXHJcbiAgZ2V0IGZvcm1hdCgpOiBQaG9uZU51bWJlckZvcm1hdCB7XHJcbiAgICByZXR1cm4gdGhpcy5fZm9ybWF0O1xyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBnZXQgcGxhY2Vob2xkZXIoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9wbGFjZWhvbGRlciB8fCAnJztcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgZ2V0IHJlcXVpcmVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3JlcXVpcmVkO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQ7XHJcbiAgfVxyXG5cclxuICBAT3V0cHV0KCkgY291bnRyeUNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPENvdW50cnk+KCk7XHJcblxyXG4gIEBWaWV3Q2hpbGQoTWF0TWVudSkgbWF0TWVudTogTWF0TWVudSB8IHVuZGVmaW5lZDtcclxuICBAVmlld0NoaWxkKCdzZWFyY2hJbnB1dCcsIHsgc3RhdGljOiBmYWxzZSB9KVxyXG4gIHNlYXJjaElucHV0OiBFbGVtZW50UmVmO1xyXG5cclxuICBASG9zdEJpbmRpbmcoKVxyXG4gIGlkID0gYGVjYWJzLWludGwtdGVsLWlucHV0LSR7RWNhYnNCYXNlUGhvbmVDb21wb25lbnQubmV4dElkKyt9YDtcclxuXHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5uZ3gtZmxvYXRpbmcnKVxyXG4gIGdldCBzaG91bGRMYWJlbEZsb2F0KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZm9jdXNlZCB8fCAhdGhpcy5lbXB0eTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBuZXh0SWQgPSAwO1xyXG5cclxuICBwcml2YXRlIF9jaGFuZ2VTdWJqZWN0ID0gbmV3IFN1YmplY3QoKTtcclxuICBwcml2YXRlIF9wbGFjZWhvbGRlcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgX3JlcXVpcmVkID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfZGlzYWJsZWQgPSBmYWxzZTtcclxuICBwcml2YXRlIF9wcmV2aW91c0Zvcm1hdHRlZE51bWJlcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgX2Zvcm1hdDogUGhvbmVOdW1iZXJGb3JtYXQgPSAnZGVmYXVsdCc7XHJcbiAgb3ZlcnJpZGUgc3RhdGVDaGFuZ2VzID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgZm9jdXNlZCA9IGZhbHNlO1xyXG4gIHBob25lTnVtYmVyOiBOYXRpb25hbE51bWJlciB8IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICBhbGxDb3VudHJpZXM6IENvdW50cnlbXSA9IFtdO1xyXG4gIHByZWZlcnJlZENvdW50cmllc0luRHJvcERvd246IENvdW50cnlbXSA9IFtdO1xyXG4gIHNlbGVjdGVkQ291bnRyeTogQ291bnRyeSB8IHVuZGVmaW5lZDtcclxuICBudW1iZXJJbnN0YW5jZTogUGhvbmVOdW1iZXIgfCB1bmRlZmluZWQ7XHJcbiAgdmFsdWU6IEUxNjROdW1iZXIgfCBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgc2VhcmNoQ3JpdGVyaWE6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuXHJcbiAgZ2V0IGVtcHR5KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICF0aGlzLnBob25lTnVtYmVyO1xyXG4gIH1cclxuXHJcbiAgc2V0IGZvcm1hdCh2YWx1ZTogUGhvbmVOdW1iZXJGb3JtYXQpIHtcclxuICAgIHRoaXMuX2Zvcm1hdCA9IHZhbHVlO1xyXG4gICAgdGhpcy5waG9uZU51bWJlciA9IHRoaXMuZm9ybWF0dGVkUGhvbmVOdW1iZXI7XHJcbiAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KHVuZGVmaW5lZCk7XHJcbiAgfVxyXG5cclxuICBzZXQgcGxhY2Vob2xkZXIodmFsdWU6IHN0cmluZykge1xyXG4gICAgdGhpcy5fcGxhY2Vob2xkZXIgPSB2YWx1ZTtcclxuICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQodW5kZWZpbmVkKTtcclxuICB9XHJcblxyXG4gIHNldCByZXF1aXJlZCh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fcmVxdWlyZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xyXG4gICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCh1bmRlZmluZWQpO1xyXG4gIH1cclxuXHJcbiAgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9kaXNhYmxlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XHJcbiAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KHVuZGVmaW5lZCk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZ2V0UGhvbmVOdW1iZXJQbGFjZUhvbGRlcihjb3VudHJ5SVNPQ29kZTogQ0MpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xyXG4gICAgY29uc3QgcmVzdWx0ID0gZ2V0RXhhbXBsZU51bWJlcihjb3VudHJ5SVNPQ29kZSwgRXhhbXBsZXMpO1xyXG5cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1leHRyYS1ib29sZWFuLWNhc3RcclxuICAgIHJldHVybiAhIXJlc3VsdCA/IHJlc3VsdC5udW1iZXIudG9TdHJpbmcoKSA6IHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIG9uVG91Y2hlZCA9ICgpID0+IHt9O1xyXG5cclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXHJcbiAgcHJvcGFnYXRlQ2hhbmdlID0gKF86IHVua25vd24pID0+IHt9O1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcHJpdmF0ZSBjb3VudHJ5Q29kZURhdGE6IENvdW50cnlDb2RlLFxyXG4gICAgcHJpdmF0ZSBmbTogRm9jdXNNb25pdG9yLFxyXG4gICAgcHJpdmF0ZSBlbFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXHJcbiAgICBAT3B0aW9uYWwoKSBAU2VsZigpIHB1YmxpYyBvdmVycmlkZSBuZ0NvbnRyb2w6IE5nQ29udHJvbCxcclxuICAgIEBPcHRpb25hbCgpIHBhcmVudEZvcm06IE5nRm9ybSxcclxuICAgIEBPcHRpb25hbCgpIHBhcmVudEZvcm1Hcm91cDogRm9ybUdyb3VwRGlyZWN0aXZlLFxyXG4gICAgZGVmYXVsdEVycm9yU3RhdGVNYXRjaGVyOiBFcnJvclN0YXRlTWF0Y2hlcixcclxuICApIHtcclxuICAgIHN1cGVyKGRlZmF1bHRFcnJvclN0YXRlTWF0Y2hlciwgcGFyZW50Rm9ybSwgcGFyZW50Rm9ybUdyb3VwLCBuZ0NvbnRyb2wpO1xyXG5cclxuICAgIGZtLm1vbml0b3IoZWxSZWYsIHRydWUpLnN1YnNjcmliZSgob3JpZ2luKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmZvY3VzZWQgJiYgIW9yaWdpbikge1xyXG4gICAgICAgIHRoaXMub25Ub3VjaGVkKCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5mb2N1c2VkID0gISFvcmlnaW47XHJcbiAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQodW5kZWZpbmVkKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5mZXRjaENvdW50cnlEYXRhKCk7XHJcbiAgICBpZiAodGhpcy5uZ0NvbnRyb2wgIT0gbnVsbCkge1xyXG4gICAgICB0aGlzLm5nQ29udHJvbC52YWx1ZUFjY2Vzc29yID0gdGhpcztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnNlYXJjaFBsYWNlaG9sZGVyKSB7XHJcbiAgICAgIHRoaXMuc2VhcmNoUGxhY2Vob2xkZXIgPSAnU2VhcmNoIC4uLic7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5wcmVmZXJyZWRDb3VudHJpZXMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMucHJlZmVycmVkQ291bnRyaWVzLmZvckVhY2goKGlzbzIpID0+IHtcclxuICAgICAgICBjb25zdCBwcmVmZXJyZWRDb3VudHJ5ID0gdGhpcy5hbGxDb3VudHJpZXNcclxuICAgICAgICAgIC5maWx0ZXIoKGMpID0+IGMuaXNvMiA9PT0gaXNvMilcclxuICAgICAgICAgIC5zaGlmdCgpO1xyXG4gICAgICAgIGlmIChwcmVmZXJyZWRDb3VudHJ5KSB7XHJcbiAgICAgICAgICB0aGlzLnByZWZlcnJlZENvdW50cmllc0luRHJvcERvd24ucHVzaChwcmVmZXJyZWRDb3VudHJ5KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMub25seUNvdW50cmllcy5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5hbGxDb3VudHJpZXMgPSB0aGlzLmFsbENvdW50cmllcy5maWx0ZXIoKGMpID0+XHJcbiAgICAgICAgdGhpcy5vbmx5Q291bnRyaWVzLmluY2x1ZGVzKGMuaXNvMiksXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5udW1iZXJJbnN0YW5jZSAmJiB0aGlzLm51bWJlckluc3RhbmNlLmNvdW50cnkpIHtcclxuICAgICAgLy8gSWYgYW4gZXhpc3RpbmcgbnVtYmVyIGlzIHByZXNlbnQsIHdlIHVzZSBpdCB0byBkZXRlcm1pbmUgc2VsZWN0ZWRDb3VudHJ5XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRDb3VudHJ5ID0gdGhpcy5nZXRDb3VudHJ5KHRoaXMubnVtYmVySW5zdGFuY2UuY291bnRyeSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5wcmVmZXJyZWRDb3VudHJpZXNJbkRyb3BEb3duLmxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb3VudHJ5ID0gdGhpcy5wcmVmZXJyZWRDb3VudHJpZXNJbkRyb3BEb3duWzBdO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb3VudHJ5ID0gdGhpcy5hbGxDb3VudHJpZXNbMF07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuX2NoYW5nZVN1YmplY3RcclxuICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKHRoaXMuZGVib3VuY2VUaW1lTXMpKVxyXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICB0aGlzLm9uUGhvbmVOdW1iZXJDaGFuZ2UoKTtcclxuICAgICAgfSk7XHJcbiAgICB0aGlzLmNvdW50cnlDaGFuZ2VkLmVtaXQodGhpcy5zZWxlY3RlZENvdW50cnkpO1xyXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQodW5kZWZpbmVkKTtcclxuICB9XHJcblxyXG4gIG5nRG9DaGVjaygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLm5nQ29udHJvbCkge1xyXG4gICAgICB0aGlzLnVwZGF0ZUVycm9yU3RhdGUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5zdGF0ZUNoYW5nZXMuY29tcGxldGUoKTtcclxuICAgIHRoaXMuZm0uc3RvcE1vbml0b3JpbmcodGhpcy5lbFJlZik7XHJcbiAgICB0aGlzLl9jaGFuZ2VTdWJqZWN0LmNvbXBsZXRlKCk7XHJcbiAgfVxyXG5cclxuICBvblBob25lTnVtYmVyQ2hhbmdlRGVib3VuY2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jaGFuZ2VTdWJqZWN0Lm5leHQodW5kZWZpbmVkKTtcclxuICB9XHJcblxyXG4gIG9uUGhvbmVOdW1iZXJDaGFuZ2UoKTogdm9pZCB7XHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLm51bWJlckluc3RhbmNlID0gcGFyc2VQaG9uZU51bWJlckZyb21TdHJpbmcoXHJcbiAgICAgICAgdGhpcy5waG9uZU51bWJlcj8udG9TdHJpbmcoKSB8fCAnJyxcclxuICAgICAgICB0aGlzLnNlbGVjdGVkQ291bnRyeT8uaXNvMi50b1VwcGVyQ2FzZSgpIGFzIENDLFxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLmZvcm1hdEFzWW91VHlwZUlmRW5hYmxlZCgpO1xyXG4gICAgICB0aGlzLnZhbHVlID0gdGhpcy5udW1iZXJJbnN0YW5jZT8ubnVtYmVyO1xyXG4gICAgICBpZiAodGhpcy5udW1iZXJJbnN0YW5jZSAmJiB0aGlzLm51bWJlckluc3RhbmNlLmlzVmFsaWQoKSkge1xyXG4gICAgICAgIGlmICh0aGlzLnBob25lTnVtYmVyICE9PSB0aGlzLmZvcm1hdHRlZFBob25lTnVtYmVyKSB7XHJcbiAgICAgICAgICB0aGlzLnBob25lTnVtYmVyID0gdGhpcy5mb3JtYXR0ZWRQaG9uZU51bWJlcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZENvdW50cnk/LmlzbzIgIT09IHRoaXMubnVtYmVySW5zdGFuY2UuY291bnRyeSAmJlxyXG4gICAgICAgICAgISF0aGlzLm51bWJlckluc3RhbmNlLmNvdW50cnlcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDb3VudHJ5ID0gdGhpcy5nZXRDb3VudHJ5KHRoaXMubnVtYmVySW5zdGFuY2UuY291bnRyeSk7XHJcbiAgICAgICAgICB0aGlzLmNvdW50cnlDaGFuZ2VkLmVtaXQodGhpcy5zZWxlY3RlZENvdW50cnkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCB7XHJcbiAgICAgIC8vIGlmIG5vIHBvc3NpYmxlIG51bWJlcnMgYXJlIHRoZXJlLFxyXG4gICAgICAvLyB0aGVuIHRoZSBmdWxsIG51bWJlciBpcyBwYXNzZWQgc28gdGhhdCB2YWxpZGF0b3IgY291bGQgYmUgdHJpZ2dlcmVkIGFuZCBwcm9wZXIgZXJyb3IgY291bGQgYmUgc2hvd25cclxuICAgICAgdGhpcy52YWx1ZSA9IHRoaXMucGhvbmVOdW1iZXI/LnRvU3RyaW5nKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSh0aGlzLnZhbHVlKTtcclxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICBvbkNvdW50cnlTZWxlY3QoY291bnRyeTogQ291bnRyeSk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMucGhvbmVOdW1iZXIpIHtcclxuICAgICAgdGhpcy5waG9uZU51bWJlciA9IHRoaXMubnVtYmVySW5zdGFuY2U/Lm5hdGlvbmFsTnVtYmVyO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zZWxlY3RlZENvdW50cnkgPSBjb3VudHJ5O1xyXG4gICAgdGhpcy5jb3VudHJ5Q2hhbmdlZC5lbWl0KHRoaXMuc2VsZWN0ZWRDb3VudHJ5KTtcclxuICAgIHRoaXMub25QaG9uZU51bWJlckNoYW5nZSgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q291bnRyeShjb2RlOiBzdHJpbmcpOiBDb3VudHJ5IHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIHRoaXMuYWxsQ291bnRyaWVzLmZpbmQoKGMpID0+IGMuaXNvMiA9PT0gY29kZS50b0xvd2VyQ2FzZSgpKSB8fCB7XHJcbiAgICAgICAgbmFtZTogJ1VOJyxcclxuICAgICAgICBpc28yOiAnVU4nLFxyXG4gICAgICAgIGRpYWxDb2RlOiAnJyxcclxuICAgICAgICBwcmlvcml0eTogMCxcclxuICAgICAgICBhcmVhQ29kZXM6IHVuZGVmaW5lZCxcclxuICAgICAgICBmbGFnQ2xhc3M6ICdVTicsXHJcbiAgICAgICAgcGxhY2VIb2xkZXI6ICcnLFxyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgb25JbnB1dEtleVByZXNzKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICBjb25zdCBwYXR0ZXJuID0gL1swLTkrXFwtIF0vO1xyXG4gICAgaWYgKCFwYXR0ZXJuLnRlc3QoZXZlbnQua2V5KSkge1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZmxhZ0NsYXNzKGxhbmc6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gYGZpIGZpLSR7bGFuZz8uc2xpY2UoLTIpLnRvTG93ZXJDYXNlKCl9YDtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UgPSBmbjtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XHJcbiAgfVxyXG5cclxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xyXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQodW5kZWZpbmVkKTtcclxuICB9XHJcblxyXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgIHRoaXMubnVtYmVySW5zdGFuY2UgPSBwYXJzZVBob25lTnVtYmVyRnJvbVN0cmluZyh2YWx1ZSk7XHJcbiAgICAgIGlmICh0aGlzLm51bWJlckluc3RhbmNlKSB7XHJcbiAgICAgICAgY29uc3QgY291bnRyeUNvZGUgPSB0aGlzLm51bWJlckluc3RhbmNlLmNvdW50cnk7XHJcbiAgICAgICAgdGhpcy5waG9uZU51bWJlciA9IHRoaXMuZm9ybWF0dGVkUGhvbmVOdW1iZXI7XHJcbiAgICAgICAgaWYgKCFjb3VudHJ5Q29kZSkge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDb3VudHJ5ID0gdGhpcy5nZXRDb3VudHJ5KGNvdW50cnlDb2RlKTtcclxuICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENvdW50cnkuZGlhbENvZGUgJiZcclxuICAgICAgICAgICAgIXRoaXMucHJlZmVycmVkQ291bnRyaWVzLmluY2x1ZGVzKHRoaXMuc2VsZWN0ZWRDb3VudHJ5LmlzbzIpXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgdGhpcy5wcmVmZXJyZWRDb3VudHJpZXNJbkRyb3BEb3duLnB1c2godGhpcy5zZWxlY3RlZENvdW50cnkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5jb3VudHJ5Q2hhbmdlZC5lbWl0KHRoaXMuc2VsZWN0ZWRDb3VudHJ5KTtcclxuXHJcbiAgICAgICAgICAvLyBJbml0aWFsIHZhbHVlIGlzIHNldFxyXG4gICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQodW5kZWZpbmVkKTtcclxuICAgICAgICB9LCAxKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnBob25lTnVtYmVyID0gdmFsdWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBWYWx1ZSBpcyBzZXQgZnJvbSBvdXRzaWRlIHVzaW5nIHNldFZhbHVlKClcclxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KHVuZGVmaW5lZCk7XHJcbiAgfVxyXG5cclxuICBzZXREZXNjcmliZWRCeUlkcyhpZHM6IHN0cmluZ1tdKSB7XHJcbiAgICB0aGlzLmRlc2NyaWJlZEJ5ID0gaWRzLmpvaW4oJyAnKTtcclxuICB9XHJcblxyXG4gIG9uQ29udGFpbmVyQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICgoZXZlbnQudGFyZ2V0IGFzIEVsZW1lbnQpLnRhZ05hbWUudG9Mb3dlckNhc2UoKSAhPT0gJ2lucHV0Jykge1xyXG4gICAgICB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXQnKSEuZm9jdXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlc2V0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5waG9uZU51bWJlciA9ICcnO1xyXG4gICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UobnVsbCk7XHJcblxyXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQodW5kZWZpbmVkKTtcclxuICB9XHJcblxyXG4gIG9uU2VhcmNoSW5wdXQoKTogdm9pZCB7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5zZWFyY2hJbnB1dD8ubmF0aXZlRWxlbWVudD8uZm9jdXMoKTtcclxuICAgIH0sIDIwMCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZmV0Y2hDb3VudHJ5RGF0YSgpOiB2b2lkIHtcclxuICAgIHRoaXMuY291bnRyeUNvZGVEYXRhLmFsbENvdW50cmllcy5mb3JFYWNoKChjKSA9PiB7XHJcbiAgICAgIGNvbnN0IGNvdW50cnk6IENvdW50cnkgPSB7XHJcbiAgICAgICAgbmFtZTogY1swXS50b1N0cmluZygpLFxyXG4gICAgICAgIGlzbzI6IGNbMV0udG9TdHJpbmcoKSxcclxuICAgICAgICBkaWFsQ29kZTogY1syXS50b1N0cmluZygpLFxyXG4gICAgICAgIHByaW9yaXR5OiArY1szXSB8fCAwLFxyXG4gICAgICAgIGFyZWFDb2RlczogKGNbNF0gYXMgc3RyaW5nW10pIHx8IHVuZGVmaW5lZCxcclxuICAgICAgICBmbGFnQ2xhc3M6IGNbMV0udG9TdHJpbmcoKS50b1VwcGVyQ2FzZSgpLFxyXG4gICAgICAgIHBsYWNlSG9sZGVyOiAnJyxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGlmICh0aGlzLmVuYWJsZVBsYWNlaG9sZGVyKSB7XHJcbiAgICAgICAgY291bnRyeS5wbGFjZUhvbGRlciA9IEVjYWJzQmFzZVBob25lQ29tcG9uZW50LmdldFBob25lTnVtYmVyUGxhY2VIb2xkZXIoXHJcbiAgICAgICAgICBjb3VudHJ5LmlzbzIudG9VcHBlckNhc2UoKSBhcyBDQyxcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmFsbENvdW50cmllcy5wdXNoKGNvdW50cnkpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldCBmb3JtYXR0ZWRQaG9uZU51bWJlcigpOiBzdHJpbmcge1xyXG4gICAgaWYgKCF0aGlzLm51bWJlckluc3RhbmNlKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnBob25lTnVtYmVyPy50b1N0cmluZygpIHx8ICcnO1xyXG4gICAgfVxyXG4gICAgc3dpdGNoICh0aGlzLmZvcm1hdCkge1xyXG4gICAgICBjYXNlICduYXRpb25hbCc6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubnVtYmVySW5zdGFuY2UuZm9ybWF0TmF0aW9uYWwoKTtcclxuXHJcbiAgICAgIGNhc2UgJ2ludGVybmF0aW9uYWwnOlxyXG4gICAgICAgIHJldHVybiB0aGlzLm51bWJlckluc3RhbmNlLmZvcm1hdEludGVybmF0aW9uYWwoKTtcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubnVtYmVySW5zdGFuY2UubmF0aW9uYWxOdW1iZXIudG9TdHJpbmcoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZm9ybWF0QXNZb3VUeXBlSWZFbmFibGVkKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZm9ybWF0ID09PSAnZGVmYXVsdCcpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgYXNZb3VUeXBlOiBBc1lvdVR5cGUgPSBuZXcgQXNZb3VUeXBlKFxyXG4gICAgICB0aGlzLnNlbGVjdGVkQ291bnRyeT8uaXNvMi50b1VwcGVyQ2FzZSgpIGFzIENDLFxyXG4gICAgKTtcclxuICAgIC8vIFRvIGF2b2lkIGNhcmV0IHBvc2l0aW9uaW5nIHdlIGFwcGx5IGZvcm1hdHRpbmcgb25seSBpZiB0aGUgY2FyZXQgaXMgYXQgdGhlIGVuZDpcclxuICAgIGlmIChcclxuICAgICAgdGhpcy5waG9uZU51bWJlclxyXG4gICAgICAgID8udG9TdHJpbmcoKVxyXG4gICAgICAgIC5zdGFydHNXaXRoKHRoaXMuX3ByZXZpb3VzRm9ybWF0dGVkTnVtYmVyIHx8ICcnKVxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMucGhvbmVOdW1iZXIgPSBhc1lvdVR5cGUuaW5wdXQodGhpcy5waG9uZU51bWJlci50b1N0cmluZygpKTtcclxuICAgIH1cclxuICAgIHRoaXMuX3ByZXZpb3VzRm9ybWF0dGVkTnVtYmVyID0gdGhpcy5waG9uZU51bWJlcj8udG9TdHJpbmcoKTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImVjYWJzLXRlbC1pbnB1dC1jb250YWluZXJcIj5cclxuICA8YnV0dG9uXHJcbiAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgIG1hdC1idXR0b25cclxuICAgIFttYXRNZW51VHJpZ2dlckZvcl09XCJtZW51XCJcclxuICAgIGNsYXNzPVwiY291bnRyeS1zZWxlY3RvclwiXHJcbiAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gID5cclxuICAgIDxzcGFuXHJcbiAgICAgIGNsYXNzPVwiY291bnRyeS1zZWxlY3Rvci1mbGFnIGZsYWdcIlxyXG4gICAgICBbbmdDbGFzc109XCJmbGFnQ2xhc3Moc2VsZWN0ZWRDb3VudHJ5Py5mbGFnQ2xhc3MpXCJcclxuICAgID48L3NwYW4+XHJcbiAgICA8c3BhbiBjbGFzcz1cImNvdW50cnktc2VsZWN0b3ItY29kZVwiICpuZ0lmPVwic2VsZWN0ZWRDb3VudHJ5Py5kaWFsQ29kZVwiXHJcbiAgICA+K3t7IHNlbGVjdGVkQ291bnRyeS5kaWFsQ29kZSB9fTwvc3BhblxyXG4gICAgPlxyXG4gIDwvYnV0dG9uPlxyXG4gIDxtYXQtbWVudSAjbWVudT1cIm1hdE1lbnVcIlxyXG4gICAgICAgICAgICBjbGFzcz1cImVjYWJzLXRlbC1pbnB1dC1tYXQtbWVudS1wYW5lbFwiXHJcbiAgICAgICAgICAgIGJhY2tkcm9wQ2xhc3M9XCJlY2Ficy10ZWwtaW5wdXQtb3ZlcmxheS1iYWNrZHJvcFwiXHJcbiAgICAgICAgICAgIG92ZXJsYXlQYW5lbENsYXNzPVwiZWNhYnMtdGVsLWlucHV0LW92ZXJsYXktcGFuZVwiPlxyXG4gICAgPGlucHV0XHJcbiAgICAgICNzZWFyY2hJbnB1dFxyXG4gICAgICAqbmdJZj1cImVuYWJsZVNlYXJjaFwiXHJcbiAgICAgIGNsYXNzPVwiY291bnRyeS1zZWFyY2hcIlxyXG4gICAgICBbKG5nTW9kZWwpXT1cInNlYXJjaENyaXRlcmlhXCJcclxuICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25TZWFyY2hJbnB1dCgpXCJcclxuICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICBbcGxhY2Vob2xkZXJdPVwic2VhcmNoUGxhY2Vob2xkZXJcIlxyXG4gICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcclxuICAgIC8+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNlYXJjaENyaXRlcmlhXCI+XHJcbiAgICAgIDxidXR0b25cclxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICBtYXQtbWVudS1pdGVtXHJcbiAgICAgICAgY2xhc3M9XCJjb3VudHJ5LWxpc3QtYnV0dG9uXCJcclxuICAgICAgICAqbmdGb3I9XCJsZXQgY291bnRyeSBvZiBwcmVmZXJyZWRDb3VudHJpZXNJbkRyb3BEb3duXCJcclxuICAgICAgICAoY2xpY2spPVwib25Db3VudHJ5U2VsZWN0KGNvdW50cnkpXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJpY29uLXdyYXBwZXJcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGFnXCIgICAgXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJmbGFnQ2xhc3MoY291bnRyeS5mbGFnQ2xhc3MpXCI+PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsLXdyYXBwZXJcIj5cclxuICAgICAgICAgIHt7IGNvdW50cnkubmFtZSB9fVxyXG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJjb3VudHJ5Py5kaWFsQ29kZVwiPit7eyBjb3VudHJ5LmRpYWxDb2RlIH19PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgPG1hdC1kaXZpZGVyICpuZ0lmPVwicHJlZmVycmVkQ291bnRyaWVzSW5Ecm9wRG93bj8ubGVuZ3RoXCI+PC9tYXQtZGl2aWRlcj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY291bnRyeSBvZiBhbGxDb3VudHJpZXNcIj5cclxuICAgICAgPGJ1dHRvblxyXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgIG1hdC1tZW51LWl0ZW1cclxuICAgICAgICBjbGFzcz1cImNvdW50cnktbGlzdC1idXR0b25cIlxyXG4gICAgICAgICpuZ0lmPVwiY291bnRyeSB8IHNlYXJjaDogc2VhcmNoQ3JpdGVyaWFcIlxyXG4gICAgICAgIChjbGljayk9XCJvbkNvdW50cnlTZWxlY3QoY291bnRyeSlcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImljb24td3JhcHBlclwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsYWdcIiBbbmdDbGFzc109XCJmbGFnQ2xhc3MoY291bnRyeS5mbGFnQ2xhc3MpXCI+PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsLXdyYXBwZXJcIj5cclxuICAgICAgICAgIHt7IGNvdW50cnkubmFtZSB9fSAre3sgY291bnRyeS5kaWFsQ29kZSB9fVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gIDwvbWF0LW1lbnU+XHJcblxyXG4gIDxpbnB1dFxyXG4gICAgbWF0SW5wdXRcclxuICAgIHR5cGU9XCJ0ZWxcIlxyXG4gICAgYXV0b2NvbXBsZXRlPVwidGVsXCJcclxuICAgIFtuZ0NsYXNzXT1cImNzc0NsYXNzXCJcclxuICAgIChibHVyKT1cIm9uVG91Y2hlZCgpXCJcclxuICAgIChrZXlwcmVzcyk9XCJvbklucHV0S2V5UHJlc3MoJGV2ZW50KVwiXHJcbiAgICBbKG5nTW9kZWwpXT1cInBob25lTnVtYmVyXCJcclxuICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uUGhvbmVOdW1iZXJDaGFuZ2VEZWJvdW5jZSgpXCJcclxuICAgIFtlcnJvclN0YXRlTWF0Y2hlcl09XCJlcnJvclN0YXRlTWF0Y2hlclwiXHJcbiAgICBbcGxhY2Vob2xkZXJdPVwiaW5wdXRQbGFjZWhvbGRlclwiXHJcbiAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgW2FyaWEtZGVzY3JpYmVkYnldPVwiZGVzY3JpYmVkQnlcIlxyXG4gIC8+XHJcbjwvZGl2PiJdfQ==
@@ -0,0 +1,58 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { MatIconModule } from '@angular/material/icon';
4
+ import { RouterModule } from '@angular/router';
5
+ import { EcabsBasePhoneComponent } from './ecabs-base-phone.component';
6
+ import { FormsModule, ReactiveFormsModule } from '@angular/forms';
7
+ import { MatInputModule } from '@angular/material/input';
8
+ import { MatMenuModule } from '@angular/material/menu';
9
+ import { MatButtonModule } from '@angular/material/button';
10
+ import { MatDividerModule } from '@angular/material/divider';
11
+ import { SearchPipe } from '../base/pipes/search.pipe';
12
+ import { ElementWrapperModule } from '../base/element-wrapper/element-wrapper.module';
13
+ import * as i0 from "@angular/core";
14
+ export class EcabsBasePhoneModule {
15
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: EcabsBasePhoneModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
16
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.2.12", ngImport: i0, type: EcabsBasePhoneModule, declarations: [EcabsBasePhoneComponent], imports: [CommonModule,
17
+ MatIconModule,
18
+ RouterModule,
19
+ FormsModule,
20
+ MatInputModule,
21
+ MatMenuModule,
22
+ MatButtonModule,
23
+ MatDividerModule,
24
+ ReactiveFormsModule,
25
+ SearchPipe,
26
+ ElementWrapperModule], exports: [EcabsBasePhoneComponent] });
27
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: EcabsBasePhoneModule, imports: [CommonModule,
28
+ MatIconModule,
29
+ RouterModule,
30
+ FormsModule,
31
+ MatInputModule,
32
+ MatMenuModule,
33
+ MatButtonModule,
34
+ MatDividerModule,
35
+ ReactiveFormsModule,
36
+ ElementWrapperModule] });
37
+ }
38
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: EcabsBasePhoneModule, decorators: [{
39
+ type: NgModule,
40
+ args: [{
41
+ declarations: [EcabsBasePhoneComponent],
42
+ imports: [
43
+ CommonModule,
44
+ MatIconModule,
45
+ RouterModule,
46
+ FormsModule,
47
+ MatInputModule,
48
+ MatMenuModule,
49
+ MatButtonModule,
50
+ MatDividerModule,
51
+ ReactiveFormsModule,
52
+ SearchPipe,
53
+ ElementWrapperModule,
54
+ ],
55
+ exports: [EcabsBasePhoneComponent],
56
+ }]
57
+ }] });
58
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNhYnMtYmFzZS1waG9uZS5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lY2Ficy1jb21wb25lbnRzL3NyYy9saWIvZWNhYnMtYmFzZS1waG9uZS1pbnB1dC9lY2Ficy1iYXNlLXBob25lLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDdkQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7O0FBbUJ0RixNQUFNLE9BQU8sb0JBQW9CO3dHQUFwQixvQkFBb0I7eUdBQXBCLG9CQUFvQixpQkFoQmhCLHVCQUF1QixhQUVwQyxZQUFZO1lBQ1osYUFBYTtZQUNiLFlBQVk7WUFDWixXQUFXO1lBQ1gsY0FBYztZQUNkLGFBQWE7WUFDYixlQUFlO1lBQ2YsZ0JBQWdCO1lBQ2hCLG1CQUFtQjtZQUNuQixVQUFVO1lBQ1Ysb0JBQW9CLGFBRVosdUJBQXVCO3lHQUV0QixvQkFBb0IsWUFkN0IsWUFBWTtZQUNaLGFBQWE7WUFDYixZQUFZO1lBQ1osV0FBVztZQUNYLGNBQWM7WUFDZCxhQUFhO1lBQ2IsZUFBZTtZQUNmLGdCQUFnQjtZQUNoQixtQkFBbUI7WUFFbkIsb0JBQW9COzs0RkFJWCxvQkFBb0I7a0JBakJoQyxRQUFRO21CQUFDO29CQUNSLFlBQVksRUFBRSxDQUFDLHVCQUF1QixDQUFDO29CQUN2QyxPQUFPLEVBQUU7d0JBQ1AsWUFBWTt3QkFDWixhQUFhO3dCQUNiLFlBQVk7d0JBQ1osV0FBVzt3QkFDWCxjQUFjO3dCQUNkLGFBQWE7d0JBQ2IsZUFBZTt3QkFDZixnQkFBZ0I7d0JBQ2hCLG1CQUFtQjt3QkFDbkIsVUFBVTt3QkFDVixvQkFBb0I7cUJBQ3JCO29CQUNELE9BQU8sRUFBRSxDQUFDLHVCQUF1QixDQUFDO2lCQUNuQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcclxuaW1wb3J0IHsgUm91dGVyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgRWNhYnNCYXNlUGhvbmVDb21wb25lbnQgfSBmcm9tICcuL2VjYWJzLWJhc2UtcGhvbmUuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IE1hdElucHV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xyXG5pbXBvcnQgeyBNYXRNZW51TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbWVudSc7XHJcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XHJcbmltcG9ydCB7IE1hdERpdmlkZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaXZpZGVyJztcclxuaW1wb3J0IHsgU2VhcmNoUGlwZSB9IGZyb20gJy4uL2Jhc2UvcGlwZXMvc2VhcmNoLnBpcGUnO1xyXG5pbXBvcnQgeyBFbGVtZW50V3JhcHBlck1vZHVsZSB9IGZyb20gJy4uL2Jhc2UvZWxlbWVudC13cmFwcGVyL2VsZW1lbnQtd3JhcHBlci5tb2R1bGUnO1xyXG5cclxuQE5nTW9kdWxlKHtcclxuICBkZWNsYXJhdGlvbnM6IFtFY2Fic0Jhc2VQaG9uZUNvbXBvbmVudF0sXHJcbiAgaW1wb3J0czogW1xyXG4gICAgQ29tbW9uTW9kdWxlLFxyXG4gICAgTWF0SWNvbk1vZHVsZSxcclxuICAgIFJvdXRlck1vZHVsZSxcclxuICAgIEZvcm1zTW9kdWxlLFxyXG4gICAgTWF0SW5wdXRNb2R1bGUsXHJcbiAgICBNYXRNZW51TW9kdWxlLFxyXG4gICAgTWF0QnV0dG9uTW9kdWxlLFxyXG4gICAgTWF0RGl2aWRlck1vZHVsZSxcclxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXHJcbiAgICBTZWFyY2hQaXBlLFxyXG4gICAgRWxlbWVudFdyYXBwZXJNb2R1bGUsXHJcbiAgXSxcclxuICBleHBvcnRzOiBbRWNhYnNCYXNlUGhvbmVDb21wb25lbnRdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRWNhYnNCYXNlUGhvbmVNb2R1bGUge31cclxuIl19