@snabcentr/client-ui 0.4.1 → 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,5 @@
1
+ import { MaskitoOptions } from '@maskito/core';
2
+ /**
3
+ * Маска поля ввода кода подтверждения телефона.
4
+ */
5
+ export declare const phoneApproveCodeMask: MaskitoOptions;
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Перечисление типов аутентификации.
3
+ */
4
+ export declare enum AuthMethod {
5
+ /**
6
+ * Аутентификация по номеру телефона и коду подтверждения.
7
+ */
8
+ byPhone = "by_phone",
9
+ /**
10
+ * Аутентификация по логину и паролю.
11
+ */
12
+ byEmail = "by_email"
13
+ }
@@ -0,0 +1,7 @@
1
+ export * from './sc-sign-in-form/sc-sign-in-form.component';
2
+ export * from './sc-sign-in-form/sc-sign-in-form-by-email/sc-sign-in-form-by-email.component';
3
+ export * from './sc-sign-in-form/sc-sign-in-form-by-phone/sc-sign-in-form-by-phone.component';
4
+ export * from './enums/auth-method';
5
+ export * from './interfaces/ApiErrorResponse';
6
+ export * from './constants/phone-approve-code-mask';
7
+ export * from './sc-auth.module';
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Данные об ошибках валидации API запросов.
3
+ */
4
+ export interface ApiErrorResponse {
5
+ /**
6
+ * Обобщённое сообщение об ошибке.
7
+ */
8
+ message: string;
9
+ /**
10
+ * Подробное описание каждой ошибки. Содержит список полей с детальным описанием ошибок валидации для каждого поля.
11
+ */
12
+ errors: {
13
+ [key: string]: string[];
14
+ };
15
+ }
@@ -0,0 +1,18 @@
1
+ import * as i0 from "@angular/core";
2
+ import * as i1 from "./sc-sign-in-form/sc-sign-in-form.component";
3
+ import * as i2 from "./sc-sign-in-form/sc-sign-in-form-by-phone/sc-sign-in-form-by-phone.component";
4
+ import * as i3 from "./sc-sign-in-form/sc-sign-in-form-by-email/sc-sign-in-form-by-email.component";
5
+ import * as i4 from "@angular/common";
6
+ import * as i5 from "@angular/forms";
7
+ import * as i6 from "@taiga-ui/kit";
8
+ import * as i7 from "@taiga-ui/core";
9
+ import * as i8 from "@taiga-ui/cdk";
10
+ import * as i9 from "@maskito/angular";
11
+ /**
12
+ * Модуль аутентификации.
13
+ */
14
+ export declare class ScAuthModule {
15
+ static ɵfac: i0.ɵɵFactoryDeclaration<ScAuthModule, never>;
16
+ static ɵmod: i0.ɵɵNgModuleDeclaration<ScAuthModule, [typeof i1.ScSignInFormComponent, typeof i2.ScSignInFormByPhoneComponent, typeof i3.ScSignInFormByEmailComponent], [typeof i4.CommonModule, typeof i5.FormsModule, typeof i5.ReactiveFormsModule, typeof i6.TuiInputPasswordModule, typeof i6.TuiInputModule, typeof i7.TuiTextfieldControllerModule, typeof i7.TuiLinkModule, typeof i7.TuiButtonModule, typeof i7.TuiLabelModule, typeof i7.TuiModeModule, typeof i6.TuiFieldErrorPipeModule, typeof i7.TuiErrorModule, typeof i8.TuiLetModule, typeof i7.TuiLoaderModule, typeof i6.TuiInputPhoneModule, typeof i9.MaskitoModule], [typeof i1.ScSignInFormComponent, typeof i2.ScSignInFormByPhoneComponent, typeof i3.ScSignInFormByEmailComponent]>;
17
+ static ɵinj: i0.ɵɵInjectorDeclaration<ScAuthModule>;
18
+ }
@@ -0,0 +1,39 @@
1
+ import { EventEmitter } from '@angular/core';
2
+ import { FormGroup } from '@angular/forms';
3
+ import { ScAuthService } from '@snabcentr/client-core';
4
+ import { Subject, Observable } from 'rxjs';
5
+ import * as i0 from "@angular/core";
6
+ /**
7
+ * Компонент аутентификации по адресу электронной почты и паролю.
8
+ */
9
+ export declare class ScSignInFormByEmailComponent {
10
+ private readonly authService;
11
+ /**
12
+ * Группа полей ввода для формы «Вход на сайт».
13
+ */
14
+ readonly formByEmail: FormGroup;
15
+ /**
16
+ * {@link Subject} События отправки формы.
17
+ */
18
+ readonly onSubmit: Subject<void>;
19
+ /**
20
+ * {@link Observable} Запроса данных аутентификации.
21
+ */
22
+ private readonly emailRequest$;
23
+ /**
24
+ * {@link Observable} Изменения состояния загрузки данных аутентификации по email.
25
+ */
26
+ readonly loadingEmailAuth$: Observable<boolean>;
27
+ /**
28
+ * Сигнал нажатия на кнопку "Забыли пароль".
29
+ */
30
+ readonly forgotPassword: EventEmitter<void>;
31
+ /**
32
+ * Инициализирует экземпляр класса {@link ScSignInFormByEmailComponent}.
33
+ *
34
+ * @param authService Сервис аутентификации.
35
+ */
36
+ constructor(authService: ScAuthService);
37
+ static ɵfac: i0.ɵɵFactoryDeclaration<ScSignInFormByEmailComponent, never>;
38
+ static ɵcmp: i0.ɵɵComponentDeclaration<ScSignInFormByEmailComponent, "sc-sign-in-form-by-email", never, {}, { "forgotPassword": "forgotPassword"; }, never, never, false>;
39
+ }
@@ -0,0 +1,77 @@
1
+ import { FormGroup, FormControl } from '@angular/forms';
2
+ import { MaskitoOptions } from '@maskito/core';
3
+ import { ScAuthService, ScVerificationService } from '@snabcentr/client-core';
4
+ import { Subject, Observable } from 'rxjs';
5
+ import * as i0 from "@angular/core";
6
+ /**
7
+ * Компонент аутентификации по номеру телефона и коду подтверждения.
8
+ */
9
+ export declare class ScSignInFormByPhoneComponent {
10
+ private readonly authService;
11
+ private readonly verificationService;
12
+ /**
13
+ * Этап процесса аутентификации.
14
+ */
15
+ haveCode: boolean;
16
+ /**
17
+ * Группа полей ввода для формы «Вход на сайт».
18
+ */
19
+ readonly formByPhone: FormGroup;
20
+ /**
21
+ * Поле ввода 'Номер телефона'.
22
+ */
23
+ get phoneControl(): FormControl<string | null>;
24
+ /**
25
+ * {@link Subject} События отправки формы.
26
+ */
27
+ readonly onSubmit: Subject<void>;
28
+ /**
29
+ * {@link Observable} Запроса данных аутентификации.
30
+ */
31
+ private readonly phoneRequest$;
32
+ /**
33
+ * {@link Observable} Запроса данных получения информации о том свободен ли номер телефона.
34
+ */
35
+ isPhoneNotBusy$: Observable<boolean | null>;
36
+ /**
37
+ * {@link Subject} События отправки кода подтверждения.
38
+ */
39
+ readonly onSendCode: Subject<void>;
40
+ /**
41
+ * {@link Observable} Запроса данных получения кода подтверждения.
42
+ */
43
+ readonly loadingApproveCode$: Observable<boolean>;
44
+ /**
45
+ * Маска поля ввода кода для подтверждения.
46
+ */
47
+ readonly approveCodeMask: MaskitoOptions;
48
+ /**
49
+ * {@link Observable} Изменения состояния загрузки данных аутентификации по номеру телефона.
50
+ */
51
+ readonly loadingPhoneAuth$: Observable<boolean>;
52
+ /**
53
+ * {@link Subject} События запуска/остановки таймера.
54
+ */
55
+ readonly reloadTimer$: Subject<number>;
56
+ /**
57
+ * {@link Observable} Таймера.
58
+ *
59
+ * TODO: Вынести таймер в отдельную директиву TASK:[#9260].
60
+ */
61
+ readonly timer$: Observable<string | null>;
62
+ /**
63
+ * Инициализирует экземпляр класса {@link ScSignInFormByPhoneComponent}.
64
+ *
65
+ * @param authService Сервис аутентификации.
66
+ * @param verificationService Сервис верификации.
67
+ */
68
+ constructor(authService: ScAuthService, verificationService: ScVerificationService);
69
+ /**
70
+ * Устанавливает состояние наличия кода подтверждения у пользователя.
71
+ *
72
+ * @param haveCode Признак того есть ли код подтверждения или нет.
73
+ */
74
+ setHaveCode(haveCode: boolean): void;
75
+ static ɵfac: i0.ɵɵFactoryDeclaration<ScSignInFormByPhoneComponent, never>;
76
+ static ɵcmp: i0.ɵɵComponentDeclaration<ScSignInFormByPhoneComponent, "sc-sign-in-form-by-phone", never, {}, {}, never, never, false>;
77
+ }
@@ -0,0 +1,49 @@
1
+ import { EventEmitter } from '@angular/core';
2
+ import { ScAuthService } from '@snabcentr/client-core';
3
+ import { Observable } from 'rxjs';
4
+ import { AuthMethod } from '../enums/auth-method';
5
+ import * as i0 from "@angular/core";
6
+ /**
7
+ * Компонент аутентификации пользователя.
8
+ */
9
+ export declare class ScSignInFormComponent {
10
+ private readonly authService;
11
+ /**
12
+ * Выбранный способ аутентификации.
13
+ */
14
+ authMethod: AuthMethod;
15
+ /**
16
+ * Перечисление способов аутентификации.
17
+ */
18
+ method: typeof AuthMethod;
19
+ /**
20
+ * Сигнал нажатия на кнопку "Забыли пароль".
21
+ */
22
+ readonly forgotPassword: EventEmitter<void>;
23
+ /**
24
+ * Сигнал нажатия на кнопку "Зарегистрироваться".
25
+ */
26
+ readonly signUp: EventEmitter<void>;
27
+ /**
28
+ * Сигнал события аутентификации.
29
+ */
30
+ readonly successAuth: Observable<boolean>;
31
+ /**
32
+ * Инициализирует экземпляр класса {@link ScSignInFormComponent}.
33
+ *
34
+ * @param authService Сервис аутентификации.
35
+ */
36
+ constructor(authService: ScAuthService);
37
+ /**
38
+ * Осуществляет переключение способов аутентификации.
39
+ *
40
+ * @param authMethod Выбранный способ аутентификации.
41
+ */
42
+ switchAuth(authMethod: AuthMethod): void;
43
+ /**
44
+ * Обрабатывает нажатие на кнопку "Забыли пароль" и выдает сигнал об этом.
45
+ */
46
+ onForgotPassword(): void;
47
+ static ɵfac: i0.ɵɵFactoryDeclaration<ScSignInFormComponent, never>;
48
+ static ɵcmp: i0.ɵɵComponentDeclaration<ScSignInFormComponent, "sc-sign-in-form", never, { "authMethod": "authMethod"; }, { "forgotPassword": "forgotPassword"; "signUp": "signUp"; "successAuth": "successAuth"; }, never, never, false>;
49
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Маска поля ввода кода подтверждения телефона.
3
+ */
4
+ export const phoneApproveCodeMask = {
5
+ mask: /^\d{0,6}$/,
6
+ };
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGhvbmUtYXBwcm92ZS1jb2RlLW1hc2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGllbnQtdWkvYXV0aC9jb25zdGFudHMvcGhvbmUtYXBwcm92ZS1jb2RlLW1hc2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUE7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBbUI7SUFDaEQsSUFBSSxFQUFFLFdBQVc7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTWFza2l0b09wdGlvbnMgfSBmcm9tICdAbWFza2l0by9jb3JlJztcblxuLyoqXG4gKiDQnNCw0YHQutCwINC/0L7Qu9GPINCy0LLQvtC00LAg0LrQvtC00LAg0L/QvtC00YLQstC10YDQttC00LXQvdC40Y8g0YLQtdC70LXRhNC+0L3QsC5cbiAqL1xuZXhwb3J0IGNvbnN0IHBob25lQXBwcm92ZUNvZGVNYXNrOiBNYXNraXRvT3B0aW9ucyA9IHtcbiAgICBtYXNrOiAvXlxcZHswLDZ9JC8sXG59IGFzIE1hc2tpdG9PcHRpb25zO1xuIl19
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Перечисление типов аутентификации.
3
+ */
4
+ export var AuthMethod;
5
+ (function (AuthMethod) {
6
+ /**
7
+ * Аутентификация по номеру телефона и коду подтверждения.
8
+ */
9
+ AuthMethod["byPhone"] = "by_phone";
10
+ /**
11
+ * Аутентификация по логину и паролю.
12
+ */
13
+ AuthMethod["byEmail"] = "by_email";
14
+ })(AuthMethod || (AuthMethod = {}));
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC1tZXRob2QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGllbnQtdWkvYXV0aC9lbnVtcy9hdXRoLW1ldGhvZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUNILE1BQU0sQ0FBTixJQUFZLFVBVVg7QUFWRCxXQUFZLFVBQVU7SUFDbEI7O09BRUc7SUFDSCxrQ0FBb0IsQ0FBQTtJQUVwQjs7T0FFRztJQUNILGtDQUFvQixDQUFBO0FBQ3hCLENBQUMsRUFWVyxVQUFVLEtBQVYsVUFBVSxRQVVyQiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICog0J/QtdGA0LXRh9C40YHQu9C10L3QuNC1INGC0LjQv9C+0LIg0LDRg9GC0LXQvdGC0LjRhNC40LrQsNGG0LjQuC5cbiAqL1xuZXhwb3J0IGVudW0gQXV0aE1ldGhvZCB7XG4gICAgLyoqXG4gICAgICog0JDRg9GC0LXQvdGC0LjRhNC40LrQsNGG0LjRjyDQv9C+INC90L7QvNC10YDRgyDRgtC10LvQtdGE0L7QvdCwINC4INC60L7QtNGDINC/0L7QtNGC0LLQtdGA0LbQtNC10L3QuNGPLlxuICAgICAqL1xuICAgIGJ5UGhvbmUgPSAnYnlfcGhvbmUnLFxuXG4gICAgLyoqXG4gICAgICog0JDRg9GC0LXQvdGC0LjRhNC40LrQsNGG0LjRjyDQv9C+INC70L7Qs9C40L3RgyDQuCDQv9Cw0YDQvtC70Y4uXG4gICAgICovXG4gICAgYnlFbWFpbCA9ICdieV9lbWFpbCcsXG59XG4iXX0=
@@ -0,0 +1,8 @@
1
+ export * from './sc-sign-in-form/sc-sign-in-form.component';
2
+ export * from './sc-sign-in-form/sc-sign-in-form-by-email/sc-sign-in-form-by-email.component';
3
+ export * from './sc-sign-in-form/sc-sign-in-form-by-phone/sc-sign-in-form-by-phone.component';
4
+ export * from './enums/auth-method';
5
+ export * from './interfaces/ApiErrorResponse';
6
+ export * from './constants/phone-approve-code-mask';
7
+ export * from './sc-auth.module';
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGllbnQtdWkvYXV0aC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLDZDQUE2QyxDQUFDO0FBQzVELGNBQWMsK0VBQStFLENBQUM7QUFDOUYsY0FBYywrRUFBK0UsQ0FBQztBQUM5RixjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsK0JBQStCLENBQUM7QUFDOUMsY0FBYyxxQ0FBcUMsQ0FBQztBQUNwRCxjQUFjLGtCQUFrQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9zYy1zaWduLWluLWZvcm0vc2Mtc2lnbi1pbi1mb3JtLmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL3NjLXNpZ24taW4tZm9ybS9zYy1zaWduLWluLWZvcm0tYnktZW1haWwvc2Mtc2lnbi1pbi1mb3JtLWJ5LWVtYWlsLmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL3NjLXNpZ24taW4tZm9ybS9zYy1zaWduLWluLWZvcm0tYnktcGhvbmUvc2Mtc2lnbi1pbi1mb3JtLWJ5LXBob25lLmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL2VudW1zL2F1dGgtbWV0aG9kJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJmYWNlcy9BcGlFcnJvclJlc3BvbnNlJztcbmV4cG9ydCAqIGZyb20gJy4vY29uc3RhbnRzL3Bob25lLWFwcHJvdmUtY29kZS1tYXNrJztcbmV4cG9ydCAqIGZyb20gJy4vc2MtYXV0aC5tb2R1bGUnO1xuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXBpRXJyb3JSZXNwb25zZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NsaWVudC11aS9hdXRoL2ludGVyZmFjZXMvQXBpRXJyb3JSZXNwb25zZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiDQlNCw0L3QvdGL0LUg0L7QsSDQvtGI0LjQsdC60LDRhSDQstCw0LvQuNC00LDRhtC40LggQVBJINC30LDQv9GA0L7RgdC+0LIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpRXJyb3JSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICog0J7QsdC+0LHRidGR0L3QvdC+0LUg0YHQvtC+0LHRidC10L3QuNC1INC+0LEg0L7RiNC40LHQutC1LlxuICAgICAqL1xuICAgIG1lc3NhZ2U6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqINCf0L7QtNGA0L7QsdC90L7QtSDQvtC/0LjRgdCw0L3QuNC1INC60LDQttC00L7QuSDQvtGI0LjQsdC60LguINCh0L7QtNC10YDQttC40YIg0YHQv9C40YHQvtC6INC/0L7Qu9C10Lkg0YEg0LTQtdGC0LDQu9GM0L3Ri9C8INC+0L/QuNGB0LDQvdC40LXQvCDQvtGI0LjQsdC+0Log0LLQsNC70LjQtNCw0YbQuNC4INC00LvRjyDQutCw0LbQtNC+0LPQviDQv9C+0LvRjy5cbiAgICAgKi9cbiAgICBlcnJvcnM6IHtcbiAgICAgICAgW2tleTogc3RyaW5nXTogc3RyaW5nW107XG4gICAgfTtcbn1cbiJdfQ==
@@ -0,0 +1,75 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { FormsModule, ReactiveFormsModule } from '@angular/forms';
3
+ import { MaskitoModule } from '@maskito/angular';
4
+ import { NgModule } from '@angular/core';
5
+ import { ScSignInFormComponent } from '.';
6
+ import { TuiLetModule } from '@taiga-ui/cdk';
7
+ import { TuiTextfieldControllerModule, TuiLinkModule, TuiButtonModule, TuiLabelModule, TuiModeModule, TuiErrorModule, TuiLoaderModule } from '@taiga-ui/core';
8
+ import { TuiInputPasswordModule, TuiInputModule, TuiFieldErrorPipeModule, TuiInputPhoneModule } from '@taiga-ui/kit';
9
+ import { ScSignInFormByPhoneComponent } from './sc-sign-in-form/sc-sign-in-form-by-phone/sc-sign-in-form-by-phone.component';
10
+ import { ScSignInFormByEmailComponent } from './sc-sign-in-form/sc-sign-in-form-by-email/sc-sign-in-form-by-email.component';
11
+ import * as i0 from "@angular/core";
12
+ /**
13
+ * Модуль аутентификации.
14
+ */
15
+ export class ScAuthModule {
16
+ }
17
+ ScAuthModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ScAuthModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
18
+ ScAuthModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.3.0", ngImport: i0, type: ScAuthModule, declarations: [ScSignInFormComponent, ScSignInFormByPhoneComponent, ScSignInFormByEmailComponent], imports: [CommonModule,
19
+ FormsModule,
20
+ ReactiveFormsModule,
21
+ TuiInputPasswordModule,
22
+ TuiInputModule,
23
+ TuiTextfieldControllerModule,
24
+ TuiLinkModule,
25
+ TuiButtonModule,
26
+ TuiLabelModule,
27
+ TuiModeModule,
28
+ TuiFieldErrorPipeModule,
29
+ TuiErrorModule,
30
+ TuiLetModule,
31
+ TuiLoaderModule,
32
+ TuiInputPhoneModule,
33
+ MaskitoModule], exports: [ScSignInFormComponent, ScSignInFormByPhoneComponent, ScSignInFormByEmailComponent] });
34
+ ScAuthModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ScAuthModule, imports: [CommonModule,
35
+ FormsModule,
36
+ ReactiveFormsModule,
37
+ TuiInputPasswordModule,
38
+ TuiInputModule,
39
+ TuiTextfieldControllerModule,
40
+ TuiLinkModule,
41
+ TuiButtonModule,
42
+ TuiLabelModule,
43
+ TuiModeModule,
44
+ TuiFieldErrorPipeModule,
45
+ TuiErrorModule,
46
+ TuiLetModule,
47
+ TuiLoaderModule,
48
+ TuiInputPhoneModule,
49
+ MaskitoModule] });
50
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ScAuthModule, decorators: [{
51
+ type: NgModule,
52
+ args: [{
53
+ declarations: [ScSignInFormComponent, ScSignInFormByPhoneComponent, ScSignInFormByEmailComponent],
54
+ imports: [
55
+ CommonModule,
56
+ FormsModule,
57
+ ReactiveFormsModule,
58
+ TuiInputPasswordModule,
59
+ TuiInputModule,
60
+ TuiTextfieldControllerModule,
61
+ TuiLinkModule,
62
+ TuiButtonModule,
63
+ TuiLabelModule,
64
+ TuiModeModule,
65
+ TuiFieldErrorPipeModule,
66
+ TuiErrorModule,
67
+ TuiLetModule,
68
+ TuiLoaderModule,
69
+ TuiInputPhoneModule,
70
+ MaskitoModule,
71
+ ],
72
+ exports: [ScSignInFormComponent, ScSignInFormByPhoneComponent, ScSignInFormByEmailComponent],
73
+ }]
74
+ }] });
75
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2MtYXV0aC5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGllbnQtdWkvYXV0aC9zYy1hdXRoLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLEdBQUcsQ0FBQztBQUMxQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdDLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlKLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxjQUFjLEVBQUUsdUJBQXVCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckgsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sK0VBQStFLENBQUM7QUFDN0gsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sK0VBQStFLENBQUM7O0FBRTdIOztHQUVHO0FBdUJILE1BQU0sT0FBTyxZQUFZOzt5R0FBWixZQUFZOzBHQUFaLFlBQVksaUJBckJOLHFCQUFxQixFQUFFLDRCQUE0QixFQUFFLDRCQUE0QixhQUU1RixZQUFZO1FBQ1osV0FBVztRQUNYLG1CQUFtQjtRQUNuQixzQkFBc0I7UUFDdEIsY0FBYztRQUNkLDRCQUE0QjtRQUM1QixhQUFhO1FBQ2IsZUFBZTtRQUNmLGNBQWM7UUFDZCxhQUFhO1FBQ2IsdUJBQXVCO1FBQ3ZCLGNBQWM7UUFDZCxZQUFZO1FBQ1osZUFBZTtRQUNmLG1CQUFtQjtRQUNuQixhQUFhLGFBRVAscUJBQXFCLEVBQUUsNEJBQTRCLEVBQUUsNEJBQTRCOzBHQUVsRixZQUFZLFlBbkJqQixZQUFZO1FBQ1osV0FBVztRQUNYLG1CQUFtQjtRQUNuQixzQkFBc0I7UUFDdEIsY0FBYztRQUNkLDRCQUE0QjtRQUM1QixhQUFhO1FBQ2IsZUFBZTtRQUNmLGNBQWM7UUFDZCxhQUFhO1FBQ2IsdUJBQXVCO1FBQ3ZCLGNBQWM7UUFDZCxZQUFZO1FBQ1osZUFBZTtRQUNmLG1CQUFtQjtRQUNuQixhQUFhOzJGQUlSLFlBQVk7a0JBdEJ4QixRQUFRO21CQUFDO29CQUNOLFlBQVksRUFBRSxDQUFDLHFCQUFxQixFQUFFLDRCQUE0QixFQUFFLDRCQUE0QixDQUFDO29CQUNqRyxPQUFPLEVBQUU7d0JBQ0wsWUFBWTt3QkFDWixXQUFXO3dCQUNYLG1CQUFtQjt3QkFDbkIsc0JBQXNCO3dCQUN0QixjQUFjO3dCQUNkLDRCQUE0Qjt3QkFDNUIsYUFBYTt3QkFDYixlQUFlO3dCQUNmLGNBQWM7d0JBQ2QsYUFBYTt3QkFDYix1QkFBdUI7d0JBQ3ZCLGNBQWM7d0JBQ2QsWUFBWTt3QkFDWixlQUFlO3dCQUNmLG1CQUFtQjt3QkFDbkIsYUFBYTtxQkFDaEI7b0JBQ0QsT0FBTyxFQUFFLENBQUMscUJBQXFCLEVBQUUsNEJBQTRCLEVBQUUsNEJBQTRCLENBQUM7aUJBQy9GIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWFza2l0b01vZHVsZSB9IGZyb20gJ0BtYXNraXRvL2FuZ3VsYXInO1xuaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFNjU2lnbkluRm9ybUNvbXBvbmVudCB9IGZyb20gJy4nO1xuaW1wb3J0IHsgVHVpTGV0TW9kdWxlIH0gZnJvbSAnQHRhaWdhLXVpL2Nkayc7XG5pbXBvcnQgeyBUdWlUZXh0ZmllbGRDb250cm9sbGVyTW9kdWxlLCBUdWlMaW5rTW9kdWxlLCBUdWlCdXR0b25Nb2R1bGUsIFR1aUxhYmVsTW9kdWxlLCBUdWlNb2RlTW9kdWxlLCBUdWlFcnJvck1vZHVsZSwgVHVpTG9hZGVyTW9kdWxlIH0gZnJvbSAnQHRhaWdhLXVpL2NvcmUnO1xuaW1wb3J0IHsgVHVpSW5wdXRQYXNzd29yZE1vZHVsZSwgVHVpSW5wdXRNb2R1bGUsIFR1aUZpZWxkRXJyb3JQaXBlTW9kdWxlLCBUdWlJbnB1dFBob25lTW9kdWxlIH0gZnJvbSAnQHRhaWdhLXVpL2tpdCc7XG5pbXBvcnQgeyBTY1NpZ25JbkZvcm1CeVBob25lQ29tcG9uZW50IH0gZnJvbSAnLi9zYy1zaWduLWluLWZvcm0vc2Mtc2lnbi1pbi1mb3JtLWJ5LXBob25lL3NjLXNpZ24taW4tZm9ybS1ieS1waG9uZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2NTaWduSW5Gb3JtQnlFbWFpbENvbXBvbmVudCB9IGZyb20gJy4vc2Mtc2lnbi1pbi1mb3JtL3NjLXNpZ24taW4tZm9ybS1ieS1lbWFpbC9zYy1zaWduLWluLWZvcm0tYnktZW1haWwuY29tcG9uZW50JztcblxuLyoqXG4gKiDQnNC+0LTRg9C70Ywg0LDRg9GC0LXQvdGC0LjRhNC40LrQsNGG0LjQuC5cbiAqL1xuQE5nTW9kdWxlKHtcbiAgICBkZWNsYXJhdGlvbnM6IFtTY1NpZ25JbkZvcm1Db21wb25lbnQsIFNjU2lnbkluRm9ybUJ5UGhvbmVDb21wb25lbnQsIFNjU2lnbkluRm9ybUJ5RW1haWxDb21wb25lbnRdLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgQ29tbW9uTW9kdWxlLFxuICAgICAgICBGb3Jtc01vZHVsZSxcbiAgICAgICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICAgICAgVHVpSW5wdXRQYXNzd29yZE1vZHVsZSxcbiAgICAgICAgVHVpSW5wdXRNb2R1bGUsXG4gICAgICAgIFR1aVRleHRmaWVsZENvbnRyb2xsZXJNb2R1bGUsXG4gICAgICAgIFR1aUxpbmtNb2R1bGUsXG4gICAgICAgIFR1aUJ1dHRvbk1vZHVsZSxcbiAgICAgICAgVHVpTGFiZWxNb2R1bGUsXG4gICAgICAgIFR1aU1vZGVNb2R1bGUsXG4gICAgICAgIFR1aUZpZWxkRXJyb3JQaXBlTW9kdWxlLFxuICAgICAgICBUdWlFcnJvck1vZHVsZSxcbiAgICAgICAgVHVpTGV0TW9kdWxlLFxuICAgICAgICBUdWlMb2FkZXJNb2R1bGUsXG4gICAgICAgIFR1aUlucHV0UGhvbmVNb2R1bGUsXG4gICAgICAgIE1hc2tpdG9Nb2R1bGUsXG4gICAgXSxcbiAgICBleHBvcnRzOiBbU2NTaWduSW5Gb3JtQ29tcG9uZW50LCBTY1NpZ25JbkZvcm1CeVBob25lQ29tcG9uZW50LCBTY1NpZ25JbkZvcm1CeUVtYWlsQ29tcG9uZW50XSxcbn0pXG5leHBvcnQgY2xhc3MgU2NBdXRoTW9kdWxlIHt9XG4iXX0=
@@ -0,0 +1,64 @@
1
+ import { ChangeDetectionStrategy, Component, EventEmitter, Output } from '@angular/core';
2
+ import { FormGroup, FormControl, Validators } from '@angular/forms';
3
+ import { tuiIsFalsy } from '@taiga-ui/cdk';
4
+ import { Subject, filter, map, switchMap, catchError, of, startWith, share } from 'rxjs';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@snabcentr/client-core";
7
+ import * as i2 from "@angular/forms";
8
+ import * as i3 from "@taiga-ui/kit";
9
+ import * as i4 from "@taiga-ui/core";
10
+ import * as i5 from "@angular/common";
11
+ /**
12
+ * Компонент аутентификации по адресу электронной почты и паролю.
13
+ */
14
+ export class ScSignInFormByEmailComponent {
15
+ /**
16
+ * Инициализирует экземпляр класса {@link ScSignInFormByEmailComponent}.
17
+ *
18
+ * @param authService Сервис аутентификации.
19
+ */
20
+ constructor(authService) {
21
+ this.authService = authService;
22
+ /**
23
+ * Группа полей ввода для формы «Вход на сайт».
24
+ */
25
+ this.formByEmail = new FormGroup({
26
+ login: new FormControl(null, [Validators.required, Validators.email]),
27
+ password: new FormControl(null, Validators.required),
28
+ });
29
+ /**
30
+ * {@link Subject} События отправки формы.
31
+ */
32
+ this.onSubmit = new Subject();
33
+ /**
34
+ * {@link Observable} Запроса данных аутентификации.
35
+ */
36
+ this.emailRequest$ = this.onSubmit.pipe(filter(() => this.formByEmail.valid), map(() => this.formByEmail.value), switchMap((value) => this.authService.getSignIn$(value).pipe(catchError((error) => {
37
+ const errorResponse = error.error;
38
+ for (const key in errorResponse.errors) {
39
+ this.formByEmail.get(key)?.setErrors({ serverResponse: errorResponse.errors[`${key}`] });
40
+ }
41
+ if (!errorResponse.errors && errorResponse.message) {
42
+ this.formByEmail.setErrors({ serverResponse: [errorResponse.message] });
43
+ }
44
+ return of({});
45
+ }), startWith(null))), share());
46
+ /**
47
+ * {@link Observable} Изменения состояния загрузки данных аутентификации по email.
48
+ */
49
+ this.loadingEmailAuth$ = this.emailRequest$.pipe(map(tuiIsFalsy));
50
+ /**
51
+ * Сигнал нажатия на кнопку "Забыли пароль".
52
+ */
53
+ this.forgotPassword = new EventEmitter();
54
+ }
55
+ }
56
+ ScSignInFormByEmailComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ScSignInFormByEmailComponent, deps: [{ token: i1.ScAuthService }], target: i0.ɵɵFactoryTarget.Component });
57
+ ScSignInFormByEmailComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: ScSignInFormByEmailComponent, selector: "sc-sign-in-form-by-email", outputs: { forgotPassword: "forgotPassword" }, ngImport: i0, template: "<form [formGroup]=\"formByEmail\" (ngSubmit)=\"onSubmit.next()\">\n <div class=\"flex flex-col gap-4 mb-8\">\n <label tuiLabel=\"\u0410\u0434\u0440\u0435\u0441 \u044D\u043B\u0435\u043A\u0442\u0440\u043E\u043D\u043D\u043E\u0439 \u043F\u043E\u0447\u0442\u044B\">\n <tui-input formControlName=\"login\">\n \u0410\u0434\u0440\u0435\u0441 \u044D\u043B\u0435\u043A\u0442\u0440\u043E\u043D\u043D\u043E\u0439 \u043F\u043E\u0447\u0442\u044B\n <input tuiTextfield autocomplete=\"email\" />\n </tui-input>\n <tui-error formControlName=\"login\" [error]=\"[] | tuiFieldError | async\"></tui-error>\n </label>\n <label tuiLabel=\"\u041F\u0430\u0440\u043E\u043B\u044C\">\n <tui-input-password formControlName=\"password\">\n \u041F\u0430\u0440\u043E\u043B\u044C\n <input tuiTextfield autocomplete=\"current-password\" />\n </tui-input-password>\n <tui-error formControlName=\"password\" [error]=\"[] | tuiFieldError | async\"></tui-error>\n </label>\n <tui-error [error]=\"[] | tuiFieldError | async\"></tui-error>\n </div>\n <div class=\"flex flex-col gap-4 items-center mb-4\">\n <a tuiLink [pseudo]=\"true\" (click)=\"forgotPassword.emit()\" class=\"text-base\">\u0417\u0430\u0431\u044B\u043B\u0438 \u043F\u0430\u0440\u043E\u043B\u044C?</a>\n <button tuiButton type=\"submit\" [showLoader]=\"!!(loadingEmailAuth$ | async)\" [disabled]=\"formByEmail.invalid || !!(loadingEmailAuth$ | async)\" icon=\"scIconLogIn\">\n \u0412\u043E\u0439\u0442\u0438\n </button>\n </div>\n</form>\n", dependencies: [{ kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i3.TuiInputPasswordComponent, selector: "tui-input-password" }, { kind: "directive", type: i3.TuiInputPasswordDirective, selector: "tui-input-password" }, { kind: "component", type: i4.TuiTextfieldComponent, selector: "input[tuiTextfield], textarea[tuiTextfield]" }, { kind: "component", type: i3.TuiInputComponent, selector: "tui-input" }, { kind: "directive", type: i3.TuiInputDirective, selector: "tui-input" }, { kind: "component", type: i4.TuiLinkComponent, selector: "a[tuiLink], button[tuiLink]", inputs: ["pseudo", "icon", "iconAlign", "iconRotated", "mode"], exportAs: ["tuiLink"] }, { kind: "component", type: i4.TuiButtonComponent, selector: "button[tuiButton], button[tuiIconButton], a[tuiButton], a[tuiIconButton]", inputs: ["appearance", "disabled", "icon", "iconRight", "shape", "showLoader", "size"] }, { kind: "component", type: i4.TuiLabelComponent, selector: "label[tuiLabel]", inputs: ["tuiLabel", "context"] }, { kind: "component", type: i4.TuiErrorComponent, selector: "tui-error", inputs: ["error"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.TuiFieldErrorPipe, name: "tuiFieldError" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
58
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ScSignInFormByEmailComponent, decorators: [{
59
+ type: Component,
60
+ args: [{ selector: 'sc-sign-in-form-by-email', changeDetection: ChangeDetectionStrategy.OnPush, template: "<form [formGroup]=\"formByEmail\" (ngSubmit)=\"onSubmit.next()\">\n <div class=\"flex flex-col gap-4 mb-8\">\n <label tuiLabel=\"\u0410\u0434\u0440\u0435\u0441 \u044D\u043B\u0435\u043A\u0442\u0440\u043E\u043D\u043D\u043E\u0439 \u043F\u043E\u0447\u0442\u044B\">\n <tui-input formControlName=\"login\">\n \u0410\u0434\u0440\u0435\u0441 \u044D\u043B\u0435\u043A\u0442\u0440\u043E\u043D\u043D\u043E\u0439 \u043F\u043E\u0447\u0442\u044B\n <input tuiTextfield autocomplete=\"email\" />\n </tui-input>\n <tui-error formControlName=\"login\" [error]=\"[] | tuiFieldError | async\"></tui-error>\n </label>\n <label tuiLabel=\"\u041F\u0430\u0440\u043E\u043B\u044C\">\n <tui-input-password formControlName=\"password\">\n \u041F\u0430\u0440\u043E\u043B\u044C\n <input tuiTextfield autocomplete=\"current-password\" />\n </tui-input-password>\n <tui-error formControlName=\"password\" [error]=\"[] | tuiFieldError | async\"></tui-error>\n </label>\n <tui-error [error]=\"[] | tuiFieldError | async\"></tui-error>\n </div>\n <div class=\"flex flex-col gap-4 items-center mb-4\">\n <a tuiLink [pseudo]=\"true\" (click)=\"forgotPassword.emit()\" class=\"text-base\">\u0417\u0430\u0431\u044B\u043B\u0438 \u043F\u0430\u0440\u043E\u043B\u044C?</a>\n <button tuiButton type=\"submit\" [showLoader]=\"!!(loadingEmailAuth$ | async)\" [disabled]=\"formByEmail.invalid || !!(loadingEmailAuth$ | async)\" icon=\"scIconLogIn\">\n \u0412\u043E\u0439\u0442\u0438\n </button>\n </div>\n</form>\n" }]
61
+ }], ctorParameters: function () { return [{ type: i1.ScAuthService }]; }, propDecorators: { forgotPassword: [{
62
+ type: Output
63
+ }] } });
64
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Mtc2lnbi1pbi1mb3JtLWJ5LWVtYWlsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NsaWVudC11aS9hdXRoL3NjLXNpZ24taW4tZm9ybS9zYy1zaWduLWluLWZvcm0tYnktZW1haWwvc2Mtc2lnbi1pbi1mb3JtLWJ5LWVtYWlsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NsaWVudC11aS9hdXRoL3NjLXNpZ24taW4tZm9ybS9zYy1zaWduLWluLWZvcm0tYnktZW1haWwvc2Mtc2lnbi1pbi1mb3JtLWJ5LWVtYWlsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6RixPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVwRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxPQUFPLEVBQWMsTUFBTSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7O0FBR3JHOztHQUVHO0FBTUgsTUFBTSxPQUFPLDRCQUE0QjtJQW9EckM7Ozs7T0FJRztJQUNILFlBQW9DLFdBQTBCO1FBQTFCLGdCQUFXLEdBQVgsV0FBVyxDQUFlO1FBeEQ5RDs7V0FFRztRQUNhLGdCQUFXLEdBQWMsSUFBSSxTQUFTLENBQUM7WUFDbkQsS0FBSyxFQUFFLElBQUksV0FBVyxDQUFnQixJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNwRixRQUFRLEVBQUUsSUFBSSxXQUFXLENBQWdCLElBQUksRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDO1NBQ3RFLENBQUMsQ0FBQztRQUVIOztXQUVHO1FBQ2EsYUFBUSxHQUFrQixJQUFJLE9BQU8sRUFBUSxDQUFDO1FBRTlEOztXQUVHO1FBQ2Msa0JBQWEsR0FBa0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQzlFLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUNwQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFlLENBQUMsRUFDM0MsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDaEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUNuQyxVQUFVLENBQUMsQ0FBQyxLQUF3QixFQUFFLEVBQUU7WUFDcEMsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLEtBQXlCLENBQUM7WUFFdEQsS0FBSyxNQUFNLEdBQUcsSUFBSSxhQUFhLENBQUMsTUFBTSxFQUFFO2dCQUNwQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxjQUFjLEVBQUUsYUFBYSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQzVGO1lBRUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLElBQUksYUFBYSxDQUFDLE9BQU8sRUFBRTtnQkFDaEQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsRUFBRSxjQUFjLEVBQUUsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQzNFO1lBRUQsT0FBTyxFQUFFLENBQUMsRUFBZ0IsQ0FBQyxDQUFDO1FBQ2hDLENBQUMsQ0FBQyxFQUNGLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FDbEIsQ0FDSixFQUNELEtBQUssRUFBRSxDQUNWLENBQUM7UUFFRjs7V0FFRztRQUNhLHNCQUFpQixHQUF3QixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztRQUVsRzs7V0FFRztRQUVhLG1CQUFjLEdBQXVCLElBQUksWUFBWSxFQUFRLENBQUM7SUFPYixDQUFDOzt5SEF6RHpELDRCQUE0Qjs2R0FBNUIsNEJBQTRCLCtHQ2hCekMsMG9EQXlCQTsyRkRUYSw0QkFBNEI7a0JBTHhDLFNBQVM7K0JBQ0ksMEJBQTBCLG1CQUVuQix1QkFBdUIsQ0FBQyxNQUFNO29HQW9EL0IsY0FBYztzQkFEN0IsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBFcnJvclJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Hcm91cCwgRm9ybUNvbnRyb2wsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBJQXV0aFRva2VuLCBJTG9naW4sIFNjQXV0aFNlcnZpY2UgfSBmcm9tICdAc25hYmNlbnRyL2NsaWVudC1jb3JlJztcbmltcG9ydCB7IHR1aUlzRmFsc3kgfSBmcm9tICdAdGFpZ2EtdWkvY2RrJztcbmltcG9ydCB7IFN1YmplY3QsIE9ic2VydmFibGUsIGZpbHRlciwgbWFwLCBzd2l0Y2hNYXAsIGNhdGNoRXJyb3IsIG9mLCBzdGFydFdpdGgsIHNoYXJlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBBcGlFcnJvclJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9BcGlFcnJvclJlc3BvbnNlJztcblxuLyoqXG4gKiDQmtC+0LzQv9C+0L3QtdC90YIg0LDRg9GC0LXQvdGC0LjRhNC40LrQsNGG0LjQuCDQv9C+INCw0LTRgNC10YHRgyDRjdC70LXQutGC0YDQvtC90L3QvtC5INC/0L7Rh9GC0Ysg0Lgg0L/QsNGA0L7Qu9GOLlxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3NjLXNpZ24taW4tZm9ybS1ieS1lbWFpbCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3NjLXNpZ24taW4tZm9ybS1ieS1lbWFpbC5jb21wb25lbnQuaHRtbCcsXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFNjU2lnbkluRm9ybUJ5RW1haWxDb21wb25lbnQge1xuICAgIC8qKlxuICAgICAqINCT0YDRg9C/0L/QsCDQv9C+0LvQtdC5INCy0LLQvtC00LAg0LTQu9GPINGE0L7RgNC80YsgwqvQktGF0L7QtCDQvdCwINGB0LDQudGCwrsuXG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IGZvcm1CeUVtYWlsOiBGb3JtR3JvdXAgPSBuZXcgRm9ybUdyb3VwKHtcbiAgICAgICAgbG9naW46IG5ldyBGb3JtQ29udHJvbDxzdHJpbmcgfCBudWxsPihudWxsLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5lbWFpbF0pLFxuICAgICAgICBwYXNzd29yZDogbmV3IEZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+KG51bGwsIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICoge0BsaW5rIFN1YmplY3R9INCh0L7QsdGL0YLQuNGPINC+0YLQv9GA0LDQstC60Lgg0YTQvtGA0LzRiy5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgb25TdWJtaXQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICAgLyoqXG4gICAgICoge0BsaW5rIE9ic2VydmFibGV9INCX0LDQv9GA0L7RgdCwINC00LDQvdC90YvRhSDQsNGD0YLQtdC90YLQuNGE0LjQutCw0YbQuNC4LlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZW1haWxSZXF1ZXN0JDogT2JzZXJ2YWJsZTxJQXV0aFRva2VuIHwgbnVsbD4gPSB0aGlzLm9uU3VibWl0LnBpcGUoXG4gICAgICAgIGZpbHRlcigoKSA9PiB0aGlzLmZvcm1CeUVtYWlsLnZhbGlkKSxcbiAgICAgICAgbWFwKCgpID0+IHRoaXMuZm9ybUJ5RW1haWwudmFsdWUgYXMgSUxvZ2luKSxcbiAgICAgICAgc3dpdGNoTWFwKCh2YWx1ZSkgPT5cbiAgICAgICAgICAgIHRoaXMuYXV0aFNlcnZpY2UuZ2V0U2lnbkluJCh2YWx1ZSkucGlwZShcbiAgICAgICAgICAgICAgICBjYXRjaEVycm9yKChlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JSZXNwb25zZSA9IGVycm9yLmVycm9yIGFzIEFwaUVycm9yUmVzcG9uc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZXJyb3JSZXNwb25zZS5lcnJvcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybUJ5RW1haWwuZ2V0KGtleSk/LnNldEVycm9ycyh7IHNlcnZlclJlc3BvbnNlOiBlcnJvclJlc3BvbnNlLmVycm9yc1tgJHtrZXl9YF0gfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoIWVycm9yUmVzcG9uc2UuZXJyb3JzICYmIGVycm9yUmVzcG9uc2UubWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtQnlFbWFpbC5zZXRFcnJvcnMoeyBzZXJ2ZXJSZXNwb25zZTogW2Vycm9yUmVzcG9uc2UubWVzc2FnZV0gfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2Yoe30gYXMgSUF1dGhUb2tlbik7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgc3RhcnRXaXRoKG51bGwpXG4gICAgICAgICAgICApXG4gICAgICAgICksXG4gICAgICAgIHNoYXJlKClcbiAgICApO1xuXG4gICAgLyoqXG4gICAgICoge0BsaW5rIE9ic2VydmFibGV9INCY0LfQvNC10L3QtdC90LjRjyDRgdC+0YHRgtC+0Y/QvdC40Y8g0LfQsNCz0YDRg9C30LrQuCDQtNCw0L3QvdGL0YUg0LDRg9GC0LXQvdGC0LjRhNC40LrQsNGG0LjQuCDQv9C+IGVtYWlsLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBsb2FkaW5nRW1haWxBdXRoJDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMuZW1haWxSZXF1ZXN0JC5waXBlKG1hcCh0dWlJc0ZhbHN5KSk7XG5cbiAgICAvKipcbiAgICAgKiDQodC40LPQvdCw0Lsg0L3QsNC20LDRgtC40Y8g0L3QsCDQutC90L7Qv9C60YMgXCLQl9Cw0LHRi9C70Lgg0L/QsNGA0L7Qu9GMXCIuXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHJlYWRvbmx5IGZvcmdvdFBhc3N3b3JkOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgICAvKipcbiAgICAgKiDQmNC90LjRhtC40LDQu9C40LfQuNGA0YPQtdGCINGN0LrQt9C10LzQv9C70Y/RgCDQutC70LDRgdGB0LAge0BsaW5rIFNjU2lnbkluRm9ybUJ5RW1haWxDb21wb25lbnR9LlxuICAgICAqXG4gICAgICogQHBhcmFtIGF1dGhTZXJ2aWNlINCh0LXRgNCy0LjRgSDQsNGD0YLQtdC90YLQuNGE0LjQutCw0YbQuNC4LlxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGF1dGhTZXJ2aWNlOiBTY0F1dGhTZXJ2aWNlKSB7fVxufVxuIiwiPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtQnlFbWFpbFwiIChuZ1N1Ym1pdCk9XCJvblN1Ym1pdC5uZXh0KClcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtNCBtYi04XCI+XG4gICAgICAgIDxsYWJlbCB0dWlMYWJlbD1cItCQ0LTRgNC10YEg0Y3Qu9C10LrRgtGA0L7QvdC90L7QuSDQv9C+0YfRgtGLXCI+XG4gICAgICAgICAgICA8dHVpLWlucHV0IGZvcm1Db250cm9sTmFtZT1cImxvZ2luXCI+XG4gICAgICAgICAgICAgICAg0JDQtNGA0LXRgSDRjdC70LXQutGC0YDQvtC90L3QvtC5INC/0L7Rh9GC0YtcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHVpVGV4dGZpZWxkIGF1dG9jb21wbGV0ZT1cImVtYWlsXCIgLz5cbiAgICAgICAgICAgIDwvdHVpLWlucHV0PlxuICAgICAgICAgICAgPHR1aS1lcnJvciBmb3JtQ29udHJvbE5hbWU9XCJsb2dpblwiIFtlcnJvcl09XCJbXSB8IHR1aUZpZWxkRXJyb3IgfCBhc3luY1wiPjwvdHVpLWVycm9yPlxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8bGFiZWwgdHVpTGFiZWw9XCLQn9Cw0YDQvtC70YxcIj5cbiAgICAgICAgICAgIDx0dWktaW5wdXQtcGFzc3dvcmQgZm9ybUNvbnRyb2xOYW1lPVwicGFzc3dvcmRcIj5cbiAgICAgICAgICAgICAgICDQn9Cw0YDQvtC70YxcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHVpVGV4dGZpZWxkIGF1dG9jb21wbGV0ZT1cImN1cnJlbnQtcGFzc3dvcmRcIiAvPlxuICAgICAgICAgICAgPC90dWktaW5wdXQtcGFzc3dvcmQ+XG4gICAgICAgICAgICA8dHVpLWVycm9yIGZvcm1Db250cm9sTmFtZT1cInBhc3N3b3JkXCIgW2Vycm9yXT1cIltdIHwgdHVpRmllbGRFcnJvciB8IGFzeW5jXCI+PC90dWktZXJyb3I+XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDx0dWktZXJyb3IgW2Vycm9yXT1cIltdIHwgdHVpRmllbGRFcnJvciB8IGFzeW5jXCI+PC90dWktZXJyb3I+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTQgaXRlbXMtY2VudGVyIG1iLTRcIj5cbiAgICAgICAgPGEgdHVpTGluayBbcHNldWRvXT1cInRydWVcIiAoY2xpY2spPVwiZm9yZ290UGFzc3dvcmQuZW1pdCgpXCIgY2xhc3M9XCJ0ZXh0LWJhc2VcIj7Ql9Cw0LHRi9C70Lgg0L/QsNGA0L7Qu9GMPzwvYT5cbiAgICAgICAgPGJ1dHRvbiB0dWlCdXR0b24gdHlwZT1cInN1Ym1pdFwiIFtzaG93TG9hZGVyXT1cIiEhKGxvYWRpbmdFbWFpbEF1dGgkIHwgYXN5bmMpXCIgW2Rpc2FibGVkXT1cImZvcm1CeUVtYWlsLmludmFsaWQgfHwgISEobG9hZGluZ0VtYWlsQXV0aCQgfCBhc3luYylcIiBpY29uPVwic2NJY29uTG9nSW5cIj5cbiAgICAgICAgICAgINCS0L7QudGC0LhcbiAgICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG48L2Zvcm0+XG4iXX0=