valtech-components 2.0.595 → 2.0.597

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 (31) hide show
  1. package/esm2022/lib/components/molecules/content-reaction/content-reaction.component.mjs +206 -0
  2. package/esm2022/lib/components/molecules/content-reaction/types.mjs +2 -0
  3. package/esm2022/lib/components/molecules/docs-section/docs-section.component.mjs +85 -0
  4. package/esm2022/lib/components/molecules/docs-section/types.mjs +2 -0
  5. package/esm2022/lib/components/molecules/feedback-form/feedback-form.component.mjs +354 -0
  6. package/esm2022/lib/components/molecules/feedback-form/types.mjs +2 -0
  7. package/esm2022/lib/components/templates/docs-page/docs-page.component.mjs +188 -0
  8. package/esm2022/lib/components/templates/docs-page/types.mjs +2 -0
  9. package/esm2022/lib/services/ads/types.mjs +1 -1
  10. package/esm2022/lib/services/feedback/config.mjs +49 -0
  11. package/esm2022/lib/services/feedback/feedback.service.mjs +264 -0
  12. package/esm2022/lib/services/feedback/index.mjs +44 -0
  13. package/esm2022/lib/services/feedback/types.mjs +30 -0
  14. package/esm2022/public-api.mjs +10 -5
  15. package/fesm2022/valtech-components.mjs +1184 -4
  16. package/fesm2022/valtech-components.mjs.map +1 -1
  17. package/lib/components/molecules/content-reaction/content-reaction.component.d.ts +57 -0
  18. package/lib/components/molecules/content-reaction/types.d.ts +71 -0
  19. package/lib/components/molecules/docs-section/docs-section.component.d.ts +29 -0
  20. package/lib/components/molecules/docs-section/types.d.ts +27 -0
  21. package/lib/components/molecules/feedback-form/feedback-form.component.d.ts +58 -0
  22. package/lib/components/molecules/feedback-form/types.d.ts +54 -0
  23. package/lib/components/templates/docs-page/docs-page.component.d.ts +54 -0
  24. package/lib/components/templates/docs-page/types.d.ts +69 -0
  25. package/lib/services/ads/types.d.ts +10 -0
  26. package/lib/services/feedback/config.d.ts +35 -0
  27. package/lib/services/feedback/feedback.service.d.ts +115 -0
  28. package/lib/services/feedback/index.d.ts +40 -0
  29. package/lib/services/feedback/types.d.ts +173 -0
  30. package/package.json +1 -1
  31. package/public-api.d.ts +9 -0
@@ -0,0 +1,206 @@
1
+ import { Component, inject, Input, Output, EventEmitter, signal, computed, } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { FormsModule } from '@angular/forms';
4
+ import { IonButton, IonSpinner, IonTextarea, } from '@ionic/angular/standalone';
5
+ import { FeedbackService } from '../../../services/feedback/feedback.service';
6
+ import { ToastService } from '../../../services/toast.service';
7
+ import { I18nService } from '../../../services/i18n';
8
+ import * as i0 from "@angular/core";
9
+ /**
10
+ * Componente para reacciones de contenido con emojis.
11
+ *
12
+ * @example
13
+ * ```html
14
+ * <val-content-reaction
15
+ * [props]="{
16
+ * entityRef: { entityType: 'article', entityId: 'art-123' },
17
+ * question: '¿Te fue útil este artículo?'
18
+ * }"
19
+ * (reactionSubmit)="onReactionSubmit($event)"
20
+ * />
21
+ * ```
22
+ */
23
+ export class ContentReactionComponent {
24
+ constructor() {
25
+ this.feedbackService = inject(FeedbackService);
26
+ this.toast = inject(ToastService);
27
+ this.i18n = inject(I18nService);
28
+ this.props = {};
29
+ this.reactionSubmit = new EventEmitter();
30
+ this.reactionChange = new EventEmitter();
31
+ // Estado reactivo
32
+ this.state = signal({
33
+ selectedValue: null,
34
+ comment: '',
35
+ isLoading: false,
36
+ isSubmitted: false,
37
+ hadPreviousReaction: false,
38
+ error: null,
39
+ });
40
+ // Valores por defecto
41
+ this.defaultEmojis = ['😞', '😐', '😊'];
42
+ this.defaultLabels = [
43
+ 'No me ayudó',
44
+ 'Regular',
45
+ 'Muy útil',
46
+ ];
47
+ this.reactionValues = ['negative', 'neutral', 'positive'];
48
+ // Computed properties
49
+ this.resolvedProps = computed(() => ({
50
+ entityRef: this.props.entityRef,
51
+ question: this.props.question || this.t('question'),
52
+ showComment: this.props.showComment ?? true,
53
+ commentPlaceholder: this.props.commentPlaceholder || this.t('commentPlaceholder'),
54
+ maxCommentLength: this.props.maxCommentLength ?? 500,
55
+ emojis: this.props.emojis || this.defaultEmojis,
56
+ emojiLabels: this.props.emojiLabels || this.defaultLabels,
57
+ showThankYou: this.props.showThankYou ?? true,
58
+ thankYouMessage: this.props.thankYouMessage || this.t('thankYou'),
59
+ disabled: this.props.disabled ?? false,
60
+ readonly: this.props.readonly ?? false,
61
+ }));
62
+ this.showCommentField = computed(() => this.state().selectedValue !== null && this.resolvedProps().showComment);
63
+ this.canSubmit = computed(() => this.state().selectedValue !== null && !this.state().isLoading);
64
+ }
65
+ ngOnInit() {
66
+ this.loadPreviousReaction();
67
+ }
68
+ ngOnChanges(changes) {
69
+ if (changes['props'] && !changes['props'].firstChange) {
70
+ this.loadPreviousReaction();
71
+ }
72
+ }
73
+ async loadPreviousReaction() {
74
+ if (!this.props.entityRef)
75
+ return;
76
+ // Si hay initialValue, usarlo directamente sin consultar
77
+ if (this.props.initialValue) {
78
+ this.state.update((s) => ({
79
+ ...s,
80
+ selectedValue: this.props.initialValue,
81
+ hadPreviousReaction: true,
82
+ isLoading: false,
83
+ isSubmitted: true,
84
+ }));
85
+ return;
86
+ }
87
+ // Si skipInitialCheck está activo, no consultar
88
+ if (this.props.skipInitialCheck) {
89
+ return;
90
+ }
91
+ this.state.update((s) => ({ ...s, isLoading: true, error: null }));
92
+ try {
93
+ const check = await this.feedbackService.checkFeedback(this.props.entityRef.entityType, this.props.entityRef.entityId);
94
+ if (check.hasFeedback && check.reactionValue) {
95
+ this.state.update((s) => ({
96
+ ...s,
97
+ selectedValue: check.reactionValue,
98
+ hadPreviousReaction: true,
99
+ isLoading: false,
100
+ isSubmitted: true,
101
+ }));
102
+ }
103
+ else {
104
+ this.state.update((s) => ({ ...s, isLoading: false }));
105
+ }
106
+ }
107
+ catch (error) {
108
+ console.error('Error loading previous reaction:', error);
109
+ this.state.update((s) => ({ ...s, isLoading: false }));
110
+ }
111
+ }
112
+ selectReaction(value) {
113
+ if (this.resolvedProps().disabled || this.resolvedProps().readonly)
114
+ return;
115
+ const previousValue = this.state().selectedValue;
116
+ this.state.update((s) => ({
117
+ ...s,
118
+ selectedValue: value,
119
+ isSubmitted: false,
120
+ error: null,
121
+ }));
122
+ this.reactionChange.emit({ value, previousValue });
123
+ }
124
+ async submitReaction() {
125
+ const currentState = this.state();
126
+ const props = this.resolvedProps();
127
+ if (!currentState.selectedValue || props.disabled)
128
+ return;
129
+ this.state.update((s) => ({ ...s, isLoading: true, error: null }));
130
+ try {
131
+ await this.feedbackService.createReaction(props.entityRef, currentState.selectedValue, currentState.comment || undefined);
132
+ this.state.update((s) => ({
133
+ ...s,
134
+ isLoading: false,
135
+ isSubmitted: true,
136
+ hadPreviousReaction: true,
137
+ }));
138
+ this.reactionSubmit.emit({
139
+ value: currentState.selectedValue,
140
+ comment: currentState.comment || undefined,
141
+ entityRef: props.entityRef,
142
+ isUpdate: currentState.hadPreviousReaction,
143
+ });
144
+ if (props.showThankYou) {
145
+ this.toast.show({
146
+ message: props.thankYouMessage,
147
+ duration: 2000,
148
+ position: 'bottom',
149
+ color: 'success',
150
+ });
151
+ }
152
+ }
153
+ catch (error) {
154
+ console.error('Error submitting reaction:', error);
155
+ this.state.update((s) => ({
156
+ ...s,
157
+ isLoading: false,
158
+ error: this.t('errorSubmitting'),
159
+ }));
160
+ this.toast.show({
161
+ message: this.t('errorSubmitting'),
162
+ duration: 3000,
163
+ position: 'bottom',
164
+ color: 'danger',
165
+ });
166
+ }
167
+ }
168
+ updateComment(event) {
169
+ const value = event.detail.value || '';
170
+ this.state.update((s) => ({ ...s, comment: value }));
171
+ }
172
+ getEmoji(index) {
173
+ return this.resolvedProps().emojis[index];
174
+ }
175
+ getEmojiLabel(index) {
176
+ return this.resolvedProps().emojiLabels[index];
177
+ }
178
+ isSelected(value) {
179
+ return this.state().selectedValue === value;
180
+ }
181
+ t(key) {
182
+ const translations = {
183
+ question: '¿Te resultó útil este contenido?',
184
+ commentPlaceholder: 'Cuéntanos más (opcional)...',
185
+ submit: 'Enviar opinión',
186
+ update: 'Actualizar opinión',
187
+ thankYou: '¡Gracias por tu opinión!',
188
+ submitted: 'Tu opinión ha sido registrada',
189
+ errorSubmitting: 'Error al enviar. Intenta de nuevo.',
190
+ };
191
+ return this.i18n.t(key, 'ContentReaction') || translations[key] || key;
192
+ }
193
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ContentReactionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
194
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ContentReactionComponent, isStandalone: true, selector: "val-content-reaction", inputs: { props: "props" }, outputs: { reactionSubmit: "reactionSubmit", reactionChange: "reactionChange" }, usesOnChanges: true, ngImport: i0, template: "<div\n class=\"content-reaction\"\n [class.disabled]=\"resolvedProps().disabled\"\n [class.readonly]=\"resolvedProps().readonly\"\n>\n <!-- Loading inicial -->\n @if (state().isLoading && !state().selectedValue) {\n <div class=\"loading-container\">\n <ion-spinner name=\"crescent\"></ion-spinner>\n </div>\n } @else {\n <!-- Pregunta -->\n <p class=\"question\">{{ resolvedProps().question }}</p>\n\n <!-- Emojis -->\n <div class=\"emoji-container\">\n @for (value of reactionValues; track value; let i = $index) {\n <button\n type=\"button\"\n class=\"emoji-button\"\n [class.selected]=\"isSelected(value)\"\n [class.negative]=\"value === 'negative' && isSelected(value)\"\n [class.neutral]=\"value === 'neutral' && isSelected(value)\"\n [class.positive]=\"value === 'positive' && isSelected(value)\"\n [attr.aria-label]=\"getEmojiLabel(i)\"\n [attr.aria-pressed]=\"isSelected(value)\"\n [disabled]=\"resolvedProps().disabled || resolvedProps().readonly\"\n (click)=\"selectReaction(value)\"\n >\n <span class=\"emoji\">{{ getEmoji(i) }}</span>\n </button>\n }\n </div>\n\n <!-- Campo de comentario (solo si hay selecci\u00F3n) -->\n @if (showCommentField()) {\n <div class=\"comment-section\">\n <ion-textarea\n [value]=\"state().comment\"\n [placeholder]=\"resolvedProps().commentPlaceholder\"\n [maxlength]=\"resolvedProps().maxCommentLength\"\n [disabled]=\"resolvedProps().disabled\"\n [rows]=\"3\"\n class=\"comment-textarea\"\n (ionInput)=\"updateComment($event)\"\n ></ion-textarea>\n <span class=\"char-count\">\n {{ state().comment.length }}/{{ resolvedProps().maxCommentLength }}\n </span>\n </div>\n }\n\n <!-- Bot\u00F3n de env\u00EDo -->\n @if (state().selectedValue && !state().isSubmitted) {\n <ion-button\n expand=\"block\"\n [disabled]=\"!canSubmit()\"\n (click)=\"submitReaction()\"\n class=\"submit-button\"\n >\n @if (state().isLoading) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else {\n {{ state().hadPreviousReaction ? t('update') : t('submit') }}\n }\n </ion-button>\n }\n\n <!-- Mensaje de confirmaci\u00F3n -->\n @if (state().isSubmitted) {\n <p class=\"submitted-message\">\n {{ t('submitted') }}\n </p>\n }\n\n <!-- Error -->\n @if (state().error) {\n <p class=\"error-message\">{{ state().error }}</p>\n }\n }\n</div>\n", styles: [":host{display:block}.content-reaction{padding:16px;text-align:center}.content-reaction.disabled{opacity:.6;pointer-events:none}.content-reaction.readonly{pointer-events:none}.question{font-size:16px;font-weight:500;color:var(--ion-color-dark);margin:0 0 16px}.emoji-container{display:flex;justify-content:center;gap:24px;margin-bottom:20px}.emoji-button{background:transparent;border:2px solid var(--ion-color-light-shade);border-radius:50%;width:64px;height:64px;cursor:pointer;transition:all .3s cubic-bezier(.4,0,.2,1);display:flex;align-items:center;justify-content:center;padding:0}.emoji-button .emoji{font-size:32px;transition:transform .3s cubic-bezier(.4,0,.2,1);line-height:1}.emoji-button:hover:not(:disabled){transform:scale(1.1);border-color:var(--ion-color-medium)}.emoji-button:focus{outline:2px solid var(--ion-color-primary);outline-offset:2px}.emoji-button.selected{transform:scale(1.2)}.emoji-button.selected .emoji{transform:scale(1.1)}.emoji-button.selected.negative{border-color:var(--ion-color-danger);background:var(--ion-color-danger-tint);box-shadow:0 4px 12px rgba(var(--ion-color-danger-rgb),.3)}.emoji-button.selected.neutral{border-color:var(--ion-color-warning);background:var(--ion-color-warning-tint);box-shadow:0 4px 12px rgba(var(--ion-color-warning-rgb),.3)}.emoji-button.selected.positive{border-color:var(--ion-color-success);background:var(--ion-color-success-tint);box-shadow:0 4px 12px rgba(var(--ion-color-success-rgb),.3)}.emoji-button:disabled{cursor:not-allowed;opacity:.5}.comment-section{margin-top:16px;animation:slideIn .3s ease-out}.comment-section .comment-textarea{--background: var(--ion-color-light);--border-radius: 8px;--padding-start: 12px;--padding-end: 12px;width:100%}.comment-section .char-count{display:block;text-align:right;font-size:12px;color:var(--ion-color-medium);margin-top:4px}.submit-button{margin-top:16px;--border-radius: 8px}.submitted-message{margin-top:16px;color:var(--ion-color-success);font-weight:500;animation:fadeIn .3s ease-out}.error-message{margin-top:8px;color:var(--ion-color-danger);font-size:14px}.loading-container{display:flex;justify-content:center;padding:20px}@keyframes slideIn{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "component", type: IonTextarea, selector: "ion-textarea", inputs: ["autoGrow", "autocapitalize", "autofocus", "clearOnEdit", "color", "cols", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "maxlength", "minlength", "mode", "name", "placeholder", "readonly", "required", "rows", "shape", "spellcheck", "value", "wrap"] }] }); }
195
+ }
196
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ContentReactionComponent, decorators: [{
197
+ type: Component,
198
+ args: [{ selector: 'val-content-reaction', standalone: true, imports: [CommonModule, FormsModule, IonButton, IonSpinner, IonTextarea], template: "<div\n class=\"content-reaction\"\n [class.disabled]=\"resolvedProps().disabled\"\n [class.readonly]=\"resolvedProps().readonly\"\n>\n <!-- Loading inicial -->\n @if (state().isLoading && !state().selectedValue) {\n <div class=\"loading-container\">\n <ion-spinner name=\"crescent\"></ion-spinner>\n </div>\n } @else {\n <!-- Pregunta -->\n <p class=\"question\">{{ resolvedProps().question }}</p>\n\n <!-- Emojis -->\n <div class=\"emoji-container\">\n @for (value of reactionValues; track value; let i = $index) {\n <button\n type=\"button\"\n class=\"emoji-button\"\n [class.selected]=\"isSelected(value)\"\n [class.negative]=\"value === 'negative' && isSelected(value)\"\n [class.neutral]=\"value === 'neutral' && isSelected(value)\"\n [class.positive]=\"value === 'positive' && isSelected(value)\"\n [attr.aria-label]=\"getEmojiLabel(i)\"\n [attr.aria-pressed]=\"isSelected(value)\"\n [disabled]=\"resolvedProps().disabled || resolvedProps().readonly\"\n (click)=\"selectReaction(value)\"\n >\n <span class=\"emoji\">{{ getEmoji(i) }}</span>\n </button>\n }\n </div>\n\n <!-- Campo de comentario (solo si hay selecci\u00F3n) -->\n @if (showCommentField()) {\n <div class=\"comment-section\">\n <ion-textarea\n [value]=\"state().comment\"\n [placeholder]=\"resolvedProps().commentPlaceholder\"\n [maxlength]=\"resolvedProps().maxCommentLength\"\n [disabled]=\"resolvedProps().disabled\"\n [rows]=\"3\"\n class=\"comment-textarea\"\n (ionInput)=\"updateComment($event)\"\n ></ion-textarea>\n <span class=\"char-count\">\n {{ state().comment.length }}/{{ resolvedProps().maxCommentLength }}\n </span>\n </div>\n }\n\n <!-- Bot\u00F3n de env\u00EDo -->\n @if (state().selectedValue && !state().isSubmitted) {\n <ion-button\n expand=\"block\"\n [disabled]=\"!canSubmit()\"\n (click)=\"submitReaction()\"\n class=\"submit-button\"\n >\n @if (state().isLoading) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else {\n {{ state().hadPreviousReaction ? t('update') : t('submit') }}\n }\n </ion-button>\n }\n\n <!-- Mensaje de confirmaci\u00F3n -->\n @if (state().isSubmitted) {\n <p class=\"submitted-message\">\n {{ t('submitted') }}\n </p>\n }\n\n <!-- Error -->\n @if (state().error) {\n <p class=\"error-message\">{{ state().error }}</p>\n }\n }\n</div>\n", styles: [":host{display:block}.content-reaction{padding:16px;text-align:center}.content-reaction.disabled{opacity:.6;pointer-events:none}.content-reaction.readonly{pointer-events:none}.question{font-size:16px;font-weight:500;color:var(--ion-color-dark);margin:0 0 16px}.emoji-container{display:flex;justify-content:center;gap:24px;margin-bottom:20px}.emoji-button{background:transparent;border:2px solid var(--ion-color-light-shade);border-radius:50%;width:64px;height:64px;cursor:pointer;transition:all .3s cubic-bezier(.4,0,.2,1);display:flex;align-items:center;justify-content:center;padding:0}.emoji-button .emoji{font-size:32px;transition:transform .3s cubic-bezier(.4,0,.2,1);line-height:1}.emoji-button:hover:not(:disabled){transform:scale(1.1);border-color:var(--ion-color-medium)}.emoji-button:focus{outline:2px solid var(--ion-color-primary);outline-offset:2px}.emoji-button.selected{transform:scale(1.2)}.emoji-button.selected .emoji{transform:scale(1.1)}.emoji-button.selected.negative{border-color:var(--ion-color-danger);background:var(--ion-color-danger-tint);box-shadow:0 4px 12px rgba(var(--ion-color-danger-rgb),.3)}.emoji-button.selected.neutral{border-color:var(--ion-color-warning);background:var(--ion-color-warning-tint);box-shadow:0 4px 12px rgba(var(--ion-color-warning-rgb),.3)}.emoji-button.selected.positive{border-color:var(--ion-color-success);background:var(--ion-color-success-tint);box-shadow:0 4px 12px rgba(var(--ion-color-success-rgb),.3)}.emoji-button:disabled{cursor:not-allowed;opacity:.5}.comment-section{margin-top:16px;animation:slideIn .3s ease-out}.comment-section .comment-textarea{--background: var(--ion-color-light);--border-radius: 8px;--padding-start: 12px;--padding-end: 12px;width:100%}.comment-section .char-count{display:block;text-align:right;font-size:12px;color:var(--ion-color-medium);margin-top:4px}.submit-button{margin-top:16px;--border-radius: 8px}.submitted-message{margin-top:16px;color:var(--ion-color-success);font-weight:500;animation:fadeIn .3s ease-out}.error-message{margin-top:8px;color:var(--ion-color-danger);font-size:14px}.loading-container{display:flex;justify-content:center;padding:20px}@keyframes slideIn{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}\n"] }]
199
+ }], propDecorators: { props: [{
200
+ type: Input
201
+ }], reactionSubmit: [{
202
+ type: Output
203
+ }], reactionChange: [{
204
+ type: Output
205
+ }] } });
206
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGVudC1yZWFjdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvbW9sZWN1bGVzL2NvbnRlbnQtcmVhY3Rpb24vY29udGVudC1yZWFjdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvbW9sZWN1bGVzL2NvbnRlbnQtcmVhY3Rpb24vY29udGVudC1yZWFjdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFJWixNQUFNLEVBQ04sUUFBUSxHQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUNMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsV0FBVyxHQUNaLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBRTlFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUMvRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7O0FBUXJEOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFRSCxNQUFNLE9BQU8sd0JBQXdCO0lBUHJDO1FBUVUsb0JBQWUsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDMUMsVUFBSyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM3QixTQUFJLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRTFCLFVBQUssR0FBcUMsRUFBRSxDQUFDO1FBQzVDLG1CQUFjLEdBQUcs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WUFBWSxHQUEyQjtZQUMzQyxRQUFRLEVBQUUsa0NBQWtDO1lBQzVDLGtCQUFrQixFQUFFLDZCQUE2QjtZQUNqRCxNQUFNLEVBQUUsZ0JBQWdCO1lBQ3hCLE1BQU0sRUFBRSxvQkFBb0I7WUFDNUIsUUFBUSxFQUFFLDBCQUEwQjtZQUNwQyxTQUFTLEVBQUUsK0JBQStCO1lBQzFDLGVBQWUsRUFBRSxvQ0FBb0M7U0FDdEQsQ0FBQztRQUNGLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLGlCQUFpQixDQUFDLElBQUksWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQztJQUN6RSxDQUFDOytHQTVNVSx3QkFBd0I7bUdBQXhCLHdCQUF3QixrTkNuRHJDLHNuRkFpRkEscXpFRGxDWSxZQUFZLDhCQUFFLFdBQVcsK0JBQUUsU0FBUyxvUEFBRSxVQUFVLHlHQUFFLFdBQVc7OzRGQUk1RCx3QkFBd0I7a0JBUHBDLFNBQVM7K0JBQ0Usc0JBQXNCLGNBQ3BCLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxXQUFXLENBQUM7OEJBUy9ELEtBQUs7c0JBQWIsS0FBSztnQkFDSSxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIGluamVjdCxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBPbkluaXQsXG4gIE9uQ2hhbmdlcyxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgc2lnbmFsLFxuICBjb21wdXRlZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge1xuICBJb25CdXR0b24sXG4gIElvblNwaW5uZXIsXG4gIElvblRleHRhcmVhLFxufSBmcm9tICdAaW9uaWMvYW5ndWxhci9zdGFuZGFsb25lJztcbmltcG9ydCB7IEZlZWRiYWNrU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2ZlZWRiYWNrL2ZlZWRiYWNrLnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVhY3Rpb25WYWx1ZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2ZlZWRiYWNrL3R5cGVzJztcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3RvYXN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9pMThuJztcbmltcG9ydCB7XG4gIENvbnRlbnRSZWFjdGlvbk1ldGFkYXRhLFxuICBDb250ZW50UmVhY3Rpb25TdGF0ZSxcbiAgUmVhY3Rpb25TdWJtaXRFdmVudCxcbiAgUmVhY3Rpb25DaGFuZ2VFdmVudCxcbn0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogQ29tcG9uZW50ZSBwYXJhIHJlYWNjaW9uZXMgZGUgY29udGVuaWRvIGNvbiBlbW9qaXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGh0bWxcbiAqIDx2YWwtY29udGVudC1yZWFjdGlvblxuICogICBbcHJvcHNdPVwie1xuICogICAgIGVudGl0eVJlZjogeyBlbnRpdHlUeXBlOiAnYXJ0aWNsZScsIGVudGl0eUlkOiAnYXJ0LTEyMycgfSxcbiAqICAgICBxdWVzdGlvbjogJ8K/VGUgZnVlIMO6dGlsIGVzdGUgYXJ0w61jdWxvPydcbiAqICAgfVwiXG4gKiAgIChyZWFjdGlvblN1Ym1pdCk9XCJvblJlYWN0aW9uU3VibWl0KCRldmVudClcIlxuICogLz5cbiAqIGBgYFxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWwtY29udGVudC1yZWFjdGlvbicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlLCBJb25CdXR0b24sIElvblNwaW5uZXIsIElvblRleHRhcmVhXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2NvbnRlbnQtcmVhY3Rpb24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jb250ZW50LXJlYWN0aW9uLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIENvbnRlbnRSZWFjdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgcHJpdmF0ZSBmZWVkYmFja1NlcnZpY2UgPSBpbmplY3QoRmVlZGJhY2tTZXJ2aWNlKTtcbiAgcHJpdmF0ZSB0b2FzdCA9IGluamVjdChUb2FzdFNlcnZpY2UpO1xuICBwcml2YXRlIGkxOG4gPSBpbmplY3QoSTE4blNlcnZpY2UpO1xuXG4gIEBJbnB1dCgpIHByb3BzOiBQYXJ0aWFsPENvbnRlbnRSZWFjdGlvbk1ldGFkYXRhPiA9IHt9O1xuICBAT3V0cHV0KCkgcmVhY3Rpb25TdWJtaXQgPSBuZXcgRXZlbnRFbWl0dGVyPFJlYWN0aW9uU3VibWl0RXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSByZWFjdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8UmVhY3Rpb25DaGFuZ2VFdmVudD4oKTtcblxuICAvLyBFc3RhZG8gcmVhY3Rpdm9cbiAgc3RhdGUgPSBzaWduYWw8Q29udGVudFJlYWN0aW9uU3RhdGU+KHtcbiAgICBzZWxlY3RlZFZhbHVlOiBudWxsLFxuICAgIGNvbW1lbnQ6ICcnLFxuICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgaXNTdWJtaXR0ZWQ6IGZhbHNlLFxuICAgIGhhZFByZXZpb3VzUmVhY3Rpb246IGZhbHNlLFxuICAgIGVycm9yOiBudWxsLFxuICB9KTtcblxuICAvLyBWYWxvcmVzIHBvciBkZWZlY3RvXG4gIHJlYWRvbmx5IGRlZmF1bHRFbW9qaXM6IFtzdHJpbmcsIHN0cmluZywgc3RyaW5nXSA9IFsn8J+YnicsICfwn5iQJywgJ/CfmIonXTtcbiAgcmVhZG9ubHkgZGVmYXVsdExhYmVsczogW3N0cmluZywgc3RyaW5nLCBzdHJpbmddID0gW1xuICAgICdObyBtZSBheXVkw7MnLFxuICAgICdSZWd1bGFyJyxcbiAgICAnTXV5IMO6dGlsJyxcbiAgXTtcbiAgcmVhZG9ubHkgcmVhY3Rpb25WYWx1ZXM6IFJlYWN0aW9uVmFsdWVbXSA9IFsnbmVnYXRpdmUnLCAnbmV1dHJhbCcsICdwb3NpdGl2ZSddO1xuXG4gIC8vIENvbXB1dGVkIHByb3BlcnRpZXNcbiAgcmVzb2x2ZWRQcm9wcyA9IGNvbXB1dGVkKCgpID0+ICh7XG4gICAgZW50aXR5UmVmOiB0aGlzLnByb3BzLmVudGl0eVJlZiEsXG4gICAgcXVlc3Rpb246IHRoaXMucHJvcHMucXVlc3Rpb24gfHwgdGhpcy50KCdxdWVzdGlvbicpLFxuICAgIHNob3dDb21tZW50OiB0aGlzLnByb3BzLnNob3dDb21tZW50ID8/IHRydWUsXG4gICAgY29tbWVudFBsYWNlaG9sZGVyOiB0aGlzLnByb3BzLmNvbW1lbnRQbGFjZWhvbGRlciB8fCB0aGlzLnQoJ2NvbW1lbnRQbGFjZWhvbGRlcicpLFxuICAgIG1heENvbW1lbnRMZW5ndGg6IHRoaXMucHJvcHMubWF4Q29tbWVudExlbmd0aCA/PyA1MDAsXG4gICAgZW1vamlzOiB0aGlzLnByb3BzLmVtb2ppcyB8fCB0aGlzLmRlZmF1bHRFbW9qaXMsXG4gICAgZW1vamlMYWJlbHM6IHRoaXMucHJvcHMuZW1vamlMYWJlbHMgfHwgdGhpcy5kZWZhdWx0TGFiZWxzLFxuICAgIHNob3dUaGFua1lvdTogdGhpcy5wcm9wcy5zaG93VGhhbmtZb3UgPz8gdHJ1ZSxcbiAgICB0aGFua1lvdU1lc3NhZ2U6IHRoaXMucHJvcHMudGhhbmtZb3VNZXNzYWdlIHx8IHRoaXMudCgndGhhbmtZb3UnKSxcbiAgICBkaXNhYmxlZDogdGhpcy5wcm9wcy5kaXNhYmxlZCA/PyBmYWxzZSxcbiAgICByZWFkb25seTogdGhpcy5wcm9wcy5yZWFkb25seSA/PyBmYWxzZSxcbiAgfSkpO1xuXG4gIHNob3dDb21tZW50RmllbGQgPSBjb21wdXRlZChcbiAgICAoKSA9PlxuICAgICAgdGhpcy5zdGF0ZSgpLnNlbGVjdGVkVmFsdWUgIT09IG51bGwgJiYgdGhpcy5yZXNvbHZlZFByb3BzKCkuc2hvd0NvbW1lbnRcbiAgKTtcblxuICBjYW5TdWJtaXQgPSBjb21wdXRlZChcbiAgICAoKSA9PiB0aGlzLnN0YXRlKCkuc2VsZWN0ZWRWYWx1ZSAhPT0gbnVsbCAmJiAhdGhpcy5zdGF0ZSgpLmlzTG9hZGluZ1xuICApO1xuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMubG9hZFByZXZpb3VzUmVhY3Rpb24oKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAoY2hhbmdlc1sncHJvcHMnXSAmJiAhY2hhbmdlc1sncHJvcHMnXS5maXJzdENoYW5nZSkge1xuICAgICAgdGhpcy5sb2FkUHJldmlvdXNSZWFjdGlvbigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZFByZXZpb3VzUmVhY3Rpb24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLnByb3BzLmVudGl0eVJlZikgcmV0dXJuO1xuXG4gICAgLy8gU2kgaGF5IGluaXRpYWxWYWx1ZSwgdXNhcmxvIGRpcmVjdGFtZW50ZSBzaW4gY29uc3VsdGFyXG4gICAgaWYgKHRoaXMucHJvcHMuaW5pdGlhbFZhbHVlKSB7XG4gICAgICB0aGlzLnN0YXRlLnVwZGF0ZSgocykgPT4gKHtcbiAgICAgICAgLi4ucyxcbiAgICAgICAgc2VsZWN0ZWRWYWx1ZTogdGhpcy5wcm9wcy5pbml0aWFsVmFsdWUhLFxuICAgICAgICBoYWRQcmV2aW91c1JlYWN0aW9uOiB0cnVlLFxuICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgICBpc1N1Ym1pdHRlZDogdHJ1ZSxcbiAgICAgIH0pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTaSBza2lwSW5pdGlhbENoZWNrIGVzdMOhIGFjdGl2bywgbm8gY29uc3VsdGFyXG4gICAgaWYgKHRoaXMucHJvcHMuc2tpcEluaXRpYWxDaGVjaykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc3RhdGUudXBkYXRlKChzKSA9PiAoeyAuLi5zLCBpc0xvYWRpbmc6IHRydWUsIGVycm9yOiBudWxsIH0pKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBjaGVjayA9IGF3YWl0IHRoaXMuZmVlZGJhY2tTZXJ2aWNlLmNoZWNrRmVlZGJhY2soXG4gICAgICAgIHRoaXMucHJvcHMuZW50aXR5UmVmLmVudGl0eVR5cGUsXG4gICAgICAgIHRoaXMucHJvcHMuZW50aXR5UmVmLmVudGl0eUlkXG4gICAgICApO1xuXG4gICAgICBpZiAoY2hlY2suaGFzRmVlZGJhY2sgJiYgY2hlY2sucmVhY3Rpb25WYWx1ZSkge1xuICAgICAgICB0aGlzLnN0YXRlLnVwZGF0ZSgocykgPT4gKHtcbiAgICAgICAgICAuLi5zLFxuICAgICAgICAgIHNlbGVjdGVkVmFsdWU6IGNoZWNrLnJlYWN0aW9uVmFsdWUhLFxuICAgICAgICAgIGhhZFByZXZpb3VzUmVhY3Rpb246IHRydWUsXG4gICAgICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICBpc1N1Ym1pdHRlZDogdHJ1ZSxcbiAgICAgICAgfSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdGF0ZS51cGRhdGUoKHMpID0+ICh7IC4uLnMsIGlzTG9hZGluZzogZmFsc2UgfSkpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBsb2FkaW5nIHByZXZpb3VzIHJlYWN0aW9uOicsIGVycm9yKTtcbiAgICAgIHRoaXMuc3RhdGUudXBkYXRlKChzKSA9PiAoeyAuLi5zLCBpc0xvYWRpbmc6IGZhbHNlIH0pKTtcbiAgICB9XG4gIH1cblxuICBzZWxlY3RSZWFjdGlvbih2YWx1ZTogUmVhY3Rpb25WYWx1ZSk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlc29sdmVkUHJvcHMoKS5kaXNhYmxlZCB8fCB0aGlzLnJlc29sdmVkUHJvcHMoKS5yZWFkb25seSkgcmV0dXJuO1xuXG4gICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IHRoaXMuc3RhdGUoKS5zZWxlY3RlZFZhbHVlO1xuXG4gICAgdGhpcy5zdGF0ZS51cGRhdGUoKHMpID0+ICh7XG4gICAgICAuLi5zLFxuICAgICAgc2VsZWN0ZWRWYWx1ZTogdmFsdWUsXG4gICAgICBpc1N1Ym1pdHRlZDogZmFsc2UsXG4gICAgICBlcnJvcjogbnVsbCxcbiAgICB9KSk7XG5cbiAgICB0aGlzLnJlYWN0aW9uQ2hhbmdlLmVtaXQoeyB2YWx1ZSwgcHJldmlvdXNWYWx1ZSB9KTtcbiAgfVxuXG4gIGFzeW5jIHN1Ym1pdFJlYWN0aW9uKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IHRoaXMuc3RhdGUoKTtcbiAgICBjb25zdCBwcm9wcyA9IHRoaXMucmVzb2x2ZWRQcm9wcygpO1xuXG4gICAgaWYgKCFjdXJyZW50U3RhdGUuc2VsZWN0ZWRWYWx1ZSB8fCBwcm9wcy5kaXNhYmxlZCkgcmV0dXJuO1xuXG4gICAgdGhpcy5zdGF0ZS51cGRhdGUoKHMpID0+ICh7IC4uLnMsIGlzTG9hZGluZzogdHJ1ZSwgZXJyb3I6IG51bGwgfSkpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuZmVlZGJhY2tTZXJ2aWNlLmNyZWF0ZVJlYWN0aW9uKFxuICAgICAgICBwcm9wcy5lbnRpdHlSZWYsXG4gICAgICAgIGN1cnJlbnRTdGF0ZS5zZWxlY3RlZFZhbHVlLFxuICAgICAgICBjdXJyZW50U3RhdGUuY29tbWVudCB8fCB1bmRlZmluZWRcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuc3RhdGUudXBkYXRlKChzKSA9PiAoe1xuICAgICAgICAuLi5zLFxuICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgICBpc1N1Ym1pdHRlZDogdHJ1ZSxcbiAgICAgICAgaGFkUHJldmlvdXNSZWFjdGlvbjogdHJ1ZSxcbiAgICAgIH0pKTtcblxuICAgICAgdGhpcy5yZWFjdGlvblN1Ym1pdC5lbWl0KHtcbiAgICAgICAgdmFsdWU6IGN1cnJlbnRTdGF0ZS5zZWxlY3RlZFZhbHVlLFxuICAgICAgICBjb21tZW50OiBjdXJyZW50U3RhdGUuY29tbWVudCB8fCB1bmRlZmluZWQsXG4gICAgICAgIGVudGl0eVJlZjogcHJvcHMuZW50aXR5UmVmLFxuICAgICAgICBpc1VwZGF0ZTogY3VycmVudFN0YXRlLmhhZFByZXZpb3VzUmVhY3Rpb24sXG4gICAgICB9KTtcblxuICAgICAgaWYgKHByb3BzLnNob3dUaGFua1lvdSkge1xuICAgICAgICB0aGlzLnRvYXN0LnNob3coe1xuICAgICAgICAgIG1lc3NhZ2U6IHByb3BzLnRoYW5rWW91TWVzc2FnZSxcbiAgICAgICAgICBkdXJhdGlvbjogMjAwMCxcbiAgICAgICAgICBwb3NpdGlvbjogJ2JvdHRvbScsXG4gICAgICAgICAgY29sb3I6ICdzdWNjZXNzJyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHN1Ym1pdHRpbmcgcmVhY3Rpb246JywgZXJyb3IpO1xuICAgICAgdGhpcy5zdGF0ZS51cGRhdGUoKHMpID0+ICh7XG4gICAgICAgIC4uLnMsXG4gICAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICAgIGVycm9yOiB0aGlzLnQoJ2Vycm9yU3VibWl0dGluZycpLFxuICAgICAgfSkpO1xuXG4gICAgICB0aGlzLnRvYXN0LnNob3coe1xuICAgICAgICBtZXNzYWdlOiB0aGlzLnQoJ2Vycm9yU3VibWl0dGluZycpLFxuICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgcG9zaXRpb246ICdib3R0b20nLFxuICAgICAgICBjb2xvcjogJ2RhbmdlcicsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVDb21tZW50KGV2ZW50OiBDdXN0b21FdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHZhbHVlID0gZXZlbnQuZGV0YWlsLnZhbHVlIHx8ICcnO1xuICAgIHRoaXMuc3RhdGUudXBkYXRlKChzKSA9PiAoeyAuLi5zLCBjb21tZW50OiB2YWx1ZSB9KSk7XG4gIH1cblxuICBnZXRFbW9qaShpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlZFByb3BzKCkuZW1vamlzW2luZGV4XTtcbiAgfVxuXG4gIGdldEVtb2ppTGFiZWwoaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZWRQcm9wcygpLmVtb2ppTGFiZWxzW2luZGV4XTtcbiAgfVxuXG4gIGlzU2VsZWN0ZWQodmFsdWU6IFJlYWN0aW9uVmFsdWUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZSgpLnNlbGVjdGVkVmFsdWUgPT09IHZhbHVlO1xuICB9XG5cbiAgdChrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgdHJhbnNsYXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgcXVlc3Rpb246ICfCv1RlIHJlc3VsdMOzIMO6dGlsIGVzdGUgY29udGVuaWRvPycsXG4gICAgICBjb21tZW50UGxhY2Vob2xkZXI6ICdDdcOpbnRhbm9zIG3DoXMgKG9wY2lvbmFsKS4uLicsXG4gICAgICBzdWJtaXQ6ICdFbnZpYXIgb3BpbmnDs24nLFxuICAgICAgdXBkYXRlOiAnQWN0dWFsaXphciBvcGluacOzbicsXG4gICAgICB0aGFua1lvdTogJ8KhR3JhY2lhcyBwb3IgdHUgb3BpbmnDs24hJyxcbiAgICAgIHN1Ym1pdHRlZDogJ1R1IG9waW5pw7NuIGhhIHNpZG8gcmVnaXN0cmFkYScsXG4gICAgICBlcnJvclN1Ym1pdHRpbmc6ICdFcnJvciBhbCBlbnZpYXIuIEludGVudGEgZGUgbnVldm8uJyxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmkxOG4udChrZXksICdDb250ZW50UmVhY3Rpb24nKSB8fCB0cmFuc2xhdGlvbnNba2V5XSB8fCBrZXk7XG4gIH1cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJjb250ZW50LXJlYWN0aW9uXCJcbiAgW2NsYXNzLmRpc2FibGVkXT1cInJlc29sdmVkUHJvcHMoKS5kaXNhYmxlZFwiXG4gIFtjbGFzcy5yZWFkb25seV09XCJyZXNvbHZlZFByb3BzKCkucmVhZG9ubHlcIlxuPlxuICA8IS0tIExvYWRpbmcgaW5pY2lhbCAtLT5cbiAgQGlmIChzdGF0ZSgpLmlzTG9hZGluZyAmJiAhc3RhdGUoKS5zZWxlY3RlZFZhbHVlKSB7XG4gICAgPGRpdiBjbGFzcz1cImxvYWRpbmctY29udGFpbmVyXCI+XG4gICAgICA8aW9uLXNwaW5uZXIgbmFtZT1cImNyZXNjZW50XCI+PC9pb24tc3Bpbm5lcj5cbiAgICA8L2Rpdj5cbiAgfSBAZWxzZSB7XG4gICAgPCEtLSBQcmVndW50YSAtLT5cbiAgICA8cCBjbGFzcz1cInF1ZXN0aW9uXCI+e3sgcmVzb2x2ZWRQcm9wcygpLnF1ZXN0aW9uIH19PC9wPlxuXG4gICAgPCEtLSBFbW9qaXMgLS0+XG4gICAgPGRpdiBjbGFzcz1cImVtb2ppLWNvbnRhaW5lclwiPlxuICAgICAgQGZvciAodmFsdWUgb2YgcmVhY3Rpb25WYWx1ZXM7IHRyYWNrIHZhbHVlOyBsZXQgaSA9ICRpbmRleCkge1xuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJlbW9qaS1idXR0b25cIlxuICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJpc1NlbGVjdGVkKHZhbHVlKVwiXG4gICAgICAgICAgW2NsYXNzLm5lZ2F0aXZlXT1cInZhbHVlID09PSAnbmVnYXRpdmUnICYmIGlzU2VsZWN0ZWQodmFsdWUpXCJcbiAgICAgICAgICBbY2xhc3MubmV1dHJhbF09XCJ2YWx1ZSA9PT0gJ25ldXRyYWwnICYmIGlzU2VsZWN0ZWQodmFsdWUpXCJcbiAgICAgICAgICBbY2xhc3MucG9zaXRpdmVdPVwidmFsdWUgPT09ICdwb3NpdGl2ZScgJiYgaXNTZWxlY3RlZCh2YWx1ZSlcIlxuICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiZ2V0RW1vamlMYWJlbChpKVwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1wcmVzc2VkXT1cImlzU2VsZWN0ZWQodmFsdWUpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwicmVzb2x2ZWRQcm9wcygpLmRpc2FibGVkIHx8IHJlc29sdmVkUHJvcHMoKS5yZWFkb25seVwiXG4gICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFJlYWN0aW9uKHZhbHVlKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImVtb2ppXCI+e3sgZ2V0RW1vamkoaSkgfX08L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgfVxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBDYW1wbyBkZSBjb21lbnRhcmlvIChzb2xvIHNpIGhheSBzZWxlY2Npw7NuKSAtLT5cbiAgICBAaWYgKHNob3dDb21tZW50RmllbGQoKSkge1xuICAgICAgPGRpdiBjbGFzcz1cImNvbW1lbnQtc2VjdGlvblwiPlxuICAgICAgICA8aW9uLXRleHRhcmVhXG4gICAgICAgICAgW3ZhbHVlXT1cInN0YXRlKCkuY29tbWVudFwiXG4gICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInJlc29sdmVkUHJvcHMoKS5jb21tZW50UGxhY2Vob2xkZXJcIlxuICAgICAgICAgIFttYXhsZW5ndGhdPVwicmVzb2x2ZWRQcm9wcygpLm1heENvbW1lbnRMZW5ndGhcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJyZXNvbHZlZFByb3BzKCkuZGlzYWJsZWRcIlxuICAgICAgICAgIFtyb3dzXT1cIjNcIlxuICAgICAgICAgIGNsYXNzPVwiY29tbWVudC10ZXh0YXJlYVwiXG4gICAgICAgICAgKGlvbklucHV0KT1cInVwZGF0ZUNvbW1lbnQoJGV2ZW50KVwiXG4gICAgICAgID48L2lvbi10ZXh0YXJlYT5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjaGFyLWNvdW50XCI+XG4gICAgICAgICAge3sgc3RhdGUoKS5jb21tZW50Lmxlbmd0aCB9fS97eyByZXNvbHZlZFByb3BzKCkubWF4Q29tbWVudExlbmd0aCB9fVxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICB9XG5cbiAgICA8IS0tIEJvdMOzbiBkZSBlbnbDrW8gLS0+XG4gICAgQGlmIChzdGF0ZSgpLnNlbGVjdGVkVmFsdWUgJiYgIXN0YXRlKCkuaXNTdWJtaXR0ZWQpIHtcbiAgICAgIDxpb24tYnV0dG9uXG4gICAgICAgIGV4cGFuZD1cImJsb2NrXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cIiFjYW5TdWJtaXQoKVwiXG4gICAgICAgIChjbGljayk9XCJzdWJtaXRSZWFjdGlvbigpXCJcbiAgICAgICAgY2xhc3M9XCJzdWJtaXQtYnV0dG9uXCJcbiAgICAgID5cbiAgICAgICAgQGlmIChzdGF0ZSgpLmlzTG9hZGluZykge1xuICAgICAgICAgIDxpb24tc3Bpbm5lciBuYW1lPVwiY3Jlc2NlbnRcIj48L2lvbi1zcGlubmVyPlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICB7eyBzdGF0ZSgpLmhhZFByZXZpb3VzUmVhY3Rpb24gPyB0KCd1cGRhdGUnKSA6IHQoJ3N1Ym1pdCcpIH19XG4gICAgICAgIH1cbiAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICB9XG5cbiAgICA8IS0tIE1lbnNhamUgZGUgY29uZmlybWFjacOzbiAtLT5cbiAgICBAaWYgKHN0YXRlKCkuaXNTdWJtaXR0ZWQpIHtcbiAgICAgIDxwIGNsYXNzPVwic3VibWl0dGVkLW1lc3NhZ2VcIj5cbiAgICAgICAge3sgdCgnc3VibWl0dGVkJykgfX1cbiAgICAgIDwvcD5cbiAgICB9XG5cbiAgICA8IS0tIEVycm9yIC0tPlxuICAgIEBpZiAoc3RhdGUoKS5lcnJvcikge1xuICAgICAgPHAgY2xhc3M9XCJlcnJvci1tZXNzYWdlXCI+e3sgc3RhdGUoKS5lcnJvciB9fTwvcD5cbiAgICB9XG4gIH1cbjwvZGl2PlxuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvbW9sZWN1bGVzL2NvbnRlbnQtcmVhY3Rpb24vdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVudGl0eVJlZiwgUmVhY3Rpb25WYWx1ZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2ZlZWRiYWNrL3R5cGVzJztcblxuLyoqXG4gKiBDb25maWd1cmFjacOzbiBkZWwgY29tcG9uZW50ZSBjb250ZW50LXJlYWN0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnRlbnRSZWFjdGlvbk1ldGFkYXRhIHtcbiAgLyoqIFJlZmVyZW5jaWEgYSBsYSBlbnRpZGFkIChyZXF1ZXJpZG8pICovXG4gIGVudGl0eVJlZjogRW50aXR5UmVmO1xuXG4gIC8qKiBQcmVndW50YSBhIG1vc3RyYXIgKGRlZmF1bHQ6IFwiwr9UZSByZXN1bHTDsyDDunRpbCBlc3RlIGNvbnRlbmlkbz9cIikgKi9cbiAgcXVlc3Rpb24/OiBzdHJpbmc7XG5cbiAgLyoqIE1vc3RyYXIgY2FtcG8gZGUgY29tZW50YXJpbyAoZGVmYXVsdDogdHJ1ZSkgKi9cbiAgc2hvd0NvbW1lbnQ/OiBib29sZWFuO1xuXG4gIC8qKiBQbGFjZWhvbGRlciBkZWwgY29tZW50YXJpbyAqL1xuICBjb21tZW50UGxhY2Vob2xkZXI/OiBzdHJpbmc7XG5cbiAgLyoqIE3DoXhpbW8gZGUgY2FyYWN0ZXJlcyBkZWwgY29tZW50YXJpbyAoZGVmYXVsdDogNTAwKSAqL1xuICBtYXhDb21tZW50TGVuZ3RoPzogbnVtYmVyO1xuXG4gIC8qKiBFbW9qaXMgcGVyc29uYWxpemFkb3MgW25lZ2F0aXZlLCBuZXV0cmFsLCBwb3NpdGl2ZV0gKi9cbiAgZW1vamlzPzogW3N0cmluZywgc3RyaW5nLCBzdHJpbmddO1xuXG4gIC8qKiBMYWJlbHMgcGFyYSBlbW9qaXMgKGFjY2VzaWJpbGlkYWQpICovXG4gIGVtb2ppTGFiZWxzPzogW3N0cmluZywgc3RyaW5nLCBzdHJpbmddO1xuXG4gIC8qKiBNb3N0cmFyIHRvYXN0IGRlIGFncmFkZWNpbWllbnRvIChkZWZhdWx0OiB0cnVlKSAqL1xuICBzaG93VGhhbmtZb3U/OiBib29sZWFuO1xuXG4gIC8qKiBNZW5zYWplIGRlIGFncmFkZWNpbWllbnRvIHBlcnNvbmFsaXphZG8gKi9cbiAgdGhhbmtZb3VNZXNzYWdlPzogc3RyaW5nO1xuXG4gIC8qKiBEZXNoYWJpbGl0YXIgaW50ZXJhY2Npw7NuICovXG4gIGRpc2FibGVkPzogYm9vbGVhbjtcblxuICAvKiogTW9kbyByZWFkb25seSAoc29sbyBtb3N0cmFyIHNlbGVjY2nDs24gcHJldmlhKSAqL1xuICByZWFkb25seT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFZhbG9yIGluaWNpYWwgKHBhcmEgU3Rvcnlib29rIG8gY3VhbmRvIHlhIHNlIGNvbm9jZSBlbCBlc3RhZG8pLlxuICAgKiBTaSBzZSBwcm9wb3JjaW9uYSwgbm8gc2UgY29uc3VsdGFyw6EgbGEgQVBJL0ZpcmViYXNlLlxuICAgKi9cbiAgaW5pdGlhbFZhbHVlPzogUmVhY3Rpb25WYWx1ZTtcblxuICAvKipcbiAgICogT21pdGlyIGNvbnN1bHRhIGRlIGZlZWRiYWNrIHByZXZpbyBhbCBjYXJnYXIuXG4gICAqIMOadGlsIHBhcmEgU3Rvcnlib29rIG8gY3VhbmRvIHNlIHVzYSBpbml0aWFsVmFsdWUuXG4gICAqL1xuICBza2lwSW5pdGlhbENoZWNrPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBFc3RhZG8gaW50ZXJubyBkZWwgY29tcG9uZW50ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb250ZW50UmVhY3Rpb25TdGF0ZSB7XG4gIC8qKiBWYWxvciBzZWxlY2Npb25hZG8gYWN0dWFsbWVudGUgKi9cbiAgc2VsZWN0ZWRWYWx1ZTogUmVhY3Rpb25WYWx1ZSB8IG51bGw7XG5cbiAgLyoqIENvbWVudGFyaW8gZGVsIHVzdWFyaW8gKi9cbiAgY29tbWVudDogc3RyaW5nO1xuXG4gIC8qKiBJbmRpY2Egc2kgZXN0w6EgY2FyZ2FuZG8gKi9cbiAgaXNMb2FkaW5nOiBib29sZWFuO1xuXG4gIC8qKiBJbmRpY2Egc2kgeWEgZW52acOzIGxhIHJlYWNjacOzbiAqL1xuICBpc1N1Ym1pdHRlZDogYm9vbGVhbjtcblxuICAvKiogSW5kaWNhIHNpIHRlbsOtYSByZWFjY2nDs24gcHJldmlhICovXG4gIGhhZFByZXZpb3VzUmVhY3Rpb246IGJvb2xlYW47XG5cbiAgLyoqIEVycm9yIG1lc3NhZ2UgaWYgYW55ICovXG4gIGVycm9yOiBzdHJpbmcgfCBudWxsO1xufVxuXG4vKipcbiAqIEV2ZW50byBlbWl0aWRvIGFsIGVudmlhciByZWFjY2nDs24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVhY3Rpb25TdWJtaXRFdmVudCB7XG4gIHZhbHVlOiBSZWFjdGlvblZhbHVlO1xuICBjb21tZW50Pzogc3RyaW5nO1xuICBlbnRpdHlSZWY6IEVudGl0eVJlZjtcbiAgaXNVcGRhdGU6IGJvb2xlYW47XG59XG5cbi8qKlxuICogRXZlbnRvIGVtaXRpZG8gYWwgY2FtYmlhciBzZWxlY2Npw7NuLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlYWN0aW9uQ2hhbmdlRXZlbnQge1xuICB2YWx1ZTogUmVhY3Rpb25WYWx1ZSB8IG51bGw7XG4gIHByZXZpb3VzVmFsdWU6IFJlYWN0aW9uVmFsdWUgfCBudWxsO1xufVxuIl19
@@ -0,0 +1,85 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * val-docs-section
6
+ *
7
+ * A semantic section wrapper for documentation pages.
8
+ * Automatically creates headings with IDs for TOC linking.
9
+ *
10
+ * @example Basic usage
11
+ * ```html
12
+ * <val-docs-section [props]="{ id: 'installation', title: 'Installation' }">
13
+ * <p>Install the package using npm...</p>
14
+ * <val-docs-code-example [props]="codeExample"></val-docs-code-example>
15
+ * </val-docs-section>
16
+ * ```
17
+ *
18
+ * @example With level 3 heading
19
+ * ```html
20
+ * <val-docs-section [props]="{ id: 'npm', title: 'Using npm', level: 3 }">
21
+ * <val-docs-code-example [props]="npmExample"></val-docs-code-example>
22
+ * </val-docs-section>
23
+ * ```
24
+ */
25
+ export class DocsSectionComponent {
26
+ constructor() {
27
+ this.props = { id: '', title: '' };
28
+ }
29
+ get level() {
30
+ return this.props.level ?? 2;
31
+ }
32
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DocsSectionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
33
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: DocsSectionComponent, isStandalone: true, selector: "val-docs-section", inputs: { props: "props" }, ngImport: i0, template: `
34
+ <section
35
+ [id]="props.id"
36
+ class="docs-section"
37
+ [class]="props.cssClass"
38
+ [class.docs-section--level-2]="level === 2"
39
+ [class.docs-section--level-3]="level === 3"
40
+ >
41
+ @if (level === 2) {
42
+ <h2 class="docs-section__title">{{ props.title }}</h2>
43
+ } @else {
44
+ <h3 class="docs-section__title">{{ props.title }}</h3>
45
+ }
46
+
47
+ @if (props.description) {
48
+ <p class="docs-section__description">{{ props.description }}</p>
49
+ }
50
+
51
+ <div class="docs-section__content">
52
+ <ng-content></ng-content>
53
+ </div>
54
+ </section>
55
+ `, isInline: true, styles: [".docs-section{margin-bottom:2.5rem}.docs-section__title{margin:0 0 1rem;font-weight:600;color:var(--ion-text-color);scroll-margin-top:80px}.docs-section--level-2 .docs-section__title{font-size:1.5rem;padding-bottom:.5rem;border-bottom:1px solid var(--ion-border-color, #e0e0e0)}.docs-section--level-3 .docs-section__title{font-size:1.25rem}.docs-section__description{margin:0 0 1.25rem;color:var(--ion-color-medium);font-size:1rem;line-height:1.6}.docs-section__content>*:last-child{margin-bottom:0}:host-context(.dark) .docs-section--level-2 .docs-section__title,:host-context([color-scheme=\"dark\"]) .docs-section--level-2 .docs-section__title{border-bottom-color:var(--ion-border-color, #333)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }] }); }
56
+ }
57
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DocsSectionComponent, decorators: [{
58
+ type: Component,
59
+ args: [{ selector: 'val-docs-section', standalone: true, imports: [CommonModule], template: `
60
+ <section
61
+ [id]="props.id"
62
+ class="docs-section"
63
+ [class]="props.cssClass"
64
+ [class.docs-section--level-2]="level === 2"
65
+ [class.docs-section--level-3]="level === 3"
66
+ >
67
+ @if (level === 2) {
68
+ <h2 class="docs-section__title">{{ props.title }}</h2>
69
+ } @else {
70
+ <h3 class="docs-section__title">{{ props.title }}</h3>
71
+ }
72
+
73
+ @if (props.description) {
74
+ <p class="docs-section__description">{{ props.description }}</p>
75
+ }
76
+
77
+ <div class="docs-section__content">
78
+ <ng-content></ng-content>
79
+ </div>
80
+ </section>
81
+ `, styles: [".docs-section{margin-bottom:2.5rem}.docs-section__title{margin:0 0 1rem;font-weight:600;color:var(--ion-text-color);scroll-margin-top:80px}.docs-section--level-2 .docs-section__title{font-size:1.5rem;padding-bottom:.5rem;border-bottom:1px solid var(--ion-border-color, #e0e0e0)}.docs-section--level-3 .docs-section__title{font-size:1.25rem}.docs-section__description{margin:0 0 1.25rem;color:var(--ion-color-medium);font-size:1rem;line-height:1.6}.docs-section__content>*:last-child{margin-bottom:0}:host-context(.dark) .docs-section--level-2 .docs-section__title,:host-context([color-scheme=\"dark\"]) .docs-section--level-2 .docs-section__title{border-bottom-color:var(--ion-border-color, #333)}\n"] }]
82
+ }], propDecorators: { props: [{
83
+ type: Input
84
+ }] } });
85
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jcy1zZWN0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9tb2xlY3VsZXMvZG9jcy1zZWN0aW9uL2RvY3Mtc2VjdGlvbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDOztBQUcvQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFvRUgsTUFBTSxPQUFPLG9CQUFvQjtJQW5FakM7UUFvRVcsVUFBSyxHQUF3QixFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDO0tBSzdEO0lBSEMsSUFBSSxLQUFLO1FBQ1AsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUM7SUFDL0IsQ0FBQzsrR0FMVSxvQkFBb0I7bUdBQXBCLG9CQUFvQix3R0EvRHJCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JULG93QkF2QlMsWUFBWTs7NEZBZ0VYLG9CQUFvQjtrQkFuRWhDLFNBQVM7K0JBQ0Usa0JBQWtCLGNBQ2hCLElBQUksV0FDUCxDQUFDLFlBQVksQ0FBQyxZQUNiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JUOzhCQTBDUSxLQUFLO3NCQUFiLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRG9jc1NlY3Rpb25NZXRhZGF0YSB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIHZhbC1kb2NzLXNlY3Rpb25cbiAqXG4gKiBBIHNlbWFudGljIHNlY3Rpb24gd3JhcHBlciBmb3IgZG9jdW1lbnRhdGlvbiBwYWdlcy5cbiAqIEF1dG9tYXRpY2FsbHkgY3JlYXRlcyBoZWFkaW5ncyB3aXRoIElEcyBmb3IgVE9DIGxpbmtpbmcuXG4gKlxuICogQGV4YW1wbGUgQmFzaWMgdXNhZ2VcbiAqIGBgYGh0bWxcbiAqIDx2YWwtZG9jcy1zZWN0aW9uIFtwcm9wc109XCJ7IGlkOiAnaW5zdGFsbGF0aW9uJywgdGl0bGU6ICdJbnN0YWxsYXRpb24nIH1cIj5cbiAqICAgPHA+SW5zdGFsbCB0aGUgcGFja2FnZSB1c2luZyBucG0uLi48L3A+XG4gKiAgIDx2YWwtZG9jcy1jb2RlLWV4YW1wbGUgW3Byb3BzXT1cImNvZGVFeGFtcGxlXCI+PC92YWwtZG9jcy1jb2RlLWV4YW1wbGU+XG4gKiA8L3ZhbC1kb2NzLXNlY3Rpb24+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZSBXaXRoIGxldmVsIDMgaGVhZGluZ1xuICogYGBgaHRtbFxuICogPHZhbC1kb2NzLXNlY3Rpb24gW3Byb3BzXT1cInsgaWQ6ICducG0nLCB0aXRsZTogJ1VzaW5nIG5wbScsIGxldmVsOiAzIH1cIj5cbiAqICAgPHZhbC1kb2NzLWNvZGUtZXhhbXBsZSBbcHJvcHNdPVwibnBtRXhhbXBsZVwiPjwvdmFsLWRvY3MtY29kZS1leGFtcGxlPlxuICogPC92YWwtZG9jcy1zZWN0aW9uPlxuICogYGBgXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZhbC1kb2NzLXNlY3Rpb24nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8c2VjdGlvblxuICAgICAgW2lkXT1cInByb3BzLmlkXCJcbiAgICAgIGNsYXNzPVwiZG9jcy1zZWN0aW9uXCJcbiAgICAgIFtjbGFzc109XCJwcm9wcy5jc3NDbGFzc1wiXG4gICAgICBbY2xhc3MuZG9jcy1zZWN0aW9uLS1sZXZlbC0yXT1cImxldmVsID09PSAyXCJcbiAgICAgIFtjbGFzcy5kb2NzLXNlY3Rpb24tLWxldmVsLTNdPVwibGV2ZWwgPT09IDNcIlxuICAgID5cbiAgICAgIEBpZiAobGV2ZWwgPT09IDIpIHtcbiAgICAgICAgPGgyIGNsYXNzPVwiZG9jcy1zZWN0aW9uX190aXRsZVwiPnt7IHByb3BzLnRpdGxlIH19PC9oMj5cbiAgICAgIH0gQGVsc2Uge1xuICAgICAgICA8aDMgY2xhc3M9XCJkb2NzLXNlY3Rpb25fX3RpdGxlXCI+e3sgcHJvcHMudGl0bGUgfX08L2gzPlxuICAgICAgfVxuXG4gICAgICBAaWYgKHByb3BzLmRlc2NyaXB0aW9uKSB7XG4gICAgICAgIDxwIGNsYXNzPVwiZG9jcy1zZWN0aW9uX19kZXNjcmlwdGlvblwiPnt7IHByb3BzLmRlc2NyaXB0aW9uIH19PC9wPlxuICAgICAgfVxuXG4gICAgICA8ZGl2IGNsYXNzPVwiZG9jcy1zZWN0aW9uX19jb250ZW50XCI+XG4gICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICAgIDwvZGl2PlxuICAgIDwvc2VjdGlvbj5cbiAgYCxcbiAgc3R5bGVzOiBbYFxuICAgIC5kb2NzLXNlY3Rpb24ge1xuICAgICAgbWFyZ2luLWJvdHRvbTogMi41cmVtO1xuICAgIH1cblxuICAgIC5kb2NzLXNlY3Rpb25fX3RpdGxlIHtcbiAgICAgIG1hcmdpbjogMCAwIDFyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgY29sb3I6IHZhcigtLWlvbi10ZXh0LWNvbG9yKTtcbiAgICAgIHNjcm9sbC1tYXJnaW4tdG9wOiA4MHB4O1xuICAgIH1cblxuICAgIC5kb2NzLXNlY3Rpb24tLWxldmVsLTIgLmRvY3Mtc2VjdGlvbl9fdGl0bGUge1xuICAgICAgZm9udC1zaXplOiAxLjVyZW07XG4gICAgICBwYWRkaW5nLWJvdHRvbTogMC41cmVtO1xuICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWlvbi1ib3JkZXItY29sb3IsICNlMGUwZTApO1xuICAgIH1cblxuICAgIC5kb2NzLXNlY3Rpb24tLWxldmVsLTMgLmRvY3Mtc2VjdGlvbl9fdGl0bGUge1xuICAgICAgZm9udC1zaXplOiAxLjI1cmVtO1xuICAgIH1cblxuICAgIC5kb2NzLXNlY3Rpb25fX2Rlc2NyaXB0aW9uIHtcbiAgICAgIG1hcmdpbjogMCAwIDEuMjVyZW07XG4gICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLW1lZGl1bSk7XG4gICAgICBmb250LXNpemU6IDFyZW07XG4gICAgICBsaW5lLWhlaWdodDogMS42O1xuICAgIH1cblxuICAgIC5kb2NzLXNlY3Rpb25fX2NvbnRlbnQgPiAqOmxhc3QtY2hpbGQge1xuICAgICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgICB9XG5cbiAgICAvKiBEYXJrIG1vZGUgKi9cbiAgICA6aG9zdC1jb250ZXh0KC5kYXJrKSAuZG9jcy1zZWN0aW9uLS1sZXZlbC0yIC5kb2NzLXNlY3Rpb25fX3RpdGxlLFxuICAgIDpob3N0LWNvbnRleHQoW2NvbG9yLXNjaGVtZT1cImRhcmtcIl0pIC5kb2NzLXNlY3Rpb24tLWxldmVsLTIgLmRvY3Mtc2VjdGlvbl9fdGl0bGUge1xuICAgICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogdmFyKC0taW9uLWJvcmRlci1jb2xvciwgIzMzMyk7XG4gICAgfVxuICBgXSxcbn0pXG5leHBvcnQgY2xhc3MgRG9jc1NlY3Rpb25Db21wb25lbnQge1xuICBASW5wdXQoKSBwcm9wczogRG9jc1NlY3Rpb25NZXRhZGF0YSA9IHsgaWQ6ICcnLCB0aXRsZTogJycgfTtcblxuICBnZXQgbGV2ZWwoKTogMiB8IDMge1xuICAgIHJldHVybiB0aGlzLnByb3BzLmxldmVsID8/IDI7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvbW9sZWN1bGVzL2RvY3Mtc2VjdGlvbi90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciB0aGUgZG9jcy1zZWN0aW9uIGNvbXBvbmVudC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb2NzU2VjdGlvbk1ldGFkYXRhIHtcbiAgLyoqXG4gICAqIFVuaXF1ZSBJRCBmb3IgdGhlIHNlY3Rpb24gKHVzZWQgZm9yIFRPQyBsaW5raW5nKS5cbiAgICogV2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBzZWN0aW9uIGVsZW1lbnQgZm9yIGFuY2hvciBuYXZpZ2F0aW9uLlxuICAgKi9cbiAgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogU2VjdGlvbiB0aXRsZSBkaXNwbGF5ZWQgYXMgaGVhZGluZy5cbiAgICovXG4gIHRpdGxlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEhlYWRpbmcgbGV2ZWwgZm9yIHRoZSBzZWN0aW9uLlxuICAgKiBAZGVmYXVsdCAyXG4gICAqL1xuICBsZXZlbD86IDIgfCAzO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBkZXNjcmlwdGlvbiBiZWxvdyB0aGUgdGl0bGUuXG4gICAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogQ3VzdG9tIENTUyBjbGFzcy5cbiAgICovXG4gIGNzc0NsYXNzPzogc3RyaW5nO1xufVxuIl19