valtech-components 4.0.26 → 4.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 (28) hide show
  1. package/esm2022/lib/components/molecules/content-reaction/content-reaction.component.mjs +4 -7
  2. package/esm2022/lib/components/organisms/account-view/account-view.component.mjs +34 -30
  3. package/esm2022/lib/components/organisms/api-key-create-modal/api-key-create-modal.component.mjs +7 -7
  4. package/esm2022/lib/components/organisms/api-keys-modal/api-keys-modal.component.mjs +13 -13
  5. package/esm2022/lib/components/organisms/avatar-upload/avatar-upload.component.mjs +3 -3
  6. package/esm2022/lib/components/organisms/change-password-modal/change-password-modal.component.mjs +3 -3
  7. package/esm2022/lib/components/organisms/create-org-modal/create-org-modal.component.mjs +91 -65
  8. package/esm2022/lib/components/organisms/delete-account-modal/delete-account-modal.component.mjs +106 -84
  9. package/esm2022/lib/components/organisms/login-attempt-modal/login-attempt-modal.component.mjs +6 -3
  10. package/esm2022/lib/components/organisms/member-import-modal/member-import-modal.component.mjs +9 -9
  11. package/esm2022/lib/components/organisms/mfa-modal/mfa-modal.component.mjs +3 -3
  12. package/esm2022/lib/components/organisms/organization-view/organization-view.component.mjs +16 -3
  13. package/esm2022/lib/components/organisms/permissions-view/permissions-modal.component.mjs +70 -0
  14. package/esm2022/lib/components/organisms/permissions-view/permissions-view.component.mjs +16 -5
  15. package/esm2022/lib/components/organisms/session-list-modal/session-list-modal.component.mjs +4 -3
  16. package/esm2022/lib/version.mjs +2 -2
  17. package/esm2022/public-api.mjs +2 -1
  18. package/fesm2022/valtech-components.mjs +1942 -1799
  19. package/fesm2022/valtech-components.mjs.map +1 -1
  20. package/lib/components/organisms/account-view/account-view.component.d.ts +3 -0
  21. package/lib/components/organisms/create-org-modal/create-org-modal.component.d.ts +8 -8
  22. package/lib/components/organisms/delete-account-modal/delete-account-modal.component.d.ts +7 -8
  23. package/lib/components/organisms/organization-view/organization-view.component.d.ts +1 -0
  24. package/lib/components/organisms/permissions-view/permissions-modal.component.d.ts +13 -0
  25. package/lib/components/organisms/permissions-view/permissions-view.component.d.ts +9 -2
  26. package/lib/version.d.ts +1 -1
  27. package/package.json +1 -1
  28. package/public-api.d.ts +1 -0
@@ -1,9 +1,7 @@
1
1
  import { Component, inject, Input, Output, EventEmitter, signal, computed, } from '@angular/core';
2
2
  import { CommonModule } from '@angular/common';
3
3
  import { FormsModule } from '@angular/forms';
4
- import { IonButton, IonIcon, IonSpinner, IonTextarea } from '@ionic/angular/standalone';
5
- import { addIcons } from 'ionicons';
6
- import { closeOutline } from 'ionicons/icons';
4
+ import { IonButton, IonSpinner, IonTextarea } from '@ionic/angular/standalone';
7
5
  import { FeedbackService } from '../../../services/feedback/feedback.service';
8
6
  import { ToastService } from '../../../services/toast.service';
9
7
  import { I18nService } from '../../../services/i18n';
@@ -110,7 +108,6 @@ export class ContentReactionComponent {
110
108
  return this.resolvedProps().showComment;
111
109
  });
112
110
  this.canSubmit = computed(() => this.state().selectedValue !== null && !this.state().isLoading);
113
- addIcons({ closeOutline });
114
111
  // Auto-registro de defaults i18n (es/en) si el consumer no proveyó el
115
112
  // namespace. Garantiza que `t()` nunca caiga en key faltante. Ver
116
113
  // CONTENT_REACTION_I18N. Idempotente: solo la 1ª instancia registra.
@@ -261,11 +258,11 @@ export class ContentReactionComponent {
261
258
  return this.i18n.t(key, 'ContentReaction') || translations[key] || key;
262
259
  }
263
260
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ContentReactionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
264
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ContentReactionComponent, isStandalone: true, selector: "val-content-reaction", inputs: { props: "props", _modalRef: "_modalRef" }, outputs: { reactionSubmit: "reactionSubmit", reactionChange: "reactionChange" }, usesOnChanges: true, ngImport: i0, template: "@if (isConfigured()) {\n<div class=\"content-reaction\" [class.disabled]=\"resolvedProps().disabled\" [class.readonly]=\"resolvedProps().readonly\">\n <!-- Bot\u00F3n de cierre (solo en modo modal/sheet) -->\n @if (resolvedProps().showCloseButton) {\n <ion-button fill=\"clear\" color=\"dark\" class=\"close-button\" [attr.aria-label]=\"t('close')\" (click)=\"close()\">\n <ion-icon name=\"close-outline\" slot=\"icon-only\"></ion-icon>\n </ion-button>\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\">\n {{ state().selectedValue === 'negative' ? t('negativeFeedbackTitle') : resolvedProps().question }}\n </p>\n\n <!-- Botones de reacci\u00F3n \u2014 variante emoji (caras, estrellas, thumbs, \u2026) -->\n @if (resolvedProps().variant === 'emoji') {\n <div class=\"reaction-buttons reaction-buttons--emoji\">\n @for (value of activeReactionValues(); track value; let i = $index) {\n <ion-button\n fill=\"clear\"\n shape=\"round\"\n [class.selected]=\"isSelected(value)\"\n [attr.aria-label]=\"resolvedProps().emojiLabels[i]\"\n [attr.aria-pressed]=\"isSelected(value)\"\n [disabled]=\"resolvedProps().disabled || resolvedProps().readonly\"\n (click)=\"selectReaction(value)\"\n >\n <span class=\"emoji-btn\">{{ resolvedProps().emojis[i] }}</span>\n </ion-button>\n }\n </div>\n } @else {\n <!-- Botones de reacci\u00F3n \u2014 variante texto (default) -->\n <div class=\"reaction-buttons\">\n <ion-button\n [fill]=\"isSelected('positive') ? 'solid' : 'outline'\"\n shape=\"round\"\n color=\"dark\"\n [attr.aria-pressed]=\"isSelected('positive')\"\n [disabled]=\"resolvedProps().disabled || resolvedProps().readonly\"\n (click)=\"selectReaction('positive')\"\n >\n {{ t('positiveLabel') }}\n </ion-button>\n <ion-button\n [fill]=\"isSelected('negative') ? 'solid' : 'outline'\"\n shape=\"round\"\n color=\"dark\"\n [attr.aria-pressed]=\"isSelected('negative')\"\n [disabled]=\"resolvedProps().disabled || resolvedProps().readonly\"\n (click)=\"selectReaction('negative')\"\n >\n {{ t('negativeLabel') }}\n </ion-button>\n </div>\n }\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\"> {{ state().comment.length }}/{{ resolvedProps().maxCommentLength }} </span>\n </div>\n }\n\n <!-- Bot\u00F3n de env\u00EDo -->\n @if (state().selectedValue && !state().isSubmitted) {\n <ion-button expand=\"block\" shape=\"round\" [disabled]=\"!canSubmit()\" (click)=\"submitReaction()\" class=\"submit-button\">\n @if (state().isLoading) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ state().hadPreviousReaction ? t('update') : t('submit') }} }\n </ion-button>\n }\n\n <!-- Mensaje de confirmaci\u00F3n -->\n @if (state().isSubmitted) {\n <p class=\"submitted-message\">{{ t('thankYou') }}</p>\n }\n\n <!-- Error -->\n @if (state().error) {\n <p class=\"error-message\">{{ state().error }}</p>\n } }\n</div>\n}\n", styles: [":host{display:block}.content-reaction{position:relative;padding:16px;text-align:center}.content-reaction.disabled{opacity:.6;pointer-events:none}.content-reaction.readonly{pointer-events:none}.close-button{position:absolute;top:0;right:0;margin:0;--padding-start: 6px;--padding-end: 6px;--color: var(--ion-color-medium)}.close-button ion-icon{font-size:1.5rem}.question{font-size:1.0625rem;font-weight:700;color:var(--ion-color-dark);margin:0 0 16px}.reaction-buttons{display:flex;justify-content:center;gap:12px;margin-bottom:20px}.reaction-buttons--emoji{gap:8px}.reaction-buttons--emoji ion-button{--padding-start: 4px;--padding-end: 4px;transition:transform .15s ease}.reaction-buttons--emoji ion-button.selected{transform:scale(1.25)}.reaction-buttons--emoji ion-button:not(.selected):not([disabled]){opacity:.55}.reaction-buttons--emoji ion-button:not(.selected):not([disabled]):hover{opacity:1}.emoji-btn{font-size:2rem;line-height:1;display:block}.comment-section{margin-top:16px;animation:slideIn .3s ease-out}.comment-section .comment-textarea{--background: transparent;--border-radius: 8px;--padding-start: 12px;--padding-end: 12px;width:100%}.comment-section .char-count{display:block;text-align:right;font-size:.75rem;color:var(--ion-color-medium);margin-top:4px}.submit-button{margin-top:16px}.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:.875rem}.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: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { 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"] }] }); }
261
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ContentReactionComponent, isStandalone: true, selector: "val-content-reaction", inputs: { props: "props", _modalRef: "_modalRef" }, outputs: { reactionSubmit: "reactionSubmit", reactionChange: "reactionChange" }, usesOnChanges: true, ngImport: i0, template: "@if (isConfigured()) {\n<div class=\"content-reaction\" [class.disabled]=\"resolvedProps().disabled\" [class.readonly]=\"resolvedProps().readonly\">\n <!-- Bot\u00F3n de cierre (solo en modo modal/sheet) -->\n @if (resolvedProps().showCloseButton) {\n <ion-button fill=\"clear\" color=\"dark\" shape=\"round\" class=\"close-button\" (click)=\"close()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\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\">\n {{ state().selectedValue === 'negative' ? t('negativeFeedbackTitle') : resolvedProps().question }}\n </p>\n\n <!-- Botones de reacci\u00F3n \u2014 variante emoji (caras, estrellas, thumbs, \u2026) -->\n @if (resolvedProps().variant === 'emoji') {\n <div class=\"reaction-buttons reaction-buttons--emoji\">\n @for (value of activeReactionValues(); track value; let i = $index) {\n <ion-button\n fill=\"clear\"\n shape=\"round\"\n [class.selected]=\"isSelected(value)\"\n [attr.aria-label]=\"resolvedProps().emojiLabels[i]\"\n [attr.aria-pressed]=\"isSelected(value)\"\n [disabled]=\"resolvedProps().disabled || resolvedProps().readonly\"\n (click)=\"selectReaction(value)\"\n >\n <span class=\"emoji-btn\">{{ resolvedProps().emojis[i] }}</span>\n </ion-button>\n }\n </div>\n } @else {\n <!-- Botones de reacci\u00F3n \u2014 variante texto (default) -->\n <div class=\"reaction-buttons\">\n <ion-button\n [fill]=\"isSelected('positive') ? 'solid' : 'outline'\"\n shape=\"round\"\n color=\"dark\"\n [attr.aria-pressed]=\"isSelected('positive')\"\n [disabled]=\"resolvedProps().disabled || resolvedProps().readonly\"\n (click)=\"selectReaction('positive')\"\n >\n {{ t('positiveLabel') }}\n </ion-button>\n <ion-button\n [fill]=\"isSelected('negative') ? 'solid' : 'outline'\"\n shape=\"round\"\n color=\"dark\"\n [attr.aria-pressed]=\"isSelected('negative')\"\n [disabled]=\"resolvedProps().disabled || resolvedProps().readonly\"\n (click)=\"selectReaction('negative')\"\n >\n {{ t('negativeLabel') }}\n </ion-button>\n </div>\n }\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\"> {{ state().comment.length }}/{{ resolvedProps().maxCommentLength }} </span>\n </div>\n }\n\n <!-- Bot\u00F3n de env\u00EDo -->\n @if (state().selectedValue && !state().isSubmitted) {\n <ion-button expand=\"block\" shape=\"round\" [disabled]=\"!canSubmit()\" (click)=\"submitReaction()\" class=\"submit-button\">\n @if (state().isLoading) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ state().hadPreviousReaction ? t('update') : t('submit') }} }\n </ion-button>\n }\n\n <!-- Mensaje de confirmaci\u00F3n -->\n @if (state().isSubmitted) {\n <p class=\"submitted-message\">{{ t('thankYou') }}</p>\n }\n\n <!-- Error -->\n @if (state().error) {\n <p class=\"error-message\">{{ state().error }}</p>\n } }\n</div>\n}\n", styles: [":host{display:block}.content-reaction{position:relative;padding:16px;text-align:center}.content-reaction.disabled{opacity:.6;pointer-events:none}.content-reaction.readonly{pointer-events:none}.close-button{position:absolute;top:0;right:0;margin:0;--padding-start: 6px;--padding-end: 6px;--color: var(--ion-color-medium)}.close-button ion-icon{font-size:1.5rem}.question{font-size:1.0625rem;font-weight:700;color:var(--ion-color-dark);margin:0 0 16px}.reaction-buttons{display:flex;justify-content:center;gap:12px;margin-bottom:20px}.reaction-buttons--emoji{gap:8px}.reaction-buttons--emoji ion-button{--padding-start: 4px;--padding-end: 4px;transition:transform .15s ease}.reaction-buttons--emoji ion-button.selected{transform:scale(1.25)}.reaction-buttons--emoji ion-button:not(.selected):not([disabled]){opacity:.55}.reaction-buttons--emoji ion-button:not(.selected):not([disabled]):hover{opacity:1}.emoji-btn{font-size:2rem;line-height:1;display:block}.comment-section{margin-top:16px;animation:slideIn .3s ease-out}.comment-section .comment-textarea{--background: transparent;--border-radius: 8px;--padding-start: 12px;--padding-end: 12px;width:100%}.comment-section .char-count{display:block;text-align:right;font-size:.75rem;color:var(--ion-color-medium);margin-top:4px}.submit-button{margin-top:16px}.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:.875rem}.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"] }] }); }
265
262
  }
266
263
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ContentReactionComponent, decorators: [{
267
264
  type: Component,
268
- args: [{ selector: 'val-content-reaction', standalone: true, imports: [CommonModule, FormsModule, IonButton, IonIcon, IonSpinner, IonTextarea], template: "@if (isConfigured()) {\n<div class=\"content-reaction\" [class.disabled]=\"resolvedProps().disabled\" [class.readonly]=\"resolvedProps().readonly\">\n <!-- Bot\u00F3n de cierre (solo en modo modal/sheet) -->\n @if (resolvedProps().showCloseButton) {\n <ion-button fill=\"clear\" color=\"dark\" class=\"close-button\" [attr.aria-label]=\"t('close')\" (click)=\"close()\">\n <ion-icon name=\"close-outline\" slot=\"icon-only\"></ion-icon>\n </ion-button>\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\">\n {{ state().selectedValue === 'negative' ? t('negativeFeedbackTitle') : resolvedProps().question }}\n </p>\n\n <!-- Botones de reacci\u00F3n \u2014 variante emoji (caras, estrellas, thumbs, \u2026) -->\n @if (resolvedProps().variant === 'emoji') {\n <div class=\"reaction-buttons reaction-buttons--emoji\">\n @for (value of activeReactionValues(); track value; let i = $index) {\n <ion-button\n fill=\"clear\"\n shape=\"round\"\n [class.selected]=\"isSelected(value)\"\n [attr.aria-label]=\"resolvedProps().emojiLabels[i]\"\n [attr.aria-pressed]=\"isSelected(value)\"\n [disabled]=\"resolvedProps().disabled || resolvedProps().readonly\"\n (click)=\"selectReaction(value)\"\n >\n <span class=\"emoji-btn\">{{ resolvedProps().emojis[i] }}</span>\n </ion-button>\n }\n </div>\n } @else {\n <!-- Botones de reacci\u00F3n \u2014 variante texto (default) -->\n <div class=\"reaction-buttons\">\n <ion-button\n [fill]=\"isSelected('positive') ? 'solid' : 'outline'\"\n shape=\"round\"\n color=\"dark\"\n [attr.aria-pressed]=\"isSelected('positive')\"\n [disabled]=\"resolvedProps().disabled || resolvedProps().readonly\"\n (click)=\"selectReaction('positive')\"\n >\n {{ t('positiveLabel') }}\n </ion-button>\n <ion-button\n [fill]=\"isSelected('negative') ? 'solid' : 'outline'\"\n shape=\"round\"\n color=\"dark\"\n [attr.aria-pressed]=\"isSelected('negative')\"\n [disabled]=\"resolvedProps().disabled || resolvedProps().readonly\"\n (click)=\"selectReaction('negative')\"\n >\n {{ t('negativeLabel') }}\n </ion-button>\n </div>\n }\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\"> {{ state().comment.length }}/{{ resolvedProps().maxCommentLength }} </span>\n </div>\n }\n\n <!-- Bot\u00F3n de env\u00EDo -->\n @if (state().selectedValue && !state().isSubmitted) {\n <ion-button expand=\"block\" shape=\"round\" [disabled]=\"!canSubmit()\" (click)=\"submitReaction()\" class=\"submit-button\">\n @if (state().isLoading) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ state().hadPreviousReaction ? t('update') : t('submit') }} }\n </ion-button>\n }\n\n <!-- Mensaje de confirmaci\u00F3n -->\n @if (state().isSubmitted) {\n <p class=\"submitted-message\">{{ t('thankYou') }}</p>\n }\n\n <!-- Error -->\n @if (state().error) {\n <p class=\"error-message\">{{ state().error }}</p>\n } }\n</div>\n}\n", styles: [":host{display:block}.content-reaction{position:relative;padding:16px;text-align:center}.content-reaction.disabled{opacity:.6;pointer-events:none}.content-reaction.readonly{pointer-events:none}.close-button{position:absolute;top:0;right:0;margin:0;--padding-start: 6px;--padding-end: 6px;--color: var(--ion-color-medium)}.close-button ion-icon{font-size:1.5rem}.question{font-size:1.0625rem;font-weight:700;color:var(--ion-color-dark);margin:0 0 16px}.reaction-buttons{display:flex;justify-content:center;gap:12px;margin-bottom:20px}.reaction-buttons--emoji{gap:8px}.reaction-buttons--emoji ion-button{--padding-start: 4px;--padding-end: 4px;transition:transform .15s ease}.reaction-buttons--emoji ion-button.selected{transform:scale(1.25)}.reaction-buttons--emoji ion-button:not(.selected):not([disabled]){opacity:.55}.reaction-buttons--emoji ion-button:not(.selected):not([disabled]):hover{opacity:1}.emoji-btn{font-size:2rem;line-height:1;display:block}.comment-section{margin-top:16px;animation:slideIn .3s ease-out}.comment-section .comment-textarea{--background: transparent;--border-radius: 8px;--padding-start: 12px;--padding-end: 12px;width:100%}.comment-section .char-count{display:block;text-align:right;font-size:.75rem;color:var(--ion-color-medium);margin-top:4px}.submit-button{margin-top:16px}.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:.875rem}.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"] }]
265
+ args: [{ selector: 'val-content-reaction', standalone: true, imports: [CommonModule, FormsModule, IonButton, IonSpinner, IonTextarea], template: "@if (isConfigured()) {\n<div class=\"content-reaction\" [class.disabled]=\"resolvedProps().disabled\" [class.readonly]=\"resolvedProps().readonly\">\n <!-- Bot\u00F3n de cierre (solo en modo modal/sheet) -->\n @if (resolvedProps().showCloseButton) {\n <ion-button fill=\"clear\" color=\"dark\" shape=\"round\" class=\"close-button\" (click)=\"close()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\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\">\n {{ state().selectedValue === 'negative' ? t('negativeFeedbackTitle') : resolvedProps().question }}\n </p>\n\n <!-- Botones de reacci\u00F3n \u2014 variante emoji (caras, estrellas, thumbs, \u2026) -->\n @if (resolvedProps().variant === 'emoji') {\n <div class=\"reaction-buttons reaction-buttons--emoji\">\n @for (value of activeReactionValues(); track value; let i = $index) {\n <ion-button\n fill=\"clear\"\n shape=\"round\"\n [class.selected]=\"isSelected(value)\"\n [attr.aria-label]=\"resolvedProps().emojiLabels[i]\"\n [attr.aria-pressed]=\"isSelected(value)\"\n [disabled]=\"resolvedProps().disabled || resolvedProps().readonly\"\n (click)=\"selectReaction(value)\"\n >\n <span class=\"emoji-btn\">{{ resolvedProps().emojis[i] }}</span>\n </ion-button>\n }\n </div>\n } @else {\n <!-- Botones de reacci\u00F3n \u2014 variante texto (default) -->\n <div class=\"reaction-buttons\">\n <ion-button\n [fill]=\"isSelected('positive') ? 'solid' : 'outline'\"\n shape=\"round\"\n color=\"dark\"\n [attr.aria-pressed]=\"isSelected('positive')\"\n [disabled]=\"resolvedProps().disabled || resolvedProps().readonly\"\n (click)=\"selectReaction('positive')\"\n >\n {{ t('positiveLabel') }}\n </ion-button>\n <ion-button\n [fill]=\"isSelected('negative') ? 'solid' : 'outline'\"\n shape=\"round\"\n color=\"dark\"\n [attr.aria-pressed]=\"isSelected('negative')\"\n [disabled]=\"resolvedProps().disabled || resolvedProps().readonly\"\n (click)=\"selectReaction('negative')\"\n >\n {{ t('negativeLabel') }}\n </ion-button>\n </div>\n }\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\"> {{ state().comment.length }}/{{ resolvedProps().maxCommentLength }} </span>\n </div>\n }\n\n <!-- Bot\u00F3n de env\u00EDo -->\n @if (state().selectedValue && !state().isSubmitted) {\n <ion-button expand=\"block\" shape=\"round\" [disabled]=\"!canSubmit()\" (click)=\"submitReaction()\" class=\"submit-button\">\n @if (state().isLoading) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ state().hadPreviousReaction ? t('update') : t('submit') }} }\n </ion-button>\n }\n\n <!-- Mensaje de confirmaci\u00F3n -->\n @if (state().isSubmitted) {\n <p class=\"submitted-message\">{{ t('thankYou') }}</p>\n }\n\n <!-- Error -->\n @if (state().error) {\n <p class=\"error-message\">{{ state().error }}</p>\n } }\n</div>\n}\n", styles: [":host{display:block}.content-reaction{position:relative;padding:16px;text-align:center}.content-reaction.disabled{opacity:.6;pointer-events:none}.content-reaction.readonly{pointer-events:none}.close-button{position:absolute;top:0;right:0;margin:0;--padding-start: 6px;--padding-end: 6px;--color: var(--ion-color-medium)}.close-button ion-icon{font-size:1.5rem}.question{font-size:1.0625rem;font-weight:700;color:var(--ion-color-dark);margin:0 0 16px}.reaction-buttons{display:flex;justify-content:center;gap:12px;margin-bottom:20px}.reaction-buttons--emoji{gap:8px}.reaction-buttons--emoji ion-button{--padding-start: 4px;--padding-end: 4px;transition:transform .15s ease}.reaction-buttons--emoji ion-button.selected{transform:scale(1.25)}.reaction-buttons--emoji ion-button:not(.selected):not([disabled]){opacity:.55}.reaction-buttons--emoji ion-button:not(.selected):not([disabled]):hover{opacity:1}.emoji-btn{font-size:2rem;line-height:1;display:block}.comment-section{margin-top:16px;animation:slideIn .3s ease-out}.comment-section .comment-textarea{--background: transparent;--border-radius: 8px;--padding-start: 12px;--padding-end: 12px;width:100%}.comment-section .char-count{display:block;text-align:right;font-size:.75rem;color:var(--ion-color-medium);margin-top:4px}.submit-button{margin-top:16px}.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:.875rem}.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"] }]
269
266
  }], ctorParameters: () => [], propDecorators: { props: [{
270
267
  type: Input
271
268
  }], _modalRef: [{
@@ -275,4 +272,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
275
272
  }], reactionChange: [{
276
273
  type: Output
277
274
  }] } });
278
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGVudC1yZWFjdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvbW9sZWN1bGVzL2NvbnRlbnQtcmVhY3Rpb24vY29udGVudC1yZWFjdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvbW9sZWN1bGVzL2NvbnRlbnQtcmVhY3Rpb24vY29udGVudC1yZWFjdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFJWixNQUFNLEVBQ04sUUFBUSxHQUVULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3hGLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDcEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUU5RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDL0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQzs7QUFHbEU7Ozs7Ozs7R0FPRztBQUNILE1BQU0scUJBQXFCLEdBQUc7SUFDNUIsRUFBRSxFQUFFO1FBQ0YsUUFBUSxFQUFFLGtDQUFrQztRQUM1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b250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgaW5qZWN0LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIE9uSW5pdCxcbiAgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBzaWduYWwsXG4gIGNvbXB1dGVkLFxuICBpc0Rldk1vZGUsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgSW9uQnV0dG9uLCBJb25JY29uLCBJb25TcGlubmVyLCBJb25UZXh0YXJlYSB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyL3N0YW5kYWxvbmUnO1xuaW1wb3J0IHsgYWRkSWNvbnMgfSBmcm9tICdpb25pY29ucyc7XG5pbXBvcnQgeyBjbG9zZU91dGxpbmUgfSBmcm9tICdpb25pY29ucy9pY29ucyc7XG5pbXBvcnQgeyBGZWVkYmFja1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9mZWVkYmFjay9mZWVkYmFjay5zZXJ2aWNlJztcbmltcG9ydCB7IFJlYWN0aW9uVmFsdWUgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9mZWVkYmFjay90eXBlcyc7XG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy90b2FzdC5zZXJ2aWNlJztcbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvaTE4bic7XG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2F1dGgvYXV0aC5zZXJ2aWNlJztcbmltcG9ydCB7IENvbnRlbnRSZWFjdGlvbk1ldGFkYXRhLCBDb250ZW50UmVhY3Rpb25TdGF0ZSwgUmVhY3Rpb25TdWJtaXRFdmVudCwgUmVhY3Rpb25DaGFuZ2VFdmVudCB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIERlZmF1bHRzIGkxOG4gZGVsIGNvbXBvbmVudGUgKGVzL2VuKS4gRWwgY29tcG9uZW50ZSBsb3MgYXV0by1yZWdpc3RyYSBlbiBzdVxuICogY29uc3RydWN0b3Igc2kgZWwgY29uc3VtZXIgbm8gcHJvdmV5w7MgZWwgbmFtZXNwYWNlIGBDb250ZW50UmVhY3Rpb25gLiBFc3RvXG4gKiBnYXJhbnRpemEgcXVlIE5VTkNBIGhheWEgdW5hIGtleSBmYWx0YW50ZTogdW5hIGtleSBmYWx0YW50ZSBzZSBldmFsw7phIGVuIGVsXG4gKiB0ZW1wbGF0ZSBwb3IgY2FkYSBjaGFuZ2UtZGV0ZWN0aW9uIOKGkiBgY29uc29sZS53YXJuYCBwb3IgQ0Qg4oaSIGNvbiBlbFxuICogYHZhbC1kZWJ1Zy1jb25zb2xlYCBhY3Rpdm8gKGVzcGVqYSBjb25zb2xlLiogYSB1biBzaWduYWwpIHNlIGRpc3BhcmEgdW4gbG9vcFxuICogaW5maW5pdG8gcXVlIGNvbmdlbGEgZWwgbmF2ZWdhZG9yIGVuIGRldi4gQXV0by1yZWdpc3RyYXIgbG8gZWxpbWluYSBkZSByYcOtei5cbiAqL1xuY29uc3QgQ09OVEVOVF9SRUFDVElPTl9JMThOID0ge1xuICBlczoge1xuICAgIHF1ZXN0aW9uOiAnwr9UZSByZXN1bHTDsyDDunRpbCBlc3RlIGNvbnRlbmlkbz8nLFxuICAgIGNvbW1lbnRQbGFjZWhvbGRlcjogJ0N1w6ludGFub3MgbcOhcyAob3BjaW9uYWwpLi4uJyxcbiAgICBzdWJtaXQ6ICdFbnZpYXIgb3BpbmnDs24nLFxuICAgIHVwZGF0ZTogJ0FjdHVhbGl6YXIgb3BpbmnDs24nLFxuICAgIHRoYW5rWW91OiAnwqFHcmFjaWFzIHBvciB0dSBvcGluacOzbiEnLFxuICAgIHN1Ym1pdHRlZDogJ1R1IG9waW5pw7NuIGhhIHNpZG8gcmVnaXN0cmFkYScsXG4gICAgZXJyb3JTdWJtaXR0aW5nOiAnRXJyb3IgYWwgZW52aWFyLiBJbnRlbnRhIGRlIG51ZXZvLicsXG4gICAgcG9zaXRpdmVMYWJlbDogJ1PDrSwgbXVjaG8nLFxuICAgIG5lZ2F0aXZlTGFiZWw6ICdObyB0YW50bycsXG4gICAgbmVnYXRpdmVGZWVkYmFja1RpdGxlOiAnwr9DdcOpbnRhbm9zIHF1w6kgbm8gdGUgZ3VzdMOzPycsXG4gICAgY2xvc2U6ICdDZXJyYXInLFxuICB9LFxuICBlbjoge1xuICAgIHF1ZXN0aW9uOiAnV2FzIHRoaXMgY29udGVudCBoZWxwZnVsPycsXG4gICAgY29tbWVudFBsYWNlaG9sZGVyOiAnVGVsbCB1cyBtb3JlIChvcHRpb25hbCkuLi4nLFxuICAgIHN1Ym1pdDogJ1NlbmQgZmVlZGJhY2snLFxuICAgIHVwZGF0ZTogJ1VwZGF0ZSBmZWVkYmFjaycsXG4gICAgdGhhbmtZb3U6ICdUaGFua3MgZm9yIHlvdXIgZmVlZGJhY2shJyxcbiAgICBzdWJtaXR0ZWQ6ICdZb3VyIGZlZWRiYWNrIGhhcyBiZWVuIHJlY29yZGVkJyxcbiAgICBlcnJvclN1Ym1pdHRpbmc6ICdGYWlsZWQgdG8gc2VuZC4gUGxlYXNlIHRyeSBhZ2Fpbi4nLFxuICAgIHBvc2l0aXZlTGFiZWw6ICdZZXMsIGEgbG90JyxcbiAgICBuZWdhdGl2ZUxhYmVsOiAnTm90IHJlYWxseScsXG4gICAgbmVnYXRpdmVGZWVkYmFja1RpdGxlOiBcIlRlbGwgdXMgd2hhdCB5b3UgZGlkbid0IGxpa2U/XCIsXG4gICAgY2xvc2U6ICdDbG9zZScsXG4gIH0sXG59O1xuXG4vKipcbiAqIENvbXBvbmVudGUgcGFyYSByZWFjY2lvbmVzIGRlIGNvbnRlbmlkbyBjb24gZW1vamlzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBodG1sXG4gKiA8dmFsLWNvbnRlbnQtcmVhY3Rpb25cbiAqICAgW3Byb3BzXT1cIntcbiAqICAgICBlbnRpdHlSZWY6IHsgZW50aXR5VHlwZTogJ2FydGljbGUnLCBlbnRpdHlJZDogJ2FydC0xMjMnIH0sXG4gKiAgICAgcXVlc3Rpb246ICfCv1RlIGZ1ZSDDunRpbCBlc3RlIGFydMOtY3Vsbz8nXG4gKiAgIH1cIlxuICogICAocmVhY3Rpb25TdWJtaXQpPVwib25SZWFjdGlvblN1Ym1pdCgkZXZlbnQpXCJcbiAqIC8+XG4gKiBgYGBcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsLWNvbnRlbnQtcmVhY3Rpb24nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgSW9uQnV0dG9uLCBJb25JY29uLCBJb25TcGlubmVyLCBJb25UZXh0YXJlYV0sXG4gIHRlbXBsYXRlVXJsOiAnLi9jb250ZW50LXJlYWN0aW9uLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY29udGVudC1yZWFjdGlvbi5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBDb250ZW50UmVhY3Rpb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIHByaXZhdGUgZmVlZGJhY2tTZXJ2aWNlID0gaW5qZWN0KEZlZWRiYWNrU2VydmljZSk7XG4gIHByaXZhdGUgdG9hc3QgPSBpbmplY3QoVG9hc3RTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBpMThuID0gaW5qZWN0KEkxOG5TZXJ2aWNlKTtcbiAgcHJpdmF0ZSBhdXRoID0gaW5qZWN0KEF1dGhTZXJ2aWNlLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXG4gIHJlYWRvbmx5IGlzQ29uZmlndXJlZCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuZmVlZGJhY2tTZXJ2aWNlLmlzQ29uZmlndXJlZCgpKTtcblxuICBASW5wdXQoKSBwcm9wczogUGFydGlhbDxDb250ZW50UmVhY3Rpb25NZXRhZGF0YT4gPSB7fTtcblxuICAvKipcbiAgICogUmVmZXJlbmNpYSBhbCBtb2RhbCBpbnllY3RhZGEgcG9yIGBNb2RhbFNlcnZpY2VgIGN1YW5kbyBlbCBjb21wb25lbnRlIHNlXG4gICAqIGFicmUgY29tbyBtb2RhbC9zaGVldCAoYGNvbXBvbmVudFByb3BzLl9tb2RhbFJlZmApLiBQZXJtaXRlIGNlcnJhcnNlIGRlc2RlXG4gICAqIGRlbnRybyAoYm90w7NuIGRlIGNpZXJyZSkuIGB1bmRlZmluZWRgIGVuIHVzbyBpbmxpbmUuXG4gICAqL1xuICBASW5wdXQoKSBfbW9kYWxSZWY/OiB7IGRpc21pc3M6IChkYXRhPzogdW5rbm93biwgcm9sZT86IHN0cmluZykgPT4gUHJvbWlzZTxib29sZWFuPiB9O1xuXG4gIEBPdXRwdXQoKSByZWFjdGlvblN1Ym1pdCA9IG5ldyBFdmVudEVtaXR0ZXI8UmVhY3Rpb25TdWJtaXRFdmVudD4oKTtcbiAgQE91dHB1dCgpIHJlYWN0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxSZWFjdGlvbkNoYW5nZUV2ZW50PigpO1xuXG4gIC8vIEVzdGFkbyByZWFjdGl2b1xuICBzdGF0ZSA9IHNpZ25hbDxDb250ZW50UmVhY3Rpb25TdGF0ZT4oe1xuICAgIHNlbGVjdGVkVmFsdWU6IG51bGwsXG4gICAgY29tbWVudDogJycsXG4gICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICBpc1N1Ym1pdHRlZDogZmFsc2UsXG4gICAgaGFkUHJldmlvdXNSZWFjdGlvbjogZmFsc2UsXG4gICAgZXJyb3I6IG51bGwsXG4gIH0pO1xuXG4gIC8vIFZhbG9yZXMgcG9yIGRlZmVjdG9cbiAgcmVhZG9ubHkgZGVmYXVsdEVtb2ppczogW3N0cmluZywgc3RyaW5nLCBzdHJpbmddID0gWyfwn5ieJywgJ/CfmJAnLCAn8J+YiiddO1xuICByZWFkb25seSBkZWZhdWx0TGFiZWxzOiBbc3RyaW5nLCBzdHJpbmcsIHN0cmluZ10gPSBbJ05vIG1lIGF5dWTDsycsICdSZWd1bGFyJywgJ011eSDDunRpbCddO1xuXG4gIC8vIENvbXB1dGVkIHByb3BlcnRpZXNcbiAgcmVzb2x2ZWRQcm9wcyA9IGNvbXB1dGVkKCgpID0+ICh7XG4gICAgZW50aXR5UmVmOiB0aGlzLnByb3BzLmVudGl0eVJlZiEsXG4gICAgcXVlc3Rpb246IHRoaXMucHJvcHMucXVlc3Rpb24gfHwgdGhpcy50KCdxdWVzdGlvbicpLFxuICAgIHNob3dDb21tZW50OiB0aGlzLnByb3BzLnNob3dDb21tZW50ID8/IHRydWUsXG4gICAgY29tbWVudE9uVmFsdWVzOiB0aGlzLnByb3BzLmNvbW1lbnRPblZhbHVlcyxcbiAgICBjb21tZW50UGxhY2Vob2xkZXI6IHRoaXMucHJvcHMuY29tbWVudFBsYWNlaG9sZGVyIHx8IHRoaXMudCgnY29tbWVudFBsYWNlaG9sZGVyJyksXG4gICAgbWF4Q29tbWVudExlbmd0aDogdGhpcy5wcm9wcy5tYXhDb21tZW50TGVuZ3RoID8/IDUwMCxcbiAgICBlbW9qaXM6IHRoaXMucHJvcHMuZW1vamlzIHx8IHRoaXMuZGVmYXVsdEVtb2ppcyxcbiAgICBlbW9qaUxhYmVsczogdGhpcy5wcm9wcy5lbW9qaUxhYmVscyB8fCB0aGlzLmRlZmF1bHRMYWJlbHMsXG4gICAgc2hvd1RoYW5rWW91OiB0aGlzLnByb3BzLnNob3dUaGFua1lvdSA/PyB0cnVlLFxuICAgIHRoYW5rWW91TWVzc2FnZTogdGhpcy5wcm9wcy50aGFua1lvdU1lc3NhZ2UgfHwgdGhpcy50KCd0aGFua1lvdScpLFxuICAgIGRpc2FibGVkOiB0aGlzLnByb3BzLmRpc2FibGVkID8/IGZhbHNlLFxuICAgIHJlYWRvbmx5OiB0aGlzLnByb3BzLnJlYWRvbmx5ID8/IGZhbHNlLFxuICAgIC8vIFZhcmlhbnRlOiAnZW1vamknIGN1YW5kbyBzZSBkZWNsYXJhIGV4cGzDrWNpdGFtZW50ZSBvIGN1YW5kbyBzZSBwYXNhbiBlbW9qaXMgY3VzdG9tLlxuICAgIHZhcmlhbnQ6IHRoaXMucHJvcHMudmFyaWFudCA/PyAodGhpcy5wcm9wcy5lbW9qaXMgPyAnZW1vamknIDogJ2J1dHRvbnMnKSxcbiAgICBzaG93Q2xvc2VCdXR0b246IHRoaXMucHJvcHMuc2hvd0Nsb3NlQnV0dG9uID8/IGZhbHNlLFxuICB9KSk7XG5cbiAgcmVhZG9ubHkgYWN0aXZlUmVhY3Rpb25WYWx1ZXMgPSBjb21wdXRlZDxSZWFjdGlvblZhbHVlW10+KCgpID0+XG4gICAgdGhpcy5yZXNvbHZlZFByb3BzKCkuZW1vamlzLmxlbmd0aCA9PT0gMiA/IFsnbmVnYXRpdmUnLCAncG9zaXRpdmUnXSA6IFsnbmVnYXRpdmUnLCAnbmV1dHJhbCcsICdwb3NpdGl2ZSddXG4gICk7XG5cbiAgc2hvd0NvbW1lbnRGaWVsZCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBzZWwgPSB0aGlzLnN0YXRlKCkuc2VsZWN0ZWRWYWx1ZTtcbiAgICBpZiAoIXNlbCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGNvbW1lbnRPbiA9IHRoaXMucmVzb2x2ZWRQcm9wcygpLmNvbW1lbnRPblZhbHVlcztcbiAgICBpZiAoY29tbWVudE9uICE9PSB1bmRlZmluZWQpIHJldHVybiBjb21tZW50T24uaW5jbHVkZXMoc2VsKTtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlZFByb3BzKCkuc2hvd0NvbW1lbnQ7XG4gIH0pO1xuXG4gIGNhblN1Ym1pdCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuc3RhdGUoKS5zZWxlY3RlZFZhbHVlICE9PSBudWxsICYmICF0aGlzLnN0YXRlKCkuaXNMb2FkaW5nKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBhZGRJY29ucyh7IGNsb3NlT3V0bGluZSB9KTtcbiAgICAvLyBBdXRvLXJlZ2lzdHJvIGRlIGRlZmF1bHRzIGkxOG4gKGVzL2VuKSBzaSBlbCBjb25zdW1lciBubyBwcm92ZXnDsyBlbFxuICAgIC8vIG5hbWVzcGFjZS4gR2FyYW50aXphIHF1ZSBgdCgpYCBudW5jYSBjYWlnYSBlbiBrZXkgZmFsdGFudGUuIFZlclxuICAgIC8vIENPTlRFTlRfUkVBQ1RJT05fSTE4Ti4gSWRlbXBvdGVudGU6IHNvbG8gbGEgMcKqIGluc3RhbmNpYSByZWdpc3RyYS5cbiAgICBpZiAoIXRoaXMuaTE4bi5oYXNOYW1lc3BhY2UoJ0NvbnRlbnRSZWFjdGlvbicpKSB7XG4gICAgICB0aGlzLmkxOG4ucmVnaXN0ZXJDb250ZW50KCdDb250ZW50UmVhY3Rpb24nLCBDT05URU5UX1JFQUNUSU9OX0kxOE4pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDaWVycmEgZWwgbW9kYWwvc2hlZXQgY29udGVuZWRvciAoc2kgZWwgY29tcG9uZW50ZSBzZSBhYnJpw7MgdsOtYSBNb2RhbFNlcnZpY2UpLiAqL1xuICBjbG9zZSgpOiB2b2lkIHtcbiAgICB2b2lkIHRoaXMuX21vZGFsUmVmPy5kaXNtaXNzKCk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmxvYWRQcmV2aW91c1JlYWN0aW9uKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgaWYgKGNoYW5nZXNbJ3Byb3BzJ10gJiYgIWNoYW5nZXNbJ3Byb3BzJ10uZmlyc3RDaGFuZ2UpIHtcbiAgICAgIHRoaXMubG9hZFByZXZpb3VzUmVhY3Rpb24oKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxvYWRQcmV2aW91c1JlYWN0aW9uKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5wcm9wcy5lbnRpdHlSZWYpIHJldHVybjtcblxuICAgIC8vIFNpIGhheSBpbml0aWFsVmFsdWUsIHVzYXJsbyBkaXJlY3RhbWVudGUgc2luIGNvbnN1bHRhclxuICAgIGlmICh0aGlzLnByb3BzLmluaXRpYWxWYWx1ZSkge1xuICAgICAgdGhpcy5zdGF0ZS51cGRhdGUocyA9PiAoe1xuICAgICAgICAuLi5zLFxuICAgICAgICBzZWxlY3RlZFZhbHVlOiB0aGlzLnByb3BzLmluaXRpYWxWYWx1ZSEsXG4gICAgICAgIGhhZFByZXZpb3VzUmVhY3Rpb246IHRydWUsXG4gICAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICAgIGlzU3VibWl0dGVkOiB0cnVlLFxuICAgICAgfSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFNpIHNraXBJbml0aWFsQ2hlY2sgZXN0w6EgYWN0aXZvLCBubyBjb25zdWx0YXJcbiAgICBpZiAodGhpcy5wcm9wcy5za2lwSW5pdGlhbENoZWNrKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zdGF0ZS51cGRhdGUocyA9PiAoeyAuLi5zLCBpc0xvYWRpbmc6IHRydWUsIGVycm9yOiBudWxsIH0pKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBjaGVjayA9IGF3YWl0IHRoaXMuZmVlZGJhY2tTZXJ2aWNlLmNoZWNrRmVlZGJhY2soXG4gICAgICAgIHRoaXMucHJvcHMuZW50aXR5UmVmLmVudGl0eVR5cGUsXG4gICAgICAgIHRoaXMucHJvcHMuZW50aXR5UmVmLmVudGl0eUlkXG4gICAgICApO1xuXG4gICAgICBpZiAoY2hlY2suaGFzRmVlZGJhY2sgJiYgY2hlY2sucmVhY3Rpb25WYWx1ZSkge1xuICAgICAgICB0aGlzLnN0YXRlLnVwZGF0ZShzID0+ICh7XG4gICAgICAgICAgLi4ucyxcbiAgICAgICAgICBzZWxlY3RlZFZhbHVlOiBjaGVjay5yZWFjdGlvblZhbHVlISxcbiAgICAgICAgICBoYWRQcmV2aW91c1JlYWN0aW9uOiB0cnVlLFxuICAgICAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgaXNTdWJtaXR0ZWQ6IHRydWUsXG4gICAgICAgIH0pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc3RhdGUudXBkYXRlKHMgPT4gKHsgLi4ucywgaXNMb2FkaW5nOiBmYWxzZSB9KSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGxvYWRpbmcgcHJldmlvdXMgcmVhY3Rpb246JywgZXJyb3IpO1xuICAgICAgdGhpcy5zdGF0ZS51cGRhdGUocyA9PiAoeyAuLi5zLCBpc0xvYWRpbmc6IGZhbHNlIH0pKTtcbiAgICB9XG4gIH1cblxuICBzZWxlY3RSZWFjdGlvbih2YWx1ZTogUmVhY3Rpb25WYWx1ZSk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlc29sdmVkUHJvcHMoKS5kaXNhYmxlZCB8fCB0aGlzLnJlc29sdmVkUHJvcHMoKS5yZWFkb25seSkgcmV0dXJuO1xuXG4gICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IHRoaXMuc3RhdGUoKS5zZWxlY3RlZFZhbHVlO1xuXG4gICAgdGhpcy5zdGF0ZS51cGRhdGUocyA9PiAoe1xuICAgICAgLi4ucyxcbiAgICAgIHNlbGVjdGVkVmFsdWU6IHZhbHVlLFxuICAgICAgaXNTdWJtaXR0ZWQ6IGZhbHNlLFxuICAgICAgZXJyb3I6IG51bGwsXG4gICAgfSkpO1xuXG4gICAgdGhpcy5yZWFjdGlvbkNoYW5nZS5lbWl0KHsgdmFsdWUsIHByZXZpb3VzVmFsdWUgfSk7XG4gIH1cblxuICBhc3luYyBzdWJtaXRSZWFjdGlvbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjdXJyZW50U3RhdGUgPSB0aGlzLnN0YXRlKCk7XG4gICAgY29uc3QgcHJvcHMgPSB0aGlzLnJlc29sdmVkUHJvcHMoKTtcblxuICAgIGlmICghY3VycmVudFN0YXRlLnNlbGVjdGVkVmFsdWUgfHwgcHJvcHMuZGlzYWJsZWQpIHJldHVybjtcblxuICAgIHRoaXMuc3RhdGUudXBkYXRlKHMgPT4gKHsgLi4ucywgaXNMb2FkaW5nOiB0cnVlLCBlcnJvcjogbnVsbCB9KSk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gRGV0ZXJtaW5hciBzaSB1c2FyIGVuZHBvaW50IGFuw7NuaW1vIG8gYXV0ZW50aWNhZG9cbiAgICAgIGNvbnN0IGlzQXV0aGVudGljYXRlZCA9IHRoaXMuYXV0aD8uaXNBdXRoZW50aWNhdGVkKCkgPz8gZmFsc2U7XG4gICAgICBjb25zdCB1c2VBbm9ueW1vdXMgPSB0aGlzLnByb3BzLmFsbG93QW5vbnltb3VzICYmICFpc0F1dGhlbnRpY2F0ZWQ7XG5cbiAgICAgIGlmICh1c2VBbm9ueW1vdXMpIHtcbiAgICAgICAgLy8gVXNhciBlbmRwb2ludCBhbsOzbmltbyAocMO6YmxpY28pXG4gICAgICAgIGF3YWl0IHRoaXMuZmVlZGJhY2tTZXJ2aWNlLmNyZWF0ZUFub255bW91c1JlYWN0aW9uKFxuICAgICAgICAgIHByb3BzLmVudGl0eVJlZixcbiAgICAgICAgICBjdXJyZW50U3RhdGUuc2VsZWN0ZWRWYWx1ZSxcbiAgICAgICAgICBjdXJyZW50U3RhdGUuY29tbWVudCB8fCB1bmRlZmluZWRcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFVzYXIgZW5kcG9pbnQgYXV0ZW50aWNhZG9cbiAgICAgICAgYXdhaXQgdGhpcy5mZWVkYmFja1NlcnZpY2UuY3JlYXRlUmVhY3Rpb24oXG4gICAgICAgICAgcHJvcHMuZW50aXR5UmVmLFxuICAgICAgICAgIGN1cnJlbnRTdGF0ZS5zZWxlY3RlZFZhbHVlLFxuICAgICAgICAgIGN1cnJlbnRTdGF0ZS5jb21tZW50IHx8IHVuZGVmaW5lZFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnN0YXRlLnVwZGF0ZShzID0+ICh7XG4gICAgICAgIC4uLnMsXG4gICAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICAgIGlzU3VibWl0dGVkOiB0cnVlLFxuICAgICAgICBjb21tZW50OiAnJyxcbiAgICAgICAgaGFkUHJldmlvdXNSZWFjdGlvbjogIXVzZUFub255bW91cywgLy8gU29sbyBwYXJhIGF1dGVudGljYWRvc1xuICAgICAgfSkpO1xuXG4gICAgICB0aGlzLnJlYWN0aW9uU3VibWl0LmVtaXQoe1xuICAgICAgICB2YWx1ZTogY3VycmVudFN0YXRlLnNlbGVjdGVkVmFsdWUsXG4gICAgICAgIGNvbW1lbnQ6IGN1cnJlbnRTdGF0ZS5jb21tZW50IHx8IHVuZGVmaW5lZCxcbiAgICAgICAgZW50aXR5UmVmOiBwcm9wcy5lbnRpdHlSZWYsXG4gICAgICAgIGlzVXBkYXRlOiBjdXJyZW50U3RhdGUuaGFkUHJldmlvdXNSZWFjdGlvbixcbiAgICAgIH0pO1xuXG4gICAgICBpZiAocHJvcHMuc2hvd1RoYW5rWW91KSB7XG4gICAgICAgIHRoaXMudG9hc3Quc2hvdyh7XG4gICAgICAgICAgbWVzc2FnZTogcHJvcHMudGhhbmtZb3VNZXNzYWdlLFxuICAgICAgICAgIGR1cmF0aW9uOiAyMDAwLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igc3VibWl0dGluZyByZWFjdGlvbjonLCBlcnJvcik7XG4gICAgICB0aGlzLnN0YXRlLnVwZGF0ZShzID0+ICh7XG4gICAgICAgIC4uLnMsXG4gICAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICAgIGVycm9yOiB0aGlzLnQoJ2Vycm9yU3VibWl0dGluZycpLFxuICAgICAgfSkpO1xuXG4gICAgICB0aGlzLnRvYXN0LnNob3coe1xuICAgICAgICBtZXNzYWdlOiB0aGlzLnQoJ2Vycm9yU3VibWl0dGluZycpLFxuICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUNvbW1lbnQoZXZlbnQ6IEN1c3RvbUV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdmFsdWUgPSBldmVudC5kZXRhaWwudmFsdWUgfHwgJyc7XG4gICAgdGhpcy5zdGF0ZS51cGRhdGUocyA9PiAoeyAuLi5zLCBjb21tZW50OiB2YWx1ZSB9KSk7XG4gIH1cblxuICBnZXRFbW9qaShpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlZFByb3BzKCkuZW1vamlzW2luZGV4XTtcbiAgfVxuXG4gIGdldEVtb2ppTGFiZWwoaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZWRQcm9wcygpLmVtb2ppTGFiZWxzW2luZGV4XTtcbiAgfVxuXG4gIGlzU2VsZWN0ZWQodmFsdWU6IFJlYWN0aW9uVmFsdWUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZSgpLnNlbGVjdGVkVmFsdWUgPT09IHZhbHVlO1xuICB9XG5cbiAgdChrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgdHJhbnNsYXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgcXVlc3Rpb246ICfCv1RlIHJlc3VsdMOzIMO6dGlsIGVzdGUgY29udGVuaWRvPycsXG4gICAgICBjb21tZW50UGxhY2Vob2xkZXI6ICdDdcOpbnRhbm9zIG3DoXMgKG9wY2lvbmFsKS4uLicsXG4gICAgICBzdWJtaXQ6ICdFbnZpYXIgb3BpbmnDs24nLFxuICAgICAgdXBkYXRlOiAnQWN0dWFsaXphciBvcGluacOzbicsXG4gICAgICB0aGFua1lvdTogJ8KhR3JhY2lhcyBwb3IgdHUgb3BpbmnDs24hJyxcbiAgICAgIHN1Ym1pdHRlZDogJ1R1IG9waW5pw7NuIGhhIHNpZG8gcmVnaXN0cmFkYScsXG4gICAgICBlcnJvclN1Ym1pdHRpbmc6ICdFcnJvciBhbCBlbnZpYXIuIEludGVudGEgZGUgbnVldm8uJyxcbiAgICAgIHBvc2l0aXZlTGFiZWw6ICdTw60sIG11Y2hvJyxcbiAgICAgIG5lZ2F0aXZlTGFiZWw6ICdObyB0YW50bycsXG4gICAgICBuZWdhdGl2ZUZlZWRiYWNrVGl0bGU6ICfCv0N1w6ludGFub3MgcXXDqSBubyB0ZSBndXN0w7M/JyxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmkxOG4udChrZXksICdDb250ZW50UmVhY3Rpb24nKSB8fCB0cmFuc2xhdGlvbnNba2V5XSB8fCBrZXk7XG4gIH1cbn1cbiIsIkBpZiAoaXNDb25maWd1cmVkKCkpIHtcbjxkaXYgY2xhc3M9XCJjb250ZW50LXJlYWN0aW9uXCIgW2NsYXNzLmRpc2FibGVkXT1cInJlc29sdmVkUHJvcHMoKS5kaXNhYmxlZFwiIFtjbGFzcy5yZWFkb25seV09XCJyZXNvbHZlZFByb3BzKCkucmVhZG9ubHlcIj5cbiAgPCEtLSBCb3TDs24gZGUgY2llcnJlIChzb2xvIGVuIG1vZG8gbW9kYWwvc2hlZXQpIC0tPlxuICBAaWYgKHJlc29sdmVkUHJvcHMoKS5zaG93Q2xvc2VCdXR0b24pIHtcbiAgPGlvbi1idXR0b24gZmlsbD1cImNsZWFyXCIgY29sb3I9XCJkYXJrXCIgY2xhc3M9XCJjbG9zZS1idXR0b25cIiBbYXR0ci5hcmlhLWxhYmVsXT1cInQoJ2Nsb3NlJylcIiAoY2xpY2spPVwiY2xvc2UoKVwiPlxuICAgIDxpb24taWNvbiBuYW1lPVwiY2xvc2Utb3V0bGluZVwiIHNsb3Q9XCJpY29uLW9ubHlcIj48L2lvbi1pY29uPlxuICA8L2lvbi1idXR0b24+XG4gIH1cbiAgPCEtLSBMb2FkaW5nIGluaWNpYWwgLS0+XG4gIEBpZiAoc3RhdGUoKS5pc0xvYWRpbmcgJiYgIXN0YXRlKCkuc2VsZWN0ZWRWYWx1ZSkge1xuICA8ZGl2IGNsYXNzPVwibG9hZGluZy1jb250YWluZXJcIj5cbiAgICA8aW9uLXNwaW5uZXIgbmFtZT1cImNyZXNjZW50XCI+PC9pb24tc3Bpbm5lcj5cbiAgPC9kaXY+XG4gIH0gQGVsc2Uge1xuICA8IS0tIFByZWd1bnRhIC0tPlxuICA8cCBjbGFzcz1cInF1ZXN0aW9uXCI+XG4gICAge3sgc3RhdGUoKS5zZWxlY3RlZFZhbHVlID09PSAnbmVnYXRpdmUnID8gdCgnbmVnYXRpdmVGZWVkYmFja1RpdGxlJykgOiByZXNvbHZlZFByb3BzKCkucXVlc3Rpb24gfX1cbiAgPC9wPlxuXG4gIDwhLS0gQm90b25lcyBkZSByZWFjY2nDs24g4oCUIHZhcmlhbnRlIGVtb2ppIChjYXJhcywgZXN0cmVsbGFzLCB0aHVtYnMsIOKApikgLS0+XG4gIEBpZiAocmVzb2x2ZWRQcm9wcygpLnZhcmlhbnQgPT09ICdlbW9qaScpIHtcbiAgPGRpdiBjbGFzcz1cInJlYWN0aW9uLWJ1dHRvbnMgcmVhY3Rpb24tYnV0dG9ucy0tZW1vamlcIj5cbiAgICBAZm9yICh2YWx1ZSBvZiBhY3RpdmVSZWFjdGlvblZhbHVlcygpOyB0cmFjayB2YWx1ZTsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICA8aW9uLWJ1dHRvblxuICAgICAgZmlsbD1cImNsZWFyXCJcbiAgICAgIHNoYXBlPVwicm91bmRcIlxuICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cImlzU2VsZWN0ZWQodmFsdWUpXCJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwicmVzb2x2ZWRQcm9wcygpLmVtb2ppTGFiZWxzW2ldXCJcbiAgICAgIFthdHRyLmFyaWEtcHJlc3NlZF09XCJpc1NlbGVjdGVkKHZhbHVlKVwiXG4gICAgICBbZGlzYWJsZWRdPVwicmVzb2x2ZWRQcm9wcygpLmRpc2FibGVkIHx8IHJlc29sdmVkUHJvcHMoKS5yZWFkb25seVwiXG4gICAgICAoY2xpY2spPVwic2VsZWN0UmVhY3Rpb24odmFsdWUpXCJcbiAgICA+XG4gICAgICA8c3BhbiBjbGFzcz1cImVtb2ppLWJ0blwiPnt7IHJlc29sdmVkUHJvcHMoKS5lbW9qaXNbaV0gfX08L3NwYW4+XG4gICAgPC9pb24tYnV0dG9uPlxuICAgIH1cbiAgPC9kaXY+XG4gIH0gQGVsc2Uge1xuICA8IS0tIEJvdG9uZXMgZGUgcmVhY2Npw7NuIOKAlCB2YXJpYW50ZSB0ZXh0byAoZGVmYXVsdCkgLS0+XG4gIDxkaXYgY2xhc3M9XCJyZWFjdGlvbi1idXR0b25zXCI+XG4gICAgPGlvbi1idXR0b25cbiAgICAgIFtmaWxsXT1cImlzU2VsZWN0ZWQoJ3Bvc2l0aXZlJykgPyAnc29saWQnIDogJ291dGxpbmUnXCJcbiAgICAgIHNoYXBlPVwicm91bmRcIlxuICAgICAgY29sb3I9XCJkYXJrXCJcbiAgICAgIFthdHRyLmFyaWEtcHJlc3NlZF09XCJpc1NlbGVjdGVkKCdwb3NpdGl2ZScpXCJcbiAgICAgIFtkaXNhYmxlZF09XCJyZXNvbHZlZFByb3BzKCkuZGlzYWJsZWQgfHwgcmVzb2x2ZWRQcm9wcygpLnJlYWRvbmx5XCJcbiAgICAgIChjbGljayk9XCJzZWxlY3RSZWFjdGlvbigncG9zaXRpdmUnKVwiXG4gICAgPlxuICAgICAge3sgdCgncG9zaXRpdmVMYWJlbCcpIH19XG4gICAgPC9pb24tYnV0dG9uPlxuICAgIDxpb24tYnV0dG9uXG4gICAgICBbZmlsbF09XCJpc1NlbGVjdGVkKCduZWdhdGl2ZScpID8gJ3NvbGlkJyA6ICdvdXRsaW5lJ1wiXG4gICAgICBzaGFwZT1cInJvdW5kXCJcbiAgICAgIGNvbG9yPVwiZGFya1wiXG4gICAgICBbYXR0ci5hcmlhLXByZXNzZWRdPVwiaXNTZWxlY3RlZCgnbmVnYXRpdmUnKVwiXG4gICAgICBbZGlzYWJsZWRdPVwicmVzb2x2ZWRQcm9wcygpLmRpc2FibGVkIHx8IHJlc29sdmVkUHJvcHMoKS5yZWFkb25seVwiXG4gICAgICAoY2xpY2spPVwic2VsZWN0UmVhY3Rpb24oJ25lZ2F0aXZlJylcIlxuICAgID5cbiAgICAgIHt7IHQoJ25lZ2F0aXZlTGFiZWwnKSB9fVxuICAgIDwvaW9uLWJ1dHRvbj5cbiAgPC9kaXY+XG4gIH1cblxuICA8IS0tIENhbXBvIGRlIGNvbWVudGFyaW8gKHNvbG8gc2kgaGF5IHNlbGVjY2nDs24pIC0tPlxuICBAaWYgKHNob3dDb21tZW50RmllbGQoKSkge1xuICA8ZGl2IGNsYXNzPVwiY29tbWVudC1zZWN0aW9uXCI+XG4gICAgPGlvbi10ZXh0YXJlYVxuICAgICAgW3ZhbHVlXT1cInN0YXRlKCkuY29tbWVudFwiXG4gICAgICBbcGxhY2Vob2xkZXJdPVwicmVzb2x2ZWRQcm9wcygpLmNvbW1lbnRQbGFjZWhvbGRlclwiXG4gICAgICBbbWF4bGVuZ3RoXT1cInJlc29sdmVkUHJvcHMoKS5tYXhDb21tZW50TGVuZ3RoXCJcbiAgICAgIFtkaXNhYmxlZF09XCJyZXNvbHZlZFByb3BzKCkuZGlzYWJsZWRcIlxuICAgICAgW3Jvd3NdPVwiM1wiXG4gICAgICBjbGFzcz1cImNvbW1lbnQtdGV4dGFyZWFcIlxuICAgICAgKGlvbklucHV0KT1cInVwZGF0ZUNvbW1lbnQoJGV2ZW50KVwiXG4gICAgPjwvaW9uLXRleHRhcmVhPlxuICAgIDxzcGFuIGNsYXNzPVwiY2hhci1jb3VudFwiPiB7eyBzdGF0ZSgpLmNvbW1lbnQubGVuZ3RoIH19L3t7IHJlc29sdmVkUHJvcHMoKS5tYXhDb21tZW50TGVuZ3RoIH19IDwvc3Bhbj5cbiAgPC9kaXY+XG4gIH1cblxuICA8IS0tIEJvdMOzbiBkZSBlbnbDrW8gLS0+XG4gIEBpZiAoc3RhdGUoKS5zZWxlY3RlZFZhbHVlICYmICFzdGF0ZSgpLmlzU3VibWl0dGVkKSB7XG4gIDxpb24tYnV0dG9uIGV4cGFuZD1cImJsb2NrXCIgc2hhcGU9XCJyb3VuZFwiIFtkaXNhYmxlZF09XCIhY2FuU3VibWl0KClcIiAoY2xpY2spPVwic3VibWl0UmVhY3Rpb24oKVwiIGNsYXNzPVwic3VibWl0LWJ1dHRvblwiPlxuICAgIEBpZiAoc3RhdGUoKS5pc0xvYWRpbmcpIHtcbiAgICA8aW9uLXNwaW5uZXIgbmFtZT1cImNyZXNjZW50XCI+PC9pb24tc3Bpbm5lcj5cbiAgICB9IEBlbHNlIHsge3sgc3RhdGUoKS5oYWRQcmV2aW91c1JlYWN0aW9uID8gdCgndXBkYXRlJykgOiB0KCdzdWJtaXQnKSB9fSB9XG4gIDwvaW9uLWJ1dHRvbj5cbiAgfVxuXG4gIDwhLS0gTWVuc2FqZSBkZSBjb25maXJtYWNpw7NuIC0tPlxuICBAaWYgKHN0YXRlKCkuaXNTdWJtaXR0ZWQpIHtcbiAgPHAgY2xhc3M9XCJzdWJtaXR0ZWQtbWVzc2FnZVwiPnt7IHQoJ3RoYW5rWW91JykgfX08L3A+XG4gIH1cblxuICA8IS0tIEVycm9yIC0tPlxuICBAaWYgKHN0YXRlKCkuZXJyb3IpIHtcbiAgPHAgY2xhc3M9XCJlcnJvci1tZXNzYWdlXCI+e3sgc3RhdGUoKS5lcnJvciB9fTwvcD5cbiAgfSB9XG48L2Rpdj5cbn1cbiJdfQ==
275
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGVudC1yZWFjdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvbW9sZWN1bGVzL2NvbnRlbnQtcmVhY3Rpb24vY29udGVudC1yZWFjdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvbW9sZWN1bGVzL2NvbnRlbnQtcmVhY3Rpb24vY29udGVudC1yZWFjdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFJWixNQUFNLEVBQ04sUUFBUSxHQUVULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDL0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBRTlFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUMvRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFDQUFxQyxDQUFDOztBQUdsRTs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxxQkFBcUIsR0FBRztJQUM1QixFQUFFLEVBQUU7UUFDRixRQUFRLEVBQUUsa0NBQWtDO1FBQzVDLGtCQUFrQixFQUFFLDZCQUE2QjtRQUNqRCxNQUFNLEVBQUUsZ0JBQWdCO1FBQ3hCLE1BQU0sRUFBRSxvQkFBb0I7UUFDNUIsUUFBUSxFQUFFLDBCQUEwQjtRQUNw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QUFDLGFBQWEsS0FBSyxLQUFLLENBQUM7SUFDOUMsQ0FBQztJQUVELENBQUMsQ0FBQyxHQUFXO1FBQ1gsTUFBTSxZQUFZLEdBQTJCO1lBQzNDLFFBQVEsRUFBRSxrQ0FBa0M7WUFDNUMsa0JBQWtCLEVBQUUsNkJBQTZCO1lBQ2pELE1BQU0sRUFBRSxnQkFBZ0I7WUFDeEIsTUFBTSxFQUFFLG9CQUFvQjtZQUM1QixRQUFRLEVBQUUsMEJBQTBCO1lBQ3BDLFNBQVMsRUFBRSwrQkFBK0I7WUFDMUMsZUFBZSxFQUFFLG9DQUFvQztZQUNyRCxhQUFhLEVBQUUsV0FBVztZQUMxQixhQUFhLEVBQUUsVUFBVTtZQUN6QixxQkFBcUIsRUFBRSw2QkFBNkI7U0FDckQsQ0FBQztRQUNGLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLGlCQUFpQixDQUFDLElBQUksWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQztJQUN6RSxDQUFDOytHQXZQVSx3QkFBd0I7bUdBQXhCLHdCQUF3QiwwT0NqRnJDLGloSEFrR0EsdXVERHJCWSxZQUFZLDhCQUFFLFdBQVcsK0JBQUUsU0FBUyxvUEFBRSxVQUFVLHlHQUFFLFdBQVc7OzRGQUk1RCx3QkFBd0I7a0JBUHBDLFNBQVM7K0JBQ0Usc0JBQXNCLGNBQ3BCLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxXQUFXLENBQUM7d0RBWS9ELEtBQUs7c0JBQWIsS0FBSztnQkFPRyxTQUFTO3NCQUFqQixLQUFLO2dCQUVJLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgaW5qZWN0LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIE9uSW5pdCxcbiAgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBzaWduYWwsXG4gIGNvbXB1dGVkLFxuICBpc0Rldk1vZGUsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgSW9uQnV0dG9uLCBJb25TcGlubmVyLCBJb25UZXh0YXJlYSB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyL3N0YW5kYWxvbmUnO1xuaW1wb3J0IHsgRmVlZGJhY2tTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZmVlZGJhY2svZmVlZGJhY2suc2VydmljZSc7XG5pbXBvcnQgeyBSZWFjdGlvblZhbHVlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZmVlZGJhY2svdHlwZXMnO1xuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvdG9hc3Quc2VydmljZSc7XG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2kxOG4nO1xuaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9hdXRoL2F1dGguc2VydmljZSc7XG5pbXBvcnQgeyBDb250ZW50UmVhY3Rpb25NZXRhZGF0YSwgQ29udGVudFJlYWN0aW9uU3RhdGUsIFJlYWN0aW9uU3VibWl0RXZlbnQsIFJlYWN0aW9uQ2hhbmdlRXZlbnQgfSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBEZWZhdWx0cyBpMThuIGRlbCBjb21wb25lbnRlIChlcy9lbikuIEVsIGNvbXBvbmVudGUgbG9zIGF1dG8tcmVnaXN0cmEgZW4gc3VcbiAqIGNvbnN0cnVjdG9yIHNpIGVsIGNvbnN1bWVyIG5vIHByb3ZlecOzIGVsIG5hbWVzcGFjZSBgQ29udGVudFJlYWN0aW9uYC4gRXN0b1xuICogZ2FyYW50aXphIHF1ZSBOVU5DQSBoYXlhIHVuYSBrZXkgZmFsdGFudGU6IHVuYSBrZXkgZmFsdGFudGUgc2UgZXZhbMO6YSBlbiBlbFxuICogdGVtcGxhdGUgcG9yIGNhZGEgY2hhbmdlLWRldGVjdGlvbiDihpIgYGNvbnNvbGUud2FybmAgcG9yIENEIOKGkiBjb24gZWxcbiAqIGB2YWwtZGVidWctY29uc29sZWAgYWN0aXZvIChlc3BlamEgY29uc29sZS4qIGEgdW4gc2lnbmFsKSBzZSBkaXNwYXJhIHVuIGxvb3BcbiAqIGluZmluaXRvIHF1ZSBjb25nZWxhIGVsIG5hdmVnYWRvciBlbiBkZXYuIEF1dG8tcmVnaXN0cmFyIGxvIGVsaW1pbmEgZGUgcmHDrXouXG4gKi9cbmNvbnN0IENPTlRFTlRfUkVBQ1RJT05fSTE4TiA9IHtcbiAgZXM6IHtcbiAgICBxdWVzdGlvbjogJ8K/VGUgcmVzdWx0w7Mgw7p0aWwgZXN0ZSBjb250ZW5pZG8/JyxcbiAgICBjb21tZW50UGxhY2Vob2xkZXI6ICdDdcOpbnRhbm9zIG3DoXMgKG9wY2lvbmFsKS4uLicsXG4gICAgc3VibWl0OiAnRW52aWFyIG9waW5pw7NuJyxcbiAgICB1cGRhdGU6ICdBY3R1YWxpemFyIG9waW5pw7NuJyxcbiAgICB0aGFua1lvdTogJ8KhR3JhY2lhcyBwb3IgdHUgb3BpbmnDs24hJyxcbiAgICBzdWJtaXR0ZWQ6ICdUdSBvcGluacOzbiBoYSBzaWRvIHJlZ2lzdHJhZGEnLFxuICAgIGVycm9yU3VibWl0dGluZzogJ0Vycm9yIGFsIGVudmlhci4gSW50ZW50YSBkZSBudWV2by4nLFxuICAgIHBvc2l0aXZlTGFiZWw6ICdTw60sIG11Y2hvJyxcbiAgICBuZWdhdGl2ZUxhYmVsOiAnTm8gdGFudG8nLFxuICAgIG5lZ2F0aXZlRmVlZGJhY2tUaXRsZTogJ8K/Q3XDqW50YW5vcyBxdcOpIG5vIHRlIGd1c3TDsz8nLFxuICAgIGNsb3NlOiAnQ2VycmFyJyxcbiAgfSxcbiAgZW46IHtcbiAgICBxdWVzdGlvbjogJ1dhcyB0aGlzIGNvbnRlbnQgaGVscGZ1bD8nLFxuICAgIGNvbW1lbnRQbGFjZWhvbGRlcjogJ1RlbGwgdXMgbW9yZSAob3B0aW9uYWwpLi4uJyxcbiAgICBzdWJtaXQ6ICdTZW5kIGZlZWRiYWNrJyxcbiAgICB1cGRhdGU6ICdVcGRhdGUgZmVlZGJhY2snLFxuICAgIHRoYW5rWW91OiAnVGhhbmtzIGZvciB5b3VyIGZlZWRiYWNrIScsXG4gICAgc3VibWl0dGVkOiAnWW91ciBmZWVkYmFjayBoYXMgYmVlbiByZWNvcmRlZCcsXG4gICAgZXJyb3JTdWJtaXR0aW5nOiAnRmFpbGVkIHRvIHNlbmQuIFBsZWFzZSB0cnkgYWdhaW4uJyxcbiAgICBwb3NpdGl2ZUxhYmVsOiAnWWVzLCBhIGxvdCcsXG4gICAgbmVnYXRpdmVMYWJlbDogJ05vdCByZWFsbHknLFxuICAgIG5lZ2F0aXZlRmVlZGJhY2tUaXRsZTogXCJUZWxsIHVzIHdoYXQgeW91IGRpZG4ndCBsaWtlP1wiLFxuICAgIGNsb3NlOiAnQ2xvc2UnLFxuICB9LFxufTtcblxuLyoqXG4gKiBDb21wb25lbnRlIHBhcmEgcmVhY2Npb25lcyBkZSBjb250ZW5pZG8gY29uIGVtb2ppcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgaHRtbFxuICogPHZhbC1jb250ZW50LXJlYWN0aW9uXG4gKiAgIFtwcm9wc109XCJ7XG4gKiAgICAgZW50aXR5UmVmOiB7IGVudGl0eVR5cGU6ICdhcnRpY2xlJywgZW50aXR5SWQ6ICdhcnQtMTIzJyB9LFxuICogICAgIHF1ZXN0aW9uOiAnwr9UZSBmdWUgw7p0aWwgZXN0ZSBhcnTDrWN1bG8/J1xuICogICB9XCJcbiAqICAgKHJlYWN0aW9uU3VibWl0KT1cIm9uUmVhY3Rpb25TdWJtaXQoJGV2ZW50KVwiXG4gKiAvPlxuICogYGBgXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZhbC1jb250ZW50LXJlYWN0aW9uJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGUsIElvbkJ1dHRvbiwgSW9uU3Bpbm5lciwgSW9uVGV4dGFyZWFdLFxuICB0ZW1wbGF0ZVVybDogJy4vY29udGVudC1yZWFjdGlvbi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NvbnRlbnQtcmVhY3Rpb24uY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgQ29udGVudFJlYWN0aW9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICBwcml2YXRlIGZlZWRiYWNrU2VydmljZSA9IGluamVjdChGZWVkYmFja1NlcnZpY2UpO1xuICBwcml2YXRlIHRvYXN0ID0gaW5qZWN0KFRvYXN0U2VydmljZSk7XG4gIHByaXZhdGUgaTE4biA9IGluamVjdChJMThuU2VydmljZSk7XG4gIHByaXZhdGUgYXV0aCA9IGluamVjdChBdXRoU2VydmljZSwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcblxuICByZWFkb25seSBpc0NvbmZpZ3VyZWQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmZlZWRiYWNrU2VydmljZS5pc0NvbmZpZ3VyZWQoKSk7XG5cbiAgQElucHV0KCkgcHJvcHM6IFBhcnRpYWw8Q29udGVudFJlYWN0aW9uTWV0YWRhdGE+ID0ge307XG5cbiAgLyoqXG4gICAqIFJlZmVyZW5jaWEgYWwgbW9kYWwgaW55ZWN0YWRhIHBvciBgTW9kYWxTZXJ2aWNlYCBjdWFuZG8gZWwgY29tcG9uZW50ZSBzZVxuICAgKiBhYnJlIGNvbW8gbW9kYWwvc2hlZXQgKGBjb21wb25lbnRQcm9wcy5fbW9kYWxSZWZgKS4gUGVybWl0ZSBjZXJyYXJzZSBkZXNkZVxuICAgKiBkZW50cm8gKGJvdMOzbiBkZSBjaWVycmUpLiBgdW5kZWZpbmVkYCBlbiB1c28gaW5saW5lLlxuICAgKi9cbiAgQElucHV0KCkgX21vZGFsUmVmPzogeyBkaXNtaXNzOiAoZGF0YT86IHVua25vd24sIHJvbGU/OiBzdHJpbmcpID0+IFByb21pc2U8Ym9vbGVhbj4gfTtcblxuICBAT3V0cHV0KCkgcmVhY3Rpb25TdWJtaXQgPSBuZXcgRXZlbnRFbWl0dGVyPFJlYWN0aW9uU3VibWl0RXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSByZWFjdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8UmVhY3Rpb25DaGFuZ2VFdmVudD4oKTtcblxuICAvLyBFc3RhZG8gcmVhY3Rpdm9cbiAgc3RhdGUgPSBzaWduYWw8Q29udGVudFJlYWN0aW9uU3RhdGU+KHtcbiAgICBzZWxlY3RlZFZhbHVlOiBudWxsLFxuICAgIGNvbW1lbnQ6ICcnLFxuICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgaXNTdWJtaXR0ZWQ6IGZhbHNlLFxuICAgIGhhZFByZXZpb3VzUmVhY3Rpb246IGZhbHNlLFxuICAgIGVycm9yOiBudWxsLFxuICB9KTtcblxuICAvLyBWYWxvcmVzIHBvciBkZWZlY3RvXG4gIHJlYWRvbmx5IGRlZmF1bHRFbW9qaXM6IFtzdHJpbmcsIHN0cmluZywgc3RyaW5nXSA9IFsn8J+YnicsICfwn5iQJywgJ/CfmIonXTtcbiAgcmVhZG9ubHkgZGVmYXVsdExhYmVsczogW3N0cmluZywgc3RyaW5nLCBzdHJpbmddID0gWydObyBtZSBheXVkw7MnLCAnUmVndWxhcicsICdNdXkgw7p0aWwnXTtcblxuICAvLyBDb21wdXRlZCBwcm9wZXJ0aWVzXG4gIHJlc29sdmVkUHJvcHMgPSBjb21wdXRlZCgoKSA9PiAoe1xuICAgIGVudGl0eVJlZjogdGhpcy5wcm9wcy5lbnRpdHlSZWYhLFxuICAgIHF1ZXN0aW9uOiB0aGlzLnByb3BzLnF1ZXN0aW9uIHx8IHRoaXMudCgncXVlc3Rpb24nKSxcbiAgICBzaG93Q29tbWVudDogdGhpcy5wcm9wcy5zaG93Q29tbWVudCA/PyB0cnVlLFxuICAgIGNvbW1lbnRPblZhbHVlczogdGhpcy5wcm9wcy5jb21tZW50T25WYWx1ZXMsXG4gICAgY29tbWVudFBsYWNlaG9sZGVyOiB0aGlzLnByb3BzLmNvbW1lbnRQbGFjZWhvbGRlciB8fCB0aGlzLnQoJ2NvbW1lbnRQbGFjZWhvbGRlcicpLFxuICAgIG1heENvbW1lbnRMZW5ndGg6IHRoaXMucHJvcHMubWF4Q29tbWVudExlbmd0aCA/PyA1MDAsXG4gICAgZW1vamlzOiB0aGlzLnByb3BzLmVtb2ppcyB8fCB0aGlzLmRlZmF1bHRFbW9qaXMsXG4gICAgZW1vamlMYWJlbHM6IHRoaXMucHJvcHMuZW1vamlMYWJlbHMgfHwgdGhpcy5kZWZhdWx0TGFiZWxzLFxuICAgIHNob3dUaGFua1lvdTogdGhpcy5wcm9wcy5zaG93VGhhbmtZb3UgPz8gdHJ1ZSxcbiAgICB0aGFua1lvdU1lc3NhZ2U6IHRoaXMucHJvcHMudGhhbmtZb3VNZXNzYWdlIHx8IHRoaXMudCgndGhhbmtZb3UnKSxcbiAgICBkaXNhYmxlZDogdGhpcy5wcm9wcy5kaXNhYmxlZCA/PyBmYWxzZSxcbiAgICByZWFkb25seTogdGhpcy5wcm9wcy5yZWFkb25seSA/PyBmYWxzZSxcbiAgICAvLyBWYXJpYW50ZTogJ2Vtb2ppJyBjdWFuZG8gc2UgZGVjbGFyYSBleHBsw61jaXRhbWVudGUgbyBjdWFuZG8gc2UgcGFzYW4gZW1vamlzIGN1c3RvbS5cbiAgICB2YXJpYW50OiB0aGlzLnByb3BzLnZhcmlhbnQgPz8gKHRoaXMucHJvcHMuZW1vamlzID8gJ2Vtb2ppJyA6ICdidXR0b25zJyksXG4gICAgc2hvd0Nsb3NlQnV0dG9uOiB0aGlzLnByb3BzLnNob3dDbG9zZUJ1dHRvbiA/PyBmYWxzZSxcbiAgfSkpO1xuXG4gIHJlYWRvbmx5IGFjdGl2ZVJlYWN0aW9uVmFsdWVzID0gY29tcHV0ZWQ8UmVhY3Rpb25WYWx1ZVtdPigoKSA9PlxuICAgIHRoaXMucmVzb2x2ZWRQcm9wcygpLmVtb2ppcy5sZW5ndGggPT09IDIgPyBbJ25lZ2F0aXZlJywgJ3Bvc2l0aXZlJ10gOiBbJ25lZ2F0aXZlJywgJ25ldXRyYWwnLCAncG9zaXRpdmUnXVxuICApO1xuXG4gIHNob3dDb21tZW50RmllbGQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3Qgc2VsID0gdGhpcy5zdGF0ZSgpLnNlbGVjdGVkVmFsdWU7XG4gICAgaWYgKCFzZWwpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBjb21tZW50T24gPSB0aGlzLnJlc29sdmVkUHJvcHMoKS5jb21tZW50T25WYWx1ZXM7XG4gICAgaWYgKGNvbW1lbnRPbiAhPT0gdW5kZWZpbmVkKSByZXR1cm4gY29tbWVudE9uLmluY2x1ZGVzKHNlbCk7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZWRQcm9wcygpLnNob3dDb21tZW50O1xuICB9KTtcblxuICBjYW5TdWJtaXQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnN0YXRlKCkuc2VsZWN0ZWRWYWx1ZSAhPT0gbnVsbCAmJiAhdGhpcy5zdGF0ZSgpLmlzTG9hZGluZyk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gQXV0by1yZWdpc3RybyBkZSBkZWZhdWx0cyBpMThuIChlcy9lbikgc2kgZWwgY29uc3VtZXIgbm8gcHJvdmV5w7MgZWxcbiAgICAvLyBuYW1lc3BhY2UuIEdhcmFudGl6YSBxdWUgYHQoKWAgbnVuY2EgY2FpZ2EgZW4ga2V5IGZhbHRhbnRlLiBWZXJcbiAgICAvLyBDT05URU5UX1JFQUNUSU9OX0kxOE4uIElkZW1wb3RlbnRlOiBzb2xvIGxhIDHCqiBpbnN0YW5jaWEgcmVnaXN0cmEuXG4gICAgaWYgKCF0aGlzLmkxOG4uaGFzTmFtZXNwYWNlKCdDb250ZW50UmVhY3Rpb24nKSkge1xuICAgICAgdGhpcy5pMThuLnJlZ2lzdGVyQ29udGVudCgnQ29udGVudFJlYWN0aW9uJywgQ09OVEVOVF9SRUFDVElPTl9JMThOKTtcbiAgICB9XG4gIH1cblxuICAvKiogQ2llcnJhIGVsIG1vZGFsL3NoZWV0IGNvbnRlbmVkb3IgKHNpIGVsIGNvbXBvbmVudGUgc2UgYWJyacOzIHbDrWEgTW9kYWxTZXJ2aWNlKS4gKi9cbiAgY2xvc2UoKTogdm9pZCB7XG4gICAgdm9pZCB0aGlzLl9tb2RhbFJlZj8uZGlzbWlzcygpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5sb2FkUHJldmlvdXNSZWFjdGlvbigpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzWydwcm9wcyddICYmICFjaGFuZ2VzWydwcm9wcyddLmZpcnN0Q2hhbmdlKSB7XG4gICAgICB0aGlzLmxvYWRQcmV2aW91c1JlYWN0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsb2FkUHJldmlvdXNSZWFjdGlvbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMucHJvcHMuZW50aXR5UmVmKSByZXR1cm47XG5cbiAgICAvLyBTaSBoYXkgaW5pdGlhbFZhbHVlLCB1c2FybG8gZGlyZWN0YW1lbnRlIHNpbiBjb25zdWx0YXJcbiAgICBpZiAodGhpcy5wcm9wcy5pbml0aWFsVmFsdWUpIHtcbiAgICAgIHRoaXMuc3RhdGUudXBkYXRlKHMgPT4gKHtcbiAgICAgICAgLi4ucyxcbiAgICAgICAgc2VsZWN0ZWRWYWx1ZTogdGhpcy5wcm9wcy5pbml0aWFsVmFsdWUhLFxuICAgICAgICBoYWRQcmV2aW91c1JlYWN0aW9uOiB0cnVlLFxuICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgICBpc1N1Ym1pdHRlZDogdHJ1ZSxcbiAgICAgIH0pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTaSBza2lwSW5pdGlhbENoZWNrIGVzdMOhIGFjdGl2bywgbm8gY29uc3VsdGFyXG4gICAgaWYgKHRoaXMucHJvcHMuc2tpcEluaXRpYWxDaGVjaykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc3RhdGUudXBkYXRlKHMgPT4gKHsgLi4ucywgaXNMb2FkaW5nOiB0cnVlLCBlcnJvcjogbnVsbCB9KSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgY2hlY2sgPSBhd2FpdCB0aGlzLmZlZWRiYWNrU2VydmljZS5jaGVja0ZlZWRiYWNrKFxuICAgICAgICB0aGlzLnByb3BzLmVudGl0eVJlZi5lbnRpdHlUeXBlLFxuICAgICAgICB0aGlzLnByb3BzLmVudGl0eVJlZi5lbnRpdHlJZFxuICAgICAgKTtcblxuICAgICAgaWYgKGNoZWNrLmhhc0ZlZWRiYWNrICYmIGNoZWNrLnJlYWN0aW9uVmFsdWUpIHtcbiAgICAgICAgdGhpcy5zdGF0ZS51cGRhdGUocyA9PiAoe1xuICAgICAgICAgIC4uLnMsXG4gICAgICAgICAgc2VsZWN0ZWRWYWx1ZTogY2hlY2sucmVhY3Rpb25WYWx1ZSEsXG4gICAgICAgICAgaGFkUHJldmlvdXNSZWFjdGlvbjogdHJ1ZSxcbiAgICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgICAgIGlzU3VibWl0dGVkOiB0cnVlLFxuICAgICAgICB9KSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN0YXRlLnVwZGF0ZShzID0+ICh7IC4uLnMsIGlzTG9hZGluZzogZmFsc2UgfSkpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBsb2FkaW5nIHByZXZpb3VzIHJlYWN0aW9uOicsIGVycm9yKTtcbiAgICAgIHRoaXMuc3RhdGUudXBkYXRlKHMgPT4gKHsgLi4ucywgaXNMb2FkaW5nOiBmYWxzZSB9KSk7XG4gICAgfVxuICB9XG5cbiAgc2VsZWN0UmVhY3Rpb24odmFsdWU6IFJlYWN0aW9uVmFsdWUpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZXNvbHZlZFByb3BzKCkuZGlzYWJsZWQgfHwgdGhpcy5yZXNvbHZlZFByb3BzKCkucmVhZG9ubHkpIHJldHVybjtcblxuICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSB0aGlzLnN0YXRlKCkuc2VsZWN0ZWRWYWx1ZTtcblxuICAgIHRoaXMuc3RhdGUudXBkYXRlKHMgPT4gKHtcbiAgICAgIC4uLnMsXG4gICAgICBzZWxlY3RlZFZhbHVlOiB2YWx1ZSxcbiAgICAgIGlzU3VibWl0dGVkOiBmYWxzZSxcbiAgICAgIGVycm9yOiBudWxsLFxuICAgIH0pKTtcblxuICAgIHRoaXMucmVhY3Rpb25DaGFuZ2UuZW1pdCh7IHZhbHVlLCBwcmV2aW91c1ZhbHVlIH0pO1xuICB9XG5cbiAgYXN5bmMgc3VibWl0UmVhY3Rpb24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY3VycmVudFN0YXRlID0gdGhpcy5zdGF0ZSgpO1xuICAgIGNvbnN0IHByb3BzID0gdGhpcy5yZXNvbHZlZFByb3BzKCk7XG5cbiAgICBpZiAoIWN1cnJlbnRTdGF0ZS5zZWxlY3RlZFZhbHVlIHx8IHByb3BzLmRpc2FibGVkKSByZXR1cm47XG5cbiAgICB0aGlzLnN0YXRlLnVwZGF0ZShzID0+ICh7IC4uLnMsIGlzTG9hZGluZzogdHJ1ZSwgZXJyb3I6IG51bGwgfSkpO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIERldGVybWluYXIgc2kgdXNhciBlbmRwb2ludCBhbsOzbmltbyBvIGF1dGVudGljYWRvXG4gICAgICBjb25zdCBpc0F1dGhlbnRpY2F0ZWQgPSB0aGlzLmF1dGg/LmlzQXV0aGVudGljYXRlZCgpID8/IGZhbHNlO1xuICAgICAgY29uc3QgdXNlQW5vbnltb3VzID0gdGhpcy5wcm9wcy5hbGxvd0Fub255bW91cyAmJiAhaXNBdXRoZW50aWNhdGVkO1xuXG4gICAgICBpZiAodXNlQW5vbnltb3VzKSB7XG4gICAgICAgIC8vIFVzYXIgZW5kcG9pbnQgYW7Ds25pbW8gKHDDumJsaWNvKVxuICAgICAgICBhd2FpdCB0aGlzLmZlZWRiYWNrU2VydmljZS5jcmVhdGVBbm9ueW1vdXNSZWFjdGlvbihcbiAgICAgICAgICBwcm9wcy5lbnRpdHlSZWYsXG4gICAgICAgICAgY3VycmVudFN0YXRlLnNlbGVjdGVkVmFsdWUsXG4gICAgICAgICAgY3VycmVudFN0YXRlLmNvbW1lbnQgfHwgdW5kZWZpbmVkXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBVc2FyIGVuZHBvaW50IGF1dGVudGljYWRvXG4gICAgICAgIGF3YWl0IHRoaXMuZmVlZGJhY2tTZXJ2aWNlLmNyZWF0ZVJlYWN0aW9uKFxuICAgICAgICAgIHByb3BzLmVudGl0eVJlZixcbiAgICAgICAgICBjdXJyZW50U3RhdGUuc2VsZWN0ZWRWYWx1ZSxcbiAgICAgICAgICBjdXJyZW50U3RhdGUuY29tbWVudCB8fCB1bmRlZmluZWRcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zdGF0ZS51cGRhdGUocyA9PiAoe1xuICAgICAgICAuLi5zLFxuICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgICBpc1N1Ym1pdHRlZDogdHJ1ZSxcbiAgICAgICAgY29tbWVudDogJycsXG4gICAgICAgIGhhZFByZXZpb3VzUmVhY3Rpb246ICF1c2VBbm9ueW1vdXMsIC8vIFNvbG8gcGFyYSBhdXRlbnRpY2Fkb3NcbiAgICAgIH0pKTtcblxuICAgICAgdGhpcy5yZWFjdGlvblN1Ym1pdC5lbWl0KHtcbiAgICAgICAgdmFsdWU6IGN1cnJlbnRTdGF0ZS5zZWxlY3RlZFZhbHVlLFxuICAgICAgICBjb21tZW50OiBjdXJyZW50U3RhdGUuY29tbWVudCB8fCB1bmRlZmluZWQsXG4gICAgICAgIGVudGl0eVJlZjogcHJvcHMuZW50aXR5UmVmLFxuICAgICAgICBpc1VwZGF0ZTogY3VycmVudFN0YXRlLmhhZFByZXZpb3VzUmVhY3Rpb24sXG4gICAgICB9KTtcblxuICAgICAgaWYgKHByb3BzLnNob3dUaGFua1lvdSkge1xuICAgICAgICB0aGlzLnRvYXN0LnNob3coe1xuICAgICAgICAgIG1lc3NhZ2U6IHByb3BzLnRoYW5rWW91TWVzc2FnZSxcbiAgICAgICAgICBkdXJhdGlvbjogMjAwMCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHN1Ym1pdHRpbmcgcmVhY3Rpb246JywgZXJyb3IpO1xuICAgICAgdGhpcy5zdGF0ZS51cGRhdGUocyA9PiAoe1xuICAgICAgICAuLi5zLFxuICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgICBlcnJvcjogdGhpcy50KCdlcnJvclN1Ym1pdHRpbmcnKSxcbiAgICAgIH0pKTtcblxuICAgICAgdGhpcy50b2FzdC5zaG93KHtcbiAgICAgICAgbWVzc2FnZTogdGhpcy50KCdlcnJvclN1Ym1pdHRpbmcnKSxcbiAgICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVDb21tZW50KGV2ZW50OiBDdXN0b21FdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHZhbHVlID0gZXZlbnQuZGV0YWlsLnZhbHVlIHx8ICcnO1xuICAgIHRoaXMuc3RhdGUudXBkYXRlKHMgPT4gKHsgLi4ucywgY29tbWVudDogdmFsdWUgfSkpO1xuICB9XG5cbiAgZ2V0RW1vamkoaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZWRQcm9wcygpLmVtb2ppc1tpbmRleF07XG4gIH1cblxuICBnZXRFbW9qaUxhYmVsKGluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmVkUHJvcHMoKS5lbW9qaUxhYmVsc1tpbmRleF07XG4gIH1cblxuICBpc1NlbGVjdGVkKHZhbHVlOiBSZWFjdGlvblZhbHVlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUoKS5zZWxlY3RlZFZhbHVlID09PSB2YWx1ZTtcbiAgfVxuXG4gIHQoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHRyYW5zbGF0aW9uczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIHF1ZXN0aW9uOiAnwr9UZSByZXN1bHTDsyDDunRpbCBlc3RlIGNvbnRlbmlkbz8nLFxuICAgICAgY29tbWVudFBsYWNlaG9sZGVyOiAnQ3XDqW50YW5vcyBtw6FzIChvcGNpb25hbCkuLi4nLFxuICAgICAgc3VibWl0OiAnRW52aWFyIG9waW5pw7NuJyxcbiAgICAgIHVwZGF0ZTogJ0FjdHVhbGl6YXIgb3BpbmnDs24nLFxuICAgICAgdGhhbmtZb3U6ICfCoUdyYWNpYXMgcG9yIHR1IG9waW5pw7NuIScsXG4gICAgICBzdWJtaXR0ZWQ6ICdUdSBvcGluacOzbiBoYSBzaWRvIHJlZ2lzdHJhZGEnLFxuICAgICAgZXJyb3JTdWJtaXR0aW5nOiAnRXJyb3IgYWwgZW52aWFyLiBJbnRlbnRhIGRlIG51ZXZvLicsXG4gICAgICBwb3NpdGl2ZUxhYmVsOiAnU8OtLCBtdWNobycsXG4gICAgICBuZWdhdGl2ZUxhYmVsOiAnTm8gdGFudG8nLFxuICAgICAgbmVnYXRpdmVGZWVkYmFja1RpdGxlOiAnwr9DdcOpbnRhbm9zIHF1w6kgbm8gdGUgZ3VzdMOzPycsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5pMThuLnQoa2V5LCAnQ29udGVudFJlYWN0aW9uJykgfHwgdHJhbnNsYXRpb25zW2tleV0gfHwga2V5O1xuICB9XG59XG4iLCJAaWYgKGlzQ29uZmlndXJlZCgpKSB7XG48ZGl2IGNsYXNzPVwiY29udGVudC1yZWFjdGlvblwiIFtjbGFzcy5kaXNhYmxlZF09XCJyZXNvbHZlZFByb3BzKCkuZGlzYWJsZWRcIiBbY2xhc3MucmVhZG9ubHldPVwicmVzb2x2ZWRQcm9wcygpLnJlYWRvbmx5XCI+XG4gIDwhLS0gQm90w7NuIGRlIGNpZXJyZSAoc29sbyBlbiBtb2RvIG1vZGFsL3NoZWV0KSAtLT5cbiAgQGlmIChyZXNvbHZlZFByb3BzKCkuc2hvd0Nsb3NlQnV0dG9uKSB7XG4gIDxpb24tYnV0dG9uIGZpbGw9XCJjbGVhclwiIGNvbG9yPVwiZGFya1wiIHNoYXBlPVwicm91bmRcIiBjbGFzcz1cImNsb3NlLWJ1dHRvblwiIChjbGljayk9XCJjbG9zZSgpXCI+XG4gICAgPHN0cm9uZz57eyB0KCdjbG9zZScpIH19PC9zdHJvbmc+XG4gIDwvaW9uLWJ1dHRvbj5cbiAgfVxuICA8IS0tIExvYWRpbmcgaW5pY2lhbCAtLT5cbiAgQGlmIChzdGF0ZSgpLmlzTG9hZGluZyAmJiAhc3RhdGUoKS5zZWxlY3RlZFZhbHVlKSB7XG4gIDxkaXYgY2xhc3M9XCJsb2FkaW5nLWNvbnRhaW5lclwiPlxuICAgIDxpb24tc3Bpbm5lciBuYW1lPVwiY3Jlc2NlbnRcIj48L2lvbi1zcGlubmVyPlxuICA8L2Rpdj5cbiAgfSBAZWxzZSB7XG4gIDwhLS0gUHJlZ3VudGEgLS0+XG4gIDxwIGNsYXNzPVwicXVlc3Rpb25cIj5cbiAgICB7eyBzdGF0ZSgpLnNlbGVjdGVkVmFsdWUgPT09ICduZWdhdGl2ZScgPyB0KCduZWdhdGl2ZUZlZWRiYWNrVGl0bGUnKSA6IHJlc29sdmVkUHJvcHMoKS5xdWVzdGlvbiB9fVxuICA8L3A+XG5cbiAgPCEtLSBCb3RvbmVzIGRlIHJlYWNjacOzbiDigJQgdmFyaWFudGUgZW1vamkgKGNhcmFzLCBlc3RyZWxsYXMsIHRodW1icywg4oCmKSAtLT5cbiAgQGlmIChyZXNvbHZlZFByb3BzKCkudmFyaWFudCA9PT0gJ2Vtb2ppJykge1xuICA8ZGl2IGNsYXNzPVwicmVhY3Rpb24tYnV0dG9ucyByZWFjdGlvbi1idXR0b25zLS1lbW9qaVwiPlxuICAgIEBmb3IgKHZhbHVlIG9mIGFjdGl2ZVJlYWN0aW9uVmFsdWVzKCk7IHRyYWNrIHZhbHVlOyBsZXQgaSA9ICRpbmRleCkge1xuICAgIDxpb24tYnV0dG9uXG4gICAgICBmaWxsPVwiY2xlYXJcIlxuICAgICAgc2hhcGU9XCJyb3VuZFwiXG4gICAgICBbY2xhc3Muc2VsZWN0ZWRdPVwiaXNTZWxlY3RlZCh2YWx1ZSlcIlxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJyZXNvbHZlZFByb3BzKCkuZW1vamlMYWJlbHNbaV1cIlxuICAgICAgW2F0dHIuYXJpYS1wcmVzc2VkXT1cImlzU2VsZWN0ZWQodmFsdWUpXCJcbiAgICAgIFtkaXNhYmxlZF09XCJyZXNvbHZlZFByb3BzKCkuZGlzYWJsZWQgfHwgcmVzb2x2ZWRQcm9wcygpLnJlYWRvbmx5XCJcbiAgICAgIChjbGljayk9XCJzZWxlY3RSZWFjdGlvbih2YWx1ZSlcIlxuICAgID5cbiAgICAgIDxzcGFuIGNsYXNzPVwiZW1vamktYnRuXCI+e3sgcmVzb2x2ZWRQcm9wcygpLmVtb2ppc1tpXSB9fTwvc3Bhbj5cbiAgICA8L2lvbi1idXR0b24+XG4gICAgfVxuICA8L2Rpdj5cbiAgfSBAZWxzZSB7XG4gIDwhLS0gQm90b25lcyBkZSByZWFjY2nDs24g4oCUIHZhcmlhbnRlIHRleHRvIChkZWZhdWx0KSAtLT5cbiAgPGRpdiBjbGFzcz1cInJlYWN0aW9uLWJ1dHRvbnNcIj5cbiAgICA8aW9uLWJ1dHRvblxuICAgICAgW2ZpbGxdPVwiaXNTZWxlY3RlZCgncG9zaXRpdmUnKSA/ICdzb2xpZCcgOiAnb3V0bGluZSdcIlxuICAgICAgc2hhcGU9XCJyb3VuZFwiXG4gICAgICBjb2xvcj1cImRhcmtcIlxuICAgICAgW2F0dHIuYXJpYS1wcmVzc2VkXT1cImlzU2VsZWN0ZWQoJ3Bvc2l0aXZlJylcIlxuICAgICAgW2Rpc2FibGVkXT1cInJlc29sdmVkUHJvcHMoKS5kaXNhYmxlZCB8fCByZXNvbHZlZFByb3BzKCkucmVhZG9ubHlcIlxuICAgICAgKGNsaWNrKT1cInNlbGVjdFJlYWN0aW9uKCdwb3NpdGl2ZScpXCJcbiAgICA+XG4gICAgICB7eyB0KCdwb3NpdGl2ZUxhYmVsJykgfX1cbiAgICA8L2lvbi1idXR0b24+XG4gICAgPGlvbi1idXR0b25cbiAgICAgIFtmaWxsXT1cImlzU2VsZWN0ZWQoJ25lZ2F0aXZlJykgPyAnc29saWQnIDogJ291dGxpbmUnXCJcbiAgICAgIHNoYXBlPVwicm91bmRcIlxuICAgICAgY29sb3I9XCJkYXJrXCJcbiAgICAgIFthdHRyLmFyaWEtcHJlc3NlZF09XCJpc1NlbGVjdGVkKCduZWdhdGl2ZScpXCJcbiAgICAgIFtkaXNhYmxlZF09XCJyZXNvbHZlZFByb3BzKCkuZGlzYWJsZWQgfHwgcmVzb2x2ZWRQcm9wcygpLnJlYWRvbmx5XCJcbiAgICAgIChjbGljayk9XCJzZWxlY3RSZWFjdGlvbignbmVnYXRpdmUnKVwiXG4gICAgPlxuICAgICAge3sgdCgnbmVnYXRpdmVMYWJlbCcpIH19XG4gICAgPC9pb24tYnV0dG9uPlxuICA8L2Rpdj5cbiAgfVxuXG4gIDwhLS0gQ2FtcG8gZGUgY29tZW50YXJpbyAoc29sbyBzaSBoYXkgc2VsZWNjacOzbikgLS0+XG4gIEBpZiAoc2hvd0NvbW1lbnRGaWVsZCgpKSB7XG4gIDxkaXYgY2xhc3M9XCJjb21tZW50LXNlY3Rpb25cIj5cbiAgICA8aW9uLXRleHRhcmVhXG4gICAgICBbdmFsdWVdPVwic3RhdGUoKS5jb21tZW50XCJcbiAgICAgIFtwbGFjZWhvbGRlcl09XCJyZXNvbHZlZFByb3BzKCkuY29tbWVudFBsYWNlaG9sZGVyXCJcbiAgICAgIFttYXhsZW5ndGhdPVwicmVzb2x2ZWRQcm9wcygpLm1heENvbW1lbnRMZW5ndGhcIlxuICAgICAgW2Rpc2FibGVkXT1cInJlc29sdmVkUHJvcHMoKS5kaXNhYmxlZFwiXG4gICAgICBbcm93c109XCIzXCJcbiAgICAgIGNsYXNzPVwiY29tbWVudC10ZXh0YXJlYVwiXG4gICAgICAoaW9uSW5wdXQpPVwidXBkYXRlQ29tbWVudCgkZXZlbnQpXCJcbiAgICA+PC9pb24tdGV4dGFyZWE+XG4gICAgPHNwYW4gY2xhc3M9XCJjaGFyLWNvdW50XCI+IHt7IHN0YXRlKCkuY29tbWVudC5sZW5ndGggfX0ve3sgcmVzb2x2ZWRQcm9wcygpLm1heENvbW1lbnRMZW5ndGggfX0gPC9zcGFuPlxuICA8L2Rpdj5cbiAgfVxuXG4gIDwhLS0gQm90w7NuIGRlIGVudsOtbyAtLT5cbiAgQGlmIChzdGF0ZSgpLnNlbGVjdGVkVmFsdWUgJiYgIXN0YXRlKCkuaXNTdWJtaXR0ZWQpIHtcbiAgPGlvbi1idXR0b24gZXhwYW5kPVwiYmxvY2tcIiBzaGFwZT1cInJvdW5kXCIgW2Rpc2FibGVkXT1cIiFjYW5TdWJtaXQoKVwiIChjbGljayk9XCJzdWJtaXRSZWFjdGlvbigpXCIgY2xhc3M9XCJzdWJtaXQtYnV0dG9uXCI+XG4gICAgQGlmIChzdGF0ZSgpLmlzTG9hZGluZykge1xuICAgIDxpb24tc3Bpbm5lciBuYW1lPVwiY3Jlc2NlbnRcIj48L2lvbi1zcGlubmVyPlxuICAgIH0gQGVsc2UgeyB7eyBzdGF0ZSgpLmhhZFByZXZpb3VzUmVhY3Rpb24gPyB0KCd1cGRhdGUnKSA6IHQoJ3N1Ym1pdCcpIH19IH1cbiAgPC9pb24tYnV0dG9uPlxuICB9XG5cbiAgPCEtLSBNZW5zYWplIGRlIGNvbmZpcm1hY2nDs24gLS0+XG4gIEBpZiAoc3RhdGUoKS5pc1N1Ym1pdHRlZCkge1xuICA8cCBjbGFzcz1cInN1Ym1pdHRlZC1tZXNzYWdlXCI+e3sgdCgndGhhbmtZb3UnKSB9fTwvcD5cbiAgfVxuXG4gIDwhLS0gRXJyb3IgLS0+XG4gIEBpZiAoc3RhdGUoKS5lcnJvcikge1xuICA8cCBjbGFzcz1cImVycm9yLW1lc3NhZ2VcIj57eyBzdGF0ZSgpLmVycm9yIH19PC9wPlxuICB9IH1cbjwvZGl2PlxufVxuIl19