valtech-components 4.0.987 → 4.0.989

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 (24) hide show
  1. package/esm2022/lib/components/organisms/attachment-uploader/attachment-uploader.component.mjs +41 -2
  2. package/esm2022/lib/components/organisms/attachment-uploader/types.mjs +1 -1
  3. package/esm2022/lib/components/organisms/request-review-panel/request-review-panel.component.mjs +316 -481
  4. package/esm2022/lib/components/organisms/request-review-panel/request-review-panel.i18n.mjs +21 -0
  5. package/esm2022/lib/components/organisms/request-review-panel/types.mjs +2 -0
  6. package/esm2022/lib/components/organisms/survey-response/survey-response.component.mjs +21 -1
  7. package/esm2022/lib/components/organisms/survey-response/survey-response.i18n.mjs +5 -1
  8. package/esm2022/lib/components/organisms/survey-response/types.mjs +1 -1
  9. package/esm2022/lib/services/requests/types.mjs +1 -1
  10. package/esm2022/lib/version.mjs +2 -2
  11. package/esm2022/public-api.mjs +3 -2
  12. package/fesm2022/valtech-components.mjs +699 -780
  13. package/fesm2022/valtech-components.mjs.map +1 -1
  14. package/lib/components/organisms/attachment-uploader/attachment-uploader.component.d.ts +14 -0
  15. package/lib/components/organisms/attachment-uploader/types.d.ts +30 -0
  16. package/lib/components/organisms/request-review-panel/request-review-panel.component.d.ts +72 -76
  17. package/lib/components/organisms/request-review-panel/request-review-panel.i18n.d.ts +2 -0
  18. package/lib/components/organisms/request-review-panel/types.d.ts +73 -0
  19. package/lib/components/organisms/survey-response/survey-response.component.d.ts +2 -0
  20. package/lib/components/organisms/survey-response/types.d.ts +6 -0
  21. package/lib/services/requests/types.d.ts +6 -0
  22. package/lib/version.d.ts +1 -1
  23. package/package.json +1 -1
  24. package/public-api.d.ts +2 -1
@@ -1,526 +1,361 @@
1
- import { Component, DestroyRef, computed, inject, input, output, signal } from '@angular/core';
2
- import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
3
- import { firstValueFrom } from 'rxjs';
4
- import { RequestService } from '../../../services/requests/request.service';
5
- import { I18nService } from '../../../services/i18n/i18n.service';
6
- import { ValtechErrorService } from '../../../services/errors/valtech-error.service';
7
- import { ToastService } from '../../../services/toast.service';
1
+ import { CommonModule } from '@angular/common';
2
+ import { Component, EventEmitter, Input, Output, computed, inject, input, signal } from '@angular/core';
3
+ import { ButtonComponent } from '../../atoms/button/button.component';
8
4
  import { EmptyStateComponent } from '../../molecules/empty-state/empty-state.component';
9
5
  import { SkeletonComponent } from '../../atoms/skeleton/skeleton.component';
10
- import { ButtonComponent } from '../../atoms/button/button.component';
6
+ import { I18nService } from '../../../services/i18n';
7
+ import { REQUEST_REVIEW_PANEL_I18N } from './request-review-panel.i18n';
11
8
  import * as i0 from "@angular/core";
12
- const STATUS_STYLE = {
13
- approved: { bg: '#22c55e', color: '#fff' },
14
- rejected: { bg: '#ef4444', color: '#fff' },
15
- in_review: { bg: '#fef3c7', color: '#92400e' },
16
- pending: { bg: 'var(--ion-color-light, #f4f5f8)', color: 'var(--ion-color-dark, #222)' },
17
- cancelled: { bg: 'var(--ion-color-light, #f4f5f8)', color: 'var(--ion-color-medium, #636469)' },
18
- closed: { bg: 'var(--ion-color-light, #f4f5f8)', color: 'var(--ion-color-medium, #636469)' },
19
- };
9
+ import * as i1 from "@angular/common";
10
+ const NAMESPACE = 'RequestReviewPanel';
20
11
  /**
21
- * Panel de revisión de una Request genérica (ADR-061/062): status + acciones
22
- * approve/reject + fields del formulario + comentarios. Config-driven, sin
23
- * conocimiento del dominio (adoption, recipe_verification, etc.) — cada
24
- * consumer inyecta su `RequestReviewPanelConfig`.
12
+ * val-request-review-panel cola de revisión del factory (ADR-062).
13
+ *
14
+ * Es **presentacional**: no carga datos, no conoce el backend ni el dominio. El
15
+ * consumer le pasa la cola ya normalizada y escucha `(decision)`.
16
+ *
17
+ * ## Por qué el cuerpo va proyectado y no configurado
18
+ *
19
+ * El ADR original proponía describir el cuerpo con arrays de nombres de campo
20
+ * (`fields.display: ['taxId', 'tagsRequested']`). Al implementarlo con los dos
21
+ * consumidores reales delante quedó claro que eso reinventa un motor de
22
+ * templating peor que Angular: Chesed necesita una lista de documentos con
23
+ * iconos y `target="_blank"`, Okhelia un enlace a la receta y un input de
24
+ * comentario. Ninguna lista de strings expresa eso sin agregarle un flag al
25
+ * componente por cada caso nuevo.
26
+ *
27
+ * Entonces el panel es dueño de lo que **de verdad** se repite — la cáscara, el
28
+ * chrome de la card, y la mecánica de decisión — y el cuerpo de cada ítem lo
29
+ * escribe cada vertical en un `ng-template` con su propio HTML.
30
+ *
31
+ * ```html
32
+ * <val-request-review-panel [props]="panelProps()" [itemBody]="body"
33
+ * (decision)="onDecision($event)" />
34
+ *
35
+ * <ng-template #body let-item>
36
+ * <a [routerLink]="['/app/recetas', recipeIdOf(item)]">Ver receta</a>
37
+ * </ng-template>
38
+ * ```
39
+ *
40
+ * ## Rechazo con motivo
41
+ *
42
+ * El flujo de dos pasos (Rechazar → escribir motivo → Confirmar) es del panel,
43
+ * no del consumer, y está activo por defecto. Rechazar de un click deja al
44
+ * solicitante sin saber qué corregir; era el único de los dos paneles que lo
45
+ * tenía bien resuelto y ahora lo heredan los dos.
25
46
  */
26
47
  export class RequestReviewPanelComponent {
27
48
  constructor() {
28
- this.requests = inject(RequestService);
29
49
  this.i18n = inject(I18nService);
30
- this.errors = inject(ValtechErrorService);
31
- this.toast = inject(ToastService);
32
- this.destroyRef = inject(DestroyRef);
33
- this.requestId = input.required();
34
- this.config = input.required();
35
- this.loaded = output();
36
- this._req = signal(null);
37
- this._loading = signal(true);
38
- this._loadError = signal(null);
39
- this._comments = signal([]);
40
- this._loadingComments = signal(false);
41
- this._transitioning = signal(false);
42
- this.req = this._req.asReadonly();
43
- this.loading = this._loading.asReadonly();
44
- this.loadError = this._loadError.asReadonly();
45
- this.comments = this._comments.asReadonly();
46
- this.loadingComments = this._loadingComments.asReadonly();
47
- this.transitioning = this._transitioning.asReadonly();
48
- this.heroImgFailed = signal(false);
49
- this.heroConfig = computed(() => this.config().entityHero);
50
- this.statusStyle = computed(() => STATUS_STYLE[this._req()?.status ?? ''] ?? STATUS_STYLE['pending']);
51
- this.heroName = computed(() => {
52
- const hero = this.heroConfig();
53
- if (!hero)
54
- return undefined;
55
- return this._req()?.metadata?.[hero.nameField];
56
- });
57
- this.heroImage = computed(() => {
58
- const hero = this.heroConfig();
59
- if (!hero?.imageField)
60
- return undefined;
61
- return this._req()?.metadata?.[hero.imageField];
62
- });
63
- this.canNavigateHero = computed(() => {
64
- const hero = this.heroConfig();
65
- const metadata = this._req()?.metadata;
66
- if (!hero || !metadata)
67
- return false;
68
- return hero.canNavigate(metadata);
69
- });
70
- this.submitterInitial = computed(() => {
71
- const s = this._req()?.submitter;
72
- if (!s)
73
- return '?';
74
- return ((s.name || s.email) ?? '?').charAt(0).toUpperCase();
75
- });
76
- this.fieldEntries = computed(() => {
77
- const fields = this._req()?.fields ?? {};
78
- return Object.entries(fields)
79
- .filter(([, v]) => v != null && v !== '')
80
- .map(([k, v]) => ({ key: k, value: String(v) }));
81
- });
82
- this.errorState = computed(() => {
83
- this.i18n.lang();
84
- const err = this._loadError();
85
- const msg = (err instanceof Error ? err.message : String(err ?? '')).toLowerCase();
86
- const isOffline = msg.includes('network') || msg.includes('offline');
87
- return {
88
- variant: 'error',
89
- title: isOffline ? this.t('offlineTitle') : this.t('errorTitle'),
90
- description: isOffline ? this.t('offlineHint') : '',
91
- cta: { label: this.t('retry'), handler: () => void this.load() },
92
- };
93
- });
50
+ this.props = input.required();
51
+ this.decision = new EventEmitter();
52
+ /** ID del ítem cuyo formulario de rechazo está abierto. */
53
+ this._rejectingId = signal('');
54
+ this.rejectingId = this._rejectingId.asReadonly();
55
+ this._reason = signal('');
56
+ this.reason = this._reason.asReadonly();
57
+ this.cfg = computed(() => this.props());
58
+ this.skeletonRows = computed(() => Array.from({ length: this.cfg().skeletonRows ?? 3 }, (_, i) => i));
59
+ /** Hay una decisión en vuelo: toda la cola se congela. */
60
+ this.isBusy = computed(() => !!this.cfg().busyItemId);
61
+ if (!this.i18n.hasNamespace(NAMESPACE)) {
62
+ this.i18n.registerContent(NAMESPACE, REQUEST_REVIEW_PANEL_I18N);
63
+ }
94
64
  }
95
- ngOnInit() {
96
- void this.load();
65
+ t(key) {
66
+ return this.i18n.t(key, NAMESPACE);
97
67
  }
98
- async load() {
99
- const id = this.requestId();
100
- this._loading.set(true);
101
- this._loadError.set(null);
102
- try {
103
- const req = await firstValueFrom(this.requests.getRequest(id));
104
- this._req.set(req);
105
- this.loaded.emit(req);
106
- this.subscribeComments(req.appId, req.orgId, id);
107
- }
108
- catch (err) {
109
- this._loadError.set(err);
110
- this.errors.handle(err, {
111
- context: 'request-review-panel.load',
112
- fallbackKey: 'errorTitle',
113
- i18nNamespace: this.config().i18nNamespace,
114
- });
115
- }
116
- finally {
117
- this._loading.set(false);
118
- }
68
+ /** El ítem en vuelo muestra WORKING; los demás quedan deshabilitados. */
69
+ stateFor(item) {
70
+ const busyId = this.cfg().busyItemId;
71
+ if (busyId === item.id)
72
+ return 'WORKING';
73
+ return busyId ? 'DISABLED' : 'ENABLED';
119
74
  }
120
- subscribeComments(appId, orgId, requestId) {
121
- this._loadingComments.set(true);
122
- this.requests
123
- .watchComments(appId, orgId, requestId)
124
- .pipe(takeUntilDestroyed(this.destroyRef))
125
- .subscribe({
126
- next: comments => {
127
- this._comments.set(comments);
128
- this._loadingComments.set(false);
129
- },
130
- error: () => {
131
- // comentarios son best-effort; si el listener falla, silenciar y ocultar spinner
132
- this._loadingComments.set(false);
133
- },
134
- });
75
+ approveState(item) {
76
+ return this.stateFor(item);
135
77
  }
136
- async transition(status) {
137
- const req = this._req();
138
- if (!req || this._transitioning())
139
- return;
140
- this._transitioning.set(true);
141
- try {
142
- await firstValueFrom(this.requests.transition(req.id, { status }));
143
- await this.load();
144
- this.toast.show({ message: this.t('statusUpdated'), duration: 2500, color: 'dark', position: 'top' });
145
- }
146
- catch (err) {
147
- this.errors.handle(err, {
148
- context: 'request-review-panel.transition',
149
- fallbackKey: 'statusError',
150
- i18nNamespace: this.config().i18nNamespace,
151
- });
152
- }
153
- finally {
154
- this._transitioning.set(false);
155
- }
78
+ /**
79
+ * Confirmar el rechazo exige motivo cuando `requireRejectReason` está activo
80
+ * (el default). Es el freno que evita la notificación de rechazo vacía.
81
+ */
82
+ confirmRejectState(item) {
83
+ const state = this.stateFor(item);
84
+ if (state !== 'ENABLED')
85
+ return state;
86
+ const needsReason = this.cfg().requireRejectReason !== false;
87
+ return needsReason && this._reason().trim().length === 0 ? 'DISABLED' : 'ENABLED';
156
88
  }
157
- onHeroClick() {
158
- const hero = this.heroConfig();
159
- const metadata = this._req()?.metadata;
160
- if (hero && metadata)
161
- hero.navigate(metadata);
89
+ onReasonInput(event) {
90
+ this._reason.set(event.target.value);
162
91
  }
163
- formatDate(iso) {
164
- if (!iso)
165
- return '';
166
- try {
167
- return new Date(iso).toLocaleDateString(this.i18n.lang() === 'es' ? 'es-CL' : 'en-US', {
168
- day: 'numeric',
169
- month: 'short',
170
- year: 'numeric',
171
- });
172
- }
173
- catch {
174
- return iso;
92
+ startReject(item) {
93
+ // Sin motivo obligatorio el rechazo es directo: abrir un formulario que no
94
+ // exige nada solo agrega un paso.
95
+ if (this.cfg().requireRejectReason === false) {
96
+ this.decision.emit({ itemId: item.id, approved: false });
97
+ return;
175
98
  }
99
+ this._reason.set('');
100
+ this._rejectingId.set(item.id);
176
101
  }
177
- authorInitial(c) {
178
- return ((c.author.name || c.author.email) ?? '?').charAt(0).toUpperCase();
102
+ cancelReject() {
103
+ this._rejectingId.set('');
104
+ this._reason.set('');
179
105
  }
180
- relativeTime(iso) {
181
- if (!iso)
182
- return '';
183
- const diffMs = Date.now() - new Date(iso).getTime();
184
- if (Number.isNaN(diffMs))
185
- return iso;
186
- const lang = this.i18n.lang();
187
- const mins = Math.floor(diffMs / 60000);
188
- if (mins < 1)
189
- return lang === 'es' ? 'hace un momento' : 'just now';
190
- if (mins < 60)
191
- return lang === 'es' ? `hace ${mins} min` : `${mins}m ago`;
192
- const hours = Math.floor(mins / 60);
193
- if (hours < 24)
194
- return lang === 'es' ? `hace ${hours} h` : `${hours}h ago`;
195
- const days = Math.floor(hours / 24);
196
- if (days < 7)
197
- return lang === 'es' ? `hace ${days} dia${days > 1 ? 's' : ''}` : `${days}d ago`;
198
- return this.formatDate(iso);
106
+ confirmReject(item) {
107
+ const reason = this._reason().trim();
108
+ if (this.cfg().requireRejectReason !== false && reason.length === 0)
109
+ return;
110
+ this.decision.emit({ itemId: item.id, approved: false, reason: reason || undefined });
111
+ this.cancelReject();
199
112
  }
200
- t(key) {
201
- return this.i18n.t(key, this.config().i18nNamespace);
113
+ approve(item) {
114
+ this.decision.emit({ itemId: item.id, approved: true });
202
115
  }
203
116
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RequestReviewPanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
204
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: RequestReviewPanelComponent, isStandalone: true, selector: "val-request-review-panel", inputs: { requestId: { classPropertyName: "requestId", publicName: "requestId", isSignal: true, isRequired: true, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { loaded: "loaded" }, ngImport: i0, template: `
205
- <div class="page">
206
- @if (loading()) {
207
- <div class="skel" aria-hidden="true">
208
- <val-skeleton [props]="{ width: '100%', height: '88px', borderRadius: '14px' }" />
209
- <val-skeleton [props]="{ width: '100%', height: '64px', borderRadius: '12px' }" />
210
- <val-skeleton [props]="{ width: '100%', height: '80px', borderRadius: '12px' }" />
211
- <val-skeleton [props]="{ width: '100%', height: '120px', borderRadius: '12px' }" />
212
- </div>
213
- } @else if (loadError()) {
214
- <val-empty-state [props]="errorState()" />
215
- } @else if (req()) {
216
- <div class="detail">
217
- @if (heroConfig() && heroName()) {
218
- <button class="entity-hero" (click)="onHeroClick()" [disabled]="!canNavigateHero()">
219
- <div class="entity-hero__media">
220
- @if (heroImage() && !heroImgFailed()) {
221
- <img
222
- [src]="heroImage()"
223
- [alt]="heroName()!"
224
- loading="lazy"
225
- (error)="heroImgFailed.set(true)"
226
- class="entity-hero__img"
227
- />
228
- } @else {
229
- <span class="entity-hero__placeholder" aria-hidden="true">{{
230
- heroConfig()!.placeholderIcon || '📄'
231
- }}</span>
232
- }
233
- </div>
234
- <div class="entity-hero__body">
235
- <span class="entity-hero__label">{{ t(heroConfig()!.labelKey) }}</span>
236
- <span class="entity-hero__name">{{ heroName() }}</span>
237
- </div>
238
- @if (canNavigateHero()) {
239
- <span class="entity-hero__chevron" aria-hidden="true">›</span>
240
- }
241
- </button>
117
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: RequestReviewPanelComponent, isStandalone: true, selector: "val-request-review-panel", inputs: { props: { classPropertyName: "props", publicName: "props", isSignal: true, isRequired: true, transformFunction: null }, itemBody: { classPropertyName: "itemBody", publicName: "itemBody", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { decision: "decision" }, ngImport: i0, template: `
118
+ <div class="rrp">
119
+ @if (cfg().loading) {
120
+ <div class="rrp__skel" aria-hidden="true">
121
+ @for (row of skeletonRows(); track row) {
122
+ <val-skeleton [props]="{ width: '100%', height: '120px', borderRadius: '14px' }" />
242
123
  }
124
+ </div>
125
+ } @else if (cfg().errorState) {
126
+ <val-empty-state [props]="cfg().errorState!" />
127
+ } @else if (cfg().items.length === 0) {
128
+ @if (cfg().emptyState; as empty) {
129
+ <val-empty-state [props]="empty" />
130
+ }
131
+ } @else {
132
+ @if (cfg().countLabel; as count) {
133
+ <p class="rrp__count">{{ count }}</p>
134
+ }
243
135
 
244
- <div class="status-card" [style.border-left-color]="statusStyle().bg">
245
- <div class="status-card__top">
246
- <span class="status-badge" [style.background]="statusStyle().bg" [style.color]="statusStyle().color">
247
- {{ t('status_' + req()!.status) }}
248
- </span>
249
- <span class="submitted-at">{{ t('submittedAt') }}: {{ formatDate(req()!.createdAt) }}</span>
250
- </div>
136
+ <ul class="rrp__queue">
137
+ @for (item of cfg().items; track item.id) {
138
+ <li class="rrp__item">
139
+ <h3 class="rrp__title">{{ item.title }}</h3>
251
140
 
252
- @if (config().canReview() && (req()!.status === 'pending' || req()!.status === 'in_review')) {
253
- <div class="actions-row">
254
- <val-button
255
- [props]="{
256
- token: 'approve',
257
- text: t('approve'),
258
- color: 'primary',
259
- fill: 'solid',
260
- shape: 'round',
261
- size: 'small',
262
- type: 'button',
263
- state: transitioning() ? 'WORKING' : 'ENABLED',
264
- handler: transition.bind(this, 'approved'),
265
- }"
266
- />
267
- <val-button
268
- [props]="{
269
- token: 'reject',
270
- text: t('reject'),
271
- color: 'medium',
272
- fill: 'outline',
273
- shape: 'round',
274
- size: 'small',
275
- type: 'button',
276
- state: transitioning() ? 'WORKING' : 'ENABLED',
277
- handler: transition.bind(this, 'rejected'),
278
- }"
279
- />
280
- </div>
281
- }
282
- </div>
141
+ @for (line of item.meta ?? []; track line) {
142
+ <p class="rrp__meta">{{ line }}</p>
143
+ }
283
144
 
284
- @if (req()!.submitter) {
285
- <div class="section">
286
- <p class="section__title">{{ t('submitter') }}</p>
287
- <div class="submitter-row">
288
- <div class="submitter-avatar" aria-hidden="true">{{ submitterInitial() }}</div>
289
- <div class="submitter-info">
290
- @if (req()!.submitter!.name) {
291
- <span class="submitter-name">{{ req()!.submitter!.name }}</span>
292
- }
293
- @if (req()!.submitter!.email) {
294
- <span class="submitter-email">{{ req()!.submitter!.email }}</span>
295
- }
296
- @if (req()!.submitter!.phone) {
297
- <span class="submitter-email">{{ req()!.submitter!.phone }}</span>
298
- }
145
+ @if (itemBody) {
146
+ <div class="rrp__body">
147
+ <ng-container
148
+ [ngTemplateOutlet]="itemBody"
149
+ [ngTemplateOutletContext]="{ $implicit: item, item: item }"
150
+ />
299
151
  </div>
300
- </div>
301
- </div>
302
- }
152
+ }
153
+
154
+ @if (rejectingId() === item.id) {
155
+ <div class="rrp__reject">
156
+ <label class="rrp__reject-label" [attr.for]="'rrp-note-' + item.id">
157
+ {{ cfg().rejectReasonLabel ?? t('rejectReason') }}
158
+ </label>
159
+ <textarea
160
+ class="rrp__reject-input"
161
+ [id]="'rrp-note-' + item.id"
162
+ rows="3"
163
+ [placeholder]="cfg().rejectReasonPlaceholder ?? t('rejectReasonPlaceholder')"
164
+ [value]="reason()"
165
+ (input)="onReasonInput($event)"
166
+ ></textarea>
167
+ <p class="rrp__reject-hint">
168
+ {{ cfg().rejectReasonHint ?? t('rejectReasonHint') }}
169
+ </p>
303
170
 
304
- @if (fieldEntries().length) {
305
- <div class="section">
306
- <p class="section__title">{{ t('fields') }}</p>
307
- @for (entry of fieldEntries(); track entry.key) {
308
- <div class="field-row">
309
- <span class="field-row__label">{{ entry.key }}</span>
310
- <span class="field-row__value">{{ entry.value }}</span>
171
+ <div class="rrp__actions">
172
+ <val-button
173
+ [props]="{
174
+ token: 'rrp-cancel-' + item.id,
175
+ text: cfg().cancelLabel ?? t('cancel'),
176
+ color: 'dark',
177
+ fill: 'clear',
178
+ size: 'small',
179
+ type: 'button',
180
+ state: isBusy() ? 'DISABLED' : 'ENABLED',
181
+ }"
182
+ (onClick)="cancelReject()"
183
+ />
184
+ <val-button
185
+ [props]="{
186
+ token: 'rrp-confirm-reject-' + item.id,
187
+ text: cfg().confirmRejectLabel ?? t('confirmReject'),
188
+ color: 'danger',
189
+ fill: 'solid',
190
+ shape: 'round',
191
+ size: 'small',
192
+ type: 'button',
193
+ state: confirmRejectState(item),
194
+ }"
195
+ (onClick)="confirmReject(item)"
196
+ />
197
+ </div>
198
+ </div>
199
+ } @else {
200
+ <div class="rrp__actions">
201
+ <val-button
202
+ [props]="{
203
+ token: 'rrp-reject-' + item.id,
204
+ text: cfg().rejectLabel ?? t('reject'),
205
+ color: 'dark',
206
+ fill: 'outline',
207
+ shape: 'round',
208
+ size: 'small',
209
+ type: 'button',
210
+ state: isBusy() ? 'DISABLED' : 'ENABLED',
211
+ }"
212
+ (onClick)="startReject(item)"
213
+ />
214
+ <val-button
215
+ [props]="{
216
+ token: 'rrp-approve-' + item.id,
217
+ text: cfg().approveLabel ?? t('approve'),
218
+ color: 'primary',
219
+ fill: 'solid',
220
+ shape: 'round',
221
+ size: 'small',
222
+ type: 'button',
223
+ state: approveState(item),
224
+ }"
225
+ (onClick)="approve(item)"
226
+ />
311
227
  </div>
312
228
  }
313
- </div>
229
+ </li>
314
230
  }
315
-
316
- @if (
317
- !config().canReview() && req()!.status === 'approved' && canNavigateHero() && config().viewEntityCtaLabelKey
318
- ) {
319
- <val-button
320
- [props]="{
321
- token: 'view-entity',
322
- text: t(config().viewEntityCtaLabelKey!),
323
- color: 'primary',
324
- fill: 'solid',
325
- shape: 'round',
326
- size: 'default',
327
- type: 'button',
328
- state: 'ENABLED',
329
- handler: onHeroClick.bind(this),
330
- }"
331
- />
332
- }
333
-
334
- <div class="section">
335
- <p class="section__title">{{ t('commentsTitle') }}</p>
336
- @if (loadingComments()) {
337
- <div class="section-pad">
338
- <val-skeleton [props]="{ width: '100%', height: '48px', borderRadius: '8px' }" />
339
- </div>
340
- } @else if (comments().length === 0) {
341
- <p class="no-comments">{{ t('noComments') }}</p>
342
- } @else {
343
- <ul class="comments">
344
- @for (c of comments(); track c.commentId) {
345
- <li class="comment">
346
- <div class="comment__avatar" aria-hidden="true">{{ authorInitial(c) }}</div>
347
- <div class="comment__content">
348
- <div class="comment__header">
349
- <span class="comment__author">{{ c.author.name || c.author.email }}</span>
350
- <span class="comment__date">{{ relativeTime(c.createdAt) }}</span>
351
- </div>
352
- <p class="comment__body">{{ c.body }}</p>
353
- </div>
354
- </li>
355
- }
356
- </ul>
357
- }
358
- </div>
359
- </div>
231
+ </ul>
360
232
  }
361
233
  </div>
362
- `, isInline: true, styles: [".page{display:flex;flex-direction:column;gap:14px}.skel{display:flex;flex-direction:column;gap:12px}.skel val-skeleton{display:block}.detail{display:flex;flex-direction:column;gap:14px}.entity-hero{display:flex;align-items:center;gap:14px;padding:14px 16px;background:var(--ion-card-background, var(--ion-background-color, #fff));border-radius:14px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .08));width:100%;text-align:left;cursor:pointer}.entity-hero:disabled{cursor:default}.entity-hero__media{width:56px;height:56px;border-radius:12px;overflow:hidden;flex-shrink:0;background:var(--ion-color-light, #f4f5f8);display:flex;align-items:center;justify-content:center}.entity-hero__img{width:100%;height:100%;object-fit:cover}.entity-hero__placeholder{font-size:1.625rem}.entity-hero__body{flex:1;display:flex;flex-direction:column;gap:2px;min-width:0}.entity-hero__label{font-size:.75rem;color:var(--ion-color-dark, #636469)}.entity-hero__name{font-size:1rem;font-weight:600;color:var(--ion-text-color, #000);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.entity-hero__chevron{font-size:1.5rem;color:var(--ion-color-dark, #92949c);line-height:1}.status-card{background:var(--ion-card-background, var(--ion-background-color, #fff));border-radius:12px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .08));border-left:4px solid;padding:14px 16px;display:flex;flex-direction:column;gap:12px}.status-card__top{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.status-badge{display:inline-block;padding:4px 12px;border-radius:100px;font-size:.8125rem;font-weight:700}.submitted-at{font-size:.8125rem;color:var(--ion-color-dark-shade, #1e2023)}.actions-row{display:flex;gap:10px;flex-wrap:wrap}.section{background:var(--ion-card-background, var(--ion-background-color, #fff));border-radius:12px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .08));overflow:hidden}.section__title{margin:0;font-size:.8125rem;font-weight:600;color:var(--ion-color-dark-shade, #1e2023);padding:12px 16px 0}.section-pad{padding:12px 16px}.submitter-row{display:flex;align-items:center;gap:12px;padding:12px 16px}.submitter-avatar{width:40px;height:40px;border-radius:50%;background:var(--ion-color-primary, #313131);color:var(--ion-color-primary-contrast, #fff);display:flex;align-items:center;justify-content:center;font-size:1rem;font-weight:700;flex-shrink:0}.submitter-info{display:flex;flex-direction:column;gap:2px;min-width:0}.submitter-name{font-size:.9375rem;font-weight:600;color:var(--ion-text-color, #000)}.submitter-email{font-size:.8125rem;color:var(--ion-color-dark, #636469);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.field-row{display:flex;flex-direction:column;gap:3px;padding:11px 16px;border-bottom:1px solid var(--ion-border-color, rgba(0, 0, 0, .06))}.field-row:last-child{border-bottom:none}.field-row__label{font-size:.75rem;color:var(--ion-color-dark, #636469);text-transform:capitalize}.field-row__value{font-size:.9375rem;color:var(--ion-text-color, #000);font-weight:500;word-break:break-word;white-space:pre-line}.no-comments{margin:0;padding:12px 16px;font-size:.875rem;color:var(--ion-color-dark, #92949c)}.comments{list-style:none;margin:0;padding:0}.comment{display:flex;align-items:flex-start;gap:10px;padding:12px 16px;border-bottom:1px solid var(--ion-border-color, rgba(0, 0, 0, .06))}.comment:last-child{border-bottom:none}.comment__avatar{width:32px;height:32px;border-radius:50%;background:var(--ion-color-primary, #313131);color:var(--ion-color-primary-contrast, #fff);display:flex;align-items:center;justify-content:center;font-size:.75rem;font-weight:700;flex-shrink:0}.comment__content{flex:1;min-width:0;display:flex;flex-direction:column;gap:3px}.comment__header{display:flex;align-items:baseline;justify-content:space-between;gap:8px}.comment__author{font-size:.875rem;font-weight:600;color:var(--ion-text-color, #000)}.comment__date{font-size:.75rem;color:var(--ion-color-dark, #92949c);white-space:nowrap}.comment__body{margin:0;font-size:.875rem;color:var(--ion-text-color, #000);line-height:1.5;white-space:pre-line}\n"], dependencies: [{ kind: "component", type: ButtonComponent, selector: "val-button", inputs: ["preset", "props"], outputs: ["onClick"] }, { kind: "component", type: EmptyStateComponent, selector: "val-empty-state", inputs: ["props"] }, { kind: "component", type: SkeletonComponent, selector: "val-skeleton", inputs: ["props"] }] }); }
234
+ `, isInline: true, styles: [":host{display:block}.rrp{display:flex;flex-direction:column;gap:12px}.rrp__skel{display:flex;flex-direction:column;gap:10px}.rrp__count{margin:0;font-size:.8125rem;font-weight:700;color:var(--ion-color-medium, #92949c);font-variant-numeric:tabular-nums}.rrp__queue{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:12px}.rrp__item{display:flex;flex-direction:column;gap:8px;padding:14px 16px;border-radius:14px;background:var(--ion-card-background, var(--ion-background-color, #fff));border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1))}.rrp__title{margin:0;font-size:1rem;font-weight:700;color:var(--ion-text-color, #000)}.rrp__meta{margin:0;font-size:.8125rem;color:var(--ion-color-medium, #92949c)}.rrp__body{display:flex;flex-direction:column;gap:8px}.rrp__reject{display:flex;flex-direction:column;gap:6px}.rrp__reject-label{font-size:.8125rem;font-weight:600;color:var(--ion-text-color, #000)}.rrp__reject-input{width:100%;box-sizing:border-box;padding:10px 12px;border-radius:10px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));background:var(--ion-background-color, #fff);color:var(--ion-text-color, #000);font-family:inherit;font-size:.875rem;resize:vertical}.rrp__reject-input:focus{outline:none;border-color:var(--ion-color-primary)}.rrp__reject-hint{margin:0;font-size:.75rem;color:var(--ion-color-medium, #92949c)}.rrp__actions{display:flex;flex-direction:column;gap:8px;margin-top:4px}@media (min-width: 576px){.rrp__actions{flex-direction:row;justify-content:flex-end;align-items:center;flex-wrap:wrap}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: ButtonComponent, selector: "val-button", inputs: ["preset", "props"], outputs: ["onClick"] }, { kind: "component", type: EmptyStateComponent, selector: "val-empty-state", inputs: ["props"] }, { kind: "component", type: SkeletonComponent, selector: "val-skeleton", inputs: ["props"] }] }); }
363
235
  }
364
236
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RequestReviewPanelComponent, decorators: [{
365
237
  type: Component,
366
- args: [{ selector: 'val-request-review-panel', standalone: true, imports: [ButtonComponent, EmptyStateComponent, SkeletonComponent], template: `
367
- <div class="page">
368
- @if (loading()) {
369
- <div class="skel" aria-hidden="true">
370
- <val-skeleton [props]="{ width: '100%', height: '88px', borderRadius: '14px' }" />
371
- <val-skeleton [props]="{ width: '100%', height: '64px', borderRadius: '12px' }" />
372
- <val-skeleton [props]="{ width: '100%', height: '80px', borderRadius: '12px' }" />
373
- <val-skeleton [props]="{ width: '100%', height: '120px', borderRadius: '12px' }" />
374
- </div>
375
- } @else if (loadError()) {
376
- <val-empty-state [props]="errorState()" />
377
- } @else if (req()) {
378
- <div class="detail">
379
- @if (heroConfig() && heroName()) {
380
- <button class="entity-hero" (click)="onHeroClick()" [disabled]="!canNavigateHero()">
381
- <div class="entity-hero__media">
382
- @if (heroImage() && !heroImgFailed()) {
383
- <img
384
- [src]="heroImage()"
385
- [alt]="heroName()!"
386
- loading="lazy"
387
- (error)="heroImgFailed.set(true)"
388
- class="entity-hero__img"
389
- />
390
- } @else {
391
- <span class="entity-hero__placeholder" aria-hidden="true">{{
392
- heroConfig()!.placeholderIcon || '📄'
393
- }}</span>
394
- }
395
- </div>
396
- <div class="entity-hero__body">
397
- <span class="entity-hero__label">{{ t(heroConfig()!.labelKey) }}</span>
398
- <span class="entity-hero__name">{{ heroName() }}</span>
399
- </div>
400
- @if (canNavigateHero()) {
401
- <span class="entity-hero__chevron" aria-hidden="true">›</span>
402
- }
403
- </button>
238
+ args: [{ selector: 'val-request-review-panel', standalone: true, imports: [CommonModule, ButtonComponent, EmptyStateComponent, SkeletonComponent], template: `
239
+ <div class="rrp">
240
+ @if (cfg().loading) {
241
+ <div class="rrp__skel" aria-hidden="true">
242
+ @for (row of skeletonRows(); track row) {
243
+ <val-skeleton [props]="{ width: '100%', height: '120px', borderRadius: '14px' }" />
404
244
  }
245
+ </div>
246
+ } @else if (cfg().errorState) {
247
+ <val-empty-state [props]="cfg().errorState!" />
248
+ } @else if (cfg().items.length === 0) {
249
+ @if (cfg().emptyState; as empty) {
250
+ <val-empty-state [props]="empty" />
251
+ }
252
+ } @else {
253
+ @if (cfg().countLabel; as count) {
254
+ <p class="rrp__count">{{ count }}</p>
255
+ }
405
256
 
406
- <div class="status-card" [style.border-left-color]="statusStyle().bg">
407
- <div class="status-card__top">
408
- <span class="status-badge" [style.background]="statusStyle().bg" [style.color]="statusStyle().color">
409
- {{ t('status_' + req()!.status) }}
410
- </span>
411
- <span class="submitted-at">{{ t('submittedAt') }}: {{ formatDate(req()!.createdAt) }}</span>
412
- </div>
257
+ <ul class="rrp__queue">
258
+ @for (item of cfg().items; track item.id) {
259
+ <li class="rrp__item">
260
+ <h3 class="rrp__title">{{ item.title }}</h3>
413
261
 
414
- @if (config().canReview() && (req()!.status === 'pending' || req()!.status === 'in_review')) {
415
- <div class="actions-row">
416
- <val-button
417
- [props]="{
418
- token: 'approve',
419
- text: t('approve'),
420
- color: 'primary',
421
- fill: 'solid',
422
- shape: 'round',
423
- size: 'small',
424
- type: 'button',
425
- state: transitioning() ? 'WORKING' : 'ENABLED',
426
- handler: transition.bind(this, 'approved'),
427
- }"
428
- />
429
- <val-button
430
- [props]="{
431
- token: 'reject',
432
- text: t('reject'),
433
- color: 'medium',
434
- fill: 'outline',
435
- shape: 'round',
436
- size: 'small',
437
- type: 'button',
438
- state: transitioning() ? 'WORKING' : 'ENABLED',
439
- handler: transition.bind(this, 'rejected'),
440
- }"
441
- />
442
- </div>
443
- }
444
- </div>
262
+ @for (line of item.meta ?? []; track line) {
263
+ <p class="rrp__meta">{{ line }}</p>
264
+ }
445
265
 
446
- @if (req()!.submitter) {
447
- <div class="section">
448
- <p class="section__title">{{ t('submitter') }}</p>
449
- <div class="submitter-row">
450
- <div class="submitter-avatar" aria-hidden="true">{{ submitterInitial() }}</div>
451
- <div class="submitter-info">
452
- @if (req()!.submitter!.name) {
453
- <span class="submitter-name">{{ req()!.submitter!.name }}</span>
454
- }
455
- @if (req()!.submitter!.email) {
456
- <span class="submitter-email">{{ req()!.submitter!.email }}</span>
457
- }
458
- @if (req()!.submitter!.phone) {
459
- <span class="submitter-email">{{ req()!.submitter!.phone }}</span>
460
- }
266
+ @if (itemBody) {
267
+ <div class="rrp__body">
268
+ <ng-container
269
+ [ngTemplateOutlet]="itemBody"
270
+ [ngTemplateOutletContext]="{ $implicit: item, item: item }"
271
+ />
461
272
  </div>
462
- </div>
463
- </div>
464
- }
273
+ }
274
+
275
+ @if (rejectingId() === item.id) {
276
+ <div class="rrp__reject">
277
+ <label class="rrp__reject-label" [attr.for]="'rrp-note-' + item.id">
278
+ {{ cfg().rejectReasonLabel ?? t('rejectReason') }}
279
+ </label>
280
+ <textarea
281
+ class="rrp__reject-input"
282
+ [id]="'rrp-note-' + item.id"
283
+ rows="3"
284
+ [placeholder]="cfg().rejectReasonPlaceholder ?? t('rejectReasonPlaceholder')"
285
+ [value]="reason()"
286
+ (input)="onReasonInput($event)"
287
+ ></textarea>
288
+ <p class="rrp__reject-hint">
289
+ {{ cfg().rejectReasonHint ?? t('rejectReasonHint') }}
290
+ </p>
465
291
 
466
- @if (fieldEntries().length) {
467
- <div class="section">
468
- <p class="section__title">{{ t('fields') }}</p>
469
- @for (entry of fieldEntries(); track entry.key) {
470
- <div class="field-row">
471
- <span class="field-row__label">{{ entry.key }}</span>
472
- <span class="field-row__value">{{ entry.value }}</span>
292
+ <div class="rrp__actions">
293
+ <val-button
294
+ [props]="{
295
+ token: 'rrp-cancel-' + item.id,
296
+ text: cfg().cancelLabel ?? t('cancel'),
297
+ color: 'dark',
298
+ fill: 'clear',
299
+ size: 'small',
300
+ type: 'button',
301
+ state: isBusy() ? 'DISABLED' : 'ENABLED',
302
+ }"
303
+ (onClick)="cancelReject()"
304
+ />
305
+ <val-button
306
+ [props]="{
307
+ token: 'rrp-confirm-reject-' + item.id,
308
+ text: cfg().confirmRejectLabel ?? t('confirmReject'),
309
+ color: 'danger',
310
+ fill: 'solid',
311
+ shape: 'round',
312
+ size: 'small',
313
+ type: 'button',
314
+ state: confirmRejectState(item),
315
+ }"
316
+ (onClick)="confirmReject(item)"
317
+ />
318
+ </div>
319
+ </div>
320
+ } @else {
321
+ <div class="rrp__actions">
322
+ <val-button
323
+ [props]="{
324
+ token: 'rrp-reject-' + item.id,
325
+ text: cfg().rejectLabel ?? t('reject'),
326
+ color: 'dark',
327
+ fill: 'outline',
328
+ shape: 'round',
329
+ size: 'small',
330
+ type: 'button',
331
+ state: isBusy() ? 'DISABLED' : 'ENABLED',
332
+ }"
333
+ (onClick)="startReject(item)"
334
+ />
335
+ <val-button
336
+ [props]="{
337
+ token: 'rrp-approve-' + item.id,
338
+ text: cfg().approveLabel ?? t('approve'),
339
+ color: 'primary',
340
+ fill: 'solid',
341
+ shape: 'round',
342
+ size: 'small',
343
+ type: 'button',
344
+ state: approveState(item),
345
+ }"
346
+ (onClick)="approve(item)"
347
+ />
473
348
  </div>
474
349
  }
475
- </div>
476
- }
477
-
478
- @if (
479
- !config().canReview() && req()!.status === 'approved' && canNavigateHero() && config().viewEntityCtaLabelKey
480
- ) {
481
- <val-button
482
- [props]="{
483
- token: 'view-entity',
484
- text: t(config().viewEntityCtaLabelKey!),
485
- color: 'primary',
486
- fill: 'solid',
487
- shape: 'round',
488
- size: 'default',
489
- type: 'button',
490
- state: 'ENABLED',
491
- handler: onHeroClick.bind(this),
492
- }"
493
- />
350
+ </li>
494
351
  }
495
-
496
- <div class="section">
497
- <p class="section__title">{{ t('commentsTitle') }}</p>
498
- @if (loadingComments()) {
499
- <div class="section-pad">
500
- <val-skeleton [props]="{ width: '100%', height: '48px', borderRadius: '8px' }" />
501
- </div>
502
- } @else if (comments().length === 0) {
503
- <p class="no-comments">{{ t('noComments') }}</p>
504
- } @else {
505
- <ul class="comments">
506
- @for (c of comments(); track c.commentId) {
507
- <li class="comment">
508
- <div class="comment__avatar" aria-hidden="true">{{ authorInitial(c) }}</div>
509
- <div class="comment__content">
510
- <div class="comment__header">
511
- <span class="comment__author">{{ c.author.name || c.author.email }}</span>
512
- <span class="comment__date">{{ relativeTime(c.createdAt) }}</span>
513
- </div>
514
- <p class="comment__body">{{ c.body }}</p>
515
- </div>
516
- </li>
517
- }
518
- </ul>
519
- }
520
- </div>
521
- </div>
352
+ </ul>
522
353
  }
523
354
  </div>
524
- `, styles: [".page{display:flex;flex-direction:column;gap:14px}.skel{display:flex;flex-direction:column;gap:12px}.skel val-skeleton{display:block}.detail{display:flex;flex-direction:column;gap:14px}.entity-hero{display:flex;align-items:center;gap:14px;padding:14px 16px;background:var(--ion-card-background, var(--ion-background-color, #fff));border-radius:14px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .08));width:100%;text-align:left;cursor:pointer}.entity-hero:disabled{cursor:default}.entity-hero__media{width:56px;height:56px;border-radius:12px;overflow:hidden;flex-shrink:0;background:var(--ion-color-light, #f4f5f8);display:flex;align-items:center;justify-content:center}.entity-hero__img{width:100%;height:100%;object-fit:cover}.entity-hero__placeholder{font-size:1.625rem}.entity-hero__body{flex:1;display:flex;flex-direction:column;gap:2px;min-width:0}.entity-hero__label{font-size:.75rem;color:var(--ion-color-dark, #636469)}.entity-hero__name{font-size:1rem;font-weight:600;color:var(--ion-text-color, #000);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.entity-hero__chevron{font-size:1.5rem;color:var(--ion-color-dark, #92949c);line-height:1}.status-card{background:var(--ion-card-background, var(--ion-background-color, #fff));border-radius:12px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .08));border-left:4px solid;padding:14px 16px;display:flex;flex-direction:column;gap:12px}.status-card__top{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.status-badge{display:inline-block;padding:4px 12px;border-radius:100px;font-size:.8125rem;font-weight:700}.submitted-at{font-size:.8125rem;color:var(--ion-color-dark-shade, #1e2023)}.actions-row{display:flex;gap:10px;flex-wrap:wrap}.section{background:var(--ion-card-background, var(--ion-background-color, #fff));border-radius:12px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .08));overflow:hidden}.section__title{margin:0;font-size:.8125rem;font-weight:600;color:var(--ion-color-dark-shade, #1e2023);padding:12px 16px 0}.section-pad{padding:12px 16px}.submitter-row{display:flex;align-items:center;gap:12px;padding:12px 16px}.submitter-avatar{width:40px;height:40px;border-radius:50%;background:var(--ion-color-primary, #313131);color:var(--ion-color-primary-contrast, #fff);display:flex;align-items:center;justify-content:center;font-size:1rem;font-weight:700;flex-shrink:0}.submitter-info{display:flex;flex-direction:column;gap:2px;min-width:0}.submitter-name{font-size:.9375rem;font-weight:600;color:var(--ion-text-color, #000)}.submitter-email{font-size:.8125rem;color:var(--ion-color-dark, #636469);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.field-row{display:flex;flex-direction:column;gap:3px;padding:11px 16px;border-bottom:1px solid var(--ion-border-color, rgba(0, 0, 0, .06))}.field-row:last-child{border-bottom:none}.field-row__label{font-size:.75rem;color:var(--ion-color-dark, #636469);text-transform:capitalize}.field-row__value{font-size:.9375rem;color:var(--ion-text-color, #000);font-weight:500;word-break:break-word;white-space:pre-line}.no-comments{margin:0;padding:12px 16px;font-size:.875rem;color:var(--ion-color-dark, #92949c)}.comments{list-style:none;margin:0;padding:0}.comment{display:flex;align-items:flex-start;gap:10px;padding:12px 16px;border-bottom:1px solid var(--ion-border-color, rgba(0, 0, 0, .06))}.comment:last-child{border-bottom:none}.comment__avatar{width:32px;height:32px;border-radius:50%;background:var(--ion-color-primary, #313131);color:var(--ion-color-primary-contrast, #fff);display:flex;align-items:center;justify-content:center;font-size:.75rem;font-weight:700;flex-shrink:0}.comment__content{flex:1;min-width:0;display:flex;flex-direction:column;gap:3px}.comment__header{display:flex;align-items:baseline;justify-content:space-between;gap:8px}.comment__author{font-size:.875rem;font-weight:600;color:var(--ion-text-color, #000)}.comment__date{font-size:.75rem;color:var(--ion-color-dark, #92949c);white-space:nowrap}.comment__body{margin:0;font-size:.875rem;color:var(--ion-text-color, #000);line-height:1.5;white-space:pre-line}\n"] }]
525
- }], ctorParameters: () => [] });
526
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1yZXZpZXctcGFuZWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL29yZ2FuaXNtcy9yZXF1ZXN0LXJldmlldy1wYW5lbC9yZXF1ZXN0LXJldmlldy1wYW5lbC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQVUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2RyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXRDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUM1RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDbEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDckYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQy9ELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBRXhGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQzs7QUFNdEUsTUFBTSxZQUFZLEdBQWdDO0lBQ2hELFFBQVEsRUFBRSxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRTtJQUMxQyxRQUFRLEVBQUUsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUU7SUFDMUMsU0FBUyxFQUFFLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVB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LEdBQUcsQ0FBQztZQUFFLE9BQU8sSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxJQUFJLE9BQU8sSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLE9BQU8sQ0FBQztRQUMvRixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVELENBQUMsQ0FBQyxHQUFXO1FBQ1gsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7K0dBOUtVLDJCQUEyQjttR0FBM0IsMkJBQTJCLDRYQWphNUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBOEpULG1sSUEvSlMsZUFBZSwwR0FBRSxtQkFBbUIsK0VBQUUsaUJBQWlCOzs0RkFrYXRELDJCQUEyQjtrQkFyYXZDLFNBQVM7K0JBQ0UsMEJBQTBCLGNBQ3hCLElBQUksV0FDUCxDQUFDLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxpQkFBaUIsQ0FBQyxZQUN4RDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4SlQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIERlc3Ryb3lSZWYsIE9uSW5pdCwgY29tcHV0ZWQsIGluamVjdCwgaW5wdXQsIG91dHB1dCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQXBwUmVxdWVzdCwgUmVxdWVzdENvbW1lbnQgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9yZXF1ZXN0cy90eXBlcyc7XG5pbXBvcnQgeyBSZXF1ZXN0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3JlcXVlc3RzL3JlcXVlc3Quc2VydmljZSc7XG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2kxOG4vaTE4bi5zZXJ2aWNlJztcbmltcG9ydCB7IFZhbHRlY2hFcnJvclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9lcnJvcnMvdmFsdGVjaC1lcnJvci5zZXJ2aWNlJztcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3RvYXN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgRW1wdHlTdGF0ZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy9lbXB0eS1zdGF0ZS9lbXB0eS1zdGF0ZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgRW1wdHlTdGF0ZU1ldGFkYXRhIH0gZnJvbSAnLi4vLi4vbW9sZWN1bGVzL2VtcHR5LXN0YXRlL3R5cGVzJztcbmltcG9ydCB7IFNrZWxldG9uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYXRvbXMvc2tlbGV0b24vc2tlbGV0b24uY29tcG9uZW50JztcbmltcG9ydCB7IEJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2F0b21zL2J1dHRvbi9idXR0b24uY29tcG9uZW50JztcblxuaW50ZXJmYWNlIFN0YXR1c1N0eWxlIHtcbiAgYmc6IHN0cmluZztcbiAgY29sb3I6IHN0cmluZztcbn1cbmNvbnN0IFNUQVRVU19TVFlMRTogUmVjb3JkPHN0cmluZywgU3RhdHVzU3R5bGU+ID0ge1xuICBhcHByb3ZlZDogeyBiZzogJyMyMmM1NWUnLCBjb2xvcjogJyNmZmYnIH0sXG4gIHJlamVjdGVkOiB7IGJnOiAnI2VmNDQ0NCcsIGNvbG9yOiAnI2ZmZicgfSxcbiAgaW5fcmV2aWV3OiB7IGJnOiAnI2ZlZjNjNycsIGNvbG9yOiAnIzkyNDAwZScgfSxcbiAgcGVuZGluZzogeyBiZzogJ3ZhcigtLWlvbi1jb2xvci1saWdodCwgI2Y0ZjVmOCknLCBjb2xvcjogJ3ZhcigtLWlvbi1jb2xvci1kYXJrLCAjMjIyKScgfSxcbiAgY2FuY2VsbGVkOiB7IGJnOiAndmFyKC0taW9uLWNvbG9yLWxpZ2h0LCAjZjRmNWY4KScsIGNvbG9yOiAndmFyKC0taW9uLWNvbG9yLW1lZGl1bSwgIzYzNjQ2OSknIH0sXG4gIGNsb3NlZDogeyBiZzogJ3ZhcigtLWlvbi1jb2xvci1saWdodCwgI2Y0ZjVmOCknLCBjb2xvcjogJ3ZhcigtLWlvbi1jb2xvci1tZWRpdW0sICM2MzY0NjkpJyB9LFxufTtcblxuLyoqXG4gKiBDb25maWcgZGVsIFwiZW50aXR5IGhlcm9cIiAoYmxvcXVlIG9wY2lvbmFsIGFycmliYSBkZWwgc3RhdHVzOiBlai4gYW5pbWFsIGVuXG4gKiBDaGVzZWQsIHJlY2V0YSBlbiBNZWFscGxhbikuIEFnbsOzc3RpY28gYWwgZG9taW5pbyDigJQgY2FkYSBhcHAgZGVjbGFyYSBkZSBxdcOpXG4gKiBjYW1wb3MgZGUgYG1ldGFkYXRhYCBzYWNhciBub21icmUvaW1hZ2VuIHkgYSBkw7NuZGUgbmF2ZWdhci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXF1ZXN0UmV2aWV3RW50aXR5SGVyb0NvbmZpZyB7XG4gIGxhYmVsS2V5OiBzdHJpbmc7XG4gIG5hbWVGaWVsZDogc3RyaW5nO1xuICBpbWFnZUZpZWxkPzogc3RyaW5nO1xuICBwbGFjZWhvbGRlckljb24/OiBzdHJpbmc7XG4gIGNhbk5hdmlnYXRlOiAobWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IGJvb2xlYW47XG4gIG5hdmlnYXRlOiAobWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVxdWVzdFJldmlld1BhbmVsQ29uZmlnIHtcbiAgLyoqIE5hbWVzcGFjZSBpMThuIGRvbmRlIHZpdmVuIGxhcyBrZXlzIChzdGF0dXNfKiwgYXBwcm92ZSwgcmVqZWN0LCBzdWJtaXR0ZXIsIGZpZWxkcywgY29tbWVudHNUaXRsZSwgbm9Db21tZW50cywgc3VibWl0dGVkQXQsIHN0YXR1c1VwZGF0ZWQsIHN0YXR1c0Vycm9yLCBlcnJvclRpdGxlLCBvZmZsaW5lVGl0bGUsIG9mZmxpbmVIaW50LCByZXRyeSwgdmlld0FuaW1hbCkuICovXG4gIGkxOG5OYW1lc3BhY2U6IHN0cmluZztcbiAgZW50aXR5SGVybz86IFJlcXVlc3RSZXZpZXdFbnRpdHlIZXJvQ29uZmlnO1xuICAvKiogU2kgZWwgdXN1YXJpbyBhY3R1YWwgcHVlZGUgYXByb2Jhci9yZWNoYXphciAoZWouIHBlcnNvbmEuaXNQdWJsaXNoZXIoKSkuICovXG4gIGNhblJldmlldzogKCkgPT4gYm9vbGVhbjtcbiAgLyoqIENUQSBwb3N0LWFwcm9iYWNpw7NuIHBhcmEgcXVpZW4gTk8gcmV2aXNhIChlai4gXCJ2ZXIgcmVjZXRhXCIvXCJ2ZXIgYW5pbWFsXCIpLiAqL1xuICB2aWV3RW50aXR5Q3RhTGFiZWxLZXk/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFuZWwgZGUgcmV2aXNpw7NuIGRlIHVuYSBSZXF1ZXN0IGdlbsOpcmljYSAoQURSLTA2MS8wNjIpOiBzdGF0dXMgKyBhY2Npb25lc1xuICogYXBwcm92ZS9yZWplY3QgKyBmaWVsZHMgZGVsIGZvcm11bGFyaW8gKyBjb21lbnRhcmlvcy4gQ29uZmlnLWRyaXZlbiwgc2luXG4gKiBjb25vY2ltaWVudG8gZGVsIGRvbWluaW8gKGFkb3B0aW9uLCByZWNpcGVfdmVyaWZpY2F0aW9uLCBldGMuKSDigJQgY2FkYVxuICogY29uc3VtZXIgaW55ZWN0YSBzdSBgUmVxdWVzdFJldmlld1BhbmVsQ29uZmlnYC5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsLXJlcXVlc3QtcmV2aWV3LXBhbmVsJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0J1dHRvbkNvbXBvbmVudCwgRW1wdHlTdGF0ZUNvbXBvbmVudCwgU2tlbGV0b25Db21wb25lbnRdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJwYWdlXCI+XG4gICAgICBAaWYgKGxvYWRpbmcoKSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwic2tlbFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgIDx2YWwtc2tlbGV0b24gW3Byb3BzXT1cInsgd2lkdGg6ICcxMDAlJywgaGVpZ2h0OiAnODhweCcsIGJvcmRlclJhZGl1czogJzE0cHgnIH1cIiAvPlxuICAgICAgICAgIDx2YWwtc2tlbGV0b24gW3Byb3BzXT1cInsgd2lkdGg6ICcxMDAlJywgaGVpZ2h0OiAnNjRweCcsIGJvcmRlclJhZGl1czogJzEycHgnIH1cIiAvPlxuICAgICAgICAgIDx2YWwtc2tlbGV0b24gW3Byb3BzXT1cInsgd2lkdGg6ICcxMDAlJywgaGVpZ2h0OiAnODBweCcsIGJvcmRlclJhZGl1czogJzEycHgnIH1cIiAvPlxuICAgICAgICAgIDx2YWwtc2tlbGV0b24gW3Byb3BzXT1cInsgd2lkdGg6ICcxMDAlJywgaGVpZ2h0OiAnMTIwcHgnLCBib3JkZXJSYWRpdXM6ICcxMnB4JyB9XCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9IEBlbHNlIGlmIChsb2FkRXJyb3IoKSkge1xuICAgICAgICA8dmFsLWVtcHR5LXN0YXRlIFtwcm9wc109XCJlcnJvclN0YXRlKClcIiAvPlxuICAgICAgfSBAZWxzZSBpZiAocmVxKCkpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbFwiPlxuICAgICAgICAgIEBpZiAoaGVyb0NvbmZpZygpICYmIGhlcm9OYW1lKCkpIHtcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJlbnRpdHktaGVyb1wiIChjbGljayk9XCJvbkhlcm9DbGljaygpXCIgW2Rpc2FibGVkXT1cIiFjYW5OYXZpZ2F0ZUhlcm8oKVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZW50aXR5LWhlcm9fX21lZGlhXCI+XG4gICAgICAgICAgICAgICAgQGlmIChoZXJvSW1hZ2UoKSAmJiAhaGVyb0ltZ0ZhaWxlZCgpKSB7XG4gICAgICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgICAgIFtzcmNdPVwiaGVyb0ltYWdlKClcIlxuICAgICAgICAgICAgICAgICAgICBbYWx0XT1cImhlcm9OYW1lKCkhXCJcbiAgICAgICAgICAgICAgICAgICAgbG9hZGluZz1cImxhenlcIlxuICAgICAgICAgICAgICAgICAgICAoZXJyb3IpPVwiaGVyb0ltZ0ZhaWxlZC5zZXQodHJ1ZSlcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImVudGl0eS1oZXJvX19pbWdcIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZW50aXR5LWhlcm9fX3BsYWNlaG9sZGVyXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgaGVyb0NvbmZpZygpIS5wbGFjZWhvbGRlckljb24gfHwgJ/Cfk4QnXG4gICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZW50aXR5LWhlcm9fX2JvZHlcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImVudGl0eS1oZXJvX19sYWJlbFwiPnt7IHQoaGVyb0NvbmZpZygpIS5sYWJlbEtleSkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJlbnRpdHktaGVyb19fbmFtZVwiPnt7IGhlcm9OYW1lKCkgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICBAaWYgKGNhbk5hdmlnYXRlSGVybygpKSB7XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJlbnRpdHktaGVyb19fY2hldnJvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPuKAujwvc3Bhbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN0YXR1cy1jYXJkXCIgW3N0eWxlLmJvcmRlci1sZWZ0LWNvbG9yXT1cInN0YXR1c1N0eWxlKCkuYmdcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGF0dXMtY2FyZF9fdG9wXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RhdHVzLWJhZGdlXCIgW3N0eWxlLmJhY2tncm91bmRdPVwic3RhdHVzU3R5bGUoKS5iZ1wiIFtzdHlsZS5jb2xvcl09XCJzdGF0dXNTdHlsZSgpLmNvbG9yXCI+XG4gICAgICAgICAgICAgICAge3sgdCgnc3RhdHVzXycgKyByZXEoKSEuc3RhdHVzKSB9fVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3VibWl0dGVkLWF0XCI+e3sgdCgnc3VibWl0dGVkQXQnKSB9fToge3sgZm9ybWF0RGF0ZShyZXEoKSEuY3JlYXRlZEF0KSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICBAaWYgKGNvbmZpZygpLmNhblJldmlldygpICYmIChyZXEoKSEuc3RhdHVzID09PSAncGVuZGluZycgfHwgcmVxKCkhLnN0YXR1cyA9PT0gJ2luX3JldmlldycpKSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb25zLXJvd1wiPlxuICAgICAgICAgICAgICAgIDx2YWwtYnV0dG9uXG4gICAgICAgICAgICAgICAgICBbcHJvcHNdPVwie1xuICAgICAgICAgICAgICAgICAgICB0b2tlbjogJ2FwcHJvdmUnLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiB0KCdhcHByb3ZlJyksXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncHJpbWFyeScsXG4gICAgICAgICAgICAgICAgICAgIGZpbGw6ICdzb2xpZCcsXG4gICAgICAgICAgICAgICAgICAgIHNoYXBlOiAncm91bmQnLFxuICAgICAgICAgICAgICAgICAgICBzaXplOiAnc21hbGwnLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYnV0dG9uJyxcbiAgICAgICAgICAgICAgICAgICAgc3RhdGU6IHRyYW5zaXRpb25pbmcoKSA/ICdXT1JLSU5HJyA6ICdFTkFCTEVEJyxcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlcjogdHJhbnNpdGlvbi5iaW5kKHRoaXMsICdhcHByb3ZlZCcpLFxuICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8dmFsLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgW3Byb3BzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgdG9rZW46ICdyZWplY3QnLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiB0KCdyZWplY3QnKSxcbiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdtZWRpdW0nLFxuICAgICAgICAgICAgICAgICAgICBmaWxsOiAnb3V0bGluZScsXG4gICAgICAgICAgICAgICAgICAgIHNoYXBlOiAncm91bmQnLFxuICAgICAgICAgICAgICAgICAgICBzaXplOiAnc21hbGwnLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYnV0dG9uJyxcbiAgICAgICAgICAgICAgICAgICAgc3RhdGU6IHRyYW5zaXRpb25pbmcoKSA/ICdXT1JLSU5HJyA6ICdFTkFCTEVEJyxcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlcjogdHJhbnNpdGlvbi5iaW5kKHRoaXMsICdyZWplY3RlZCcpLFxuICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICBAaWYgKHJlcSgpIS5zdWJtaXR0ZXIpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uXCI+XG4gICAgICAgICAgICAgIDxwIGNsYXNzPVwic2VjdGlvbl9fdGl0bGVcIj57eyB0KCdzdWJtaXR0ZXInKSB9fTwvcD5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Ym1pdHRlci1yb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VibWl0dGVyLWF2YXRhclwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPnt7IHN1Ym1pdHRlckluaXRpYWwoKSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWJtaXR0ZXItaW5mb1wiPlxuICAgICAgICAgICAgICAgICAgQGlmIChyZXEoKSEuc3VibWl0dGVyIS5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3VibWl0dGVyLW5hbWVcIj57eyByZXEoKSEuc3VibWl0dGVyIS5uYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgQGlmIChyZXEoKSEuc3VibWl0dGVyIS5lbWFpbCkge1xuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN1Ym1pdHRlci1lbWFpbFwiPnt7IHJlcSgpIS5zdWJtaXR0ZXIhLmVtYWlsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgQGlmIChyZXEoKSEuc3VibWl0dGVyIS5waG9uZSkge1xuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN1Ym1pdHRlci1lbWFpbFwiPnt7IHJlcSgpIS5zdWJtaXR0ZXIhLnBob25lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cblxuICAgICAgICAgIEBpZiAoZmllbGRFbnRyaWVzKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VjdGlvblwiPlxuICAgICAgICAgICAgICA8cCBjbGFzcz1cInNlY3Rpb25fX3RpdGxlXCI+e3sgdCgnZmllbGRzJykgfX08L3A+XG4gICAgICAgICAgICAgIEBmb3IgKGVudHJ5IG9mIGZpZWxkRW50cmllcygpOyB0cmFjayBlbnRyeS5rZXkpIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtcm93XCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZpZWxkLXJvd19fbGFiZWxcIj57eyBlbnRyeS5rZXkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZpZWxkLXJvd19fdmFsdWVcIj57eyBlbnRyeS52YWx1ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgQGlmIChcbiAgICAgICAgICAgICFjb25maWcoKS5jYW5SZXZpZXcoKSAmJiByZXEoKSEuc3RhdHVzID09PSAnYXBwcm92ZWQnICYmIGNhbk5hdmlnYXRlSGVybygpICYmIGNvbmZpZygpLnZpZXdFbnRpdHlDdGFMYWJlbEtleVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgPHZhbC1idXR0b25cbiAgICAgICAgICAgICAgW3Byb3BzXT1cIntcbiAgICAgICAgICAgICAgICB0b2tlbjogJ3ZpZXctZW50aXR5JyxcbiAgICAgICAgICAgICAgICB0ZXh0OiB0KGNvbmZpZygpLnZpZXdFbnRpdHlDdGFMYWJlbEtleSEpLFxuICAgICAgICAgICAgICAgIGNvbG9yOiAncHJpbWFyeScsXG4gICAgICAgICAgICAgICAgZmlsbDogJ3NvbGlkJyxcbiAgICAgICAgICAgICAgICBzaGFwZTogJ3JvdW5kJyxcbiAgICAgICAgICAgICAgICBzaXplOiAnZGVmYXVsdCcsXG4gICAgICAgICAgICAgICAgdHlwZTogJ2J1dHRvbicsXG4gICAgICAgICAgICAgICAgc3RhdGU6ICdFTkFCTEVEJyxcbiAgICAgICAgICAgICAgICBoYW5kbGVyOiBvbkhlcm9DbGljay5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb25cIj5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwic2VjdGlvbl9fdGl0bGVcIj57eyB0KCdjb21tZW50c1RpdGxlJykgfX08L3A+XG4gICAgICAgICAgICBAaWYgKGxvYWRpbmdDb21tZW50cygpKSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uLXBhZFwiPlxuICAgICAgICAgICAgICAgIDx2YWwtc2tlbGV0b24gW3Byb3BzXT1cInsgd2lkdGg6ICcxMDAlJywgaGVpZ2h0OiAnNDhweCcsIGJvcmRlclJhZGl1czogJzhweCcgfVwiIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfSBAZWxzZSBpZiAoY29tbWVudHMoKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgPHAgY2xhc3M9XCJuby1jb21tZW50c1wiPnt7IHQoJ25vQ29tbWVudHMnKSB9fTwvcD5cbiAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJjb21tZW50c1wiPlxuICAgICAgICAgICAgICAgIEBmb3IgKGMgb2YgY29tbWVudHMoKTsgdHJhY2sgYy5jb21tZW50SWQpIHtcbiAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImNvbW1lbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbW1lbnRfX2F2YXRhclwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPnt7IGF1dGhvckluaXRpYWwoYykgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbW1lbnRfX2NvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tbWVudF9faGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbW1lbnRfX2F1dGhvclwiPnt7IGMuYXV0aG9yLm5hbWUgfHwgYy5hdXRob3IuZW1haWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbW1lbnRfX2RhdGVcIj57eyByZWxhdGl2ZVRpbWUoYy5jcmVhdGVkQXQpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY29tbWVudF9fYm9keVwiPnt7IGMuYm9keSB9fTwvcD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIGAsXG4gIHN0eWxlczogW1xuICAgIGBcbiAgICAgIC5wYWdlIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgZ2FwOiAxNHB4O1xuICAgICAgfVxuICAgICAgLnNrZWwge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBnYXA6IDEycHg7XG4gICAgICB9XG4gICAgICAuc2tlbCB2YWwtc2tlbGV0b24ge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIH1cbiAgICAgIC5kZXRhaWwge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBnYXA6IDE0cHg7XG4gICAgICB9XG5cbiAgICAgIC5lbnRpdHktaGVybyB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGdhcDogMTRweDtcbiAgICAgICAgcGFkZGluZzogMTRweCAxNnB4O1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1pb24tY2FyZC1iYWNrZ3JvdW5kLCB2YXIoLS1pb24tYmFja2dyb3VuZC1jb2xvciwgI2ZmZikpO1xuICAgICAgICBib3JkZXItcmFkaXVzOiAxNHB4O1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1pb24tYm9yZGVyLWNvbG9yLCByZ2JhKDAsIDAsIDAsIDAuMDgpKTtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIHRleHQtYWxpZ246IGxlZnQ7XG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIH1cbiAgICAgIC5lbnRpdHktaGVybzpkaXNhYmxlZCB7XG4gICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cbiAgICAgIC5lbnRpdHktaGVyb19fbWVkaWEge1xuICAgICAgICB3aWR0aDogNTZweDtcbiAgICAgICAgaGVpZ2h0OiA1NnB4O1xuICAgICAgICBib3JkZXItcmFkaXVzOiAxMnB4O1xuICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICBmbGV4LXNocmluazogMDtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0taW9uLWNvbG9yLWxpZ2h0LCAjZjRmNWY4KTtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICB9XG4gICAgICAuZW50aXR5LWhlcm9fX2ltZyB7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgIG9iamVjdC1maXQ6IGNvdmVyO1xuICAgICAgfVxuICAgICAgLmVudGl0eS1oZXJvX19wbGFjZWhvbGRlciB7XG4gICAgICAgIGZvbnQtc2l6ZTogMS42MjVyZW07XG4gICAgICB9XG4gICAgICAuZW50aXR5LWhlcm9fX2JvZHkge1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBnYXA6IDJweDtcbiAgICAgICAgbWluLXdpZHRoOiAwO1xuICAgICAgfVxuICAgICAgLmVudGl0eS1oZXJvX19sYWJlbCB7XG4gICAgICAgIGZvbnQtc2l6ZTogMC43NXJlbTtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi1jb2xvci1kYXJrLCAjNjM2NDY5KTtcbiAgICAgIH1cbiAgICAgIC5lbnRpdHktaGVyb19fbmFtZSB7XG4gICAgICAgIGZvbnQtc2l6ZTogMXJlbTtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi10ZXh0LWNvbG9yLCAjMDAwKTtcbiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgICB9XG4gICAgICAuZW50aXR5LWhlcm9fX2NoZXZyb24ge1xuICAgICAgICBmb250LXNpemU6IDEuNXJlbTtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi1jb2xvci1kYXJrLCAjOTI5NDljKTtcbiAgICAgICAgbGluZS1oZWlnaHQ6IDE7XG4gICAgICB9XG5cbiAgICAgIC5zdGF0dXMtY2FyZCB7XG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWlvbi1jYXJkLWJhY2tncm91bmQsIHZhcigtLWlvbi1iYWNrZ3JvdW5kLWNvbG9yLCAjZmZmKSk7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDEycHg7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWlvbi1ib3JkZXItY29sb3IsIHJnYmEoMCwgMCwgMCwgMC4wOCkpO1xuICAgICAgICBib3JkZXItbGVmdDogNHB4IHNvbGlkO1xuICAgICAgICBwYWRkaW5nOiAxNHB4IDE2cHg7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGdhcDogMTJweDtcbiAgICAgIH1cbiAgICAgIC5zdGF0dXMtY2FyZF9fdG9wIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgZ2FwOiAxMnB4O1xuICAgICAgICBmbGV4LXdyYXA6IHdyYXA7XG4gICAgICB9XG4gICAgICAuc3RhdHVzLWJhZGdlIHtcbiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgICBwYWRkaW5nOiA0cHggMTJweDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMTAwcHg7XG4gICAgICAgIGZvbnQtc2l6ZTogMC44MTI1cmVtO1xuICAgICAgICBmb250LXdlaWdodDogNzAwO1xuICAgICAgfVxuICAgICAgLnN1Ym1pdHRlZC1hdCB7XG4gICAgICAgIGZvbnQtc2l6ZTogMC44MTI1cmVtO1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLWRhcmstc2hhZGUsICMxZTIwMjMpO1xuICAgICAgfVxuICAgICAgLmFjdGlvbnMtcm93IHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZ2FwOiAxMHB4O1xuICAgICAgICBmbGV4LXdyYXA6IHdyYXA7XG4gICAgICB9XG5cbiAgICAgIC5zZWN0aW9uIHtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0taW9uLWNhcmQtYmFja2dyb3VuZCwgdmFyKC0taW9uLWJhY2tncm91bmQtY29sb3IsICNmZmYpKTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMTJweDtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0taW9uLWJvcmRlci1jb2xvciwgcmdiYSgwLCAwLCAwLCAwLjA4KSk7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICB9XG4gICAgICAuc2VjdGlvbl9fdGl0bGUge1xuICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgIGZvbnQtc2l6ZTogMC44MTI1cmVtO1xuICAgICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLWRhcmstc2hhZGUsICMxZTIwMjMpO1xuICAgICAgICBwYWRkaW5nOiAxMnB4IDE2cHggMDtcbiAgICAgIH1cbiAgICAgIC5zZWN0aW9uLXBhZCB7XG4gICAgICAgIHBhZGRpbmc6IDEycHggMTZweDtcbiAgICAgIH1cblxuICAgICAgLnN1Ym1pdHRlci1yb3cge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBnYXA6IDEycHg7XG4gICAgICAgIHBhZGRpbmc6IDEycHggMTZweDtcbiAgICAgIH1cbiAgICAgIC5zdWJtaXR0ZXItYXZhdGFyIHtcbiAgICAgICAgd2lkdGg6IDQwcHg7XG4gICAgICAgIGhlaWdodDogNDBweDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlO1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1pb24tY29sb3ItcHJpbWFyeSwgIzMxMzEzMSk7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tY29sb3ItcHJpbWFyeS1jb250cmFzdCwgI2ZmZik7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgICBmb250LXNpemU6IDFyZW07XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7XG4gICAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgfVxuICAgICAgLnN1Ym1pdHRlci1pbmZvIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgZ2FwOiAycHg7XG4gICAgICAgIG1pbi13aWR0aDogMDtcbiAgICAgIH1cbiAgICAgIC5zdWJtaXR0ZXItbmFtZSB7XG4gICAgICAgIGZvbnQtc2l6ZTogMC45Mzc1cmVtO1xuICAgICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLXRleHQtY29sb3IsICMwMDApO1xuICAgICAgfVxuICAgICAgLnN1Ym1pdHRlci1lbWFpbCB7XG4gICAgICAgIGZvbnQtc2l6ZTogMC44MTI1cmVtO1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLWRhcmssICM2MzY0NjkpO1xuICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICAgIH1cblxuICAgICAgLmZpZWxkLXJvdyB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGdhcDogM3B4O1xuICAgICAgICBwYWRkaW5nOiAxMXB4IDE2cHg7XG4gICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1pb24tYm9yZGVyLWNvbG9yLCByZ2JhKDAsIDAsIDAsIDAuMDYpKTtcbiAgICAgIH1cbiAgICAgIC5maWVsZC1yb3c6bGFzdC1jaGlsZCB7XG4gICAgICAgIGJvcmRlci1ib3R0b206IG5vbmU7XG4gICAgICB9XG4gICAgICAuZmllbGQtcm93X19sYWJlbCB7XG4gICAgICAgIGZvbnQtc2l6ZTogMC43NXJlbTtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi1jb2xvci1kYXJrLCAjNjM2NDY5KTtcbiAgICAgICAgdGV4dC10cmFuc2Zvcm06IGNhcGl0YWxpemU7XG4gICAgICB9XG4gICAgICAuZmllbGQtcm93X192YWx1ZSB7XG4gICAgICAgIGZvbnQtc2l6ZTogMC45Mzc1cmVtO1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLXRleHQtY29sb3IsICMwMDApO1xuICAgICAgICBmb250LXdlaWdodDogNTAwO1xuICAgICAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkO1xuICAgICAgICB3aGl0ZS1zcGFjZTogcHJlLWxpbmU7XG4gICAgICB9XG5cbiAgICAgIC5uby1jb21tZW50cyB7XG4gICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgcGFkZGluZzogMTJweCAxNnB4O1xuICAgICAgICBmb250LXNpemU6IDAuODc1cmVtO1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLWRhcmssICM5Mjk0OWMpO1xuICAgICAgfVxuICAgICAgLmNvbW1lbnRzIHtcbiAgICAgICAgbGlzdC1zdHlsZTogbm9uZTtcbiAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgfVxuICAgICAgLmNvbW1lbnQge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiAgICAgICAgZ2FwOiAxMHB4O1xuICAgICAgICBwYWRkaW5nOiAxMnB4IDE2cHg7XG4gICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1pb24tYm9yZGVyLWNvbG9yLCByZ2JhKDAsIDAsIDAsIDAuMDYpKTtcbiAgICAgIH1cbiAgICAgIC5jb21tZW50Omxhc3QtY2hpbGQge1xuICAgICAgICBib3JkZXItYm90dG9tOiBub25lO1xuICAgICAgfVxuICAgICAgLmNvbW1lbnRfX2F2YXRhciB7XG4gICAgICAgIHdpZHRoOiAzMnB4O1xuICAgICAgICBoZWlnaHQ6IDMycHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0taW9uLWNvbG9yLXByaW1hcnksICMzMTMxMzEpO1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLXByaW1hcnktY29udHJhc3QsICNmZmYpO1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgICAgZm9udC1zaXplOiAwLjc1cmVtO1xuICAgICAgICBmb250LXdlaWdodDogNzAwO1xuICAgICAgICBmbGV4LXNocmluazogMDtcbiAgICAgIH1cbiAgICAgIC5jb21tZW50X19jb250ZW50IHtcbiAgICAgICAgZmxleDogMTtcbiAgICAgICAgbWluLXdpZHRoOiAwO1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBnYXA6IDNweDtcbiAgICAgIH1cbiAgICAgIC5jb21tZW50X19oZWFkZXIge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogYmFzZWxpbmU7XG4gICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgICAgZ2FwOiA4cHg7XG4gICAgICB9XG4gICAgICAuY29tbWVudF9fYXV0aG9yIHtcbiAgICAgICAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi10ZXh0LWNvbG9yLCAjMDAwKTtcbiAgICAgIH1cbiAgICAgIC5jb21tZW50X19kYXRlIHtcbiAgICAgICAgZm9udC1zaXplOiAwLjc1cmVtO1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLWRhcmssICM5Mjk0OWMpO1xuICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgICAgfVxuICAgICAgLmNvbW1lbnRfX2JvZHkge1xuICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tdGV4dC1jb2xvciwgIzAwMCk7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiAxLjU7XG4gICAgICAgIHdoaXRlLXNwYWNlOiBwcmUtbGluZTtcbiAgICAgIH1cbiAgICBgLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBSZXF1ZXN0UmV2aWV3UGFuZWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBwcml2YXRlIHJlcXVlc3RzID0gaW5qZWN0KFJlcXVlc3RTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBpMThuID0gaW5qZWN0KEkxOG5TZXJ2aWNlKTtcbiAgcHJpdmF0ZSBlcnJvcnMgPSBpbmplY3QoVmFsdGVjaEVycm9yU2VydmljZSk7XG4gIHByaXZhdGUgdG9hc3QgPSBpbmplY3QoVG9hc3RTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuXG4gIHJlYWRvbmx5IHJlcXVlc3RJZCA9IGlucHV0LnJlcXVpcmVkPHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgY29uZmlnID0gaW5wdXQucmVxdWlyZWQ8UmVxdWVzdFJldmlld1BhbmVsQ29uZmlnPigpO1xuXG4gIHJlYWRvbmx5IGxvYWRlZCA9IG91dHB1dDxBcHBSZXF1ZXN0PigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3JlcSA9IHNpZ25hbDxBcHBSZXF1ZXN0IHwgbnVsbD4obnVsbCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2xvYWRpbmcgPSBzaWduYWwodHJ1ZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2xvYWRFcnJvciA9IHNpZ25hbDx1bmtub3duIHwgbnVsbD4obnVsbCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2NvbW1lbnRzID0gc2lnbmFsPFJlcXVlc3RDb21tZW50W10+KFtdKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfbG9hZGluZ0NvbW1lbnRzID0gc2lnbmFsKGZhbHNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfdHJhbnNpdGlvbmluZyA9IHNpZ25hbChmYWxzZSk7XG5cbiAgcmVhZG9ubHkgcmVxID0gdGhpcy5fcmVxLmFzUmVhZG9ubHkoKTtcbiAgcmVhZG9ubHkgbG9hZGluZyA9IHRoaXMuX2xvYWRpbmcuYXNSZWFkb25seSgpO1xuICByZWFkb25seSBsb2FkRXJyb3IgPSB0aGlzLl9sb2FkRXJyb3IuYXNSZWFkb25seSgpO1xuICByZWFkb25seSBjb21tZW50cyA9IHRoaXMuX2NvbW1lbnRzLmFzUmVhZG9ubHkoKTtcbiAgcmVhZG9ubHkgbG9hZGluZ0NvbW1lbnRzID0gdGhpcy5fbG9hZGluZ0NvbW1lbnRzLmFzUmVhZG9ubHkoKTtcbiAgcmVhZG9ubHkgdHJhbnNpdGlvbmluZyA9IHRoaXMuX3RyYW5zaXRpb25pbmcuYXNSZWFkb25seSgpO1xuXG4gIHJlYWRvbmx5IGhlcm9JbWdGYWlsZWQgPSBzaWduYWwoZmFsc2UpO1xuXG4gIHJlYWRvbmx5IGhlcm9Db25maWcgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNvbmZpZygpLmVudGl0eUhlcm8pO1xuICByZWFkb25seSBzdGF0dXNTdHlsZSA9IGNvbXB1dGVkKCgpID0+IFNUQVRVU19TVFlMRVt0aGlzLl9yZXEoKT8uc3RhdHVzID8/ICcnXSA/PyBTVEFUVVNfU1RZTEVbJ3BlbmRpbmcnXSk7XG4gIHJlYWRvbmx5IGhlcm9OYW1lID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGhlcm8gPSB0aGlzLmhlcm9Db25maWcoKTtcbiAgICBpZiAoIWhlcm8pIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHRoaXMuX3JlcSgpPy5tZXRhZGF0YT8uW2hlcm8ubmFtZUZpZWxkXSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIH0pO1xuICByZWFkb25seSBoZXJvSW1hZ2UgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgaGVybyA9IHRoaXMuaGVyb0NvbmZpZygpO1xuICAgIGlmICghaGVybz8uaW1hZ2VGaWVsZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gdGhpcy5fcmVxKCk/Lm1ldGFkYXRhPy5baGVyby5pbWFnZUZpZWxkXSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIH0pO1xuICByZWFkb25seSBjYW5OYXZpZ2F0ZUhlcm8gPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgaGVybyA9IHRoaXMuaGVyb0NvbmZpZygpO1xuICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpcy5fcmVxKCk/Lm1ldGFkYXRhO1xuICAgIGlmICghaGVybyB8fCAhbWV0YWRhdGEpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gaGVyby5jYW5OYXZpZ2F0ZShtZXRhZGF0YSk7XG4gIH0pO1xuICByZWFkb25seSBzdWJtaXR0ZXJJbml0aWFsID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IHMgPSB0aGlzLl9yZXEoKT8uc3VibWl0dGVyO1xuICAgIGlmICghcykgcmV0dXJuICc/JztcbiAgICByZXR1cm4gKChzLm5hbWUgfHwgcy5lbWFpbCkgPz8gJz8nKS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKTtcbiAgfSk7XG4gIHJlYWRvbmx5IGZpZWxkRW50cmllcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBmaWVsZHMgPSB0aGlzLl9yZXEoKT8uZmllbGRzID8/IHt9O1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhmaWVsZHMpXG4gICAgICAuZmlsdGVyKChbLCB2XSkgPT4gdiAhPSBudWxsICYmIHYgIT09ICcnKVxuICAgICAgLm1hcCgoW2ssIHZdKSA9PiAoeyBrZXk6IGssIHZhbHVlOiBTdHJpbmcodikgfSkpO1xuICB9KTtcblxuICByZWFkb25seSBlcnJvclN0YXRlID0gY29tcHV0ZWQ8RW1wdHlTdGF0ZU1ldGFkYXRhPigoKSA9PiB7XG4gICAgdGhpcy5pMThuLmxhbmcoKTtcbiAgICBjb25zdCBlcnIgPSB0aGlzLl9sb2FkRXJyb3IoKTtcbiAgICBjb25zdCBtc2cgPSAoZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIgPz8gJycpKS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IGlzT2ZmbGluZSA9IG1zZy5pbmNsdWRlcygnbmV0d29yaycpIHx8IG1zZy5pbmNsdWRlcygnb2ZmbGluZScpO1xuICAgIHJldHVybiB7XG4gICAgICB2YXJpYW50OiAnZXJyb3InLFxuICAgICAgdGl0bGU6IGlzT2ZmbGluZSA/IHRoaXMudCgnb2ZmbGluZVRpdGxlJykgOiB0aGlzLnQoJ2Vycm9yVGl0bGUnKSxcbiAgICAgIGRlc2NyaXB0aW9uOiBpc09mZmxpbmUgPyB0aGlzLnQoJ29mZmxpbmVIaW50JykgOiAnJyxcbiAgICAgIGN0YTogeyBsYWJlbDogdGhpcy50KCdyZXRyeScpLCBoYW5kbGVyOiAoKSA9PiB2b2lkIHRoaXMubG9hZCgpIH0sXG4gICAgfTtcbiAgfSk7XG5cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHZvaWQgdGhpcy5sb2FkKCk7XG4gIH1cblxuICBhc3luYyBsb2FkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGlkID0gdGhpcy5yZXF1ZXN0SWQoKTtcbiAgICB0aGlzLl9sb2FkaW5nLnNldCh0cnVlKTtcbiAgICB0aGlzLl9sb2FkRXJyb3Iuc2V0KG51bGwpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXEgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLnJlcXVlc3RzLmdldFJlcXVlc3QoaWQpKTtcbiAgICAgIHRoaXMuX3JlcS5zZXQocmVxKTtcbiAgICAgIHRoaXMubG9hZGVkLmVtaXQocmVxKTtcbiAgICAgIHRoaXMuc3Vic2NyaWJlQ29tbWVudHMocmVxLmFwcElkLCByZXEub3JnSWQsIGlkKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuX2xvYWRFcnJvci5zZXQoZXJyKTtcbiAgICAgIHRoaXMuZXJyb3JzLmhhbmRsZShlcnIsIHtcbiAgICAgICAgY29udGV4dDogJ3JlcXVlc3QtcmV2aWV3LXBhbmVsLmxvYWQnLFxuICAgICAgICBmYWxsYmFja0tleTogJ2Vycm9yVGl0bGUnLFxuICAgICAgICBpMThuTmFtZXNwYWNlOiB0aGlzLmNvbmZpZygpLmkxOG5OYW1lc3BhY2UsXG4gICAgICB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5fbG9hZGluZy5zZXQoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3Vic2NyaWJlQ29tbWVudHMoYXBwSWQ6IHN0cmluZywgb3JnSWQ6IHN0cmluZywgcmVxdWVzdElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9sb2FkaW5nQ29tbWVudHMuc2V0KHRydWUpO1xuICAgIHRoaXMucmVxdWVzdHNcbiAgICAgIC53YXRjaENvbW1lbnRzKGFwcElkLCBvcmdJZCwgcmVxdWVzdElkKVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogY29tbWVudHMgPT4ge1xuICAgICAgICAgIHRoaXMuX2NvbW1lbnRzLnNldChjb21tZW50cyk7XG4gICAgICAgICAgdGhpcy5fbG9hZGluZ0NvbW1lbnRzLnNldChmYWxzZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgICAgLy8gY29tZW50YXJpb3Mgc29uIGJlc3QtZWZmb3J0OyBzaSBlbCBsaXN0ZW5lciBmYWxsYSwgc2lsZW5jaWFyIHkgb2N1bHRhciBzcGlubmVyXG4gICAgICAgICAgdGhpcy5fbG9hZGluZ0NvbW1lbnRzLnNldChmYWxzZSk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHRyYW5zaXRpb24oc3RhdHVzOiAnYXBwcm92ZWQnIHwgJ3JlamVjdGVkJyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlcSA9IHRoaXMuX3JlcSgpO1xuICAgIGlmICghcmVxIHx8IHRoaXMuX3RyYW5zaXRpb25pbmcoKSkgcmV0dXJuO1xuICAgIHRoaXMuX3RyYW5zaXRpb25pbmcuc2V0KHRydWUpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLnJlcXVlc3RzLnRyYW5zaXRpb24ocmVxLmlkLCB7IHN0YXR1cyB9KSk7XG4gICAgICBhd2FpdCB0aGlzLmxvYWQoKTtcbiAgICAgIHRoaXMudG9hc3Quc2hvdyh7IG1lc3NhZ2U6IHRoaXMudCgnc3RhdHVzVXBkYXRlZCcpLCBkdXJhdGlvbjogMjUwMCwgY29sb3I6ICdkYXJrJywgcG9zaXRpb246ICd0b3AnIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5lcnJvcnMuaGFuZGxlKGVyciwge1xuICAgICAgICBjb250ZXh0OiAncmVxdWVzdC1yZXZpZXctcGFuZWwudHJhbnNpdGlvbicsXG4gICAgICAgIGZhbGxiYWNrS2V5OiAnc3RhdHVzRXJyb3InLFxuICAgICAgICBpMThuTmFtZXNwYWNlOiB0aGlzLmNvbmZpZygpLmkxOG5OYW1lc3BhY2UsXG4gICAgICB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5fdHJhbnNpdGlvbmluZy5zZXQoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIG9uSGVyb0NsaWNrKCk6IHZvaWQge1xuICAgIGNvbnN0IGhlcm8gPSB0aGlzLmhlcm9Db25maWcoKTtcbiAgICBjb25zdCBtZXRhZGF0YSA9IHRoaXMuX3JlcSgpPy5tZXRhZGF0YTtcbiAgICBpZiAoaGVybyAmJiBtZXRhZGF0YSkgaGVyby5uYXZpZ2F0ZShtZXRhZGF0YSk7XG4gIH1cblxuICBmb3JtYXREYXRlKGlzbzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIWlzbykgcmV0dXJuICcnO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gbmV3IERhdGUoaXNvKS50b0xvY2FsZURhdGVTdHJpbmcodGhpcy5pMThuLmxhbmcoKSA9PT0gJ2VzJyA/ICdlcy1DTCcgOiAnZW4tVVMnLCB7XG4gICAgICAgIGRheTogJ251bWVyaWMnLFxuICAgICAgICBtb250aDogJ3Nob3J0JyxcbiAgICAgICAgeWVhcjogJ251bWVyaWMnLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gaXNvO1xuICAgIH1cbiAgfVxuXG4gIGF1dGhvckluaXRpYWwoYzogUmVxdWVzdENvbW1lbnQpOiBzdHJpbmcge1xuICAgIHJldHVybiAoKGMuYXV0aG9yLm5hbWUgfHwgYy5hdXRob3IuZW1haWwpID8/ICc/JykuY2hhckF0KDApLnRvVXBwZXJDYXNlKCk7XG4gIH1cblxuICByZWxhdGl2ZVRpbWUoaXNvOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghaXNvKSByZXR1cm4gJyc7XG4gICAgY29uc3QgZGlmZk1zID0gRGF0ZS5ub3coKSAtIG5ldyBEYXRlKGlzbykuZ2V0VGltZSgpO1xuICAgIGlmIChOdW1iZXIuaXNOYU4oZGlmZk1zKSkgcmV0dXJuIGlzbztcbiAgICBjb25zdCBsYW5nID0gdGhpcy5pMThuLmxhbmcoKTtcbiAgICBjb25zdCBtaW5zID0gTWF0aC5mbG9vcihkaWZmTXMgLyA2MDAwMCk7XG4gICAgaWYgKG1pbnMgPCAxKSByZXR1cm4gbGFuZyA9PT0gJ2VzJyA/ICdoYWNlIHVuIG1vbWVudG8nIDogJ2p1c3Qgbm93JztcbiAgICBpZiAobWlucyA8IDYwKSByZXR1cm4gbGFuZyA9PT0gJ2VzJyA/IGBoYWNlICR7bWluc30gbWluYCA6IGAke21pbnN9bSBhZ29gO1xuICAgIGNvbnN0IGhvdXJzID0gTWF0aC5mbG9vcihtaW5zIC8gNjApO1xuICAgIGlmIChob3VycyA8IDI0KSByZXR1cm4gbGFuZyA9PT0gJ2VzJyA/IGBoYWNlICR7aG91cnN9IGhgIDogYCR7aG91cnN9aCBhZ29gO1xuICAgIGNvbnN0IGRheXMgPSBNYXRoLmZsb29yKGhvdXJzIC8gMjQpO1xuICAgIGlmIChkYXlzIDwgNykgcmV0dXJuIGxhbmcgPT09ICdlcycgPyBgaGFjZSAke2RheXN9IGRpYSR7ZGF5cyA+IDEgPyAncycgOiAnJ31gIDogYCR7ZGF5c31kIGFnb2A7XG4gICAgcmV0dXJuIHRoaXMuZm9ybWF0RGF0ZShpc28pO1xuICB9XG5cbiAgdChrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaTE4bi50KGtleSwgdGhpcy5jb25maWcoKS5pMThuTmFtZXNwYWNlKTtcbiAgfVxufVxuIl19
355
+ `, styles: [":host{display:block}.rrp{display:flex;flex-direction:column;gap:12px}.rrp__skel{display:flex;flex-direction:column;gap:10px}.rrp__count{margin:0;font-size:.8125rem;font-weight:700;color:var(--ion-color-medium, #92949c);font-variant-numeric:tabular-nums}.rrp__queue{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:12px}.rrp__item{display:flex;flex-direction:column;gap:8px;padding:14px 16px;border-radius:14px;background:var(--ion-card-background, var(--ion-background-color, #fff));border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1))}.rrp__title{margin:0;font-size:1rem;font-weight:700;color:var(--ion-text-color, #000)}.rrp__meta{margin:0;font-size:.8125rem;color:var(--ion-color-medium, #92949c)}.rrp__body{display:flex;flex-direction:column;gap:8px}.rrp__reject{display:flex;flex-direction:column;gap:6px}.rrp__reject-label{font-size:.8125rem;font-weight:600;color:var(--ion-text-color, #000)}.rrp__reject-input{width:100%;box-sizing:border-box;padding:10px 12px;border-radius:10px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));background:var(--ion-background-color, #fff);color:var(--ion-text-color, #000);font-family:inherit;font-size:.875rem;resize:vertical}.rrp__reject-input:focus{outline:none;border-color:var(--ion-color-primary)}.rrp__reject-hint{margin:0;font-size:.75rem;color:var(--ion-color-medium, #92949c)}.rrp__actions{display:flex;flex-direction:column;gap:8px;margin-top:4px}@media (min-width: 576px){.rrp__actions{flex-direction:row;justify-content:flex-end;align-items:center;flex-wrap:wrap}}\n"] }]
356
+ }], ctorParameters: () => [], propDecorators: { itemBody: [{
357
+ type: Input
358
+ }], decision: [{
359
+ type: Output
360
+ }] } });
361
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1yZXZpZXctcGFuZWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL29yZ2FuaXNtcy9yZXF1ZXN0LXJldmlldy1wYW5lbC9yZXF1ZXN0LXJldmlldy1wYW5lbC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQWUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JILE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUN0RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUN4RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUM1RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFckQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7OztBQUd4RSxNQUFNLFNBQVMsR0FBRyxvQkFBb0IsQ0FBQztBQUV2Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQ0c7QUE2SEgsTUFBTSxPQUFPLDJCQUEyQjtJQTJCdEM7UUExQlEsU0FBSSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUUxQixVQUFLLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBOEIsQ0FBQztRQVFwRCxhQUFRLEdBQUcsSUFBSSxZQUFZLEVBQXlCLENBQUM7UUFFL0QsMkRBQTJEO1FBQzFDLGlCQUFZLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2xDLGdCQUFXLEdBQUcsSUFBSSxDQUFD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ZSxFQUFFLG1CQUFtQixFQUFFLGlCQUFpQixDQUFDLFlBQ3RFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxSFQ7d0RBWVEsUUFBUTtzQkFBaEIsS0FBSztnQkFFSSxRQUFRO3NCQUFqQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0LCBUZW1wbGF0ZVJlZiwgY29tcHV0ZWQsIGluamVjdCwgaW5wdXQsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYXRvbXMvYnV0dG9uL2J1dHRvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgRW1wdHlTdGF0ZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy9lbXB0eS1zdGF0ZS9lbXB0eS1zdGF0ZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2tlbGV0b25Db21wb25lbnQgfSBmcm9tICcuLi8uLi9hdG9tcy9za2VsZXRvbi9za2VsZXRvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9pMThuJztcbmltcG9ydCB7IENvbXBvbmVudFN0YXRlIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgUkVRVUVTVF9SRVZJRVdfUEFORUxfSTE4TiB9IGZyb20gJy4vcmVxdWVzdC1yZXZpZXctcGFuZWwuaTE4bic7XG5pbXBvcnQgeyBSZXF1ZXN0UmV2aWV3RGVjaXNpb24sIFJlcXVlc3RSZXZpZXdJdGVtLCBSZXF1ZXN0UmV2aWV3UGFuZWxNZXRhZGF0YSB9IGZyb20gJy4vdHlwZXMnO1xuXG5jb25zdCBOQU1FU1BBQ0UgPSAnUmVxdWVzdFJldmlld1BhbmVsJztcblxuLyoqXG4gKiB2YWwtcmVxdWVzdC1yZXZpZXctcGFuZWwg4oCUIGNvbGEgZGUgcmV2aXNpw7NuIGRlbCBmYWN0b3J5IChBRFItMDYyKS5cbiAqXG4gKiBFcyAqKnByZXNlbnRhY2lvbmFsKio6IG5vIGNhcmdhIGRhdG9zLCBubyBjb25vY2UgZWwgYmFja2VuZCBuaSBlbCBkb21pbmlvLiBFbFxuICogY29uc3VtZXIgbGUgcGFzYSBsYSBjb2xhIHlhIG5vcm1hbGl6YWRhIHkgZXNjdWNoYSBgKGRlY2lzaW9uKWAuXG4gKlxuICogIyMgUG9yIHF1w6kgZWwgY3VlcnBvIHZhIHByb3llY3RhZG8geSBubyBjb25maWd1cmFkb1xuICpcbiAqIEVsIEFEUiBvcmlnaW5hbCBwcm9wb27DrWEgZGVzY3JpYmlyIGVsIGN1ZXJwbyBjb24gYXJyYXlzIGRlIG5vbWJyZXMgZGUgY2FtcG9cbiAqIChgZmllbGRzLmRpc3BsYXk6IFsndGF4SWQnLCAndGFnc1JlcXVlc3RlZCddYCkuIEFsIGltcGxlbWVudGFybG8gY29uIGxvcyBkb3NcbiAqIGNvbnN1bWlkb3JlcyByZWFsZXMgZGVsYW50ZSBxdWVkw7MgY2xhcm8gcXVlIGVzbyByZWludmVudGEgdW4gbW90b3IgZGVcbiAqIHRlbXBsYXRpbmcgcGVvciBxdWUgQW5ndWxhcjogQ2hlc2VkIG5lY2VzaXRhIHVuYSBsaXN0YSBkZSBkb2N1bWVudG9zIGNvblxuICogaWNvbm9zIHkgYHRhcmdldD1cIl9ibGFua1wiYCwgT2toZWxpYSB1biBlbmxhY2UgYSBsYSByZWNldGEgeSB1biBpbnB1dCBkZVxuICogY29tZW50YXJpby4gTmluZ3VuYSBsaXN0YSBkZSBzdHJpbmdzIGV4cHJlc2EgZXNvIHNpbiBhZ3JlZ2FybGUgdW4gZmxhZyBhbFxuICogY29tcG9uZW50ZSBwb3IgY2FkYSBjYXNvIG51ZXZvLlxuICpcbiAqIEVudG9uY2VzIGVsIHBhbmVsIGVzIGR1ZcOxbyBkZSBsbyBxdWUgKipkZSB2ZXJkYWQqKiBzZSByZXBpdGUg4oCUIGxhIGPDoXNjYXJhLCBlbFxuICogY2hyb21lIGRlIGxhIGNhcmQsIHkgbGEgbWVjw6FuaWNhIGRlIGRlY2lzacOzbiDigJQgeSBlbCBjdWVycG8gZGUgY2FkYSDDrXRlbSBsb1xuICogZXNjcmliZSBjYWRhIHZlcnRpY2FsIGVuIHVuIGBuZy10ZW1wbGF0ZWAgY29uIHN1IHByb3BpbyBIVE1MLlxuICpcbiAqIGBgYGh0bWxcbiAqIDx2YWwtcmVxdWVzdC1yZXZpZXctcGFuZWwgW3Byb3BzXT1cInBhbmVsUHJvcHMoKVwiIFtpdGVtQm9keV09XCJib2R5XCJcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlY2lzaW9uKT1cIm9uRGVjaXNpb24oJGV2ZW50KVwiIC8+XG4gKlxuICogPG5nLXRlbXBsYXRlICNib2R5IGxldC1pdGVtPlxuICogICA8YSBbcm91dGVyTGlua109XCJbJy9hcHAvcmVjZXRhcycsIHJlY2lwZUlkT2YoaXRlbSldXCI+VmVyIHJlY2V0YTwvYT5cbiAqIDwvbmctdGVtcGxhdGU+XG4gKiBgYGBcbiAqXG4gKiAjIyBSZWNoYXpvIGNvbiBtb3Rpdm9cbiAqXG4gKiBFbCBmbHVqbyBkZSBkb3MgcGFzb3MgKFJlY2hhemFyIOKGkiBlc2NyaWJpciBtb3Rpdm8g4oaSIENvbmZpcm1hcikgZXMgZGVsIHBhbmVsLFxuICogbm8gZGVsIGNvbnN1bWVyLCB5IGVzdMOhIGFjdGl2byBwb3IgZGVmZWN0by4gUmVjaGF6YXIgZGUgdW4gY2xpY2sgZGVqYSBhbFxuICogc29saWNpdGFudGUgc2luIHNhYmVyIHF1w6kgY29ycmVnaXI7IGVyYSBlbCDDum5pY28gZGUgbG9zIGRvcyBwYW5lbGVzIHF1ZSBsb1xuICogdGVuw61hIGJpZW4gcmVzdWVsdG8geSBhaG9yYSBsbyBoZXJlZGFuIGxvcyBkb3MuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZhbC1yZXF1ZXN0LXJldmlldy1wYW5lbCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEJ1dHRvbkNvbXBvbmVudCwgRW1wdHlTdGF0ZUNvbXBvbmVudCwgU2tlbGV0b25Db21wb25lbnRdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJycnBcIj5cbiAgICAgIEBpZiAoY2ZnKCkubG9hZGluZykge1xuICAgICAgICA8ZGl2IGNsYXNzPVwicnJwX19za2VsXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgQGZvciAocm93IG9mIHNrZWxldG9uUm93cygpOyB0cmFjayByb3cpIHtcbiAgICAgICAgICAgIDx2YWwtc2tlbGV0b24gW3Byb3BzXT1cInsgd2lkdGg6ICcxMDAlJywgaGVpZ2h0OiAnMTIwcHgnLCBib3JkZXJSYWRpdXM6ICcxNHB4JyB9XCIgLz5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgfSBAZWxzZSBpZiAoY2ZnKCkuZXJyb3JTdGF0ZSkge1xuICAgICAgICA8dmFsLWVtcHR5LXN0YXRlIFtwcm9wc109XCJjZmcoKS5lcnJvclN0YXRlIVwiIC8+XG4gICAgICB9IEBlbHNlIGlmIChjZmcoKS5pdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgQGlmIChjZmcoKS5lbXB0eVN0YXRlOyBhcyBlbXB0eSkge1xuICAgICAgICAgIDx2YWwtZW1wdHktc3RhdGUgW3Byb3BzXT1cImVtcHR5XCIgLz5cbiAgICAgICAgfVxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIEBpZiAoY2ZnKCkuY291bnRMYWJlbDsgYXMgY291bnQpIHtcbiAgICAgICAgICA8cCBjbGFzcz1cInJycF9fY291bnRcIj57eyBjb3VudCB9fTwvcD5cbiAgICAgICAgfVxuXG4gICAgICAgIDx1bCBjbGFzcz1cInJycF9fcXVldWVcIj5cbiAgICAgICAgICBAZm9yIChpdGVtIG9mIGNmZygpLml0ZW1zOyB0cmFjayBpdGVtLmlkKSB7XG4gICAgICAgICAgICA8bGkgY2xhc3M9XCJycnBfX2l0ZW1cIj5cbiAgICAgICAgICAgICAgPGgzIGNsYXNzPVwicnJwX190aXRsZVwiPnt7IGl0ZW0udGl0bGUgfX08L2gzPlxuXG4gICAgICAgICAgICAgIEBmb3IgKGxpbmUgb2YgaXRlbS5tZXRhID8/IFtdOyB0cmFjayBsaW5lKSB7XG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJycnBfX21ldGFcIj57eyBsaW5lIH19PC9wPlxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgQGlmIChpdGVtQm9keSkge1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJycnBfX2JvZHlcIj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiaXRlbUJvZHlcIlxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGl0ZW0sIGl0ZW06IGl0ZW0gfVwiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgQGlmIChyZWplY3RpbmdJZCgpID09PSBpdGVtLmlkKSB7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJycF9fcmVqZWN0XCI+XG4gICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJycnBfX3JlamVjdC1sYWJlbFwiIFthdHRyLmZvcl09XCIncnJwLW5vdGUtJyArIGl0ZW0uaWRcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgY2ZnKCkucmVqZWN0UmVhc29uTGFiZWwgPz8gdCgncmVqZWN0UmVhc29uJykgfX1cbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8dGV4dGFyZWFcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJycnBfX3JlamVjdC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgIFtpZF09XCIncnJwLW5vdGUtJyArIGl0ZW0uaWRcIlxuICAgICAgICAgICAgICAgICAgICByb3dzPVwiM1wiXG4gICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJjZmcoKS5yZWplY3RSZWFzb25QbGFjZWhvbGRlciA/PyB0KCdyZWplY3RSZWFzb25QbGFjZWhvbGRlcicpXCJcbiAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInJlYXNvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cIm9uUmVhc29uSW5wdXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICA+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwicnJwX19yZWplY3QtaGludFwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBjZmcoKS5yZWplY3RSZWFzb25IaW50ID8/IHQoJ3JlamVjdFJlYXNvbkhpbnQnKSB9fVxuICAgICAgICAgICAgICAgICAgPC9wPlxuXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnJwX19hY3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgICAgIDx2YWwtYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgW3Byb3BzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuOiAncnJwLWNhbmNlbC0nICsgaXRlbS5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IGNmZygpLmNhbmNlbExhYmVsID8/IHQoJ2NhbmNlbCcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdkYXJrJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw6ICdjbGVhcicsXG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAnc21hbGwnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2J1dHRvbicsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZTogaXNCdXN5KCkgPyAnRElTQUJMRUQnIDogJ0VOQUJMRUQnLFxuICAgICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cImNhbmNlbFJlamVjdCgpXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPHZhbC1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgICBbcHJvcHNdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW46ICdycnAtY29uZmlybS1yZWplY3QtJyArIGl0ZW0uaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBjZmcoKS5jb25maXJtUmVqZWN0TGFiZWwgPz8gdCgnY29uZmlybVJlamVjdCcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdkYW5nZXInLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsbDogJ3NvbGlkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlOiAncm91bmQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogJ3NtYWxsJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdidXR0b24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGU6IGNvbmZpcm1SZWplY3RTdGF0ZShpdGVtKSxcbiAgICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAob25DbGljayk9XCJjb25maXJtUmVqZWN0KGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnJwX19hY3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgICA8dmFsLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBbcHJvcHNdPVwie1xuICAgICAgICAgICAgICAgICAgICAgIHRva2VuOiAncnJwLXJlamVjdC0nICsgaXRlbS5pZCxcbiAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBjZmcoKS5yZWplY3RMYWJlbCA/PyB0KCdyZWplY3QnKSxcbiAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ2RhcmsnLFxuICAgICAgICAgICAgICAgICAgICAgIGZpbGw6ICdvdXRsaW5lJyxcbiAgICAgICAgICAgICAgICAgICAgICBzaGFwZTogJ3JvdW5kJyxcbiAgICAgICAgICAgICAgICAgICAgICBzaXplOiAnc21hbGwnLFxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdidXR0b24nLFxuICAgICAgICAgICAgICAgICAgICAgIHN0YXRlOiBpc0J1c3koKSA/ICdESVNBQkxFRCcgOiAnRU5BQkxFRCcsXG4gICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICAob25DbGljayk9XCJzdGFydFJlamVjdChpdGVtKVwiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPHZhbC1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgW3Byb3BzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICB0b2tlbjogJ3JycC1hcHByb3ZlLScgKyBpdGVtLmlkLFxuICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IGNmZygpLmFwcHJvdmVMYWJlbCA/PyB0KCdhcHByb3ZlJyksXG4gICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdwcmltYXJ5JyxcbiAgICAgICAgICAgICAgICAgICAgICBmaWxsOiAnc29saWQnLFxuICAgICAgICAgICAgICAgICAgICAgIHNoYXBlOiAncm91bmQnLFxuICAgICAgICAgICAgICAgICAgICAgIHNpemU6ICdzbWFsbCcsXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2J1dHRvbicsXG4gICAgICAgICAgICAgICAgICAgICAgc3RhdGU6IGFwcHJvdmVTdGF0ZShpdGVtKSxcbiAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cImFwcHJvdmUoaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICB9XG4gICAgICAgIDwvdWw+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIGAsXG4gIHN0eWxlVXJsczogWycuL3JlcXVlc3QtcmV2aWV3LXBhbmVsLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFJlcXVlc3RSZXZpZXdQYW5lbENvbXBvbmVudCB7XG4gIHByaXZhdGUgaTE4biA9IGluamVjdChJMThuU2VydmljZSk7XG5cbiAgcmVhZG9ubHkgcHJvcHMgPSBpbnB1dC5yZXF1aXJlZDxSZXF1ZXN0UmV2aWV3UGFuZWxNZXRhZGF0YT4oKTtcblxuICAvKipcbiAgICogQ3VlcnBvIGRlIGNhZGEgY2FyZC4gRWwgY29udGV4dG8gdHJhZSBlbCDDrXRlbSBjb21vIGAkaW1wbGljaXRgIHkgdGFtYmnDqW5cbiAgICogY29tbyBgaXRlbWAsIHBhcmEgcXVlIGVsIGNvbnN1bWVyIHB1ZWRhIHVzYXIgYGxldC1pdGVtYCBvIGBsZXQteD1cIml0ZW1cImAuXG4gICAqL1xuICBASW5wdXQoKSBpdGVtQm9keT86IFRlbXBsYXRlUmVmPHsgJGltcGxpY2l0OiBSZXF1ZXN0UmV2aWV3SXRlbTsgaXRlbTogUmVxdWVzdFJldmlld0l0ZW0gfT47XG5cbiAgQE91dHB1dCgpIGRlY2lzaW9uID0gbmV3IEV2ZW50RW1pdHRlcjxSZXF1ZXN0UmV2aWV3RGVjaXNpb24+KCk7XG5cbiAgLyoqIElEIGRlbCDDrXRlbSBjdXlvIGZvcm11bGFyaW8gZGUgcmVjaGF6byBlc3TDoSBhYmllcnRvLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9yZWplY3RpbmdJZCA9IHNpZ25hbCgnJyk7XG4gIHJlYWRvbmx5IHJlamVjdGluZ0lkID0gdGhpcy5fcmVqZWN0aW5nSWQuYXNSZWFkb25seSgpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3JlYXNvbiA9IHNpZ25hbCgnJyk7XG4gIHJlYWRvbmx5IHJlYXNvbiA9IHRoaXMuX3JlYXNvbi5hc1JlYWRvbmx5KCk7XG5cbiAgcmVhZG9ubHkgY2ZnID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5wcm9wcygpKTtcblxuICByZWFkb25seSBza2VsZXRvblJvd3MgPSBjb21wdXRlZCgoKSA9PiBBcnJheS5mcm9tKHsgbGVuZ3RoOiB0aGlzLmNmZygpLnNrZWxldG9uUm93cyA/PyAzIH0sIChfLCBpKSA9PiBpKSk7XG5cbiAgLyoqIEhheSB1bmEgZGVjaXNpw7NuIGVuIHZ1ZWxvOiB0b2RhIGxhIGNvbGEgc2UgY29uZ2VsYS4gKi9cbiAgcmVhZG9ubHkgaXNCdXN5ID0gY29tcHV0ZWQoKCkgPT4gISF0aGlzLmNmZygpLmJ1c3lJdGVtSWQpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGlmICghdGhpcy5pMThuLmhhc05hbWVzcGFjZShOQU1FU1BBQ0UpKSB7XG4gICAgICB0aGlzLmkxOG4ucmVnaXN0ZXJDb250ZW50KE5BTUVTUEFDRSwgUkVRVUVTVF9SRVZJRVdfUEFORUxfSTE4Tik7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHQoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmkxOG4udChrZXksIE5BTUVTUEFDRSk7XG4gIH1cblxuICAvKiogRWwgw610ZW0gZW4gdnVlbG8gbXVlc3RyYSBXT1JLSU5HOyBsb3MgZGVtw6FzIHF1ZWRhbiBkZXNoYWJpbGl0YWRvcy4gKi9cbiAgcHJpdmF0ZSBzdGF0ZUZvcihpdGVtOiBSZXF1ZXN0UmV2aWV3SXRlbSk6IENvbXBvbmVudFN0YXRlIHtcbiAgICBjb25zdCBidXN5SWQgPSB0aGlzLmNmZygpLmJ1c3lJdGVtSWQ7XG4gICAgaWYgKGJ1c3lJZCA9PT0gaXRlbS5pZCkgcmV0dXJuICdXT1JLSU5HJztcbiAgICByZXR1cm4gYnVzeUlkID8gJ0RJU0FCTEVEJyA6ICdFTkFCTEVEJztcbiAgfVxuXG4gIHByb3RlY3RlZCBhcHByb3ZlU3RhdGUoaXRlbTogUmVxdWVzdFJldmlld0l0ZW0pOiBDb21wb25lbnRTdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVGb3IoaXRlbSk7XG4gIH1cblxuICAvKipcbiAgICogQ29uZmlybWFyIGVsIHJlY2hhem8gZXhpZ2UgbW90aXZvIGN1YW5kbyBgcmVxdWlyZVJlamVjdFJlYXNvbmAgZXN0w6EgYWN0aXZvXG4gICAqIChlbCBkZWZhdWx0KS4gRXMgZWwgZnJlbm8gcXVlIGV2aXRhIGxhIG5vdGlmaWNhY2nDs24gZGUgcmVjaGF6byB2YWPDrWEuXG4gICAqL1xuICBwcm90ZWN0ZWQgY29uZmlybVJlamVjdFN0YXRlKGl0ZW06IFJlcXVlc3RSZXZpZXdJdGVtKTogQ29tcG9uZW50U3RhdGUge1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5zdGF0ZUZvcihpdGVtKTtcbiAgICBpZiAoc3RhdGUgIT09ICdFTkFCTEVEJykgcmV0dXJuIHN0YXRlO1xuICAgIGNvbnN0IG5lZWRzUmVhc29uID0gdGhpcy5jZmcoKS5yZXF1aXJlUmVqZWN0UmVhc29uICE9PSBmYWxzZTtcbiAgICByZXR1cm4gbmVlZHNSZWFzb24gJiYgdGhpcy5fcmVhc29uKCkudHJpbSgpLmxlbmd0aCA9PT0gMCA/ICdESVNBQkxFRCcgOiAnRU5BQkxFRCc7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25SZWFzb25JbnB1dChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLl9yZWFzb24uc2V0KChldmVudC50YXJnZXQgYXMgSFRNTFRleHRBcmVhRWxlbWVudCkudmFsdWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXJ0UmVqZWN0KGl0ZW06IFJlcXVlc3RSZXZpZXdJdGVtKTogdm9pZCB7XG4gICAgLy8gU2luIG1vdGl2byBvYmxpZ2F0b3JpbyBlbCByZWNoYXpvIGVzIGRpcmVjdG86IGFicmlyIHVuIGZvcm11bGFyaW8gcXVlIG5vXG4gICAgLy8gZXhpZ2UgbmFkYSBzb2xvIGFncmVnYSB1biBwYXNvLlxuICAgIGlmICh0aGlzLmNmZygpLnJlcXVpcmVSZWplY3RSZWFzb24gPT09IGZhbHNlKSB7XG4gICAgICB0aGlzLmRlY2lzaW9uLmVtaXQoeyBpdGVtSWQ6IGl0ZW0uaWQsIGFwcHJvdmVkOiBmYWxzZSB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fcmVhc29uLnNldCgnJyk7XG4gICAgdGhpcy5fcmVqZWN0aW5nSWQuc2V0KGl0ZW0uaWQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNhbmNlbFJlamVjdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9yZWplY3RpbmdJZC5zZXQoJycpO1xuICAgIHRoaXMuX3JlYXNvbi5zZXQoJycpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNvbmZpcm1SZWplY3QoaXRlbTogUmVxdWVzdFJldmlld0l0ZW0pOiB2b2lkIHtcbiAgICBjb25zdCByZWFzb24gPSB0aGlzLl9yZWFzb24oKS50cmltKCk7XG4gICAgaWYgKHRoaXMuY2ZnKCkucmVxdWlyZVJlamVjdFJlYXNvbiAhPT0gZmFsc2UgJiYgcmVhc29uLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIHRoaXMuZGVjaXNpb24uZW1pdCh7IGl0ZW1JZDogaXRlbS5pZCwgYXBwcm92ZWQ6IGZhbHNlLCByZWFzb246IHJlYXNvbiB8fCB1bmRlZmluZWQgfSk7XG4gICAgdGhpcy5jYW5jZWxSZWplY3QoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhcHByb3ZlKGl0ZW06IFJlcXVlc3RSZXZpZXdJdGVtKTogdm9pZCB7XG4gICAgdGhpcy5kZWNpc2lvbi5lbWl0KHsgaXRlbUlkOiBpdGVtLmlkLCBhcHByb3ZlZDogdHJ1ZSB9KTtcbiAgfVxufVxuIl19