trm-tmpl 3.1.1 → 3.1.2
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.
- package/esm2022/lib/app/pages/components/constructor-form/constructor-form.component.mjs +10 -20
- package/esm2022/lib/app/pages/components/constructor-form/services/constructor-form.service.mjs +4 -1
- package/esm2022/lib/app/pages/components/terminal-layout/terminal-layout.component.mjs +3 -3
- package/esm2022/lib/app/services/session.data-source.mjs +17 -7
- package/esm2022/lib/app/services/translation/translate-lang-storage.service.mjs +1 -1
- package/esm2022/lib/app/shared/components/terminal-lang-switcher/terminal-lang-switcher.component.mjs +2 -2
- package/fesm2022/trm-tmpl.mjs +31 -28
- package/fesm2022/trm-tmpl.mjs.map +1 -1
- package/lib/app/pages/components/constructor-form/constructor-form.component.d.ts +1 -2
- package/lib/app/pages/components/constructor-form/services/constructor-form.service.d.ts +2 -2
- package/lib/app/services/translation/translate-lang-storage.service.d.ts +1 -2
- package/package.json +1 -1
- package/scss/spinner.scss +17 -12
|
@@ -2,7 +2,7 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, in
|
|
|
2
2
|
import { PaymentFieldTypeEnum, TerminalStep } from './models';
|
|
3
3
|
import { ConstructorFormService } from './services/constructor-form.service';
|
|
4
4
|
import { insertRemoveTrigger } from './../../../helpers/insertRemoveTrigger';
|
|
5
|
-
import { Subject } from 'rxjs';
|
|
5
|
+
import { distinctUntilChanged, Subject } from 'rxjs';
|
|
6
6
|
import { debounceTime, takeUntil } from 'rxjs/operators';
|
|
7
7
|
import { TranslateService } from '@ngx-translate/core';
|
|
8
8
|
import { CountriesSortPipe } from '../../../pipes/countries-sort.pipe';
|
|
@@ -119,10 +119,10 @@ export class ConstructorFormComponent {
|
|
|
119
119
|
return this.translateSrv.currentLang;
|
|
120
120
|
}
|
|
121
121
|
get skeletonLength() {
|
|
122
|
-
return new Array(this.form.fields
|
|
122
|
+
return new Array(this.form.fields?.length || 3).fill(0);
|
|
123
123
|
}
|
|
124
124
|
ngOnChanges(changes) {
|
|
125
|
-
if (changes.types?.
|
|
125
|
+
if (changes.types && this.types?.length || changes.currency && this.currency) {
|
|
126
126
|
// Get configuration fields
|
|
127
127
|
const countries = this.countriesList;
|
|
128
128
|
const defaultCountry = this.form.defaultCountry;
|
|
@@ -143,18 +143,12 @@ export class ConstructorFormComponent {
|
|
|
143
143
|
this.cd.detectChanges();
|
|
144
144
|
this.fetchForm();
|
|
145
145
|
}
|
|
146
|
-
if (changes.step && changes.step.currentValue && !changes.types && !changes.currency) {
|
|
147
|
-
this.fetchForm();
|
|
148
|
-
}
|
|
149
|
-
if (changes.loading && !changes.loading.currentValue) {
|
|
150
|
-
this.cd.detectChanges();
|
|
151
|
-
}
|
|
152
146
|
}
|
|
153
147
|
ngAfterViewInit() {
|
|
154
148
|
this.form
|
|
155
149
|
.country
|
|
156
150
|
.valueChanges
|
|
157
|
-
.pipe(takeUntil(this.unSubscriber))
|
|
151
|
+
.pipe(distinctUntilChanged((a, b) => a === b), takeUntil(this.unSubscriber))
|
|
158
152
|
.subscribe(() => {
|
|
159
153
|
this.cd.detectChanges();
|
|
160
154
|
this.form.saveDefaultCountry();
|
|
@@ -171,7 +165,7 @@ export class ConstructorFormComponent {
|
|
|
171
165
|
this.form
|
|
172
166
|
.method
|
|
173
167
|
.valueChanges
|
|
174
|
-
.pipe(takeUntil(this.unSubscriber))
|
|
168
|
+
.pipe(distinctUntilChanged((a, b) => a === b), takeUntil(this.unSubscriber))
|
|
175
169
|
.subscribe(() => {
|
|
176
170
|
this.form.method.clearValidators();
|
|
177
171
|
this.form.saveDefaultMethodName();
|
|
@@ -182,7 +176,7 @@ export class ConstructorFormComponent {
|
|
|
182
176
|
this.form
|
|
183
177
|
.currency
|
|
184
178
|
.valueChanges
|
|
185
|
-
.pipe(takeUntil(this.unSubscriber))
|
|
179
|
+
.pipe(distinctUntilChanged((a, b) => a === b), takeUntil(this.unSubscriber))
|
|
186
180
|
.subscribe(() => {
|
|
187
181
|
this.fetchForm();
|
|
188
182
|
this.form.saveDefaultCurrency();
|
|
@@ -198,8 +192,6 @@ export class ConstructorFormComponent {
|
|
|
198
192
|
}
|
|
199
193
|
this.form.removePaymentFormControls();
|
|
200
194
|
this.cd.detectChanges();
|
|
201
|
-
this.form.payment.markAsPending();
|
|
202
|
-
this.cd.detectChanges();
|
|
203
195
|
this.form
|
|
204
196
|
.init()
|
|
205
197
|
.subscribe(() => {
|
|
@@ -207,12 +199,10 @@ export class ConstructorFormComponent {
|
|
|
207
199
|
this.send();
|
|
208
200
|
return;
|
|
209
201
|
}
|
|
210
|
-
this.form.payment.updateValueAndValidity({ onlySelf: true });
|
|
211
202
|
this.cd.detectChanges();
|
|
212
203
|
this.scrollToRequisits();
|
|
213
204
|
this.form.maskedWallet = '';
|
|
214
205
|
}, (err) => {
|
|
215
|
-
this.form.payment.updateValueAndValidity({ onlySelf: true });
|
|
216
206
|
this.cd.markForCheck();
|
|
217
207
|
});
|
|
218
208
|
}
|
|
@@ -228,7 +218,7 @@ export class ConstructorFormComponent {
|
|
|
228
218
|
return typeof this.form.config?.description === 'function' ? this.form.config?.description(this.form.getRawValue()) : this.form.config?.description;
|
|
229
219
|
}
|
|
230
220
|
submit() {
|
|
231
|
-
if (!this.check()) {
|
|
221
|
+
if (!this.check() && !this.loading) {
|
|
232
222
|
return;
|
|
233
223
|
}
|
|
234
224
|
if (this.form.methodName === 'card' && !this.cardIframe?.finished) {
|
|
@@ -296,14 +286,14 @@ export class ConstructorFormComponent {
|
|
|
296
286
|
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.2", type: ConstructorFormComponent, isStandalone: true, selector: "app-constructor-form", inputs: { step: "step", error: "error", response: "response", currency: "currency", userCurrency: "userCurrency", loading: "loading", types: "types", canReturnToProject: "canReturnToProject", tabIndex: "tabIndex" }, outputs: { back: "back", prepare: "prepare", confirm: "confirm", onPaymentChanged: "onPaymentChanged" }, providers: [
|
|
297
287
|
ConstructorFormService,
|
|
298
288
|
CountryTranslatePipe, CountriesSortPipe
|
|
299
|
-
], viewQueries: [{ propertyName: "requisites", first: true, predicate: ["paymentRequisites"], descendants: true }, { propertyName: "hintMethod", first: true, predicate: ["hintMethod"], descendants: true }, { propertyName: "cardIframe", first: true, predicate: ["cardIframe"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<form class=\"constructor\"\r\n [formGroup]=\"form\"\r\n (ngSubmit)=\"submit()\"\r\n >\r\n @if (!loading) {\r\n @if (step === TERMINAL_STEP.Prepare) {\r\n <div class=\"constructor__fields\">\r\n @if (countrySearchString || countriesList.length > 1) {\r\n <div class=\"constructor__field\">\r\n <app-trm-select [data]=\"countriesList\"\r\n name=\"country\"\r\n [label]=\"I18N_KEY.CONSTRUCTOR_LABEL_COUNTRY | trans\"\r\n formControlName=\"country\"\r\n class=\"c-field-select trm-form-field\"\r\n (search)=\"searchCountry($event)\"\r\n [tabIndex]=\"tabIndex\"\r\n >\r\n <ng-template trmSelectLabelTemplate let-item=\"item\">\r\n <span class=\"fi\"\r\n [ngClass]=\"'fi-' + item.toLowerCase()\"></span>\r\n <span class=\"method__name\">{{item | country_translate: lang}}</span>\r\n </ng-template>\r\n </app-trm-select>\r\n </div>\r\n }\r\n @if (form.country.value) {\r\n <app-ps-select [methods]=\"methodsList\"\r\n formControlName=\"method\"\r\n [tabIndex]=\"tabIndex\"\r\n >\r\n @if (form.config?.description) {\r\n <div class=\"constructor__hint text--warn\"\r\n app-ps-select-hint\r\n #hintMethod\r\n @insertRemove\r\n >\r\n {{description | trans }}\r\n </div>\r\n }\r\n @if (form.isCDEFailed) {\r\n <div class=\"constructor__hint cde-error\"\r\n app-ps-select-hint\r\n @insertRemove\r\n >\r\n {{form.getError('cde_error') | trans }}\r\n </div>\r\n }\r\n </app-ps-select>\r\n }\r\n @if (!form.payment.pending) {\r\n @if (form.paymentFormFieldNames.length) {\r\n <div formGroupName=\"payment\"\r\n #paymentRequisites\r\n class=\"constructor__fields constructor__fields--reverse\">\r\n @if (form.amountDynamic) {\r\n <ng-container *ngTemplateOutlet=\"currencyTpl; context: {label: I18N_KEY.CONSTRUCTOR_LABEL_CURRENCY | trans, tabIndex: 0}\"></ng-container>\r\n }\r\n @for (field of form.fields; track field.name; let i = $index) {\r\n @if (field.type === CONSTRUCTOR_FIELD_TYPES.Iframe) {\r\n <app-constructor-field-iframe\r\n [hidden]=\"form.isCDEFailed\"\r\n (paid)=\"cardPaid()\"\r\n #cardIframe\r\n (error)=\"iframeError($event)\"\r\n [tabIndex]=\"form.fields.length - i + tabIndex\">\r\n </app-constructor-field-iframe>\r\n }\r\n @if (field.type === CONSTRUCTOR_FIELD_TYPES.Select) {\r\n <app-constructor-field-select\r\n [config]=\"field\"\r\n [items]=\"field?.options?.items\"\r\n [formControlName]=\"field.name\"\r\n [tabIndex]=\"form.fields.length - i + tabIndex\"\r\n ></app-constructor-field-select>\r\n }\r\n @if ([CONSTRUCTOR_FIELD_TYPES.Text, CONSTRUCTOR_FIELD_TYPES.Number, CONSTRUCTOR_FIELD_TYPES.Email].includes(field.type)) {\r\n <app-constructor-field-text\r\n [config]=\"field\"\r\n [formControlName]=\"field.name\"\r\n (maskedValueChange)=\"changeTextFieldValue($event, field)\"\r\n [tabIndex]=\"form.fields.length - i + tabIndex\"></app-constructor-field-text>\r\n }\r\n @if (field.type === CONSTRUCTOR_FIELD_TYPES.Amount) {\r\n <app-constructor-field-text\r\n [config]=\"field\"\r\n [formControlName]=\"field.name\"\r\n [tabIndex]=\"form.fields.length - i + tabIndex\">\r\n @if (hasFeeHint(field)) {\r\n <app-method-amount-hint app-c-text-hint\r\n class=\"constructor__hint\"\r\n [fee]=\"field.options.fee\"\r\n [fixedFee]=\"field.options.fixedFee\"\r\n [max]=\"field.options.max\"\r\n [min]=\"field.options.min\"\r\n [currency]=\"field.options.currency\"\r\n ></app-method-amount-hint>\r\n }\r\n <div app-c-text-suffix\r\n class=\"constructor__currency\"\r\n [class.constructor__currency--transparent]=\"form.isAmountEditable\"\r\n >\r\n <ng-container *ngTemplateOutlet=\"currencyTpl; context: {tabIndex: form.fields.length - i + tabIndex}\"></ng-container>\r\n </div>\r\n </app-constructor-field-text>\r\n @if (hasCurrencyMethodSelector) {\r\n <app-trm-select\r\n class=\"constructor-field\"\r\n [label]=\"I18N_KEY.CONSTRUCTOR_LABEL_CURRENCY | trans\"\r\n [formControl]=\"form.currency\"\r\n [searchable]=\"false\"\r\n [data]=\"currenciesList\"\r\n [tabIndex]=\"form.fields.length - i + tabIndex\"\r\n >\r\n <ng-template trmSelectLabelTemplate let-item=\"item\">\r\n <span class=\"trm-icon\" [ngClass]=\"'trm-curr-' + item.toLowerCase()\"\r\n [title]=\"item\"></span>\r\n {{item}}\r\n </ng-template>\r\n </app-trm-select>\r\n }\r\n }\r\n @if (field.type === CONSTRUCTOR_FIELD_TYPES.Date) {\r\n <app-constructor-field-date\r\n [config]=\"field\"\r\n [formControlName]=\"field.name\"\r\n [tabIndex]=\"form.fields.length - i + tabIndex\"></app-constructor-field-date>\r\n }\r\n }\r\n <ng-template #currencyTpl let-label=\"label\" let-tabIndex=\"tabIndex\">\r\n <app-trm-select\r\n [label]=\"label\"\r\n [formControl]=\"form.userCurrency\"\r\n [searchable]=\"false\"\r\n [data]=\"userCurrenciesList\"\r\n [tabIndex]=\"tabIndex\"\r\n >\r\n <ng-template trmSelectLabelTemplate let-item=\"item\">\r\n <span class=\"trm-icon\"\r\n [ngClass]=\"'trm-curr-' + item.toLowerCase()\"\r\n [title]=\"item\"></span>\r\n {{item}}\r\n </ng-template>\r\n </app-trm-select>\r\n </ng-template>\r\n </div>\r\n }\r\n } @else {\r\n <div class=\"trm-skeleton-fields\">\r\n @for (i of skeletonLength; track $index) {\r\n <div class=\"trm-skeleton-field\">\r\n <gm-skeleton [count]=\"1\" [shape]=\"'rect-md'\" [size]=\"18\"></gm-skeleton>\r\n <gm-skeleton [count]=\"1\" [size]=\"50\"></gm-skeleton>\r\n </div>\r\n }\r\n </div>\r\n }\r\n @if (error && !form.payment.pending) {\r\n <div class=\"trm-error\"\r\n @insertRemove\r\n >\r\n {{ error | trans }}\r\n </div>\r\n }\r\n </div>\r\n }\r\n @if (step === TERMINAL_STEP.Confirmation) {\r\n <app-constructor-preparation\r\n [currency]=\"response?.currency\"\r\n [methodName]=\"form.getTypeNameById(response.typeId)\"\r\n [wallet]=\"response.wallet\"\r\n [maskedWallet]=\"maskedWallet\"\r\n [amount]=\"response.amount\"\r\n [total]=\"response.total\"\r\n [confirmationText]=\"form.config?.confirmation\"\r\n >\r\n @if (error && !form.payment.pending) {\r\n <div class=\"trm-error\"\r\n app-constructor-preparation-error\r\n @insertRemove\r\n >\r\n {{ error | trans }}\r\n </div>\r\n }\r\n </app-constructor-preparation>\r\n }\r\n <div class=\"constructor__actions\">\r\n <button class=\"trm-button trm-button--primary constructor__actions-continue\"\r\n type=\"submit\"\r\n [tabindex]=\"form.fields.length + tabIndex\">\r\n {{I18N_KEY.CONSTRUCTOR_LABEL_CONTINUE | trans}}\r\n </button>\r\n <button class=\"trm-button trm-button--secondary constructor__actions-back\"\r\n type=\"button\"\r\n [tabindex]=\"form.fields.length + tabIndex\"\r\n (click)=\"back.emit()\"> {{ backBtnLabel | trans}}</button>\r\n </div>\r\n } @else {\r\n <div class=\"trm-skeleton-group\">\r\n <gm-skeleton [count]=\"4\" [gap]=\"20\" [size]=\"80\"></gm-skeleton>\r\n <gm-skeleton [count]=\"2\" [gap]=\"10\" [size]=\"48\"></gm-skeleton>\r\n </div>\r\n }\r\n</form>\r\n", styles: [":host{display:block}.constructor{display:flex;flex-direction:column;gap:32px;justify-content:flex-start;align-items:stretch}.constructor__fields{display:flex;flex-direction:column;gap:20px;justify-content:flex-start;align-items:stretch}.constructor__fields--reverse{flex-direction:column-reverse}.constructor__fields .fi{border-radius:2px;overflow:hidden;border:1px solid rgba(0,0,0,.08);box-sizing:border-box;background-origin:border-box;flex-shrink:0;height:15px}.constructor__fields .fi-other{border-color:transparent}.constructor__currency{--trm-select-border-radius: 0 10px 10px 0;display:flex;align-items:center;position:absolute;bottom:0;right:0;flex-shrink:0;min-height:46px}@media (min-width: 768px){.constructor__currency{min-height:50px}}.constructor__currency .trm-divider{margin:5px 0;align-self:stretch}.constructor__currency--transparent{--trm-select-bg-color: transparent;--trm-select-bg-color--disabled: transparent;--trm-select-border-color: transparent;--trm-select-border-color--hover: transparent;--trm-select-border-color--focus: transparent}.constructor__actions{display:flex;flex-direction:column;gap:10px;justify-content:flex-start;align-items:flex-start}.constructor__hint{font-weight:400;font-size:14px;line-height:22px;color:var(--color-base-350);margin-top:8px}.constructor__hint.cde-error{color:var(--color-red-500)}\n"], dependencies: [{ kind: "pipe", type: CountryTranslatePipe, name: "country_translate" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "component", type: TrmSelectComponent, selector: "app-trm-select", inputs: ["label", "hasBorder", "data", "tabIndex", "name", "placeholder", "searchable", "hasScrollbar", "nameId", "nameLabel"], outputs: ["open", "search"] }, { kind: "directive", type: TrmSelectLabelTemplateDirective, selector: "[trmSelectLabelTemplate]" }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: PsSelectComponent, selector: "app-ps-select", inputs: ["methods", "tabIndex"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: ConstructorFieldIframeComponent, selector: "app-constructor-field-iframe", inputs: ["tabIndex"], outputs: ["error", "paid", "ready"] }, { kind: "component", type: ConstructorFieldSelectComponent, selector: "app-constructor-field-select", inputs: ["config", "items", "tabIndex"] }, { kind: "component", type: ConstructorFieldTextComponent, selector: "app-constructor-field-text", inputs: ["config", "matDatepicker", "tabIndex"], outputs: ["maskedValueChange"] }, { kind: "component", type: MethodAmountHintComponent, selector: "app-method-amount-hint", inputs: ["fee", "fixedFee", "min", "max", "currency"] }, { kind: "component", type: ConstructorFieldDateComponent, selector: "app-constructor-field-date", inputs: ["config", "tabIndex"] }, { kind: "component", type: ConstructorPreparationComponent, selector: "app-constructor-preparation", inputs: ["maskedWallet", "wallet", "confirmationText", "methodName", "currency", "amount", "total"] }, { kind: "directive", type: TabIndexFocusDirective, selector: "[tabindex]" }, { kind: "pipe", type: TranslateByKeyPipe, name: "trans" }, { kind: "component", type: GmSkeletonComponent, selector: "gm-skeleton", inputs: ["shape", "orientation", "count", "size", "gap"] }], animations: [insertRemoveTrigger], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
289
|
+
], viewQueries: [{ propertyName: "requisites", first: true, predicate: ["paymentRequisites"], descendants: true }, { propertyName: "hintMethod", first: true, predicate: ["hintMethod"], descendants: true }, { propertyName: "cardIframe", first: true, predicate: ["cardIframe"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<form class=\"constructor\"\r\n [formGroup]=\"form\"\r\n (ngSubmit)=\"submit()\"\r\n >\r\n @if (loading !== null) {\r\n @if (step === TERMINAL_STEP.Prepare) {\r\n <div class=\"constructor__fields\">\r\n @if (countrySearchString || countriesList.length > 1) {\r\n <div class=\"constructor__field\">\r\n <app-trm-select [data]=\"countriesList\"\r\n name=\"country\"\r\n [label]=\"I18N_KEY.CONSTRUCTOR_LABEL_COUNTRY | trans\"\r\n formControlName=\"country\"\r\n class=\"c-field-select trm-form-field\"\r\n (search)=\"searchCountry($event)\"\r\n [tabIndex]=\"tabIndex\"\r\n >\r\n <ng-template trmSelectLabelTemplate let-item=\"item\">\r\n <span class=\"fi\"\r\n [ngClass]=\"'fi-' + item.toLowerCase()\"></span>\r\n <span class=\"method__name\">{{item | country_translate: lang}}</span>\r\n </ng-template>\r\n </app-trm-select>\r\n </div>\r\n }\r\n @if (form.country.value) {\r\n <app-ps-select [methods]=\"methodsList\"\r\n formControlName=\"method\"\r\n [tabIndex]=\"tabIndex\"\r\n >\r\n @if (form.config?.description) {\r\n <div class=\"constructor__hint text--warn\"\r\n app-ps-select-hint\r\n #hintMethod\r\n @insertRemove\r\n >\r\n {{description | trans }}\r\n </div>\r\n }\r\n @if (form.isCDEFailed) {\r\n <div class=\"constructor__hint cde-error\"\r\n app-ps-select-hint\r\n @insertRemove\r\n >\r\n {{form.getError('cde_error') | trans }}\r\n </div>\r\n }\r\n </app-ps-select>\r\n }\r\n @if (!form.methodInfoLoading) {\r\n @if (form.paymentFormFieldNames.length) {\r\n <div formGroupName=\"payment\"\r\n #paymentRequisites\r\n class=\"constructor__fields constructor__fields--reverse\">\r\n @if (form.amountDynamic) {\r\n <ng-container *ngTemplateOutlet=\"currencyTpl; context: {label: I18N_KEY.CONSTRUCTOR_LABEL_CURRENCY | trans, tabIndex: 0}\"></ng-container>\r\n }\r\n @for (field of form.fields; track field.name; let i = $index) {\r\n @if (field.type === CONSTRUCTOR_FIELD_TYPES.Iframe) {\r\n <app-constructor-field-iframe\r\n [hidden]=\"form.isCDEFailed\"\r\n (paid)=\"cardPaid()\"\r\n #cardIframe\r\n (error)=\"iframeError($event)\"\r\n [tabIndex]=\"form.fields.length - i + tabIndex\">\r\n </app-constructor-field-iframe>\r\n }\r\n @if (field.type === CONSTRUCTOR_FIELD_TYPES.Select) {\r\n <app-constructor-field-select\r\n [config]=\"field\"\r\n [items]=\"field?.options?.items\"\r\n [formControlName]=\"field.name\"\r\n [tabIndex]=\"form.fields.length - i + tabIndex\"\r\n ></app-constructor-field-select>\r\n }\r\n @if ([CONSTRUCTOR_FIELD_TYPES.Text, CONSTRUCTOR_FIELD_TYPES.Number, CONSTRUCTOR_FIELD_TYPES.Email].includes(field.type)) {\r\n <app-constructor-field-text\r\n [config]=\"field\"\r\n [formControlName]=\"field.name\"\r\n (maskedValueChange)=\"changeTextFieldValue($event, field)\"\r\n [tabIndex]=\"form.fields.length - i + tabIndex\"></app-constructor-field-text>\r\n }\r\n @if (field.type === CONSTRUCTOR_FIELD_TYPES.Amount) {\r\n <app-constructor-field-text\r\n [config]=\"field\"\r\n [formControlName]=\"field.name\"\r\n [tabIndex]=\"form.fields.length - i + tabIndex\">\r\n @if (hasFeeHint(field)) {\r\n <app-method-amount-hint app-c-text-hint\r\n class=\"constructor__hint\"\r\n [fee]=\"field.options.fee\"\r\n [fixedFee]=\"field.options.fixedFee\"\r\n [max]=\"field.options.max\"\r\n [min]=\"field.options.min\"\r\n [currency]=\"field.options.currency\"\r\n ></app-method-amount-hint>\r\n }\r\n <div app-c-text-suffix\r\n class=\"constructor__currency\"\r\n [class.constructor__currency--transparent]=\"form.isAmountEditable\"\r\n >\r\n <ng-container *ngTemplateOutlet=\"currencyTpl; context: {tabIndex: form.fields.length - i + tabIndex}\"></ng-container>\r\n </div>\r\n </app-constructor-field-text>\r\n @if (hasCurrencyMethodSelector) {\r\n <app-trm-select\r\n class=\"constructor-field\"\r\n [label]=\"I18N_KEY.CONSTRUCTOR_LABEL_CURRENCY | trans\"\r\n [formControl]=\"form.currency\"\r\n [searchable]=\"false\"\r\n [data]=\"currenciesList\"\r\n [tabIndex]=\"form.fields.length - i + tabIndex\"\r\n >\r\n <ng-template trmSelectLabelTemplate let-item=\"item\">\r\n <span class=\"trm-icon\" [ngClass]=\"'trm-curr-' + item.toLowerCase()\"\r\n [title]=\"item\"></span>\r\n {{item}}\r\n </ng-template>\r\n </app-trm-select>\r\n }\r\n }\r\n @if (field.type === CONSTRUCTOR_FIELD_TYPES.Date) {\r\n <app-constructor-field-date\r\n [config]=\"field\"\r\n [formControlName]=\"field.name\"\r\n [tabIndex]=\"form.fields.length - i + tabIndex\"></app-constructor-field-date>\r\n }\r\n }\r\n <ng-template #currencyTpl let-label=\"label\" let-tabIndex=\"tabIndex\">\r\n <app-trm-select\r\n [label]=\"label\"\r\n [formControl]=\"form.userCurrency\"\r\n [searchable]=\"false\"\r\n [data]=\"userCurrenciesList\"\r\n [tabIndex]=\"tabIndex\"\r\n >\r\n <ng-template trmSelectLabelTemplate let-item=\"item\">\r\n <span class=\"trm-icon\"\r\n [ngClass]=\"'trm-curr-' + item.toLowerCase()\"\r\n [title]=\"item\"></span>\r\n {{item}}\r\n </ng-template>\r\n </app-trm-select>\r\n </ng-template>\r\n </div>\r\n }\r\n } @else {\r\n <div class=\"trm-skeleton-fields\">\r\n @for (i of skeletonLength; track $index) {\r\n <div class=\"trm-skeleton-field\">\r\n <gm-skeleton [count]=\"1\" [shape]=\"'rect-md'\" [size]=\"18\"></gm-skeleton>\r\n <gm-skeleton [count]=\"1\" [size]=\"50\"></gm-skeleton>\r\n </div>\r\n }\r\n </div>\r\n }\r\n @if (error && !form.methodInfoLoading) {\r\n <div class=\"trm-error\"\r\n @insertRemove\r\n >\r\n {{ error | trans }}\r\n </div>\r\n }\r\n </div>\r\n }\r\n @if (step === TERMINAL_STEP.Confirmation) {\r\n <app-constructor-preparation\r\n [currency]=\"response?.currency\"\r\n [methodName]=\"form.getTypeNameById(response.typeId)\"\r\n [wallet]=\"response.wallet\"\r\n [maskedWallet]=\"maskedWallet\"\r\n [amount]=\"response.amount\"\r\n [total]=\"response.total\"\r\n [confirmationText]=\"form.config?.confirmation\"\r\n >\r\n @if (error && !form.payment.pending) {\r\n <div class=\"trm-error\"\r\n app-constructor-preparation-error\r\n @insertRemove\r\n >\r\n {{ error | trans }}\r\n </div>\r\n }\r\n </app-constructor-preparation>\r\n }\r\n <div class=\"constructor__actions\">\r\n <button class=\"trm-button trm-button--primary constructor__actions-continue\"\r\n type=\"submit\"\r\n [tabindex]=\"form.fields.length + tabIndex\">\r\n {{I18N_KEY.CONSTRUCTOR_LABEL_CONTINUE | trans}}\r\n @if (loading) {\r\n <span class=\"trm-spinner trm-spinner-white\"></span>\r\n }\r\n </button>\r\n <button class=\"trm-button trm-button--secondary constructor__actions-back\"\r\n type=\"button\"\r\n [tabindex]=\"form.fields.length + tabIndex\"\r\n (click)=\"back.emit()\"> {{ backBtnLabel | trans}}</button>\r\n </div>\r\n } @else {\r\n <div class=\"trm-skeleton-group\">\r\n <gm-skeleton [count]=\"4\" [gap]=\"20\" [size]=\"80\"></gm-skeleton>\r\n <gm-skeleton [count]=\"2\" [gap]=\"10\" [size]=\"48\"></gm-skeleton>\r\n </div>\r\n }\r\n</form>\r\n", styles: [":host{display:block}.constructor{display:flex;flex-direction:column;gap:32px;justify-content:flex-start;align-items:stretch}.constructor__fields{display:flex;flex-direction:column;gap:20px;justify-content:flex-start;align-items:stretch}.constructor__fields--reverse{flex-direction:column-reverse}.constructor__fields .fi{border-radius:2px;overflow:hidden;border:1px solid rgba(0,0,0,.08);box-sizing:border-box;background-origin:border-box;flex-shrink:0;height:15px}.constructor__fields .fi-other{border-color:transparent}.constructor__currency{--trm-select-border-radius: 0 10px 10px 0;display:flex;align-items:center;position:absolute;bottom:0;right:0;flex-shrink:0;min-height:46px}@media (min-width: 768px){.constructor__currency{min-height:50px}}.constructor__currency .trm-divider{margin:5px 0;align-self:stretch}.constructor__currency--transparent{--trm-select-bg-color: transparent;--trm-select-bg-color--disabled: transparent;--trm-select-border-color: transparent;--trm-select-border-color--hover: transparent;--trm-select-border-color--focus: transparent}.constructor__actions{display:flex;flex-direction:column;gap:10px;justify-content:flex-start;align-items:flex-start}.constructor__hint{font-weight:400;font-size:14px;line-height:22px;color:var(--color-base-350);margin-top:8px}.constructor__hint.cde-error{color:var(--color-red-500)}.constructor .constructor__actions-continue{position:relative}.constructor .constructor__actions-continue .trm-spinner{position:absolute;right:15px}\n"], dependencies: [{ kind: "pipe", type: CountryTranslatePipe, name: "country_translate" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "component", type: TrmSelectComponent, selector: "app-trm-select", inputs: ["label", "hasBorder", "data", "tabIndex", "name", "placeholder", "searchable", "hasScrollbar", "nameId", "nameLabel"], outputs: ["open", "search"] }, { kind: "directive", type: TrmSelectLabelTemplateDirective, selector: "[trmSelectLabelTemplate]" }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: PsSelectComponent, selector: "app-ps-select", inputs: ["methods", "tabIndex"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: ConstructorFieldIframeComponent, selector: "app-constructor-field-iframe", inputs: ["tabIndex"], outputs: ["error", "paid", "ready"] }, { kind: "component", type: ConstructorFieldSelectComponent, selector: "app-constructor-field-select", inputs: ["config", "items", "tabIndex"] }, { kind: "component", type: ConstructorFieldTextComponent, selector: "app-constructor-field-text", inputs: ["config", "matDatepicker", "tabIndex"], outputs: ["maskedValueChange"] }, { kind: "component", type: MethodAmountHintComponent, selector: "app-method-amount-hint", inputs: ["fee", "fixedFee", "min", "max", "currency"] }, { kind: "component", type: ConstructorFieldDateComponent, selector: "app-constructor-field-date", inputs: ["config", "tabIndex"] }, { kind: "component", type: ConstructorPreparationComponent, selector: "app-constructor-preparation", inputs: ["maskedWallet", "wallet", "confirmationText", "methodName", "currency", "amount", "total"] }, { kind: "directive", type: TabIndexFocusDirective, selector: "[tabindex]" }, { kind: "pipe", type: TranslateByKeyPipe, name: "trans" }, { kind: "component", type: GmSkeletonComponent, selector: "gm-skeleton", inputs: ["shape", "orientation", "count", "size", "gap"] }], animations: [insertRemoveTrigger], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
300
290
|
}
|
|
301
291
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.2", ngImport: i0, type: ConstructorFormComponent, decorators: [{
|
|
302
292
|
type: Component,
|
|
303
293
|
args: [{ selector: 'app-constructor-form', changeDetection: ChangeDetectionStrategy.OnPush, animations: [insertRemoveTrigger], providers: [
|
|
304
294
|
ConstructorFormService,
|
|
305
295
|
CountryTranslatePipe, CountriesSortPipe
|
|
306
|
-
], standalone: true, imports: [CountryTranslatePipe, CountriesSortPipe, FormsModule, ReactiveFormsModule, TrmSelectComponent, TrmSelectLabelTemplateDirective, NgClass, PsSelectComponent, NgTemplateOutlet, ConstructorFieldIframeComponent, ConstructorFieldSelectComponent, ConstructorFieldTextComponent, MethodAmountHintComponent, ConstructorFieldDateComponent, ConstructorPreparationComponent, TabIndexFocusDirective, CountryTranslatePipe, TranslateByKeyPipe, GmSkeletonComponent], template: "<form class=\"constructor\"\r\n [formGroup]=\"form\"\r\n (ngSubmit)=\"submit()\"\r\n >\r\n @if (!loading) {\r\n @if (step === TERMINAL_STEP.Prepare) {\r\n <div class=\"constructor__fields\">\r\n @if (countrySearchString || countriesList.length > 1) {\r\n <div class=\"constructor__field\">\r\n <app-trm-select [data]=\"countriesList\"\r\n name=\"country\"\r\n [label]=\"I18N_KEY.CONSTRUCTOR_LABEL_COUNTRY | trans\"\r\n formControlName=\"country\"\r\n class=\"c-field-select trm-form-field\"\r\n (search)=\"searchCountry($event)\"\r\n [tabIndex]=\"tabIndex\"\r\n >\r\n <ng-template trmSelectLabelTemplate let-item=\"item\">\r\n <span class=\"fi\"\r\n [ngClass]=\"'fi-' + item.toLowerCase()\"></span>\r\n <span class=\"method__name\">{{item | country_translate: lang}}</span>\r\n </ng-template>\r\n </app-trm-select>\r\n </div>\r\n }\r\n @if (form.country.value) {\r\n <app-ps-select [methods]=\"methodsList\"\r\n formControlName=\"method\"\r\n [tabIndex]=\"tabIndex\"\r\n >\r\n @if (form.config?.description) {\r\n <div class=\"constructor__hint text--warn\"\r\n app-ps-select-hint\r\n #hintMethod\r\n @insertRemove\r\n >\r\n {{description | trans }}\r\n </div>\r\n }\r\n @if (form.isCDEFailed) {\r\n <div class=\"constructor__hint cde-error\"\r\n app-ps-select-hint\r\n @insertRemove\r\n >\r\n {{form.getError('cde_error') | trans }}\r\n </div>\r\n }\r\n </app-ps-select>\r\n }\r\n @if (!form.payment.pending) {\r\n @if (form.paymentFormFieldNames.length) {\r\n <div formGroupName=\"payment\"\r\n #paymentRequisites\r\n class=\"constructor__fields constructor__fields--reverse\">\r\n @if (form.amountDynamic) {\r\n <ng-container *ngTemplateOutlet=\"currencyTpl; context: {label: I18N_KEY.CONSTRUCTOR_LABEL_CURRENCY | trans, tabIndex: 0}\"></ng-container>\r\n }\r\n @for (field of form.fields; track field.name; let i = $index) {\r\n @if (field.type === CONSTRUCTOR_FIELD_TYPES.Iframe) {\r\n <app-constructor-field-iframe\r\n [hidden]=\"form.isCDEFailed\"\r\n (paid)=\"cardPaid()\"\r\n #cardIframe\r\n (error)=\"iframeError($event)\"\r\n [tabIndex]=\"form.fields.length - i + tabIndex\">\r\n </app-constructor-field-iframe>\r\n }\r\n @if (field.type === CONSTRUCTOR_FIELD_TYPES.Select) {\r\n <app-constructor-field-select\r\n [config]=\"field\"\r\n [items]=\"field?.options?.items\"\r\n [formControlName]=\"field.name\"\r\n [tabIndex]=\"form.fields.length - i + tabIndex\"\r\n ></app-constructor-field-select>\r\n }\r\n @if ([CONSTRUCTOR_FIELD_TYPES.Text, CONSTRUCTOR_FIELD_TYPES.Number, CONSTRUCTOR_FIELD_TYPES.Email].includes(field.type)) {\r\n <app-constructor-field-text\r\n [config]=\"field\"\r\n [formControlName]=\"field.name\"\r\n (maskedValueChange)=\"changeTextFieldValue($event, field)\"\r\n [tabIndex]=\"form.fields.length - i + tabIndex\"></app-constructor-field-text>\r\n }\r\n @if (field.type === CONSTRUCTOR_FIELD_TYPES.Amount) {\r\n <app-constructor-field-text\r\n [config]=\"field\"\r\n [formControlName]=\"field.name\"\r\n [tabIndex]=\"form.fields.length - i + tabIndex\">\r\n @if (hasFeeHint(field)) {\r\n <app-method-amount-hint app-c-text-hint\r\n class=\"constructor__hint\"\r\n [fee]=\"field.options.fee\"\r\n [fixedFee]=\"field.options.fixedFee\"\r\n [max]=\"field.options.max\"\r\n [min]=\"field.options.min\"\r\n [currency]=\"field.options.currency\"\r\n ></app-method-amount-hint>\r\n }\r\n <div app-c-text-suffix\r\n class=\"constructor__currency\"\r\n [class.constructor__currency--transparent]=\"form.isAmountEditable\"\r\n >\r\n <ng-container *ngTemplateOutlet=\"currencyTpl; context: {tabIndex: form.fields.length - i + tabIndex}\"></ng-container>\r\n </div>\r\n </app-constructor-field-text>\r\n @if (hasCurrencyMethodSelector) {\r\n <app-trm-select\r\n class=\"constructor-field\"\r\n [label]=\"I18N_KEY.CONSTRUCTOR_LABEL_CURRENCY | trans\"\r\n [formControl]=\"form.currency\"\r\n [searchable]=\"false\"\r\n [data]=\"currenciesList\"\r\n [tabIndex]=\"form.fields.length - i + tabIndex\"\r\n >\r\n <ng-template trmSelectLabelTemplate let-item=\"item\">\r\n <span class=\"trm-icon\" [ngClass]=\"'trm-curr-' + item.toLowerCase()\"\r\n [title]=\"item\"></span>\r\n {{item}}\r\n </ng-template>\r\n </app-trm-select>\r\n }\r\n }\r\n @if (field.type === CONSTRUCTOR_FIELD_TYPES.Date) {\r\n <app-constructor-field-date\r\n [config]=\"field\"\r\n [formControlName]=\"field.name\"\r\n [tabIndex]=\"form.fields.length - i + tabIndex\"></app-constructor-field-date>\r\n }\r\n }\r\n <ng-template #currencyTpl let-label=\"label\" let-tabIndex=\"tabIndex\">\r\n <app-trm-select\r\n [label]=\"label\"\r\n [formControl]=\"form.userCurrency\"\r\n [searchable]=\"false\"\r\n [data]=\"userCurrenciesList\"\r\n [tabIndex]=\"tabIndex\"\r\n >\r\n <ng-template trmSelectLabelTemplate let-item=\"item\">\r\n <span class=\"trm-icon\"\r\n [ngClass]=\"'trm-curr-' + item.toLowerCase()\"\r\n [title]=\"item\"></span>\r\n {{item}}\r\n </ng-template>\r\n </app-trm-select>\r\n </ng-template>\r\n </div>\r\n }\r\n } @else {\r\n <div class=\"trm-skeleton-fields\">\r\n @for (i of skeletonLength; track $index) {\r\n <div class=\"trm-skeleton-field\">\r\n <gm-skeleton [count]=\"1\" [shape]=\"'rect-md'\" [size]=\"18\"></gm-skeleton>\r\n <gm-skeleton [count]=\"1\" [size]=\"50\"></gm-skeleton>\r\n </div>\r\n }\r\n </div>\r\n }\r\n @if (error && !form.payment.pending) {\r\n <div class=\"trm-error\"\r\n @insertRemove\r\n >\r\n {{ error | trans }}\r\n </div>\r\n }\r\n </div>\r\n }\r\n @if (step === TERMINAL_STEP.Confirmation) {\r\n <app-constructor-preparation\r\n [currency]=\"response?.currency\"\r\n [methodName]=\"form.getTypeNameById(response.typeId)\"\r\n [wallet]=\"response.wallet\"\r\n [maskedWallet]=\"maskedWallet\"\r\n [amount]=\"response.amount\"\r\n [total]=\"response.total\"\r\n [confirmationText]=\"form.config?.confirmation\"\r\n >\r\n @if (error && !form.payment.pending) {\r\n <div class=\"trm-error\"\r\n app-constructor-preparation-error\r\n @insertRemove\r\n >\r\n {{ error | trans }}\r\n </div>\r\n }\r\n </app-constructor-preparation>\r\n }\r\n <div class=\"constructor__actions\">\r\n <button class=\"trm-button trm-button--primary constructor__actions-continue\"\r\n type=\"submit\"\r\n [tabindex]=\"form.fields.length + tabIndex\">\r\n {{I18N_KEY.CONSTRUCTOR_LABEL_CONTINUE | trans}}\r\n </button>\r\n <button class=\"trm-button trm-button--secondary constructor__actions-back\"\r\n type=\"button\"\r\n [tabindex]=\"form.fields.length + tabIndex\"\r\n (click)=\"back.emit()\"> {{ backBtnLabel | trans}}</button>\r\n </div>\r\n } @else {\r\n <div class=\"trm-skeleton-group\">\r\n <gm-skeleton [count]=\"4\" [gap]=\"20\" [size]=\"80\"></gm-skeleton>\r\n <gm-skeleton [count]=\"2\" [gap]=\"10\" [size]=\"48\"></gm-skeleton>\r\n </div>\r\n }\r\n</form>\r\n", styles: [":host{display:block}.constructor{display:flex;flex-direction:column;gap:32px;justify-content:flex-start;align-items:stretch}.constructor__fields{display:flex;flex-direction:column;gap:20px;justify-content:flex-start;align-items:stretch}.constructor__fields--reverse{flex-direction:column-reverse}.constructor__fields .fi{border-radius:2px;overflow:hidden;border:1px solid rgba(0,0,0,.08);box-sizing:border-box;background-origin:border-box;flex-shrink:0;height:15px}.constructor__fields .fi-other{border-color:transparent}.constructor__currency{--trm-select-border-radius: 0 10px 10px 0;display:flex;align-items:center;position:absolute;bottom:0;right:0;flex-shrink:0;min-height:46px}@media (min-width: 768px){.constructor__currency{min-height:50px}}.constructor__currency .trm-divider{margin:5px 0;align-self:stretch}.constructor__currency--transparent{--trm-select-bg-color: transparent;--trm-select-bg-color--disabled: transparent;--trm-select-border-color: transparent;--trm-select-border-color--hover: transparent;--trm-select-border-color--focus: transparent}.constructor__actions{display:flex;flex-direction:column;gap:10px;justify-content:flex-start;align-items:flex-start}.constructor__hint{font-weight:400;font-size:14px;line-height:22px;color:var(--color-base-350);margin-top:8px}.constructor__hint.cde-error{color:var(--color-red-500)}\n"] }]
|
|
296
|
+
], standalone: true, imports: [CountryTranslatePipe, CountriesSortPipe, FormsModule, ReactiveFormsModule, TrmSelectComponent, TrmSelectLabelTemplateDirective, NgClass, PsSelectComponent, NgTemplateOutlet, ConstructorFieldIframeComponent, ConstructorFieldSelectComponent, ConstructorFieldTextComponent, MethodAmountHintComponent, ConstructorFieldDateComponent, ConstructorPreparationComponent, TabIndexFocusDirective, CountryTranslatePipe, TranslateByKeyPipe, GmSkeletonComponent], template: "<form class=\"constructor\"\r\n [formGroup]=\"form\"\r\n (ngSubmit)=\"submit()\"\r\n >\r\n @if (loading !== null) {\r\n @if (step === TERMINAL_STEP.Prepare) {\r\n <div class=\"constructor__fields\">\r\n @if (countrySearchString || countriesList.length > 1) {\r\n <div class=\"constructor__field\">\r\n <app-trm-select [data]=\"countriesList\"\r\n name=\"country\"\r\n [label]=\"I18N_KEY.CONSTRUCTOR_LABEL_COUNTRY | trans\"\r\n formControlName=\"country\"\r\n class=\"c-field-select trm-form-field\"\r\n (search)=\"searchCountry($event)\"\r\n [tabIndex]=\"tabIndex\"\r\n >\r\n <ng-template trmSelectLabelTemplate let-item=\"item\">\r\n <span class=\"fi\"\r\n [ngClass]=\"'fi-' + item.toLowerCase()\"></span>\r\n <span class=\"method__name\">{{item | country_translate: lang}}</span>\r\n </ng-template>\r\n </app-trm-select>\r\n </div>\r\n }\r\n @if (form.country.value) {\r\n <app-ps-select [methods]=\"methodsList\"\r\n formControlName=\"method\"\r\n [tabIndex]=\"tabIndex\"\r\n >\r\n @if (form.config?.description) {\r\n <div class=\"constructor__hint text--warn\"\r\n app-ps-select-hint\r\n #hintMethod\r\n @insertRemove\r\n >\r\n {{description | trans }}\r\n </div>\r\n }\r\n @if (form.isCDEFailed) {\r\n <div class=\"constructor__hint cde-error\"\r\n app-ps-select-hint\r\n @insertRemove\r\n >\r\n {{form.getError('cde_error') | trans }}\r\n </div>\r\n }\r\n </app-ps-select>\r\n }\r\n @if (!form.methodInfoLoading) {\r\n @if (form.paymentFormFieldNames.length) {\r\n <div formGroupName=\"payment\"\r\n #paymentRequisites\r\n class=\"constructor__fields constructor__fields--reverse\">\r\n @if (form.amountDynamic) {\r\n <ng-container *ngTemplateOutlet=\"currencyTpl; context: {label: I18N_KEY.CONSTRUCTOR_LABEL_CURRENCY | trans, tabIndex: 0}\"></ng-container>\r\n }\r\n @for (field of form.fields; track field.name; let i = $index) {\r\n @if (field.type === CONSTRUCTOR_FIELD_TYPES.Iframe) {\r\n <app-constructor-field-iframe\r\n [hidden]=\"form.isCDEFailed\"\r\n (paid)=\"cardPaid()\"\r\n #cardIframe\r\n (error)=\"iframeError($event)\"\r\n [tabIndex]=\"form.fields.length - i + tabIndex\">\r\n </app-constructor-field-iframe>\r\n }\r\n @if (field.type === CONSTRUCTOR_FIELD_TYPES.Select) {\r\n <app-constructor-field-select\r\n [config]=\"field\"\r\n [items]=\"field?.options?.items\"\r\n [formControlName]=\"field.name\"\r\n [tabIndex]=\"form.fields.length - i + tabIndex\"\r\n ></app-constructor-field-select>\r\n }\r\n @if ([CONSTRUCTOR_FIELD_TYPES.Text, CONSTRUCTOR_FIELD_TYPES.Number, CONSTRUCTOR_FIELD_TYPES.Email].includes(field.type)) {\r\n <app-constructor-field-text\r\n [config]=\"field\"\r\n [formControlName]=\"field.name\"\r\n (maskedValueChange)=\"changeTextFieldValue($event, field)\"\r\n [tabIndex]=\"form.fields.length - i + tabIndex\"></app-constructor-field-text>\r\n }\r\n @if (field.type === CONSTRUCTOR_FIELD_TYPES.Amount) {\r\n <app-constructor-field-text\r\n [config]=\"field\"\r\n [formControlName]=\"field.name\"\r\n [tabIndex]=\"form.fields.length - i + tabIndex\">\r\n @if (hasFeeHint(field)) {\r\n <app-method-amount-hint app-c-text-hint\r\n class=\"constructor__hint\"\r\n [fee]=\"field.options.fee\"\r\n [fixedFee]=\"field.options.fixedFee\"\r\n [max]=\"field.options.max\"\r\n [min]=\"field.options.min\"\r\n [currency]=\"field.options.currency\"\r\n ></app-method-amount-hint>\r\n }\r\n <div app-c-text-suffix\r\n class=\"constructor__currency\"\r\n [class.constructor__currency--transparent]=\"form.isAmountEditable\"\r\n >\r\n <ng-container *ngTemplateOutlet=\"currencyTpl; context: {tabIndex: form.fields.length - i + tabIndex}\"></ng-container>\r\n </div>\r\n </app-constructor-field-text>\r\n @if (hasCurrencyMethodSelector) {\r\n <app-trm-select\r\n class=\"constructor-field\"\r\n [label]=\"I18N_KEY.CONSTRUCTOR_LABEL_CURRENCY | trans\"\r\n [formControl]=\"form.currency\"\r\n [searchable]=\"false\"\r\n [data]=\"currenciesList\"\r\n [tabIndex]=\"form.fields.length - i + tabIndex\"\r\n >\r\n <ng-template trmSelectLabelTemplate let-item=\"item\">\r\n <span class=\"trm-icon\" [ngClass]=\"'trm-curr-' + item.toLowerCase()\"\r\n [title]=\"item\"></span>\r\n {{item}}\r\n </ng-template>\r\n </app-trm-select>\r\n }\r\n }\r\n @if (field.type === CONSTRUCTOR_FIELD_TYPES.Date) {\r\n <app-constructor-field-date\r\n [config]=\"field\"\r\n [formControlName]=\"field.name\"\r\n [tabIndex]=\"form.fields.length - i + tabIndex\"></app-constructor-field-date>\r\n }\r\n }\r\n <ng-template #currencyTpl let-label=\"label\" let-tabIndex=\"tabIndex\">\r\n <app-trm-select\r\n [label]=\"label\"\r\n [formControl]=\"form.userCurrency\"\r\n [searchable]=\"false\"\r\n [data]=\"userCurrenciesList\"\r\n [tabIndex]=\"tabIndex\"\r\n >\r\n <ng-template trmSelectLabelTemplate let-item=\"item\">\r\n <span class=\"trm-icon\"\r\n [ngClass]=\"'trm-curr-' + item.toLowerCase()\"\r\n [title]=\"item\"></span>\r\n {{item}}\r\n </ng-template>\r\n </app-trm-select>\r\n </ng-template>\r\n </div>\r\n }\r\n } @else {\r\n <div class=\"trm-skeleton-fields\">\r\n @for (i of skeletonLength; track $index) {\r\n <div class=\"trm-skeleton-field\">\r\n <gm-skeleton [count]=\"1\" [shape]=\"'rect-md'\" [size]=\"18\"></gm-skeleton>\r\n <gm-skeleton [count]=\"1\" [size]=\"50\"></gm-skeleton>\r\n </div>\r\n }\r\n </div>\r\n }\r\n @if (error && !form.methodInfoLoading) {\r\n <div class=\"trm-error\"\r\n @insertRemove\r\n >\r\n {{ error | trans }}\r\n </div>\r\n }\r\n </div>\r\n }\r\n @if (step === TERMINAL_STEP.Confirmation) {\r\n <app-constructor-preparation\r\n [currency]=\"response?.currency\"\r\n [methodName]=\"form.getTypeNameById(response.typeId)\"\r\n [wallet]=\"response.wallet\"\r\n [maskedWallet]=\"maskedWallet\"\r\n [amount]=\"response.amount\"\r\n [total]=\"response.total\"\r\n [confirmationText]=\"form.config?.confirmation\"\r\n >\r\n @if (error && !form.payment.pending) {\r\n <div class=\"trm-error\"\r\n app-constructor-preparation-error\r\n @insertRemove\r\n >\r\n {{ error | trans }}\r\n </div>\r\n }\r\n </app-constructor-preparation>\r\n }\r\n <div class=\"constructor__actions\">\r\n <button class=\"trm-button trm-button--primary constructor__actions-continue\"\r\n type=\"submit\"\r\n [tabindex]=\"form.fields.length + tabIndex\">\r\n {{I18N_KEY.CONSTRUCTOR_LABEL_CONTINUE | trans}}\r\n @if (loading) {\r\n <span class=\"trm-spinner trm-spinner-white\"></span>\r\n }\r\n </button>\r\n <button class=\"trm-button trm-button--secondary constructor__actions-back\"\r\n type=\"button\"\r\n [tabindex]=\"form.fields.length + tabIndex\"\r\n (click)=\"back.emit()\"> {{ backBtnLabel | trans}}</button>\r\n </div>\r\n } @else {\r\n <div class=\"trm-skeleton-group\">\r\n <gm-skeleton [count]=\"4\" [gap]=\"20\" [size]=\"80\"></gm-skeleton>\r\n <gm-skeleton [count]=\"2\" [gap]=\"10\" [size]=\"48\"></gm-skeleton>\r\n </div>\r\n }\r\n</form>\r\n", styles: [":host{display:block}.constructor{display:flex;flex-direction:column;gap:32px;justify-content:flex-start;align-items:stretch}.constructor__fields{display:flex;flex-direction:column;gap:20px;justify-content:flex-start;align-items:stretch}.constructor__fields--reverse{flex-direction:column-reverse}.constructor__fields .fi{border-radius:2px;overflow:hidden;border:1px solid rgba(0,0,0,.08);box-sizing:border-box;background-origin:border-box;flex-shrink:0;height:15px}.constructor__fields .fi-other{border-color:transparent}.constructor__currency{--trm-select-border-radius: 0 10px 10px 0;display:flex;align-items:center;position:absolute;bottom:0;right:0;flex-shrink:0;min-height:46px}@media (min-width: 768px){.constructor__currency{min-height:50px}}.constructor__currency .trm-divider{margin:5px 0;align-self:stretch}.constructor__currency--transparent{--trm-select-bg-color: transparent;--trm-select-bg-color--disabled: transparent;--trm-select-border-color: transparent;--trm-select-border-color--hover: transparent;--trm-select-border-color--focus: transparent}.constructor__actions{display:flex;flex-direction:column;gap:10px;justify-content:flex-start;align-items:flex-start}.constructor__hint{font-weight:400;font-size:14px;line-height:22px;color:var(--color-base-350);margin-top:8px}.constructor__hint.cde-error{color:var(--color-red-500)}.constructor .constructor__actions-continue{position:relative}.constructor .constructor__actions-continue .trm-spinner{position:absolute;right:15px}\n"] }]
|
|
307
297
|
}], ctorParameters: () => [], propDecorators: { step: [{
|
|
308
298
|
type: Input
|
|
309
299
|
}], error: [{
|
|
@@ -340,4 +330,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.2", ngImpor
|
|
|
340
330
|
type: ViewChild,
|
|
341
331
|
args: ['cardIframe', { static: false }]
|
|
342
332
|
}] } });
|
|
343
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RydWN0b3ItZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90ZXJtaW5hbC10ZW1wbGF0ZS9zcmMvbGliL2FwcC9wYWdlcy9jb21wb25lbnRzL2NvbnN0cnVjdG9yLWZvcm0vY29uc3RydWN0b3ItZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90ZXJtaW5hbC10ZW1wbGF0ZS9zcmMvbGliL2FwcC9wYWdlcy9jb21wb25lbnRzL2NvbnN0cnVjdG9yLWZvcm0vY29uc3RydWN0b3ItZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBRVQsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBR0wsTUFBTSxFQUVOLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQWdCLG9CQUFvQixFQUFFLFlBQVksRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUM1RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQVE3RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUM3RSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDdkUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FB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LHlCQUF5QixFQUFFLDZCQUE2QixFQUFFLCtCQUErQixFQUFFLHNCQUFzQixFQUFFLG9CQUFvQixFQUFFLGtCQUFrQixFQUFFLG1CQUFtQixDQUFDO3dEQWFqYyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBSUcsUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUNJLElBQUk7c0JBQWIsTUFBTTtnQkFDRyxPQUFPO3NCQUFoQixNQUFNO2dCQUNHLE9BQU87c0JBQWhCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNFLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRTJDLFVBQVU7c0JBQTFELFNBQVM7dUJBQUMsbUJBQW1CLEVBQUUsRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFDO2dCQUNMLFVBQVU7c0JBQW5ELFNBQVM7dUJBQUMsWUFBWSxFQUFFLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBQztnQkFDRSxVQUFVO3NCQUFuRCxTQUFTO3VCQUFDLFlBQVksRUFBRSxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEFmdGVyVmlld0luaXQsXHJcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ29tcG9uZW50LFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIGluamVjdCxcclxuICBJbnB1dCxcclxuICBPbkNoYW5nZXMsXHJcbiAgT25EZXN0cm95LFxyXG4gIE91dHB1dCxcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG4gIFZpZXdDaGlsZFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBQYXltZW50RmllbGQsIFBheW1lbnRGaWVsZFR5cGVFbnVtLCBUZXJtaW5hbFN0ZXAgfSBmcm9tICcuL21vZGVscyc7XHJcbmltcG9ydCB7IENvbnN0cnVjdG9yRm9ybVNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2NvbnN0cnVjdG9yLWZvcm0uc2VydmljZSc7XHJcbmltcG9ydCB7XHJcbiAgTWV0aG9kVHlwZSxcclxuICBNZXRob2RUeXBlVHlwZSxcclxuICBUZXJtaW5hbFBheW1lbnRDb25maXJtUmVzcG9uc2UsXHJcbiAgVGVybWluYWxQYXltZW50UHJlcGFyZVJlc3BvbnNlLFxyXG4gIFRlcm1pbmFsUGF5bWVudFByZXBhcmVSZXF1ZXN0XHJcbn0gZnJvbSAnLi4vLi4vLi4vLi4vY29kZWdlbi9tb2RlbC9tb2RlbHMnO1xyXG5pbXBvcnQgeyBpbnNlcnRSZW1vdmVUcmlnZ2VyIH0gZnJvbSAnLi8uLi8uLi8uLi9oZWxwZXJzL2luc2VydFJlbW92ZVRyaWdnZXInO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XHJcbmltcG9ydCB7IENvdW50cmllc1NvcnRQaXBlIH0gZnJvbSAnLi4vLi4vLi4vcGlwZXMvY291bnRyaWVzLXNvcnQucGlwZSc7XHJcbmltcG9ydCB7IE5nU2Nyb2xsYmFyIH0gZnJvbSAnbmd4LXNjcm9sbGJhcic7XHJcbmltcG9ydCB7IEkxOE5fS0VZIH0gZnJvbSAnLi8uLi8uLi8uLi9pMThuJztcclxuaW1wb3J0IHtcclxuICBDb25zdHJ1Y3RvckZpZWxkSWZyYW1lQ29tcG9uZW50XHJcbn0gZnJvbSBcIi4vY29tcG9uZW50cy9jb25zdHJ1Y3Rvci1maWVsZC1pZnJhbWUvY29uc3RydWN0b3ItZmllbGQtaWZyYW1lLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBDb3VudHJ5VHJhbnNsYXRlUGlwZSB9IGZyb20gJy4uLy4uLy4uL3BpcGVzL2NvdW50cnktdHJhbnNsYXRlLnBpcGUnO1xyXG5pbXBvcnQgeyBURVJNSU5BTF9WRVJTSU9OX1NFUlZJQ0VfVE9LRU4gfSBmcm9tICcuLi8uLi8uLi8uLi9jb25zdCc7XHJcbmltcG9ydCB7IFZlcnNpb25TZXJ2aWNlSW50ZXJmYWNlIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzJztcclxuaW1wb3J0IHsgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IE5nQ2xhc3MsIE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBUcm1TZWxlY3RDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvY29tcG9uZW50cy90cm0tc2VsZWN0L3RybS1zZWxlY3QuY29tcG9uZW50JztcclxuaW1wb3J0IHtcclxuICBUcm1TZWxlY3RMYWJlbFRlbXBsYXRlRGlyZWN0aXZlXHJcbn0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2NvbXBvbmVudHMvdHJtLXNlbGVjdC90cm0tc2VsZWN0LWxhYmVsLXRlbXBsYXRlLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IFBzU2VsZWN0Q29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL3BzLXNlbGVjdC9wcy1zZWxlY3QuY29tcG9uZW50JztcclxuaW1wb3J0IHtcclxuICBDb25zdHJ1Y3RvckZpZWxkU2VsZWN0Q29tcG9uZW50XHJcbn0gZnJvbSAnLi9jb21wb25lbnRzL2NvbnN0cnVjdG9yLWZpZWxkLXNlbGVjdC9jb25zdHJ1Y3Rvci1maWVsZC1zZWxlY3QuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQ29uc3RydWN0b3JGaWVsZFRleHRDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvY29uc3RydWN0b3ItZmllbGQtdGV4dC9jb25zdHJ1Y3Rvci1maWVsZC10ZXh0LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IE1ldGhvZEFtb3VudEhpbnRDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvbWV0aG9kLWFtb3VudC1oaW50L21ldGhvZC1hbW91bnQtaGludC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDb25zdHJ1Y3RvckZpZWxkRGF0ZUNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9jb25zdHJ1Y3Rvci1maWVsZC1kYXRlL2NvbnN0cnVjdG9yLWZpZWxkLWRhdGUuY29tcG9uZW50JztcclxuaW1wb3J0IHtcclxuICBDb25zdHJ1Y3RvclByZXBhcmF0aW9uQ29tcG9uZW50XHJcbn0gZnJvbSAnLi9jb21wb25lbnRzL2NvbnN0cnVjdG9yLXByZXBhcmF0aW9uL2NvbnN0cnVjdG9yLXByZXBhcmF0aW9uLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFRhYkluZGV4Rm9jdXNEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL3RhYi1pbmRleC1mb2N1cy5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVCeUtleVBpcGUgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvcGlwZXMvdHJhbnNsYXRlLWJ5LWtleS5waXBlJztcclxuaW1wb3J0IHsgR21Ta2VsZXRvbkNvbXBvbmVudCB9IGZyb20gJ0BnbW1vbmV5L2dtLXVpLWtpdCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC1jb25zdHJ1Y3Rvci1mb3JtJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vY29uc3RydWN0b3ItZm9ybS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vY29uc3RydWN0b3ItZm9ybS5jb21wb25lbnQuc2NzcyddLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gIGFuaW1hdGlvbnM6IFtpbnNlcnRSZW1vdmVUcmlnZ2VyXSxcclxuICBwcm92aWRlcnM6IFtcclxuICAgIENvbnN0cnVjdG9yRm9ybVNlcnZpY2UsXHJcbiAgICBDb3VudHJ5VHJhbnNsYXRlUGlwZSwgQ291bnRyaWVzU29ydFBpcGVcclxuICBdLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW0NvdW50cnlUcmFuc2xhdGVQaXBlLCBDb3VudHJpZXNTb3J0UGlwZSwgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIFRybVNlbGVjdENvbXBvbmVudCwgVHJtU2VsZWN0TGFiZWxUZW1wbGF0ZURpcmVjdGl2ZSwgTmdDbGFzcywgUHNTZWxlY3RDb21wb25lbnQsIE5nVGVtcGxhdGVPdXRsZXQsIENvbnN0cnVjdG9yRmllbGRJZnJhbWVDb21wb25lbnQsIENvbnN0cnVjdG9yRmllbGRTZWxlY3RDb21wb25lbnQsIENvbnN0cnVjdG9yRmllbGRUZXh0Q29tcG9uZW50LCBNZXRob2RBbW91bnRIaW50Q29tcG9uZW50LCBDb25zdHJ1Y3RvckZpZWxkRGF0ZUNvbXBvbmVudCwgQ29uc3RydWN0b3JQcmVwYXJhdGlvbkNvbXBvbmVudCwgVGFiSW5kZXhGb2N1c0RpcmVjdGl2ZSwgQ291bnRyeVRyYW5zbGF0ZVBpcGUsIFRyYW5zbGF0ZUJ5S2V5UGlwZSwgR21Ta2VsZXRvbkNvbXBvbmVudF1cclxufSlcclxuZXhwb3J0IGNsYXNzIENvbnN0cnVjdG9yRm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcclxuICBwcml2YXRlIGNkID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcclxuICBmb3JtID0gaW5qZWN0KENvbnN0cnVjdG9yRm9ybVNlcnZpY2UpO1xyXG4gIHByaXZhdGUgdHJhbnNsYXRlU3J2ID0gaW5qZWN0KFRyYW5zbGF0ZVNlcnZpY2UpO1xyXG4gIHByaXZhdGUgY291bnRyaWVzU29ydFBpcGUgPSBpbmplY3QoQ291bnRyaWVzU29ydFBpcGUpO1xyXG4gIHByaXZhdGUgY291bnRyeVRyYW5zbGF0ZVBpcGUgPSBpbmplY3QoQ291bnRyeVRyYW5zbGF0ZVBpcGUpO1xyXG4gIHByaXZhdGUgbmdTY3JvbGxCYXIgPSBpbmplY3QoTmdTY3JvbGxiYXIpO1xyXG4gIHByaXZhdGUgdmVyc2lvblNydiA9IGluamVjdDxWZXJzaW9uU2VydmljZUludGVyZmFjZT4oVEVSTUlOQUxfVkVSU0lPTl9TRVJWSUNFX1RPS0VOKTtcclxuXHJcbiAgcHJpdmF0ZSB1blN1YnNjcmliZXIgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gIFRFUk1JTkFMX1NURVAgPSBUZXJtaW5hbFN0ZXA7XHJcbiAgQElucHV0KCkgc3RlcDogVGVybWluYWxTdGVwO1xyXG4gIEBJbnB1dCgpIGVycm9yPzogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHJlc3BvbnNlOiBUZXJtaW5hbFBheW1lbnRQcmVwYXJlUmVzcG9uc2UgJiBUZXJtaW5hbFBheW1lbnRDb25maXJtUmVzcG9uc2UgJiB7XHJcbiAgICB0eXBlSWQ/OiBudW1iZXI7XHJcbiAgfTtcclxuICBDT05TVFJVQ1RPUl9GSUVMRF9UWVBFUyA9IFBheW1lbnRGaWVsZFR5cGVFbnVtO1xyXG4gIEBJbnB1dCgpIGN1cnJlbmN5OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgdXNlckN1cnJlbmN5OiBzdHJpbmdbXTtcclxuICBASW5wdXQoKSBsb2FkaW5nID0gZmFsc2U7XHJcbiAgQElucHV0KCkgdHlwZXM6IE1ldGhvZFR5cGVbXSA9IFtdO1xyXG4gIEBJbnB1dCgpIGNhblJldHVyblRvUHJvamVjdCA9IHRydWU7XHJcbiAgQE91dHB1dCgpIGJhY2s6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuICBAT3V0cHV0KCkgcHJlcGFyZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgY29uZmlybTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgb25QYXltZW50Q2hhbmdlZDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG4gIEBJbnB1dCgpIHRhYkluZGV4OiBudW1iZXI7XHJcbiAgY291bnRyeVNlYXJjaFN0cmluZzogc3RyaW5nO1xyXG4gIEBWaWV3Q2hpbGQoJ3BheW1lbnRSZXF1aXNpdGVzJywge3N0YXRpYzogZmFsc2V9KSByZXF1aXNpdGVzOiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoJ2hpbnRNZXRob2QnLCB7c3RhdGljOiBmYWxzZX0pIGhpbnRNZXRob2Q6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZCgnY2FyZElmcmFtZScsIHtzdGF0aWM6IGZhbHNlfSkgY2FyZElmcmFtZTogQ29uc3RydWN0b3JGaWVsZElmcmFtZUNvbXBvbmVudDtcclxuICBtYXNrZWRXYWxsZXQ6IHN0cmluZztcclxuXHJcbiAgSTE4Tl9LRVkgPSBJMThOX0tFWTtcclxuXHJcbiAgZ2V0IGNvdW50cmllc0xpc3QoKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuY291bnRyaWVzU29ydFBpcGVcclxuICAgICAgLnRyYW5zZm9ybShcclxuICAgICAgICB0aGlzLnR5cGVzXHJcbiAgICAgICAgICAubWFwKHR5cGUgPT4gdHlwZS5jb3VudHJ5SVNPQ29kZSlcclxuICAgICAgICAgIC5maWx0ZXIoKHZhbHVlLCBpbmRleCwgc2VsZikgPT4gc2VsZi5pbmRleE9mKHZhbHVlKSA9PT0gaW5kZXgpXHJcbiAgICAgIClcclxuICAgICAgLmZpbHRlcigobTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmNvdW50cnlTZWFyY2hTdHJpbmcpIHtcclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb25zdCB0aXRsZTogc3RyaW5nID0gdGhpcy5jb3VudHJ5VHJhbnNsYXRlUGlwZS50cmFuc2Zvcm0obSk7XHJcbiAgICAgICAgICByZXR1cm4gdGl0bGUudG9Mb3dlckNhc2UoKVxyXG4gICAgICAgICAgICAuc3BsaXQoJyAnKS5zb21lKFxyXG4gICAgICAgICAgICAgIHRzID0+IHRoaXMuY291bnRyeVNlYXJjaFN0cmluZy50b0xvd2VyQ2FzZSgpLnNwbGl0KCcgJykuc29tZShzID0+IHRzLmluY2x1ZGVzKHMpKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXQgbWV0aG9kc0xpc3QoKTogTWV0aG9kVHlwZVR5cGVbXSB7XHJcbiAgICByZXR1cm4gdGhpcy50eXBlc1xyXG4gICAgICAuZmlsdGVyKHR5cGUgPT4gdHlwZS5jb3VudHJ5SVNPQ29kZSA9PT0gdGhpcy5mb3JtLmNvdW50cnkudmFsdWUpXHJcbiAgICAgIC8vIGRpc3RpbmN0XHJcbiAgICAgIC5maWx0ZXIoKHR5cGUsIGluZGV4LCBzZWxmKSA9PiBzZWxmLm1hcChtID0+IG0udHlwZS5pZCkuaW5kZXhPZih0eXBlLnR5cGUuaWQpID09PSBpbmRleClcclxuICAgICAgLy9zb3J0aW5nIGJ5IHRoZSBwcmlvcml0eVxyXG4gICAgICAuc29ydCgobTEsIG0yKSA9PiBtMS5wcmlvcml0eSA+IG0yLnByaW9yaXR5ID8gMSA6ICgobTEucHJpb3JpdHkgPT09IG0yLnByaW9yaXR5KSA/IDAgOiAtMSkpXHJcbiAgICAgIC5tYXAodHlwZSA9PiB0eXBlLnR5cGUpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGN1cnJlbmNpZXNMaXN0KCkge1xyXG4gICAgcmV0dXJuIHRoaXMudHlwZXNcclxuICAgICAgLmZpbHRlcih0eXBlID0+IHR5cGUuY291bnRyeUlTT0NvZGUgPT09IHRoaXMuZm9ybS5jb3VudHJ5LnZhbHVlICYmIHR5cGUudHlwZS5pZCA9PT0gdGhpcy5mb3JtLm1ldGhvZC52YWx1ZSlcclxuICAgICAgLm1hcCh0eXBlID0+IHR5cGUuY3VycmVuY3kpXHJcbiAgfVxyXG5cclxuICBnZXQgdXNlckN1cnJlbmNpZXNMaXN0KCkge1xyXG4gICAgY29uc3QgZmlsdGVyZWRUeXBlcyA9IHRoaXMuY3VycmVuY2llc0xpc3Q7XHJcblxyXG4gICAgaWYgKCF0aGlzLnVzZXJDdXJyZW5jeSkge1xyXG4gICAgICByZXR1cm4gZmlsdGVyZWRUeXBlcztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy51c2VyQ3VycmVuY3lcclxuICAgICAgLmZpbHRlcih1c2VyQ3VycmVuY3kgPT4gZmlsdGVyZWRUeXBlcy5pbmNsdWRlcyh1c2VyQ3VycmVuY3kpKVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRDdXJyZW5jeVZhbHVlKCkge1xyXG4gICAgbGV0IGRlZmF1bHRDdXJyZW5jeSA9IHRoaXMuZm9ybS5kZWZhdWx0Q3VycmVuY3k7XHJcblxyXG4gICAgbGV0IGN1cnJlbmNpZXMgPSB0aGlzLmN1cnJlbmNpZXNMaXN0O1xyXG4gICAgbGV0IGN1cnJlbmN5ID0gY3VycmVuY2llc1swXTtcclxuICAgIGlmIChkZWZhdWx0Q3VycmVuY3kgJiYgdGhpcy5jdXJyZW5jaWVzTGlzdC5pbmNsdWRlcyhkZWZhdWx0Q3VycmVuY3kpKSB7XHJcbiAgICAgIGN1cnJlbmN5ID0gZGVmYXVsdEN1cnJlbmN5O1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmN1cnJlbmN5ICYmIHRoaXMuY3VycmVuY2llc0xpc3QuaW5jbHVkZXModGhpcy5jdXJyZW5jeSkpIHtcclxuICAgICAgY3VycmVuY3kgPSB0aGlzLmN1cnJlbmN5O1xyXG4gICAgfVxyXG4gICAgdGhpcy5mb3JtLmN1cnJlbmN5LnNldFZhbHVlKGN1cnJlbmN5KTtcclxuXHJcbiAgICBjdXJyZW5jaWVzID0gdGhpcy51c2VyQ3VycmVuY2llc0xpc3Q7XHJcbiAgICBjdXJyZW5jeSA9IGN1cnJlbmNpZXNbMF07XHJcbiAgICBpZiAoZGVmYXVsdEN1cnJlbmN5ICYmIHRoaXMudXNlckN1cnJlbmNpZXNMaXN0LmluY2x1ZGVzKGRlZmF1bHRDdXJyZW5jeSkpIHtcclxuICAgICAgY3VycmVuY3kgPSBkZWZhdWx0Q3VycmVuY3k7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuY3VycmVuY3kgJiYgdGhpcy51c2VyQ3VycmVuY2llc0xpc3QuaW5jbHVkZXModGhpcy5jdXJyZW5jeSkpIHtcclxuICAgICAgY3VycmVuY3kgPSB0aGlzLmN1cnJlbmN5O1xyXG4gICAgfVxyXG4gICAgdGhpcy5mb3JtLnVzZXJDdXJyZW5jeS5zZXRWYWx1ZShjdXJyZW5jeSwge2VtaXRFdmVudDogZmFsc2V9KTtcclxuICAgIGlmIChjdXJyZW5jaWVzLmxlbmd0aCA9PT0gMSAmJiBjdXJyZW5jeSAmJiB0aGlzLmZvcm0ubWV0aG9kLmRpc2FibGVkKSB7XHJcbiAgICAgIHRoaXMuZm9ybS51c2VyQ3VycmVuY3kuZGlzYWJsZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGFzRmVlSGludChmaWVsZDogUGF5bWVudEZpZWxkKSB7XHJcbiAgICByZXR1cm4gZmllbGQudHlwZSA9PT0gdGhpcy5DT05TVFJVQ1RPUl9GSUVMRF9UWVBFUy5BbW91bnQgJiYgKGZpZWxkLm9wdGlvbnMuZmVlIHx8IGZpZWxkLm9wdGlvbnMuZml4ZWRGZWUgfHwgZmllbGQub3B0aW9ucy5taW4gfHwgZmllbGQub3B0aW9ucy5tYXgpO1xyXG4gIH1cclxuXHJcbiAgLyoqIEluc2VydGVkIGJ5IEFuZ3VsYXIgaW5qZWN0KCkgbWlncmF0aW9uIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAqL1xyXG4gIGNvbnN0cnVjdG9yKC4uLmFyZ3M6IHVua25vd25bXSk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gIH1cclxuXHJcbiAgZ2V0IGhhc0N1cnJlbmN5TWV0aG9kU2VsZWN0b3IoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy52ZXJzaW9uU3J2Lmhhc0N1cnJlbmN5TWV0aG9kU2VsZWN0b3IgPT09IHRydWU7XHJcbiAgfVxyXG5cclxuICBnZXQgbGFuZygpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlU3J2LmN1cnJlbnRMYW5nO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNrZWxldG9uTGVuZ3RoKCkge1xyXG4gICAgcmV0dXJuIG5ldyBBcnJheSh0aGlzLmZvcm0uZmllbGRzLmxlbmd0aCB8fCAzKTtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGlmIChjaGFuZ2VzLnR5cGVzPy5jdXJyZW50VmFsdWUgfHwgY2hhbmdlcy5jdXJyZW5jeT8uY3VycmVudFZhbHVlKSB7XHJcbiAgICAgIC8vIEdldCBjb25maWd1cmF0aW9uIGZpZWxkc1xyXG4gICAgICBjb25zdCBjb3VudHJpZXMgPSB0aGlzLmNvdW50cmllc0xpc3Q7XHJcbiAgICAgIGNvbnN0IGRlZmF1bHRDb3VudHJ5ID0gdGhpcy5mb3JtLmRlZmF1bHRDb3VudHJ5O1xyXG4gICAgICB0aGlzLmZvcm0uY291bnRyeS5zZXRWYWx1ZShjb3VudHJpZXMuaW5jbHVkZXMoZGVmYXVsdENvdW50cnkpID8gZGVmYXVsdENvdW50cnkgOiBjb3VudHJpZXNbMF0pO1xyXG4gICAgICBpZiAoY291bnRyaWVzLmxlbmd0aCA9PT0gMSAmJiB0aGlzLmZvcm0uY291bnRyeS52YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuZm9ybS5jb3VudHJ5LmRpc2FibGUoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgbWV0aG9kcyA9IHRoaXMubWV0aG9kc0xpc3Q7XHJcbiAgICAgIGNvbnN0IGRlZmF1bHRNZXRob2ROYW1lID0gdGhpcy5mb3JtLmRlZmF1bHRNZXRob2ROYW1lO1xyXG4gICAgICBjb25zdCBkZWZhdWx0TWV0aG9kID0gbWV0aG9kcy5maW5kKG0gPT4gbS5uYW1lID09PSBkZWZhdWx0TWV0aG9kTmFtZSk/LmlkO1xyXG4gICAgICB0aGlzLmZvcm0ubWV0aG9kLnNldFZhbHVlKGRlZmF1bHRNZXRob2QgfHwgbWV0aG9kc1swXT8uaWQpO1xyXG5cclxuICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIGlmIChtZXRob2RzLmxlbmd0aCA9PT0gMSAmJiB0aGlzLmZvcm0uY291bnRyeS5kaXNhYmxlZCkge1xyXG4gICAgICAgIHRoaXMuZm9ybS5tZXRob2QuZGlzYWJsZSgpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB0aGlzLnNldEN1cnJlbmN5VmFsdWUoKTtcclxuICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIHRoaXMuZmV0Y2hGb3JtKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNoYW5nZXMuc3RlcCAmJiBjaGFuZ2VzLnN0ZXAuY3VycmVudFZhbHVlICYmICFjaGFuZ2VzLnR5cGVzICYmICFjaGFuZ2VzLmN1cnJlbmN5KSB7XHJcbiAgICAgIHRoaXMuZmV0Y2hGb3JtKCk7XHJcbiAgICB9XHJcbiAgICBpZiAoY2hhbmdlcy5sb2FkaW5nICYmICFjaGFuZ2VzLmxvYWRpbmcuY3VycmVudFZhbHVlKSB7XHJcbiAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgdGhpcy5mb3JtXHJcbiAgICAgIC5jb3VudHJ5XHJcbiAgICAgIC52YWx1ZUNoYW5nZXNcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgdGFrZVVudGlsKHRoaXMudW5TdWJzY3JpYmVyKVxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIHRoaXMuZm9ybS5zYXZlRGVmYXVsdENvdW50cnkoKTtcclxuICAgICAgICB0aGlzLmZvcm0ubWV0aG9kLnNldFZhbHVlKHRoaXMubWV0aG9kc0xpc3RbMF0uaWQsIHtlbWl0RXZlbnQ6IGZhbHNlfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IG1ldGhvZHMgPSB0aGlzLm1ldGhvZHNMaXN0O1xyXG4gICAgICAgIGNvbnN0IGRlZmF1bHRNZXRob2ROYW1lID0gdGhpcy5mb3JtLmRlZmF1bHRNZXRob2ROYW1lO1xyXG4gICAgICAgIGNvbnN0IGRlZmF1bHRNZXRob2QgPSBtZXRob2RzLmZpbmQobSA9PiBtLm5hbWUgPT09IGRlZmF1bHRNZXRob2ROYW1lKT8uaWQ7XHJcbiAgICAgICAgdGhpcy5mb3JtLm1ldGhvZC5zZXRWYWx1ZShkZWZhdWx0TWV0aG9kIHx8IG1ldGhvZHNbMF0uaWQsIHtlbWl0RXZlbnQ6IGZhbHNlfSk7XHJcbiAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcblxyXG4gICAgICAgIHRoaXMuc2V0Q3VycmVuY3lWYWx1ZSgpO1xyXG4gICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cclxuICAgICAgICB0aGlzLmZldGNoRm9ybSgpO1xyXG4gICAgICB9KTtcclxuICAgIHRoaXMuZm9ybVxyXG4gICAgICAubWV0aG9kXHJcbiAgICAgIC52YWx1ZUNoYW5nZXNcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgdGFrZVVudGlsKHRoaXMudW5TdWJzY3JpYmVyKVxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuZm9ybS5tZXRob2QuY2xlYXJWYWxpZGF0b3JzKCk7XHJcbiAgICAgICAgdGhpcy5mb3JtLnNhdmVEZWZhdWx0TWV0aG9kTmFtZSgpO1xyXG4gICAgICAgIHRoaXMuc2V0Q3VycmVuY3lWYWx1ZSgpO1xyXG4gICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIHRoaXMuZmV0Y2hGb3JtKCk7XHJcbiAgICAgIH0pXHJcbiAgICB0aGlzLmZvcm1cclxuICAgICAgLmN1cnJlbmN5XHJcbiAgICAgIC52YWx1ZUNoYW5nZXNcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgdGFrZVVudGlsKHRoaXMudW5TdWJzY3JpYmVyKVxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuZmV0Y2hGb3JtKCk7XHJcbiAgICAgICAgdGhpcy5mb3JtLnNhdmVEZWZhdWx0Q3VycmVuY3koKTtcclxuICAgICAgfSk7XHJcbiAgICB0aGlzLmZvcm0ucGF5bWVudC52YWx1ZUNoYW5nZXNcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgZGVib3VuY2VUaW1lKDMwMCksXHJcbiAgICAgICAgdGFrZVVudGlsKHRoaXMudW5TdWJzY3JpYmVyKVxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5vblBheW1lbnRDaGFuZ2VkLmVtaXQoKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZldGNoRm9ybSgpIHtcclxuICAgIHRoaXMuZm9ybS5jYW5jZWxSZXF1ZXN0cygpO1xyXG4gICAgaWYgKHRoaXMuc3RlcCAhPT0gdGhpcy5URVJNSU5BTF9TVEVQLlByZXBhcmUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5mb3JtLnJlbW92ZVBheW1lbnRGb3JtQ29udHJvbHMoKTtcclxuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgdGhpcy5mb3JtLnBheW1lbnQubWFya0FzUGVuZGluZygpO1xyXG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB0aGlzLmZvcm1cclxuICAgICAgLmluaXQoKVxyXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICBpZiAoIXRoaXMuZm9ybS5oYXNXaGF0VG9GaWxsKCkpIHtcclxuICAgICAgICAgIHRoaXMuc2VuZCgpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmZvcm0ucGF5bWVudC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHtvbmx5U2VsZjogdHJ1ZX0pO1xyXG4gICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIHRoaXMuc2Nyb2xsVG9SZXF1aXNpdHMoKTtcclxuICAgICAgICB0aGlzLmZvcm0ubWFza2VkV2FsbGV0ID0gJyc7XHJcbiAgICAgIH0sIChlcnIpID0+IHtcclxuICAgICAgICB0aGlzLmZvcm0ucGF5bWVudC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHtvbmx5U2VsZjogdHJ1ZX0pO1xyXG4gICAgICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzY3JvbGxUb1JlcXVpc2l0cygpIHtcclxuICAgIGlmICh0aGlzLnJlcXVpc2l0ZXMgfHwgdGhpcy5oaW50TWV0aG9kKSB7XHJcbiAgICAgIHRoaXMubmdTY3JvbGxCYXI/LnNjcm9sbFRvRWxlbWVudCh0aGlzLmhpbnRNZXRob2Q/Lm5hdGl2ZUVsZW1lbnQgfHwgdGhpcy5yZXF1aXNpdGVzLm5hdGl2ZUVsZW1lbnQsIHtcclxuICAgICAgICBkdXJhdGlvbjogNTAwLFxyXG4gICAgICAgIHRvcDogLTc1XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGRlc2NyaXB0aW9uKCkge1xyXG4gICAgcmV0dXJuIHR5cGVvZiB0aGlzLmZvcm0uY29uZmlnPy5kZXNjcmlwdGlvbiA9PT0gJ2Z1bmN0aW9uJyA/IHRoaXMuZm9ybS5jb25maWc/LmRlc2NyaXB0aW9uKHRoaXMuZm9ybS5nZXRSYXdWYWx1ZSgpKSA6IHRoaXMuZm9ybS5jb25maWc/LmRlc2NyaXB0aW9uO1xyXG4gIH1cclxuXHJcbiAgc3VibWl0KCkge1xyXG4gICAgaWYgKCF0aGlzLmNoZWNrKCkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuZm9ybS5tZXRob2ROYW1lID09PSAnY2FyZCcgJiYgIXRoaXMuY2FyZElmcmFtZT8uZmluaXNoZWQpIHtcclxuICAgICAgdGhpcy5jYXJkSWZyYW1lPy5zdWJtaXQoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zZW5kKCk7XHJcbiAgfVxyXG5cclxuICBjYXJkUGFpZCgpIHtcclxuICAgIGlmICghdGhpcy5jaGVjaygpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuc2VuZCgpO1xyXG4gIH1cclxuXHJcbiAgaWZyYW1lRXJyb3IoY29kZTogSTE4Tl9LRVkpIHtcclxuICAgIHRoaXMuZm9ybS5zZXRDREVFcnJvcihjb2RlKTtcclxuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjaGVjaygpIHtcclxuICAgIGlmICh0aGlzLnN0ZXAgPT09IFRlcm1pbmFsU3RlcC5Db25maXJtYXRpb24pIHtcclxuICAgICAgdGhpcy5jb25maXJtLmVtaXQoKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuZm9ybS5jb25maWcgPT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLmZvcm0udmFsaWQgfHwgdGhpcy5lcnJvcikge1xyXG4gICAgICBPYmplY3QudmFsdWVzKHRoaXMuZm9ybS5wYXltZW50LmNvbnRyb2xzKVxyXG4gICAgICAgIC5mb3JFYWNoKChjb250cm9sKSA9PiB7XHJcbiAgICAgICAgICBjb250cm9sLm1hcmtBc0RpcnR5KCk7XHJcbiAgICAgICAgICBjb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgICAgICAgIGNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7ZW1pdEV2ZW50OiBmYWxzZX0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZW5kKCkge1xyXG4gICAgY29uc3QgZGF0YTogVGVybWluYWxQYXltZW50UHJlcGFyZVJlcXVlc3QgPSB0aGlzLmZvcm0uZ2V0UGF5bWVudFZhbHVlKCk7XHJcbiAgICB0aGlzLm1hc2tlZFdhbGxldCA9IHRoaXMuZm9ybS5tYXNrZWRXYWxsZXQ7XHJcbiAgICB0aGlzLnByZXBhcmUuZW1pdChkYXRhKTtcclxuICB9XHJcblxyXG4gIHNlYXJjaENvdW50cnkodmFsdWUpIHtcclxuICAgIHRoaXMuY291bnRyeVNlYXJjaFN0cmluZyA9IHZhbHVlO1xyXG4gICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIGdldCBiYWNrQnRuTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLnN0ZXAgPT09IFRlcm1pbmFsU3RlcC5QcmVwYXJlKSB7XHJcbiAgICAgIHJldHVybiBJMThOX0tFWS5DT05TVFJVQ1RPUl9MQUJFTF9DQU5DRUxfUkVUVVJOO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIEkxOE5fS0VZLkNPTlNUUlVDVE9SX0xBQkVMX1JFVFVSTjtcclxuICB9XHJcblxyXG4gIGNoYW5nZVRleHRGaWVsZFZhbHVlKG1hc2tlZFZhbHVlLCBmaWVsZDogUGF5bWVudEZpZWxkKSB7XHJcbiAgICBpZiAoZmllbGQud2FsbGV0KSB7XHJcbiAgICAgIHRoaXMuZm9ybS5tYXNrZWRXYWxsZXQgPSBtYXNrZWRWYWx1ZTtcclxuICAgICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMudW5TdWJzY3JpYmVyLm5leHQoKTtcclxuICAgIHRoaXMudW5TdWJzY3JpYmVyLnVuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG59XHJcbiIsIjxmb3JtIGNsYXNzPVwiY29uc3RydWN0b3JcIlxyXG4gIFtmb3JtR3JvdXBdPVwiZm9ybVwiXHJcbiAgKG5nU3VibWl0KT1cInN1Ym1pdCgpXCJcclxuICA+XHJcbiAgQGlmICghbG9hZGluZykge1xyXG4gICAgQGlmIChzdGVwID09PSBURVJNSU5BTF9TVEVQLlByZXBhcmUpIHtcclxuICAgICAgPGRpdiBjbGFzcz1cImNvbnN0cnVjdG9yX19maWVsZHNcIj5cclxuICAgICAgICBAaWYgKGNvdW50cnlTZWFyY2hTdHJpbmcgfHwgY291bnRyaWVzTGlzdC5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29uc3RydWN0b3JfX2ZpZWxkXCI+XHJcbiAgICAgICAgICAgIDxhcHAtdHJtLXNlbGVjdCBbZGF0YV09XCJjb3VudHJpZXNMaXN0XCJcclxuICAgICAgICAgICAgICBuYW1lPVwiY291bnRyeVwiXHJcbiAgICAgICAgICAgICAgW2xhYmVsXT1cIkkxOE5fS0VZLkNPTlNUUlVDVE9SX0xBQkVMX0NPVU5UUlkgfCB0cmFuc1wiXHJcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiY291bnRyeVwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjLWZpZWxkLXNlbGVjdCB0cm0tZm9ybS1maWVsZFwiXHJcbiAgICAgICAgICAgICAgKHNlYXJjaCk9XCJzZWFyY2hDb3VudHJ5KCRldmVudClcIlxyXG4gICAgICAgICAgICAgIFt0YWJJbmRleF09XCJ0YWJJbmRleFwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSB0cm1TZWxlY3RMYWJlbFRlbXBsYXRlIGxldC1pdGVtPVwiaXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaVwiXHJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCInZmktJyArIGl0ZW0udG9Mb3dlckNhc2UoKVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWV0aG9kX19uYW1lXCI+e3tpdGVtIHwgY291bnRyeV90cmFuc2xhdGU6IGxhbmd9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8L2FwcC10cm0tc2VsZWN0PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgfVxyXG4gICAgICAgIEBpZiAoZm9ybS5jb3VudHJ5LnZhbHVlKSB7XHJcbiAgICAgICAgICA8YXBwLXBzLXNlbGVjdCBbbWV0aG9kc109XCJtZXRob2RzTGlzdFwiXHJcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cIm1ldGhvZFwiXHJcbiAgICAgICAgICAgIFt0YWJJbmRleF09XCJ0YWJJbmRleFwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgQGlmIChmb3JtLmNvbmZpZz8uZGVzY3JpcHRpb24pIHtcclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29uc3RydWN0b3JfX2hpbnQgdGV4dC0td2FyblwiXHJcbiAgICAgICAgICAgICAgICBhcHAtcHMtc2VsZWN0LWhpbnRcclxuICAgICAgICAgICAgICAgICNoaW50TWV0aG9kXHJcbiAgICAgICAgICAgICAgICBAaW5zZXJ0UmVtb3ZlXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICB7e2Rlc2NyaXB0aW9uIHwgdHJhbnMgfX1cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBAaWYgKGZvcm0uaXNDREVGYWlsZWQpIHtcclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29uc3RydWN0b3JfX2hpbnQgY2RlLWVycm9yXCJcclxuICAgICAgICAgICAgICAgIGFwcC1wcy1zZWxlY3QtaGludFxyXG4gICAgICAgICAgICAgICAgQGluc2VydFJlbW92ZVxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAge3tmb3JtLmdldEVycm9yKCdjZGVfZXJyb3InKSB8IHRyYW5zIH19XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIDwvYXBwLXBzLXNlbGVjdD5cclxuICAgICAgICB9XHJcbiAgICAgICAgQGlmICghZm9ybS5wYXltZW50LnBlbmRpbmcpIHtcclxuICAgICAgICAgIEBpZiAoZm9ybS5wYXltZW50Rm9ybUZpZWxkTmFtZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIDxkaXYgZm9ybUdyb3VwTmFtZT1cInBheW1lbnRcIlxyXG4gICAgICAgICAgICAgICNwYXltZW50UmVxdWlzaXRlc1xyXG4gICAgICAgICAgICAgIGNsYXNzPVwiY29uc3RydWN0b3JfX2ZpZWxkcyBjb25zdHJ1Y3Rvcl9fZmllbGRzLS1yZXZlcnNlXCI+XHJcbiAgICAgICAgICAgICAgQGlmIChmb3JtLmFtb3VudER5bmFtaWMpIHtcclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjdXJyZW5jeVRwbDsgY29udGV4dDoge2xhYmVsOiBJMThOX0tFWS5DT05TVFJVQ1RPUl9MQUJFTF9DVVJSRU5DWSB8IHRyYW5zLCB0YWJJbmRleDogMH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgQGZvciAoZmllbGQgb2YgZm9ybS5maWVsZHM7IHRyYWNrIGZpZWxkLm5hbWU7IGxldCBpID0gJGluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICBAaWYgKGZpZWxkLnR5cGUgPT09IENPTlNUUlVDVE9SX0ZJRUxEX1RZUEVTLklmcmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICA8YXBwLWNvbnN0cnVjdG9yLWZpZWxkLWlmcmFtZVxyXG4gICAgICAgICAgICAgICAgICAgIFtoaWRkZW5dPVwiZm9ybS5pc0NERUZhaWxlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgKHBhaWQpPVwiY2FyZFBhaWQoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgI2NhcmRJZnJhbWVcclxuICAgICAgICAgICAgICAgICAgICAoZXJyb3IpPVwiaWZyYW1lRXJyb3IoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3RhYkluZGV4XT1cImZvcm0uZmllbGRzLmxlbmd0aCAtIGkgKyB0YWJJbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICA8L2FwcC1jb25zdHJ1Y3Rvci1maWVsZC1pZnJhbWU+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBAaWYgKGZpZWxkLnR5cGUgPT09IENPTlNUUlVDVE9SX0ZJRUxEX1RZUEVTLlNlbGVjdCkge1xyXG4gICAgICAgICAgICAgICAgICA8YXBwLWNvbnN0cnVjdG9yLWZpZWxkLXNlbGVjdFxyXG4gICAgICAgICAgICAgICAgICAgIFtjb25maWddPVwiZmllbGRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtpdGVtc109XCJmaWVsZD8ub3B0aW9ucz8uaXRlbXNcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiZmllbGQubmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3RhYkluZGV4XT1cImZvcm0uZmllbGRzLmxlbmd0aCAtIGkgKyB0YWJJbmRleFwiXHJcbiAgICAgICAgICAgICAgICAgID48L2FwcC1jb25zdHJ1Y3Rvci1maWVsZC1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBAaWYgKFtDT05TVFJVQ1RPUl9GSUVMRF9UWVBFUy5UZXh0LCBDT05TVFJVQ1RPUl9GSUVMRF9UWVBFUy5OdW1iZXIsIENPTlNUUlVDVE9SX0ZJRUxEX1RZUEVTLkVtYWlsXS5pbmNsdWRlcyhmaWVsZC50eXBlKSkge1xyXG4gICAgICAgICAgICAgICAgICA8YXBwLWNvbnN0cnVjdG9yLWZpZWxkLXRleHRcclxuICAgICAgICAgICAgICAgICAgICBbY29uZmlnXT1cImZpZWxkXCJcclxuICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImZpZWxkLm5hbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIChtYXNrZWRWYWx1ZUNoYW5nZSk9XCJjaGFuZ2VUZXh0RmllbGRWYWx1ZSgkZXZlbnQsIGZpZWxkKVwiXHJcbiAgICAgICAgICAgICAgICAgIFt0YWJJbmRleF09XCJmb3JtLmZpZWxkcy5sZW5ndGggLSBpICsgdGFiSW5kZXhcIj48L2FwcC1jb25zdHJ1Y3Rvci1maWVsZC10ZXh0PlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgQGlmIChmaWVsZC50eXBlID09PSBDT05TVFJVQ1RPUl9GSUVMRF9UWVBFUy5BbW91bnQpIHtcclxuICAgICAgICAgICAgICAgICAgPGFwcC1jb25zdHJ1Y3Rvci1maWVsZC10ZXh0XHJcbiAgICAgICAgICAgICAgICAgICAgW2NvbmZpZ109XCJmaWVsZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJmaWVsZC5uYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICBbdGFiSW5kZXhdPVwiZm9ybS5maWVsZHMubGVuZ3RoIC0gaSArIHRhYkluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgQGlmIChoYXNGZWVIaW50KGZpZWxkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgPGFwcC1tZXRob2QtYW1vdW50LWhpbnQgYXBwLWMtdGV4dC1oaW50XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29uc3RydWN0b3JfX2hpbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZmVlXT1cImZpZWxkLm9wdGlvbnMuZmVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2ZpeGVkRmVlXT1cImZpZWxkLm9wdGlvbnMuZml4ZWRGZWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbWF4XT1cImZpZWxkLm9wdGlvbnMubWF4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW21pbl09XCJmaWVsZC5vcHRpb25zLm1pblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjdXJyZW5jeV09XCJmaWVsZC5vcHRpb25zLmN1cnJlbmN5XCJcclxuICAgICAgICAgICAgICAgICAgICAgID48L2FwcC1tZXRob2QtYW1vdW50LWhpbnQ+XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgYXBwLWMtdGV4dC1zdWZmaXhcclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29uc3RydWN0b3JfX2N1cnJlbmN5XCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5jb25zdHJ1Y3Rvcl9fY3VycmVuY3ktLXRyYW5zcGFyZW50XT1cImZvcm0uaXNBbW91bnRFZGl0YWJsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY3VycmVuY3lUcGw7IGNvbnRleHQ6IHt0YWJJbmRleDogZm9ybS5maWVsZHMubGVuZ3RoIC0gaSArIHRhYkluZGV4fVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2FwcC1jb25zdHJ1Y3Rvci1maWVsZC10ZXh0PlxyXG4gICAgICAgICAgICAgICAgICBAaWYgKGhhc0N1cnJlbmN5TWV0aG9kU2VsZWN0b3IpIHtcclxuICAgICAgICAgICAgICAgICAgICA8YXBwLXRybS1zZWxlY3RcclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29uc3RydWN0b3ItZmllbGRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIkkxOE5fS0VZLkNPTlNUUlVDVE9SX0xBQkVMX0NVUlJFTkNZIHwgdHJhbnNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm0uY3VycmVuY3lcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW3NlYXJjaGFibGVdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2RhdGFdPVwiY3VycmVuY2llc0xpc3RcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW3RhYkluZGV4XT1cImZvcm0uZmllbGRzLmxlbmd0aCAtIGkgKyB0YWJJbmRleFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgdHJtU2VsZWN0TGFiZWxUZW1wbGF0ZSBsZXQtaXRlbT1cIml0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0cm0taWNvblwiIFtuZ0NsYXNzXT1cIid0cm0tY3Vyci0nICsgaXRlbS50b0xvd2VyQ2FzZSgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIml0ZW1cIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7aXRlbX19XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYXBwLXRybS1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIEBpZiAoZmllbGQudHlwZSA9PT0gQ09OU1RSVUNUT1JfRklFTERfVFlQRVMuRGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgICA8YXBwLWNvbnN0cnVjdG9yLWZpZWxkLWRhdGVcclxuICAgICAgICAgICAgICAgICAgICBbY29uZmlnXT1cImZpZWxkXCJcclxuICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImZpZWxkLm5hbWVcIlxyXG4gICAgICAgICAgICAgICAgICBbdGFiSW5kZXhdPVwiZm9ybS5maWVsZHMubGVuZ3RoIC0gaSArIHRhYkluZGV4XCI+PC9hcHAtY29uc3RydWN0b3ItZmllbGQtZGF0ZT5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjdXJyZW5jeVRwbCBsZXQtbGFiZWw9XCJsYWJlbFwiIGxldC10YWJJbmRleD1cInRhYkluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICA8YXBwLXRybS1zZWxlY3RcclxuICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImxhYmVsXCJcclxuICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm0udXNlckN1cnJlbmN5XCJcclxuICAgICAgICAgICAgICAgICAgW3NlYXJjaGFibGVdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICBbZGF0YV09XCJ1c2VyQ3VycmVuY2llc0xpc3RcIlxyXG4gICAgICAgICAgICAgICAgICBbdGFiSW5kZXhdPVwidGFiSW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSB0cm1TZWxlY3RMYWJlbFRlbXBsYXRlIGxldC1pdGVtPVwiaXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidHJtLWljb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiJ3RybS1jdXJyLScgKyBpdGVtLnRvTG93ZXJDYXNlKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJpdGVtXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7aXRlbX19XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L2FwcC10cm0tc2VsZWN0PlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gQGVsc2Uge1xyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRybS1za2VsZXRvbi1maWVsZHNcIj5cclxuICAgICAgICAgICAgQGZvciAoaSBvZiBza2VsZXRvbkxlbmd0aDsgdHJhY2sgJGluZGV4KSB7XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRybS1za2VsZXRvbi1maWVsZFwiPlxyXG4gICAgICAgICAgICAgICAgPGdtLXNrZWxldG9uIFtjb3VudF09XCIxXCIgW3NoYXBlXT1cIidyZWN0LW1kJ1wiIFtzaXplXT1cIjE4XCI+PC9nbS1za2VsZXRvbj5cclxuICAgICAgICAgICAgICAgIDxnbS1za2VsZXRvbiBbY291bnRdPVwiMVwiIFtzaXplXT1cIjUwXCI+PC9nbS1za2VsZXRvbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgfVxyXG4gICAgICAgIEBpZiAoZXJyb3IgJiYgIWZvcm0ucGF5bWVudC5wZW5kaW5nKSB7XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidHJtLWVycm9yXCJcclxuICAgICAgICAgICAgQGluc2VydFJlbW92ZVxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgIHt7IGVycm9yIHwgdHJhbnMgfX1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH1cclxuICAgICAgPC9kaXY+XHJcbiAgICB9XHJcbiAgICBAaWYgKHN0ZXAgPT09IFRFUk1JTkFMX1NURVAuQ29uZmlybWF0aW9uKSB7XHJcbiAgICAgIDxhcHAtY29uc3RydWN0b3ItcHJlcGFyYXRpb25cclxuICAgICAgICBbY3VycmVuY3ldPVwicmVzcG9uc2U/LmN1cnJlbmN5XCJcclxuICAgICAgICBbbWV0aG9kTmFtZV09XCJmb3JtLmdldFR5cGVOYW1lQnlJZChyZXNwb25zZS50eXBlSWQpXCJcclxuICAgICAgICBbd2FsbGV0XT1cInJlc3BvbnNlLndhbGxldFwiXHJcbiAgICAgICAgW21hc2tlZFdhbGxldF09XCJtYXNrZWRXYWxsZXRcIlxyXG4gICAgICAgIFthbW91bnRdPVwicmVzcG9uc2UuYW1vdW50XCJcclxuICAgICAgICBbdG90YWxdPVwicmVzcG9uc2UudG90YWxcIlxyXG4gICAgICAgIFtjb25maXJtYXRpb25UZXh0XT1cImZvcm0uY29uZmlnPy5jb25maXJtYXRpb25cIlxyXG4gICAgICAgID5cclxuICAgICAgICBAaWYgKGVycm9yICYmICFmb3JtLnBheW1lbnQucGVuZGluZykge1xyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRybS1lcnJvclwiXHJcbiAgICAgICAgICAgIGFwcC1jb25zdHJ1Y3Rvci1wcmVwYXJhdGlvbi1lcnJvclxyXG4gICAgICAgICAgICBAaW5zZXJ0UmVtb3ZlXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAge3sgZXJyb3IgfCB0cmFucyB9fVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgfVxyXG4gICAgICA8L2FwcC1jb25zdHJ1Y3Rvci1wcmVwYXJhdGlvbj5cclxuICAgIH1cclxuICAgIDxkaXYgY2xhc3M9XCJjb25zdHJ1Y3Rvcl9fYWN0aW9uc1wiPlxyXG4gICAgICA8YnV0dG9uIGNsYXNzPVwidHJtLWJ1dHRvbiB0cm0tYnV0dG9uLS1wcmltYXJ5IGNvbnN0cnVjdG9yX19hY3Rpb25zLWNvbnRpbnVlXCJcclxuICAgICAgICB0eXBlPVwic3VibWl0XCJcclxuICAgICAgICBbdGFiaW5kZXhdPVwiZm9ybS5maWVsZHMubGVuZ3RoICsgdGFiSW5kZXhcIj5cclxuICAgICAgICB7e0kxOE5fS0VZLkNPTlNUUlVDVE9SX0xBQkVMX0NPTlRJTlVFIHwgdHJhbnN9fVxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvbiBjbGFzcz1cInRybS1idXR0b24gdHJtLWJ1dHRvbi0tc2Vjb25kYXJ5IGNvbnN0cnVjdG9yX19hY3Rpb25zLWJhY2tcIlxyXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgIFt0YWJpbmRleF09XCJmb3JtLmZpZWxkcy5sZW5ndGggKyB0YWJJbmRleFwiXHJcbiAgICAgIChjbGljayk9XCJiYWNrLmVtaXQoKVwiPiB7eyBiYWNrQnRuTGFiZWwgfCB0cmFuc319PC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICB9IEBlbHNlIHtcclxuICAgIDxkaXYgY2xhc3M9XCJ0cm0tc2tlbGV0b24tZ3JvdXBcIj5cclxuICAgICAgPGdtLXNrZWxldG9uIFtjb3VudF09XCI0XCIgW2dhcF09XCIyMFwiIFtzaXplXT1cIjgwXCI+PC9nbS1za2VsZXRvbj5cclxuICAgICAgPGdtLXNrZWxldG9uIFtjb3VudF09XCIyXCIgW2dhcF09XCIxMFwiIFtzaXplXT1cIjQ4XCI+PC9nbS1za2VsZXRvbj5cclxuICAgIDwvZGl2PlxyXG4gIH1cclxuPC9mb3JtPlxyXG4iXX0=
|
|
333
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RydWN0b3ItZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90ZXJtaW5hbC10ZW1wbGF0ZS9zcmMvbGliL2FwcC9wYWdlcy9jb21wb25lbnRzL2NvbnN0cnVjdG9yLWZvcm0vY29uc3RydWN0b3ItZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90ZXJtaW5hbC10ZW1wbGF0ZS9zcmMvbGliL2FwcC9wYWdlcy9jb21wb25lbnRzL2NvbnN0cnVjdG9yLWZvcm0vY29uc3RydWN0b3ItZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBRVQsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBR0wsTUFBTSxFQUVOLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQWdCLG9CQUFvQixFQUFFLFlBQVksRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUM1RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQVE3RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUM3RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3JELE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDdkUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENB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LEtBQUs7c0JBQWIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0ksSUFBSTtzQkFBYixNQUFNO2dCQUNHLE9BQU87c0JBQWhCLE1BQU07Z0JBQ0csT0FBTztzQkFBaEIsTUFBTTtnQkFDRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0UsUUFBUTtzQkFBaEIsS0FBSztnQkFFMkMsVUFBVTtzQkFBMUQsU0FBUzt1QkFBQyxtQkFBbUIsRUFBRSxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUM7Z0JBQ0wsVUFBVTtzQkFBbkQsU0FBUzt1QkFBQyxZQUFZLEVBQUUsRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFDO2dCQUNFLFVBQVU7c0JBQW5ELFNBQVM7dUJBQUMsWUFBWSxFQUFFLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQWZ0ZXJWaWV3SW5pdCxcclxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBDb21wb25lbnQsXHJcbiAgRWxlbWVudFJlZixcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgaW5qZWN0LFxyXG4gIElucHV0LFxyXG4gIE9uQ2hhbmdlcyxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT3V0cHV0LFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbiAgVmlld0NoaWxkXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFBheW1lbnRGaWVsZCwgUGF5bWVudEZpZWxkVHlwZUVudW0sIFRlcm1pbmFsU3RlcCB9IGZyb20gJy4vbW9kZWxzJztcclxuaW1wb3J0IHsgQ29uc3RydWN0b3JGb3JtU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvY29uc3RydWN0b3ItZm9ybS5zZXJ2aWNlJztcclxuaW1wb3J0IHtcclxuICBNZXRob2RUeXBlLFxyXG4gIE1ldGhvZFR5cGVUeXBlLFxyXG4gIFRlcm1pbmFsUGF5bWVudENvbmZpcm1SZXNwb25zZSxcclxuICBUZXJtaW5hbFBheW1lbnRQcmVwYXJlUmVzcG9uc2UsXHJcbiAgVGVybWluYWxQYXltZW50UHJlcGFyZVJlcXVlc3RcclxufSBmcm9tICcuLi8uLi8uLi8uLi9jb2RlZ2VuL21vZGVsL21vZGVscyc7XHJcbmltcG9ydCB7IGluc2VydFJlbW92ZVRyaWdnZXIgfSBmcm9tICcuLy4uLy4uLy4uL2hlbHBlcnMvaW5zZXJ0UmVtb3ZlVHJpZ2dlcic7XHJcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XHJcbmltcG9ydCB7IENvdW50cmllc1NvcnRQaXBlIH0gZnJvbSAnLi4vLi4vLi4vcGlwZXMvY291bnRyaWVzLXNvcnQucGlwZSc7XHJcbmltcG9ydCB7IE5nU2Nyb2xsYmFyIH0gZnJvbSAnbmd4LXNjcm9sbGJhcic7XHJcbmltcG9ydCB7IEkxOE5fS0VZIH0gZnJvbSAnLi8uLi8uLi8uLi9pMThuJztcclxuaW1wb3J0IHtcclxuICBDb25zdHJ1Y3RvckZpZWxkSWZyYW1lQ29tcG9uZW50XHJcbn0gZnJvbSBcIi4vY29tcG9uZW50cy9jb25zdHJ1Y3Rvci1maWVsZC1pZnJhbWUvY29uc3RydWN0b3ItZmllbGQtaWZyYW1lLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBDb3VudHJ5VHJhbnNsYXRlUGlwZSB9IGZyb20gJy4uLy4uLy4uL3BpcGVzL2NvdW50cnktdHJhbnNsYXRlLnBpcGUnO1xyXG5pbXBvcnQgeyBURVJNSU5BTF9WRVJTSU9OX1NFUlZJQ0VfVE9LRU4gfSBmcm9tICcuLi8uLi8uLi8uLi9jb25zdCc7XHJcbmltcG9ydCB7IFZlcnNpb25TZXJ2aWNlSW50ZXJmYWNlIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzJztcclxuaW1wb3J0IHsgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IE5nQ2xhc3MsIE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBUcm1TZWxlY3RDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvY29tcG9uZW50cy90cm0tc2VsZWN0L3RybS1zZWxlY3QuY29tcG9uZW50JztcclxuaW1wb3J0IHtcclxuICBUcm1TZWxlY3RMYWJlbFRlbXBsYXRlRGlyZWN0aXZlXHJcbn0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2NvbXBvbmVudHMvdHJtLXNlbGVjdC90cm0tc2VsZWN0LWxhYmVsLXRlbXBsYXRlLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IFBzU2VsZWN0Q29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL3BzLXNlbGVjdC9wcy1zZWxlY3QuY29tcG9uZW50JztcclxuaW1wb3J0IHtcclxuICBDb25zdHJ1Y3RvckZpZWxkU2VsZWN0Q29tcG9uZW50XHJcbn0gZnJvbSAnLi9jb21wb25lbnRzL2NvbnN0cnVjdG9yLWZpZWxkLXNlbGVjdC9jb25zdHJ1Y3Rvci1maWVsZC1zZWxlY3QuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQ29uc3RydWN0b3JGaWVsZFRleHRDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvY29uc3RydWN0b3ItZmllbGQtdGV4dC9jb25zdHJ1Y3Rvci1maWVsZC10ZXh0LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IE1ldGhvZEFtb3VudEhpbnRDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvbWV0aG9kLWFtb3VudC1oaW50L21ldGhvZC1hbW91bnQtaGludC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDb25zdHJ1Y3RvckZpZWxkRGF0ZUNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9jb25zdHJ1Y3Rvci1maWVsZC1kYXRlL2NvbnN0cnVjdG9yLWZpZWxkLWRhdGUuY29tcG9uZW50JztcclxuaW1wb3J0IHtcclxuICBDb25zdHJ1Y3RvclByZXBhcmF0aW9uQ29tcG9uZW50XHJcbn0gZnJvbSAnLi9jb21wb25lbnRzL2NvbnN0cnVjdG9yLXByZXBhcmF0aW9uL2NvbnN0cnVjdG9yLXByZXBhcmF0aW9uLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFRhYkluZGV4Rm9jdXNEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL3RhYi1pbmRleC1mb2N1cy5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVCeUtleVBpcGUgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvcGlwZXMvdHJhbnNsYXRlLWJ5LWtleS5waXBlJztcclxuaW1wb3J0IHsgR21Ta2VsZXRvbkNvbXBvbmVudCB9IGZyb20gJ0BnbW1vbmV5L2dtLXVpLWtpdCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC1jb25zdHJ1Y3Rvci1mb3JtJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vY29uc3RydWN0b3ItZm9ybS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vY29uc3RydWN0b3ItZm9ybS5jb21wb25lbnQuc2NzcyddLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gIGFuaW1hdGlvbnM6IFtpbnNlcnRSZW1vdmVUcmlnZ2VyXSxcclxuICBwcm92aWRlcnM6IFtcclxuICAgIENvbnN0cnVjdG9yRm9ybVNlcnZpY2UsXHJcbiAgICBDb3VudHJ5VHJhbnNsYXRlUGlwZSwgQ291bnRyaWVzU29ydFBpcGVcclxuICBdLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW0NvdW50cnlUcmFuc2xhdGVQaXBlLCBDb3VudHJpZXNTb3J0UGlwZSwgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIFRybVNlbGVjdENvbXBvbmVudCwgVHJtU2VsZWN0TGFiZWxUZW1wbGF0ZURpcmVjdGl2ZSwgTmdDbGFzcywgUHNTZWxlY3RDb21wb25lbnQsIE5nVGVtcGxhdGVPdXRsZXQsIENvbnN0cnVjdG9yRmllbGRJZnJhbWVDb21wb25lbnQsIENvbnN0cnVjdG9yRmllbGRTZWxlY3RDb21wb25lbnQsIENvbnN0cnVjdG9yRmllbGRUZXh0Q29tcG9uZW50LCBNZXRob2RBbW91bnRIaW50Q29tcG9uZW50LCBDb25zdHJ1Y3RvckZpZWxkRGF0ZUNvbXBvbmVudCwgQ29uc3RydWN0b3JQcmVwYXJhdGlvbkNvbXBvbmVudCwgVGFiSW5kZXhGb2N1c0RpcmVjdGl2ZSwgQ291bnRyeVRyYW5zbGF0ZVBpcGUsIFRyYW5zbGF0ZUJ5S2V5UGlwZSwgR21Ta2VsZXRvbkNvbXBvbmVudF1cclxufSlcclxuZXhwb3J0IGNsYXNzIENvbnN0cnVjdG9yRm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcclxuICBwcml2YXRlIGNkID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcclxuICBmb3JtID0gaW5qZWN0KENvbnN0cnVjdG9yRm9ybVNlcnZpY2UpO1xyXG4gIHByaXZhdGUgdHJhbnNsYXRlU3J2ID0gaW5qZWN0KFRyYW5zbGF0ZVNlcnZpY2UpO1xyXG4gIHByaXZhdGUgY291bnRyaWVzU29ydFBpcGUgPSBpbmplY3QoQ291bnRyaWVzU29ydFBpcGUpO1xyXG4gIHByaXZhdGUgY291bnRyeVRyYW5zbGF0ZVBpcGUgPSBpbmplY3QoQ291bnRyeVRyYW5zbGF0ZVBpcGUpO1xyXG4gIHByaXZhdGUgbmdTY3JvbGxCYXIgPSBpbmplY3QoTmdTY3JvbGxiYXIpO1xyXG4gIHByaXZhdGUgdmVyc2lvblNydiA9IGluamVjdDxWZXJzaW9uU2VydmljZUludGVyZmFjZT4oVEVSTUlOQUxfVkVSU0lPTl9TRVJWSUNFX1RPS0VOKTtcclxuXHJcbiAgcHJpdmF0ZSB1blN1YnNjcmliZXIgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gIFRFUk1JTkFMX1NURVAgPSBUZXJtaW5hbFN0ZXA7XHJcbiAgQElucHV0KCkgc3RlcDogVGVybWluYWxTdGVwO1xyXG4gIEBJbnB1dCgpIGVycm9yPzogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHJlc3BvbnNlOiBUZXJtaW5hbFBheW1lbnRQcmVwYXJlUmVzcG9uc2UgJiBUZXJtaW5hbFBheW1lbnRDb25maXJtUmVzcG9uc2UgJiB7XHJcbiAgICB0eXBlSWQ/OiBudW1iZXI7XHJcbiAgfTtcclxuICBDT05TVFJVQ1RPUl9GSUVMRF9UWVBFUyA9IFBheW1lbnRGaWVsZFR5cGVFbnVtO1xyXG4gIEBJbnB1dCgpIGN1cnJlbmN5OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgdXNlckN1cnJlbmN5OiBzdHJpbmdbXTtcclxuICBASW5wdXQoKSBsb2FkaW5nID0gZmFsc2U7XHJcbiAgQElucHV0KCkgdHlwZXM6IE1ldGhvZFR5cGVbXSA9IFtdO1xyXG4gIEBJbnB1dCgpIGNhblJldHVyblRvUHJvamVjdCA9IHRydWU7XHJcbiAgQE91dHB1dCgpIGJhY2s6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuICBAT3V0cHV0KCkgcHJlcGFyZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgY29uZmlybTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgb25QYXltZW50Q2hhbmdlZDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG4gIEBJbnB1dCgpIHRhYkluZGV4OiBudW1iZXI7XHJcbiAgY291bnRyeVNlYXJjaFN0cmluZzogc3RyaW5nO1xyXG4gIEBWaWV3Q2hpbGQoJ3BheW1lbnRSZXF1aXNpdGVzJywge3N0YXRpYzogZmFsc2V9KSByZXF1aXNpdGVzOiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoJ2hpbnRNZXRob2QnLCB7c3RhdGljOiBmYWxzZX0pIGhpbnRNZXRob2Q6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZCgnY2FyZElmcmFtZScsIHtzdGF0aWM6IGZhbHNlfSkgY2FyZElmcmFtZTogQ29uc3RydWN0b3JGaWVsZElmcmFtZUNvbXBvbmVudDtcclxuICBtYXNrZWRXYWxsZXQ6IHN0cmluZztcclxuXHJcbiAgSTE4Tl9LRVkgPSBJMThOX0tFWTtcclxuXHJcbiAgZ2V0IGNvdW50cmllc0xpc3QoKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuY291bnRyaWVzU29ydFBpcGVcclxuICAgICAgLnRyYW5zZm9ybShcclxuICAgICAgICB0aGlzLnR5cGVzXHJcbiAgICAgICAgICAubWFwKHR5cGUgPT4gdHlwZS5jb3VudHJ5SVNPQ29kZSlcclxuICAgICAgICAgIC5maWx0ZXIoKHZhbHVlLCBpbmRleCwgc2VsZikgPT4gc2VsZi5pbmRleE9mKHZhbHVlKSA9PT0gaW5kZXgpXHJcbiAgICAgIClcclxuICAgICAgLmZpbHRlcigobTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmNvdW50cnlTZWFyY2hTdHJpbmcpIHtcclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb25zdCB0aXRsZTogc3RyaW5nID0gdGhpcy5jb3VudHJ5VHJhbnNsYXRlUGlwZS50cmFuc2Zvcm0obSk7XHJcbiAgICAgICAgICByZXR1cm4gdGl0bGUudG9Mb3dlckNhc2UoKVxyXG4gICAgICAgICAgICAuc3BsaXQoJyAnKS5zb21lKFxyXG4gICAgICAgICAgICAgIHRzID0+IHRoaXMuY291bnRyeVNlYXJjaFN0cmluZy50b0xvd2VyQ2FzZSgpLnNwbGl0KCcgJykuc29tZShzID0+IHRzLmluY2x1ZGVzKHMpKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXQgbWV0aG9kc0xpc3QoKTogTWV0aG9kVHlwZVR5cGVbXSB7XHJcbiAgICByZXR1cm4gdGhpcy50eXBlc1xyXG4gICAgICAuZmlsdGVyKHR5cGUgPT4gdHlwZS5jb3VudHJ5SVNPQ29kZSA9PT0gdGhpcy5mb3JtLmNvdW50cnkudmFsdWUpXHJcbiAgICAgIC8vIGRpc3RpbmN0XHJcbiAgICAgIC5maWx0ZXIoKHR5cGUsIGluZGV4LCBzZWxmKSA9PiBzZWxmLm1hcChtID0+IG0udHlwZS5pZCkuaW5kZXhPZih0eXBlLnR5cGUuaWQpID09PSBpbmRleClcclxuICAgICAgLy9zb3J0aW5nIGJ5IHRoZSBwcmlvcml0eVxyXG4gICAgICAuc29ydCgobTEsIG0yKSA9PiBtMS5wcmlvcml0eSA+IG0yLnByaW9yaXR5ID8gMSA6ICgobTEucHJpb3JpdHkgPT09IG0yLnByaW9yaXR5KSA/IDAgOiAtMSkpXHJcbiAgICAgIC5tYXAodHlwZSA9PiB0eXBlLnR5cGUpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGN1cnJlbmNpZXNMaXN0KCkge1xyXG4gICAgcmV0dXJuIHRoaXMudHlwZXNcclxuICAgICAgLmZpbHRlcih0eXBlID0+IHR5cGUuY291bnRyeUlTT0NvZGUgPT09IHRoaXMuZm9ybS5jb3VudHJ5LnZhbHVlICYmIHR5cGUudHlwZS5pZCA9PT0gdGhpcy5mb3JtLm1ldGhvZC52YWx1ZSlcclxuICAgICAgLm1hcCh0eXBlID0+IHR5cGUuY3VycmVuY3kpXHJcbiAgfVxyXG5cclxuICBnZXQgdXNlckN1cnJlbmNpZXNMaXN0KCkge1xyXG4gICAgY29uc3QgZmlsdGVyZWRUeXBlcyA9IHRoaXMuY3VycmVuY2llc0xpc3Q7XHJcblxyXG4gICAgaWYgKCF0aGlzLnVzZXJDdXJyZW5jeSkge1xyXG4gICAgICByZXR1cm4gZmlsdGVyZWRUeXBlcztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy51c2VyQ3VycmVuY3lcclxuICAgICAgLmZpbHRlcih1c2VyQ3VycmVuY3kgPT4gZmlsdGVyZWRUeXBlcy5pbmNsdWRlcyh1c2VyQ3VycmVuY3kpKVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRDdXJyZW5jeVZhbHVlKCkge1xyXG4gICAgbGV0IGRlZmF1bHRDdXJyZW5jeSA9IHRoaXMuZm9ybS5kZWZhdWx0Q3VycmVuY3k7XHJcblxyXG4gICAgbGV0IGN1cnJlbmNpZXMgPSB0aGlzLmN1cnJlbmNpZXNMaXN0O1xyXG4gICAgbGV0IGN1cnJlbmN5ID0gY3VycmVuY2llc1swXTtcclxuICAgIGlmIChkZWZhdWx0Q3VycmVuY3kgJiYgdGhpcy5jdXJyZW5jaWVzTGlzdC5pbmNsdWRlcyhkZWZhdWx0Q3VycmVuY3kpKSB7XHJcbiAgICAgIGN1cnJlbmN5ID0gZGVmYXVsdEN1cnJlbmN5O1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmN1cnJlbmN5ICYmIHRoaXMuY3VycmVuY2llc0xpc3QuaW5jbHVkZXModGhpcy5jdXJyZW5jeSkpIHtcclxuICAgICAgY3VycmVuY3kgPSB0aGlzLmN1cnJlbmN5O1xyXG4gICAgfVxyXG4gICAgdGhpcy5mb3JtLmN1cnJlbmN5LnNldFZhbHVlKGN1cnJlbmN5KTtcclxuXHJcbiAgICBjdXJyZW5jaWVzID0gdGhpcy51c2VyQ3VycmVuY2llc0xpc3Q7XHJcbiAgICBjdXJyZW5jeSA9IGN1cnJlbmNpZXNbMF07XHJcbiAgICBpZiAoZGVmYXVsdEN1cnJlbmN5ICYmIHRoaXMudXNlckN1cnJlbmNpZXNMaXN0LmluY2x1ZGVzKGRlZmF1bHRDdXJyZW5jeSkpIHtcclxuICAgICAgY3VycmVuY3kgPSBkZWZhdWx0Q3VycmVuY3k7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuY3VycmVuY3kgJiYgdGhpcy51c2VyQ3VycmVuY2llc0xpc3QuaW5jbHVkZXModGhpcy5jdXJyZW5jeSkpIHtcclxuICAgICAgY3VycmVuY3kgPSB0aGlzLmN1cnJlbmN5O1xyXG4gICAgfVxyXG4gICAgdGhpcy5mb3JtLnVzZXJDdXJyZW5jeS5zZXRWYWx1ZShjdXJyZW5jeSwge2VtaXRFdmVudDogZmFsc2V9KTtcclxuICAgIGlmIChjdXJyZW5jaWVzLmxlbmd0aCA9PT0gMSAmJiBjdXJyZW5jeSAmJiB0aGlzLmZvcm0ubWV0aG9kLmRpc2FibGVkKSB7XHJcbiAgICAgIHRoaXMuZm9ybS51c2VyQ3VycmVuY3kuZGlzYWJsZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGFzRmVlSGludChmaWVsZDogUGF5bWVudEZpZWxkKSB7XHJcbiAgICByZXR1cm4gZmllbGQudHlwZSA9PT0gdGhpcy5DT05TVFJVQ1RPUl9GSUVMRF9UWVBFUy5BbW91bnQgJiYgKGZpZWxkLm9wdGlvbnMuZmVlIHx8IGZpZWxkLm9wdGlvbnMuZml4ZWRGZWUgfHwgZmllbGQub3B0aW9ucy5taW4gfHwgZmllbGQub3B0aW9ucy5tYXgpO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgfVxyXG5cclxuICBnZXQgaGFzQ3VycmVuY3lNZXRob2RTZWxlY3RvcigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnZlcnNpb25TcnYuaGFzQ3VycmVuY3lNZXRob2RTZWxlY3RvciA9PT0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGdldCBsYW5nKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVTcnYuY3VycmVudExhbmc7XHJcbiAgfVxyXG5cclxuICBnZXQgc2tlbGV0b25MZW5ndGgoKSB7XHJcbiAgICByZXR1cm4gbmV3IEFycmF5KHRoaXMuZm9ybS5maWVsZHM/Lmxlbmd0aCB8fCAzKS5maWxsKDApO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgaWYgKGNoYW5nZXMudHlwZXMgJiYgdGhpcy50eXBlcz8ubGVuZ3RoIHx8IGNoYW5nZXMuY3VycmVuY3kgJiYgdGhpcy5jdXJyZW5jeSkge1xyXG4gICAgICAvLyBHZXQgY29uZmlndXJhdGlvbiBmaWVsZHNcclxuICAgICAgY29uc3QgY291bnRyaWVzID0gdGhpcy5jb3VudHJpZXNMaXN0O1xyXG4gICAgICBjb25zdCBkZWZhdWx0Q291bnRyeSA9IHRoaXMuZm9ybS5kZWZhdWx0Q291bnRyeTtcclxuICAgICAgdGhpcy5mb3JtLmNvdW50cnkuc2V0VmFsdWUoY291bnRyaWVzLmluY2x1ZGVzKGRlZmF1bHRDb3VudHJ5KSA/IGRlZmF1bHRDb3VudHJ5IDogY291bnRyaWVzWzBdKTtcclxuICAgICAgaWYgKGNvdW50cmllcy5sZW5ndGggPT09IDEgJiYgdGhpcy5mb3JtLmNvdW50cnkudmFsdWUpIHtcclxuICAgICAgICB0aGlzLmZvcm0uY291bnRyeS5kaXNhYmxlKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IG1ldGhvZHMgPSB0aGlzLm1ldGhvZHNMaXN0O1xyXG4gICAgICBjb25zdCBkZWZhdWx0TWV0aG9kTmFtZSA9IHRoaXMuZm9ybS5kZWZhdWx0TWV0aG9kTmFtZTtcclxuICAgICAgY29uc3QgZGVmYXVsdE1ldGhvZCA9IG1ldGhvZHMuZmluZChtID0+IG0ubmFtZSA9PT0gZGVmYXVsdE1ldGhvZE5hbWUpPy5pZDtcclxuICAgICAgdGhpcy5mb3JtLm1ldGhvZC5zZXRWYWx1ZShkZWZhdWx0TWV0aG9kIHx8IG1ldGhvZHNbMF0/LmlkKTtcclxuXHJcbiAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICBpZiAobWV0aG9kcy5sZW5ndGggPT09IDEgJiYgdGhpcy5mb3JtLmNvdW50cnkuZGlzYWJsZWQpIHtcclxuICAgICAgICB0aGlzLmZvcm0ubWV0aG9kLmRpc2FibGUoKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgdGhpcy5zZXRDdXJyZW5jeVZhbHVlKCk7XHJcbiAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB0aGlzLmZldGNoRm9ybSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgdGhpcy5mb3JtXHJcbiAgICAgIC5jb3VudHJ5XHJcbiAgICAgIC52YWx1ZUNoYW5nZXNcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKGEsYikgPT4gIGEgPT09IGIpLFxyXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLnVuU3Vic2NyaWJlcilcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICB0aGlzLmZvcm0uc2F2ZURlZmF1bHRDb3VudHJ5KCk7XHJcbiAgICAgICAgdGhpcy5mb3JtLm1ldGhvZC5zZXRWYWx1ZSh0aGlzLm1ldGhvZHNMaXN0WzBdLmlkLCB7ZW1pdEV2ZW50OiBmYWxzZX0pO1xyXG5cclxuICAgICAgICBjb25zdCBtZXRob2RzID0gdGhpcy5tZXRob2RzTGlzdDtcclxuICAgICAgICBjb25zdCBkZWZhdWx0TWV0aG9kTmFtZSA9IHRoaXMuZm9ybS5kZWZhdWx0TWV0aG9kTmFtZTtcclxuICAgICAgICBjb25zdCBkZWZhdWx0TWV0aG9kID0gbWV0aG9kcy5maW5kKG0gPT4gbS5uYW1lID09PSBkZWZhdWx0TWV0aG9kTmFtZSk/LmlkO1xyXG4gICAgICAgIHRoaXMuZm9ybS5tZXRob2Quc2V0VmFsdWUoZGVmYXVsdE1ldGhvZCB8fCBtZXRob2RzWzBdLmlkLCB7ZW1pdEV2ZW50OiBmYWxzZX0pO1xyXG4gICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cclxuICAgICAgICB0aGlzLnNldEN1cnJlbmN5VmFsdWUoKTtcclxuICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuXHJcbiAgICAgICAgdGhpcy5mZXRjaEZvcm0oKTtcclxuICAgICAgfSk7XHJcbiAgICB0aGlzLmZvcm1cclxuICAgICAgLm1ldGhvZFxyXG4gICAgICAudmFsdWVDaGFuZ2VzXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChhLGIpID0+ICBhID09PSBiKSxcclxuICAgICAgICB0YWtlVW50aWwodGhpcy51blN1YnNjcmliZXIpXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5mb3JtLm1ldGhvZC5jbGVhclZhbGlkYXRvcnMoKTtcclxuICAgICAgICB0aGlzLmZvcm0uc2F2ZURlZmF1bHRNZXRob2ROYW1lKCk7XHJcbiAgICAgICAgdGhpcy5zZXRDdXJyZW5jeVZhbHVlKCk7XHJcbiAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgdGhpcy5mZXRjaEZvcm0oKTtcclxuICAgICAgfSlcclxuICAgIHRoaXMuZm9ybVxyXG4gICAgICAuY3VycmVuY3lcclxuICAgICAgLnZhbHVlQ2hhbmdlc1xyXG4gICAgICAucGlwZShcclxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgoYSxiKSA9PiAgYSA9PT0gYiksXHJcbiAgICAgICAgdGFrZVVudGlsKHRoaXMudW5TdWJzY3JpYmVyKVxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuZmV0Y2hGb3JtKCk7XHJcbiAgICAgICAgdGhpcy5mb3JtLnNhdmVEZWZhdWx0Q3VycmVuY3koKTtcclxuICAgICAgfSk7XHJcbiAgICB0aGlzLmZvcm0ucGF5bWVudC52YWx1ZUNoYW5nZXNcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgZGVib3VuY2VUaW1lKDMwMCksXHJcbiAgICAgICAgdGFrZVVudGlsKHRoaXMudW5TdWJzY3JpYmVyKVxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5vblBheW1lbnRDaGFuZ2VkLmVtaXQoKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZldGNoRm9ybSgpIHtcclxuICAgIHRoaXMuZm9ybS5jYW5jZWxSZXF1ZXN0cygpO1xyXG4gICAgaWYgKHRoaXMuc3RlcCAhPT0gdGhpcy5URVJNSU5BTF9TVEVQLlByZXBhcmUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5mb3JtLnJlbW92ZVBheW1lbnRGb3JtQ29udHJvbHMoKTtcclxuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgdGhpcy5mb3JtXHJcbiAgICAgIC5pbml0KClcclxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmZvcm0uaGFzV2hhdFRvRmlsbCgpKSB7XHJcbiAgICAgICAgICB0aGlzLnNlbmQoKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgdGhpcy5zY3JvbGxUb1JlcXVpc2l0cygpO1xyXG4gICAgICAgIHRoaXMuZm9ybS5tYXNrZWRXYWxsZXQgPSAnJztcclxuICAgICAgfSwgKGVycikgPT4ge1xyXG4gICAgICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzY3JvbGxUb1JlcXVpc2l0cygpIHtcclxuICAgIGlmICh0aGlzLnJlcXVpc2l0ZXMgfHwgdGhpcy5oaW50TWV0aG9kKSB7XHJcbiAgICAgIHRoaXMubmdTY3JvbGxCYXI/LnNjcm9sbFRvRWxlbWVudCh0aGlzLmhpbnRNZXRob2Q/Lm5hdGl2ZUVsZW1lbnQgfHwgdGhpcy5yZXF1aXNpdGVzLm5hdGl2ZUVsZW1lbnQsIHtcclxuICAgICAgICBkdXJhdGlvbjogNTAwLFxyXG4gICAgICAgIHRvcDogLTc1XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGRlc2NyaXB0aW9uKCkge1xyXG4gICAgcmV0dXJuIHR5cGVvZiB0aGlzLmZvcm0uY29uZmlnPy5kZXNjcmlwdGlvbiA9PT0gJ2Z1bmN0aW9uJyA/IHRoaXMuZm9ybS5jb25maWc/LmRlc2NyaXB0aW9uKHRoaXMuZm9ybS5nZXRSYXdWYWx1ZSgpKSA6IHRoaXMuZm9ybS5jb25maWc/LmRlc2NyaXB0aW9uO1xyXG4gIH1cclxuXHJcbiAgc3VibWl0KCkge1xyXG4gICAgaWYgKCF0aGlzLmNoZWNrKCkgJiYgIXRoaXMubG9hZGluZykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5mb3JtLm1ldGhvZE5hbWUgPT09ICdjYXJkJyAmJiAhdGhpcy5jYXJkSWZyYW1lPy5maW5pc2hlZCkge1xyXG4gICAgICB0aGlzLmNhcmRJZnJhbWU/LnN1Ym1pdCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnNlbmQoKTtcclxuICB9XHJcblxyXG4gIGNhcmRQYWlkKCkge1xyXG4gICAgaWYgKCF0aGlzLmNoZWNrKCkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zZW5kKCk7XHJcbiAgfVxyXG5cclxuICBpZnJhbWVFcnJvcihjb2RlOiBJMThOX0tFWSkge1xyXG4gICAgdGhpcy5mb3JtLnNldENERUVycm9yKGNvZGUpO1xyXG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNoZWNrKCkge1xyXG4gICAgaWYgKHRoaXMuc3RlcCA9PT0gVGVybWluYWxTdGVwLkNvbmZpcm1hdGlvbikge1xyXG4gICAgICB0aGlzLmNvbmZpcm0uZW1pdCgpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5mb3JtLmNvbmZpZyA9PT0gbnVsbCkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuZm9ybS52YWxpZCB8fCB0aGlzLmVycm9yKSB7XHJcbiAgICAgIE9iamVjdC52YWx1ZXModGhpcy5mb3JtLnBheW1lbnQuY29udHJvbHMpXHJcbiAgICAgICAgLmZvckVhY2goKGNvbnRyb2wpID0+IHtcclxuICAgICAgICAgIGNvbnRyb2wubWFya0FzRGlydHkoKTtcclxuICAgICAgICAgIGNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgICAgICAgY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHtlbWl0RXZlbnQ6IGZhbHNlfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNlbmQoKSB7XHJcbiAgICBjb25zdCBkYXRhOiBUZXJtaW5hbFBheW1lbnRQcmVwYXJlUmVxdWVzdCA9IHRoaXMuZm9ybS5nZXRQYXltZW50VmFsdWUoKTtcclxuICAgIHRoaXMubWFza2VkV2FsbGV0ID0gdGhpcy5mb3JtLm1hc2tlZFdhbGxldDtcclxuICAgIHRoaXMucHJlcGFyZS5lbWl0KGRhdGEpO1xyXG4gIH1cclxuXHJcbiAgc2VhcmNoQ291bnRyeSh2YWx1ZSkge1xyXG4gICAgdGhpcy5jb3VudHJ5U2VhcmNoU3RyaW5nID0gdmFsdWU7XHJcbiAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGJhY2tCdG5MYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuc3RlcCA9PT0gVGVybWluYWxTdGVwLlByZXBhcmUpIHtcclxuICAgICAgcmV0dXJuIEkxOE5fS0VZLkNPTlNUUlVDVE9SX0xBQkVMX0NBTkNFTF9SRVRVUk47XHJcbiAgICB9XHJcbiAgICByZXR1cm4gSTE4Tl9LRVkuQ09OU1RSVUNUT1JfTEFCRUxfUkVUVVJOO1xyXG4gIH1cclxuXHJcbiAgY2hhbmdlVGV4dEZpZWxkVmFsdWUobWFza2VkVmFsdWUsIGZpZWxkOiBQYXltZW50RmllbGQpIHtcclxuICAgIGlmIChmaWVsZC53YWxsZXQpIHtcclxuICAgICAgdGhpcy5mb3JtLm1hc2tlZFdhbGxldCA9IG1hc2tlZFZhbHVlO1xyXG4gICAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy51blN1YnNjcmliZXIubmV4dCgpO1xyXG4gICAgdGhpcy51blN1YnNjcmliZXIudW5zdWJzY3JpYmUoKTtcclxuICB9XHJcbn1cclxuIiwiPGZvcm0gY2xhc3M9XCJjb25zdHJ1Y3RvclwiXHJcbiAgW2Zvcm1Hcm91cF09XCJmb3JtXCJcclxuICAobmdTdWJtaXQpPVwic3VibWl0KClcIlxyXG4gID5cclxuICBAaWYgKGxvYWRpbmcgIT09IG51bGwpIHtcclxuICAgIEBpZiAoc3RlcCA9PT0gVEVSTUlOQUxfU1RFUC5QcmVwYXJlKSB7XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb25zdHJ1Y3Rvcl9fZmllbGRzXCI+XHJcbiAgICAgICAgQGlmIChjb3VudHJ5U2VhcmNoU3RyaW5nIHx8IGNvdW50cmllc0xpc3QubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnN0cnVjdG9yX19maWVsZFwiPlxyXG4gICAgICAgICAgICA8YXBwLXRybS1zZWxlY3QgW2RhdGFdPVwiY291bnRyaWVzTGlzdFwiXHJcbiAgICAgICAgICAgICAgbmFtZT1cImNvdW50cnlcIlxyXG4gICAgICAgICAgICAgIFtsYWJlbF09XCJJMThOX0tFWS5DT05TVFJVQ1RPUl9MQUJFTF9DT1VOVFJZIHwgdHJhbnNcIlxyXG4gICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImNvdW50cnlcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwiYy1maWVsZC1zZWxlY3QgdHJtLWZvcm0tZmllbGRcIlxyXG4gICAgICAgICAgICAgIChzZWFyY2gpPVwic2VhcmNoQ291bnRyeSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICBbdGFiSW5kZXhdPVwidGFiSW5kZXhcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgdHJtU2VsZWN0TGFiZWxUZW1wbGF0ZSBsZXQtaXRlbT1cIml0ZW1cIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmlcIlxyXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiJ2ZpLScgKyBpdGVtLnRvTG93ZXJDYXNlKClcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1ldGhvZF9fbmFtZVwiPnt7aXRlbSB8IGNvdW50cnlfdHJhbnNsYXRlOiBsYW5nfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9hcHAtdHJtLXNlbGVjdD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH1cclxuICAgICAgICBAaWYgKGZvcm0uY291bnRyeS52YWx1ZSkge1xyXG4gICAgICAgICAgPGFwcC1wcy1zZWxlY3QgW21ldGhvZHNdPVwibWV0aG9kc0xpc3RcIlxyXG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJtZXRob2RcIlxyXG4gICAgICAgICAgICBbdGFiSW5kZXhdPVwidGFiSW5kZXhcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgIEBpZiAoZm9ybS5jb25maWc/LmRlc2NyaXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnN0cnVjdG9yX19oaW50IHRleHQtLXdhcm5cIlxyXG4gICAgICAgICAgICAgICAgYXBwLXBzLXNlbGVjdC1oaW50XHJcbiAgICAgICAgICAgICAgICAjaGludE1ldGhvZFxyXG4gICAgICAgICAgICAgICAgQGluc2VydFJlbW92ZVxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAge3tkZXNjcmlwdGlvbiB8IHRyYW5zIH19XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgQGlmIChmb3JtLmlzQ0RFRmFpbGVkKSB7XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnN0cnVjdG9yX19oaW50IGNkZS1lcnJvclwiXHJcbiAgICAgICAgICAgICAgICBhcHAtcHMtc2VsZWN0LWhpbnRcclxuICAgICAgICAgICAgICAgIEBpbnNlcnRSZW1vdmVcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIHt7Zm9ybS5nZXRFcnJvcignY2RlX2Vycm9yJykgfCB0cmFucyB9fVxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICA8L2FwcC1wcy1zZWxlY3Q+XHJcbiAgICAgICAgfVxyXG4gICAgICAgIEBpZiAoIWZvcm0ubWV0aG9kSW5mb0xvYWRpbmcpIHtcclxuICAgICAgICAgIEBpZiAoZm9ybS5wYXltZW50Rm9ybUZpZWxkTmFtZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIDxkaXYgZm9ybUdyb3VwTmFtZT1cInBheW1lbnRcIlxyXG4gICAgICAgICAgICAgICNwYXltZW50UmVxdWlzaXRlc1xyXG4gICAgICAgICAgICAgIGNsYXNzPVwiY29uc3RydWN0b3JfX2ZpZWxkcyBjb25zdHJ1Y3Rvcl9fZmllbGRzLS1yZXZlcnNlXCI+XHJcbiAgICAgICAgICAgICAgQGlmIChmb3JtLmFtb3VudER5bmFtaWMpIHtcclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjdXJyZW5jeVRwbDsgY29udGV4dDoge2xhYmVsOiBJMThOX0tFWS5DT05TVFJVQ1RPUl9MQUJFTF9DVVJSRU5DWSB8IHRyYW5zLCB0YWJJbmRleDogMH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgQGZvciAoZmllbGQgb2YgZm9ybS5maWVsZHM7IHRyYWNrIGZpZWxkLm5hbWU7IGxldCBpID0gJGluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICBAaWYgKGZpZWxkLnR5cGUgPT09IENPTlNUUlVDVE9SX0ZJRUxEX1RZUEVTLklmcmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICA8YXBwLWNvbnN0cnVjdG9yLWZpZWxkLWlmcmFtZVxyXG4gICAgICAgICAgICAgICAgICAgIFtoaWRkZW5dPVwiZm9ybS5pc0NERUZhaWxlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgKHBhaWQpPVwiY2FyZFBhaWQoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgI2NhcmRJZnJhbWVcclxuICAgICAgICAgICAgICAgICAgICAoZXJyb3IpPVwiaWZyYW1lRXJyb3IoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3RhYkluZGV4XT1cImZvcm0uZmllbGRzLmxlbmd0aCAtIGkgKyB0YWJJbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICA8L2FwcC1jb25zdHJ1Y3Rvci1maWVsZC1pZnJhbWU+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBAaWYgKGZpZWxkLnR5cGUgPT09IENPTlNUUlVDVE9SX0ZJRUxEX1RZUEVTLlNlbGVjdCkge1xyXG4gICAgICAgICAgICAgICAgICA8YXBwLWNvbnN0cnVjdG9yLWZpZWxkLXNlbGVjdFxyXG4gICAgICAgICAgICAgICAgICAgIFtjb25maWddPVwiZmllbGRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtpdGVtc109XCJmaWVsZD8ub3B0aW9ucz8uaXRlbXNcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiZmllbGQubmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3RhYkluZGV4XT1cImZvcm0uZmllbGRzLmxlbmd0aCAtIGkgKyB0YWJJbmRleFwiXHJcbiAgICAgICAgICAgICAgICAgID48L2FwcC1jb25zdHJ1Y3Rvci1maWVsZC1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBAaWYgKFtDT05TVFJVQ1RPUl9GSUVMRF9UWVBFUy5UZXh0LCBDT05TVFJVQ1RPUl9GSUVMRF9UWVBFUy5OdW1iZXIsIENPTlNUUlVDVE9SX0ZJRUxEX1RZUEVTLkVtYWlsXS5pbmNsdWRlcyhmaWVsZC50eXBlKSkge1xyXG4gICAgICAgICAgICAgICAgICA8YXBwLWNvbnN0cnVjdG9yLWZpZWxkLXRleHRcclxuICAgICAgICAgICAgICAgICAgICBbY29uZmlnXT1cImZpZWxkXCJcclxuICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImZpZWxkLm5hbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIChtYXNrZWRWYWx1ZUNoYW5nZSk9XCJjaGFuZ2VUZXh0RmllbGRWYWx1ZSgkZXZlbnQsIGZpZWxkKVwiXHJcbiAgICAgICAgICAgICAgICAgIFt0YWJJbmRleF09XCJmb3JtLmZpZWxkcy5sZW5ndGggLSBpICsgdGFiSW5kZXhcIj48L2FwcC1jb25zdHJ1Y3Rvci1maWVsZC10ZXh0PlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgQGlmIChmaWVsZC50eXBlID09PSBDT05TVFJVQ1RPUl9GSUVMRF9UWVBFUy5BbW91bnQpIHtcclxuICAgICAgICAgICAgICAgICAgPGFwcC1jb25zdHJ1Y3Rvci1maWVsZC10ZXh0XHJcbiAgICAgICAgICAgICAgICAgICAgW2NvbmZpZ109XCJmaWVsZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJmaWVsZC5uYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICBbdGFiSW5kZXhdPVwiZm9ybS5maWVsZHMubGVuZ3RoIC0gaSArIHRhYkluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgQGlmIChoYXNGZWVIaW50KGZpZWxkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgPGFwcC1tZXRob2QtYW1vdW50LWhpbnQgYXBwLWMtdGV4dC1oaW50XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29uc3RydWN0b3JfX2hpbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZmVlXT1cImZpZWxkLm9wdGlvbnMuZmVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2ZpeGVkRmVlXT1cImZpZWxkLm9wdGlvbnMuZml4ZWRGZWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbWF4XT1cImZpZWxkLm9wdGlvbnMubWF4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW21pbl09XCJmaWVsZC5vcHRpb25zLm1pblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjdXJyZW5jeV09XCJmaWVsZC5vcHRpb25zLmN1cnJlbmN5XCJcclxuICAgICAgICAgICAgICAgICAgICAgID48L2FwcC1tZXRob2QtYW1vdW50LWhpbnQ+XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgYXBwLWMtdGV4dC1zdWZmaXhcclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29uc3RydWN0b3JfX2N1cnJlbmN5XCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5jb25zdHJ1Y3Rvcl9fY3VycmVuY3ktLXRyYW5zcGFyZW50XT1cImZvcm0uaXNBbW91bnRFZGl0YWJsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY3VycmVuY3lUcGw7IGNvbnRleHQ6IHt0YWJJbmRleDogZm9ybS5maWVsZHMubGVuZ3RoIC0gaSArIHRhYkluZGV4fVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2FwcC1jb25zdHJ1Y3Rvci1maWVsZC10ZXh0PlxyXG4gICAgICAgICAgICAgICAgICBAaWYgKGhhc0N1cnJlbmN5TWV0aG9kU2VsZWN0b3IpIHtcclxuICAgICAgICAgICAgICAgICAgICA8YXBwLXRybS1zZWxlY3RcclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29uc3RydWN0b3ItZmllbGRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIkkxOE5fS0VZLkNPTlNUUlVDVE9SX0xBQkVMX0NVUlJFTkNZIHwgdHJhbnNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm0uY3VycmVuY3lcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW3NlYXJjaGFibGVdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2RhdGFdPVwiY3VycmVuY2llc0xpc3RcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW3RhYkluZGV4XT1cImZvcm0uZmllbGRzLmxlbmd0aCAtIGkgKyB0YWJJbmRleFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgdHJtU2VsZWN0TGFiZWxUZW1wbGF0ZSBsZXQtaXRlbT1cIml0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0cm0taWNvblwiIFtuZ0NsYXNzXT1cIid0cm0tY3Vyci0nICsgaXRlbS50b0xvd2VyQ2FzZSgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIml0ZW1cIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7aXRlbX19XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYXBwLXRybS1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIEBpZiAoZmllbGQudHlwZSA9PT0gQ09OU1RSVUNUT1JfRklFTERfVFlQRVMuRGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgICA8YXBwLWNvbnN0cnVjdG9yLWZpZWxkLWRhdGVcclxuICAgICAgICAgICAgICAgICAgICBbY29uZmlnXT1cImZpZWxkXCJcclxuICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImZpZWxkLm5hbWVcIlxyXG4gICAgICAgICAgICAgICAgICBbdGFiSW5kZXhdPVwiZm9ybS5maWVsZHMubGVuZ3RoIC0gaSArIHRhYkluZGV4XCI+PC9hcHAtY29uc3RydWN0b3ItZmllbGQtZGF0ZT5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjdXJyZW5jeVRwbCBsZXQtbGFiZWw9XCJsYWJlbFwiIGxldC10YWJJbmRleD1cInRhYkluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICA8YXBwLXRybS1zZWxlY3RcclxuICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImxhYmVsXCJcclxuICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm0udXNlckN1cnJlbmN5XCJcclxuICAgICAgICAgICAgICAgICAgW3NlYXJjaGFibGVdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICBbZGF0YV09XCJ1c2VyQ3VycmVuY2llc0xpc3RcIlxyXG4gICAgICAgICAgICAgICAgICBbdGFiSW5kZXhdPVwidGFiSW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSB0cm1TZWxlY3RMYWJlbFRlbXBsYXRlIGxldC1pdGVtPVwiaXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidHJtLWljb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiJ3RybS1jdXJyLScgKyBpdGVtLnRvTG93ZXJDYXNlKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJpdGVtXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7aXRlbX19XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L2FwcC10cm0tc2VsZWN0PlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gQGVsc2Uge1xyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRybS1za2VsZXRvbi1maWVsZHNcIj5cclxuICAgICAgICAgICAgQGZvciAoaSBvZiBza2VsZXRvbkxlbmd0aDsgdHJhY2sgJGluZGV4KSB7XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRybS1za2VsZXRvbi1maWVsZFwiPlxyXG4gICAgICAgICAgICAgICAgPGdtLXNrZWxldG9uIFtjb3VudF09XCIxXCIgW3NoYXBlXT1cIidyZWN0LW1kJ1wiIFtzaXplXT1cIjE4XCI+PC9nbS1za2VsZXRvbj5cclxuICAgICAgICAgICAgICAgIDxnbS1za2VsZXRvbiBbY291bnRdPVwiMVwiIFtzaXplXT1cIjUwXCI+PC9nbS1za2VsZXRvbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgfVxyXG4gICAgICAgIEBpZiAoZXJyb3IgJiYgIWZvcm0ubWV0aG9kSW5mb0xvYWRpbmcpIHtcclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0cm0tZXJyb3JcIlxyXG4gICAgICAgICAgICBAaW5zZXJ0UmVtb3ZlXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAge3sgZXJyb3IgfCB0cmFucyB9fVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgfVxyXG4gICAgICA8L2Rpdj5cclxuICAgIH1cclxuICAgIEBpZiAoc3RlcCA9PT0gVEVSTUlOQUxfU1RFUC5Db25maXJtYXRpb24pIHtcclxuICAgICAgPGFwcC1jb25zdHJ1Y3Rvci1wcmVwYXJhdGlvblxyXG4gICAgICAgIFtjdXJyZW5jeV09XCJyZXNwb25zZT8uY3VycmVuY3lcIlxyXG4gICAgICAgIFttZXRob2ROYW1lXT1cImZvcm0uZ2V0VHlwZU5hbWVCeUlkKHJlc3BvbnNlLnR5cGVJZClcIlxyXG4gICAgICAgIFt3YWxsZXRdPVwicmVzcG9uc2Uud2FsbGV0XCJcclxuICAgICAgICBbbWFza2VkV2FsbGV0XT1cIm1hc2tlZFdhbGxldFwiXHJcbiAgICAgICAgW2Ftb3VudF09XCJyZXNwb25zZS5hbW91bnRcIlxyXG4gICAgICAgIFt0b3RhbF09XCJyZXNwb25zZS50b3RhbFwiXHJcbiAgICAgICAgW2NvbmZpcm1hdGlvblRleHRdPVwiZm9ybS5jb25maWc/LmNvbmZpcm1hdGlvblwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgIEBpZiAoZXJyb3IgJiYgIWZvcm0ucGF5bWVudC5wZW5kaW5nKSB7XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidHJtLWVycm9yXCJcclxuICAgICAgICAgICAgYXBwLWNvbnN0cnVjdG9yLXByZXBhcmF0aW9uLWVycm9yXHJcbiAgICAgICAgICAgIEBpbnNlcnRSZW1vdmVcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICB7eyBlcnJvciB8IHRyYW5zIH19XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICB9XHJcbiAgICAgIDwvYXBwLWNvbnN0cnVjdG9yLXByZXBhcmF0aW9uPlxyXG4gICAgfVxyXG4gICAgPGRpdiBjbGFzcz1cImNvbnN0cnVjdG9yX19hY3Rpb25zXCI+XHJcbiAgICAgIDxidXR0b24gY2xhc3M9XCJ0cm0tYnV0dG9uIHRybS1idXR0b24tLXByaW1hcnkgY29uc3RydWN0b3JfX2FjdGlvbnMtY29udGludWVcIlxyXG4gICAgICAgIHR5cGU9XCJzdWJtaXRcIlxyXG4gICAgICAgIFt0YWJpbmRleF09XCJmb3JtLmZpZWxkcy5sZW5ndGggKyB0YWJJbmRleFwiPlxyXG4gICAgICAgIHt7STE4Tl9LRVkuQ09OU1RSVUNUT1JfTEFCRUxfQ09OVElOVUUgfCB0cmFuc319XHJcbiAgICAgICAgQGlmIChsb2FkaW5nKSB7XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInRybS1zcGlubmVyIHRybS1zcGlubmVyLXdoaXRlXCI+PC9zcGFuPlxyXG4gICAgICAgIH1cclxuICAgICAgPC9idXR0b24+XHJcbiAgICAgIDxidXR0b24gY2xhc3M9XCJ0cm0tYnV0dG9uIHRybS1idXR0b24tLXNlY29uZGFyeSBjb25zdHJ1Y3Rvcl9fYWN0aW9ucy1iYWNrXCJcclxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICBbdGFiaW5kZXhdPVwiZm9ybS5maWVsZHMubGVuZ3RoICsgdGFiSW5kZXhcIlxyXG4gICAgICAoY2xpY2spPVwiYmFjay5lbWl0KClcIj4ge3sgYmFja0J0bkxhYmVsIHwgdHJhbnN9fTwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgfSBAZWxzZSB7XHJcbiAgICA8ZGl2IGNsYXNzPVwidHJtLXNrZWxldG9uLWdyb3VwXCI+XHJcbiAgICAgIDxnbS1za2VsZXRvbiBbY291bnRdPVwiNFwiIFtnYXBdPVwiMjBcIiBbc2l6ZV09XCI4MFwiPjwvZ20tc2tlbGV0b24+XHJcbiAgICAgIDxnbS1za2VsZXRvbiBbY291bnRdPVwiMlwiIFtnYXBdPVwiMTBcIiBbc2l6ZV09XCI0OFwiPjwvZ20tc2tlbGV0b24+XHJcbiAgICA8L2Rpdj5cclxuICB9XHJcbjwvZm9ybT5cclxuIl19
|