monkey-style-guide-v2 0.0.26 → 0.0.28

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.
Files changed (132) hide show
  1. package/assets/scss/theme.scss +7 -6
  2. package/fesm2022/monkey-style-guide-v2.mjs +294 -281
  3. package/fesm2022/monkey-style-guide-v2.mjs.map +1 -1
  4. package/lib/components/button/button.component.d.ts +3 -2
  5. package/lib/components/form-field/form-field-control.d.ts +1 -1
  6. package/lib/components/input-phone/input-phone.component.d.ts +0 -2
  7. package/lib/interfaces/button.d.ts +1 -0
  8. package/lib/interfaces/toast.d.ts +1 -1
  9. package/lib/services/toast.service.d.ts +1 -8
  10. package/monkey-style-guide-v2-0.0.28.tgz +0 -0
  11. package/package.json +8 -10
  12. package/esm2022/lib/components/accordion/accordion.component.mjs +0 -93
  13. package/esm2022/lib/components/accordion/index.mjs +0 -7
  14. package/esm2022/lib/components/action-bar/action-bar.component.mjs +0 -46
  15. package/esm2022/lib/components/action-bar/index.mjs +0 -7
  16. package/esm2022/lib/components/alert/alert.component.mjs +0 -50
  17. package/esm2022/lib/components/alert/index.mjs +0 -7
  18. package/esm2022/lib/components/avatar/avatar.component.mjs +0 -55
  19. package/esm2022/lib/components/avatar/index.mjs +0 -7
  20. package/esm2022/lib/components/badge/badge.component.mjs +0 -74
  21. package/esm2022/lib/components/badge/index.mjs +0 -7
  22. package/esm2022/lib/components/breadcrumb/breadcrumb.component.mjs +0 -56
  23. package/esm2022/lib/components/breadcrumb/index.mjs +0 -7
  24. package/esm2022/lib/components/button/button.component.mjs +0 -58
  25. package/esm2022/lib/components/button/index.mjs +0 -7
  26. package/esm2022/lib/components/checkbox/checkbox.component.mjs +0 -215
  27. package/esm2022/lib/components/checkbox/index.mjs +0 -7
  28. package/esm2022/lib/components/date-range/date-range.component.mjs +0 -239
  29. package/esm2022/lib/components/date-range/index.mjs +0 -7
  30. package/esm2022/lib/components/date-range/month/index.mjs +0 -7
  31. package/esm2022/lib/components/date-range/month/month.component.mjs +0 -148
  32. package/esm2022/lib/components/date-range/quick-actions/index.mjs +0 -7
  33. package/esm2022/lib/components/date-range/quick-actions/quick-actions.component.mjs +0 -48
  34. package/esm2022/lib/components/date-range/utils.mjs +0 -102
  35. package/esm2022/lib/components/divider/divider.component.mjs +0 -44
  36. package/esm2022/lib/components/divider/index.mjs +0 -7
  37. package/esm2022/lib/components/form-field/form-field-control.mjs +0 -15
  38. package/esm2022/lib/components/form-field/form-field.component.mjs +0 -265
  39. package/esm2022/lib/components/form-field/form-field.module.mjs +0 -23
  40. package/esm2022/lib/components/form-field/index.mjs +0 -10
  41. package/esm2022/lib/components/form-field/utils.mjs +0 -16
  42. package/esm2022/lib/components/icon/icon.component.mjs +0 -51
  43. package/esm2022/lib/components/icon/index.mjs +0 -7
  44. package/esm2022/lib/components/icon-button/icon-button.component.mjs +0 -59
  45. package/esm2022/lib/components/icon-button/index.mjs +0 -7
  46. package/esm2022/lib/components/index.mjs +0 -34
  47. package/esm2022/lib/components/input/index.mjs +0 -9
  48. package/esm2022/lib/components/input/input-currency.directive.mjs +0 -185
  49. package/esm2022/lib/components/input/input.directive.mjs +0 -185
  50. package/esm2022/lib/components/input/input.module.mjs +0 -24
  51. package/esm2022/lib/components/input/validators.mjs +0 -22
  52. package/esm2022/lib/components/input-code/index.mjs +0 -7
  53. package/esm2022/lib/components/input-code/input-code.component.mjs +0 -232
  54. package/esm2022/lib/components/input-phone/index.mjs +0 -7
  55. package/esm2022/lib/components/input-phone/input-phone.component.mjs +0 -324
  56. package/esm2022/lib/components/input-upload/index.mjs +0 -7
  57. package/esm2022/lib/components/input-upload/input-upload.component.mjs +0 -238
  58. package/esm2022/lib/components/modal/components/confirmation.component.mjs +0 -73
  59. package/esm2022/lib/components/modal/components/default.mjs +0 -65
  60. package/esm2022/lib/components/modal/directives/actions.mjs +0 -29
  61. package/esm2022/lib/components/modal/directives/content.mjs +0 -26
  62. package/esm2022/lib/components/modal/directives/subtitle.mjs +0 -26
  63. package/esm2022/lib/components/modal/directives/title.mjs +0 -26
  64. package/esm2022/lib/components/modal/index.mjs +0 -16
  65. package/esm2022/lib/components/modal/modal-config.mjs +0 -19
  66. package/esm2022/lib/components/modal/modal-ref.mjs +0 -56
  67. package/esm2022/lib/components/modal/modal.component.mjs +0 -119
  68. package/esm2022/lib/components/modal/modal.module.mjs +0 -56
  69. package/esm2022/lib/components/modal/modal.service.mjs +0 -150
  70. package/esm2022/lib/components/modal/utils.mjs +0 -24
  71. package/esm2022/lib/components/option/index.mjs +0 -7
  72. package/esm2022/lib/components/option/option.component.mjs +0 -70
  73. package/esm2022/lib/components/radio-button/index.mjs +0 -7
  74. package/esm2022/lib/components/radio-button/radio-button.component.mjs +0 -190
  75. package/esm2022/lib/components/security-level/index.mjs +0 -7
  76. package/esm2022/lib/components/security-level/security-level.component.mjs +0 -57
  77. package/esm2022/lib/components/select/index.mjs +0 -7
  78. package/esm2022/lib/components/select/select.component.mjs +0 -444
  79. package/esm2022/lib/components/status/index.mjs +0 -7
  80. package/esm2022/lib/components/status/status.component.mjs +0 -45
  81. package/esm2022/lib/components/table/components/pagination-action/pagination-action.mjs +0 -53
  82. package/esm2022/lib/components/table/components/pagination-label/pagination-label.mjs +0 -34
  83. package/esm2022/lib/components/table/components/pagination-size/pagination-size.mjs +0 -57
  84. package/esm2022/lib/components/table/directives/column-checked.mjs +0 -109
  85. package/esm2022/lib/components/table/directives/column-expansible.mjs +0 -134
  86. package/esm2022/lib/components/table/directives/column-sortable.mjs +0 -97
  87. package/esm2022/lib/components/table/directives/column-stick.mjs +0 -28
  88. package/esm2022/lib/components/table/index.mjs +0 -15
  89. package/esm2022/lib/components/table/table.component.mjs +0 -133
  90. package/esm2022/lib/components/table/table.module.mjs +0 -64
  91. package/esm2022/lib/components/toast/index.mjs +0 -7
  92. package/esm2022/lib/components/toast/toast.component.mjs +0 -79
  93. package/esm2022/lib/components/toggle/index.mjs +0 -7
  94. package/esm2022/lib/components/toggle/toggle.component.mjs +0 -74
  95. package/esm2022/lib/components/toggle-line/index.mjs +0 -8
  96. package/esm2022/lib/components/toggle-line/toggle-line-button/index.mjs +0 -7
  97. package/esm2022/lib/components/toggle-line/toggle-line-button/toggle-line-button.component.mjs +0 -24
  98. package/esm2022/lib/components/toggle-line/toggle-line.component.mjs +0 -85
  99. package/esm2022/lib/components/tooltip/index.mjs +0 -8
  100. package/esm2022/lib/components/tooltip/tooltip/index.mjs +0 -7
  101. package/esm2022/lib/components/tooltip/tooltip/tooltip.component.mjs +0 -58
  102. package/esm2022/lib/components/tooltip/tooltip.directive.mjs +0 -189
  103. package/esm2022/lib/directives/badge.mjs +0 -74
  104. package/esm2022/lib/directives/error.mjs +0 -18
  105. package/esm2022/lib/directives/helper.mjs +0 -18
  106. package/esm2022/lib/directives/index.mjs +0 -15
  107. package/esm2022/lib/directives/info.mjs +0 -18
  108. package/esm2022/lib/directives/label.mjs +0 -18
  109. package/esm2022/lib/directives/module.mjs +0 -61
  110. package/esm2022/lib/directives/popover.mjs +0 -385
  111. package/esm2022/lib/directives/prefix.mjs +0 -18
  112. package/esm2022/lib/directives/suffix.mjs +0 -43
  113. package/esm2022/lib/interfaces/alert.mjs +0 -2
  114. package/esm2022/lib/interfaces/breadcrumb.mjs +0 -2
  115. package/esm2022/lib/interfaces/button.mjs +0 -2
  116. package/esm2022/lib/interfaces/index.mjs +0 -13
  117. package/esm2022/lib/interfaces/popover.mjs +0 -2
  118. package/esm2022/lib/interfaces/sizes.mjs +0 -2
  119. package/esm2022/lib/interfaces/table.mjs +0 -2
  120. package/esm2022/lib/interfaces/toast.mjs +0 -10
  121. package/esm2022/lib/services/dictionary.service.mjs +0 -224
  122. package/esm2022/lib/services/index.mjs +0 -7
  123. package/esm2022/lib/services/toast.service.mjs +0 -75
  124. package/esm2022/lib/tokens/index.mjs +0 -10
  125. package/esm2022/monkey-style-guide-v2.mjs +0 -5
  126. package/esm2022/public-api.mjs +0 -11
  127. package/esm2022/utils/icon.mjs +0 -277
  128. package/esm2022/utils/id-generator.mjs +0 -20
  129. package/esm2022/utils/index.mjs +0 -5
  130. package/esm2022/utils/tests-utils.mjs +0 -4
  131. package/esm2022/utils/utils.mjs +0 -41
  132. package/monkey-style-guide-v2-0.0.26.tgz +0 -0
@@ -1,324 +0,0 @@
1
- /** ************************
2
- * Copyright Monkey Exchange. All Rights Reserved
3
- * This style guide was developed by Monkey Exchange Team
4
- * MIT Licence
5
- ************************* */
6
- import { CommonModule } from '@angular/common';
7
- import { booleanAttribute, Component, inject, Input, LOCALE_ID, ViewChildren } from '@angular/core';
8
- import { FormsModule, NgControl, ReactiveFormsModule, Validators } from '@angular/forms';
9
- import parsePhoneNumberFromString, { AsYouType, getCountries, getCountryCallingCode, getExampleNumber, isValidPhoneNumber } from 'libphonenumber-js';
10
- import examples from 'libphonenumber-js/examples.mobile.json';
11
- import { Subject } from 'rxjs';
12
- import { IdGenerator } from '../../../utils';
13
- import { MECX_COUNTRY_CODE } from '../../tokens';
14
- import { MonkeyFormFieldControl, MonkeyFormFieldModule } from '../form-field';
15
- import { MonkeyOptionComponent } from '../option';
16
- import { MonkeySelectComponent } from '../select';
17
- import * as i0 from "@angular/core";
18
- import * as i1 from "@angular/forms";
19
- export class MonkeyInputPhoneComponent {
20
- get disabled() {
21
- if (this.ngControl && this.ngControl.disabled !== null) {
22
- return this.ngControl.disabled;
23
- }
24
- return this._disabled;
25
- }
26
- set disabled(value) {
27
- this._disabled = value;
28
- if (this.focused) {
29
- this.focused = false;
30
- this.stateChanges.next();
31
- }
32
- }
33
- get required() {
34
- return this._required ?? this.ngControl?.control?.hasValidator(Validators.required) ?? false;
35
- }
36
- set required(value) {
37
- this._required = value;
38
- this.stateChanges.next();
39
- }
40
- set value(value) {
41
- if (this._value !== value && value !== undefined) {
42
- this._value = value;
43
- this.formatValue(value);
44
- this._onChange(value);
45
- this._onTouched(value);
46
- }
47
- }
48
- get value() {
49
- return this._value;
50
- }
51
- constructor() {
52
- this.placeholder = '';
53
- this.tabIndex = 0;
54
- this._disabled = false;
55
- this._value = null;
56
- this.ngControl = inject(NgControl, { self: true, optional: true });
57
- this.idGenerator = inject(IdGenerator);
58
- this.countryCode = inject(MECX_COUNTRY_CODE);
59
- this.locale = inject(LOCALE_ID);
60
- this.id = this.idGenerator.getId('monkey-input-upload-');
61
- this.inputId = this.idGenerator.getId('monkey-input-upload-input-');
62
- this.focused = false;
63
- this.type = 'input-phone';
64
- this.stateChanges = new Subject();
65
- this.countries = getCountries()
66
- .map((code) => {
67
- return {
68
- code: `+${getCountryCallingCode(code)}`,
69
- name: this.getCountryNameFromCode(code),
70
- flag: `${this.isoToFlagEmoji(code)} `
71
- };
72
- })
73
- .sort((a, b) => {
74
- return a.name.localeCompare(b.name);
75
- });
76
- this.countriesFiltered = this.countries;
77
- this.selectedCallingCode = this.countryCode.toString();
78
- this.phoneFormatted = '';
79
- this.phoneValid = false;
80
- this._onChange = () => { };
81
- this._onTouched = () => { };
82
- if (this.ngControl) {
83
- this.ngControl.valueAccessor = this;
84
- }
85
- }
86
- getCountryNameFromCode(code) {
87
- try {
88
- const locale = this.locale.toString();
89
- const display = new Intl.DisplayNames([locale], { type: 'region' });
90
- return display.of(code.toUpperCase()) || code;
91
- }
92
- catch {
93
- return code;
94
- }
95
- }
96
- getCountryByCallingCode(code) {
97
- const cleanCode = code.replace('+', '');
98
- return (getCountries().find((country) => {
99
- return getCountryCallingCode(country) === cleanCode;
100
- }) || null);
101
- }
102
- isoToFlagEmoji(isoCode) {
103
- return isoCode.toUpperCase().replace(/./g, (char) => {
104
- return String.fromCodePoint(127397 + char.charCodeAt(0));
105
- });
106
- }
107
- getCountryFromPhoneNumber(input, changedCountry) {
108
- try {
109
- if (changedCountry) {
110
- return this.selectedCallingCode;
111
- }
112
- const parsed = parsePhoneNumberFromString(input);
113
- const country = getCountryCallingCode(parsed?.country);
114
- return `+${country}`;
115
- }
116
- catch (e) {
117
- // not to do
118
- }
119
- return this.selectedCallingCode;
120
- }
121
- performValue(value) {
122
- this._value = `${this.selectedCallingCode}${value}`;
123
- this._onChange(this._value);
124
- this._onTouched(this._value);
125
- }
126
- validateValue() {
127
- const { phoneValid } = this;
128
- if (!phoneValid) {
129
- const countryCode = this.getCountryByCallingCode(this.selectedCallingCode);
130
- const example = getExampleNumber(countryCode, examples);
131
- this.ngControl?.control?.setErrors({
132
- phone: true,
133
- phoneAllowed: example?.nationalNumber
134
- });
135
- }
136
- }
137
- formatValue(value, changedCountry = false) {
138
- if (!value) {
139
- this.phoneFormatted = '';
140
- this.phoneValid = false;
141
- this.validateValue();
142
- return;
143
- }
144
- const detectedCallingCode = this.getCountryFromPhoneNumber(value, changedCountry);
145
- const isCountryChanged = changedCountry || detectedCallingCode !== this.selectedCallingCode;
146
- if (isCountryChanged && detectedCallingCode) {
147
- this.selectedCallingCode = detectedCallingCode;
148
- }
149
- const countryCode = this.getCountryByCallingCode(this.selectedCallingCode);
150
- if (!countryCode) {
151
- this.phoneFormatted = value;
152
- this.phoneValid = false;
153
- this.validateValue();
154
- return;
155
- }
156
- const nationalPart = value.replace(this.selectedCallingCode, '').replace(/[^\d+]/g, '');
157
- const formatter = new AsYouType(countryCode);
158
- this.phoneFormatted = formatter.input(nationalPart);
159
- this.performValue(nationalPart);
160
- this.phoneValid = isValidPhoneNumber(nationalPart, countryCode);
161
- this.validateValue();
162
- }
163
- ngAfterContentInit() { }
164
- ngOnChanges(changes) { }
165
- ngOnDestroy() { }
166
- onContainerClick(event) {
167
- this.inputs.first.nativeElement.focus();
168
- }
169
- _onFocus() {
170
- if (!this.disabled) {
171
- this.focused = true;
172
- this._onTouched();
173
- this.stateChanges.next();
174
- }
175
- }
176
- _onBlur() {
177
- this.focused = false;
178
- this.stateChanges.next();
179
- this.validateValue();
180
- }
181
- registerOnChange(fn) {
182
- this._onChange = fn;
183
- }
184
- registerOnTouched(fn) {
185
- this._onTouched = fn;
186
- }
187
- setDisabledState(isDisabled) {
188
- this.disabled = isDisabled;
189
- }
190
- writeValue(value) {
191
- this.value = value;
192
- }
193
- onInputChange(event) {
194
- const { value } = event.target;
195
- this.formatValue(value);
196
- }
197
- onCountryChange() {
198
- this.formatValue(this._value, true);
199
- this.validateValue();
200
- }
201
- getMaxLength() {
202
- try {
203
- const countryCode = this.getCountryByCallingCode(this.selectedCallingCode);
204
- if (!countryCode)
205
- return 20;
206
- const example = getExampleNumber(countryCode, examples);
207
- const formatted = new AsYouType(countryCode).input(example.nationalNumber);
208
- return formatted.length;
209
- }
210
- catch {
211
- return 20;
212
- }
213
- }
214
- onHandleSearchSelect(query) {
215
- const normalizedQuery = query.trim().toLowerCase();
216
- this.countriesFiltered = this.countries.filter(({ name }) => {
217
- return name.toLowerCase().includes(normalizedQuery);
218
- });
219
- }
220
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MonkeyInputPhoneComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
221
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: MonkeyInputPhoneComponent, isStandalone: true, selector: "monkey-input-phone", inputs: { placeholder: "placeholder", tabIndex: "tabIndex", disabled: ["disabled", "disabled", booleanAttribute], required: ["required", "required", booleanAttribute], value: "value" }, host: { listeners: { "focus": "_onFocus()", "blur": "_onBlur()" }, properties: { "attr.data-testid": "'monkey-input-phone'", "class.mecx-input-phone-disabled": "_disabled", "class.mecx-input-phone-focused": "focused", "attr.id": "id", "attr.tabindex": "disabled ? -1 : tabIndex" }, classAttribute: "mecx-input-phone" }, providers: [
222
- // eslint-disable-next-line no-use-before-define
223
- { provide: MonkeyFormFieldControl, useExisting: MonkeyInputPhoneComponent }
224
- ], viewQueries: [{ propertyName: "inputs", predicate: ["input"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
225
- <monkey-select
226
- placeholder=""
227
- [disabled]="disabled"
228
- showSearch
229
- [(ngModel)]="selectedCallingCode"
230
- class="mecx-phone-select-country"
231
- (onChange)="onCountryChange()"
232
- callbackSearch
233
- (onSearch)="onHandleSearchSelect($event)"
234
- >
235
- @for (item of countriesFiltered; track $index) {
236
- <monkey-option [value]="item.code">
237
- <span class="option-flag">{{ item.flag }}</span>
238
- <div class="option-name">{{ item.name }} {{ item.code }}</div>
239
- </monkey-option>
240
- }
241
- </monkey-select>
242
- <input
243
- #input
244
- class="mecx-input"
245
- [attr.disabled]="disabled"
246
- placeholder="Enter phone number"
247
- (input)="onInputChange($event)"
248
- [ngModel]="phoneFormatted"
249
- [maxlength]="getMaxLength()"
250
- (focus)="_onFocus()"
251
- (blur)="_onBlur()"
252
- [attr.id]="inputId"
253
- />
254
- `, isInline: true, styles: [":host{display:inline-flex;width:100%;min-width:0}:host monkey-select{width:164px;border-right:2px solid var(--mecx-color-gray-400)}:host.mecx-input-phone-disabled monkey-select{border-right:2px solid var(--mecx-color-gray-200)}:host input{width:100%;border:none;margin-left:8px}monkey-option .option-flag{font-size:30px}monkey-option .option-name{letter-spacing:.48px;margin-left:4px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "component", type: MonkeySelectComponent, selector: "monkey-select", inputs: ["tabIndex", "placeholder", "loading", "showSearch", "searchPlaceholder", "callbackSearch", "disabled", "required", "value"], outputs: ["onChange", "onSearch"] }, { kind: "component", type: MonkeyOptionComponent, selector: "monkey-option", inputs: ["value", "disabled", "type"] }, { kind: "ngmodule", type: MonkeyFormFieldModule }] }); }
255
- }
256
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MonkeyInputPhoneComponent, decorators: [{
257
- type: Component,
258
- args: [{ selector: 'monkey-input-phone', standalone: true, imports: [
259
- CommonModule,
260
- FormsModule,
261
- ReactiveFormsModule,
262
- MonkeySelectComponent,
263
- MonkeyOptionComponent,
264
- MonkeyFormFieldModule
265
- ], template: `
266
- <monkey-select
267
- placeholder=""
268
- [disabled]="disabled"
269
- showSearch
270
- [(ngModel)]="selectedCallingCode"
271
- class="mecx-phone-select-country"
272
- (onChange)="onCountryChange()"
273
- callbackSearch
274
- (onSearch)="onHandleSearchSelect($event)"
275
- >
276
- @for (item of countriesFiltered; track $index) {
277
- <monkey-option [value]="item.code">
278
- <span class="option-flag">{{ item.flag }}</span>
279
- <div class="option-name">{{ item.name }} {{ item.code }}</div>
280
- </monkey-option>
281
- }
282
- </monkey-select>
283
- <input
284
- #input
285
- class="mecx-input"
286
- [attr.disabled]="disabled"
287
- placeholder="Enter phone number"
288
- (input)="onInputChange($event)"
289
- [ngModel]="phoneFormatted"
290
- [maxlength]="getMaxLength()"
291
- (focus)="_onFocus()"
292
- (blur)="_onBlur()"
293
- [attr.id]="inputId"
294
- />
295
- `, providers: [
296
- // eslint-disable-next-line no-use-before-define
297
- { provide: MonkeyFormFieldControl, useExisting: MonkeyInputPhoneComponent }
298
- ], host: {
299
- '[attr.data-testid]': "'monkey-input-phone'",
300
- class: 'mecx-input-phone',
301
- '[class.mecx-input-phone-disabled]': '_disabled',
302
- '[class.mecx-input-phone-focused]': 'focused',
303
- '[attr.id]': 'id',
304
- '[attr.tabindex]': 'disabled ? -1 : tabIndex',
305
- '(focus)': '_onFocus()',
306
- '(blur)': '_onBlur()'
307
- }, styles: [":host{display:inline-flex;width:100%;min-width:0}:host monkey-select{width:164px;border-right:2px solid var(--mecx-color-gray-400)}:host.mecx-input-phone-disabled monkey-select{border-right:2px solid var(--mecx-color-gray-200)}:host input{width:100%;border:none;margin-left:8px}monkey-option .option-flag{font-size:30px}monkey-option .option-name{letter-spacing:.48px;margin-left:4px}\n"] }]
308
- }], ctorParameters: () => [], propDecorators: { placeholder: [{
309
- type: Input
310
- }], tabIndex: [{
311
- type: Input
312
- }], disabled: [{
313
- type: Input,
314
- args: [{ transform: booleanAttribute }]
315
- }], required: [{
316
- type: Input,
317
- args: [{ transform: booleanAttribute }]
318
- }], value: [{
319
- type: Input
320
- }], inputs: [{
321
- type: ViewChildren,
322
- args: ['input']
323
- }] } });
324
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtcGhvbmUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW9ua2V5LXN0eWxlLWd1aWRlLXYyL3NyYy9saWIvY29tcG9uZW50cy9pbnB1dC1waG9uZS9pbnB1dC1waG9uZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7NkJBSTZCO0FBRTdCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBRUwsZ0JBQWdCLEVBQ2hCLFNBQVMsRUFFVCxNQUFNLEVBQ04sS0FBSyxFQUNMLFNBQVMsRUFLVCxZQUFZLEVBQ2IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUVMLFdBQVcsRUFDWCxTQUFTLEVBQ1QsbUJBQW1CLEVBQ25CLFVBQVUsRUFDWCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sMEJBQTBCLEVBQUUsRUFDakMsU0FBUyxFQUVULFlBQVksRUFDWixxQkFBcUIsRUFDckIsZ0JBQWdCLEVBQ2hCLGtCQUFrQixFQUNuQixNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sUUFBUSxNQUFNLHdDQUF3QyxDQUFDO0FBQzlELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNqRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ2xELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLFdBQVcsQ0FBQzs7O0FBa0VsRCxNQUFNLE9BQU8seUJBQXlCO0lBT3BDLElBQ0ksUUFBUTtRQUNWLElBQUksSUFBSSxDQUFD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USxFQUFFLFdBQVc7cUJBQ3RCO3dEQUtRLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFHRixRQUFRO3NCQURYLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBb0JsQyxRQUFRO3NCQURYLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBYWxDLEtBQUs7c0JBRFIsS0FBSztnQkE0RGlCLE1BQU07c0JBQTVCLFlBQVk7dUJBQUMsT0FBTyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiAqKioqKioqKioqKioqKioqKioqKioqKipcbiAqIENvcHlyaWdodCBNb25rZXkgRXhjaGFuZ2UuIEFsbCBSaWdodHMgUmVzZXJ2ZWRcbiAqIFRoaXMgc3R5bGUgZ3VpZGUgd2FzIGRldmVsb3BlZCBieSBNb25rZXkgRXhjaGFuZ2UgVGVhbVxuICogTUlUIExpY2VuY2VcbiAqKioqKioqKioqKioqKioqKioqKioqKioqICovXG5cbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBBZnRlckNvbnRlbnRJbml0LFxuICBib29sZWFuQXR0cmlidXRlLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIGluamVjdCxcbiAgSW5wdXQsXG4gIExPQ0FMRV9JRCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIFF1ZXJ5TGlzdCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkcmVuXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXG4gIEZvcm1zTW9kdWxlLFxuICBOZ0NvbnRyb2wsXG4gIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gIFZhbGlkYXRvcnNcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHBhcnNlUGhvbmVOdW1iZXJGcm9tU3RyaW5nLCB7XG4gIEFzWW91VHlwZSxcbiAgQ291bnRyeUNvZGUsXG4gIGdldENvdW50cmllcyxcbiAgZ2V0Q291bnRyeUNhbGxpbmdDb2RlLFxuICBnZXRFeGFtcGxlTnVtYmVyLFxuICBpc1ZhbGlkUGhvbmVOdW1iZXJcbn0gZnJvbSAnbGlicGhvbmVudW1iZXItanMnO1xuaW1wb3J0IGV4YW1wbGVzIGZyb20gJ2xpYnBob25lbnVtYmVyLWpzL2V4YW1wbGVzLm1vYmlsZS5qc29uJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IElkR2VuZXJhdG9yIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgTUVDWF9DT1VOVFJZX0NPREUgfSBmcm9tICcuLi8uLi90b2tlbnMnO1xuaW1wb3J0IHsgTW9ua2V5Rm9ybUZpZWxkQ29udHJvbCwgTW9ua2V5Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnLi4vZm9ybS1maWVsZCc7XG5pbXBvcnQgeyBNb25rZXlPcHRpb25Db21wb25lbnQgfSBmcm9tICcuLi9vcHRpb24nO1xuaW1wb3J0IHsgTW9ua2V5U2VsZWN0Q29tcG9uZW50IH0gZnJvbSAnLi4vc2VsZWN0JztcblxuaW50ZXJmYWNlIENvdW50cnkge1xuICBjb2RlOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgZmxhZzogc3RyaW5nO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdtb25rZXktaW5wdXQtcGhvbmUnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgTW9ua2V5U2VsZWN0Q29tcG9uZW50LFxuICAgIE1vbmtleU9wdGlvbkNvbXBvbmVudCxcbiAgICBNb25rZXlGb3JtRmllbGRNb2R1bGVcbiAgXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8bW9ua2V5LXNlbGVjdFxuICAgICAgcGxhY2Vob2xkZXI9XCJcIlxuICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgIHNob3dTZWFyY2hcbiAgICAgIFsobmdNb2RlbCldPVwic2VsZWN0ZWRDYWxsaW5nQ29kZVwiXG4gICAgICBjbGFzcz1cIm1lY3gtcGhvbmUtc2VsZWN0LWNvdW50cnlcIlxuICAgICAgKG9uQ2hhbmdlKT1cIm9uQ291bnRyeUNoYW5nZSgpXCJcbiAgICAgIGNhbGxiYWNrU2VhcmNoXG4gICAgICAob25TZWFyY2gpPVwib25IYW5kbGVTZWFyY2hTZWxlY3QoJGV2ZW50KVwiXG4gICAgPlxuICAgICAgQGZvciAoaXRlbSBvZiBjb3VudHJpZXNGaWx0ZXJlZDsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgIDxtb25rZXktb3B0aW9uIFt2YWx1ZV09XCJpdGVtLmNvZGVcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9wdGlvbi1mbGFnXCI+e3sgaXRlbS5mbGFnIH19PC9zcGFuPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJvcHRpb24tbmFtZVwiPnt7IGl0ZW0ubmFtZSB9fSB7eyBpdGVtLmNvZGUgfX08L2Rpdj5cbiAgICAgICAgPC9tb25rZXktb3B0aW9uPlxuICAgICAgfVxuICAgIDwvbW9ua2V5LXNlbGVjdD5cbiAgICA8aW5wdXRcbiAgICAgICNpbnB1dFxuICAgICAgY2xhc3M9XCJtZWN4LWlucHV0XCJcbiAgICAgIFthdHRyLmRpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgcGhvbmUgbnVtYmVyXCJcbiAgICAgIChpbnB1dCk9XCJvbklucHV0Q2hhbmdlKCRldmVudClcIlxuICAgICAgW25nTW9kZWxdPVwicGhvbmVGb3JtYXR0ZWRcIlxuICAgICAgW21heGxlbmd0aF09XCJnZXRNYXhMZW5ndGgoKVwiXG4gICAgICAoZm9jdXMpPVwiX29uRm9jdXMoKVwiXG4gICAgICAoYmx1cik9XCJfb25CbHVyKClcIlxuICAgICAgW2F0dHIuaWRdPVwiaW5wdXRJZFwiXG4gICAgLz5cbiAgYCxcbiAgc3R5bGVVcmw6ICcuL2lucHV0LXBob25lLmNvbXBvbmVudC5zY3NzJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgeyBwcm92aWRlOiBNb25rZXlGb3JtRmllbGRDb250cm9sLCB1c2VFeGlzdGluZzogTW9ua2V5SW5wdXRQaG9uZUNvbXBvbmVudCB9XG4gIF0sXG4gIGhvc3Q6IHtcbiAgICAnW2F0dHIuZGF0YS10ZXN0aWRdJzogXCInbW9ua2V5LWlucHV0LXBob25lJ1wiLFxuICAgIGNsYXNzOiAnbWVjeC1pbnB1dC1waG9uZScsXG4gICAgJ1tjbGFzcy5tZWN4LWlucHV0LXBob25lLWRpc2FibGVkXSc6ICdfZGlzYWJsZWQnLFxuICAgICdbY2xhc3MubWVjeC1pbnB1dC1waG9uZS1mb2N1c2VkXSc6ICdmb2N1c2VkJyxcbiAgICAnW2F0dHIuaWRdJzogJ2lkJyxcbiAgICAnW2F0dHIudGFiaW5kZXhdJzogJ2Rpc2FibGVkID8gLTEgOiB0YWJJbmRleCcsXG4gICAgJyhmb2N1cyknOiAnX29uRm9jdXMoKScsXG4gICAgJyhibHVyKSc6ICdfb25CbHVyKCknXG4gIH1cbn0pXG5leHBvcnQgY2xhc3MgTW9ua2V5SW5wdXRQaG9uZUNvbXBvbmVudFxuICBpbXBsZW1lbnRzIE1vbmtleUZvcm1GaWVsZENvbnRyb2wsIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBBZnRlckNvbnRlbnRJbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlc1xue1xuICBASW5wdXQoKSBwbGFjZWhvbGRlcjogc3RyaW5nID0gJyc7XG5cbiAgQElucHV0KCkgdGFiSW5kZXggPSAwO1xuXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMubmdDb250cm9sICYmIHRoaXMubmdDb250cm9sLmRpc2FibGVkICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdGhpcy5uZ0NvbnRyb2wuZGlzYWJsZWQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZDtcbiAgfVxuXG4gIHNldCBkaXNhYmxlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2Rpc2FibGVkID0gdmFsdWU7XG5cbiAgICBpZiAodGhpcy5mb2N1c2VkKSB7XG4gICAgICB0aGlzLmZvY3VzZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgICB9XG4gIH1cblxuICBfZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSlcbiAgZ2V0IHJlcXVpcmVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9yZXF1aXJlZCA/PyB0aGlzLm5nQ29udHJvbD8uY29udHJvbD8uaGFzVmFsaWRhdG9yKFZhbGlkYXRvcnMucmVxdWlyZWQpID8/IGZhbHNlO1xuICB9XG5cbiAgc2V0IHJlcXVpcmVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fcmVxdWlyZWQgPSB2YWx1ZTtcbiAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XG4gIH1cblxuICBwcml2YXRlIF9yZXF1aXJlZDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICBASW5wdXQoKVxuICBzZXQgdmFsdWUodmFsdWU6IGFueSkge1xuICAgIGlmICh0aGlzLl92YWx1ZSAhPT0gdmFsdWUgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICAgIHRoaXMuZm9ybWF0VmFsdWUodmFsdWUpO1xuICAgICAgdGhpcy5fb25DaGFuZ2UodmFsdWUpO1xuICAgICAgdGhpcy5fb25Ub3VjaGVkKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBnZXQgdmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cblxuICBfdmFsdWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGlmICh0aGlzLm5nQ29udHJvbCkge1xuICAgICAgdGhpcy5uZ0NvbnRyb2wudmFsdWVBY2Nlc3NvciA9IHRoaXM7XG4gICAgfVxuICB9XG5cbiAgbmdDb250cm9sOiBOZ0NvbnRyb2wgfCBudWxsID0gaW5qZWN0KE5nQ29udHJvbCwgeyBzZWxmOiB0cnVlLCBvcHRpb25hbDogdHJ1ZSB9KSE7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBpZEdlbmVyYXRvciA9IGluamVjdChJZEdlbmVyYXRvcik7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjb3VudHJ5Q29kZSA9IGluamVjdChNRUNYX0NPVU5UUllfQ09ERSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBsb2NhbGUgPSBpbmplY3QoTE9DQUxFX0lEKTtcblxuICByZWFkb25seSBpZDogc3RyaW5nID0gdGhpcy5pZEdlbmVyYXRvci5nZXRJZCgnbW9ua2V5LWlucHV0LXVwbG9hZC0nKTtcblxuICByZWFkb25seSBpbnB1dElkOiBzdHJpbmcgPSB0aGlzLmlkR2VuZXJhdG9yLmdldElkKCdtb25rZXktaW5wdXQtdXBsb2FkLWlucHV0LScpO1xuXG4gIGZvY3VzZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICByZWFkb25seSB0eXBlOiBzdHJpbmcgPSAnaW5wdXQtcGhvbmUnO1xuXG4gIHJlYWRvbmx5IHN0YXRlQ2hhbmdlcyA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgY291bnRyaWVzOiBDb3VudHJ5W10gPSBnZXRDb3VudHJpZXMoKVxuICAgIC5tYXAoKGNvZGUpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvZGU6IGArJHtnZXRDb3VudHJ5Q2FsbGluZ0NvZGUoY29kZSl9YCxcbiAgICAgICAgbmFtZTogdGhpcy5nZXRDb3VudHJ5TmFtZUZyb21Db2RlKGNvZGUpLFxuICAgICAgICBmbGFnOiBgJHt0aGlzLmlzb1RvRmxhZ0Vtb2ppKGNvZGUpfSBgXG4gICAgICB9O1xuICAgIH0pXG4gICAgLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIHJldHVybiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpO1xuICAgIH0pO1xuXG4gIGNvdW50cmllc0ZpbHRlcmVkID0gdGhpcy5jb3VudHJpZXM7XG5cbiAgc2VsZWN0ZWRDYWxsaW5nQ29kZSA9IHRoaXMuY291bnRyeUNvZGUudG9TdHJpbmcoKTtcblxuICBwaG9uZUZvcm1hdHRlZCA9ICcnO1xuXG4gIHBob25lVmFsaWQgPSBmYWxzZTtcblxuICBAVmlld0NoaWxkcmVuKCdpbnB1dCcpIGlucHV0cyE6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+PjtcblxuICBwcml2YXRlIGdldENvdW50cnlOYW1lRnJvbUNvZGUoY29kZTogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGxvY2FsZSA9IHRoaXMubG9jYWxlLnRvU3RyaW5nKCk7XG4gICAgICBjb25zdCBkaXNwbGF5ID0gbmV3IEludGwuRGlzcGxheU5hbWVzKFtsb2NhbGVdLCB7IHR5cGU6ICdyZWdpb24nIH0pO1xuICAgICAgcmV0dXJuIGRpc3BsYXkub2YoY29kZS50b1VwcGVyQ2FzZSgpKSB8fCBjb2RlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGNvZGU7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb3VudHJ5QnlDYWxsaW5nQ29kZShjb2RlOiBzdHJpbmcpOiBDb3VudHJ5Q29kZSB8IG51bGwge1xuICAgIGNvbnN0IGNsZWFuQ29kZSA9IGNvZGUucmVwbGFjZSgnKycsICcnKTtcblxuICAgIHJldHVybiAoXG4gICAgICBnZXRDb3VudHJpZXMoKS5maW5kKChjb3VudHJ5KSA9PiB7XG4gICAgICAgIHJldHVybiBnZXRDb3VudHJ5Q2FsbGluZ0NvZGUoY291bnRyeSkgPT09IGNsZWFuQ29kZTtcbiAgICAgIH0pIHx8IG51bGxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBpc29Ub0ZsYWdFbW9qaShpc29Db2RlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBpc29Db2RlLnRvVXBwZXJDYXNlKCkucmVwbGFjZSgvLi9nLCAoY2hhcikgPT4ge1xuICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ29kZVBvaW50KDEyNzM5NyArIGNoYXIuY2hhckNvZGVBdCgwKSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldENvdW50cnlGcm9tUGhvbmVOdW1iZXIoaW5wdXQ6IHN0cmluZywgY2hhbmdlZENvdW50cnk6IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIHRyeSB7XG4gICAgICBpZiAoY2hhbmdlZENvdW50cnkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRDYWxsaW5nQ29kZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VQaG9uZU51bWJlckZyb21TdHJpbmcoaW5wdXQpO1xuICAgICAgY29uc3QgY291bnRyeSA9IGdldENvdW50cnlDYWxsaW5nQ29kZShwYXJzZWQ/LmNvdW50cnkhKTtcblxuICAgICAgcmV0dXJuIGArJHtjb3VudHJ5fWA7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gbm90IHRvIGRvXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRDYWxsaW5nQ29kZTtcbiAgfVxuXG4gIHByaXZhdGUgcGVyZm9ybVZhbHVlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl92YWx1ZSA9IGAke3RoaXMuc2VsZWN0ZWRDYWxsaW5nQ29kZX0ke3ZhbHVlfWA7XG4gICAgdGhpcy5fb25DaGFuZ2UodGhpcy5fdmFsdWUpO1xuICAgIHRoaXMuX29uVG91Y2hlZCh0aGlzLl92YWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlVmFsdWUoKSB7XG4gICAgY29uc3QgeyBwaG9uZVZhbGlkIH0gPSB0aGlzO1xuICAgIGlmICghcGhvbmVWYWxpZCkge1xuICAgICAgY29uc3QgY291bnRyeUNvZGUgPSB0aGlzLmdldENvdW50cnlCeUNhbGxpbmdDb2RlKHRoaXMuc2VsZWN0ZWRDYWxsaW5nQ29kZSk7XG4gICAgICBjb25zdCBleGFtcGxlID0gZ2V0RXhhbXBsZU51bWJlcihjb3VudHJ5Q29kZSEsIGV4YW1wbGVzKTtcblxuICAgICAgdGhpcy5uZ0NvbnRyb2w/LmNvbnRyb2w/LnNldEVycm9ycyh7XG4gICAgICAgIHBob25lOiB0cnVlLFxuICAgICAgICBwaG9uZUFsbG93ZWQ6IGV4YW1wbGU/Lm5hdGlvbmFsTnVtYmVyXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdFZhbHVlKHZhbHVlOiBzdHJpbmcsIGNoYW5nZWRDb3VudHJ5ID0gZmFsc2UpIHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICB0aGlzLnBob25lRm9ybWF0dGVkID0gJyc7XG4gICAgICB0aGlzLnBob25lVmFsaWQgPSBmYWxzZTtcbiAgICAgIHRoaXMudmFsaWRhdGVWYWx1ZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRldGVjdGVkQ2FsbGluZ0NvZGUgPSB0aGlzLmdldENvdW50cnlGcm9tUGhvbmVOdW1iZXIodmFsdWUsIGNoYW5nZWRDb3VudHJ5KTtcbiAgICBjb25zdCBpc0NvdW50cnlDaGFuZ2VkID0gY2hhbmdlZENvdW50cnkgfHwgZGV0ZWN0ZWRDYWxsaW5nQ29kZSAhPT0gdGhpcy5zZWxlY3RlZENhbGxpbmdDb2RlO1xuXG4gICAgaWYgKGlzQ291bnRyeUNoYW5nZWQgJiYgZGV0ZWN0ZWRDYWxsaW5nQ29kZSkge1xuICAgICAgdGhpcy5zZWxlY3RlZENhbGxpbmdDb2RlID0gZGV0ZWN0ZWRDYWxsaW5nQ29kZTtcbiAgICB9XG5cbiAgICBjb25zdCBjb3VudHJ5Q29kZSA9IHRoaXMuZ2V0Q291bnRyeUJ5Q2FsbGluZ0NvZGUodGhpcy5zZWxlY3RlZENhbGxpbmdDb2RlKTtcblxuICAgIGlmICghY291bnRyeUNvZGUpIHtcbiAgICAgIHRoaXMucGhvbmVGb3JtYXR0ZWQgPSB2YWx1ZTtcbiAgICAgIHRoaXMucGhvbmVWYWxpZCA9IGZhbHNlO1xuICAgICAgdGhpcy52YWxpZGF0ZVZhbHVlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbmF0aW9uYWxQYXJ0ID0gdmFsdWUucmVwbGFjZSh0aGlzLnNlbGVjdGVkQ2FsbGluZ0NvZGUsICcnKS5yZXBsYWNlKC9bXlxcZCtdL2csICcnKTtcblxuICAgIGNvbnN0IGZvcm1hdHRlciA9IG5ldyBBc1lvdVR5cGUoY291bnRyeUNvZGUpO1xuICAgIHRoaXMucGhvbmVGb3JtYXR0ZWQgPSBmb3JtYXR0ZXIuaW5wdXQobmF0aW9uYWxQYXJ0KTtcblxuICAgIHRoaXMucGVyZm9ybVZhbHVlKG5hdGlvbmFsUGFydCk7XG5cbiAgICB0aGlzLnBob25lVmFsaWQgPSBpc1ZhbGlkUGhvbmVOdW1iZXIobmF0aW9uYWxQYXJ0LCBjb3VudHJ5Q29kZSk7XG4gICAgdGhpcy52YWxpZGF0ZVZhbHVlKCk7XG4gIH1cblxuICBkaXNhYmxlVG9CZURpcnR5PzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICBfb25DaGFuZ2U6IGFueSA9ICgpID0+IHt9O1xuXG4gIF9vblRvdWNoZWQ6IGFueSA9ICgpID0+IHt9O1xuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHt9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge31cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHt9XG5cbiAgb25Db250YWluZXJDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuaW5wdXRzLmZpcnN0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgfVxuXG4gIF9vbkZvY3VzKCkge1xuICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgdGhpcy5mb2N1c2VkID0gdHJ1ZTtcbiAgICAgIHRoaXMuX29uVG91Y2hlZCgpO1xuICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICAgIH1cbiAgfVxuXG4gIF9vbkJsdXIoKSB7XG4gICAgdGhpcy5mb2N1c2VkID0gZmFsc2U7XG4gICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICAgIHRoaXMudmFsaWRhdGVWYWx1ZSgpO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5fb25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLl9vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbikge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICB9XG5cbiAgb25JbnB1dENoYW5nZShldmVudDogRXZlbnQpIHtcbiAgICBjb25zdCB7IHZhbHVlIH0gPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICB0aGlzLmZvcm1hdFZhbHVlKHZhbHVlKTtcbiAgfVxuXG4gIG9uQ291bnRyeUNoYW5nZSgpIHtcbiAgICB0aGlzLmZvcm1hdFZhbHVlKHRoaXMuX3ZhbHVlISwgdHJ1ZSk7XG4gICAgdGhpcy52YWxpZGF0ZVZhbHVlKCk7XG4gIH1cblxuICBnZXRNYXhMZW5ndGgoKTogbnVtYmVyIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY291bnRyeUNvZGUgPSB0aGlzLmdldENvdW50cnlCeUNhbGxpbmdDb2RlKHRoaXMuc2VsZWN0ZWRDYWxsaW5nQ29kZSk7XG5cbiAgICAgIGlmICghY291bnRyeUNvZGUpIHJldHVybiAyMDtcblxuICAgICAgY29uc3QgZXhhbXBsZSA9IGdldEV4YW1wbGVOdW1iZXIoY291bnRyeUNvZGUsIGV4YW1wbGVzKTtcbiAgICAgIGNvbnN0IGZvcm1hdHRlZCA9IG5ldyBBc1lvdVR5cGUoY291bnRyeUNvZGUpLmlucHV0KGV4YW1wbGUhLm5hdGlvbmFsTnVtYmVyKTtcblxuICAgICAgcmV0dXJuIGZvcm1hdHRlZC5sZW5ndGg7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gMjA7XG4gICAgfVxuICB9XG5cbiAgb25IYW5kbGVTZWFyY2hTZWxlY3QocXVlcnk6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRRdWVyeSA9IHF1ZXJ5LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgdGhpcy5jb3VudHJpZXNGaWx0ZXJlZCA9IHRoaXMuY291bnRyaWVzLmZpbHRlcigoeyBuYW1lIH0pID0+IHtcbiAgICAgIHJldHVybiBuYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobm9ybWFsaXplZFF1ZXJ5KTtcbiAgICB9KTtcbiAgfVxufVxuIl19
@@ -1,7 +0,0 @@
1
- /** ************************
2
- * Copyright Monkey Exchange. All Rights Reserved
3
- * This style guide was developed by Monkey Exchange Team
4
- * MIT Licence
5
- ************************* */
6
- export * from './input-upload.component';
7
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tb25rZXktc3R5bGUtZ3VpZGUtdjIvc3JjL2xpYi9jb21wb25lbnRzL2lucHV0LXVwbG9hZC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs2QkFJNkI7QUFDN0IsY0FBYywwQkFBMEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiAqKioqKioqKioqKioqKioqKioqKioqKipcbiAqIENvcHlyaWdodCBNb25rZXkgRXhjaGFuZ2UuIEFsbCBSaWdodHMgUmVzZXJ2ZWRcbiAqIFRoaXMgc3R5bGUgZ3VpZGUgd2FzIGRldmVsb3BlZCBieSBNb25rZXkgRXhjaGFuZ2UgVGVhbVxuICogTUlUIExpY2VuY2VcbiAqKioqKioqKioqKioqKioqKioqKioqKioqICovXG5leHBvcnQgKiBmcm9tICcuL2lucHV0LXVwbG9hZC5jb21wb25lbnQnO1xuIl19
@@ -1,238 +0,0 @@
1
- /** ************************
2
- * Copyright Monkey Exchange. All Rights Reserved
3
- * This style guide was developed by Monkey Exchange Team
4
- * MIT Licence
5
- ************************* */
6
- import { booleanAttribute, Component, EventEmitter, inject, Input, Output, ViewChild } from '@angular/core';
7
- import { NgControl, Validators } from '@angular/forms';
8
- import { Subject } from 'rxjs';
9
- import { formatFileSize, getFileExtension, IdGenerator } from '../../../utils';
10
- import { MonkeyFormFieldControl } from '../form-field';
11
- import * as i0 from "@angular/core";
12
- export class MonkeyInputUploadComponent {
13
- get disabled() {
14
- if (this.ngControl && this.ngControl.disabled !== null) {
15
- return this.ngControl.disabled;
16
- }
17
- return this._disabled;
18
- }
19
- set disabled(value) {
20
- this._disabled = value;
21
- if (this.focused) {
22
- this.focused = false;
23
- this.stateChanges.next();
24
- }
25
- }
26
- get required() {
27
- return this._required ?? this.ngControl?.control?.hasValidator(Validators.required) ?? false;
28
- }
29
- set required(value) {
30
- this._required = value;
31
- this.stateChanges.next();
32
- }
33
- set value(value) {
34
- if (this._value !== value && value !== undefined) {
35
- this._value = value;
36
- this._onChange(value);
37
- this._onTouched(value);
38
- }
39
- }
40
- get value() {
41
- return this._value;
42
- }
43
- constructor() {
44
- this.progress = 0;
45
- this.placeholder = '';
46
- this.maxSizeBytes = 5 * 1024 * 1024;
47
- this.allowedExtensions = ['.jpg', '.jpeg', '.png', '.pdf', '.txt', '.xls', '.xlsx'];
48
- this.loading = false;
49
- this.tabIndex = 0;
50
- this._disabled = false;
51
- this._value = null;
52
- this.onChange = new EventEmitter();
53
- this.ngControl = inject(NgControl, { self: true, optional: true });
54
- this.idGenerator = inject(IdGenerator);
55
- this.id = this.idGenerator.getId('monkey-input-upload-');
56
- this.focused = false;
57
- this.type = '';
58
- this.currency = false;
59
- this.percent = false;
60
- this.stateChanges = new Subject();
61
- this._onChange = () => { };
62
- this._onTouched = () => { };
63
- if (this.ngControl) {
64
- this.ngControl.valueAccessor = this;
65
- }
66
- }
67
- validateFileSize(file) {
68
- return file.size <= this.maxSizeBytes;
69
- }
70
- validateFileExtension(file) {
71
- if (!this.allowedExtensions || !this.allowedExtensions.length) {
72
- return true;
73
- }
74
- const fileExtension = getFileExtension(file.name);
75
- const allowedExts = this.allowedExtensions.map((ext) => {
76
- return ext.trim().replace('.', '').toLowerCase();
77
- });
78
- return allowedExts.includes(fileExtension);
79
- }
80
- onContainerClick(event) {
81
- if (!this.loading) {
82
- this.fileInput.nativeElement.click();
83
- }
84
- }
85
- _onFocus() {
86
- if (!this.disabled) {
87
- this.focused = true;
88
- this._onTouched();
89
- this.stateChanges.next();
90
- }
91
- }
92
- _onBlur() {
93
- this.focused = false;
94
- this.stateChanges.next();
95
- }
96
- ngAfterContentInit() { }
97
- ngOnChanges(changes) { }
98
- ngOnDestroy() { }
99
- registerOnChange(fn) {
100
- this._onChange = fn;
101
- }
102
- registerOnTouched(fn) {
103
- this._onTouched = fn;
104
- }
105
- setDisabledState(isDisabled) {
106
- this.disabled = isDisabled;
107
- if (this.fileInput) {
108
- this.fileInput.nativeElement.disabled = isDisabled;
109
- }
110
- }
111
- writeValue(value) {
112
- this.value = value;
113
- }
114
- reset() {
115
- if (this.fileInput) {
116
- this.fileInput.nativeElement.value = '';
117
- }
118
- }
119
- onFileSelected(event) {
120
- const input = event.target;
121
- this._onTouched();
122
- if (!input.files?.length) {
123
- return;
124
- }
125
- const file = input.files.item(0);
126
- if (this.fileInput) {
127
- this.fileInput.nativeElement.value = '';
128
- }
129
- if (!this.validateFileSize(file)) {
130
- this.ngControl?.control?.setErrors({
131
- maxFileSize: true,
132
- sizeAllowed: formatFileSize(this.maxSizeBytes)
133
- });
134
- this._onBlur();
135
- this.reset();
136
- return;
137
- }
138
- if (!this.validateFileExtension(file)) {
139
- this.ngControl?.control?.setErrors({
140
- fileExtension: true,
141
- extensionAllowed: this.allowedExtensions.join(', ')
142
- });
143
- this._onBlur();
144
- this.reset();
145
- return;
146
- }
147
- this._onBlur();
148
- if (this.onChange.observed) {
149
- this.onChange.emit({ component: this, file: file });
150
- }
151
- else {
152
- this.value = {
153
- fileName: file.name,
154
- file
155
- };
156
- }
157
- }
158
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MonkeyInputUploadComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
159
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: MonkeyInputUploadComponent, isStandalone: true, selector: "monkey-input-upload", inputs: { progress: "progress", placeholder: "placeholder", maxSizeBytes: "maxSizeBytes", allowedExtensions: "allowedExtensions", loading: ["loading", "loading", booleanAttribute], tabIndex: "tabIndex", disabled: ["disabled", "disabled", booleanAttribute], required: ["required", "required", booleanAttribute], value: "value" }, outputs: { onChange: "onChange" }, host: { listeners: { "focus": "_onFocus()", "blur": "_onBlur()" }, properties: { "attr.data-testid": "'monkey-input-upload'", "class.mecx-input-upload-disabled": "_disabled", "class.mecx-input-upload-focused": "focused", "attr.id": "id", "attr.tabindex": "disabled ? -1 : tabIndex" }, classAttribute: "mecx-input-upload" }, providers: [
160
- // eslint-disable-next-line no-use-before-define
161
- { provide: MonkeyFormFieldControl, useExisting: MonkeyInputUploadComponent }
162
- ], viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
163
- <div class="mecx-input-upload-value" [class.has-value]="value">
164
- {{ value?.fileName || placeholder }}
165
- </div>
166
- <input
167
- (change)="onFileSelected($event)"
168
- type="file"
169
- class="file-input"
170
- #fileInput
171
- [accept]="allowedExtensions.join(',')"
172
- />
173
- @if (loading) {
174
- <div class="progress">
175
- <div class="progress-bar" [style.width.%]="progress"></div>
176
- </div>
177
- }
178
- `, isInline: true, styles: [":host{display:inline-flex;width:100%;min-width:0;cursor:pointer}:host .progress{position:absolute;left:0;bottom:0;right:0;height:2px;background-color:var(--mecx-color-gray-300);width:100%}:host .progress .progress-bar{background-color:var(--mecx-color-success-main);height:100%;transition:width .2s}:host:focus-visible,:host:focus{outline:none}:host .mecx-input-upload-value{font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:24px}:host .mecx-input-upload-value.has-value{color:var(--mecx-color-gray-900)}:host.mecx-input-upload-disabled .mecx-input-upload-value{color:var(--mecx-color-gray-400)!important}:host .file-input{display:none}\n"] }); }
179
- }
180
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MonkeyInputUploadComponent, decorators: [{
181
- type: Component,
182
- args: [{ selector: 'monkey-input-upload', standalone: true, imports: [], template: `
183
- <div class="mecx-input-upload-value" [class.has-value]="value">
184
- {{ value?.fileName || placeholder }}
185
- </div>
186
- <input
187
- (change)="onFileSelected($event)"
188
- type="file"
189
- class="file-input"
190
- #fileInput
191
- [accept]="allowedExtensions.join(',')"
192
- />
193
- @if (loading) {
194
- <div class="progress">
195
- <div class="progress-bar" [style.width.%]="progress"></div>
196
- </div>
197
- }
198
- `, providers: [
199
- // eslint-disable-next-line no-use-before-define
200
- { provide: MonkeyFormFieldControl, useExisting: MonkeyInputUploadComponent }
201
- ], host: {
202
- '[attr.data-testid]': "'monkey-input-upload'",
203
- class: 'mecx-input-upload',
204
- '[class.mecx-input-upload-disabled]': '_disabled',
205
- '[class.mecx-input-upload-focused]': 'focused',
206
- '[attr.id]': 'id',
207
- '[attr.tabindex]': 'disabled ? -1 : tabIndex',
208
- '(focus)': '_onFocus()',
209
- '(blur)': '_onBlur()'
210
- }, styles: [":host{display:inline-flex;width:100%;min-width:0;cursor:pointer}:host .progress{position:absolute;left:0;bottom:0;right:0;height:2px;background-color:var(--mecx-color-gray-300);width:100%}:host .progress .progress-bar{background-color:var(--mecx-color-success-main);height:100%;transition:width .2s}:host:focus-visible,:host:focus{outline:none}:host .mecx-input-upload-value{font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:24px}:host .mecx-input-upload-value.has-value{color:var(--mecx-color-gray-900)}:host.mecx-input-upload-disabled .mecx-input-upload-value{color:var(--mecx-color-gray-400)!important}:host .file-input{display:none}\n"] }]
211
- }], ctorParameters: () => [], propDecorators: { fileInput: [{
212
- type: ViewChild,
213
- args: ['fileInput']
214
- }], progress: [{
215
- type: Input
216
- }], placeholder: [{
217
- type: Input
218
- }], maxSizeBytes: [{
219
- type: Input
220
- }], allowedExtensions: [{
221
- type: Input
222
- }], loading: [{
223
- type: Input,
224
- args: [{ transform: booleanAttribute }]
225
- }], tabIndex: [{
226
- type: Input
227
- }], disabled: [{
228
- type: Input,
229
- args: [{ transform: booleanAttribute }]
230
- }], required: [{
231
- type: Input,
232
- args: [{ transform: booleanAttribute }]
233
- }], value: [{
234
- type: Input
235
- }], onChange: [{
236
- type: Output
237
- }] } });
238
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtdXBsb2FkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL21vbmtleS1zdHlsZS1ndWlkZS12Mi9zcmMvbGliL2NvbXBvbmVudHMvaW5wdXQtdXBsb2FkL2lucHV0LXVwbG9hZC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7NkJBSTZCO0FBRTdCLE9BQU8sRUFFTCxnQkFBZ0IsRUFDaEIsU0FBUyxFQUVULFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUdMLE1BQU0sRUFFTixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0UsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQy9FLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUEwQ3ZELE1BQU0sT0FBTywwQkFBMEI7SUFrQnJDLElBQ0ksUUFBUTtRQUNWLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUN2RCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDO1FBQ2pDLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUVELElBQUksUUFBUSxDQUFDLEtBQWM7UUFDekIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFFdkIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7WUFDckIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJ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QUMxQixvQ0FBb0MsRUFBRSxXQUFXO3dCQUNqRCxtQ0FBbUMsRUFBRSxTQUFTO3dCQUM5QyxXQUFXLEVBQUUsSUFBSTt3QkFDakIsaUJBQWlCLEVBQUUsMEJBQTBCO3dCQUM3QyxTQUFTLEVBQUUsWUFBWTt3QkFDdkIsUUFBUSxFQUFFLFdBQVc7cUJBQ3RCO3dEQUt1QixTQUFTO3NCQUFoQyxTQUFTO3VCQUFDLFdBQVc7Z0JBRWIsUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBRUcsaUJBQWlCO3NCQUF6QixLQUFLO2dCQUdOLE9BQU87c0JBRE4sS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFHN0IsUUFBUTtzQkFBaEIsS0FBSztnQkFHRixRQUFRO3NCQURYLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBb0JsQyxRQUFRO3NCQURYLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBYWxDLEtBQUs7c0JBRFIsS0FBSztnQkFxQkksUUFBUTtzQkFBakIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qKiAqKioqKioqKioqKioqKioqKioqKioqKipcbiAqIENvcHlyaWdodCBNb25rZXkgRXhjaGFuZ2UuIEFsbCBSaWdodHMgUmVzZXJ2ZWRcbiAqIFRoaXMgc3R5bGUgZ3VpZGUgd2FzIGRldmVsb3BlZCBieSBNb25rZXkgRXhjaGFuZ2UgVGVhbVxuICogTUlUIExpY2VuY2VcbiAqKioqKioqKioqKioqKioqKioqKioqKioqICovXG5cbmltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIGJvb2xlYW5BdHRyaWJ1dGUsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBpbmplY3QsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTmdDb250cm9sLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZm9ybWF0RmlsZVNpemUsIGdldEZpbGVFeHRlbnNpb24sIElkR2VuZXJhdG9yIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgTW9ua2V5Rm9ybUZpZWxkQ29udHJvbCB9IGZyb20gJy4uL2Zvcm0tZmllbGQnO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbmV4cG9ydCB0eXBlIE1vbmtleUlucHV0VXBsb2FkQ2hhbmdlRXZlbnQgPSB7IGNvbXBvbmVudDogTW9ua2V5SW5wdXRVcGxvYWRDb21wb25lbnQ7IGZpbGU6IEZpbGUgfTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbW9ua2V5LWlucHV0LXVwbG9hZCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJtZWN4LWlucHV0LXVwbG9hZC12YWx1ZVwiIFtjbGFzcy5oYXMtdmFsdWVdPVwidmFsdWVcIj5cbiAgICAgIHt7IHZhbHVlPy5maWxlTmFtZSB8fCBwbGFjZWhvbGRlciB9fVxuICAgIDwvZGl2PlxuICAgIDxpbnB1dFxuICAgICAgKGNoYW5nZSk9XCJvbkZpbGVTZWxlY3RlZCgkZXZlbnQpXCJcbiAgICAgIHR5cGU9XCJmaWxlXCJcbiAgICAgIGNsYXNzPVwiZmlsZS1pbnB1dFwiXG4gICAgICAjZmlsZUlucHV0XG4gICAgICBbYWNjZXB0XT1cImFsbG93ZWRFeHRlbnNpb25zLmpvaW4oJywnKVwiXG4gICAgLz5cbiAgICBAaWYgKGxvYWRpbmcpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzc1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtYmFyXCIgW3N0eWxlLndpZHRoLiVdPVwicHJvZ3Jlc3NcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgYCxcbiAgc3R5bGVVcmw6ICcuL2lucHV0LXVwbG9hZC5jb21wb25lbnQuc2NzcycsXG4gIHByb3ZpZGVyczogW1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgIHsgcHJvdmlkZTogTW9ua2V5Rm9ybUZpZWxkQ29udHJvbCwgdXNlRXhpc3Rpbmc6IE1vbmtleUlucHV0VXBsb2FkQ29tcG9uZW50IH1cbiAgXSxcbiAgaG9zdDoge1xuICAgICdbYXR0ci5kYXRhLXRlc3RpZF0nOiBcIidtb25rZXktaW5wdXQtdXBsb2FkJ1wiLFxuICAgIGNsYXNzOiAnbWVjeC1pbnB1dC11cGxvYWQnLFxuICAgICdbY2xhc3MubWVjeC1pbnB1dC11cGxvYWQtZGlzYWJsZWRdJzogJ19kaXNhYmxlZCcsXG4gICAgJ1tjbGFzcy5tZWN4LWlucHV0LXVwbG9hZC1mb2N1c2VkXSc6ICdmb2N1c2VkJyxcbiAgICAnW2F0dHIuaWRdJzogJ2lkJyxcbiAgICAnW2F0dHIudGFiaW5kZXhdJzogJ2Rpc2FibGVkID8gLTEgOiB0YWJJbmRleCcsXG4gICAgJyhmb2N1cyknOiAnX29uRm9jdXMoKScsXG4gICAgJyhibHVyKSc6ICdfb25CbHVyKCknXG4gIH1cbn0pXG5leHBvcnQgY2xhc3MgTW9ua2V5SW5wdXRVcGxvYWRDb21wb25lbnRcbiAgaW1wbGVtZW50cyBNb25rZXlGb3JtRmllbGRDb250cm9sLCBDb250cm9sVmFsdWVBY2Nlc3NvciwgQWZ0ZXJDb250ZW50SW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXNcbntcbiAgQFZpZXdDaGlsZCgnZmlsZUlucHV0JykgZmlsZUlucHV0ITogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcblxuICBASW5wdXQoKSBwcm9ncmVzczogbnVtYmVyID0gMDtcblxuICBASW5wdXQoKSBwbGFjZWhvbGRlcjogc3RyaW5nID0gJyc7XG5cbiAgQElucHV0KCkgbWF4U2l6ZUJ5dGVzID0gNSAqIDEwMjQgKiAxMDI0O1xuXG4gIEBJbnB1dCgpIGFsbG93ZWRFeHRlbnNpb25zID0gWycuanBnJywgJy5qcGVnJywgJy5wbmcnLCAnLnBkZicsICcudHh0JywgJy54bHMnLCAnLnhsc3gnXTtcblxuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSlcbiAgbG9hZGluZyA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIHRhYkluZGV4ID0gMDtcblxuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSlcbiAgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLm5nQ29udHJvbCAmJiB0aGlzLm5nQ29udHJvbC5kaXNhYmxlZCAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMubmdDb250cm9sLmRpc2FibGVkO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQ7XG4gIH1cblxuICBzZXQgZGlzYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9kaXNhYmxlZCA9IHZhbHVlO1xuXG4gICAgaWYgKHRoaXMuZm9jdXNlZCkge1xuICAgICAgdGhpcy5mb2N1c2VkID0gZmFsc2U7XG4gICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XG4gICAgfVxuICB9XG5cbiAgX2Rpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gIGdldCByZXF1aXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWlyZWQgPz8gdGhpcy5uZ0NvbnRyb2w/LmNvbnRyb2w/Lmhhc1ZhbGlkYXRvcihWYWxpZGF0b3JzLnJlcXVpcmVkKSA/PyBmYWxzZTtcbiAgfVxuXG4gIHNldCByZXF1aXJlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX3JlcXVpcmVkID0gdmFsdWU7XG4gICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVxdWlyZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgQElucHV0KClcbiAgc2V0IHZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICBpZiAodGhpcy5fdmFsdWUgIT09IHZhbHVlICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgICB0aGlzLl9vbkNoYW5nZSh2YWx1ZSk7XG4gICAgICB0aGlzLl9vblRvdWNoZWQodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIGdldCB2YWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuXG4gIF92YWx1ZSA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgaWYgKHRoaXMubmdDb250cm9sKSB7XG4gICAgICB0aGlzLm5nQ29udHJvbC52YWx1ZUFjY2Vzc29yID0gdGhpcztcbiAgICB9XG4gIH1cblxuICBAT3V0cHV0KCkgb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPE1vbmtleUlucHV0VXBsb2FkQ2hhbmdlRXZlbnQ+KCk7XG5cbiAgbmdDb250cm9sOiBOZ0NvbnRyb2wgfCBudWxsID0gaW5qZWN0KE5nQ29udHJvbCwgeyBzZWxmOiB0cnVlLCBvcHRpb25hbDogdHJ1ZSB9KSE7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBpZEdlbmVyYXRvciA9IGluamVjdChJZEdlbmVyYXRvcik7XG5cbiAgcmVhZG9ubHkgaWQ6IHN0cmluZyA9IHRoaXMuaWRHZW5lcmF0b3IuZ2V0SWQoJ21vbmtleS1pbnB1dC11cGxvYWQtJyk7XG5cbiAgZm9jdXNlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHJlYWRvbmx5IHR5cGU6IHN0cmluZyA9ICcnO1xuXG4gIGN1cnJlbmN5OiBib29sZWFuID0gZmFsc2U7XG5cbiAgcmVhZG9ubHkgcGVyY2VudDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHJlYWRvbmx5IHN0YXRlQ2hhbmdlcyA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZUZpbGVTaXplKGZpbGU6IEZpbGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmlsZS5zaXplIDw9IHRoaXMubWF4U2l6ZUJ5dGVzO1xuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZUZpbGVFeHRlbnNpb24oZmlsZTogRmlsZSk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5hbGxvd2VkRXh0ZW5zaW9ucyB8fCAhdGhpcy5hbGxvd2VkRXh0ZW5zaW9ucy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBmaWxlRXh0ZW5zaW9uID0gZ2V0RmlsZUV4dGVuc2lvbihmaWxlLm5hbWUpO1xuXG4gICAgY29uc3QgYWxsb3dlZEV4dHMgPSB0aGlzLmFsbG93ZWRFeHRlbnNpb25zLm1hcCgoZXh0KSA9PiB7XG4gICAgICByZXR1cm4gZXh0LnRyaW0oKS5yZXBsYWNlKCcuJywgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gYWxsb3dlZEV4dHMuaW5jbHVkZXMoZmlsZUV4dGVuc2lvbik7XG4gIH1cblxuICBvbkNvbnRhaW5lckNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmxvYWRpbmcpIHtcbiAgICAgIHRoaXMuZmlsZUlucHV0Lm5hdGl2ZUVsZW1lbnQuY2xpY2soKTtcbiAgICB9XG4gIH1cblxuICBfb25Gb2N1cygpIHtcbiAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuZm9jdXNlZCA9IHRydWU7XG4gICAgICB0aGlzLl9vblRvdWNoZWQoKTtcbiAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgICB9XG4gIH1cblxuICBfb25CbHVyKCkge1xuICAgIHRoaXMuZm9jdXNlZCA9IGZhbHNlO1xuICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgfVxuXG4gIGRpc2FibGVUb0JlRGlydHk/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4gIF9vbkNoYW5nZTogYW55ID0gKCkgPT4ge307XG5cbiAgX29uVG91Y2hlZDogYW55ID0gKCkgPT4ge307XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge31cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7fVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge31cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLl9vbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMuX29uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKSB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gICAgaWYgKHRoaXMuZmlsZUlucHV0KSB7XG4gICAgICB0aGlzLmZpbGVJbnB1dC5uYXRpdmVFbGVtZW50LmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgICB9XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gIH1cblxuICByZXNldCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5maWxlSW5wdXQpIHtcbiAgICAgIHRoaXMuZmlsZUlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcbiAgICB9XG4gIH1cblxuICBvbkZpbGVTZWxlY3RlZChldmVudDogRXZlbnQpIHtcbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIHRoaXMuX29uVG91Y2hlZCgpO1xuICAgIGlmICghaW5wdXQuZmlsZXM/Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGUgPSBpbnB1dC5maWxlcy5pdGVtKDApO1xuXG4gICAgaWYgKHRoaXMuZmlsZUlucHV0KSB7XG4gICAgICB0aGlzLmZpbGVJbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnZhbGlkYXRlRmlsZVNpemUoZmlsZSEpKSB7XG4gICAgICB0aGlzLm5nQ29udHJvbD8uY29udHJvbD8uc2V0RXJyb3JzKHtcbiAgICAgICAgbWF4RmlsZVNpemU6IHRydWUsXG4gICAgICAgIHNpemVBbGxvd2VkOiBmb3JtYXRGaWxlU2l6ZSh0aGlzLm1heFNpemVCeXRlcylcbiAgICAgIH0pO1xuICAgICAgdGhpcy5fb25CbHVyKCk7XG4gICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnZhbGlkYXRlRmlsZUV4dGVuc2lvbihmaWxlISkpIHtcbiAgICAgIHRoaXMubmdDb250cm9sPy5jb250cm9sPy5zZXRFcnJvcnMoe1xuICAgICAgICBmaWxlRXh0ZW5zaW9uOiB0cnVlLFxuICAgICAgICBleHRlbnNpb25BbGxvd2VkOiB0aGlzLmFsbG93ZWRFeHRlbnNpb25zLmpvaW4oJywgJylcbiAgICAgIH0pO1xuICAgICAgdGhpcy5fb25CbHVyKCk7XG4gICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fb25CbHVyKCk7XG4gICAgaWYgKHRoaXMub25DaGFuZ2Uub2JzZXJ2ZWQpIHtcbiAgICAgIHRoaXMub25DaGFuZ2UuZW1pdCh7IGNvbXBvbmVudDogdGhpcywgZmlsZTogZmlsZSEgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmFsdWUgPSB7XG4gICAgICAgIGZpbGVOYW1lOiBmaWxlIS5uYW1lLFxuICAgICAgICBmaWxlXG4gICAgICB9O1xuICAgIH1cbiAgfVxufVxuIl19