trm-tmpl 3.2.1 → 3.3.0
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/i18n/i18n-key.enum.mjs +2 -1
- package/esm2022/lib/app/i18n/keys.mjs +3 -2
- package/esm2022/lib/app/models/constants.mjs +4 -2
- package/esm2022/lib/app/pages/components/constructor-form/components/constructor-field-date/constructor-field-date.component.mjs +24 -38
- package/esm2022/lib/app/pages/components/constructor-form/components/constructor-field-iframe/card-sdk.service.mjs +41 -0
- package/esm2022/lib/app/pages/components/constructor-form/components/constructor-field-iframe/constructor-field-iframe.component.mjs +99 -117
- package/esm2022/lib/app/pages/components/constructor-form/components/constructor-field-iframe/iframe-validator-directive.directive.mjs +88 -0
- package/esm2022/lib/app/pages/components/constructor-form/components/constructor-field-select/constructor-field-select.component.mjs +15 -37
- package/esm2022/lib/app/pages/components/constructor-form/components/constructor-field-text/constructor-field-text.component.mjs +10 -4
- package/esm2022/lib/app/pages/components/constructor-form/components/index.mjs +3 -1
- package/esm2022/lib/app/pages/components/constructor-form/components/method-amount-hint/method-amount-hint.component.mjs +11 -7
- package/esm2022/lib/app/pages/components/constructor-form/components/ps-select/ps-select.component.mjs +20 -24
- package/esm2022/lib/app/pages/components/constructor-form/constructor-form.component.mjs +90 -64
- package/esm2022/lib/app/pages/components/constructor-form/models/field-template.mjs +2 -1
- package/esm2022/lib/app/pages/components/constructor-form/models/index.mjs +1 -2
- package/esm2022/lib/app/pages/components/constructor-form/models/payment-field-options.mjs +1 -1
- package/esm2022/lib/app/pages/components/constructor-form/models/payment-field.mjs +1 -1
- package/esm2022/lib/app/pages/components/constructor-form/services/constructor-form.service.mjs +40 -25
- package/esm2022/lib/app/pages/components/terminal-layout/terminal-layout.component.mjs +11 -9
- package/esm2022/lib/app/pages/directives/fee-template.directive.mjs +17 -0
- package/esm2022/lib/app/pages/directives/index.mjs +2 -1
- package/esm2022/lib/app/services/api-errors.service.mjs +16 -34
- package/esm2022/lib/app/services/csrf.resolver.mjs +6 -18
- package/esm2022/lib/app/services/error.interceptior.mjs +2 -2
- package/esm2022/lib/app/services/local-storage.mjs +70 -0
- package/esm2022/lib/app/services/script-loader.mjs +4 -7
- package/esm2022/lib/app/services/session.data-source.mjs +12 -11
- package/esm2022/lib/app/services/translation/translate-lang-storage.service.mjs +95 -79
- package/esm2022/lib/app/shared/components/terminal-lang-switcher/terminal-lang-switcher.component.mjs +10 -8
- package/esm2022/lib/app/shared/components/terminal-layout-tpl/terminal-layout-tpl.component.mjs +6 -6
- package/esm2022/lib/app/shared/components/trm-select/trm-select.component.mjs +1 -1
- package/esm2022/lib/app/terminal-tpl.component.mjs +13 -16
- package/esm2022/lib/app/terminal.module.mjs +43 -75
- package/fesm2022/trm-tmpl.mjs +936 -793
- package/fesm2022/trm-tmpl.mjs.map +1 -1
- package/lib/app/i18n/i18n-key.enum.d.ts +1 -0
- package/lib/app/models/constants.d.ts +3 -1
- package/lib/app/pages/components/constructor-form/components/constructor-field-date/constructor-field-date.component.d.ts +7 -10
- package/lib/app/pages/components/constructor-form/components/constructor-field-iframe/card-sdk.service.d.ts +18 -0
- package/lib/app/pages/components/constructor-form/components/constructor-field-iframe/constructor-field-iframe.component.d.ts +24 -27
- package/lib/app/pages/components/constructor-form/components/constructor-field-iframe/iframe-validator-directive.directive.d.ts +16 -0
- package/lib/app/pages/components/constructor-form/components/constructor-field-select/constructor-field-select.component.d.ts +6 -10
- package/lib/app/pages/components/constructor-form/components/constructor-field-text/constructor-field-text.component.d.ts +3 -3
- package/lib/app/pages/components/constructor-form/components/index.d.ts +2 -0
- package/lib/app/pages/components/constructor-form/components/method-amount-hint/method-amount-hint.component.d.ts +3 -0
- package/lib/app/pages/components/constructor-form/components/ps-select/ps-select.component.d.ts +4 -6
- package/lib/app/pages/components/constructor-form/constructor-form.component.d.ts +6 -9
- package/lib/app/pages/components/constructor-form/models/index.d.ts +0 -1
- package/lib/app/pages/components/constructor-form/models/payment-field-options.d.ts +1 -1
- package/lib/app/pages/components/constructor-form/models/payment-field.d.ts +1 -1
- package/lib/app/pages/components/constructor-form/services/constructor-form.service.d.ts +8 -5
- package/lib/app/pages/components/terminal-layout/terminal-layout.component.d.ts +1 -0
- package/lib/app/pages/directives/fee-template.directive.d.ts +7 -0
- package/lib/app/pages/directives/index.d.ts +1 -0
- package/lib/app/services/api-errors.service.d.ts +4 -10
- package/lib/app/services/csrf.resolver.d.ts +1 -4
- package/lib/app/services/local-storage.d.ts +24 -0
- package/lib/app/services/script-loader.d.ts +1 -2
- package/lib/app/services/session.data-source.d.ts +1 -1
- package/lib/app/services/translation/translate-lang-storage.service.d.ts +22 -23
- package/lib/app/shared/components/terminal-lang-switcher/terminal-lang-switcher.component.d.ts +4 -34
- package/lib/app/shared/components/terminal-layout-tpl/terminal-layout-tpl.component.d.ts +1 -2
- package/lib/app/shared/components/trm-select/trm-select.component.d.ts +1 -2
- package/lib/app/terminal-tpl.component.d.ts +2 -1
- package/lib/app/terminal.module.d.ts +26 -4
- package/package.json +1 -1
- package/esm2022/lib/app/pages/components/constructor-form/models/constants.mjs +0 -4
- package/lib/app/pages/components/constructor-form/models/constants.d.ts +0 -3
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, inject, Input, Output, ViewChild } from '@angular/core';
|
|
1
|
+
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, inject, Input, Output, ViewChild, ViewChildren } from '@angular/core';
|
|
2
2
|
import { PaymentFieldTypeEnum, TerminalStep } from './models';
|
|
3
3
|
import { ConstructorFormService } from './services/constructor-form.service';
|
|
4
4
|
import { insertRemoveTrigger } from './../../../helpers/insertRemoveTrigger';
|
|
5
5
|
import { distinctUntilChanged, Subject } from 'rxjs';
|
|
6
|
-
import { takeUntil } from 'rxjs/operators';
|
|
6
|
+
import { first, takeUntil } from 'rxjs/operators';
|
|
7
7
|
import { TranslateService } from '@ngx-translate/core';
|
|
8
8
|
import { CountriesSortPipe } from '../../../pipes/countries-sort.pipe';
|
|
9
9
|
import { NgScrollbar } from 'ngx-scrollbar';
|
|
@@ -24,9 +24,33 @@ import { ConstructorPreparationComponent } from './components/constructor-prepar
|
|
|
24
24
|
import { TabIndexFocusDirective } from '../../directives/tab-index-focus.directive';
|
|
25
25
|
import { TranslateByKeyPipe } from '../../../shared/pipes/translate-by-key.pipe';
|
|
26
26
|
import { GmSkeletonComponent } from '@gmmoney/gm-ui-kit';
|
|
27
|
+
import { OTHER_COUNTRY_CODE } from "../../../helpers";
|
|
28
|
+
import { CardSdkService } from "./components/constructor-field-iframe/card-sdk.service";
|
|
27
29
|
import * as i0 from "@angular/core";
|
|
28
30
|
import * as i1 from "@angular/forms";
|
|
29
31
|
export class ConstructorFormComponent {
|
|
32
|
+
constructor() {
|
|
33
|
+
this.cd = inject(ChangeDetectorRef);
|
|
34
|
+
this.form = inject(ConstructorFormService);
|
|
35
|
+
this.translateSrv = inject(TranslateService);
|
|
36
|
+
this.countriesSortPipe = inject(CountriesSortPipe);
|
|
37
|
+
this.countryTranslatePipe = inject(CountryTranslatePipe);
|
|
38
|
+
this.ngScrollBar = inject(NgScrollbar);
|
|
39
|
+
this.versionSrv = inject(TERMINAL_VERSION_SERVICE_TOKEN);
|
|
40
|
+
this.unSubscriber = new Subject();
|
|
41
|
+
this.preparationStepFilled = false;
|
|
42
|
+
this.TERMINAL_STEP = TerminalStep;
|
|
43
|
+
this.CONSTRUCTOR_FIELD_TYPES = PaymentFieldTypeEnum;
|
|
44
|
+
this.loading = null;
|
|
45
|
+
this.types = [];
|
|
46
|
+
this.canReturnToProject = true;
|
|
47
|
+
this.amountChanged = new EventEmitter();
|
|
48
|
+
this.back = new EventEmitter();
|
|
49
|
+
this.prepare = new EventEmitter();
|
|
50
|
+
this.confirm = new EventEmitter();
|
|
51
|
+
this.onPaymentChanged = new EventEmitter();
|
|
52
|
+
this.I18N_KEY = I18N_KEY;
|
|
53
|
+
}
|
|
30
54
|
get countriesList() {
|
|
31
55
|
return this.countriesSortPipe
|
|
32
56
|
.transform(this.types
|
|
@@ -89,30 +113,6 @@ export class ConstructorFormComponent {
|
|
|
89
113
|
this.form.userCurrency.disable();
|
|
90
114
|
}
|
|
91
115
|
}
|
|
92
|
-
hasFeeHint(options) {
|
|
93
|
-
return options.fee || options.fixedFee || options.min || options.max;
|
|
94
|
-
}
|
|
95
|
-
constructor() {
|
|
96
|
-
this.cd = inject(ChangeDetectorRef);
|
|
97
|
-
this.form = inject(ConstructorFormService);
|
|
98
|
-
this.translateSrv = inject(TranslateService);
|
|
99
|
-
this.countriesSortPipe = inject(CountriesSortPipe);
|
|
100
|
-
this.countryTranslatePipe = inject(CountryTranslatePipe);
|
|
101
|
-
this.ngScrollBar = inject(NgScrollbar);
|
|
102
|
-
this.versionSrv = inject(TERMINAL_VERSION_SERVICE_TOKEN);
|
|
103
|
-
this.unSubscriber = new Subject();
|
|
104
|
-
this.TERMINAL_STEP = TerminalStep;
|
|
105
|
-
this.CONSTRUCTOR_FIELD_TYPES = PaymentFieldTypeEnum;
|
|
106
|
-
this.loading = false;
|
|
107
|
-
this.types = [];
|
|
108
|
-
this.canReturnToProject = true;
|
|
109
|
-
this.amountChanged = new EventEmitter();
|
|
110
|
-
this.back = new EventEmitter();
|
|
111
|
-
this.prepare = new EventEmitter();
|
|
112
|
-
this.confirm = new EventEmitter();
|
|
113
|
-
this.onPaymentChanged = new EventEmitter();
|
|
114
|
-
this.I18N_KEY = I18N_KEY;
|
|
115
|
-
}
|
|
116
116
|
get hasCurrencyMethodSelector() {
|
|
117
117
|
return this.versionSrv.hasCurrencyMethodSelector === true;
|
|
118
118
|
}
|
|
@@ -127,7 +127,19 @@ export class ConstructorFormComponent {
|
|
|
127
127
|
// Get configuration fields
|
|
128
128
|
const countries = this.countriesList;
|
|
129
129
|
const defaultCountry = this.form.defaultCountry;
|
|
130
|
-
|
|
130
|
+
let country = null;
|
|
131
|
+
if (!countries.includes(defaultCountry)) {
|
|
132
|
+
if (countries.includes(OTHER_COUNTRY_CODE)) {
|
|
133
|
+
country = OTHER_COUNTRY_CODE;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
country = defaultCountry;
|
|
138
|
+
}
|
|
139
|
+
this.form.country.setValue(country);
|
|
140
|
+
if (!country) {
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
131
143
|
if (countries.length === 1 && this.form.country.value) {
|
|
132
144
|
this.form.country.disable();
|
|
133
145
|
}
|
|
@@ -148,10 +160,16 @@ export class ConstructorFormComponent {
|
|
|
148
160
|
.subscribe(() => this.onPaymentChanged.emit(this.form.getRawValue()));
|
|
149
161
|
this.fetchForm();
|
|
150
162
|
}
|
|
163
|
+
if (changes.step?.currentValue && !changes.types && !changes.currency) {
|
|
164
|
+
this.fetchForm();
|
|
165
|
+
}
|
|
151
166
|
if (changes.feeOptions && !changes.feeOptions.firstChange) {
|
|
152
167
|
// need for triggering of the custom validator
|
|
153
168
|
this.form.amount?.updateValueAndValidity();
|
|
154
169
|
}
|
|
170
|
+
if (this.step === TerminalStep.Confirmation) {
|
|
171
|
+
this.preparationStepFilled = true;
|
|
172
|
+
}
|
|
155
173
|
}
|
|
156
174
|
ngAfterViewInit() {
|
|
157
175
|
this.form
|
|
@@ -192,6 +210,10 @@ export class ConstructorFormComponent {
|
|
|
192
210
|
});
|
|
193
211
|
}
|
|
194
212
|
fetchForm() {
|
|
213
|
+
if (!this.form.method.value) {
|
|
214
|
+
this.form.ready = true;
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
195
217
|
this.form.cancelRequests();
|
|
196
218
|
if (this.step !== this.TERMINAL_STEP.Prepare) {
|
|
197
219
|
return;
|
|
@@ -201,14 +223,16 @@ export class ConstructorFormComponent {
|
|
|
201
223
|
this.form
|
|
202
224
|
.init()
|
|
203
225
|
.subscribe(() => {
|
|
204
|
-
if (!this.form.hasWhatToFill()) {
|
|
226
|
+
if (!this.preparationStepFilled && !this.form.hasWhatToFill()) {
|
|
205
227
|
this.send();
|
|
206
228
|
return;
|
|
207
229
|
}
|
|
230
|
+
this.form.payment.updateValueAndValidity({ onlySelf: true });
|
|
208
231
|
this.cd.detectChanges();
|
|
209
232
|
this.scrollToRequisits();
|
|
210
233
|
this.form.maskedWallet = '';
|
|
211
234
|
}, (err) => {
|
|
235
|
+
this.form.payment.updateValueAndValidity({ onlySelf: true });
|
|
212
236
|
this.cd.markForCheck();
|
|
213
237
|
});
|
|
214
238
|
}
|
|
@@ -224,47 +248,49 @@ export class ConstructorFormComponent {
|
|
|
224
248
|
return typeof this.form.config?.description === 'function' ? this.form.config?.description(this.form.getRawValue()) : this.form.config?.description;
|
|
225
249
|
}
|
|
226
250
|
submit() {
|
|
227
|
-
if (
|
|
251
|
+
if (this.feeLoading) {
|
|
228
252
|
return;
|
|
229
253
|
}
|
|
230
|
-
if (this.form.methodName === 'card' && !this.cardIframe?.finished) {
|
|
231
|
-
this.form.continueLoaderOn();
|
|
232
|
-
this.cd.detectChanges();
|
|
233
|
-
this.cardIframe?.submit()
|
|
234
|
-
.then(success => !success && this.form.continueLoaderOff());
|
|
235
|
-
return;
|
|
236
|
-
}
|
|
237
|
-
this.send();
|
|
238
|
-
}
|
|
239
|
-
cardPaid() {
|
|
240
|
-
if (!this.check()) {
|
|
241
|
-
return;
|
|
242
|
-
}
|
|
243
|
-
this.send();
|
|
244
|
-
}
|
|
245
|
-
iframeError(code) {
|
|
246
|
-
this.form.setCDEError(code);
|
|
247
|
-
this.cd.detectChanges();
|
|
248
|
-
}
|
|
249
|
-
check() {
|
|
250
254
|
if (this.step === TerminalStep.Confirmation) {
|
|
251
255
|
this.confirm.emit();
|
|
252
|
-
return
|
|
256
|
+
return;
|
|
253
257
|
}
|
|
254
|
-
if (this.form.config === null) {
|
|
255
|
-
return
|
|
258
|
+
if (this.form.config === null || !this.form.ready) {
|
|
259
|
+
return;
|
|
256
260
|
}
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
261
|
+
this.triggerIframeSubmit();
|
|
262
|
+
if (this.form.invalid || this.error) {
|
|
263
|
+
Object.values(this.form.controls).forEach((control) => {
|
|
264
|
+
control.markAsDirty();
|
|
265
|
+
control.markAsTouched();
|
|
266
|
+
});
|
|
267
|
+
Object.values(this.form.payment.controls).forEach((control) => {
|
|
260
268
|
control.markAsDirty();
|
|
261
269
|
control.markAsTouched();
|
|
262
270
|
control.updateValueAndValidity({ emitEvent: false });
|
|
263
271
|
});
|
|
264
272
|
this.cd.detectChanges();
|
|
265
|
-
return
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
if (this.form.pending) {
|
|
276
|
+
this.form.statusChanges
|
|
277
|
+
.pipe(first(), takeUntil(this.unSubscriber))
|
|
278
|
+
.subscribe((status) => {
|
|
279
|
+
if (status === 'VALID') {
|
|
280
|
+
this.send();
|
|
281
|
+
}
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
else {
|
|
285
|
+
this.send();
|
|
266
286
|
}
|
|
267
|
-
|
|
287
|
+
}
|
|
288
|
+
triggerIframeSubmit() {
|
|
289
|
+
if (!this.form.readyIframesSubmit) {
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
this.sdkList?.forEach((sdk) => sdk.submit());
|
|
293
|
+
this.form.updateValueAndValidityIframes();
|
|
268
294
|
}
|
|
269
295
|
send() {
|
|
270
296
|
const data = this.form.getPaymentValue();
|
|
@@ -295,15 +321,15 @@ export class ConstructorFormComponent {
|
|
|
295
321
|
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", feeLoading: "feeLoading", feeOptions: "feeOptions", currency: "currency", userCurrency: "userCurrency", loading: "loading", types: "types", canReturnToProject: "canReturnToProject", tabIndex: "tabIndex" }, outputs: { amountChanged: "amountChanged", back: "back", prepare: "prepare", confirm: "confirm", onPaymentChanged: "onPaymentChanged" }, providers: [
|
|
296
322
|
ConstructorFormService,
|
|
297
323
|
CountryTranslatePipe, CountriesSortPipe
|
|
298
|
-
], 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 <app-method-amount-hint app-c-text-hint\r\n class=\"constructor__hint\"\r\n [loading]=\"feeLoading\"\r\n [options]=\"feeOptions || field.options\"\r\n ></app-method-amount-hint>\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{font-weight:500;font-size:14px;line-height:20px;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: ["loading", "options"] }, { 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 }); }
|
|
324
|
+
], viewQueries: [{ propertyName: "requisites", first: true, predicate: ["paymentRequisites"], descendants: true }, { propertyName: "hintMethod", first: true, predicate: ["hintMethod"], descendants: true }, { propertyName: "sdkList", predicate: CardSdkService, 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 @insertRemove\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 @insertRemove\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 </app-ps-select>\r\n\r\n @if (\r\n form.method?.hasError('required') &&\r\n form.method.touched &&\r\n form.method.dirty\r\n ) {\r\n <div class=\"gm-error\" @insertRemove>\r\n {{ I18N_KEY.VALIDATION_REQUIRED | trans }}\r\n </div>\r\n }\r\n }\r\n\r\n @if (form.ready) {\r\n <div formGroupName=\"payment\"\r\n @insertRemove\r\n #paymentRequisites\r\n class=\"constructor__fields constructor__fields--reverse\">\r\n @if (form.method.value && 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 @if (form.payment.get(field.name)?.hasError('cde_error')) {\r\n <div class=\"constructor__hint cde-error\" @insertRemove>\r\n {{\r\n form.payment.get(field.name).getError('cde_error')\r\n | trans\r\n }}\r\n </div>\r\n }\r\n <app-constructor-field-iframe\r\n [formControlName]=\"field.name\"\r\n @insertRemove\r\n [hidden]=\"\r\n form.payment.get(field.name)?.hasError('cde_error')\r\n \"\r\n [tabIndex]=\"form.fields.length - i + tabIndex\"\r\n >\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 @insertRemove\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 @insertRemove\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 @insertRemove\r\n [config]=\"field\"\r\n [formControlName]=\"field.name\"\r\n [tabIndex]=\"form.fields.length - i + tabIndex\">\r\n <app-method-amount-hint app-c-text-hint\r\n class=\"constructor__hint\"\r\n [loading]=\"feeLoading\"\r\n [options]=\"feeOptions || field.options\"\r\n ></app-method-amount-hint>\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 @insertRemove\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 @insertRemove\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 @insertRemove\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 } @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 @insertRemove\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 @insertRemove>\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{font-weight:500;font-size:14px;line-height:20px;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"] }, { 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: ["loading", "options"] }, { 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 }); }
|
|
299
325
|
}
|
|
300
326
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.2", ngImport: i0, type: ConstructorFormComponent, decorators: [{
|
|
301
327
|
type: Component,
|
|
302
328
|
args: [{ selector: 'app-constructor-form', changeDetection: ChangeDetectionStrategy.OnPush, animations: [insertRemoveTrigger], providers: [
|
|
303
329
|
ConstructorFormService,
|
|
304
330
|
CountryTranslatePipe, CountriesSortPipe
|
|
305
|
-
], 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 <app-method-amount-hint app-c-text-hint\r\n class=\"constructor__hint\"\r\n [loading]=\"feeLoading\"\r\n [options]=\"feeOptions || field.options\"\r\n ></app-method-amount-hint>\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{font-weight:500;font-size:14px;line-height:20px;color:var(--color-red-500)}.constructor .constructor__actions-continue{position:relative}.constructor .constructor__actions-continue .trm-spinner{position:absolute;right:15px}\n"] }]
|
|
306
|
-
}],
|
|
331
|
+
], 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 @insertRemove\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 @insertRemove\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 </app-ps-select>\r\n\r\n @if (\r\n form.method?.hasError('required') &&\r\n form.method.touched &&\r\n form.method.dirty\r\n ) {\r\n <div class=\"gm-error\" @insertRemove>\r\n {{ I18N_KEY.VALIDATION_REQUIRED | trans }}\r\n </div>\r\n }\r\n }\r\n\r\n @if (form.ready) {\r\n <div formGroupName=\"payment\"\r\n @insertRemove\r\n #paymentRequisites\r\n class=\"constructor__fields constructor__fields--reverse\">\r\n @if (form.method.value && 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 @if (form.payment.get(field.name)?.hasError('cde_error')) {\r\n <div class=\"constructor__hint cde-error\" @insertRemove>\r\n {{\r\n form.payment.get(field.name).getError('cde_error')\r\n | trans\r\n }}\r\n </div>\r\n }\r\n <app-constructor-field-iframe\r\n [formControlName]=\"field.name\"\r\n @insertRemove\r\n [hidden]=\"\r\n form.payment.get(field.name)?.hasError('cde_error')\r\n \"\r\n [tabIndex]=\"form.fields.length - i + tabIndex\"\r\n >\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 @insertRemove\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 @insertRemove\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 @insertRemove\r\n [config]=\"field\"\r\n [formControlName]=\"field.name\"\r\n [tabIndex]=\"form.fields.length - i + tabIndex\">\r\n <app-method-amount-hint app-c-text-hint\r\n class=\"constructor__hint\"\r\n [loading]=\"feeLoading\"\r\n [options]=\"feeOptions || field.options\"\r\n ></app-method-amount-hint>\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 @insertRemove\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 @insertRemove\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 @insertRemove\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 } @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 @insertRemove\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 @insertRemove>\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{font-weight:500;font-size:14px;line-height:20px;color:var(--color-red-500)}.constructor .constructor__actions-continue{position:relative}.constructor .constructor__actions-continue .trm-spinner{position:absolute;right:15px}\n"] }]
|
|
332
|
+
}], propDecorators: { step: [{
|
|
307
333
|
type: Input
|
|
308
334
|
}], error: [{
|
|
309
335
|
type: Input
|
|
@@ -341,8 +367,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.2", ngImpor
|
|
|
341
367
|
}], hintMethod: [{
|
|
342
368
|
type: ViewChild,
|
|
343
369
|
args: ['hintMethod', { static: false }]
|
|
344
|
-
}],
|
|
345
|
-
type:
|
|
346
|
-
args: [
|
|
370
|
+
}], sdkList: [{
|
|
371
|
+
type: ViewChildren,
|
|
372
|
+
args: [CardSdkService]
|
|
347
373
|
}] } });
|
|
348
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RydWN0b3ItZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90ZXJtaW5hbC10ZW1wbGF0ZS9zcmMvbGliL2FwcC9wYWdlcy9jb21wb25lbnRzL2NvbnN0cnVjdG9yLWZvcm0vY29uc3RydWN0b3ItZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90ZXJtaW5hbC10ZW1wbGF0ZS9zcmMvbGliL2FwcC9wYWdlcy9jb21wb25lbnRzL2NvbnN0cnVjdG9yLWZvcm0vY29uc3RydWN0b3ItZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBRVQsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBR0wsTUFBTSxFQUVOLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXFDLG9CQUFvQixFQUFFLFlBQVksRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNqRyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQVE3RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUM3RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3JELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN2RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxP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LEVBQUUsK0JBQStCLEVBQUUsNkJBQTZCLEVBQUUseUJBQXlCLEVBQUUsNkJBQTZCLEVBQUUsK0JBQStCLEVBQUUsc0JBQXNCLEVBQUUsb0JBQW9CLEVBQUUsa0JBQWtCLEVBQUUsbUJBQW1CLENBQUM7d0RBYWpjLElBQUk7c0JBQVosS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFJRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUNJLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csSUFBSTtzQkFBYixNQUFNO2dCQUNHLE9BQU87c0JBQWhCLE1BQU07Z0JBQ0csT0FBTztzQkFBaEIsTUFBTTtnQkFDRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0UsUUFBUTtzQkFBaEIsS0FBSztnQkFFMkMsVUFBVTtzQkFBMUQsU0FBUzt1QkFBQyxtQkFBbUIsRUFBRSxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUM7Z0JBQ0wsVUFBVTtzQkFBbkQsU0FBUzt1QkFBQyxZQUFZLEVBQUUsRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFDO2dCQUNFLFVBQVU7c0JBQW5ELFNBQVM7dUJBQUMsWUFBWSxFQUFFLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQWZ0ZXJWaWV3SW5pdCxcclxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBDb21wb25lbnQsXHJcbiAgRWxlbWVudFJlZixcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgaW5qZWN0LFxyXG4gIElucHV0LFxyXG4gIE9uQ2hhbmdlcyxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT3V0cHV0LFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbiAgVmlld0NoaWxkXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFBheW1lbnRGaWVsZCwgUGF5bWVudEZpZWxkT3B0aW9ucywgUGF5bWVudEZpZWxkVHlwZUVudW0sIFRlcm1pbmFsU3RlcCB9IGZyb20gJy4vbW9kZWxzJztcclxuaW1wb3J0IHsgQ29uc3RydWN0b3JGb3JtU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvY29uc3RydWN0b3ItZm9ybS5zZXJ2aWNlJztcclxuaW1wb3J0IHtcclxuICBNZXRob2RUeXBlLFxyXG4gIE1ldGhvZFR5cGVUeXBlLFxyXG4gIFRlcm1pbmFsUGF5bWVudENvbmZpcm1SZXNwb25zZSxcclxuICBUZXJtaW5hbFBheW1lbnRQcmVwYXJlUmVxdWVzdCxcclxuICBUZXJtaW5hbFBheW1lbnRQcmVwYXJlUmVzcG9uc2VcclxufSBmcm9tICcuLi8uLi8uLi8uLi9jb2RlZ2VuL21vZGVsL21vZGVscyc7XHJcbmltcG9ydCB7IGluc2VydFJlbW92ZVRyaWdnZXIgfSBmcm9tICcuLy4uLy4uLy4uL2hlbHBlcnMvaW5zZXJ0UmVtb3ZlVHJpZ2dlcic7XHJcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xyXG5pbXBvcnQgeyBDb3VudHJpZXNTb3J0UGlwZSB9IGZyb20gJy4uLy4uLy4uL3BpcGVzL2NvdW50cmllcy1zb3J0LnBpcGUnO1xyXG5pbXBvcnQgeyBOZ1Njcm9sbGJhciB9IGZyb20gJ25neC1zY3JvbGxiYXInO1xyXG5pbXBvcnQgeyBJMThOX0tFWSB9IGZyb20gJy4vLi4vLi4vLi4vaTE4bic7XHJcbmltcG9ydCB7XHJcbiAgQ29uc3RydWN0b3JGaWVsZElmcmFtZUNvbXBvbmVudFxyXG59IGZyb20gXCIuL2NvbXBvbmVudHMvY29uc3RydWN0b3ItZmllbGQtaWZyYW1lL2NvbnN0cnVjdG9yLWZpZWxkLWlmcmFtZS5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgQ291bnRyeVRyYW5zbGF0ZVBpcGUgfSBmcm9tICcuLi8uLi8uLi9waXBlcy9jb3VudHJ5LXRyYW5zbGF0ZS5waXBlJztcclxuaW1wb3J0IHsgVEVSTUlOQUxfVkVSU0lPTl9TRVJWSUNFX1RPS0VOIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29uc3QnO1xyXG5pbXBvcnQgeyBWZXJzaW9uU2VydmljZUludGVyZmFjZSB9IGZyb20gJy4uLy4uLy4uL21vZGVscyc7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBOZ0NsYXNzLCBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgVHJtU2VsZWN0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2NvbXBvbmVudHMvdHJtLXNlbGVjdC90cm0tc2VsZWN0LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7XHJcbiAgVHJtU2VsZWN0TGFiZWxUZW1wbGF0ZURpcmVjdGl2ZVxyXG59IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9jb21wb25lbnRzL3RybS1zZWxlY3QvdHJtLXNlbGVjdC1sYWJlbC10ZW1wbGF0ZS5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBQc1NlbGVjdENvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9wcy1zZWxlY3QvcHMtc2VsZWN0LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7XHJcbiAgQ29uc3RydWN0b3JGaWVsZFNlbGVjdENvbXBvbmVudFxyXG59IGZyb20gJy4vY29tcG9uZW50cy9jb25zdHJ1Y3Rvci1maWVsZC1zZWxlY3QvY29uc3RydWN0b3ItZmllbGQtc2VsZWN0LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IENvbnN0cnVjdG9yRmllbGRUZXh0Q29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2NvbnN0cnVjdG9yLWZpZWxkLXRleHQvY29uc3RydWN0b3ItZmllbGQtdGV4dC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBNZXRob2RBbW91bnRIaW50Q29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL21ldGhvZC1hbW91bnQtaGludC9tZXRob2QtYW1vdW50LWhpbnQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQ29uc3RydWN0b3JGaWVsZERhdGVDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvY29uc3RydWN0b3ItZmllbGQtZGF0ZS9jb25zdHJ1Y3Rvci1maWVsZC1kYXRlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7XHJcbiAgQ29uc3RydWN0b3JQcmVwYXJhdGlvbkNvbXBvbmVudFxyXG59IGZyb20gJy4vY29tcG9uZW50cy9jb25zdHJ1Y3Rvci1wcmVwYXJhdGlvbi9jb25zdHJ1Y3Rvci1wcmVwYXJhdGlvbi5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBUYWJJbmRleEZvY3VzRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy90YWItaW5kZXgtZm9jdXMuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgVHJhbnNsYXRlQnlLZXlQaXBlIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3BpcGVzL3RyYW5zbGF0ZS1ieS1rZXkucGlwZSc7XHJcbmltcG9ydCB7IEdtU2tlbGV0b25Db21wb25lbnQgfSBmcm9tICdAZ21tb25leS9nbS11aS1raXQnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhcHAtY29uc3RydWN0b3ItZm9ybScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2NvbnN0cnVjdG9yLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2NvbnN0cnVjdG9yLWZvcm0uY29tcG9uZW50LnNjc3MnXSxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxuICBhbmltYXRpb25zOiBbaW5zZXJ0UmVtb3ZlVHJpZ2dlcl0sXHJcbiAgcHJvdmlkZXJzOiBbXHJcbiAgICBDb25zdHJ1Y3RvckZvcm1TZXJ2aWNlLFxyXG4gICAgQ291bnRyeVRyYW5zbGF0ZVBpcGUsIENvdW50cmllc1NvcnRQaXBlXHJcbiAgXSxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtDb3VudHJ5VHJhbnNsYXRlUGlwZSwgQ291bnRyaWVzU29ydFBpcGUsIEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBUcm1TZWxlY3RDb21wb25lbnQsIFRybVNlbGVjdExhYmVsVGVtcGxhdGVEaXJlY3RpdmUsIE5nQ2xhc3MsIFBzU2VsZWN0Q29tcG9uZW50LCBOZ1RlbXBsYXRlT3V0bGV0LCBDb25zdHJ1Y3RvckZpZWxkSWZyYW1lQ29tcG9uZW50LCBDb25zdHJ1Y3RvckZpZWxkU2VsZWN0Q29tcG9uZW50LCBDb25zdHJ1Y3RvckZpZWxkVGV4dENvbXBvbmVudCwgTWV0aG9kQW1vdW50SGludENvbXBvbmVudCwgQ29uc3RydWN0b3JGaWVsZERhdGVDb21wb25lbnQsIENvbnN0cnVjdG9yUHJlcGFyYXRpb25Db21wb25lbnQsIFRhYkluZGV4Rm9jdXNEaXJlY3RpdmUsIENvdW50cnlUcmFuc2xhdGVQaXBlLCBUcmFuc2xhdGVCeUtleVBpcGUsIEdtU2tlbGV0b25Db21wb25lbnRdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDb25zdHJ1Y3RvckZvcm1Db21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XHJcbiAgcHJpdmF0ZSBjZCA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XHJcbiAgZm9ybSA9IGluamVjdChDb25zdHJ1Y3RvckZvcm1TZXJ2aWNlKTtcclxuICBwcml2YXRlIHRyYW5zbGF0ZVNydiA9IGluamVjdChUcmFuc2xhdGVTZXJ2aWNlKTtcclxuICBwcml2YXRlIGNvdW50cmllc1NvcnRQaXBlID0gaW5qZWN0KENvdW50cmllc1NvcnRQaXBlKTtcclxuICBwcml2YXRlIGNvdW50cnlUcmFuc2xhdGVQaXBlID0gaW5qZWN0KENvdW50cnlUcmFuc2xhdGVQaXBlKTtcclxuICBwcml2YXRlIG5nU2Nyb2xsQmFyID0gaW5qZWN0KE5nU2Nyb2xsYmFyKTtcclxuICBwcml2YXRlIHZlcnNpb25TcnYgPSBpbmplY3Q8VmVyc2lvblNlcnZpY2VJbnRlcmZhY2U+KFRFUk1JTkFMX1ZFUlNJT05fU0VSVklDRV9UT0tFTik7XHJcblxyXG4gIHByaXZhdGUgdW5TdWJzY3JpYmVyID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICBURVJNSU5BTF9TVEVQID0gVGVybWluYWxTdGVwO1xyXG4gIEBJbnB1dCgpIHN0ZXA6IFRlcm1pbmFsU3RlcDtcclxuICBASW5wdXQoKSBlcnJvcj86IHN0cmluZztcclxuICBASW5wdXQoKSByZXNwb25zZTogVGVybWluYWxQYXltZW50UHJlcGFyZVJlc3BvbnNlICYgVGVybWluYWxQYXltZW50Q29uZmlybVJlc3BvbnNlICYge1xyXG4gICAgdHlwZUlkPzogbnVtYmVyO1xyXG4gIH07XHJcbiAgQ09OU1RSVUNUT1JfRklFTERfVFlQRVMgPSBQYXltZW50RmllbGRUeXBlRW51bTtcclxuICBASW5wdXQoKSBmZWVMb2FkaW5nOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpIGZlZU9wdGlvbnM6IFBheW1lbnRGaWVsZE9wdGlvbnM7XHJcbiAgQElucHV0KCkgY3VycmVuY3k6IHN0cmluZztcclxuICBASW5wdXQoKSB1c2VyQ3VycmVuY3k6IHN0cmluZ1tdO1xyXG4gIEBJbnB1dCgpIGxvYWRpbmcgPSBmYWxzZTtcclxuICBASW5wdXQoKSB0eXBlczogTWV0aG9kVHlwZVtdID0gW107XHJcbiAgQElucHV0KCkgY2FuUmV0dXJuVG9Qcm9qZWN0ID0gdHJ1ZTtcclxuICBAT3V0cHV0KCkgYW1vdW50Q2hhbmdlZDogRXZlbnRFbWl0dGVyPG51bWJlcj4gPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcclxuICBAT3V0cHV0KCkgYmFjazogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG4gIEBPdXRwdXQoKSBwcmVwYXJlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBjb25maXJtOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBvblBheW1lbnRDaGFuZ2VkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBJbnB1dCgpIHRhYkluZGV4OiBudW1iZXI7XHJcbiAgY291bnRyeVNlYXJjaFN0cmluZzogc3RyaW5nO1xyXG4gIEBWaWV3Q2hpbGQoJ3BheW1lbnRSZXF1aXNpdGVzJywge3N0YXRpYzogZmFsc2V9KSByZXF1aXNpdGVzOiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoJ2hpbnRNZXRob2QnLCB7c3RhdGljOiBmYWxzZX0pIGhpbnRNZXRob2Q6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZCgnY2FyZElmcmFtZScsIHtzdGF0aWM6IGZhbHNlfSkgY2FyZElmcmFtZTogQ29uc3RydWN0b3JGaWVsZElmcmFtZUNvbXBvbmVudDtcclxuICBtYXNrZWRXYWxsZXQ6IHN0cmluZztcclxuXHJcbiAgSTE4Tl9LRVkgPSBJMThOX0tFWTtcclxuXHJcbiAgZ2V0IGNvdW50cmllc0xpc3QoKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuY291bnRyaWVzU29ydFBpcGVcclxuICAgICAgLnRyYW5zZm9ybShcclxuICAgICAgICB0aGlzLnR5cGVzXHJcbiAgICAgICAgICAubWFwKHR5cGUgPT4gdHlwZS5jb3VudHJ5SVNPQ29kZSlcclxuICAgICAgICAgIC5maWx0ZXIoKHZhbHVlLCBpbmRleCwgc2VsZikgPT4gc2VsZi5pbmRleE9mKHZhbHVlKSA9PT0gaW5kZXgpXHJcbiAgICAgIClcclxuICAgICAgLmZpbHRlcigobTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmNvdW50cnlTZWFyY2hTdHJpbmcpIHtcclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb25zdCB0aXRsZTogc3RyaW5nID0gdGhpcy5jb3VudHJ5VHJhbnNsYXRlUGlwZS50cmFuc2Zvcm0obSk7XHJcbiAgICAgICAgICByZXR1cm4gdGl0bGUudG9Mb3dlckNhc2UoKVxyXG4gICAgICAgICAgICAuc3BsaXQoJyAnKS5zb21lKFxyXG4gICAgICAgICAgICAgIHRzID0+IHRoaXMuY291bnRyeVNlYXJjaFN0cmluZy50b0xvd2VyQ2FzZSgpLnNwbGl0KCcgJykuc29tZShzID0+IHRzLmluY2x1ZGVzKHMpKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXQgbWV0aG9kc0xpc3QoKTogTWV0aG9kVHlwZVR5cGVbXSB7XHJcbiAgICByZXR1cm4gdGhpcy50eXBlc1xyXG4gICAgICAuZmlsdGVyKHR5cGUgPT4gdHlwZS5jb3VudHJ5SVNPQ29kZSA9PT0gdGhpcy5mb3JtLmNvdW50cnkudmFsdWUpXHJcbiAgICAgIC8vIGRpc3RpbmN0XHJcbiAgICAgIC5maWx0ZXIoKHR5cGUsIGluZGV4LCBzZWxmKSA9PiBzZWxmLm1hcChtID0+IG0udHlwZS5pZCkuaW5kZXhPZih0eXBlLnR5cGUuaWQpID09PSBpbmRleClcclxuICAgICAgLy9zb3J0aW5nIGJ5IHRoZSBwcmlvcml0eVxyXG4gICAgICAuc29ydCgobTEsIG0yKSA9PiBtMS5wcmlvcml0eSA+IG0yLnByaW9yaXR5ID8gMSA6ICgobTEucHJpb3JpdHkgPT09IG0yLnByaW9yaXR5KSA/IDAgOiAtMSkpXHJcbiAgICAgIC5tYXAodHlwZSA9PiB0eXBlLnR5cGUpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGN1cnJlbmNpZXNMaXN0KCkge1xyXG4gICAgcmV0dXJuIHRoaXMudHlwZXNcclxuICAgICAgLmZpbHRlcih0eXBlID0+IHR5cGUuY291bnRyeUlTT0NvZGUgPT09IHRoaXMuZm9ybS5jb3VudHJ5LnZhbHVlICYmIHR5cGUudHlwZS5pZCA9PT0gdGhpcy5mb3JtLm1ldGhvZC52YWx1ZSlcclxuICAgICAgLm1hcCh0eXBlID0+IHR5cGUuY3VycmVuY3kpXHJcbiAgfVxyXG5cclxuICBnZXQgdXNlckN1cnJlbmNpZXNMaXN0KCkge1xyXG4gICAgY29uc3QgZmlsdGVyZWRUeXBlcyA9IHRoaXMuY3VycmVuY2llc0xpc3Q7XHJcblxyXG4gICAgaWYgKCF0aGlzLnVzZXJDdXJyZW5jeSkge1xyXG4gICAgICByZXR1cm4gZmlsdGVyZWRUeXBlcztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy51c2VyQ3VycmVuY3lcclxuICAgICAgLmZpbHRlcih1c2VyQ3VycmVuY3kgPT4gZmlsdGVyZWRUeXBlcy5pbmNsdWRlcyh1c2VyQ3VycmVuY3kpKVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRDdXJyZW5jeVZhbHVlKCkge1xyXG4gICAgbGV0IGRlZmF1bHRDdXJyZW5jeSA9IHRoaXMuZm9ybS5kZWZhdWx0Q3VycmVuY3k7XHJcblxyXG4gICAgbGV0IGN1cnJlbmNpZXMgPSB0aGlzLmN1cnJlbmNpZXNMaXN0O1xyXG4gICAgbGV0IGN1cnJlbmN5ID0gY3VycmVuY2llc1swXTtcclxuICAgIGlmIChkZWZhdWx0Q3VycmVuY3kgJiYgdGhpcy5jdXJyZW5jaWVzTGlzdC5pbmNsdWRlcyhkZWZhdWx0Q3VycmVuY3kpKSB7XHJcbiAgICAgIGN1cnJlbmN5ID0gZGVmYXVsdEN1cnJlbmN5O1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmN1cnJlbmN5ICYmIHRoaXMuY3VycmVuY2llc0xpc3QuaW5jbHVkZXModGhpcy5jdXJyZW5jeSkpIHtcclxuICAgICAgY3VycmVuY3kgPSB0aGlzLmN1cnJlbmN5O1xyXG4gICAgfVxyXG4gICAgdGhpcy5mb3JtLmN1cnJlbmN5LnNldFZhbHVlKGN1cnJlbmN5KTtcclxuXHJcbiAgICBjdXJyZW5jaWVzID0gdGhpcy51c2VyQ3VycmVuY2llc0xpc3Q7XHJcbiAgICBjdXJyZW5jeSA9IGN1cnJlbmNpZXNbMF07XHJcbiAgICBpZiAoZGVmYXVsdEN1cnJlbmN5ICYmIHRoaXMudXNlckN1cnJlbmNpZXNMaXN0LmluY2x1ZGVzKGRlZmF1bHRDdXJyZW5jeSkpIHtcclxuICAgICAgY3VycmVuY3kgPSBkZWZhdWx0Q3VycmVuY3k7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuY3VycmVuY3kgJiYgdGhpcy51c2VyQ3VycmVuY2llc0xpc3QuaW5jbHVkZXModGhpcy5jdXJyZW5jeSkpIHtcclxuICAgICAgY3VycmVuY3kgPSB0aGlzLmN1cnJlbmN5O1xyXG4gICAgfVxyXG4gICAgdGhpcy5mb3JtLnVzZXJDdXJyZW5jeS5zZXRWYWx1ZShjdXJyZW5jeSwge2VtaXRFdmVudDogZmFsc2V9KTtcclxuICAgIGlmIChjdXJyZW5jaWVzLmxlbmd0aCA9PT0gMSAmJiBjdXJyZW5jeSAmJiB0aGlzLmZvcm0ubWV0aG9kLmRpc2FibGVkKSB7XHJcbiAgICAgIHRoaXMuZm9ybS51c2VyQ3VycmVuY3kuZGlzYWJsZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGFzRmVlSGludChvcHRpb25zOiBQYXltZW50RmllbGRPcHRpb25zKSB7XHJcbiAgICByZXR1cm4gb3B0aW9ucy5mZWUgfHwgb3B0aW9ucy5maXhlZEZlZSB8fCBvcHRpb25zLm1pbiB8fCBvcHRpb25zLm1heDtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gIH1cclxuXHJcbiAgZ2V0IGhhc0N1cnJlbmN5TWV0aG9kU2VsZWN0b3IoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy52ZXJzaW9uU3J2Lmhhc0N1cnJlbmN5TWV0aG9kU2VsZWN0b3IgPT09IHRydWU7XHJcbiAgfVxyXG5cclxuICBnZXQgbGFuZygpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlU3J2LmN1cnJlbnRMYW5nO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNrZWxldG9uTGVuZ3RoKCkge1xyXG4gICAgcmV0dXJuIG5ldyBBcnJheSh0aGlzLmZvcm0uZmllbGRzPy5sZW5ndGggfHwgMykuZmlsbCgwKTtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGlmIChjaGFuZ2VzLnR5cGVzICYmIHRoaXMudHlwZXM/Lmxlbmd0aCB8fCBjaGFuZ2VzLmN1cnJlbmN5ICYmIHRoaXMuY3VycmVuY3kpIHtcclxuICAgICAgLy8gR2V0IGNvbmZpZ3VyYXRpb24gZmllbGRzXHJcbiAgICAgIGNvbnN0IGNvdW50cmllcyA9IHRoaXMuY291bnRyaWVzTGlzdDtcclxuICAgICAgY29uc3QgZGVmYXVsdENvdW50cnkgPSB0aGlzLmZvcm0uZGVmYXVsdENvdW50cnk7XHJcbiAgICAgIHRoaXMuZm9ybS5jb3VudHJ5LnNldFZhbHVlKGNvdW50cmllcy5pbmNsdWRlcyhkZWZhdWx0Q291bnRyeSkgPyBkZWZhdWx0Q291bnRyeSA6IGNvdW50cmllc1swXSk7XHJcbiAgICAgIGlmIChjb3VudHJpZXMubGVuZ3RoID09PSAxICYmIHRoaXMuZm9ybS5jb3VudHJ5LnZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5mb3JtLmNvdW50cnkuZGlzYWJsZSgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBtZXRob2RzID0gdGhpcy5tZXRob2RzTGlzdDtcclxuICAgICAgY29uc3QgZGVmYXVsdE1ldGhvZE5hbWUgPSB0aGlzLmZvcm0uZGVmYXVsdE1ldGhvZE5hbWU7XHJcbiAgICAgIGNvbnN0IGRlZmF1bHRNZXRob2QgPSBtZXRob2RzLmZpbmQobSA9PiBtLm5hbWUgPT09IGRlZmF1bHRNZXRob2ROYW1lKT8uaWQ7XHJcbiAgICAgIHRoaXMuZm9ybS5tZXRob2Quc2V0VmFsdWUoZGVmYXVsdE1ldGhvZCB8fCBtZXRob2RzWzBdPy5pZCk7XHJcblxyXG4gICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgaWYgKG1ldGhvZHMubGVuZ3RoID09PSAxICYmIHRoaXMuZm9ybS5jb3VudHJ5LmRpc2FibGVkKSB7XHJcbiAgICAgICAgdGhpcy5mb3JtLm1ldGhvZC5kaXNhYmxlKCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIHRoaXMuc2V0Q3VycmVuY3lWYWx1ZSgpO1xyXG4gICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuXHJcbiAgICAgIHRoaXMuZm9ybVxyXG4gICAgICAgIC5kaXN0aW5jdFZhbHVlQ2hhbmdlcygpXHJcbiAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy51blN1YnNjcmliZXIpXHJcbiAgICAgICAgKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5vblBheW1lbnRDaGFuZ2VkLmVtaXQodGhpcy5mb3JtLmdldFJhd1ZhbHVlKCkpKTtcclxuICAgICAgdGhpcy5mZXRjaEZvcm0oKTtcclxuICAgIH1cclxuICAgIGlmIChjaGFuZ2VzLmZlZU9wdGlvbnMgJiYgIWNoYW5nZXMuZmVlT3B0aW9ucy5maXJzdENoYW5nZSkge1xyXG4gICAgICAvLyBuZWVkIGZvciB0cmlnZ2VyaW5nIG9mIHRoZSBjdXN0b20gdmFsaWRhdG9yXHJcbiAgICAgIHRoaXMuZm9ybS5hbW91bnQ/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIHRoaXMuZm9ybVxyXG4gICAgICAuY291bnRyeVxyXG4gICAgICAudmFsdWVDaGFuZ2VzXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChhLCBiKSA9PiBhID09PSBiKSxcclxuICAgICAgICB0YWtlVW50aWwodGhpcy51blN1YnNjcmliZXIpXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgdGhpcy5mb3JtLnNhdmVEZWZhdWx0Q291bnRyeSgpO1xyXG4gICAgICAgIHRoaXMuZm9ybS5tZXRob2Quc2V0VmFsdWUodGhpcy5tZXRob2RzTGlzdFswXS5pZCwge2VtaXRFdmVudDogZmFsc2V9KTtcclxuXHJcbiAgICAgICAgY29uc3QgbWV0aG9kcyA9IHRoaXMubWV0aG9kc0xpc3Q7XHJcbiAgICAgICAgY29uc3QgZGVmYXVsdE1ldGhvZE5hbWUgPSB0aGlzLmZvcm0uZGVmYXVsdE1ldGhvZE5hbWU7XHJcbiAgICAgICAgY29uc3QgZGVmYXVsdE1ldGhvZCA9IG1ldGhvZHMuZmluZChtID0+IG0ubmFtZSA9PT0gZGVmYXVsdE1ldGhvZE5hbWUpPy5pZDtcclxuICAgICAgICB0aGlzLmZvcm0ubWV0aG9kLnNldFZhbHVlKGRlZmF1bHRNZXRob2QgfHwgbWV0aG9kc1swXS5pZCwge2VtaXRFdmVudDogZmFsc2V9KTtcclxuICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuXHJcbiAgICAgICAgdGhpcy5zZXRDdXJyZW5jeVZhbHVlKCk7XHJcbiAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcblxyXG4gICAgICAgIHRoaXMuZmV0Y2hGb3JtKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgdGhpcy5mb3JtXHJcbiAgICAgIC5tZXRob2RcclxuICAgICAgLnZhbHVlQ2hhbmdlc1xyXG4gICAgICAucGlwZShcclxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgoYSwgYikgPT4gYSA9PT0gYiksXHJcbiAgICAgICAgdGFrZVVudGlsKHRoaXMudW5TdWJzY3JpYmVyKVxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuZm9ybS5tZXRob2QuY2xlYXJWYWxpZGF0b3JzKCk7XHJcbiAgICAgICAgdGhpcy5mb3JtLnNhdmVEZWZhdWx0TWV0aG9kTmFtZSgpO1xyXG4gICAgICAgIHRoaXMuc2V0Q3VycmVuY3lWYWx1ZSgpO1xyXG4gICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIHRoaXMuZmV0Y2hGb3JtKCk7XHJcbiAgICAgIH0pXHJcbiAgICB0aGlzLmZvcm1cclxuICAgICAgLmN1cnJlbmN5XHJcbiAgICAgIC52YWx1ZUNoYW5nZXNcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKGEsIGIpID0+IGEgPT09IGIpLFxyXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLnVuU3Vic2NyaWJlcilcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICB0aGlzLmZldGNoRm9ybSgpO1xyXG4gICAgICAgIHRoaXMuZm9ybS5zYXZlRGVmYXVsdEN1cnJlbmN5KCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmZXRjaEZvcm0oKSB7XHJcbiAgICB0aGlzLmZvcm0uY2FuY2VsUmVxdWVzdHMoKTtcclxuICAgIGlmICh0aGlzLnN0ZXAgIT09IHRoaXMuVEVSTUlOQUxfU1RFUC5QcmVwYXJlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuZm9ybS5yZW1vdmVQYXltZW50Rm9ybUNvbnRyb2xzKCk7XHJcbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgIHRoaXMuZm9ybVxyXG4gICAgICAuaW5pdCgpXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIGlmICghdGhpcy5mb3JtLmhhc1doYXRUb0ZpbGwoKSkge1xyXG4gICAgICAgICAgdGhpcy5zZW5kKCk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIHRoaXMuc2Nyb2xsVG9SZXF1aXNpdHMoKTtcclxuICAgICAgICB0aGlzLmZvcm0ubWFza2VkV2FsbGV0ID0gJyc7XHJcbiAgICAgIH0sIChlcnIpID0+IHtcclxuICAgICAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2Nyb2xsVG9SZXF1aXNpdHMoKSB7XHJcbiAgICBpZiAodGhpcy5yZXF1aXNpdGVzIHx8IHRoaXMuaGludE1ldGhvZCkge1xyXG4gICAgICB0aGlzLm5nU2Nyb2xsQmFyPy5zY3JvbGxUb0VsZW1lbnQodGhpcy5oaW50TWV0aG9kPy5uYXRpdmVFbGVtZW50IHx8IHRoaXMucmVxdWlzaXRlcy5uYXRpdmVFbGVtZW50LCB7XHJcbiAgICAgICAgZHVyYXRpb246IDUwMCxcclxuICAgICAgICB0b3A6IC03NVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBkZXNjcmlwdGlvbigpIHtcclxuICAgIHJldHVybiB0eXBlb2YgdGhpcy5mb3JtLmNvbmZpZz8uZGVzY3JpcHRpb24gPT09ICdmdW5jdGlvbicgPyB0aGlzLmZvcm0uY29uZmlnPy5kZXNjcmlwdGlvbih0aGlzLmZvcm0uZ2V0UmF3VmFsdWUoKSkgOiB0aGlzLmZvcm0uY29uZmlnPy5kZXNjcmlwdGlvbjtcclxuICB9XHJcblxyXG4gIHN1Ym1pdCgpIHtcclxuICAgIGlmICghdGhpcy5jaGVjaygpICYmICF0aGlzLmxvYWRpbmcpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuZm9ybS5tZXRob2ROYW1lID09PSAnY2FyZCcgJiYgIXRoaXMuY2FyZElmcmFtZT8uZmluaXNoZWQpIHtcclxuICAgICAgdGhpcy5mb3JtLmNvbnRpbnVlTG9hZGVyT24oKTtcclxuICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIHRoaXMuY2FyZElmcmFtZT8uc3VibWl0KClcclxuICAgICAgICAudGhlbihzdWNjZXNzID0+ICFzdWNjZXNzICYmIHRoaXMuZm9ybS5jb250aW51ZUxvYWRlck9mZigpKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zZW5kKCk7XHJcbiAgfVxyXG5cclxuICBjYXJkUGFpZCgpIHtcclxuICAgIGlmICghdGhpcy5jaGVjaygpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuc2VuZCgpO1xyXG4gIH1cclxuXHJcbiAgaWZyYW1lRXJyb3IoY29kZTogSTE4Tl9LRVkpIHtcclxuICAgIHRoaXMuZm9ybS5zZXRDREVFcnJvcihjb2RlKTtcclxuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjaGVjaygpIHtcclxuICAgIGlmICh0aGlzLnN0ZXAgPT09IFRlcm1pbmFsU3RlcC5Db25maXJtYXRpb24pIHtcclxuICAgICAgdGhpcy5jb25maXJtLmVtaXQoKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuZm9ybS5jb25maWcgPT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLmZvcm0udmFsaWQgfHwgdGhpcy5lcnJvcikge1xyXG4gICAgICBPYmplY3QudmFsdWVzKHRoaXMuZm9ybS5wYXltZW50LmNvbnRyb2xzKVxyXG4gICAgICAgIC5mb3JFYWNoKChjb250cm9sKSA9PiB7XHJcbiAgICAgICAgICBjb250cm9sLm1hcmtBc0RpcnR5KCk7XHJcbiAgICAgICAgICBjb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgICAgICAgIGNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7ZW1pdEV2ZW50OiBmYWxzZX0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZW5kKCkge1xyXG4gICAgY29uc3QgZGF0YTogVGVybWluYWxQYXltZW50UHJlcGFyZVJlcXVlc3QgPSB0aGlzLmZvcm0uZ2V0UGF5bWVudFZhbHVlKCk7XHJcbiAgICB0aGlzLm1hc2tlZFdhbGxldCA9IHRoaXMuZm9ybS5tYXNrZWRXYWxsZXQ7XHJcbiAgICB0aGlzLnByZXBhcmUuZW1pdChkYXRhKTtcclxuICB9XHJcblxyXG4gIHNlYXJjaENvdW50cnkodmFsdWUpIHtcclxuICAgIHRoaXMuY291bnRyeVNlYXJjaFN0cmluZyA9IHZhbHVlO1xyXG4gICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIGdldCBiYWNrQnRuTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLnN0ZXAgPT09IFRlcm1pbmFsU3RlcC5QcmVwYXJlKSB7XHJcbiAgICAgIHJldHVybiBJMThOX0tFWS5DT05TVFJVQ1RPUl9MQUJFTF9DQU5DRUxfUkVUVVJOO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIEkxOE5fS0VZLkNPTlNUUlVDVE9SX0xBQkVMX1JFVFVSTjtcclxuICB9XHJcblxyXG4gIGNoYW5nZVRleHRGaWVsZFZhbHVlKG1hc2tlZFZhbHVlLCBmaWVsZDogUGF5bWVudEZpZWxkKSB7XHJcbiAgICBpZiAoZmllbGQud2FsbGV0KSB7XHJcbiAgICAgIHRoaXMuZm9ybS5tYXNrZWRXYWxsZXQgPSBtYXNrZWRWYWx1ZTtcclxuICAgICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMudW5TdWJzY3JpYmVyLm5leHQoKTtcclxuICAgIHRoaXMudW5TdWJzY3JpYmVyLnVuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG59XHJcbiIsIjxmb3JtIGNsYXNzPVwiY29uc3RydWN0b3JcIlxyXG4gIFtmb3JtR3JvdXBdPVwiZm9ybVwiXHJcbiAgKG5nU3VibWl0KT1cInN1Ym1pdCgpXCJcclxuICA+XHJcbiAgQGlmIChsb2FkaW5nICE9PSBudWxsKSB7XHJcbiAgICBAaWYgKHN0ZXAgPT09IFRFUk1JTkFMX1NURVAuUHJlcGFyZSkge1xyXG4gICAgICA8ZGl2IGNsYXNzPVwiY29uc3RydWN0b3JfX2ZpZWxkc1wiPlxyXG4gICAgICAgIEBpZiAoY291bnRyeVNlYXJjaFN0cmluZyB8fCBjb3VudHJpZXNMaXN0Lmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb25zdHJ1Y3Rvcl9fZmllbGRcIj5cclxuICAgICAgICAgICAgPGFwcC10cm0tc2VsZWN0IFtkYXRhXT1cImNvdW50cmllc0xpc3RcIlxyXG4gICAgICAgICAgICAgIG5hbWU9XCJjb3VudHJ5XCJcclxuICAgICAgICAgICAgICBbbGFiZWxdPVwiSTE4Tl9LRVkuQ09OU1RSVUNUT1JfTEFCRUxfQ09VTlRSWSB8IHRyYW5zXCJcclxuICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJjb3VudHJ5XCJcclxuICAgICAgICAgICAgICBjbGFzcz1cImMtZmllbGQtc2VsZWN0IHRybS1mb3JtLWZpZWxkXCJcclxuICAgICAgICAgICAgICAoc2VhcmNoKT1cInNlYXJjaENvdW50cnkoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgW3RhYkluZGV4XT1cInRhYkluZGV4XCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHRybVNlbGVjdExhYmVsVGVtcGxhdGUgbGV0LWl0ZW09XCJpdGVtXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZpXCJcclxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIidmaS0nICsgaXRlbS50b0xvd2VyQ2FzZSgpXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZXRob2RfX25hbWVcIj57e2l0ZW0gfCBjb3VudHJ5X3RyYW5zbGF0ZTogbGFuZ319PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDwvYXBwLXRybS1zZWxlY3Q+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICB9XHJcbiAgICAgICAgQGlmIChmb3JtLmNvdW50cnkudmFsdWUpIHtcclxuICAgICAgICAgIDxhcHAtcHMtc2VsZWN0IFttZXRob2RzXT1cIm1ldGhvZHNMaXN0XCJcclxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwibWV0aG9kXCJcclxuICAgICAgICAgICAgW3RhYkluZGV4XT1cInRhYkluZGV4XCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICBAaWYgKGZvcm0uY29uZmlnPy5kZXNjcmlwdGlvbikge1xyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb25zdHJ1Y3Rvcl9faGludCB0ZXh0LS13YXJuXCJcclxuICAgICAgICAgICAgICAgIGFwcC1wcy1zZWxlY3QtaGludFxyXG4gICAgICAgICAgICAgICAgI2hpbnRNZXRob2RcclxuICAgICAgICAgICAgICAgIEBpbnNlcnRSZW1vdmVcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIHt7ZGVzY3JpcHRpb24gfCB0cmFucyB9fVxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIEBpZiAoZm9ybS5pc0NERUZhaWxlZCkge1xyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb25zdHJ1Y3Rvcl9faGludCBjZGUtZXJyb3JcIlxyXG4gICAgICAgICAgICAgICAgYXBwLXBzLXNlbGVjdC1oaW50XHJcbiAgICAgICAgICAgICAgICBAaW5zZXJ0UmVtb3ZlXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICB7e2Zvcm0uZ2V0RXJyb3IoJ2NkZV9lcnJvcicpIHwgdHJhbnMgfX1cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgPC9hcHAtcHMtc2VsZWN0PlxyXG4gICAgICAgIH1cclxuICAgICAgICBAaWYgKCFmb3JtLm1ldGhvZEluZm9Mb2FkaW5nKSB7XHJcbiAgICAgICAgICBAaWYgKGZvcm0ucGF5bWVudEZvcm1GaWVsZE5hbWVzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICA8ZGl2IGZvcm1Hcm91cE5hbWU9XCJwYXltZW50XCJcclxuICAgICAgICAgICAgICAjcGF5bWVudFJlcXVpc2l0ZXNcclxuICAgICAgICAgICAgICBjbGFzcz1cImNvbnN0cnVjdG9yX19maWVsZHMgY29uc3RydWN0b3JfX2ZpZWxkcy0tcmV2ZXJzZVwiPlxyXG4gICAgICAgICAgICAgIEBpZiAoZm9ybS5hbW91bnREeW5hbWljKSB7XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY3VycmVuY3lUcGw7IGNvbnRleHQ6IHtsYWJlbDogSTE4Tl9LRVkuQ09OU1RSVUNUT1JfTEFCRUxfQ1VSUkVOQ1kgfCB0cmFucywgdGFiSW5kZXg6IDB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIEBmb3IgKGZpZWxkIG9mIGZvcm0uZmllbGRzOyB0cmFjayBmaWVsZC5uYW1lOyBsZXQgaSA9ICRpbmRleCkge1xyXG4gICAgICAgICAgICAgICAgQGlmIChmaWVsZC50eXBlID09PSBDT05TVFJVQ1RPUl9GSUVMRF9UWVBFUy5JZnJhbWUpIHtcclxuICAgICAgICAgICAgICAgICAgPGFwcC1jb25zdHJ1Y3Rvci1maWVsZC1pZnJhbWVcclxuICAgICAgICAgICAgICAgICAgICBbaGlkZGVuXT1cImZvcm0uaXNDREVGYWlsZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgIChwYWlkKT1cImNhcmRQYWlkKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICNjYXJkSWZyYW1lXHJcbiAgICAgICAgICAgICAgICAgICAgKGVycm9yKT1cImlmcmFtZUVycm9yKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFt0YWJJbmRleF09XCJmb3JtLmZpZWxkcy5sZW5ndGggLSBpICsgdGFiSW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgPC9hcHAtY29uc3RydWN0b3ItZmllbGQtaWZyYW1lPlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgQGlmIChmaWVsZC50eXBlID09PSBDT05TVFJVQ1RPUl9GSUVMRF9UWVBFUy5TZWxlY3QpIHtcclxuICAgICAgICAgICAgICAgICAgPGFwcC1jb25zdHJ1Y3Rvci1maWVsZC1zZWxlY3RcclxuICAgICAgICAgICAgICAgICAgICBbY29uZmlnXT1cImZpZWxkXCJcclxuICAgICAgICAgICAgICAgICAgICBbaXRlbXNdPVwiZmllbGQ/Lm9wdGlvbnM/Lml0ZW1zXCJcclxuICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImZpZWxkLm5hbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFt0YWJJbmRleF09XCJmb3JtLmZpZWxkcy5sZW5ndGggLSBpICsgdGFiSW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgICA+PC9hcHAtY29uc3RydWN0b3ItZmllbGQtc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgQGlmIChbQ09OU1RSVUNUT1JfRklFTERfVFlQRVMuVGV4dCwgQ09OU1RSVUNUT1JfRklFTERfVFlQRVMuTnVtYmVyLCBDT05TVFJVQ1RPUl9GSUVMRF9UWVBFUy5FbWFpbF0uaW5jbHVkZXMoZmllbGQudHlwZSkpIHtcclxuICAgICAgICAgICAgICAgICAgPGFwcC1jb25zdHJ1Y3Rvci1maWVsZC10ZXh0XHJcbiAgICAgICAgICAgICAgICAgICAgW2NvbmZpZ109XCJmaWVsZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJmaWVsZC5uYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAobWFza2VkVmFsdWVDaGFuZ2UpPVwiY2hhbmdlVGV4dEZpZWxkVmFsdWUoJGV2ZW50LCBmaWVsZClcIlxyXG4gICAgICAgICAgICAgICAgICBbdGFiSW5kZXhdPVwiZm9ybS5maWVsZHMubGVuZ3RoIC0gaSArIHRhYkluZGV4XCI+PC9hcHAtY29uc3RydWN0b3ItZmllbGQtdGV4dD5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIEBpZiAoZmllbGQudHlwZSA9PT0gQ09OU1RSVUNUT1JfRklFTERfVFlQRVMuQW1vdW50KSB7XHJcbiAgICAgICAgICAgICAgICAgIDxhcHAtY29uc3RydWN0b3ItZmllbGQtdGV4dFxyXG4gICAgICAgICAgICAgICAgICAgIFtjb25maWddPVwiZmllbGRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiZmllbGQubmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3RhYkluZGV4XT1cImZvcm0uZmllbGRzLmxlbmd0aCAtIGkgKyB0YWJJbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxhcHAtbWV0aG9kLWFtb3VudC1oaW50IGFwcC1jLXRleHQtaGludFxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb25zdHJ1Y3Rvcl9faGludFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbbG9hZGluZ109XCJmZWVMb2FkaW5nXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cImZlZU9wdGlvbnMgfHwgZmllbGQub3B0aW9uc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgPjwvYXBwLW1ldGhvZC1hbW91bnQtaGludD5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGFwcC1jLXRleHQtc3VmZml4XHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbnN0cnVjdG9yX19jdXJyZW5jeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuY29uc3RydWN0b3JfX2N1cnJlbmN5LS10cmFuc3BhcmVudF09XCJmb3JtLmlzQW1vdW50RWRpdGFibGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImN1cnJlbmN5VHBsOyBjb250ZXh0OiB7dGFiSW5kZXg6IGZvcm0uZmllbGRzLmxlbmd0aCAtIGkgKyB0YWJJbmRleH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9hcHAtY29uc3RydWN0b3ItZmllbGQtdGV4dD5cclxuICAgICAgICAgICAgICAgICAgQGlmIChoYXNDdXJyZW5jeU1ldGhvZFNlbGVjdG9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgPGFwcC10cm0tc2VsZWN0XHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbnN0cnVjdG9yLWZpZWxkXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJJMThOX0tFWS5DT05TVFJVQ1RPUl9MQUJFTF9DVVJSRU5DWSB8IHRyYW5zXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtLmN1cnJlbmN5XCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtzZWFyY2hhYmxlXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtkYXRhXT1cImN1cnJlbmNpZXNMaXN0XCJcclxuICAgICAgICAgICAgICAgICAgICAgIFt0YWJJbmRleF09XCJmb3JtLmZpZWxkcy5sZW5ndGggLSBpICsgdGFiSW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHRybVNlbGVjdExhYmVsVGVtcGxhdGUgbGV0LWl0ZW09XCJpdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidHJtLWljb25cIiBbbmdDbGFzc109XCIndHJtLWN1cnItJyArIGl0ZW0udG9Mb3dlckNhc2UoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJpdGVtXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7e2l0ZW19fVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8L2FwcC10cm0tc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBAaWYgKGZpZWxkLnR5cGUgPT09IENPTlNUUlVDVE9SX0ZJRUxEX1RZUEVTLkRhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgPGFwcC1jb25zdHJ1Y3Rvci1maWVsZC1kYXRlXHJcbiAgICAgICAgICAgICAgICAgICAgW2NvbmZpZ109XCJmaWVsZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJmaWVsZC5uYW1lXCJcclxuICAgICAgICAgICAgICAgICAgW3RhYkluZGV4XT1cImZvcm0uZmllbGRzLmxlbmd0aCAtIGkgKyB0YWJJbmRleFwiPjwvYXBwLWNvbnN0cnVjdG9yLWZpZWxkLWRhdGU+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY3VycmVuY3lUcGwgbGV0LWxhYmVsPVwibGFiZWxcIiBsZXQtdGFiSW5kZXg9XCJ0YWJJbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgPGFwcC10cm0tc2VsZWN0XHJcbiAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJsYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtLnVzZXJDdXJyZW5jeVwiXHJcbiAgICAgICAgICAgICAgICAgIFtzZWFyY2hhYmxlXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgW2RhdGFdPVwidXNlckN1cnJlbmNpZXNMaXN0XCJcclxuICAgICAgICAgICAgICAgICAgW3RhYkluZGV4XT1cInRhYkluZGV4XCJcclxuICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgdHJtU2VsZWN0TGFiZWxUZW1wbGF0ZSBsZXQtaXRlbT1cIml0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRybS1pY29uXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIid0cm0tY3Vyci0nICsgaXRlbS50b0xvd2VyQ2FzZSgpXCJcclxuICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiaXRlbVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICB7e2l0ZW19fVxyXG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9hcHAtdHJtLXNlbGVjdD5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIH1cclxuICAgICAgICB9IEBlbHNlIHtcclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0cm0tc2tlbGV0b24tZmllbGRzXCI+XHJcbiAgICAgICAgICAgIEBmb3IgKGkgb2Ygc2tlbGV0b25MZW5ndGg7IHRyYWNrICRpbmRleCkge1xyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0cm0tc2tlbGV0b24tZmllbGRcIj5cclxuICAgICAgICAgICAgICAgIDxnbS1za2VsZXRvbiBbY291bnRdPVwiMVwiIFtzaGFwZV09XCIncmVjdC1tZCdcIiBbc2l6ZV09XCIxOFwiPjwvZ20tc2tlbGV0b24+XHJcbiAgICAgICAgICAgICAgICA8Z20tc2tlbGV0b24gW2NvdW50XT1cIjFcIiBbc2l6ZV09XCI1MFwiPjwvZ20tc2tlbGV0b24+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH1cclxuICAgICAgICBAaWYgKGVycm9yICYmICFmb3JtLm1ldGhvZEluZm9Mb2FkaW5nKSB7XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidHJtLWVycm9yXCJcclxuICAgICAgICAgICAgQGluc2VydFJlbW92ZVxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgIHt7IGVycm9yIHwgdHJhbnMgfX1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH1cclxuICAgICAgPC9kaXY+XHJcbiAgICB9XHJcbiAgICBAaWYgKHN0ZXAgPT09IFRFUk1JTkFMX1NURVAuQ29uZmlybWF0aW9uKSB7XHJcbiAgICAgIDxhcHAtY29uc3RydWN0b3ItcHJlcGFyYXRpb25cclxuICAgICAgICBbY3VycmVuY3ldPVwicmVzcG9uc2U/LmN1cnJlbmN5XCJcclxuICAgICAgICBbbWV0aG9kTmFtZV09XCJmb3JtLmdldFR5cGVOYW1lQnlJZChyZXNwb25zZS50eXBlSWQpXCJcclxuICAgICAgICBbd2FsbGV0XT1cInJlc3BvbnNlLndhbGxldFwiXHJcbiAgICAgICAgW21hc2tlZFdhbGxldF09XCJtYXNrZWRXYWxsZXRcIlxyXG4gICAgICAgIFthbW91bnRdPVwicmVzcG9uc2UuYW1vdW50XCJcclxuICAgICAgICBbdG90YWxdPVwicmVzcG9uc2UudG90YWxcIlxyXG4gICAgICAgIFtjb25maXJtYXRpb25UZXh0XT1cImZvcm0uY29uZmlnPy5jb25maXJtYXRpb25cIlxyXG4gICAgICAgID5cclxuICAgICAgICBAaWYgKGVycm9yICYmICFmb3JtLnBheW1lbnQucGVuZGluZykge1xyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRybS1lcnJvclwiXHJcbiAgICAgICAgICAgIGFwcC1jb25zdHJ1Y3Rvci1wcmVwYXJhdGlvbi1lcnJvclxyXG4gICAgICAgICAgICBAaW5zZXJ0UmVtb3ZlXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAge3sgZXJyb3IgfCB0cmFucyB9fVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgfVxyXG4gICAgICA8L2FwcC1jb25zdHJ1Y3Rvci1wcmVwYXJhdGlvbj5cclxuICAgIH1cclxuICAgIDxkaXYgY2xhc3M9XCJjb25zdHJ1Y3Rvcl9fYWN0aW9uc1wiPlxyXG4gICAgICA8YnV0dG9uIGNsYXNzPVwidHJtLWJ1dHRvbiB0cm0tYnV0dG9uLS1wcmltYXJ5IGNvbnN0cnVjdG9yX19hY3Rpb25zLWNvbnRpbnVlXCJcclxuICAgICAgICB0eXBlPVwic3VibWl0XCJcclxuICAgICAgICBbdGFiaW5kZXhdPVwiZm9ybS5maWVsZHMubGVuZ3RoICsgdGFiSW5kZXhcIj5cclxuICAgICAgICB7e0kxOE5fS0VZLkNPTlNUUlVDVE9SX0xBQkVMX0NPTlRJTlVFIHwgdHJhbnN9fVxyXG4gICAgICAgIEBpZiAobG9hZGluZykge1xyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0cm0tc3Bpbm5lciB0cm0tc3Bpbm5lci13aGl0ZVwiPjwvc3Bhbj5cclxuICAgICAgICB9XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uIGNsYXNzPVwidHJtLWJ1dHRvbiB0cm0tYnV0dG9uLS1zZWNvbmRhcnkgY29uc3RydWN0b3JfX2FjdGlvbnMtYmFja1wiXHJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgW3RhYmluZGV4XT1cImZvcm0uZmllbGRzLmxlbmd0aCArIHRhYkluZGV4XCJcclxuICAgICAgKGNsaWNrKT1cImJhY2suZW1pdCgpXCI+IHt7IGJhY2tCdG5MYWJlbCB8IHRyYW5zfX08L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gIH0gQGVsc2Uge1xyXG4gICAgPGRpdiBjbGFzcz1cInRybS1za2VsZXRvbi1ncm91cFwiPlxyXG4gICAgICA8Z20tc2tlbGV0b24gW2NvdW50XT1cIjRcIiBbZ2FwXT1cIjIwXCIgW3NpemVdPVwiODBcIj48L2dtLXNrZWxldG9uPlxyXG4gICAgICA8Z20tc2tlbGV0b24gW2NvdW50XT1cIjJcIiBbZ2FwXT1cIjEwXCIgW3NpemVdPVwiNDhcIj48L2dtLXNrZWxldG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgfVxyXG48L2Zvcm0+XHJcbiJdfQ==
|
|
374
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RydWN0b3ItZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90ZXJtaW5hbC10ZW1wbGF0ZS9zcmMvbGliL2FwcC9wYWdlcy9jb21wb25lbnRzL2NvbnN0cnVjdG9yLWZvcm0vY29uc3RydWN0b3ItZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90ZXJtaW5hbC10ZW1wbGF0ZS9zcmMvbGliL2FwcC9wYWdlcy9jb21wb25lbnRzL2NvbnN0cnVjdG9yLWZvcm0vY29uc3RydWN0b3ItZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBRVQsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBR0wsTUFBTSxFQUdOLFNBQVMsRUFDVCxZQUFZLEVBQ2IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFxQyxvQkFBb0IsRUFBRSxZQUFZLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDakcsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFRN0UsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDN0UsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNyRCxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFN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RUFBRSwrQkFBK0IsRUFBRSw2QkFBNkIsRUFBRSx5QkFBeUIsRUFBRSw2QkFBNkIsRUFBRSwrQkFBK0IsRUFBRSxzQkFBc0IsRUFBRSxvQkFBb0IsRUFBRSxrQkFBa0IsRUFBRSxtQkFBbUIsQ0FBQzs4QkFjamMsSUFBSTtzQkFBWixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUlHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0ksYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxJQUFJO3NCQUFiLE1BQU07Z0JBQ0csT0FBTztzQkFBaEIsTUFBTTtnQkFDRyxPQUFPO3NCQUFoQixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDRSxRQUFRO3NCQUFoQixLQUFLO2dCQUUyQyxVQUFVO3NCQUExRCxTQUFTO3VCQUFDLG1CQUFtQixFQUFFLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBQztnQkFDTCxVQUFVO3NCQUFuRCxTQUFTO3VCQUFDLFlBQVksRUFBRSxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUM7Z0JBQ1YsT0FBTztzQkFBcEMsWUFBWTt1QkFBQyxjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBFbGVtZW50UmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBpbmplY3QsXHJcbiAgSW5wdXQsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE9uRGVzdHJveSxcclxuICBPdXRwdXQsXHJcbiAgUXVlcnlMaXN0LFxyXG4gIFNpbXBsZUNoYW5nZXMsIFRlbXBsYXRlUmVmLFxyXG4gIFZpZXdDaGlsZCxcclxuICBWaWV3Q2hpbGRyZW5cclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgUGF5bWVudEZpZWxkLCBQYXltZW50RmllbGRPcHRpb25zLCBQYXltZW50RmllbGRUeXBlRW51bSwgVGVybWluYWxTdGVwIH0gZnJvbSAnLi9tb2RlbHMnO1xyXG5pbXBvcnQgeyBDb25zdHJ1Y3RvckZvcm1TZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9jb25zdHJ1Y3Rvci1mb3JtLnNlcnZpY2UnO1xyXG5pbXBvcnQge1xyXG4gIE1ldGhvZFR5cGUsXHJcbiAgTWV0aG9kVHlwZVR5cGUsXHJcbiAgVGVybWluYWxQYXltZW50Q29uZmlybVJlc3BvbnNlLFxyXG4gIFRlcm1pbmFsUGF5bWVudFByZXBhcmVSZXF1ZXN0LFxyXG4gIFRlcm1pbmFsUGF5bWVudFByZXBhcmVSZXNwb25zZVxyXG59IGZyb20gJy4uLy4uLy4uLy4uL2NvZGVnZW4vbW9kZWwvbW9kZWxzJztcclxuaW1wb3J0IHsgaW5zZXJ0UmVtb3ZlVHJpZ2dlciB9IGZyb20gJy4vLi4vLi4vLi4vaGVscGVycy9pbnNlcnRSZW1vdmVUcmlnZ2VyJztcclxuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZmlyc3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xyXG5pbXBvcnQgeyBDb3VudHJpZXNTb3J0UGlwZSB9IGZyb20gJy4uLy4uLy4uL3BpcGVzL2NvdW50cmllcy1zb3J0LnBpcGUnO1xyXG5pbXBvcnQgeyBOZ1Njcm9sbGJhciB9IGZyb20gJ25neC1zY3JvbGxiYXInO1xyXG5pbXBvcnQgeyBJMThOX0tFWSB9IGZyb20gJy4vLi4vLi4vLi4vaTE4bic7XHJcbmltcG9ydCB7XHJcbiAgQ29uc3RydWN0b3JGaWVsZElmcmFtZUNvbXBvbmVudFxyXG59IGZyb20gXCIuL2NvbXBvbmVudHMvY29uc3RydWN0b3ItZmllbGQtaWZyYW1lL2NvbnN0cnVjdG9yLWZpZWxkLWlmcmFtZS5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgQ291bnRyeVRyYW5zbGF0ZVBpcGUgfSBmcm9tICcuLi8uLi8uLi9waXBlcy9jb3VudHJ5LXRyYW5zbGF0ZS5waXBlJztcclxuaW1wb3J0IHsgVEVSTUlOQUxfVkVSU0lPTl9TRVJWSUNFX1RPS0VOIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29uc3QnO1xyXG5pbXBvcnQgeyBWZXJzaW9uU2VydmljZUludGVyZmFjZSB9IGZyb20gJy4uLy4uLy4uL21vZGVscyc7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBOZ0NsYXNzLCBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgVHJtU2VsZWN0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2NvbXBvbmVudHMvdHJtLXNlbGVjdC90cm0tc2VsZWN0LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7XHJcbiAgVHJtU2VsZWN0TGFiZWxUZW1wbGF0ZURpcmVjdGl2ZVxyXG59IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9jb21wb25lbnRzL3RybS1zZWxlY3QvdHJtLXNlbGVjdC1sYWJlbC10ZW1wbGF0ZS5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBQc1NlbGVjdENvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9wcy1zZWxlY3QvcHMtc2VsZWN0LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7XHJcbiAgQ29uc3RydWN0b3JGaWVsZFNlbGVjdENvbXBvbmVudFxyXG59IGZyb20gJy4vY29tcG9uZW50cy9jb25zdHJ1Y3Rvci1maWVsZC1zZWxlY3QvY29uc3RydWN0b3ItZmllbGQtc2VsZWN0LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IENvbnN0cnVjdG9yRmllbGRUZXh0Q29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2NvbnN0cnVjdG9yLWZpZWxkLXRleHQvY29uc3RydWN0b3ItZmllbGQtdGV4dC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBNZXRob2RBbW91bnRIaW50Q29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL21ldGhvZC1hbW91bnQtaGludC9tZXRob2QtYW1vdW50LWhpbnQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQ29uc3RydWN0b3JGaWVsZERhdGVDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvY29uc3RydWN0b3ItZmllbGQtZGF0ZS9jb25zdHJ1Y3Rvci1maWVsZC1kYXRlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7XHJcbiAgQ29uc3RydWN0b3JQcmVwYXJhdGlvbkNvbXBvbmVudFxyXG59IGZyb20gJy4vY29tcG9uZW50cy9jb25zdHJ1Y3Rvci1wcmVwYXJhdGlvbi9jb25zdHJ1Y3Rvci1wcmVwYXJhdGlvbi5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBUYWJJbmRleEZvY3VzRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy90YWItaW5kZXgtZm9jdXMuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgVHJhbnNsYXRlQnlLZXlQaXBlIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3BpcGVzL3RyYW5zbGF0ZS1ieS1rZXkucGlwZSc7XHJcbmltcG9ydCB7IEdtU2tlbGV0b25Db21wb25lbnQgfSBmcm9tICdAZ21tb25leS9nbS11aS1raXQnO1xyXG5pbXBvcnQgeyBPVEhFUl9DT1VOVFJZX0NPREUgfSBmcm9tIFwiLi4vLi4vLi4vaGVscGVyc1wiO1xyXG5pbXBvcnQgeyBDYXJkU2RrU2VydmljZSB9IGZyb20gXCIuL2NvbXBvbmVudHMvY29uc3RydWN0b3ItZmllbGQtaWZyYW1lL2NhcmQtc2RrLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgVGVybWluYWxUcGxDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi90ZXJtaW5hbC10cGwuY29tcG9uZW50JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLWNvbnN0cnVjdG9yLWZvcm0nLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9jb25zdHJ1Y3Rvci1mb3JtLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9jb25zdHJ1Y3Rvci1mb3JtLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbiAgYW5pbWF0aW9uczogW2luc2VydFJlbW92ZVRyaWdnZXJdLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAgQ29uc3RydWN0b3JGb3JtU2VydmljZSxcclxuICAgIENvdW50cnlUcmFuc2xhdGVQaXBlLCBDb3VudHJpZXNTb3J0UGlwZVxyXG4gIF0sXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbQ291bnRyeVRyYW5zbGF0ZVBpcGUsIENvdW50cmllc1NvcnRQaXBlLCBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgVHJtU2VsZWN0Q29tcG9uZW50LCBUcm1TZWxlY3RMYWJlbFRlbXBsYXRlRGlyZWN0aXZlLCBOZ0NsYXNzLCBQc1NlbGVjdENvbXBvbmVudCwgTmdUZW1wbGF0ZU91dGxldCwgQ29uc3RydWN0b3JGaWVsZElmcmFtZUNvbXBvbmVudCwgQ29uc3RydWN0b3JGaWVsZFNlbGVjdENvbXBvbmVudCwgQ29uc3RydWN0b3JGaWVsZFRleHRDb21wb25lbnQsIE1ldGhvZEFtb3VudEhpbnRDb21wb25lbnQsIENvbnN0cnVjdG9yRmllbGREYXRlQ29tcG9uZW50LCBDb25zdHJ1Y3RvclByZXBhcmF0aW9uQ29tcG9uZW50LCBUYWJJbmRleEZvY3VzRGlyZWN0aXZlLCBDb3VudHJ5VHJhbnNsYXRlUGlwZSwgVHJhbnNsYXRlQnlLZXlQaXBlLCBHbVNrZWxldG9uQ29tcG9uZW50XVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ29uc3RydWN0b3JGb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xyXG4gIHByaXZhdGUgY2QgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xyXG4gIGZvcm0gPSBpbmplY3QoQ29uc3RydWN0b3JGb3JtU2VydmljZSk7XHJcbiAgcHJpdmF0ZSB0cmFuc2xhdGVTcnYgPSBpbmplY3QoVHJhbnNsYXRlU2VydmljZSk7XHJcbiAgcHJpdmF0ZSBjb3VudHJpZXNTb3J0UGlwZSA9IGluamVjdChDb3VudHJpZXNTb3J0UGlwZSk7XHJcbiAgcHJpdmF0ZSBjb3VudHJ5VHJhbnNsYXRlUGlwZSA9IGluamVjdChDb3VudHJ5VHJhbnNsYXRlUGlwZSk7XHJcbiAgcHJpdmF0ZSBuZ1Njcm9sbEJhciA9IGluamVjdChOZ1Njcm9sbGJhcik7XHJcbiAgcHJpdmF0ZSB2ZXJzaW9uU3J2ID0gaW5qZWN0PFZlcnNpb25TZXJ2aWNlSW50ZXJmYWNlPihURVJNSU5BTF9WRVJTSU9OX1NFUlZJQ0VfVE9LRU4pO1xyXG5cclxuICBwcml2YXRlIHVuU3Vic2NyaWJlciA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgcHJpdmF0ZSBwcmVwYXJhdGlvblN0ZXBGaWxsZWQgPSBmYWxzZTtcclxuICBURVJNSU5BTF9TVEVQID0gVGVybWluYWxTdGVwO1xyXG4gIEBJbnB1dCgpIHN0ZXA6IFRlcm1pbmFsU3RlcDtcclxuICBASW5wdXQoKSBlcnJvcj86IHN0cmluZztcclxuICBASW5wdXQoKSByZXNwb25zZTogVGVybWluYWxQYXltZW50UHJlcGFyZVJlc3BvbnNlICYgVGVybWluYWxQYXltZW50Q29uZmlybVJlc3BvbnNlICYge1xyXG4gICAgdHlwZUlkPzogbnVtYmVyO1xyXG4gIH07XHJcbiAgQ09OU1RSVUNUT1JfRklFTERfVFlQRVMgPSBQYXltZW50RmllbGRUeXBlRW51bTtcclxuICBASW5wdXQoKSBmZWVMb2FkaW5nOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpIGZlZU9wdGlvbnM6IFBheW1lbnRGaWVsZE9wdGlvbnM7XHJcbiAgQElucHV0KCkgY3VycmVuY3k6IHN0cmluZztcclxuICBASW5wdXQoKSB1c2VyQ3VycmVuY3k6IHN0cmluZ1tdO1xyXG4gIEBJbnB1dCgpIGxvYWRpbmcgPSBudWxsO1xyXG4gIEBJbnB1dCgpIHR5cGVzOiBNZXRob2RUeXBlW10gPSBbXTtcclxuICBASW5wdXQoKSBjYW5SZXR1cm5Ub1Byb2plY3QgPSB0cnVlO1xyXG4gIEBPdXRwdXQoKSBhbW91bnRDaGFuZ2VkOiBFdmVudEVtaXR0ZXI8bnVtYmVyPiA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xyXG4gIEBPdXRwdXQoKSBiYWNrOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcbiAgQE91dHB1dCgpIHByZXBhcmU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIGNvbmZpcm06IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIG9uUGF5bWVudENoYW5nZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQElucHV0KCkgdGFiSW5kZXg6IG51bWJlcjtcclxuICBjb3VudHJ5U2VhcmNoU3RyaW5nOiBzdHJpbmc7XHJcbiAgQFZpZXdDaGlsZCgncGF5bWVudFJlcXVpc2l0ZXMnLCB7c3RhdGljOiBmYWxzZX0pIHJlcXVpc2l0ZXM6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZCgnaGludE1ldGhvZCcsIHtzdGF0aWM6IGZhbHNlfSkgaGludE1ldGhvZDogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkcmVuKENhcmRTZGtTZXJ2aWNlKSBzZGtMaXN0OiBRdWVyeUxpc3Q8Q2FyZFNka1NlcnZpY2U+O1xyXG4gIG1hc2tlZFdhbGxldDogc3RyaW5nO1xyXG5cclxuICBJMThOX0tFWSA9IEkxOE5fS0VZO1xyXG5cclxuICBnZXQgY291bnRyaWVzTGlzdCgpOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5jb3VudHJpZXNTb3J0UGlwZVxyXG4gICAgICAudHJhbnNmb3JtKFxyXG4gICAgICAgIHRoaXMudHlwZXNcclxuICAgICAgICAgIC5tYXAodHlwZSA9PiB0eXBlLmNvdW50cnlJU09Db2RlKVxyXG4gICAgICAgICAgLmZpbHRlcigodmFsdWUsIGluZGV4LCBzZWxmKSA9PiBzZWxmLmluZGV4T2YodmFsdWUpID09PSBpbmRleClcclxuICAgICAgKVxyXG4gICAgICAuZmlsdGVyKChtOiBzdHJpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXRoaXMuY291bnRyeVNlYXJjaFN0cmluZykge1xyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnN0IHRpdGxlOiBzdHJpbmcgPSB0aGlzLmNvdW50cnlUcmFuc2xhdGVQaXBlLnRyYW5zZm9ybShtKTtcclxuICAgICAgICAgIHJldHVybiB0aXRsZS50b0xvd2VyQ2FzZSgpXHJcbiAgICAgICAgICAgIC5zcGxpdCgnICcpLnNvbWUoXHJcbiAgICAgICAgICAgICAgdHMgPT4gdGhpcy5jb3VudHJ5U2VhcmNoU3RyaW5nLnRvTG93ZXJDYXNlKCkuc3BsaXQoJyAnKS5zb21lKHMgPT4gdHMuaW5jbHVkZXMocykpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldCBtZXRob2RzTGlzdCgpOiBNZXRob2RUeXBlVHlwZVtdIHtcclxuICAgIHJldHVybiB0aGlzLnR5cGVzXHJcbiAgICAgIC5maWx0ZXIodHlwZSA9PiB0eXBlLmNvdW50cnlJU09Db2RlID09PSB0aGlzLmZvcm0uY291bnRyeS52YWx1ZSlcclxuICAgICAgLy8gZGlzdGluY3RcclxuICAgICAgLmZpbHRlcigodHlwZSwgaW5kZXgsIHNlbGYpID0+IHNlbGYubWFwKG0gPT4gbS50eXBlLmlkKS5pbmRleE9mKHR5cGUudHlwZS5pZCkgPT09IGluZGV4KVxyXG4gICAgICAvL3NvcnRpbmcgYnkgdGhlIHByaW9yaXR5XHJcbiAgICAgIC5zb3J0KChtMSwgbTIpID0+IG0xLnByaW9yaXR5ID4gbTIucHJpb3JpdHkgPyAxIDogKChtMS5wcmlvcml0eSA9PT0gbTIucHJpb3JpdHkpID8gMCA6IC0xKSlcclxuICAgICAgLm1hcCh0eXBlID0+IHR5cGUudHlwZSk7XHJcbiAgfVxyXG5cclxuICBnZXQgY3VycmVuY2llc0xpc3QoKSB7XHJcbiAgICByZXR1cm4gdGhpcy50eXBlc1xyXG4gICAgICAuZmlsdGVyKHR5cGUgPT4gdHlwZS5jb3VudHJ5SVNPQ29kZSA9PT0gdGhpcy5mb3JtLmNvdW50cnkudmFsdWUgJiYgdHlwZS50eXBlLmlkID09PSB0aGlzLmZvcm0ubWV0aG9kLnZhbHVlKVxyXG4gICAgICAubWFwKHR5cGUgPT4gdHlwZS5jdXJyZW5jeSlcclxuICB9XHJcblxyXG4gIGdldCB1c2VyQ3VycmVuY2llc0xpc3QoKSB7XHJcbiAgICBjb25zdCBmaWx0ZXJlZFR5cGVzID0gdGhpcy5jdXJyZW5jaWVzTGlzdDtcclxuXHJcbiAgICBpZiAoIXRoaXMudXNlckN1cnJlbmN5KSB7XHJcbiAgICAgIHJldHVybiBmaWx0ZXJlZFR5cGVzO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLnVzZXJDdXJyZW5jeVxyXG4gICAgICAuZmlsdGVyKHVzZXJDdXJyZW5jeSA9PiBmaWx0ZXJlZFR5cGVzLmluY2x1ZGVzKHVzZXJDdXJyZW5jeSkpXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldEN1cnJlbmN5VmFsdWUoKSB7XHJcbiAgICBsZXQgZGVmYXVsdEN1cnJlbmN5ID0gdGhpcy5mb3JtLmRlZmF1bHRDdXJyZW5jeTtcclxuXHJcbiAgICBsZXQgY3VycmVuY2llcyA9IHRoaXMuY3VycmVuY2llc0xpc3Q7XHJcbiAgICBsZXQgY3VycmVuY3kgPSBjdXJyZW5jaWVzWzBdO1xyXG4gICAgaWYgKGRlZmF1bHRDdXJyZW5jeSAmJiB0aGlzLmN1cnJlbmNpZXNMaXN0LmluY2x1ZGVzKGRlZmF1bHRDdXJyZW5jeSkpIHtcclxuICAgICAgY3VycmVuY3kgPSBkZWZhdWx0Q3VycmVuY3k7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuY3VycmVuY3kgJiYgdGhpcy5jdXJyZW5jaWVzTGlzdC5pbmNsdWRlcyh0aGlzLmN1cnJlbmN5KSkge1xyXG4gICAgICBjdXJyZW5jeSA9IHRoaXMuY3VycmVuY3k7XHJcbiAgICB9XHJcbiAgICB0aGlzLmZvcm0uY3VycmVuY3kuc2V0VmFsdWUoY3VycmVuY3kpO1xyXG5cclxuICAgIGN1cnJlbmNpZXMgPSB0aGlzLnVzZXJDdXJyZW5jaWVzTGlzdDtcclxuICAgIGN1cnJlbmN5ID0gY3VycmVuY2llc1swXTtcclxuICAgIGlmIChkZWZhdWx0Q3VycmVuY3kgJiYgdGhpcy51c2VyQ3VycmVuY2llc0xpc3QuaW5jbHVkZXMoZGVmYXVsdEN1cnJlbmN5KSkge1xyXG4gICAgICBjdXJyZW5jeSA9IGRlZmF1bHRDdXJyZW5jeTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5jdXJyZW5jeSAmJiB0aGlzLnVzZXJDdXJyZW5jaWVzTGlzdC5pbmNsdWRlcyh0aGlzLmN1cnJlbmN5KSkge1xyXG4gICAgICBjdXJyZW5jeSA9IHRoaXMuY3VycmVuY3k7XHJcbiAgICB9XHJcbiAgICB0aGlzLmZvcm0udXNlckN1cnJlbmN5LnNldFZhbHVlKGN1cnJlbmN5LCB7ZW1pdEV2ZW50OiBmYWxzZX0pO1xyXG4gICAgaWYgKGN1cnJlbmNpZXMubGVuZ3RoID09PSAxICYmIGN1cnJlbmN5ICYmIHRoaXMuZm9ybS5tZXRob2QuZGlzYWJsZWQpIHtcclxuICAgICAgdGhpcy5mb3JtLnVzZXJDdXJyZW5jeS5kaXNhYmxlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgaGFzQ3VycmVuY3lNZXRob2RTZWxlY3RvcigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnZlcnNpb25TcnYuaGFzQ3VycmVuY3lNZXRob2RTZWxlY3RvciA9PT0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGdldCBsYW5nKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVTcnYuY3VycmVudExhbmc7XHJcbiAgfVxyXG5cclxuICBnZXQgc2tlbGV0b25MZW5ndGgoKSB7XHJcbiAgICByZXR1cm4gbmV3IEFycmF5KHRoaXMuZm9ybS5maWVsZHM/Lmxlbmd0aCB8fCAzKS5maWxsKDApO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgaWYgKGNoYW5nZXMudHlwZXMgJiYgdGhpcy50eXBlcz8ubGVuZ3RoIHx8IGNoYW5nZXMuY3VycmVuY3kgJiYgdGhpcy5jdXJyZW5jeSkge1xyXG4gICAgICAvLyBHZXQgY29uZmlndXJhdGlvbiBmaWVsZHNcclxuICAgICAgY29uc3QgY291bnRyaWVzID0gdGhpcy5jb3VudHJpZXNMaXN0O1xyXG4gICAgICBjb25zdCBkZWZhdWx0Q291bnRyeSA9IHRoaXMuZm9ybS5kZWZhdWx0Q291bnRyeTtcclxuICAgICAgbGV0IGNvdW50cnkgPSBudWxsO1xyXG4gICAgICBpZiAoIWNvdW50cmllcy5pbmNsdWRlcyhkZWZhdWx0Q291bnRyeSkpIHtcclxuICAgICAgICBpZiAoY291bnRyaWVzLmluY2x1ZGVzKE9USEVSX0NPVU5UUllfQ09ERSkpIHtcclxuICAgICAgICAgIGNvdW50cnkgPSBPVEhFUl9DT1VOVFJZX0NPREU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvdW50cnkgPSBkZWZhdWx0Q291bnRyeTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmZvcm0uY291bnRyeS5zZXRWYWx1ZShjb3VudHJ5KTtcclxuICAgICAgaWYgKCFjb3VudHJ5KSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChjb3VudHJpZXMubGVuZ3RoID09PSAxICYmIHRoaXMuZm9ybS5jb3VudHJ5LnZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5mb3JtLmNvdW50cnkuZGlzYWJsZSgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBtZXRob2RzID0gdGhpcy5tZXRob2RzTGlzdDtcclxuICAgICAgY29uc3QgZGVmYXVsdE1ldGhvZE5hbWUgPSB0aGlzLmZvcm0uZGVmYXVsdE1ldGhvZE5hbWU7XHJcbiAgICAgIGNvbnN0IGRlZmF1bHRNZXRob2QgPSBtZXRob2RzLmZpbmQobSA9PiBtLm5hbWUgPT09IGRlZmF1bHRNZXRob2ROYW1lKT8uaWQ7XHJcbiAgICAgIHRoaXMuZm9ybS5tZXRob2Quc2V0VmFsdWUoZGVmYXVsdE1ldGhvZCB8fCBtZXRob2RzWzBdPy5pZCk7XHJcblxyXG4gICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgaWYgKG1ldGhvZHMubGVuZ3RoID09PSAxICYmIHRoaXMuZm9ybS5jb3VudHJ5LmRpc2FibGVkKSB7XHJcbiAgICAgICAgdGhpcy5mb3JtLm1ldGhvZC5kaXNhYmxlKCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIHRoaXMuc2V0Q3VycmVuY3lWYWx1ZSgpO1xyXG4gICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuXHJcbiAgICAgIHRoaXMuZm9ybVxyXG4gICAgICAgIC5kaXN0aW5jdFZhbHVlQ2hhbmdlcygpXHJcbiAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy51blN1YnNjcmliZXIpXHJcbiAgICAgICAgKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5vblBheW1lbnRDaGFuZ2VkLmVtaXQodGhpcy5mb3JtLmdldFJhd1ZhbHVlKCkpKTtcclxuICAgICAgdGhpcy5mZXRjaEZvcm0oKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY2hhbmdlcy5zdGVwPy5jdXJyZW50VmFsdWUgJiYgIWNoYW5nZXMudHlwZXMgJiYgIWNoYW5nZXMuY3VycmVuY3kpIHtcclxuICAgICAgdGhpcy5mZXRjaEZvcm0oKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY2hhbmdlcy5mZWVPcHRpb25zICYmICFjaGFuZ2VzLmZlZU9wdGlvbnMuZmlyc3RDaGFuZ2UpIHtcclxuICAgICAgLy8gbmVlZCBmb3IgdHJpZ2dlcmluZyBvZiB0aGUgY3VzdG9tIHZhbGlkYXRvclxyXG4gICAgICB0aGlzLmZvcm0uYW1vdW50Py51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc3RlcCA9PT0gVGVybWluYWxTdGVwLkNvbmZpcm1hdGlvbikge1xyXG4gICAgICB0aGlzLnByZXBhcmF0aW9uU3RlcEZpbGxlZCA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICB0aGlzLmZvcm1cclxuICAgICAgLmNvdW50cnlcclxuICAgICAgLnZhbHVlQ2hhbmdlc1xyXG4gICAgICAucGlwZShcclxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgoYSwgYikgPT4gYSA9PT0gYiksXHJcbiAgICAgICAgdGFrZVVudGlsKHRoaXMudW5TdWJzY3JpYmVyKVxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIHRoaXMuZm9ybS5zYXZlRGVmYXVsdENvdW50cnkoKTtcclxuICAgICAgICB0aGlzLmZvcm0ubWV0aG9kLnNldFZhbHVlKHRoaXMubWV0aG9kc0xpc3RbMF0uaWQsIHtlbWl0RXZlbnQ6IGZhbHNlfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IG1ldGhvZHMgPSB0aGlzLm1ldGhvZHNMaXN0O1xyXG4gICAgICAgIGNvbnN0IGRlZmF1bHRNZXRob2ROYW1lID0gdGhpcy5mb3JtLmRlZmF1bHRNZXRob2ROYW1lO1xyXG4gICAgICAgIGNvbnN0IGRlZmF1bHRNZXRob2QgPSBtZXRob2RzLmZpbmQobSA9PiBtLm5hbWUgPT09IGRlZmF1bHRNZXRob2ROYW1lKT8uaWQ7XHJcbiAgICAgICAgdGhpcy5mb3JtLm1ldGhvZC5zZXRWYWx1ZShkZWZhdWx0TWV0aG9kIHx8IG1ldGhvZHNbMF0uaWQsIHtlbWl0RXZlbnQ6IGZhbHNlfSk7XHJcbiAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcblxyXG4gICAgICAgIHRoaXMuc2V0Q3VycmVuY3lWYWx1ZSgpO1xyXG4gICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cclxuICAgICAgICB0aGlzLmZldGNoRm9ybSgpO1xyXG4gICAgICB9KTtcclxuICAgIHRoaXMuZm9ybVxyXG4gICAgICAubWV0aG9kXHJcbiAgICAgIC52YWx1ZUNoYW5nZXNcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKGEsIGIpID0+IGEgPT09IGIpLFxyXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLnVuU3Vic2NyaWJlcilcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICB0aGlzLmZvcm0ubWV0aG9kLmNsZWFyVmFsaWRhdG9ycygpO1xyXG4gICAgICAgIHRoaXMuZm9ybS5zYXZlRGVmYXVsdE1ldGhvZE5hbWUoKTtcclxuICAgICAgICB0aGlzLnNldEN1cnJlbmN5VmFsdWUoKTtcclxuICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICB0aGlzLmZldGNoRm9ybSgpO1xyXG4gICAgICB9KVxyXG4gICAgdGhpcy5mb3JtXHJcbiAgICAgIC5jdXJyZW5jeVxyXG4gICAgICAudmFsdWVDaGFuZ2VzXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChhLCBiKSA9PiBhID09PSBiKSxcclxuICAgICAgICB0YWtlVW50aWwodGhpcy51blN1YnNjcmliZXIpXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5mZXRjaEZvcm0oKTtcclxuICAgICAgICB0aGlzLmZvcm0uc2F2ZURlZmF1bHRDdXJyZW5jeSgpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZmV0Y2hGb3JtKCkge1xyXG4gICAgaWYgKCF0aGlzLmZvcm0ubWV0aG9kLnZhbHVlKSB7XHJcbiAgICAgIHRoaXMuZm9ybS5yZWFkeSA9IHRydWU7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuZm9ybS5jYW5jZWxSZXF1ZXN0cygpO1xyXG4gICAgaWYgKHRoaXMuc3RlcCAhPT0gdGhpcy5URVJNSU5BTF9TVEVQLlByZXBhcmUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5mb3JtLnJlbW92ZVBheW1lbnRGb3JtQ29udHJvbHMoKTtcclxuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgdGhpcy5mb3JtXHJcbiAgICAgIC5pbml0KClcclxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnByZXBhcmF0aW9uU3RlcEZpbGxlZCAmJiAhdGhpcy5mb3JtLmhhc1doYXRUb0ZpbGwoKSkge1xyXG4gICAgICAgICAgdGhpcy5zZW5kKCk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZm9ybS5wYXltZW50LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBvbmx5U2VsZjogdHJ1ZSB9KTtcclxuICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICB0aGlzLnNjcm9sbFRvUmVxdWlzaXRzKCk7XHJcbiAgICAgICAgdGhpcy5mb3JtLm1hc2tlZFdhbGxldCA9ICcnO1xyXG4gICAgICB9LCAoZXJyKSA9PiB7XHJcbiAgICAgICAgdGhpcy5mb3JtLnBheW1lbnQudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IG9ubHlTZWxmOiB0cnVlIH0pO1xyXG4gICAgICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzY3JvbGxUb1JlcXVpc2l0cygpIHtcclxuICAgIGlmICh0aGlzLnJlcXVpc2l0ZXMgfHwgdGhpcy5oaW50TWV0aG9kKSB7XHJcbiAgICAgIHRoaXMubmdTY3JvbGxCYXI/LnNjcm9sbFRvRWxlbWVudCh0aGlzLmhpbnRNZXRob2Q/Lm5hdGl2ZUVsZW1lbnQgfHwgdGhpcy5yZXF1aXNpdGVzLm5hdGl2ZUVsZW1lbnQsIHtcclxuICAgICAgICBkdXJhdGlvbjogNTAwLFxyXG4gICAgICAgIHRvcDogLTc1XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGRlc2NyaXB0aW9uKCkge1xyXG4gICAgcmV0dXJuIHR5cGVvZiB0aGlzLmZvcm0uY29uZmlnPy5kZXNjcmlwdGlvbiA9PT0gJ2Z1bmN0aW9uJyA/IHRoaXMuZm9ybS5jb25maWc/LmRlc2NyaXB0aW9uKHRoaXMuZm9ybS5nZXRSYXdWYWx1ZSgpKSA6IHRoaXMuZm9ybS5jb25maWc/LmRlc2NyaXB0aW9uO1xyXG4gIH1cclxuXHJcbiAgc3VibWl0KCkge1xyXG4gICAgaWYgKHRoaXMuZmVlTG9hZGluZykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zdGVwID09PSBUZXJtaW5hbFN0ZXAuQ29uZmlybWF0aW9uKSB7XHJcbiAgICAgIHRoaXMuY29uZmlybS5lbWl0KCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5mb3JtLmNvbmZpZyA9PT0gbnVsbCB8fCAhdGhpcy5mb3JtLnJlYWR5KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMudHJpZ2dlcklmcmFtZVN1Ym1pdCgpO1xyXG4gICAgaWYgKHRoaXMuZm9ybS5pbnZhbGlkIHx8IHRoaXMuZXJyb3IpIHtcclxuICAgICAgT2JqZWN0LnZhbHVlcyh0aGlzLmZvcm0uY29udHJvbHMpLmZvckVhY2goKGNvbnRyb2wpID0+IHtcclxuICAgICAgICBjb250cm9sLm1hcmtBc0RpcnR5KCk7XHJcbiAgICAgICAgY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgICBPYmplY3QudmFsdWVzKHRoaXMuZm9ybS5wYXltZW50LmNvbnRyb2xzKS5mb3JFYWNoKChjb250cm9sKSA9PiB7XHJcbiAgICAgICAgY29udHJvbC5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgICAgIGNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgICAgIGNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmZvcm0ucGVuZGluZykge1xyXG4gICAgICB0aGlzLmZvcm0uc3RhdHVzQ2hhbmdlc1xyXG4gICAgICAgIC5waXBlKGZpcnN0KCksIHRha2VVbnRpbCh0aGlzLnVuU3Vic2NyaWJlcikpXHJcbiAgICAgICAgLnN1YnNjcmliZSgoc3RhdHVzKSA9PiB7XHJcbiAgICAgICAgICBpZiAoc3RhdHVzID09PSAnVkFMSUQnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VuZCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zZW5kKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRyaWdnZXJJZnJhbWVTdWJtaXQoKSB7XHJcbiAgICBpZiAoIXRoaXMuZm9ybS5yZWFkeUlmcmFtZXNTdWJtaXQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zZGtMaXN0Py5mb3JFYWNoKChzZGs6IENhcmRTZGtTZXJ2aWNlKSA9PiBzZGsuc3VibWl0KCkpO1xyXG4gICAgdGhpcy5mb3JtLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHlJZnJhbWVzKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNlbmQoKSB7XHJcbiAgICBjb25zdCBkYXRhOiBUZXJtaW5hbFBheW1lbnRQcmVwYXJlUmVxdWVzdCA9IHRoaXMuZm9ybS5nZXRQYXltZW50VmFsdWUoKTtcclxuICAgIHRoaXMubWFza2VkV2FsbGV0ID0gdGhpcy5mb3JtLm1hc2tlZFdhbGxldDtcclxuICAgIHRoaXMucHJlcGFyZS5lbWl0KGRhdGEpO1xyXG4gIH1cclxuXHJcbiAgc2VhcmNoQ291bnRyeSh2YWx1ZSkge1xyXG4gICAgdGhpcy5jb3VudHJ5U2VhcmNoU3RyaW5nID0gdmFsdWU7XHJcbiAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGJhY2tCdG5MYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuc3RlcCA9PT0gVGVybWluYWxTdGVwLlByZXBhcmUpIHtcclxuICAgICAgcmV0dXJuIEkxOE5fS0VZLkNPTlNUUlVDVE9SX0xBQkVMX0NBTkNFTF9SRVRVUk47XHJcbiAgICB9XHJcbiAgICByZXR1cm4gSTE4Tl9LRVkuQ09OU1RSVUNUT1JfTEFCRUxfUkVUVVJOO1xyXG4gIH1cclxuXHJcbiAgY2hhbmdlVGV4dEZpZWxkVmFsdWUobWFza2VkVmFsdWUsIGZpZWxkOiBQYXltZW50RmllbGQpIHtcclxuICAgIGlmIChmaWVsZC53YWxsZXQpIHtcclxuICAgICAgdGhpcy5mb3JtLm1hc2tlZFdhbGxldCA9IG1hc2tlZFZhbHVlO1xyXG4gICAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy51blN1YnNjcmliZXIubmV4dCgpO1xyXG4gICAgdGhpcy51blN1YnNjcmliZXIudW5zdWJzY3JpYmUoKTtcclxuICB9XHJcbn1cclxuIiwiPGZvcm0gY2xhc3M9XCJjb25zdHJ1Y3RvclwiXHJcbiAgW2Zvcm1Hcm91cF09XCJmb3JtXCJcclxuICAobmdTdWJtaXQpPVwic3VibWl0KClcIlxyXG4gID5cclxuICBAaWYgKGxvYWRpbmcgIT09IG51bGwpIHtcclxuICAgIEBpZiAoc3RlcCA9PT0gVEVSTUlOQUxfU1RFUC5QcmVwYXJlKSB7XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb25zdHJ1Y3Rvcl9fZmllbGRzXCI+XHJcbiAgICAgICAgQGlmIChjb3VudHJ5U2VhcmNoU3RyaW5nIHx8IGNvdW50cmllc0xpc3QubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnN0cnVjdG9yX19maWVsZFwiPlxyXG4gICAgICAgICAgICA8YXBwLXRybS1zZWxlY3QgW2RhdGFdPVwiY291bnRyaWVzTGlzdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaW5zZXJ0UmVtb3ZlXHJcbiAgICAgICAgICAgICAgbmFtZT1cImNvdW50cnlcIlxyXG4gICAgICAgICAgICAgIFtsYWJlbF09XCJJMThOX0tFWS5DT05TVFJVQ1RPUl9MQUJFTF9DT1VOVFJZIHwgdHJhbnNcIlxyXG4gICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImNvdW50cnlcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwiYy1maWVsZC1zZWxlY3QgdHJtLWZvcm0tZmllbGRcIlxyXG4gICAgICAgICAgICAgIChzZWFyY2gpPVwic2VhcmNoQ291bnRyeSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICBbdGFiSW5kZXhdPVwidGFiSW5kZXhcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgdHJtU2VsZWN0TGFiZWxUZW1wbGF0ZSBsZXQtaXRlbT1cIml0ZW1cIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmlcIlxyXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiJ2ZpLScgKyBpdGVtLnRvTG93ZXJDYXNlKClcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1ldGhvZF9fbmFtZVwiPnt7aXRlbSB8IGNvdW50cnlfdHJhbnNsYXRlOiBsYW5nfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9hcHAtdHJtLXNlbGVjdD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH1cclxuICAgICAgICBAaWYgKGZvcm0uY291bnRyeS52YWx1ZSkge1xyXG4gICAgICAgICAgPGFwcC1wcy1zZWxlY3QgW21ldGhvZHNdPVwibWV0aG9kc0xpc3RcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgQGluc2VydFJlbW92ZVxyXG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJtZXRob2RcIlxyXG4gICAgICAgICAgICBbdGFiSW5kZXhdPVwidGFiSW5kZXhcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgIEBpZiAoZm9ybS5jb25maWc/LmRlc2NyaXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnN0cnVjdG9yX19oaW50IHRleHQtLXdhcm5cIlxyXG4gICAgICAgICAgICAgICAgYXBwLXBzLXNlbGVjdC1oaW50XHJcbiAgICAgICAgICAgICAgICAjaGludE1ldGhvZFxyXG4gICAgICAgICAgICAgICAgQGluc2VydFJlbW92ZVxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAge3tkZXNjcmlwdGlvbiB8IHRyYW5zIH19XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIDwvYXBwLXBzLXNlbGVjdD5cclxuXHJcbiAgICAgICAgICBAaWYgKFxyXG4gICAgICAgICAgICBmb3JtLm1ldGhvZD8uaGFzRXJyb3IoJ3JlcXVpcmVkJykgJiZcclxuICAgICAgICAgICAgZm9ybS5tZXRob2QudG91Y2hlZCAmJlxyXG4gICAgICAgICAgICBmb3JtLm1ldGhvZC5kaXJ0eVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdtLWVycm9yXCIgQGluc2VydFJlbW92ZT5cclxuICAgICAgICAgICAgICB7eyBJMThOX0tFWS5WQUxJREFUSU9OX1JFUVVJUkVEIHwgdHJhbnMgfX1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBAaWYgKGZvcm0ucmVhZHkpIHtcclxuICAgICAgICAgICAgPGRpdiBmb3JtR3JvdXBOYW1lPVwicGF5bWVudFwiXHJcbiAgICAgICAgICAgICAgICAgQGluc2VydFJlbW92ZVxyXG4gICAgICAgICAgICAgICNwYXltZW50UmVxdWlzaXRlc1xyXG4gICAgICAgICAgICAgIGNsYXNzPVwiY29uc3RydWN0b3JfX2ZpZWxkcyBjb25zdHJ1Y3Rvcl9fZmllbGRzLS1yZXZlcnNlXCI+XHJcbiAgICAgICAgICAgICAgQGlmIChmb3JtLm1ldGhvZC52YWx1ZSAmJiBmb3JtLmFtb3VudER5bmFtaWMpIHtcclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjdXJyZW5jeVRwbDsgY29udGV4dDoge2xhYmVsOiBJMThOX0tFWS5DT05TVFJVQ1RPUl9MQUJFTF9DVVJSRU5DWSB8IHRyYW5zLCB0YWJJbmRleDogMH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgQGZvciAoZmllbGQgb2YgZm9ybS5maWVsZHM7IHRyYWNrIGZpZWxkLm5hbWU7IGxldCBpID0gJGluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICBAaWYgKGZpZWxkLnR5cGUgPT09IENPTlNUUlVDVE9SX0ZJRUxEX1RZUEVTLklmcmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICBAaWYgKGZvcm0ucGF5bWVudC5nZXQoZmllbGQubmFtZSk/Lmhhc0Vycm9yKCdjZGVfZXJyb3InKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb25zdHJ1Y3Rvcl9faGludCBjZGUtZXJyb3JcIiBAaW5zZXJ0UmVtb3ZlPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3tcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybS5wYXltZW50LmdldChmaWVsZC5uYW1lKS5nZXRFcnJvcignY2RlX2Vycm9yJylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRyYW5zXHJcbiAgICAgICAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIDxhcHAtY29uc3RydWN0b3ItZmllbGQtaWZyYW1lXHJcbiAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJmaWVsZC5uYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICBAaW5zZXJ0UmVtb3ZlXHJcbiAgICAgICAgICAgICAgICAgICAgW2hpZGRlbl09XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybS5wYXltZW50LmdldChmaWVsZC5uYW1lKT8uaGFzRXJyb3IoJ2NkZV9lcnJvcicpXHJcbiAgICAgICAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgICAgIFt0YWJJbmRleF09XCJmb3JtLmZpZWxkcy5sZW5ndGggLSBpICsgdGFiSW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgIDwvYXBwLWNvbnN0cnVjdG9yLWZpZWxkLWlmcmFtZT5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIEBpZiAoZmllbGQudHlwZSA9PT0gQ09OU1RSVUNUT1JfRklFTERfVFlQRVMuU2VsZWN0KSB7XHJcbiAgICAgICAgICAgICAgICAgIDxhcHAtY29uc3RydWN0b3ItZmllbGQtc2VsZWN0XHJcbiAgICAgICAgICAgICAgICAgICAgQGluc2VydFJlbW92ZVxyXG4gICAgICAgICAgICAgICAgICAgIFtjb25maWddPVwiZmllbGRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtpdGVtc109XCJmaWVsZD8ub3B0aW9ucz8uaXRlbXNcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiZmllbGQubmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3RhYkluZGV4XT1cImZvcm0uZmllbGRzLmxlbmd0aCAtIGkgKyB0YWJJbmRleFwiXHJcbiAgICAgICAgICAgICAgICAgID48L2FwcC1jb25zdHJ1Y3Rvci1maWVsZC1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBAaWYgKFtDT05TVFJVQ1RPUl9GSUVMRF9UWVBFUy5UZXh0LCBDT05TVFJVQ1RPUl9GSUVMRF9UWVBFUy5OdW1iZXIsIENPTlNUUlVDVE9SX0ZJRUxEX1RZUEVTLkVtYWlsXS5pbmNsdWRlcyhmaWVsZC50eXBlKSkge1xyXG4gICAgICAgICAgICAgICAgICA8YXBwLWNvbnN0cnVjdG9yLWZpZWxkLXRleHRcclxuICAgICAgICAgICAgICAgICAgICBAaW5zZXJ0UmVtb3ZlXHJcbiAgICAgICAgICAgICAgICAgICAgW2NvbmZpZ109XCJmaWVsZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJmaWVsZC5uYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAobWFza2VkVmFsdWVDaGFuZ2UpPVwiY2hhbmdlVGV4dEZpZWxkVmFsdWUoJGV2ZW50LCBmaWVsZClcIlxyXG4gICAgICAgICAgICAgICAgICBbdGFiSW5kZXhdPVwiZm9ybS5maWVsZHMubGVuZ3RoIC0gaSArIHRhYkluZGV4XCI+PC9hcHAtY29uc3RydWN0b3ItZmllbGQtdGV4dD5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIEBpZiAoZmllbGQudHlwZSA9PT0gQ09OU1RSVUNUT1JfRklFTERfVFlQRVMuQW1vdW50KSB7XHJcbiAgICAgICAgICAgICAgICAgIDxhcHAtY29uc3RydWN0b3ItZmllbGQtdGV4dFxyXG4gICAgICAgICAgICAgICAgICAgIEBpbnNlcnRSZW1vdmVcclxuICAgICAgICAgICAgICAgICAgICBbY29uZmlnXT1cImZpZWxkXCJcclxuICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImZpZWxkLm5hbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFt0YWJJbmRleF09XCJmb3JtLmZpZWxkcy5sZW5ndGggLSBpICsgdGFiSW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YXBwLW1ldGhvZC1hbW91bnQtaGludCBhcHAtYy10ZXh0LWhpbnRcclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29uc3RydWN0b3JfX2hpbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2xvYWRpbmddPVwiZmVlTG9hZGluZ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJmZWVPcHRpb25zIHx8IGZpZWxkLm9wdGlvbnNcIlxyXG4gICAgICAgICAgICAgICAgICAgID48L2FwcC1tZXRob2QtYW1vdW50LWhpbnQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBhcHAtYy10ZXh0LXN1ZmZpeFxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb25zdHJ1Y3Rvcl9fY3VycmVuY3lcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmNvbnN0cnVjdG9yX19jdXJyZW5jeS0tdHJhbnNwYXJlbnRdPVwiZm9ybS5pc0Ftb3VudEVkaXRhYmxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjdXJyZW5jeVRwbDsgY29udGV4dDoge3RhYkluZGV4OiBmb3JtLmZpZWxkcy5sZW5ndGggLSBpICsgdGFiSW5kZXh9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvYXBwLWNvbnN0cnVjdG9yLWZpZWxkLXRleHQ+XHJcbiAgICAgICAgICAgICAgICAgIEBpZiAoaGFzQ3VycmVuY3lNZXRob2RTZWxlY3Rvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIDxhcHAtdHJtLXNlbGVjdFxyXG4gICAgICAgICAgICAgICAgICAgICAgQGluc2VydFJlbW92ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb25zdHJ1Y3Rvci1maWVsZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiSTE4Tl9LRVkuQ09OU1RSVUNUT1JfTEFCRUxfQ1VSUkVOQ1kgfCB0cmFuc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybS5jdXJyZW5jeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbc2VhcmNoYWJsZV09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbZGF0YV09XCJjdXJyZW5jaWVzTGlzdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbdGFiSW5kZXhdPVwiZm9ybS5maWVsZHMubGVuZ3RoIC0gaSArIHRhYkluZGV4XCJcclxuICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSB0cm1TZWxlY3RMYWJlbFRlbXBsYXRlIGxldC1pdGVtPVwiaXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRybS1pY29uXCIgW25nQ2xhc3NdPVwiJ3RybS1jdXJyLScgKyBpdGVtLnRvTG93ZXJDYXNlKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiaXRlbVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3tpdGVtfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9hcHAtdHJtLXNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgQGlmIChmaWVsZC50eXBlID09PSBDT05TVFJVQ1RPUl9GSUVMRF9UWVBFUy5EYXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgIDxhcHAtY29uc3RydWN0b3ItZmllbGQtZGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgIEBpbnNlcnRSZW1vdmVcclxuICAgICAgICAgICAgICAgICAgICBbY29uZmlnXT1cImZpZWxkXCJcclxuICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImZpZWxkLm5hbWVcIlxyXG4gICAgICAgICAgICAgICAgICBbdGFiSW5kZXhdPVwiZm9ybS5maWVsZHMubGVuZ3RoIC0gaSArIHRhYkluZGV4XCI+PC9hcHAtY29uc3RydWN0b3ItZmllbGQtZGF0ZT5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjdXJyZW5jeVRwbCBsZXQtbGFiZWw9XCJsYWJlbFwiIGxldC10YWJJbmRleD1cInRhYkluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICA8YXBwLXRybS1zZWxlY3RcclxuICAgICAgICAgICAgICAgICAgQGluc2VydFJlbW92ZVxyXG4gICAgICAgICAgICAgICAgICBbbGFiZWxdPVwibGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybS51c2VyQ3VycmVuY3lcIlxyXG4gICAgICAgICAgICAgICAgICBbc2VhcmNoYWJsZV09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgIFtkYXRhXT1cInVzZXJDdXJyZW5jaWVzTGlzdFwiXHJcbiAgICAgICAgICAgICAgICAgIFt0YWJJbmRleF09XCJ0YWJJbmRleFwiXHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHRybVNlbGVjdExhYmVsVGVtcGxhdGUgbGV0LWl0ZW09XCJpdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0cm0taWNvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCIndHJtLWN1cnItJyArIGl0ZW0udG9Mb3dlckNhc2UoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIml0ZW1cIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAge3tpdGVtfX1cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvYXBwLXRybS1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgfSBAZWxzZSB7XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidHJtLXNrZWxldG9uLWZpZWxkc1wiPlxyXG4gICAgICAgICAgICBAZm9yIChpIG9mIHNrZWxldG9uTGVuZ3RoOyB0cmFjayAkaW5kZXgpIHtcclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHJtLXNrZWxldG9uLWZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgICA8Z20tc2tlbGV0b24gW2NvdW50XT1cIjFcIiBbc2hhcGVdPVwiJ3JlY3QtbWQnXCIgW3NpemVdPVwiMThcIj48L2dtLXNrZWxldG9uPlxyXG4gICAgICAgICAgICAgICAgPGdtLXNrZWxldG9uIFtjb3VudF09XCIxXCIgW3NpemVdPVwiNTBcIj48L2dtLXNrZWxldG9uPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICB9XHJcbiAgICAgICAgQGlmIChlcnJvciAmJiAhZm9ybS5tZXRob2RJbmZvTG9hZGluZykge1xyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRybS1lcnJvclwiXHJcbiAgICAgICAgICAgIEBpbnNlcnRSZW1vdmVcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICB7eyBlcnJvciB8IHRyYW5zIH19XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICB9XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgfVxyXG4gICAgQGlmIChzdGVwID09PSBURVJNSU5BTF9TVEVQLkNvbmZpcm1hdGlvbikge1xyXG4gICAgICA8YXBwLWNvbnN0cnVjdG9yLXByZXBhcmF0aW9uXHJcbiAgICAgICAgQGluc2VydFJlbW92ZVxyXG4gICAgICAgIFtjdXJyZW5jeV09XCJyZXNwb25zZT8uY3VycmVuY3lcIlxyXG4gICAgICAgIFttZXRob2ROYW1lXT1cImZvcm0uZ2V0VHlwZU5hbWVCeUlkKHJlc3BvbnNlLnR5cGVJZClcIlxyXG4gICAgICAgIFt3YWxsZXRdPVwicmVzcG9uc2Uud2FsbGV0XCJcclxuICAgICAgICBbbWFza2VkV2FsbGV0XT1cIm1hc2tlZFdhbGxldFwiXHJcbiAgICAgICAgW2Ftb3VudF09XCJyZXNwb25zZS5hbW91bnRcIlxyXG4gICAgICAgIFt0b3RhbF09XCJyZXNwb25zZS50b3RhbFwiXHJcbiAgICAgICAgW2NvbmZpcm1hdGlvblRleHRdPVwiZm9ybS5jb25maWc/LmNvbmZpcm1hdGlvblwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgIEBpZiAoZXJyb3IgJiYgIWZvcm0ucGF5bWVudC5wZW5kaW5nKSB7XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidHJtLWVycm9yXCJcclxuICAgICAgICAgICAgYXBwLWNvbnN0cnVjdG9yLXByZXBhcmF0aW9uLWVycm9yXHJcbiAgICAgICAgICAgIEBpbnNlcnRSZW1vdmVcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICB7eyBlcnJvciB8IHRyYW5zIH19XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICB9XHJcbiAgICAgIDwvYXBwLWNvbnN0cnVjdG9yLXByZXBhcmF0aW9uPlxyXG4gICAgfVxyXG4gICAgPGRpdiBjbGFzcz1cImNvbnN0cnVjdG9yX19hY3Rpb25zXCJcclxuICAgICAgICAgQGluc2VydFJlbW92ZT5cclxuICAgICAgPGJ1dHRvbiBjbGFzcz1cInRybS1idXR0b24gdHJtLWJ1dHRvbi0tcHJpbWFyeSBjb25zdHJ1Y3Rvcl9fYWN0aW9ucy1jb250aW51ZVwiXHJcbiAgICAgICAgdHlwZT1cInN1Ym1pdFwiXHJcbiAgICAgICAgW3RhYmluZGV4XT1cImZvcm0uZmllbGRzLmxlbmd0aCArIHRhYkluZGV4XCI+XHJcbiAgICAgICAge3tJMThOX0tFWS5DT05TVFJVQ1RPUl9MQUJFTF9DT05USU5VRSB8IHRyYW5zfX1cclxuICAgICAgICBAaWYgKGxvYWRpbmcpIHtcclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidHJtLXNwaW5uZXIgdHJtLXNwaW5uZXItd2hpdGVcIj48L3NwYW4+XHJcbiAgICAgICAgfVxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvbiBjbGFzcz1cInRybS1idXR0b24gdHJtLWJ1dHRvbi0tc2Vjb25kYXJ5IGNvbnN0cnVjdG9yX19hY3Rpb25zLWJhY2tcIlxyXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgIFt0YWJpbmRleF09XCJmb3JtLmZpZWxkcy5sZW5ndGggKyB0YWJJbmRleFwiXHJcbiAgICAgIChjbGljayk9XCJiYWNrLmVtaXQoKVwiPiB7eyBiYWNrQnRuTGFiZWwgfCB0cmFuc319PC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICB9IEBlbHNlIHtcclxuICAgIDxkaXYgY2xhc3M9XCJ0cm0tc2tlbGV0b24tZ3JvdXBcIj5cclxuICAgICAgPGdtLXNrZWxldG9uIFtjb3VudF09XCI0XCIgW2dhcF09XCIyMFwiIFtzaXplXT1cIjgwXCI+PC9nbS1za2VsZXRvbj5cclxuICAgICAgPGdtLXNrZWxldG9uIFtjb3VudF09XCIyXCIgW2dhcF09XCIxMFwiIFtzaXplXT1cIjQ4XCI+PC9nbS1za2VsZXRvbj5cclxuICAgIDwvZGl2PlxyXG4gIH1cclxuPC9mb3JtPlxyXG4iXX0=
|