@hitsoft/fbdocumentflow 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/components/hit-document-scenarios/components/hit-document-scenario.component.mjs +25 -19
- package/esm2020/lib/components/hit-document-transfers/components/hit-document-transfer-detail.component.mjs +37 -24
- package/esm2020/lib/components/hit-document-transfers/components/hit-document-transfer.component.mjs +44 -30
- package/esm2020/lib/components/hit-partner-mappings/components/hit-partner-mapping.component.mjs +3 -3
- package/esm2020/lib/components/hit-project-parameters/components/hit-project-parameter.component.mjs +3 -3
- package/esm2020/lib/components/hit-sap-company-profiles/components/hit-sap-company-profile.component.mjs +3 -13
- package/esm2020/lib/proxy/sap-company-profiles/models.mjs +2 -7
- package/fesm2015/hitsoft-fbdocumentflow.mjs +103 -90
- package/fesm2015/hitsoft-fbdocumentflow.mjs.map +1 -1
- package/fesm2020/hitsoft-fbdocumentflow.mjs +103 -87
- package/fesm2020/hitsoft-fbdocumentflow.mjs.map +1 -1
- package/lib/components/hit-document-scenarios/components/hit-document-scenario.component.d.ts +3 -1
- package/lib/components/hit-document-transfers/components/hit-document-transfer-detail.component.d.ts +3 -1
- package/lib/components/hit-document-transfers/components/hit-document-transfer.component.d.ts +5 -1
- package/lib/components/hit-sap-company-profiles/components/hit-sap-company-profile.component.d.ts +1 -5
- package/lib/proxy/sap-company-profiles/models.d.ts +0 -9
- package/package.json +1 -1
|
@@ -10,8 +10,9 @@ import * as i2 from "../../../proxy/document-transfers";
|
|
|
10
10
|
import * as i3 from "../../../proxy/document-scenarios";
|
|
11
11
|
import * as i4 from "../../../proxy/sap-company-profiles";
|
|
12
12
|
import * as i5 from "@abp/ng.theme.shared";
|
|
13
|
-
import * as i6 from "@
|
|
14
|
-
import * as i7 from "@angular/
|
|
13
|
+
import * as i6 from "@abp/ng.core";
|
|
14
|
+
import * as i7 from "@angular/common";
|
|
15
|
+
import * as i8 from "@angular/forms";
|
|
15
16
|
const DOCUMENT_TRANSFER_STATUS_DRAFT = 0;
|
|
16
17
|
const DOCUMENT_TRANSFER_STATUS_COMPLETED = 2;
|
|
17
18
|
const DOCUMENT_TRANSFER_STATUS_CANCELLED = 4;
|
|
@@ -19,31 +20,26 @@ const DOCUMENT_TRANSFER_LEG_STATUS_PENDING = 0;
|
|
|
19
20
|
const DOCUMENT_TRANSFER_LEG_STATUS_SUCCESS = 1;
|
|
20
21
|
const DOCUMENT_TRANSFER_LEG_STATUS_FAILED = 2;
|
|
21
22
|
export class HitDocumentTransferDetailComponent {
|
|
22
|
-
constructor(route, router, service, scenarioService, companyService, confirmation) {
|
|
23
|
+
constructor(route, router, service, scenarioService, companyService, confirmation, localization) {
|
|
23
24
|
this.route = route;
|
|
24
25
|
this.router = router;
|
|
25
26
|
this.service = service;
|
|
26
27
|
this.scenarioService = scenarioService;
|
|
27
28
|
this.companyService = companyService;
|
|
28
29
|
this.confirmation = confirmation;
|
|
30
|
+
this.localization = localization;
|
|
29
31
|
this.isNew = false;
|
|
30
32
|
this.newState = null;
|
|
31
33
|
this.scenarios = [];
|
|
32
34
|
this.scenarioId = '';
|
|
33
35
|
this.isFetchingScenario = false;
|
|
34
36
|
this.companies = [];
|
|
35
|
-
this.legBehaviors = [
|
|
36
|
-
{ value: LegBehavior.IntermediateChain, label: 'Ara Şirket' },
|
|
37
|
-
{ value: LegBehavior.ConstructionChain, label: 'Construction' },
|
|
38
|
-
];
|
|
37
|
+
this.legBehaviors = [];
|
|
39
38
|
// Spec §14 (18.09.2026 kararı) - süreç parametrik. Aktarım henüz oluşturulmadıysa (isNew) kullanıcı bu
|
|
40
39
|
// ekranda "Hedef Belge Durumu"nu seçebilir (kaynaktan bağımsız). Aktarım oluştuktan sonra bu alan
|
|
41
40
|
// backend'de sabitlenir (DocumentTransfer.TargetDocumentLifecycle immutable), bu yüzden workingCopy
|
|
42
41
|
// varken salt-okunur gösterilir. Kullanıcı isteğiyle Kaynak Belge Durumu ile AYNI etiketler kullanılır.
|
|
43
|
-
this.documentLifecycleOptions = [
|
|
44
|
-
{ value: SapDocumentLifecycle.Posted, label: 'Kayıtlı Müşteri Faturası' },
|
|
45
|
-
{ value: SapDocumentLifecycle.Draft, label: 'Taslak Müşteri Faturası' },
|
|
46
|
-
];
|
|
42
|
+
this.documentLifecycleOptions = [];
|
|
47
43
|
// Spec ek karar (18.09.2026) - hedef Taslak iken Construction bacağının (OPOR→OPDN→OPCH) taban belge
|
|
48
44
|
// zinciri taslaklar arasında çalışmaz; bu durumda kullanıcı üç belge tipinden yalnızca birini seçer.
|
|
49
45
|
this.constructionDraftDocTypeOptions = [
|
|
@@ -56,6 +52,14 @@ export class HitDocumentTransferDetailComponent {
|
|
|
56
52
|
this.isStarting = false;
|
|
57
53
|
this.isExecuting = false;
|
|
58
54
|
this.isMutatingLegs = false;
|
|
55
|
+
this.legBehaviors = [
|
|
56
|
+
{ value: LegBehavior.IntermediateChain, label: this.localization.instant('FBDocumentFlow::LegBehavior:IntermediateChain') },
|
|
57
|
+
{ value: LegBehavior.ConstructionChain, label: this.localization.instant('FBDocumentFlow::LegBehavior:ConstructionChain') },
|
|
58
|
+
];
|
|
59
|
+
this.documentLifecycleOptions = [
|
|
60
|
+
{ value: SapDocumentLifecycle.Posted, label: this.localization.instant('FBDocumentFlow::DocumentLifecycle:Posted') },
|
|
61
|
+
{ value: SapDocumentLifecycle.Draft, label: this.localization.instant('FBDocumentFlow::DocumentLifecycle:Draft') },
|
|
62
|
+
];
|
|
59
63
|
}
|
|
60
64
|
ngOnInit() {
|
|
61
65
|
this.scenarioService.getList({ maxResultCount: 1000, skipCount: 0, isActive: true }).subscribe(result => (this.scenarios = result.items));
|
|
@@ -89,7 +93,7 @@ export class HitDocumentTransferDetailComponent {
|
|
|
89
93
|
}
|
|
90
94
|
scenarioName() {
|
|
91
95
|
if (!this.workingCopy?.scenarioId) {
|
|
92
|
-
return '
|
|
96
|
+
return this.localization.instant('FBDocumentFlow::NoScenarioOption');
|
|
93
97
|
}
|
|
94
98
|
return this.scenarios.find(s => s.id === this.workingCopy?.scenarioId)?.name ?? this.workingCopy.scenarioId;
|
|
95
99
|
}
|
|
@@ -156,7 +160,8 @@ export class HitDocumentTransferDetailComponent {
|
|
|
156
160
|
const isLastLeg = leg.sequenceNo >= (this.workingCopy?.legs.length ?? 0);
|
|
157
161
|
if (leg.legBehavior === LegBehavior.ConstructionChain) {
|
|
158
162
|
if (this.isConstructionDraftSelectable(leg)) {
|
|
159
|
-
const selectedLabel = this.constructionDraftDocTypeOptions.find(o => o.value === leg.selectedConstructionDraftDocType)?.label ??
|
|
163
|
+
const selectedLabel = this.constructionDraftDocTypeOptions.find(o => o.value === leg.selectedConstructionDraftDocType)?.label ??
|
|
164
|
+
this.localization.instant('FBDocumentFlow::NotSelected');
|
|
160
165
|
return isLastLeg ? selectedLabel : `${selectedLabel} → OINV`;
|
|
161
166
|
}
|
|
162
167
|
return isLastLeg ? 'OPOR → OPDN → OPCH' : 'OPOR → OPDN → OPCH → OINV';
|
|
@@ -362,9 +367,7 @@ export class HitDocumentTransferDetailComponent {
|
|
|
362
367
|
}
|
|
363
368
|
// Spec §9 - U_Oran tanımsızken akış bloklanmaz; ancak kullanıcının bunu bilerek onaylaması gerekir.
|
|
364
369
|
if (this.hasMissingIncreaseRate()) {
|
|
365
|
-
this.confirmation
|
|
366
|
-
.warn('Bu şirkette bu proje için artırım oranı tanımlı değildir. Artırım uygulanmadan devam etmek istiyor musunuz?', 'FBDocumentFlow::AreYouSure')
|
|
367
|
-
.subscribe(status => {
|
|
370
|
+
this.confirmation.warn('FBDocumentFlow::IncreaseRateNotDefinedConfirm', 'FBDocumentFlow::AreYouSure').subscribe(status => {
|
|
368
371
|
if (status === Confirmation.Status.confirm) {
|
|
369
372
|
this.executeStartFlow();
|
|
370
373
|
}
|
|
@@ -424,7 +427,15 @@ export class HitDocumentTransferDetailComponent {
|
|
|
424
427
|
});
|
|
425
428
|
}
|
|
426
429
|
statusLabel(status) {
|
|
427
|
-
|
|
430
|
+
const keys = [
|
|
431
|
+
'FBDocumentFlow::TransferStatus:Pending',
|
|
432
|
+
'FBDocumentFlow::TransferStatus:InProgress',
|
|
433
|
+
'FBDocumentFlow::TransferStatus:Completed',
|
|
434
|
+
'FBDocumentFlow::TransferStatus:Failed',
|
|
435
|
+
'FBDocumentFlow::TransferStatus:Cancelled',
|
|
436
|
+
];
|
|
437
|
+
const key = keys[status];
|
|
438
|
+
return key ? this.localization.instant(key) : String(status);
|
|
428
439
|
}
|
|
429
440
|
// Spec §14 (18.09.2026 kararı) - süreç parametrik; Kaynak ve Hedef Belge Durumu için AYNI etiket
|
|
430
441
|
// kullanılır (kullanıcı isteğiyle netleştirildi).
|
|
@@ -432,10 +443,12 @@ export class HitDocumentTransferDetailComponent {
|
|
|
432
443
|
if (lifecycle == null) {
|
|
433
444
|
return '';
|
|
434
445
|
}
|
|
435
|
-
return lifecycle === SapDocumentLifecycle.Draft ? '
|
|
446
|
+
return this.localization.instant(lifecycle === SapDocumentLifecycle.Draft ? 'FBDocumentFlow::DocumentLifecycle:Draft' : 'FBDocumentFlow::DocumentLifecycle:Posted');
|
|
436
447
|
}
|
|
437
448
|
legStatusLabel(status) {
|
|
438
|
-
|
|
449
|
+
const keys = ['FBDocumentFlow::LegStatus:Pending', 'FBDocumentFlow::LegStatus:Success', 'FBDocumentFlow::LegStatus:Failed', 'FBDocumentFlow::LegStatus:Skipped'];
|
|
450
|
+
const key = keys[status];
|
|
451
|
+
return key ? this.localization.instant(key) : String(status);
|
|
439
452
|
}
|
|
440
453
|
// Bir bacakta (özellikle Construction: OPOR→OPDN→OPCH, veya Ara Şirket'te devam OINV oluştuğunda)
|
|
441
454
|
// BİRDEN FAZLA SAP belgesi oluşabilir; önceden yalnızca "son" belge (leg.createdDocType/createdDocEntry)
|
|
@@ -465,10 +478,10 @@ export class HitDocumentTransferDetailComponent {
|
|
|
465
478
|
return parts.join(' → ');
|
|
466
479
|
}
|
|
467
480
|
}
|
|
468
|
-
HitDocumentTransferDetailComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: HitDocumentTransferDetailComponent, deps: [{ token: i1.ActivatedRoute }, { token: i1.Router }, { token: i2.DocumentTransferService }, { token: i3.DocumentScenarioService }, { token: i4.SapCompanyProfileService }, { token: i5.ConfirmationService }], target: i0.ɵɵFactoryTarget.Component });
|
|
469
|
-
HitDocumentTransferDetailComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: HitDocumentTransferDetailComponent, selector: "hit-document-transfer-detail", ngImport: i0, template: "<div class=\"card\">\n <div class=\"card-header py-3\">\n <div class=\"row align-items-center\">\n <div class=\"col\">\n <h5 class=\"card-title mb-0\">Belge Ak\u0131\u015F\u0131 / Intercompany Aktar\u0131m\u0131</h5>\n </div>\n <div class=\"col-auto\">\n <button class=\"btn btn-sm btn-outline-secondary\" (click)=\"backToList()\">\n <i class=\"fa fa-arrow-left me-1\"></i>Listeye D\u00F6n\n </button>\n </div>\n </div>\n </div>\n <div class=\"card-body pt-3\">\n <div *ngIf=\"isLoading\" class=\"text-center py-5\">\n <div class=\"spinner-border text-primary\" role=\"status\"></div>\n <div class=\"mt-2 text-muted\">Y\u00FCkleniyor...</div>\n </div>\n\n <ng-container *ngIf=\"!isLoading\">\n <!-- Bu sat\u0131r hem \"yeni\" (hen\u00FCz kay\u0131t olu\u015Fmam\u0131\u015F) hem de kay\u0131t olu\u015Ftuktan sonraki taslak durumunda\n AYNI alan setini g\u00F6sterir - kay\u0131t olu\u015Funca ekran\u0131n alan seti de\u011Fi\u015Fip kullan\u0131c\u0131da \"ba\u015Fka bir\n kay\u0131t m\u0131 bu\" izlenimi vermesin diye. De\u011Ferler \u00F6nce newState'ten (istemcide tutulan \u00F6nizleme),\n o yoksa olu\u015Fan kayd\u0131n ilk baca\u011F\u0131ndan (workingCopy.legs[0]) okunur - ilk bacak her zaman\n newState'in temsil etti\u011Fi \"ilk hedef\" ad\u0131m\u0131yla ayn\u0131 belgedir. -->\n <div class=\"row g-3 mb-3\" *ngIf=\"newState || workingCopy\">\n <div class=\"col-md-3\">\n <label class=\"form-label\">Kaynak \u015Eirket</label>\n <input type=\"text\" class=\"form-control\" [value]=\"companyName()\" disabled />\n </div>\n <div class=\"col-md-2\">\n <label class=\"form-label\">Belge No</label>\n <input type=\"text\" class=\"form-control\" [value]=\"newState?.docNum ?? workingCopy?.sourceOinvDocNum\" disabled />\n </div>\n <div class=\"col-md-2\">\n <label class=\"form-label\">NumAtCard</label>\n <input type=\"text\" class=\"form-control\" [value]=\"newState?.numAtCard ?? workingCopy?.sourceOinvNumAtCard\" disabled />\n </div>\n <div class=\"col-md-1\">\n <label class=\"form-label\">Proje</label>\n <input type=\"text\" class=\"form-control\" [value]=\"newState?.projectCode ?? workingCopy?.projectCode\" disabled />\n </div>\n <div class=\"col-md-2\">\n <label class=\"form-label\">\u0130lk Hedef</label>\n <input type=\"text\" class=\"form-control\" [value]=\"newState?.targetCompanyName ?? workingCopy?.legs?.[0]?.targetCompanyName\" disabled />\n </div>\n <div class=\"col-md-2\">\n <label class=\"form-label\">D\u00F6viz</label>\n <input type=\"text\" class=\"form-control\" [value]=\"newState?.currency ?? workingCopy?.legs?.[0]?.currency\" disabled />\n </div>\n </div>\n\n <!-- Belge Durumu her zaman (yeni kay\u0131tta da) g\u00F6r\u00FCn\u00FCr; Intercompany Id/Aktar\u0131m Durumu/Senaryo yaln\u0131zca\n kay\u0131t olu\u015Ftuktan sonra vard\u0131r - kullan\u0131c\u0131 iste\u011Fiyle hepsi ayn\u0131 sat\u0131rda, Belge Durumu'nun yan\u0131na\n topland\u0131 (\u00F6nceden Intercompany Id/Aktar\u0131m Durumu ayr\u0131 bir sat\u0131rdayd\u0131). -->\n <div class=\"row g-3 mb-3\" *ngIf=\"newState || workingCopy\">\n <div class=\"col-md-2\">\n <label class=\"form-label\">Kaynak Belge Durumu</label>\n <input\n type=\"text\"\n class=\"form-control\"\n [value]=\"sourceDocumentLifecycleLabel(newState?.sourceDocumentLifecycle ?? workingCopy?.sourceDocumentLifecycle)\"\n disabled\n />\n </div>\n <div class=\"col-md-2\">\n <label class=\"form-label\">Hedef Belge Durumu</label>\n <!-- Aktar\u0131m hen\u00FCz olu\u015Fturulmad\u0131ysa (isNew) burada se\u00E7ilebilir - kaynaktan ba\u011F\u0131ms\u0131z bir karard\u0131r\n (kullan\u0131c\u0131 geri bildirimiyle netle\u015Ftirildi: kayna\u011F\u0131n modu sabit, hedefin modu burada se\u00E7ilir).\n Olu\u015Ftuktan sonra backend'de sabitlendi\u011Fi i\u00E7in (workingCopy) salt-okunur g\u00F6sterilir. -->\n <select *ngIf=\"isNew && newState\" class=\"form-select\" [(ngModel)]=\"newState.targetDocumentLifecycle\">\n <option *ngFor=\"let o of documentLifecycleOptions\" [ngValue]=\"o.value\">{{ o.label }}</option>\n </select>\n <input\n *ngIf=\"!isNew || !newState\"\n type=\"text\"\n class=\"form-control\"\n [value]=\"sourceDocumentLifecycleLabel(newState?.targetDocumentLifecycle ?? workingCopy?.targetDocumentLifecycle)\"\n disabled\n />\n </div>\n <div class=\"col-md-3\" *ngIf=\"workingCopy\">\n <label class=\"form-label\">Intercompany Id</label>\n <input type=\"text\" class=\"form-control\" [value]=\"workingCopy.intercompanyId\" disabled />\n </div>\n <div class=\"col-md-2\" *ngIf=\"workingCopy\">\n <label class=\"form-label\">Aktar\u0131m Durumu</label>\n <input type=\"text\" class=\"form-control\" [value]=\"statusLabel(workingCopy.status)\" disabled />\n </div>\n <!-- Senaryo, aktar\u0131m hen\u00FCz \u00E7al\u0131\u015Ft\u0131r\u0131lmam\u0131\u015Fken (isDraft()) alt\u0131ndaki \"Haz\u0131r Senaryo\" dropdown'\u0131nda\n zaten d\u00FCzenlenebilir/g\u00F6r\u00FCn\u00FCr durumda - ayn\u0131 bilgiyi burada salt-okunur tekrar g\u00F6stermek\n (kullan\u0131c\u0131 geri bildirimiyle tespit edildi) kafa kar\u0131\u015Ft\u0131r\u0131yordu. Yaln\u0131zca aktar\u0131m art\u0131k\n d\u00FCzenlenemez hale geldi\u011Finde (dropdown kayboldu\u011Funda) burada g\u00F6sterilir. -->\n <div class=\"col-md-3\" *ngIf=\"workingCopy && !isDraft()\">\n <label class=\"form-label\">Senaryo</label>\n <input type=\"text\" class=\"form-control\" [value]=\"scenarioName()\" disabled />\n </div>\n </div>\n\n <!-- Taslak: haz\u0131r senaryo se\u00E7imi, hen\u00FCz \u00E7al\u0131\u015Ft\u0131r\u0131lmad\u0131. -->\n <ng-container *ngIf=\"isDraft()\">\n <div class=\"row g-3 align-items-end mb-3\">\n <div class=\"col-md-4\">\n <label class=\"form-label\">Haz\u0131r Senaryo</label>\n <select class=\"form-select\" [(ngModel)]=\"scenarioId\">\n <option [ngValue]=\"''\">Senaryosuz (yaln\u0131zca ilk hedef baca\u011F\u0131)</option>\n <option *ngFor=\"let s of availableScenarios()\" [ngValue]=\"s.id\">{{ s.name }}</option>\n </select>\n </div>\n <div class=\"col-md-2\">\n <button\n class=\"btn btn-outline-primary\"\n (click)=\"isNew ? fetchScenario() : applyScenario()\"\n [disabled]=\"isFetchingScenario\"\n >\n <span *ngIf=\"isFetchingScenario\" class=\"spinner-border spinner-border-sm me-1\"></span>\n {{ isNew ? 'Senaryoyu Getir' : 'Senaryoyu Uygula' }}\n </button>\n </div>\n </div>\n </ng-container>\n\n <!-- NumAtCard alanlar\u0131 art\u0131k isDraft()'a ba\u011Fl\u0131 DE\u011E\u0130L: taslakta d\u00FCzenlenebilir, \u00E7al\u0131\u015Ft\u0131r\u0131ld\u0131ktan\n sonra (isDraft() false olsa da) salt-okunur olarak ekranda kal\u0131r - \"Haz\u0131r Senaryo\" blo\u011Fuyla\n birlikte tamamen kaybolmas\u0131n diye. -->\n <ng-container *ngIf=\"workingCopy\">\n <div class=\"row g-3 align-items-end mb-3\" *ngIf=\"hasIntermediateNumAtCardLegs()\">\n <div class=\"col-md-3\" *ngFor=\"let leg of workingCopy.legs\">\n <ng-container *ngIf=\"leg.legBehavior === 0 && leg.sequenceNo < workingCopy.legs.length\">\n <label class=\"form-label\">{{ leg.sequenceNo }}. Bacak - {{ leg.targetCompanyName }} M\u00FC\u015Fteri Faturas\u0131 NumAtCard</label>\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"leg.numAtCard\" [disabled]=\"!isDraft()\" />\n </ng-container>\n </div>\n </div>\n\n <div class=\"alert alert-warning\" *ngIf=\"isDraft() && hasMissingIncreaseRate()\">\n Uyar\u0131: \u0130lgili \u015Firkette/projede art\u0131r\u0131m oran\u0131 0 / NULL. Art\u0131r\u0131m uygulanmadan devam etmek istiyor musunuz?\n </div>\n\n <div class=\"alert alert-warning\" *ngIf=\"isDraft() && hasMissingConstructionDraftSelection()\">\n Uyar\u0131: Hedef Belge Durumu Taslak oldu\u011Funda Construction bacaklar\u0131nda OPOR \u2192 OPDN \u2192 OPCH zinciri taslak belgeler aras\u0131nda\n \u00E7al\u0131\u015Fmaz. \"Hedefte Olu\u015Facak\" s\u00FCtunundan bu bacaklar i\u00E7in tek bir belge tipi (OPOR / OPDN / OPCH) se\u00E7melisiniz.\n </div>\n </ng-container>\n\n <!-- Tek tablo: taslakta da, \u00E7al\u0131\u015Ft\u0131r\u0131ld\u0131ktan sonra da AYNI s\u00FCtun seti (S\u0131ra..Art\u0131r\u0131m) korunur;\n Durum/Sonu\u00E7 Belge/Hata/\u00C7al\u0131\u015Ft\u0131r yaln\u0131zca \u00E7al\u0131\u015Ft\u0131r\u0131ld\u0131ktan sonra, her sat\u0131r\u0131n ALTINA ikinci bir\n sat\u0131r olarak eklenir - eskiden bu bilgiler ayr\u0131 ve daha dar bir tabloya ge\u00E7ilerek g\u00F6steriliyordu,\n bu da Kaynak Belge/Hedefte Olu\u015Facak gibi s\u00FCtunlar\u0131n \"kaybolmu\u015F\" g\u00F6r\u00FCnmesine yol a\u00E7\u0131yordu. -->\n <ng-container *ngIf=\"workingCopy\">\n <div class=\"d-flex justify-content-between align-items-center mb-2\">\n <div>\n <h6 class=\"mb-0\">{{ isDraft() ? 'Senaryo \u00C7al\u0131\u015Fma Kopyas\u0131' : 'Aktar\u0131m Sonucu' }}</h6>\n <small class=\"text-muted\" *ngIf=\"isDraft()\">Bu tablo yaln\u0131zca \u00E7al\u0131\u015Fma kopyas\u0131n\u0131 d\u00FCzenler; ana senaryoyu de\u011Fi\u015Ftirmez.</small>\n </div>\n <button class=\"btn btn-sm btn-outline-primary\" (click)=\"addLeg()\" *ngIf=\"isDraft()\" [disabled]=\"isMutatingLegs\">\n <i class=\"fa fa-plus me-1\"></i>Bacak Ekle\n </button>\n <button class=\"btn btn-sm btn-outline-danger\" (click)=\"cancelChain()\" *ngIf=\"canCancelChain()\">\n <i class=\"fa fa-ban me-1\"></i>Zinciri \u0130ptal Et\n </button>\n </div>\n\n <div class=\"alert alert-secondary small\" *ngIf=\"workingCopy.status === 4\">\n Bu zincir iptal edildi, bacaklar\u0131 art\u0131k \u00E7al\u0131\u015Ft\u0131r\u0131lamaz/d\u00FCzenlenemez. Yeniden denemek i\u00E7in\n \"Listeye D\u00F6n\"den kaynak faturay\u0131 tekrar se\u00E7ip yeni bir aktar\u0131m ba\u015Flat\u0131n - bu, yeni bir Intercompany Id ile\n \u00E7al\u0131\u015F\u0131r.\n </div>\n\n <div class=\"table-responsive\">\n <table class=\"table table-sm table-bordered align-middle\">\n <thead>\n <tr>\n <th>S\u0131ra</th>\n <th>Kaynak</th>\n <th>Kaynak Belge</th>\n <th>Hedef</th>\n <th>Davran\u0131\u015F</th>\n <th>Hedefte Olu\u015Facak</th>\n <th>OPCH CardCode</th>\n <th>D\u00F6viz</th>\n <th>Kur</th>\n <th>Art\u0131r\u0131m</th>\n <th *ngIf=\"isDraft()\"></th>\n </tr>\n </thead>\n <tbody>\n <ng-container *ngFor=\"let leg of workingCopy.legs\">\n <tr>\n <td>{{ leg.sequenceNo }}</td>\n <td>{{ leg.sourceCompanyName }}</td>\n <td>OINV</td>\n <td>\n <select\n *ngIf=\"isDraft(); else targetText\"\n class=\"form-select form-select-sm\"\n [ngModel]=\"leg.targetCompanyId\"\n (ngModelChange)=\"updateLegTarget(leg, $event)\"\n [disabled]=\"isMutatingLegs\"\n >\n <option *ngFor=\"let c of companies\" [ngValue]=\"c.id\">{{ c.companyName }}</option>\n </select>\n <ng-template #targetText>{{ leg.targetCompanyName }}</ng-template>\n </td>\n <td>\n <select\n *ngIf=\"isDraft(); else behaviorText\"\n class=\"form-select form-select-sm\"\n [ngModel]=\"leg.legBehavior\"\n (ngModelChange)=\"updateLegBehavior(leg, $event)\"\n [disabled]=\"isMutatingLegs\"\n >\n <option *ngFor=\"let b of legBehaviors\" [ngValue]=\"b.value\">{{ b.label }}</option>\n </select>\n <ng-template #behaviorText>{{ legBehaviors[leg.legBehavior]?.label }}</ng-template>\n </td>\n <td>\n <select\n *ngIf=\"isDraft() && isConstructionDraftSelectable(leg); else targetDocText\"\n class=\"form-select form-select-sm\"\n [ngModel]=\"leg.selectedConstructionDraftDocType\"\n (ngModelChange)=\"updateLegConstructionDraftDocType(leg, $event)\"\n [disabled]=\"isMutatingLegs\"\n >\n <option [ngValue]=\"null\">Se\u00E7iniz...</option>\n <option *ngFor=\"let o of constructionDraftDocTypeOptions\" [ngValue]=\"o.value\">{{ o.label }}</option>\n </select>\n <ng-template #targetDocText>{{ legTargetDocLabel(leg) }}</ng-template>\n </td>\n <td>\n <span *ngIf=\"leg.resolvedOpchCardCode\">{{ leg.resolvedOpchCardCode }}</span>\n <div *ngIf=\"!leg.resolvedOpchCardCode\" class=\"d-flex flex-column align-items-start py-1\">\n <span class=\"badge bg-danger\">E\u015Fle\u015Ftirilmedi</span>\n <button\n type=\"button\"\n class=\"btn btn-outline-danger btn-sm mt-2 py-0 px-2\"\n style=\"font-size: 0.72rem\"\n (click)=\"goToPartnerMapping(leg)\"\n title=\"Muhatap E\u015Fle\u015Ftirmeleri ekran\u0131na git\"\n >\n <i class=\"fa fa-link me-1\"></i>E\u015Fle\u015Ftir\n </button>\n </div>\n </td>\n <td>\n <input\n *ngIf=\"isDraft(); else currencyText\"\n type=\"text\"\n class=\"form-control form-control-sm\"\n style=\"width: 5.5rem\"\n [(ngModel)]=\"leg.currency\"\n [placeholder]=\"newState?.currency || 'Kaynaktan'\"\n />\n <ng-template #currencyText>{{ leg.currency || newState?.currency }}</ng-template>\n </td>\n <td>\n <input\n *ngIf=\"isDraft(); else rateText\"\n type=\"number\"\n class=\"form-control form-control-sm\"\n style=\"width: 6rem\"\n [(ngModel)]=\"leg.exchangeRate\"\n placeholder=\"Kaynaktan\"\n />\n <ng-template #rateText>{{ leg.exchangeRate ?? '-' }}</ng-template>\n </td>\n <!-- Spec \u00A79 - art\u0131r\u0131m YALNIZCA bu baca\u011F\u0131n olu\u015Fturdu\u011Fu devam M\u00FC\u015Fteri Faturas\u0131na (bir\n sonraki bacak varsa) uygulan\u0131r; bu hem IntermediateChain hem ConstructionChain i\u00E7in\n ge\u00E7erlidir (Construction'da da nextTargetCompanyId.HasValue ise devam OINV'i\n art\u0131r\u0131mla olu\u015Fturuluyor). \u00D6nceden Construction bacaklar\u0131 legBehavior'a bak\u0131larak\n KO\u015EULSUZ \"-\" g\u00F6steriyordu - zincirin SON baca\u011F\u0131 olmayan bir Construction baca\u011F\u0131n\u0131n\n hedefinde art\u0131r\u0131m oran\u0131 tan\u0131ms\u0131zken kullan\u0131c\u0131 hi\u00E7 uyar\u0131lm\u0131yordu (kod incelemesiyle\n tespit edildi). Do\u011Fru ko\u015Ful \"zincirin son baca\u011F\u0131 m\u0131\" (legTargetDocLabel'daki\n isLastLeg ile ayn\u0131 mant\u0131k), legBehavior de\u011Fil. -->\n <td>\n <span *ngIf=\"leg.sequenceNo >= (workingCopy?.legs?.length ?? 0)\">-</span>\n <ng-container *ngIf=\"leg.sequenceNo < (workingCopy?.legs?.length ?? 0)\">\n <span *ngIf=\"leg.increaseRateApplied ?? leg.plannedIncreaseRate as rate\">{{ rate | number: '1.2-2' }}</span>\n <span\n class=\"text-danger\"\n *ngIf=\"!(leg.increaseRateApplied ?? leg.plannedIncreaseRate)\"\n title=\"Bu \u015Firkette bu proje i\u00E7in art\u0131r\u0131m oran\u0131 tan\u0131ml\u0131 de\u011Fildir. Art\u0131r\u0131m uygulanmadan devam edilecektir.\"\n >\n Tan\u0131ms\u0131z\n </span>\n </ng-container>\n </td>\n <td *ngIf=\"isDraft()\">\n <button\n class=\"btn btn-sm btn-outline-danger\"\n (click)=\"removeLeg(leg)\"\n [disabled]=\"isMutatingLegs || workingCopy.legs.length <= 1\"\n title=\"Baca\u011F\u0131 Sil\"\n >\n <i class=\"fa fa-trash\"></i>\n </button>\n </td>\n </tr>\n <tr class=\"table-light\" *ngIf=\"!isDraft()\">\n <td></td>\n <td colspan=\"9\">\n <div class=\"d-flex align-items-center flex-wrap gap-3\">\n <span>\n <strong>Durum:</strong>\n <span\n class=\"badge ms-1\"\n [class.bg-secondary]=\"leg.status === 0\"\n [class.bg-success]=\"leg.status === 1\"\n [class.bg-danger]=\"leg.status === 2\"\n [class.bg-warning]=\"leg.status === 3\"\n >\n {{ legStatusLabel(leg.status) }}\n </span>\n </span>\n <span *ngIf=\"createdDocumentsSummary(leg) as docs\"><strong>Sonu\u00E7 Belge(ler):</strong> {{ docs }}</span>\n <span class=\"text-danger\" *ngIf=\"leg.errorMessage\"><strong>Hata:</strong> {{ leg.errorMessage }}</span>\n <button\n class=\"btn btn-sm btn-outline-primary ms-auto\"\n (click)=\"executeLeg(leg)\"\n [disabled]=\"isExecuting || !canExecuteLeg(leg)\"\n >\n <span *ngIf=\"isExecuting\" class=\"spinner-border spinner-border-sm me-1\"></span>\n \u00C7al\u0131\u015Ft\u0131r\n </button>\n </div>\n </td>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </div>\n\n <ul class=\"text-muted small\" *ngIf=\"isDraft()\">\n <li>\u015Eirketler aras\u0131 OINV \u2192 OPCH ge\u00E7i\u015Finde kaynak NumAtCard hedef OPCH.NumAtCard alan\u0131na aynen ta\u015F\u0131n\u0131r.</li>\n <li>Art\u0131r\u0131m yaln\u0131zca ayn\u0131 \u015Firket i\u00E7inde olu\u015Fturulan yeni M\u00FC\u015Fteri Faturas\u0131na uygulan\u0131r; navlun art\u0131r\u0131m oran\u0131ndan etkilenmez.</li>\n <li>Muhatap kodlar\u0131 Muhatap E\u015Fle\u015Ftirmeleri \u00FCzerinden \u00E7\u00F6z\u00FCl\u00FCr. Kur kaynak belgeden gelir ve kullan\u0131c\u0131 taraf\u0131ndan de\u011Fi\u015Ftirilebilir.</li>\n </ul>\n </ng-container>\n\n <div class=\"d-flex justify-content-end gap-2 mt-3\">\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"backToList()\">{{ isDraft() ? 'Vazge\u00E7' : 'Kapat' }}</button>\n <button\n type=\"button\"\n class=\"btn btn-primary\"\n (click)=\"startFlow()\"\n *ngIf=\"isDraft() && workingCopy\"\n [disabled]=\"isStarting || hasMissingConstructionDraftSelection()\"\n >\n <span *ngIf=\"isStarting\" class=\"spinner-border spinner-border-sm me-1\"></span>\n Belge Ak\u0131\u015F\u0131n\u0131 Ba\u015Flat\n </button>\n </div>\n </ng-container>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i7.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i7.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i7.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i7.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: i6.DecimalPipe, name: "number" }] });
|
|
481
|
+
HitDocumentTransferDetailComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: HitDocumentTransferDetailComponent, deps: [{ token: i1.ActivatedRoute }, { token: i1.Router }, { token: i2.DocumentTransferService }, { token: i3.DocumentScenarioService }, { token: i4.SapCompanyProfileService }, { token: i5.ConfirmationService }, { token: i6.LocalizationService }], target: i0.ɵɵFactoryTarget.Component });
|
|
482
|
+
HitDocumentTransferDetailComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: HitDocumentTransferDetailComponent, selector: "hit-document-transfer-detail", ngImport: i0, template: "<div class=\"card\">\n <div class=\"card-header py-3\">\n <div class=\"row align-items-center\">\n <div class=\"col\">\n <h5 class=\"card-title mb-0\">{{ 'FBDocumentFlow::DocumentFlowTitle' | abpLocalization }}</h5>\n </div>\n <div class=\"col-auto\">\n <button class=\"btn btn-sm btn-outline-secondary\" (click)=\"backToList()\">\n <i class=\"fa fa-arrow-left me-1\"></i>{{ 'FBDocumentFlow::BackToList' | abpLocalization }}\n </button>\n </div>\n </div>\n </div>\n <div class=\"card-body pt-3\">\n <div *ngIf=\"isLoading\" class=\"text-center py-5\">\n <div class=\"spinner-border text-primary\" role=\"status\"></div>\n <div class=\"mt-2 text-muted\">{{ 'FBDocumentFlow::Loading' | abpLocalization }}</div>\n </div>\n\n <ng-container *ngIf=\"!isLoading\">\n <!-- Bu sat\u0131r hem \"yeni\" (hen\u00FCz kay\u0131t olu\u015Fmam\u0131\u015F) hem de kay\u0131t olu\u015Ftuktan sonraki taslak durumunda\n AYNI alan setini g\u00F6sterir - kay\u0131t olu\u015Funca ekran\u0131n alan seti de\u011Fi\u015Fip kullan\u0131c\u0131da \"ba\u015Fka bir\n kay\u0131t m\u0131 bu\" izlenimi vermesin diye. De\u011Ferler \u00F6nce newState'ten (istemcide tutulan \u00F6nizleme),\n o yoksa olu\u015Fan kayd\u0131n ilk baca\u011F\u0131ndan (workingCopy.legs[0]) okunur - ilk bacak her zaman\n newState'in temsil etti\u011Fi \"ilk hedef\" ad\u0131m\u0131yla ayn\u0131 belgedir. -->\n <div class=\"row g-3 mb-3\" *ngIf=\"newState || workingCopy\">\n <div class=\"col-md-3\">\n <label class=\"form-label\">{{ 'FBDocumentFlow::SourceCompany' | abpLocalization }}</label>\n <input type=\"text\" class=\"form-control\" [value]=\"companyName()\" disabled />\n </div>\n <div class=\"col-md-2\">\n <label class=\"form-label\">{{ 'FBDocumentFlow::DocNum' | abpLocalization }}</label>\n <input type=\"text\" class=\"form-control\" [value]=\"newState?.docNum ?? workingCopy?.sourceOinvDocNum\" disabled />\n </div>\n <div class=\"col-md-2\">\n <label class=\"form-label\">{{ 'FBDocumentFlow::NumAtCard' | abpLocalization }}</label>\n <input type=\"text\" class=\"form-control\" [value]=\"newState?.numAtCard ?? workingCopy?.sourceOinvNumAtCard\" disabled />\n </div>\n <div class=\"col-md-1\">\n <label class=\"form-label\">{{ 'FBDocumentFlow::Project' | abpLocalization }}</label>\n <input type=\"text\" class=\"form-control\" [value]=\"newState?.projectCode ?? workingCopy?.projectCode\" disabled />\n </div>\n <div class=\"col-md-2\">\n <label class=\"form-label\">{{ 'FBDocumentFlow::FirstTarget' | abpLocalization }}</label>\n <input type=\"text\" class=\"form-control\" [value]=\"newState?.targetCompanyName ?? workingCopy?.legs?.[0]?.targetCompanyName\" disabled />\n </div>\n <div class=\"col-md-2\">\n <label class=\"form-label\">{{ 'FBDocumentFlow::Currency' | abpLocalization }}</label>\n <input type=\"text\" class=\"form-control\" [value]=\"newState?.currency ?? workingCopy?.legs?.[0]?.currency\" disabled />\n </div>\n </div>\n\n <!-- Belge Durumu her zaman (yeni kay\u0131tta da) g\u00F6r\u00FCn\u00FCr; Intercompany Id/Aktar\u0131m Durumu/Senaryo yaln\u0131zca\n kay\u0131t olu\u015Ftuktan sonra vard\u0131r - kullan\u0131c\u0131 iste\u011Fiyle hepsi ayn\u0131 sat\u0131rda, Belge Durumu'nun yan\u0131na\n topland\u0131 (\u00F6nceden Intercompany Id/Aktar\u0131m Durumu ayr\u0131 bir sat\u0131rdayd\u0131). -->\n <div class=\"row g-3 mb-3\" *ngIf=\"newState || workingCopy\">\n <div class=\"col-md-2\">\n <label class=\"form-label\">{{ 'FBDocumentFlow::SourceDocumentLifecycle' | abpLocalization }}</label>\n <input\n type=\"text\"\n class=\"form-control\"\n [value]=\"sourceDocumentLifecycleLabel(newState?.sourceDocumentLifecycle ?? workingCopy?.sourceDocumentLifecycle)\"\n disabled\n />\n </div>\n <div class=\"col-md-2\">\n <label class=\"form-label\">{{ 'FBDocumentFlow::TargetDocumentLifecycle' | abpLocalization }}</label>\n <!-- Aktar\u0131m hen\u00FCz olu\u015Fturulmad\u0131ysa (isNew) burada se\u00E7ilebilir - kaynaktan ba\u011F\u0131ms\u0131z bir karard\u0131r\n (kullan\u0131c\u0131 geri bildirimiyle netle\u015Ftirildi: kayna\u011F\u0131n modu sabit, hedefin modu burada se\u00E7ilir).\n Olu\u015Ftuktan sonra backend'de sabitlendi\u011Fi i\u00E7in (workingCopy) salt-okunur g\u00F6sterilir. -->\n <select *ngIf=\"isNew && newState\" class=\"form-select\" [(ngModel)]=\"newState.targetDocumentLifecycle\">\n <option *ngFor=\"let o of documentLifecycleOptions\" [ngValue]=\"o.value\">{{ o.label }}</option>\n </select>\n <input\n *ngIf=\"!isNew || !newState\"\n type=\"text\"\n class=\"form-control\"\n [value]=\"sourceDocumentLifecycleLabel(newState?.targetDocumentLifecycle ?? workingCopy?.targetDocumentLifecycle)\"\n disabled\n />\n </div>\n <div class=\"col-md-3\" *ngIf=\"workingCopy\">\n <label class=\"form-label\">{{ 'FBDocumentFlow::IntercompanyId' | abpLocalization }}</label>\n <input type=\"text\" class=\"form-control\" [value]=\"workingCopy.intercompanyId\" disabled />\n </div>\n <div class=\"col-md-2\" *ngIf=\"workingCopy\">\n <label class=\"form-label\">{{ 'FBDocumentFlow::TransferStatusLabel' | abpLocalization }}</label>\n <input type=\"text\" class=\"form-control\" [value]=\"statusLabel(workingCopy.status)\" disabled />\n </div>\n <!-- Senaryo, aktar\u0131m hen\u00FCz \u00E7al\u0131\u015Ft\u0131r\u0131lmam\u0131\u015Fken (isDraft()) alt\u0131ndaki \"Haz\u0131r Senaryo\" dropdown'\u0131nda\n zaten d\u00FCzenlenebilir/g\u00F6r\u00FCn\u00FCr durumda - ayn\u0131 bilgiyi burada salt-okunur tekrar g\u00F6stermek\n (kullan\u0131c\u0131 geri bildirimiyle tespit edildi) kafa kar\u0131\u015Ft\u0131r\u0131yordu. Yaln\u0131zca aktar\u0131m art\u0131k\n d\u00FCzenlenemez hale geldi\u011Finde (dropdown kayboldu\u011Funda) burada g\u00F6sterilir. -->\n <div class=\"col-md-3\" *ngIf=\"workingCopy && !isDraft()\">\n <label class=\"form-label\">{{ 'FBDocumentFlow::Scenario' | abpLocalization }}</label>\n <input type=\"text\" class=\"form-control\" [value]=\"scenarioName()\" disabled />\n </div>\n </div>\n\n <!-- Taslak: haz\u0131r senaryo se\u00E7imi, hen\u00FCz \u00E7al\u0131\u015Ft\u0131r\u0131lmad\u0131. -->\n <ng-container *ngIf=\"isDraft()\">\n <div class=\"row g-3 align-items-end mb-3\">\n <div class=\"col-md-4\">\n <label class=\"form-label\">{{ 'FBDocumentFlow::ReadyScenario' | abpLocalization }}</label>\n <select class=\"form-select\" [(ngModel)]=\"scenarioId\">\n <option [ngValue]=\"''\">{{ 'FBDocumentFlow::NoScenarioOption' | abpLocalization }}</option>\n <option *ngFor=\"let s of availableScenarios()\" [ngValue]=\"s.id\">{{ s.name }}</option>\n </select>\n </div>\n <div class=\"col-md-2\">\n <button\n class=\"btn btn-outline-primary\"\n (click)=\"isNew ? fetchScenario() : applyScenario()\"\n [disabled]=\"isFetchingScenario\"\n >\n <span *ngIf=\"isFetchingScenario\" class=\"spinner-border spinner-border-sm me-1\"></span>\n {{ (isNew ? 'FBDocumentFlow::FetchScenario' : 'FBDocumentFlow::ApplyScenario') | abpLocalization }}\n </button>\n </div>\n </div>\n </ng-container>\n\n <!-- NumAtCard alanlar\u0131 art\u0131k isDraft()'a ba\u011Fl\u0131 DE\u011E\u0130L: taslakta d\u00FCzenlenebilir, \u00E7al\u0131\u015Ft\u0131r\u0131ld\u0131ktan\n sonra (isDraft() false olsa da) salt-okunur olarak ekranda kal\u0131r - \"Haz\u0131r Senaryo\" blo\u011Fuyla\n birlikte tamamen kaybolmas\u0131n diye. -->\n <ng-container *ngIf=\"workingCopy\">\n <div class=\"row g-3 align-items-end mb-3\" *ngIf=\"hasIntermediateNumAtCardLegs()\">\n <div class=\"col-md-3\" *ngFor=\"let leg of workingCopy.legs\">\n <ng-container *ngIf=\"leg.legBehavior === 0 && leg.sequenceNo < workingCopy.legs.length\">\n <label class=\"form-label\">{{ 'FBDocumentFlow::LegNumAtCardLabel' | abpLocalization: leg.sequenceNo.toString():leg.targetCompanyName }}</label>\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"leg.numAtCard\" [disabled]=\"!isDraft()\" />\n </ng-container>\n </div>\n </div>\n\n <div class=\"alert alert-warning\" *ngIf=\"isDraft() && hasMissingIncreaseRate()\">\n {{ 'FBDocumentFlow::IncreaseRateWarning' | abpLocalization }}\n </div>\n\n <div class=\"alert alert-warning\" *ngIf=\"isDraft() && hasMissingConstructionDraftSelection()\">\n {{ 'FBDocumentFlow::ConstructionDraftWarning' | abpLocalization }}\n </div>\n </ng-container>\n\n <!-- Tek tablo: taslakta da, \u00E7al\u0131\u015Ft\u0131r\u0131ld\u0131ktan sonra da AYNI s\u00FCtun seti (S\u0131ra..Art\u0131r\u0131m) korunur;\n Durum/Sonu\u00E7 Belge/Hata/\u00C7al\u0131\u015Ft\u0131r yaln\u0131zca \u00E7al\u0131\u015Ft\u0131r\u0131ld\u0131ktan sonra, her sat\u0131r\u0131n ALTINA ikinci bir\n sat\u0131r olarak eklenir - eskiden bu bilgiler ayr\u0131 ve daha dar bir tabloya ge\u00E7ilerek g\u00F6steriliyordu,\n bu da Kaynak Belge/Hedefte Olu\u015Facak gibi s\u00FCtunlar\u0131n \"kaybolmu\u015F\" g\u00F6r\u00FCnmesine yol a\u00E7\u0131yordu. -->\n <ng-container *ngIf=\"workingCopy\">\n <div class=\"d-flex justify-content-between align-items-center mb-2\">\n <div>\n <h6 class=\"mb-0\">{{ (isDraft() ? 'FBDocumentFlow::ScenarioWorkingCopy' : 'FBDocumentFlow::TransferResult') | abpLocalization }}</h6>\n <small class=\"text-muted\" *ngIf=\"isDraft()\">{{ 'FBDocumentFlow::WorkingCopyHint' | abpLocalization }}</small>\n </div>\n <button class=\"btn btn-sm btn-outline-primary\" (click)=\"addLeg()\" *ngIf=\"isDraft()\" [disabled]=\"isMutatingLegs\">\n <i class=\"fa fa-plus me-1\"></i>{{ 'FBDocumentFlow::AddLeg' | abpLocalization }}\n </button>\n <button class=\"btn btn-sm btn-outline-danger\" (click)=\"cancelChain()\" *ngIf=\"canCancelChain()\">\n <i class=\"fa fa-ban me-1\"></i>{{ 'FBDocumentFlow::CancelChain' | abpLocalization }}\n </button>\n </div>\n\n <div class=\"alert alert-secondary small\" *ngIf=\"workingCopy.status === 4\">\n {{ 'FBDocumentFlow::ChainCancelledNote' | abpLocalization }}\n </div>\n\n <div class=\"table-responsive\">\n <table class=\"table table-sm table-bordered align-middle\">\n <thead>\n <tr>\n <th>{{ 'FBDocumentFlow::SequenceNo' | abpLocalization }}</th>\n <th>{{ 'FBDocumentFlow::Source' | abpLocalization }}</th>\n <th>{{ 'FBDocumentFlow::SourceDocument' | abpLocalization }}</th>\n <th>{{ 'FBDocumentFlow::Target' | abpLocalization }}</th>\n <th>{{ 'FBDocumentFlow::Behavior' | abpLocalization }}</th>\n <th>{{ 'FBDocumentFlow::TargetCreates' | abpLocalization }}</th>\n <th>{{ 'FBDocumentFlow::OpchCardCode' | abpLocalization }}</th>\n <th>{{ 'FBDocumentFlow::Currency' | abpLocalization }}</th>\n <th>{{ 'FBDocumentFlow::ExchangeRate' | abpLocalization }}</th>\n <th>{{ 'FBDocumentFlow::IncreaseRateColumn' | abpLocalization }}</th>\n <th *ngIf=\"isDraft()\"></th>\n </tr>\n </thead>\n <tbody>\n <ng-container *ngFor=\"let leg of workingCopy.legs\">\n <tr>\n <td>{{ leg.sequenceNo }}</td>\n <td>{{ leg.sourceCompanyName }}</td>\n <td>OINV</td>\n <td>\n <select\n *ngIf=\"isDraft(); else targetText\"\n class=\"form-select form-select-sm\"\n [ngModel]=\"leg.targetCompanyId\"\n (ngModelChange)=\"updateLegTarget(leg, $event)\"\n [disabled]=\"isMutatingLegs\"\n >\n <option *ngFor=\"let c of companies\" [ngValue]=\"c.id\">{{ c.companyName }}</option>\n </select>\n <ng-template #targetText>{{ leg.targetCompanyName }}</ng-template>\n </td>\n <td>\n <select\n *ngIf=\"isDraft(); else behaviorText\"\n class=\"form-select form-select-sm\"\n [ngModel]=\"leg.legBehavior\"\n (ngModelChange)=\"updateLegBehavior(leg, $event)\"\n [disabled]=\"isMutatingLegs\"\n >\n <option *ngFor=\"let b of legBehaviors\" [ngValue]=\"b.value\">{{ b.label }}</option>\n </select>\n <ng-template #behaviorText>{{ legBehaviors[leg.legBehavior]?.label }}</ng-template>\n </td>\n <td>\n <select\n *ngIf=\"isDraft() && isConstructionDraftSelectable(leg); else targetDocText\"\n class=\"form-select form-select-sm\"\n [ngModel]=\"leg.selectedConstructionDraftDocType\"\n (ngModelChange)=\"updateLegConstructionDraftDocType(leg, $event)\"\n [disabled]=\"isMutatingLegs\"\n >\n <option [ngValue]=\"null\">{{ 'FBDocumentFlow::SelectPlaceholderEllipsis' | abpLocalization }}</option>\n <option *ngFor=\"let o of constructionDraftDocTypeOptions\" [ngValue]=\"o.value\">{{ o.label }}</option>\n </select>\n <ng-template #targetDocText>{{ legTargetDocLabel(leg) }}</ng-template>\n </td>\n <td>\n <span *ngIf=\"leg.resolvedOpchCardCode\">{{ leg.resolvedOpchCardCode }}</span>\n <div *ngIf=\"!leg.resolvedOpchCardCode\" class=\"d-flex flex-column align-items-start py-1\">\n <span class=\"badge bg-danger\">{{ 'FBDocumentFlow::NotMapped' | abpLocalization }}</span>\n <button\n type=\"button\"\n class=\"btn btn-outline-danger btn-sm mt-2 py-0 px-2\"\n style=\"font-size: 0.72rem\"\n (click)=\"goToPartnerMapping(leg)\"\n [title]=\"'FBDocumentFlow::GoToPartnerMappingTooltip' | abpLocalization\"\n >\n <i class=\"fa fa-link me-1\"></i>{{ 'FBDocumentFlow::Match' | abpLocalization }}\n </button>\n </div>\n </td>\n <td>\n <input\n *ngIf=\"isDraft(); else currencyText\"\n type=\"text\"\n class=\"form-control form-control-sm\"\n style=\"width: 5.5rem\"\n [(ngModel)]=\"leg.currency\"\n [placeholder]=\"newState?.currency || ('FBDocumentFlow::FromSource' | abpLocalization)\"\n />\n <ng-template #currencyText>{{ leg.currency || newState?.currency }}</ng-template>\n </td>\n <td>\n <input\n *ngIf=\"isDraft(); else rateText\"\n type=\"number\"\n class=\"form-control form-control-sm\"\n style=\"width: 6rem\"\n [(ngModel)]=\"leg.exchangeRate\"\n [placeholder]=\"'FBDocumentFlow::FromSource' | abpLocalization\"\n />\n <ng-template #rateText>{{ leg.exchangeRate ?? '-' }}</ng-template>\n </td>\n <!-- Spec \u00A79 - art\u0131r\u0131m YALNIZCA bu baca\u011F\u0131n olu\u015Fturdu\u011Fu devam M\u00FC\u015Fteri Faturas\u0131na (bir\n sonraki bacak varsa) uygulan\u0131r; bu hem IntermediateChain hem ConstructionChain i\u00E7in\n ge\u00E7erlidir (Construction'da da nextTargetCompanyId.HasValue ise devam OINV'i\n art\u0131r\u0131mla olu\u015Fturuluyor). \u00D6nceden Construction bacaklar\u0131 legBehavior'a bak\u0131larak\n KO\u015EULSUZ \"-\" g\u00F6steriyordu - zincirin SON baca\u011F\u0131 olmayan bir Construction baca\u011F\u0131n\u0131n\n hedefinde art\u0131r\u0131m oran\u0131 tan\u0131ms\u0131zken kullan\u0131c\u0131 hi\u00E7 uyar\u0131lm\u0131yordu (kod incelemesiyle\n tespit edildi). Do\u011Fru ko\u015Ful \"zincirin son baca\u011F\u0131 m\u0131\" (legTargetDocLabel'daki\n isLastLeg ile ayn\u0131 mant\u0131k), legBehavior de\u011Fil. -->\n <td>\n <span *ngIf=\"leg.sequenceNo >= (workingCopy?.legs?.length ?? 0)\">-</span>\n <ng-container *ngIf=\"leg.sequenceNo < (workingCopy?.legs?.length ?? 0)\">\n <span *ngIf=\"leg.increaseRateApplied ?? leg.plannedIncreaseRate as rate\">{{ rate | number: '1.2-2' }}</span>\n <span\n class=\"text-danger\"\n *ngIf=\"!(leg.increaseRateApplied ?? leg.plannedIncreaseRate)\"\n [title]=\"'FBDocumentFlow::IncreaseRateUndefinedTooltip' | abpLocalization\"\n >\n {{ 'FBDocumentFlow::Undefined' | abpLocalization }}\n </span>\n </ng-container>\n </td>\n <td *ngIf=\"isDraft()\">\n <button\n class=\"btn btn-sm btn-outline-danger\"\n (click)=\"removeLeg(leg)\"\n [disabled]=\"isMutatingLegs || workingCopy.legs.length <= 1\"\n [title]=\"'FBDocumentFlow::DeleteLegTooltip' | abpLocalization\"\n >\n <i class=\"fa fa-trash\"></i>\n </button>\n </td>\n </tr>\n <tr class=\"table-light\" *ngIf=\"!isDraft()\">\n <td></td>\n <td colspan=\"9\">\n <div class=\"d-flex align-items-center flex-wrap gap-3\">\n <span>\n <strong>{{ 'FBDocumentFlow::Status' | abpLocalization }}:</strong>\n <span\n class=\"badge ms-1\"\n [class.bg-secondary]=\"leg.status === 0\"\n [class.bg-success]=\"leg.status === 1\"\n [class.bg-danger]=\"leg.status === 2\"\n [class.bg-warning]=\"leg.status === 3\"\n >\n {{ legStatusLabel(leg.status) }}\n </span>\n </span>\n <span *ngIf=\"createdDocumentsSummary(leg) as docs\"><strong>{{ 'FBDocumentFlow::ResultDocuments' | abpLocalization }}:</strong> {{ docs }}</span>\n <span class=\"text-danger\" *ngIf=\"leg.errorMessage\"><strong>{{ 'FBDocumentFlow::Error' | abpLocalization }}:</strong> {{ leg.errorMessage }}</span>\n <button\n class=\"btn btn-sm btn-outline-primary ms-auto\"\n (click)=\"executeLeg(leg)\"\n [disabled]=\"isExecuting || !canExecuteLeg(leg)\"\n >\n <span *ngIf=\"isExecuting\" class=\"spinner-border spinner-border-sm me-1\"></span>\n {{ 'FBDocumentFlow::Execute' | abpLocalization }}\n </button>\n </div>\n </td>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </div>\n\n <ul class=\"text-muted small\" *ngIf=\"isDraft()\">\n <li>{{ 'FBDocumentFlow::NoteNumAtCardCarryOver' | abpLocalization }}</li>\n <li>{{ 'FBDocumentFlow::NoteIncreaseRateScope' | abpLocalization }}</li>\n <li>{{ 'FBDocumentFlow::NoteCardCodeResolution' | abpLocalization }}</li>\n </ul>\n </ng-container>\n\n <div class=\"d-flex justify-content-end gap-2 mt-3\">\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"backToList()\">{{ (isDraft() ? 'AbpUi::Cancel' : 'FBDocumentFlow::Close') | abpLocalization }}</button>\n <button\n type=\"button\"\n class=\"btn btn-primary\"\n (click)=\"startFlow()\"\n *ngIf=\"isDraft() && workingCopy\"\n [disabled]=\"isStarting || hasMissingConstructionDraftSelection()\"\n >\n <span *ngIf=\"isStarting\" class=\"spinner-border spinner-border-sm me-1\"></span>\n {{ 'FBDocumentFlow::StartDocumentFlow' | abpLocalization }}\n </button>\n </div>\n </ng-container>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i8.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i8.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i8.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i8.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i8.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: i7.DecimalPipe, name: "number" }, { kind: "pipe", type: i6.LocalizationPipe, name: "abpLocalization" }] });
|
|
470
483
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: HitDocumentTransferDetailComponent, decorators: [{
|
|
471
484
|
type: Component,
|
|
472
|
-
args: [{ selector: 'hit-document-transfer-detail', template: "<div class=\"card\">\n <div class=\"card-header py-3\">\n <div class=\"row align-items-center\">\n <div class=\"col\">\n <h5 class=\"card-title mb-0\">Belge Ak\u0131\u015F\u0131 / Intercompany Aktar\u0131m\u0131</h5>\n </div>\n <div class=\"col-auto\">\n <button class=\"btn btn-sm btn-outline-secondary\" (click)=\"backToList()\">\n <i class=\"fa fa-arrow-left me-1\"></i>Listeye D\u00F6n\n </button>\n </div>\n </div>\n </div>\n <div class=\"card-body pt-3\">\n <div *ngIf=\"isLoading\" class=\"text-center py-5\">\n <div class=\"spinner-border text-primary\" role=\"status\"></div>\n <div class=\"mt-2 text-muted\">Y\u00FCkleniyor...</div>\n </div>\n\n <ng-container *ngIf=\"!isLoading\">\n <!-- Bu sat\u0131r hem \"yeni\" (hen\u00FCz kay\u0131t olu\u015Fmam\u0131\u015F) hem de kay\u0131t olu\u015Ftuktan sonraki taslak durumunda\n AYNI alan setini g\u00F6sterir - kay\u0131t olu\u015Funca ekran\u0131n alan seti de\u011Fi\u015Fip kullan\u0131c\u0131da \"ba\u015Fka bir\n kay\u0131t m\u0131 bu\" izlenimi vermesin diye. De\u011Ferler \u00F6nce newState'ten (istemcide tutulan \u00F6nizleme),\n o yoksa olu\u015Fan kayd\u0131n ilk baca\u011F\u0131ndan (workingCopy.legs[0]) okunur - ilk bacak her zaman\n newState'in temsil etti\u011Fi \"ilk hedef\" ad\u0131m\u0131yla ayn\u0131 belgedir. -->\n <div class=\"row g-3 mb-3\" *ngIf=\"newState || workingCopy\">\n <div class=\"col-md-3\">\n <label class=\"form-label\">Kaynak \u015Eirket</label>\n <input type=\"text\" class=\"form-control\" [value]=\"companyName()\" disabled />\n </div>\n <div class=\"col-md-2\">\n <label class=\"form-label\">Belge No</label>\n <input type=\"text\" class=\"form-control\" [value]=\"newState?.docNum ?? workingCopy?.sourceOinvDocNum\" disabled />\n </div>\n <div class=\"col-md-2\">\n <label class=\"form-label\">NumAtCard</label>\n <input type=\"text\" class=\"form-control\" [value]=\"newState?.numAtCard ?? workingCopy?.sourceOinvNumAtCard\" disabled />\n </div>\n <div class=\"col-md-1\">\n <label class=\"form-label\">Proje</label>\n <input type=\"text\" class=\"form-control\" [value]=\"newState?.projectCode ?? workingCopy?.projectCode\" disabled />\n </div>\n <div class=\"col-md-2\">\n <label class=\"form-label\">\u0130lk Hedef</label>\n <input type=\"text\" class=\"form-control\" [value]=\"newState?.targetCompanyName ?? workingCopy?.legs?.[0]?.targetCompanyName\" disabled />\n </div>\n <div class=\"col-md-2\">\n <label class=\"form-label\">D\u00F6viz</label>\n <input type=\"text\" class=\"form-control\" [value]=\"newState?.currency ?? workingCopy?.legs?.[0]?.currency\" disabled />\n </div>\n </div>\n\n <!-- Belge Durumu her zaman (yeni kay\u0131tta da) g\u00F6r\u00FCn\u00FCr; Intercompany Id/Aktar\u0131m Durumu/Senaryo yaln\u0131zca\n kay\u0131t olu\u015Ftuktan sonra vard\u0131r - kullan\u0131c\u0131 iste\u011Fiyle hepsi ayn\u0131 sat\u0131rda, Belge Durumu'nun yan\u0131na\n topland\u0131 (\u00F6nceden Intercompany Id/Aktar\u0131m Durumu ayr\u0131 bir sat\u0131rdayd\u0131). -->\n <div class=\"row g-3 mb-3\" *ngIf=\"newState || workingCopy\">\n <div class=\"col-md-2\">\n <label class=\"form-label\">Kaynak Belge Durumu</label>\n <input\n type=\"text\"\n class=\"form-control\"\n [value]=\"sourceDocumentLifecycleLabel(newState?.sourceDocumentLifecycle ?? workingCopy?.sourceDocumentLifecycle)\"\n disabled\n />\n </div>\n <div class=\"col-md-2\">\n <label class=\"form-label\">Hedef Belge Durumu</label>\n <!-- Aktar\u0131m hen\u00FCz olu\u015Fturulmad\u0131ysa (isNew) burada se\u00E7ilebilir - kaynaktan ba\u011F\u0131ms\u0131z bir karard\u0131r\n (kullan\u0131c\u0131 geri bildirimiyle netle\u015Ftirildi: kayna\u011F\u0131n modu sabit, hedefin modu burada se\u00E7ilir).\n Olu\u015Ftuktan sonra backend'de sabitlendi\u011Fi i\u00E7in (workingCopy) salt-okunur g\u00F6sterilir. -->\n <select *ngIf=\"isNew && newState\" class=\"form-select\" [(ngModel)]=\"newState.targetDocumentLifecycle\">\n <option *ngFor=\"let o of documentLifecycleOptions\" [ngValue]=\"o.value\">{{ o.label }}</option>\n </select>\n <input\n *ngIf=\"!isNew || !newState\"\n type=\"text\"\n class=\"form-control\"\n [value]=\"sourceDocumentLifecycleLabel(newState?.targetDocumentLifecycle ?? workingCopy?.targetDocumentLifecycle)\"\n disabled\n />\n </div>\n <div class=\"col-md-3\" *ngIf=\"workingCopy\">\n <label class=\"form-label\">Intercompany Id</label>\n <input type=\"text\" class=\"form-control\" [value]=\"workingCopy.intercompanyId\" disabled />\n </div>\n <div class=\"col-md-2\" *ngIf=\"workingCopy\">\n <label class=\"form-label\">Aktar\u0131m Durumu</label>\n <input type=\"text\" class=\"form-control\" [value]=\"statusLabel(workingCopy.status)\" disabled />\n </div>\n <!-- Senaryo, aktar\u0131m hen\u00FCz \u00E7al\u0131\u015Ft\u0131r\u0131lmam\u0131\u015Fken (isDraft()) alt\u0131ndaki \"Haz\u0131r Senaryo\" dropdown'\u0131nda\n zaten d\u00FCzenlenebilir/g\u00F6r\u00FCn\u00FCr durumda - ayn\u0131 bilgiyi burada salt-okunur tekrar g\u00F6stermek\n (kullan\u0131c\u0131 geri bildirimiyle tespit edildi) kafa kar\u0131\u015Ft\u0131r\u0131yordu. Yaln\u0131zca aktar\u0131m art\u0131k\n d\u00FCzenlenemez hale geldi\u011Finde (dropdown kayboldu\u011Funda) burada g\u00F6sterilir. -->\n <div class=\"col-md-3\" *ngIf=\"workingCopy && !isDraft()\">\n <label class=\"form-label\">Senaryo</label>\n <input type=\"text\" class=\"form-control\" [value]=\"scenarioName()\" disabled />\n </div>\n </div>\n\n <!-- Taslak: haz\u0131r senaryo se\u00E7imi, hen\u00FCz \u00E7al\u0131\u015Ft\u0131r\u0131lmad\u0131. -->\n <ng-container *ngIf=\"isDraft()\">\n <div class=\"row g-3 align-items-end mb-3\">\n <div class=\"col-md-4\">\n <label class=\"form-label\">Haz\u0131r Senaryo</label>\n <select class=\"form-select\" [(ngModel)]=\"scenarioId\">\n <option [ngValue]=\"''\">Senaryosuz (yaln\u0131zca ilk hedef baca\u011F\u0131)</option>\n <option *ngFor=\"let s of availableScenarios()\" [ngValue]=\"s.id\">{{ s.name }}</option>\n </select>\n </div>\n <div class=\"col-md-2\">\n <button\n class=\"btn btn-outline-primary\"\n (click)=\"isNew ? fetchScenario() : applyScenario()\"\n [disabled]=\"isFetchingScenario\"\n >\n <span *ngIf=\"isFetchingScenario\" class=\"spinner-border spinner-border-sm me-1\"></span>\n {{ isNew ? 'Senaryoyu Getir' : 'Senaryoyu Uygula' }}\n </button>\n </div>\n </div>\n </ng-container>\n\n <!-- NumAtCard alanlar\u0131 art\u0131k isDraft()'a ba\u011Fl\u0131 DE\u011E\u0130L: taslakta d\u00FCzenlenebilir, \u00E7al\u0131\u015Ft\u0131r\u0131ld\u0131ktan\n sonra (isDraft() false olsa da) salt-okunur olarak ekranda kal\u0131r - \"Haz\u0131r Senaryo\" blo\u011Fuyla\n birlikte tamamen kaybolmas\u0131n diye. -->\n <ng-container *ngIf=\"workingCopy\">\n <div class=\"row g-3 align-items-end mb-3\" *ngIf=\"hasIntermediateNumAtCardLegs()\">\n <div class=\"col-md-3\" *ngFor=\"let leg of workingCopy.legs\">\n <ng-container *ngIf=\"leg.legBehavior === 0 && leg.sequenceNo < workingCopy.legs.length\">\n <label class=\"form-label\">{{ leg.sequenceNo }}. Bacak - {{ leg.targetCompanyName }} M\u00FC\u015Fteri Faturas\u0131 NumAtCard</label>\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"leg.numAtCard\" [disabled]=\"!isDraft()\" />\n </ng-container>\n </div>\n </div>\n\n <div class=\"alert alert-warning\" *ngIf=\"isDraft() && hasMissingIncreaseRate()\">\n Uyar\u0131: \u0130lgili \u015Firkette/projede art\u0131r\u0131m oran\u0131 0 / NULL. Art\u0131r\u0131m uygulanmadan devam etmek istiyor musunuz?\n </div>\n\n <div class=\"alert alert-warning\" *ngIf=\"isDraft() && hasMissingConstructionDraftSelection()\">\n Uyar\u0131: Hedef Belge Durumu Taslak oldu\u011Funda Construction bacaklar\u0131nda OPOR \u2192 OPDN \u2192 OPCH zinciri taslak belgeler aras\u0131nda\n \u00E7al\u0131\u015Fmaz. \"Hedefte Olu\u015Facak\" s\u00FCtunundan bu bacaklar i\u00E7in tek bir belge tipi (OPOR / OPDN / OPCH) se\u00E7melisiniz.\n </div>\n </ng-container>\n\n <!-- Tek tablo: taslakta da, \u00E7al\u0131\u015Ft\u0131r\u0131ld\u0131ktan sonra da AYNI s\u00FCtun seti (S\u0131ra..Art\u0131r\u0131m) korunur;\n Durum/Sonu\u00E7 Belge/Hata/\u00C7al\u0131\u015Ft\u0131r yaln\u0131zca \u00E7al\u0131\u015Ft\u0131r\u0131ld\u0131ktan sonra, her sat\u0131r\u0131n ALTINA ikinci bir\n sat\u0131r olarak eklenir - eskiden bu bilgiler ayr\u0131 ve daha dar bir tabloya ge\u00E7ilerek g\u00F6steriliyordu,\n bu da Kaynak Belge/Hedefte Olu\u015Facak gibi s\u00FCtunlar\u0131n \"kaybolmu\u015F\" g\u00F6r\u00FCnmesine yol a\u00E7\u0131yordu. -->\n <ng-container *ngIf=\"workingCopy\">\n <div class=\"d-flex justify-content-between align-items-center mb-2\">\n <div>\n <h6 class=\"mb-0\">{{ isDraft() ? 'Senaryo \u00C7al\u0131\u015Fma Kopyas\u0131' : 'Aktar\u0131m Sonucu' }}</h6>\n <small class=\"text-muted\" *ngIf=\"isDraft()\">Bu tablo yaln\u0131zca \u00E7al\u0131\u015Fma kopyas\u0131n\u0131 d\u00FCzenler; ana senaryoyu de\u011Fi\u015Ftirmez.</small>\n </div>\n <button class=\"btn btn-sm btn-outline-primary\" (click)=\"addLeg()\" *ngIf=\"isDraft()\" [disabled]=\"isMutatingLegs\">\n <i class=\"fa fa-plus me-1\"></i>Bacak Ekle\n </button>\n <button class=\"btn btn-sm btn-outline-danger\" (click)=\"cancelChain()\" *ngIf=\"canCancelChain()\">\n <i class=\"fa fa-ban me-1\"></i>Zinciri \u0130ptal Et\n </button>\n </div>\n\n <div class=\"alert alert-secondary small\" *ngIf=\"workingCopy.status === 4\">\n Bu zincir iptal edildi, bacaklar\u0131 art\u0131k \u00E7al\u0131\u015Ft\u0131r\u0131lamaz/d\u00FCzenlenemez. Yeniden denemek i\u00E7in\n \"Listeye D\u00F6n\"den kaynak faturay\u0131 tekrar se\u00E7ip yeni bir aktar\u0131m ba\u015Flat\u0131n - bu, yeni bir Intercompany Id ile\n \u00E7al\u0131\u015F\u0131r.\n </div>\n\n <div class=\"table-responsive\">\n <table class=\"table table-sm table-bordered align-middle\">\n <thead>\n <tr>\n <th>S\u0131ra</th>\n <th>Kaynak</th>\n <th>Kaynak Belge</th>\n <th>Hedef</th>\n <th>Davran\u0131\u015F</th>\n <th>Hedefte Olu\u015Facak</th>\n <th>OPCH CardCode</th>\n <th>D\u00F6viz</th>\n <th>Kur</th>\n <th>Art\u0131r\u0131m</th>\n <th *ngIf=\"isDraft()\"></th>\n </tr>\n </thead>\n <tbody>\n <ng-container *ngFor=\"let leg of workingCopy.legs\">\n <tr>\n <td>{{ leg.sequenceNo }}</td>\n <td>{{ leg.sourceCompanyName }}</td>\n <td>OINV</td>\n <td>\n <select\n *ngIf=\"isDraft(); else targetText\"\n class=\"form-select form-select-sm\"\n [ngModel]=\"leg.targetCompanyId\"\n (ngModelChange)=\"updateLegTarget(leg, $event)\"\n [disabled]=\"isMutatingLegs\"\n >\n <option *ngFor=\"let c of companies\" [ngValue]=\"c.id\">{{ c.companyName }}</option>\n </select>\n <ng-template #targetText>{{ leg.targetCompanyName }}</ng-template>\n </td>\n <td>\n <select\n *ngIf=\"isDraft(); else behaviorText\"\n class=\"form-select form-select-sm\"\n [ngModel]=\"leg.legBehavior\"\n (ngModelChange)=\"updateLegBehavior(leg, $event)\"\n [disabled]=\"isMutatingLegs\"\n >\n <option *ngFor=\"let b of legBehaviors\" [ngValue]=\"b.value\">{{ b.label }}</option>\n </select>\n <ng-template #behaviorText>{{ legBehaviors[leg.legBehavior]?.label }}</ng-template>\n </td>\n <td>\n <select\n *ngIf=\"isDraft() && isConstructionDraftSelectable(leg); else targetDocText\"\n class=\"form-select form-select-sm\"\n [ngModel]=\"leg.selectedConstructionDraftDocType\"\n (ngModelChange)=\"updateLegConstructionDraftDocType(leg, $event)\"\n [disabled]=\"isMutatingLegs\"\n >\n <option [ngValue]=\"null\">Se\u00E7iniz...</option>\n <option *ngFor=\"let o of constructionDraftDocTypeOptions\" [ngValue]=\"o.value\">{{ o.label }}</option>\n </select>\n <ng-template #targetDocText>{{ legTargetDocLabel(leg) }}</ng-template>\n </td>\n <td>\n <span *ngIf=\"leg.resolvedOpchCardCode\">{{ leg.resolvedOpchCardCode }}</span>\n <div *ngIf=\"!leg.resolvedOpchCardCode\" class=\"d-flex flex-column align-items-start py-1\">\n <span class=\"badge bg-danger\">E\u015Fle\u015Ftirilmedi</span>\n <button\n type=\"button\"\n class=\"btn btn-outline-danger btn-sm mt-2 py-0 px-2\"\n style=\"font-size: 0.72rem\"\n (click)=\"goToPartnerMapping(leg)\"\n title=\"Muhatap E\u015Fle\u015Ftirmeleri ekran\u0131na git\"\n >\n <i class=\"fa fa-link me-1\"></i>E\u015Fle\u015Ftir\n </button>\n </div>\n </td>\n <td>\n <input\n *ngIf=\"isDraft(); else currencyText\"\n type=\"text\"\n class=\"form-control form-control-sm\"\n style=\"width: 5.5rem\"\n [(ngModel)]=\"leg.currency\"\n [placeholder]=\"newState?.currency || 'Kaynaktan'\"\n />\n <ng-template #currencyText>{{ leg.currency || newState?.currency }}</ng-template>\n </td>\n <td>\n <input\n *ngIf=\"isDraft(); else rateText\"\n type=\"number\"\n class=\"form-control form-control-sm\"\n style=\"width: 6rem\"\n [(ngModel)]=\"leg.exchangeRate\"\n placeholder=\"Kaynaktan\"\n />\n <ng-template #rateText>{{ leg.exchangeRate ?? '-' }}</ng-template>\n </td>\n <!-- Spec \u00A79 - art\u0131r\u0131m YALNIZCA bu baca\u011F\u0131n olu\u015Fturdu\u011Fu devam M\u00FC\u015Fteri Faturas\u0131na (bir\n sonraki bacak varsa) uygulan\u0131r; bu hem IntermediateChain hem ConstructionChain i\u00E7in\n ge\u00E7erlidir (Construction'da da nextTargetCompanyId.HasValue ise devam OINV'i\n art\u0131r\u0131mla olu\u015Fturuluyor). \u00D6nceden Construction bacaklar\u0131 legBehavior'a bak\u0131larak\n KO\u015EULSUZ \"-\" g\u00F6steriyordu - zincirin SON baca\u011F\u0131 olmayan bir Construction baca\u011F\u0131n\u0131n\n hedefinde art\u0131r\u0131m oran\u0131 tan\u0131ms\u0131zken kullan\u0131c\u0131 hi\u00E7 uyar\u0131lm\u0131yordu (kod incelemesiyle\n tespit edildi). Do\u011Fru ko\u015Ful \"zincirin son baca\u011F\u0131 m\u0131\" (legTargetDocLabel'daki\n isLastLeg ile ayn\u0131 mant\u0131k), legBehavior de\u011Fil. -->\n <td>\n <span *ngIf=\"leg.sequenceNo >= (workingCopy?.legs?.length ?? 0)\">-</span>\n <ng-container *ngIf=\"leg.sequenceNo < (workingCopy?.legs?.length ?? 0)\">\n <span *ngIf=\"leg.increaseRateApplied ?? leg.plannedIncreaseRate as rate\">{{ rate | number: '1.2-2' }}</span>\n <span\n class=\"text-danger\"\n *ngIf=\"!(leg.increaseRateApplied ?? leg.plannedIncreaseRate)\"\n title=\"Bu \u015Firkette bu proje i\u00E7in art\u0131r\u0131m oran\u0131 tan\u0131ml\u0131 de\u011Fildir. Art\u0131r\u0131m uygulanmadan devam edilecektir.\"\n >\n Tan\u0131ms\u0131z\n </span>\n </ng-container>\n </td>\n <td *ngIf=\"isDraft()\">\n <button\n class=\"btn btn-sm btn-outline-danger\"\n (click)=\"removeLeg(leg)\"\n [disabled]=\"isMutatingLegs || workingCopy.legs.length <= 1\"\n title=\"Baca\u011F\u0131 Sil\"\n >\n <i class=\"fa fa-trash\"></i>\n </button>\n </td>\n </tr>\n <tr class=\"table-light\" *ngIf=\"!isDraft()\">\n <td></td>\n <td colspan=\"9\">\n <div class=\"d-flex align-items-center flex-wrap gap-3\">\n <span>\n <strong>Durum:</strong>\n <span\n class=\"badge ms-1\"\n [class.bg-secondary]=\"leg.status === 0\"\n [class.bg-success]=\"leg.status === 1\"\n [class.bg-danger]=\"leg.status === 2\"\n [class.bg-warning]=\"leg.status === 3\"\n >\n {{ legStatusLabel(leg.status) }}\n </span>\n </span>\n <span *ngIf=\"createdDocumentsSummary(leg) as docs\"><strong>Sonu\u00E7 Belge(ler):</strong> {{ docs }}</span>\n <span class=\"text-danger\" *ngIf=\"leg.errorMessage\"><strong>Hata:</strong> {{ leg.errorMessage }}</span>\n <button\n class=\"btn btn-sm btn-outline-primary ms-auto\"\n (click)=\"executeLeg(leg)\"\n [disabled]=\"isExecuting || !canExecuteLeg(leg)\"\n >\n <span *ngIf=\"isExecuting\" class=\"spinner-border spinner-border-sm me-1\"></span>\n \u00C7al\u0131\u015Ft\u0131r\n </button>\n </div>\n </td>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </div>\n\n <ul class=\"text-muted small\" *ngIf=\"isDraft()\">\n <li>\u015Eirketler aras\u0131 OINV \u2192 OPCH ge\u00E7i\u015Finde kaynak NumAtCard hedef OPCH.NumAtCard alan\u0131na aynen ta\u015F\u0131n\u0131r.</li>\n <li>Art\u0131r\u0131m yaln\u0131zca ayn\u0131 \u015Firket i\u00E7inde olu\u015Fturulan yeni M\u00FC\u015Fteri Faturas\u0131na uygulan\u0131r; navlun art\u0131r\u0131m oran\u0131ndan etkilenmez.</li>\n <li>Muhatap kodlar\u0131 Muhatap E\u015Fle\u015Ftirmeleri \u00FCzerinden \u00E7\u00F6z\u00FCl\u00FCr. Kur kaynak belgeden gelir ve kullan\u0131c\u0131 taraf\u0131ndan de\u011Fi\u015Ftirilebilir.</li>\n </ul>\n </ng-container>\n\n <div class=\"d-flex justify-content-end gap-2 mt-3\">\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"backToList()\">{{ isDraft() ? 'Vazge\u00E7' : 'Kapat' }}</button>\n <button\n type=\"button\"\n class=\"btn btn-primary\"\n (click)=\"startFlow()\"\n *ngIf=\"isDraft() && workingCopy\"\n [disabled]=\"isStarting || hasMissingConstructionDraftSelection()\"\n >\n <span *ngIf=\"isStarting\" class=\"spinner-border spinner-border-sm me-1\"></span>\n Belge Ak\u0131\u015F\u0131n\u0131 Ba\u015Flat\n </button>\n </div>\n </ng-container>\n </div>\n</div>\n" }]
|
|
473
|
-
}], ctorParameters: function () { return [{ type: i1.ActivatedRoute }, { type: i1.Router }, { type: i2.DocumentTransferService }, { type: i3.DocumentScenarioService }, { type: i4.SapCompanyProfileService }, { type: i5.ConfirmationService }]; } });
|
|
474
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGl0LWRvY3VtZW50LXRyYW5zZmVyLWRldGFpbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mYmRvY3VtZW50Zmxvdy9zcmMvbGliL2NvbXBvbmVudHMvaGl0LWRvY3VtZW50LXRyYW5zZmVycy9jb21wb25lbnRzL2hpdC1kb2N1bWVudC10cmFuc2Zlci1kZXRhaWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZmJkb2N1bWVudGZsb3cvc3JjL2xpYi9jb21wb25lbnRzL2hpdC1kb2N1bWVudC10cmFuc2ZlcnMvY29tcG9uZW50cy9oaXQtZG9jdW1lbnQtdHJhbnNmZXItZGV0YWlsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFFbEQsT0FBTyxFQUFFLFlBQVksRUFBdUIsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUNMLDZCQUE2QixFQUk3QixvQkFBb0IsR0FDckIsTUFBTSxtQ0FBbUMsQ0FBQztBQUMzQyxPQUFPLEVBQWdELFdBQVcsRUFBRSxNQUFNLG1DQUFtQyxDQUFDOzs7Ozs7Ozs7QUFHOUcsTUFBTSw4QkFBOEIsR0FBRyxDQUFDLENBQUM7QUFDekMsTUFBTSxrQ0FBa0MsR0FBRyxDQUFDLENBQUM7QUFDN0MsTUFBTSxrQ0FBa0MsR0FBRyxDQUFDLENBQUM7QUFDN0MsTUFBTSxvQ0FBb0MsR0FBRyxDQUFDLENBQUM7QUFDL0MsTUFBTSxvQ0FBb0MsR0FBRyxDQUFDLENBQUM7QUFDL0MsTUFBTSxtQ0FB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QUFDO1FBQzNCLElBQUksR0FBRyxDQUFDLDRCQUE0QixFQUFFO1lBQ3BDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsMEJBQTBCLElBQUksR0FBRyxDQUFDLDRCQUE0QixFQUFFLENBQUMsQ0FBQztTQUMxRjtRQUNELElBQUksR0FBRyxDQUFDLDJCQUEyQixFQUFFO1lBQ25DLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMseUJBQXlCLElBQUksR0FBRyxDQUFDLDJCQUEyQixFQUFFLENBQUMsQ0FBQztTQUN4RjtRQUNELElBQUksR0FBRyxDQUFDLGVBQWUsRUFBRTtZQUN2QixLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLGFBQWEsSUFBSSxHQUFHLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQztTQUNoRTtRQUNELElBQUksR0FBRyxDQUFDLDJCQUEyQixFQUFFO1lBQ25DLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMseUJBQXlCLElBQUksR0FBRyxDQUFDLDJCQUEyQixFQUFFLENBQUMsQ0FBQztTQUN4RjtRQUNELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzQixDQUFDOzsrSEEvZ0JVLGtDQUFrQzttSEFBbEMsa0NBQWtDLG9FQ2hEL0MscXZwQkFtV0E7MkZEblRhLGtDQUFrQztrQkFKOUMsU0FBUzsrQkFDRSw4QkFBOEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBDb25maXJtYXRpb24sIENvbmZpcm1hdGlvblNlcnZpY2UgfSBmcm9tICdAYWJwL25nLnRoZW1lLnNoYXJlZCc7XG5pbXBvcnQgeyBmcm9tLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY29uY2F0TWFwLCBmaW5hbGl6ZSwgc3dpdGNoTWFwLCB0b0FycmF5IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgQ29uc3RydWN0aW9uRHJhZnREb2N1bWVudFR5cGUsXG4gIERvY3VtZW50VHJhbnNmZXJEdG8sXG4gIERvY3VtZW50VHJhbnNmZXJMZWdEdG8sXG4gIERvY3VtZW50VHJhbnNmZXJTZXJ2aWNlLFxuICBTYXBEb2N1bWVudExpZmVjeWNsZSxcbn0gZnJvbSAnLi4vLi4vLi4vcHJveHkvZG9jdW1lbnQtdHJhbnNmZXJzJztcbmltcG9ydCB7IERvY3VtZW50U2NlbmFyaW9EdG8sIERvY3VtZW50U2NlbmFyaW9TZXJ2aWNlLCBMZWdCZWhhdmlvciB9IGZyb20gJy4uLy4uLy4uL3Byb3h5L2RvY3VtZW50LXNjZW5hcmlvcyc7XG5pbXBvcnQgeyBTYXBDb21wYW55UHJvZmlsZUR0bywgU2FwQ29tcGFueVByb2ZpbGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vcHJveHkvc2FwLWNvbXBhbnktcHJvZmlsZXMnO1xuXG5jb25zdCBET0NVTUVOVF9UUkFOU0ZFUl9TVEFUVVNfRFJBRlQgPSAwO1xuY29uc3QgRE9DVU1FTlRfVFJBTlNGRVJfU1RBVFVTX0NPTVBMRVRFRCA9IDI7XG5jb25zdCBET0NVTUVOVF9UUkFOU0ZFUl9TVEFUVVNfQ0FOQ0VMTEVEID0gNDtcbmNvbnN0IERPQ1VNRU5UX1RSQU5TRkVSX0xFR19TVEFUVVNfUEVORElORyA9IDA7XG5jb25zdCBET0NVTUVOVF9UUkFOU0ZFUl9MRUdfU1RBVFVTX1NVQ0NFU1MgPSAxO1xuY29uc3QgRE9DVU1FTlRfVFJBTlNGRVJfTEVHX1NUQVRVU19GQUlMRUQgPSAyO1xuXG4vLy8gQmVsZ2UgQWt0YXLEsW3EsSBsaXN0ZXNpbmRlbiBcIsSwxZ9sZW1sZXJcIiBpbGUgYnVyYXlhIGdlbGluaXIuIFBvcHVwIHllcmluZSBheXLEsSBiaXIgc2F5ZmEgb2xhcmFrXG4vLy8gdGFzYXJsYW5txLHFn3TEsXIga2kga3VsbGFuxLFjxLEgc29udWN1ICjDtnplbGxpa2xlIGhhdGEpIGtheWJldG1lZGVuIGluY2VsZXllYmlsc2luLCBzYXlmYXnEsSB5ZW5pbGV5ZWJpbHNpblxuLy8vIHZlIFwiTGlzdGV5ZSBEw7ZuXCIgaWxlIGhlciB6YW1hbiBheW7EsSB5ZXJlIGdlcmkgZMO2bmViaWxzaW4uXG5pbnRlcmZhY2UgTmV3VHJhbnNmZXJTdGF0ZSB7XG4gIHNvdXJjZUNvbXBhbnlJZDogc3RyaW5nO1xuICBzb3VyY2VDb21wYW55TmFtZT86IHN0cmluZztcbiAgZG9jRW50cnk6IG51bWJlcjtcbiAgZG9jTnVtPzogc3RyaW5nO1xuICBudW1BdENhcmQ/OiBzdHJpbmc7XG4gIHByb2plY3RDb2RlPzogc3RyaW5nO1xuICB0YXJnZXRDb21wYW55SWQ/OiBzdHJpbmc7XG4gIHRhcmdldENvbXBhbnlOYW1lPzogc3RyaW5nO1xuICBjdXJyZW5jeT86IHN0cmluZztcbiAgLy8gS2F5bmFrIGZhdHVyYW7EsW4ga2VuZGkgbW9kdSAtIEJlbGdlIEFrdGFyxLFtxLEgbGlzdGVzaW5kZWtpIGZpbHRyZWRlbiAoaGFuZ2kgZmF0dXJhIHNlw6dpbGRpeXNlIG9uYSBnw7ZyZSlcbiAgLy8gZ2VsaXIsIFNBQsSwVFTEsFIgdmUgYnUgZWtyYW5kYSBERcSexLDFnlTEsFLEsExFTUVaIChrdWxsYW7EsWPEsSBnZXJpIGJpbGRpcmltaXlsZSBuZXRsZcWfdGlyaWxkaToga2F5bmHEn8SxblxuICAvLyB0YXNsYWsvacWfbGVubWnFnyBvbG1hIGhhbGksIGhhbmdpIERvY0VudHJ5J25pbiBzZcOnaWxkacSfaW5lIGJhxJ9sxLEgZGXEn2nFn21leiBiaXIgZ2Vyw6dla3RpcikuXG4gIHNvdXJjZURvY3VtZW50TGlmZWN5Y2xlOiBTYXBEb2N1bWVudExpZmVjeWNsZTtcbiAgLy8gSGVkZWZ0ZSBvbHXFn2FjYWsgYmVsZ2VsZXJpbiBtb2R1IC0ga2F5bmFrdGFuIEJBxJ5JTVNJWiwga3VsbGFuxLFjxLEgYnUgZWtyYW5kYSBzZcOnZXIgKMO2ci4gS2F5xLF0bMSxIGJpclxuICAvLyBrYXluYWt0YW4gVGFzbGFrIGhlZGVmIGJlbGdlbGVyIMO8cmV0aWxlYmlsaXIpLlxuICB0YXJnZXREb2N1bWVudExpZmVjeWNsZTogU2FwRG9jdW1lbnRMaWZlY3ljbGU7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2hpdC1kb2N1bWVudC10cmFuc2Zlci1kZXRhaWwnLFxuICB0ZW1wbGF0ZVVybDogJy4vaGl0LWRvY3VtZW50LXRyYW5zZmVyLWRldGFpbC5jb21wb25lbnQuaHRtbCcsXG59KVxuZXhwb3J0IGNsYXNzIEhpdERvY3VtZW50VHJhbnNmZXJEZXRhaWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBpc05ldyA9IGZhbHNlO1xuICBuZXdTdGF0ZTogTmV3VHJhbnNmZXJTdGF0ZSB8IG51bGwgPSBudWxsO1xuXG4gIHNjZW5hcmlvczogRG9jdW1lbnRTY2VuYXJpb0R0b1tdID0gW107XG4gIHNjZW5hcmlvSWQgPSAnJztcbiAgaXNGZXRjaGluZ1NjZW5hcmlvID0gZmFsc2U7XG5cbiAgY29tcGFuaWVzOiBTYXBDb21wYW55UHJvZmlsZUR0b1tdID0gW107XG4gIGxlZ0JlaGF2aW9ycyA9IFtcbiAgICB7IHZhbHVlOiBMZWdCZWhhdmlvci5JbnRlcm1lZGlhdGVDaGFpbiwgbGFiZWw6ICdBcmEgxZ5pcmtldCcgfSxcbiAgICB7IHZhbHVlOiBMZWdCZWhhdmlvci5Db25zdHJ1Y3Rpb25DaGFpbiwgbGFiZWw6ICdDb25zdHJ1Y3Rpb24nIH0sXG4gIF07XG5cbiAgLy8gU3BlYyDCpzE0ICgxOC4wOS4yMDI2IGthcmFyxLEpIC0gc8O8cmXDpyBwYXJhbWV0cmlrLiBBa3RhcsSxbSBoZW7DvHogb2x1xZ90dXJ1bG1hZMSxeXNhIChpc05ldykga3VsbGFuxLFjxLEgYnVcbiAgLy8gZWtyYW5kYSBcIkhlZGVmIEJlbGdlIER1cnVtdVwibnUgc2XDp2ViaWxpciAoa2F5bmFrdGFuIGJhxJ/EsW1zxLF6KS4gQWt0YXLEsW0gb2x1xZ90dWt0YW4gc29ucmEgYnUgYWxhblxuICAvLyBiYWNrZW5kJ2RlIHNhYml0bGVuaXIgKERvY3VtZW50VHJhbnNmZXIuVGFyZ2V0RG9jdW1lbnRMaWZlY3ljbGUgaW1tdXRhYmxlKSwgYnUgecO8emRlbiB3b3JraW5nQ29weVxuICAvLyB2YXJrZW4gc2FsdC1va3VudXIgZ8O2c3RlcmlsaXIuIEt1bGxhbsSxY8SxIGlzdGXEn2l5bGUgS2F5bmFrIEJlbGdlIER1cnVtdSBpbGUgQVlOSSBldGlrZXRsZXIga3VsbGFuxLFsxLFyLlxuICBkb2N1bWVudExpZmVjeWNsZU9wdGlvbnMgPSBbXG4gICAgeyB2YWx1ZTogU2FwRG9jdW1lbnRMaWZlY3ljbGUuUG9zdGVkLCBsYWJlbDogJ0thecSxdGzEsSBNw7zFn3RlcmkgRmF0dXJhc8SxJyB9LFxuICAgIHsgdmFsdWU6IFNhcERvY3VtZW50TGlmZWN5Y2xlLkRyYWZ0LCBsYWJlbDogJ1Rhc2xhayBNw7zFn3RlcmkgRmF0dXJhc8SxJyB9LFxuICBdO1xuXG4gIC8vIFNwZWMgZWsga2FyYXIgKDE4LjA5LjIwMjYpIC0gaGVkZWYgVGFzbGFrIGlrZW4gQ29uc3RydWN0aW9uIGJhY2HEn8SxbsSxbiAoT1BPUuKGkk9QRE7ihpJPUENIKSB0YWJhbiBiZWxnZVxuICAvLyB6aW5jaXJpIHRhc2xha2xhciBhcmFzxLFuZGEgw6dhbMSxxZ9tYXo7IGJ1IGR1cnVtZGEga3VsbGFuxLFjxLEgw7zDpyBiZWxnZSB0aXBpbmRlbiB5YWxuxLF6Y2EgYmlyaW5pIHNlw6dlci5cbiAgY29uc3RydWN0aW9uRHJhZnREb2NUeXBlT3B0aW9ucyA9IFtcbiAgICB7IHZhbHVlOiBDb25zdHJ1Y3Rpb25EcmFmdERvY3VtZW50VHlwZS5QdXJjaGFzZU9yZGVyLCBsYWJlbDogJ09QT1InIH0sXG4gICAgeyB2YWx1ZTogQ29uc3RydWN0aW9uRHJhZnREb2N1bWVudFR5cGUuR29vZHNSZWNlaXB0LCBsYWJlbDogJ09QRE4nIH0sXG4gICAgeyB2YWx1ZTogQ29uc3RydWN0aW9uRHJhZnREb2N1bWVudFR5cGUuQVBJbnZvaWNlLCBsYWJlbDogJ09QQ0gnIH0sXG4gIF07XG5cbiAgd29ya2luZ0NvcHk6IERvY3VtZW50VHJhbnNmZXJEdG8gfCBudWxsID0gbnVsbDtcbiAgaXNMb2FkaW5nID0gZmFsc2U7XG4gIGlzU3RhcnRpbmcgPSBmYWxzZTtcbiAgaXNFeGVjdXRpbmcgPSBmYWxzZTtcbiAgaXNNdXRhdGluZ0xlZ3MgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgc2VydmljZTogRG9jdW1lbnRUcmFuc2ZlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzY2VuYXJpb1NlcnZpY2U6IERvY3VtZW50U2NlbmFyaW9TZXJ2aWNlLFxuICAgIHByaXZhdGUgY29tcGFueVNlcnZpY2U6IFNhcENvbXBhbnlQcm9maWxlU2VydmljZSxcbiAgICBwcml2YXRlIGNvbmZpcm1hdGlvbjogQ29uZmlybWF0aW9uU2VydmljZVxuICApIHt9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5zY2VuYXJpb1NlcnZpY2UuZ2V0TGlzdCh7IG1heFJlc3VsdENvdW50OiAxMDAwLCBza2lwQ291bnQ6IDAsIGlzQWN0aXZlOiB0cnVlIH0pLnN1YnNjcmliZShyZXN1bHQgPT4gKHRoaXMuc2NlbmFyaW9zID0gcmVzdWx0Lml0ZW1zKSk7XG4gICAgdGhpcy5jb21wYW55U2VydmljZS5nZXRMaXN0KHsgbWF4UmVzdWx0Q291bnQ6IDEwMDAsIHNraXBDb3VudDogMCwgaXNBY3RpdmU6IHRydWUgfSkuc3Vic2NyaWJlKHJlc3VsdCA9PiAodGhpcy5jb21wYW5pZXMgPSByZXN1bHQuaXRlbXMpKTtcblxuICAgIGNvbnN0IGlkID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5wYXJhbU1hcC5nZXQoJ2lkJyk7XG4gICAgaWYgKGlkID09PSAnbmV3Jykge1xuICAgICAgdGhpcy5pc05ldyA9IHRydWU7XG4gICAgICBjb25zdCBzdGF0ZSA9IGhpc3Rvcnkuc3RhdGUgYXMgTmV3VHJhbnNmZXJTdGF0ZSB8IHVuZGVmaW5lZDtcbiAgICAgIGlmICghc3RhdGU/LnNvdXJjZUNvbXBhbnlJZCB8fCBzdGF0ZS5kb2NFbnRyeSA9PSBudWxsKSB7XG4gICAgICAgIC8vIFNheWZhIGRvxJ9ydWRhbiB5ZW5pbGVubWnFny95ZW5pIHNla21lZGUgYcOnxLFsbcSxxZ9zYSByb3V0ZXIgc3RhdGUga2F5Ym9sdXI7IGtheW5hayBmYXR1cmFuxLFuXG4gICAgICAgIC8vIHNlw6dpbG1lc2kgZ2VyZWtlbiBsaXN0ZXllIGdlcmkgecO2bmxlbmRpcmlsaXIuXG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2ZiZG9jdW1lbnRmbG93L2RvY3VtZW50LXRyYW5zZmVycyddKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gc291cmNlRG9jdW1lbnRMaWZlY3ljbGUsIEJlbGdlIEFrdGFyxLFtxLEgbGlzdGVzaW5kZWtpIGZpbHRyZWRlbiBnZWxpciB2ZSBzYWJpdHRpciAocm91dGVyIHN0YXRlIGhpw6dcbiAgICAgIC8vIHRhxZ/EsW5tYWTEsXlzYSAtIMO2ci4gZG/En3J1ZGFuIGJhxJ9sYW50xLF5bGEgZ2VsaW5tacWfc2UgLSB2YXJzYXnEsWxhbiBLYXnEsXRsxLEga2FidWwgZWRpbGlyKS5cbiAgICAgIC8vIHRhcmdldERvY3VtZW50TGlmZWN5Y2xlIGlzZSBrdWxsYW7EsWPEsW7EsW4gYnUgZWtyYW5kYSBzZcOnZWNlxJ9pLCBrYXluYWt0YW4gYmHEn8SxbXPEsXogYmlyIGRlxJ9lcmRpcjtcbiAgICAgIC8vIGJhxZ9sYW5nxLHDp3RhIHZhcnNhecSxbGFuIG9sYXJhayBLYXnEsXRsxLEgZ2VsaXIsIGt1bGxhbsSxY8SxIGlzdGVyc2UgVGFzbGFrJ2Egw6dldmlyaXIuXG4gICAgICB0aGlzLm5ld1N0YXRlID0ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgc291cmNlRG9jdW1lbnRMaWZlY3ljbGU6IHN0YXRlLnNvdXJjZURvY3VtZW50TGlmZWN5Y2xlID8/IFNhcERvY3VtZW50TGlmZWN5Y2xlLlBvc3RlZCxcbiAgICAgICAgdGFyZ2V0RG9jdW1lbnRMaWZlY3ljbGU6IFNhcERvY3VtZW50TGlmZWN5Y2xlLlBvc3RlZCxcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChpZCkge1xuICAgICAgdGhpcy5sb2FkV29ya2luZ0NvcHkoaWQpO1xuICAgIH1cbiAgfVxuXG4gIGNvbXBhbnlOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubmV3U3RhdGU/LnNvdXJjZUNvbXBhbnlOYW1lID8/IHRoaXMud29ya2luZ0NvcHk/LnNvdXJjZUNvbXBhbnlOYW1lID8/ICcnO1xuICB9XG5cbiAgc2NlbmFyaW9OYW1lKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLndvcmtpbmdDb3B5Py5zY2VuYXJpb0lkKSB7XG4gICAgICByZXR1cm4gJ1NlbmFyeW9zdXogKHlhbG7EsXpjYSBpbGsgaGVkZWYgYmFjYcSfxLEpJztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2NlbmFyaW9zLmZpbmQocyA9PiBzLmlkID09PSB0aGlzLndvcmtpbmdDb3B5Py5zY2VuYXJpb0lkKT8ubmFtZSA/PyB0aGlzLndvcmtpbmdDb3B5LnNjZW5hcmlvSWQ7XG4gIH1cblxuICAvLyBCaXIgc2VuYXJ5b251biBpbGsgYmFjYcSfxLEgYmVsaXJsaSBiaXIga2F5bmFrIMWfaXJrZXQgdmUgaGVkZWYgxZ9pcmtldCBpw6dpbiB0YW7EsW1sYW5txLHFn3TEsXIuIFNwZWMgwqczIC1cbiAgLy8ga2F5bmFrIGJlbGdlbmluIGlsayBoZWRlZmkgaGVyIHphbWFuIE9JTlYuQ2FyZENvZGUgKyBNdWhhdGFwIEXFn2xlxZ90aXJtZWxlcmkgaWxlIHRlc3BpdCBlZGlsaXI7IGhhesSxclxuICAvLyBzZW5hcnlvIGJ1IGhlZGVmaSBkZcSfacWfdGlyZW1lei4gQnUgecO8emRlbiBoZW0ga2F5bmFrIMWfaXJrZXRpIGhlbSBkZSB6YXRlbiB0ZXNwaXQgZWRpbG1pxZ8gaWxrIGhlZGVmaVxuICAvLyB1eXXFn21heWFuIHNlbmFyeW9sYXIgc2XDp2lsZWJpbGlyIGxpc3RlZGVuIMOnxLFrYXLEsWzEsXIgLSBha3NpIGhhbGRlIGJhY2tlbmRcbiAgLy8gU2NlbmFyaW9Tb3VyY2VDb21wYW55TWlzbWF0Y2gvU2NlbmFyaW9GaXJzdFRhcmdldE1pc21hdGNoIGhhdGFzxLEgdmVyaXIuXG4gIGF2YWlsYWJsZVNjZW5hcmlvcygpOiBEb2N1bWVudFNjZW5hcmlvRHRvW10ge1xuICAgIGNvbnN0IHNvdXJjZUNvbXBhbnlJZCA9IHRoaXMubmV3U3RhdGU/LnNvdXJjZUNvbXBhbnlJZCA/PyB0aGlzLndvcmtpbmdDb3B5Py5zb3VyY2VDb21wYW55SWQ7XG4gICAgY29uc3QgcmVzb2x2ZWRUYXJnZXRDb21wYW55SWQgPSB0aGlzLm5ld1N0YXRlPy50YXJnZXRDb21wYW55SWQgPz8gdGhpcy53b3JraW5nQ29weT8ubGVncz8uWzBdPy50YXJnZXRDb21wYW55SWQ7XG4gICAgaWYgKCFzb3VyY2VDb21wYW55SWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjZW5hcmlvcztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zY2VuYXJpb3MuZmlsdGVyKHMgPT4ge1xuICAgICAgY29uc3QgZmlyc3RMZWcgPSBbLi4ucy5sZWdzXS5zb3J0KChhLCBiKSA9PiBhLnNlcXVlbmNlTm8gLSBiLnNlcXVlbmNlTm8pWzBdO1xuICAgICAgaWYgKCFmaXJzdExlZykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChmaXJzdExlZy5zb3VyY2VDb21wYW55SWQgIT09IHNvdXJjZUNvbXBhbnlJZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gIXJlc29sdmVkVGFyZ2V0Q29tcGFueUlkIHx8IGZpcnN0TGVnLnRhcmdldENvbXBhbnlJZCA9PT0gcmVzb2x2ZWRUYXJnZXRDb21wYW55SWQ7XG4gICAgfSk7XG4gIH1cblxuICBpc0RyYWZ0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzTmV3IHx8ICh0aGlzLndvcmtpbmdDb3B5Py5zdGF0dXMgPz8gRE9DVU1FTlRfVFJBTlNGRVJfU1RBVFVTX0RSQUZUKSA9PT0gRE9DVU1FTlRfVFJBTlNGRVJfU1RBVFVTX0RSQUZUO1xuICB9XG5cbiAgLy8gQmVrbGV5ZW4gYmFjYWtsYXIgaWxrIGtleiDDp2FsxLHFn3TEsXLEsWxhYmlsaXI7IGhhdGFsxLEgYmFjYWtsYXIgZGEgdGVrcmFyIGRlbmVuZWJpbGlyIMOnw7xua8O8IGJ1IG5va3RhZGFcbiAgLy8gaGVuw7x6IGhpw6diaXIgU0FQIGJlbGdlc2kgb2x1xZ9tYW3EscWfdMSxciAoYWtzaSBoYWxkZSBzcGVjIMKnMTMgZ2VyZcSfaSB0w7xtIHppbmNpciBpcHRhbCBlZGlsaXAgeWVuaWRlblxuICAvLyBrdXJ1bG1hbMSxZMSxciwgdGVrIGJhY2FrIHRla3JhcsSxIGRlxJ9pbCkuXG4gIC8vIFNwZWMgwqcxMi0xMyAtIGlwdGFsIGVkaWxtacWfICh2ZXlhIHRhbWFtbGFubcSxxZ8pIGJpciB6aW5jaXIgdGVrcmFyIMOnYWzEscWfdMSxcsSxbG1hejsga3VsbGFuxLFjxLEgeWVuaWRlblxuICAvLyBvbHXFn3R1cm1hIHPDvHJlY2luaSAoa2F5bmFrIGZhdHVyYWRhbiB5ZW5pIGJpciBha3RhcsSxbSBiYcWfbGF0YXJhaywgeWVuaSBiaXIgSW50ZXJjb21wYW55IElkIGlsZSlcbiAgLy8gYmHFn2xhdMSxci4gQmVrbGV5ZW4vSGF0YWzEsSBiaXIgYmFjYWsga2FsbcSxxZ8gb2xzYSBiaWxlICh6aW5jaXIgaGVuw7x6IHTDvG0gYmFjYWtsYXLEsSDDp2FsxLHFn3TEsXJtYWRhbiBpcHRhbFxuICAvLyBlZGlsZGl5c2UpIGJ1IGJhY2FrbGFyIGFydMSxayDDp2FsxLHFn3TEsXLEsWxhbWF6IC0gYmFja2VuZCBkYSBidW51IFRyYW5zZmVyTm90RWRpdGFibGUgaWxlIHJlZGRlZGVyLFxuICAvLyBidXJhZGEgYnV0b24gZW4gYmHFn3RhbiBkZXZyZSBkxLHFn8SxIGLEsXJha8SxbGFyYWsga3VsbGFuxLFjxLF5YSBuZXQgYmlyIHNpbnlhbCB2ZXJpbGlyLlxuICBjYW5FeGVjdXRlTGVnKGxlZzogRG9jdW1lbnRUcmFuc2ZlckxlZ0R0byk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHRyYW5zZmVyU3RhdHVzID0gdGhpcy53b3JraW5nQ29weT8uc3RhdHVzO1xuICAgIGlmICh0cmFuc2ZlclN0YXR1cyA9PT0gRE9DVU1FTlRfVFJBTlNGRVJfU1RBVFVTX0NBTkNFTExFRCB8fCB0cmFuc2ZlclN0YXR1cyA9PT0gRE9DVU1FTlRfVFJBTlNGRVJfU1RBVFVTX0NPTVBMRVRFRCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc0NvbnN0cnVjdGlvbkRyYWZ0U2VsZWN0YWJsZShsZWcpICYmIGxlZy5zZWxlY3RlZENvbnN0cnVjdGlvbkRyYWZ0RG9jVHlwZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBsZWcuc3RhdHVzID09PSBET0NVTUVOVF9UUkFOU0ZFUl9MRUdfU1RBVFVTX1BFTkRJTkcgfHwgbGVnLnN0YXR1cyA9PT0gRE9DVU1FTlRfVFJBTlNGRVJfTEVHX1NUQVRVU19GQUlMRUQ7XG4gIH1cblxuICAvLyBTcGVjIGVrIGthcmFyICgxOC4wOS4yMDI2KSAtIGhlZGVmIFRhc2xhayBpa2VuIENvbnN0cnVjdGlvbiBiYWNhxJ/EsW7EsW4gT1BPUuKGkk9QRE7ihpJPUENIIHRhYmFuIGJlbGdlXG4gIC8vIHppbmNpcmkgdGFzbGFrbGFyIGFyYXPEsW5kYSDDp2FsxLHFn21hejsgYnUgYmFjYWtsYXJkYSBrdWxsYW7EsWPEsSB6aW5jaXIgeWVyaW5lIFRFSyBiaXIgYmVsZ2UgdGlwaSBzZcOnZXJcbiAgLy8gKGJrei4gRXhlY3V0ZVNpbmdsZURyYWZ0RG9jdW1lbnRBc3luYywgYmFja2VuZCkuIEhlZGVmIEthecSxdGzEsSBpa2VuIChub3JtYWwgemluY2lyKSBidSBnZcOnZXJsaSBkZcSfaWxkaXIuXG4gIGlzQ29uc3RydWN0aW9uRHJhZnRTZWxlY3RhYmxlKGxlZzogRG9jdW1lbnRUcmFuc2ZlckxlZ0R0byk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBsZWcubGVnQmVoYXZpb3IgPT09IExlZ0JlaGF2aW9yLkNvbnN0cnVjdGlvbkNoYWluICYmIHRoaXMud29ya2luZ0NvcHk/LnRhcmdldERvY3VtZW50TGlmZWN5Y2xlID09PSBTYXBEb2N1bWVudExpZmVjeWNsZS5EcmFmdDtcbiAgfVxuXG4gIGhhc01pc3NpbmdDb25zdHJ1Y3Rpb25EcmFmdFNlbGVjdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHRoaXMud29ya2luZ0NvcHk/LmxlZ3MgPz8gW10pLnNvbWUobCA9PiB0aGlzLmlzQ29uc3RydWN0aW9uRHJhZnRTZWxlY3RhYmxlKGwpICYmIGwuc2VsZWN0ZWRDb25zdHJ1Y3Rpb25EcmFmdERvY1R5cGUgPT0gbnVsbCk7XG4gIH1cblxuICB1cGRhdGVMZWdDb25zdHJ1Y3Rpb25EcmFmdERvY1R5cGUobGVnOiBEb2N1bWVudFRyYW5zZmVyTGVnRHRvLCB2YWx1ZTogQ29uc3RydWN0aW9uRHJhZnREb2N1bWVudFR5cGUgfCBudWxsKSB7XG4gICAgaWYgKCF0aGlzLndvcmtpbmdDb3B5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGVnLnNlbGVjdGVkQ29uc3RydWN0aW9uRHJhZnREb2NUeXBlID0gdmFsdWUgPz8gdW5kZWZpbmVkO1xuICAgIHRoaXMucGVyc2lzdExlZ0NoYW5nZXMoKTtcbiAgfVxuXG4gIGxlZ1RhcmdldERvY0xhYmVsKGxlZzogRG9jdW1lbnRUcmFuc2ZlckxlZ0R0byk6IHN0cmluZyB7XG4gICAgY29uc3QgaXNMYXN0TGVnID0gbGVnLnNlcXVlbmNlTm8gPj0gKHRoaXMud29ya2luZ0NvcHk/LmxlZ3MubGVuZ3RoID8/IDApO1xuICAgIGlmIChsZWcubGVnQmVoYXZpb3IgPT09IExlZ0JlaGF2aW9yLkNvbnN0cnVjdGlvbkNoYWluKSB7XG4gICAgICBpZiAodGhpcy5pc0NvbnN0cnVjdGlvbkRyYWZ0U2VsZWN0YWJsZShsZWcpKSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkTGFiZWwgPVxuICAgICAgICAgIHRoaXMuY29uc3RydWN0aW9uRHJhZnREb2NUeXBlT3B0aW9ucy5maW5kKG8gPT4gby52YWx1ZSA9PT0gbGVnLnNlbGVjdGVkQ29uc3RydWN0aW9uRHJhZnREb2NUeXBlKT8ubGFiZWwgPz8gJ1Nlw6dpbG1lZGknO1xuICAgICAgICByZXR1cm4gaXNMYXN0TGVnID8gc2VsZWN0ZWRMYWJlbCA6IGAke3NlbGVjdGVkTGFiZWx9IOKGkiBPSU5WYDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpc0xhc3RMZWcgPyAnT1BPUiDihpIgT1BETiDihpIgT1BDSCcgOiAnT1BPUiDihpIgT1BETiDihpIgT1BDSCDihpIgT0lOVic7XG4gICAgfVxuICAgIHJldHVybiBpc0xhc3RMZWcgPyAnT1BDSCcgOiAnT1BDSCDihpIgT0lOVic7XG4gIH1cblxuICAvLyBTcGVjIMKnOSAtIGFydMSxcsSxbSB5YWxuxLF6Y2EgSW50ZXJtZWRpYXRlQ2hhaW4nZGUgZGXEn2lsLCBDb25zdHJ1Y3Rpb25DaGFpbiBiYWNhxJ/EsW7EsW4gKHNvbnJha2kgYmFjYWtcbiAgLy8gdmFyc2EpIG9sdcWfdHVyZHXEn3UgZGV2YW0gTcO8xZ90ZXJpIEZhdHVyYXPEsW5kYSBkYSB1eWd1bGFuxLFyIC0gw7ZuY2VkZW4geWFsbsSxemNhIEludGVybWVkaWF0ZUNoYWluXG4gIC8vIGtvbnRyb2wgZWRpbGl5b3JkdSwgYnUgZGEgYmlyIENvbnN0cnVjdGlvbiBiYWNhxJ/EsW7EsW4gaGVkZWZpbmRlIGFydMSxcsSxbSBvcmFuxLEgdGFuxLFtc8SxemtlbiBrdWxsYW7EsWPEsW7EsW5cbiAgLy8gaGnDpyB1eWFyxLFsbWFkYW4gc2Vzc2l6Y2UgYXJ0xLFyxLFtc8SxeiBkZXZhbSBlZGlsbWVzaW5lIHlvbCBhw6fEsXlvcmR1IChrb2QgaW5jZWxlbWVzaXlsZSB0ZXNwaXQgZWRpbGRpKS5cbiAgaGFzTWlzc2luZ0luY3JlYXNlUmF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHRoaXMud29ya2luZ0NvcHk/LmxlZ3MgPz8gW10pLnNvbWUoXG4gICAgICBsID0+XG4gICAgICAgIChsLmxlZ0JlaGF2aW9yID09PSBMZWdCZWhhdmlvci5JbnRlcm1lZGlhdGVDaGFpbiB8fCBsLmxlZ0JlaGF2aW9yID09PSBMZWdCZWhhdmlvci5Db25zdHJ1Y3Rpb25DaGFpbikgJiZcbiAgICAgICAgbC5wbGFubmVkSW5jcmVhc2VSYXRlID09IG51bGxcbiAgICApO1xuICB9XG5cbiAgLy8gTnVtQXRDYXJkIGdpcmnFn2kgeWFsbsSxemNhIGFyYSDFn2lya2V0IGJhY2FrbGFyxLFuZGFuLCB6aW5jaXJpbiBTT04gYmFjYcSfxLEgT0xNQVlBTkxBUiBpw6dpbiBhbmxhbWzEsWTEsXJcbiAgLy8gKG8gYmFjYWt0YSBheW7EsSDFn2lya2V0dGUgeWVuaSBiaXIgTcO8xZ90ZXJpIEZhdHVyYXPEsSBvbHXFn3V5b3IgdmUgTnVtQXRDYXJkJ8SxIGt1bGxhbsSxY8SxIGJlbGlybGVyKS5cbiAgaGFzSW50ZXJtZWRpYXRlTnVtQXRDYXJkTGVncygpOiBib29sZWFuIHtcbiAgICBjb25zdCBsZWdzID0gdGhpcy53b3JraW5nQ29weT8ubGVncyA/PyBbXTtcbiAgICByZXR1cm4gbGVncy5zb21lKGwgPT4gbC5sZWdCZWhhdmlvciA9PT0gTGVnQmVoYXZpb3IuSW50ZXJtZWRpYXRlQ2hhaW4gJiYgbC5zZXF1ZW5jZU5vIDwgbGVncy5sZW5ndGgpO1xuICB9XG5cbiAgLy8gU3BlYyDCpzQgLSBrdWxsYW7EsWPEsSDDp2FsxLHFn21hIGtvcHlhc8SxbmRha2kgYmFjYWtsYXLEsW4gaGVkZWYgxZ9pcmtldGluaS9kYXZyYW7EscWfxLFuxLEgKEFyYSDFnmlya2V0IHZleWFcbiAgLy8gQ29uc3RydWN0aW9uKSBkZcSfacWfdGlyZWJpbG1lbGk7IGJ1IGRlxJ9pxZ9pa2xpayB5YWxuxLF6Y2EgYnUgYWt0YXLEsW3EsW4gw6dhbMSxxZ9tYSBrb3B5YXPEsW7EsSBldGtpbGVyLCBhbmFcbiAgLy8gSGF6xLFyIFNlbmFyeW8gdGFuxLFtxLFuxLEgKHZhcnNhKSBoacOnIGRlxJ9pxZ90aXJtZXouIEtheW5hayDFn2lya2V0IGF5csSxY2EgZMO8emVubGVubWV6OiB6aW5jaXJkZWtpIGhlclxuICAvLyBiYWNhxJ/EsW4ga2F5bmHEn8SxLCBiaXIgw7ZuY2VraSBiYWNhxJ/EsW4gaGVkZWZpbmRlbiAodmV5YSBpbGsgYmFjYWtzYSBha3RhcsSxbcSxbiBrZW5kaSBrYXluYcSfxLFuZGFuKSBiYWNrZW5kXG4gIC8vIHRhcmFmxLFuZGFuIG90b21hdGlrIHTDvHJldGlsaXIgKGJrei4gRG9jdW1lbnRUcmFuc2ZlckFwcFNlcnZpY2UuQWRkTGVnQXN5bmMpLlxuICB1cGRhdGVMZWdUYXJnZXQobGVnOiBEb2N1bWVudFRyYW5zZmVyTGVnRHRvLCB0YXJnZXRDb21wYW55SWQ6IHN0cmluZykge1xuICAgIGlmICghdGhpcy53b3JraW5nQ29weSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxlZy50YXJnZXRDb21wYW55SWQgPSB0YXJnZXRDb21wYW55SWQ7XG4gICAgbGVnLnRhcmdldENvbXBhbnlOYW1lID0gdGhpcy5jb21wYW5pZXMuZmluZChjID0+IGMuaWQgPT09IHRhcmdldENvbXBhbnlJZCk/LmNvbXBhbnlOYW1lO1xuICAgIHRoaXMucGVyc2lzdExlZ0NoYW5nZXMoKTtcbiAgfVxuXG4gIHVwZGF0ZUxlZ0JlaGF2aW9yKGxlZzogRG9jdW1lbnRUcmFuc2ZlckxlZ0R0bywgbGVnQmVoYXZpb3I6IExlZ0JlaGF2aW9yKSB7XG4gICAgaWYgKCF0aGlzLndvcmtpbmdDb3B5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGVnLmxlZ0JlaGF2aW9yID0gbGVnQmVoYXZpb3I7XG4gICAgdGhpcy5wZXJzaXN0TGVnQ2hhbmdlcygpO1xuICB9XG5cbiAgLy8gSGVkZWYvRGF2cmFuxLHFnyBkcm9wZG93bifEsSBkZcSfacWfdGnEn2luZGUgeWFsbsSxemNhIE8gYmFjYcSfxLEga2F5ZGVkaXAgc3VudWN1ZGFuIGTDtm5lbiB0YW0gd29ya2luZ0NvcHkneWlcbiAgLy8gb2xkdcSfdSBnaWJpIGVrcmFuYSB5YW5zxLF0xLFyc2FrLCBrdWxsYW7EsWPEsW7EsW4gQkHFnktBIGJpciBiYWNhxJ9hIGhlbsO8eiB5YXpkxLHEn8SxIGFtYSBoZW7DvHogc2Vua3Jvbml6ZVxuICAvLyBlZGlsbWVtacWfIE51bUF0Q2FyZC9Ew7Z2aXovS3VyIGRlxJ9lcmxlcmkgKGJ1bmxhciB5YWxuxLF6Y2EgXCLDh2FsxLHFn3TEsXJcIi9cIkJhxZ9sYXRcIiDDtm5jZXNpIHRvcGx1IGfDtm5kZXJpbGlyKVxuICAvLyBzdW51Y3VkYWtpIGVza2kgZGXEn2VybGUgZ2VyaSBnZWxlbiBvIGJhY2FrIG5lc25lc2kgdGFyYWbEsW5kYW4gc2Vzc2l6Y2UgZXppbGlyL2JvxZ9hbMSxciAtIGdlcsOnZWtcbiAgLy8gb3J0YW1kYSBkb8SfcnVsYW5kxLEuIEJ1IHnDvHpkZW4gZHJvcGRvd24gZGXEn2nFn2lrbGnEn2luZGUgZGUgVMOcTSBiYWNha2xhcmRha2kgbWV2Y3V0IGRlxJ9lcmxlclxuICAvLyAoc3luY1BlbmRpbmdMZWdDaGFuZ2VzIGlsZSwgc8SxcmFsxLEvY29uY3VycmVuY3ktc2FmZSkgYmlybGlrdGUgZ8O2bmRlcmlsaXIuXG4gIHByaXZhdGUgcGVyc2lzdExlZ0NoYW5nZXMoKSB7XG4gICAgaWYgKCF0aGlzLndvcmtpbmdDb3B5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5pc011dGF0aW5nTGVncyA9IHRydWU7XG4gICAgdGhpcy5zeW5jUGVuZGluZ0xlZ0NoYW5nZXModGhpcy53b3JraW5nQ29weS5sZWdzKVxuICAgICAgLnBpcGUoZmluYWxpemUoKCkgPT4gKHRoaXMuaXNNdXRhdGluZ0xlZ3MgPSBmYWxzZSkpKVxuICAgICAgLnN1YnNjcmliZShyZXN1bHRzID0+IHtcbiAgICAgICAgY29uc3QgbGFzdCA9IHJlc3VsdHM/LltyZXN1bHRzLmxlbmd0aCAtIDFdO1xuICAgICAgICBpZiAobGFzdCkge1xuICAgICAgICAgIHRoaXMud29ya2luZ0NvcHkgPSBsYXN0O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIC8vIFppbmNpcmUgeWVuaSBiaXIgYmFjYWsgZWtsZXI6IGtheW5hxJ/EsSBvdG9tYXRpayBvbGFyYWsgc29uIGJhY2HEn8SxbiBoZWRlZmluZGVuIChpbGsgYmFjYWtzYSBha3RhcsSxbcSxblxuICAvLyBrZW5kaSBrYXluYWsgxZ9pcmtldGluZGVuKSB0w7xyZXRpbGlyLiBWYXJzYXnEsWxhbiBoZWRlZiwgaGVuw7x6IHppbmNpcmRlIG9sbWF5YW4gaWxrIMWfaXJrZXR0aXI7IGt1bGxhbsSxY8SxXG4gIC8vIGVrbGVkaWt0ZW4gc29ucmEgZHJvcGRvd24nbGFyZGFuIGhlZGVmaS9kYXZyYW7EscWfxLEgZGXEn2nFn3RpcmViaWxpci5cbiAgYWRkTGVnKCkge1xuICAgIGlmICghdGhpcy53b3JraW5nQ29weSB8fCB0aGlzLmNvbXBhbmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBZZW5pIGJhY2HEn8SxbiBrYXluYcSfxLEgYmFja2VuZCdkZSBvdG9tYXRpayBvbGFyYWsgc29uIGJhY2HEn8SxbiBoZWRlZmluZGVuIHTDvHJldGlsaXIgKGJrei5cbiAgICAvLyBEb2N1bWVudFRyYW5zZmVyQXBwU2VydmljZS5BZGRMZWdBc3luYykuIFZhcnNhecSxbGFuIEhFREVGIHNlw6dpbGlya2VuIGJ1IGtheW5ha2xhIEFZTkkgxZ9pcmtldCBhc2xhXG4gICAgLy8gw7ZuZXJpbG1lbWVsaWRpciAtIGFrc2kgaGFsZGUgYmlyIMWfaXJrZXRpbiBrZW5kaSBrZW5kaW5lIGZhdHVyYSBrZXN0acSfaSBhbmxhbXPEsXogYmlyIGJhY2FrIG9sdcWfdXIuXG4gICAgLy8gw5ZuY2VkZW4gxZ9pcmtldCBoYXZ1enUgdMO8a2VuZGnEn2luZGUgKHTDvG0gxZ9pcmtldGxlciB6YXRlbiBiaXIgYmFjYWt0YSBoZWRlZiBvbGFyYWsga3VsbGFuxLFsbcSxxZ9zYSlcbiAgICAvLyBmYWxsYmFjayBkb8SfcnVkYW4gY29tcGFuaWVzWzBdJ2EgZMO8xZ/DvHlvcmR1OyBidSB0ZXNhZMO8ZmVuIGtheW5ha2xhIGF5bsSxIMWfaXJrZXRlIGRlbmsgZ2VsaXAgc2VsZi1sb29wXG4gICAgLy8gKEtheW5haz1IZWRlZikgYmFjYWsgb2x1xZ90dXJhYmlsaXlvcmR1IChrdWxsYW7EsWPEsSBnZXJpIGJpbGRpcmltaXlsZSB0ZXNwaXQgZWRpbGRpKS5cbiAgICBjb25zdCBsYXN0TGVnID0gWy4uLnRoaXMud29ya2luZ0NvcHkubGVnc10uc29ydCgoYSwgYikgPT4gYS5zZXF1ZW5jZU5vIC0gYi5zZXF1ZW5jZU5vKS5zbGljZSgtMSlbMF07XG4gICAgY29uc3QgbmV3TGVnU291cmNlQ29tcGFueUlkID0gbGFzdExlZz8udGFyZ2V0Q29tcGFueUlkID8/IHRoaXMud29ya2luZ0NvcHkuc291cmNlQ29tcGFueUlkO1xuXG4gICAgY29uc3QgdXNlZENvbXBhbnlJZHMgPSBuZXcgU2V0KHRoaXMud29ya2luZ0NvcHkubGVncy5tYXAobCA9PiBsLnRhcmdldENvbXBhbnlJZCkpO1xuICAgIGNvbnN0IGRlZmF1bHRUYXJnZXQgPVxuICAgICAgdGhpcy5jb21wYW5pZXMuZmluZChjID0+ICF1c2VkQ29tcGFueUlkcy5oYXMoYy5pZCkgJiYgYy5pZCAhPT0gbmV3TGVnU291cmNlQ29tcGFueUlkKSA/P1xuICAgICAgdGhpcy5jb21wYW5pZXMuZmluZChjID0+IGMuaWQgIT09IG5ld0xlZ1NvdXJjZUNvbXBhbnlJZCkgPz9cbiAgICAgIHRoaXMuY29tcGFuaWVzWzBdO1xuXG4gICAgLy8gw5ZuY2UgbWV2Y3V0IGJhY2FrbGFyZGFraSBoZW7DvHogc2Vua3Jvbml6ZSBlZGlsbWVtacWfIE51bUF0Q2FyZC9Ew7Z2aXovS3VyIGRlxJ9lcmxlcmkga2F5ZGVkaWxpciAtXG4gICAgLy8gYWtzaSBoYWxkZSB5ZW5pIGJhY2FrIGVrbGVuZGnEn2luZGUgZMO2bmVuIHRhbSB3b3JraW5nQ29weSwga3VsbGFuxLFjxLFuxLFuIGF6IMO2bmNlIHlhemTEscSfxLEgYW1hIGhpw6dcbiAgICAvLyBzdW51Y3V5YSBnw7ZuZGVyaWxtZW1pxZ8gZGXEn2VybGVyaSBlc2tpL2JvxZ8gREIgZGXEn2VyaXlsZSBlemVyZGkgKHBlcnNpc3RMZWdDaGFuZ2VzIGlsZSBheW7EsSBzb3J1bikuXG4gICAgdGhpcy5pc011dGF0aW5nTGVncyA9IHRydWU7XG4gICAgdGhpcy5zeW5jUGVuZGluZ0xlZ0NoYW5nZXModGhpcy53b3JraW5nQ29weS5sZWdzKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PlxuICAgICAgICAgIHRoaXMuc2VydmljZS5hZGRMZWcodGhpcy53b3JraW5nQ29weSEuaWQsIHtcbiAgICAgICAgICAgIHRhcmdldENvbXBhbnlJZDogZGVmYXVsdFRhcmdldC5pZCxcbiAgICAgICAgICAgIGxlZ0JlaGF2aW9yOiBMZWdCZWhhdmlvci5JbnRlcm1lZGlhdGVDaGFpbixcbiAgICAgICAgICB9KVxuICAgICAgICApLFxuICAgICAgICBmaW5hbGl6ZSgoKSA9PiAodGhpcy5pc011dGF0aW5nTGVncyA9IGZhbHNlKSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUocmVzdWx0ID0+ICh0aGlzLndvcmtpbmdDb3B5ID0gcmVzdWx0KSk7XG4gIH1cblxuICAvLyBTcGVjIMKnNSAtIG11aGF0YXAgZcWfbGXFn3Rpcm1lc2kgYnVsdW5hbWF5YW4gYmFjYWt0YSBrdWxsYW7EsWPEsWRhbiBoZWRlZiBTQVAgxZ9pcmtldGluZGVraSBkb8SfcnVcbiAgLy8gTcO8xZ90ZXJpL1NhdMSxY8SxIENhcmRDb2RlIHNlw6dpbWkgaXN0ZW5lY2VrdGlyOyBidSwgTXVoYXRhcCBFxZ9sZcWfdGlybWVsZXJpIGVrcmFuxLFuYSB5w7ZubGVuZGlyaWxlcmVrXG4gIC8vIHlhcHTEsXLEsWxhYmlsaXIgKHNwZWMgdGFyYWbEsW5kYW4gYcOnxLFrw6dhIGl6aW4gdmVyaWxlbiBhcmF5w7x6IHNlw6dlbmVrbGVyaW5kZW4gYmlyaSkuIFwiQnVsdW51bGFuIMWeaXJrZXRcIlxuICAvLyBidXJhZGEgaGVkZWYgKE9QQ0gnbmluIG9sdcWfYWNhxJ/EsSkgxZ9pcmtldHRpciwgXCLEsGxpxZ9raWxpIMWeaXJrZXRcIiBpc2Uga2F5bmFrIMWfaXJrZXR0aXIgLSBia3ouXG4gIC8vIFJlc29sdmVWZW5kb3JDYXJkQ29kZUFzeW5jKGluQ29tcGFueUlkOiBoZWRlZiwgZm9yUmVsYXRlZENvbXBhbnlJZDoga2F5bmFrKS5cbiAgZ29Ub1BhcnRuZXJNYXBwaW5nKGxlZzogRG9jdW1lbnRUcmFuc2ZlckxlZ0R0bykge1xuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2ZiZG9jdW1lbnRmbG93L3BhcnRuZXItbWFwcGluZ3MnXSwge1xuICAgICAgc3RhdGU6IHsgc291cmNlQ29tcGFueUlkOiBsZWcudGFyZ2V0Q29tcGFueUlkLCByZWxhdGVkQ29tcGFueUlkOiBsZWcuc291cmNlQ29tcGFueUlkIH0sXG4gICAgfSk7XG4gIH1cblxuICByZW1vdmVMZWcobGVnOiBEb2N1bWVudFRyYW5zZmVyTGVnRHRvKSB7XG4gICAgaWYgKCF0aGlzLndvcmtpbmdDb3B5IHx8IHRoaXMud29ya2luZ0NvcHkubGVncy5sZW5ndGggPD0gMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEF5bsSxIG5lZGVubGUgKGJrei4gYWRkTGVnKSBzaWxpbm1leWVuIGRpxJ9lciBiYWNha2xhcmRha2kgc2Vua3Jvbml6ZSBlZGlsbWVtacWfIGRlxJ9lcmxlciDDtm5jZSBrYXlkZWRpbGlyLlxuICAgIGNvbnN0IHJlbWFpbmluZ0xlZ3MgPSB0aGlzLndvcmtpbmdDb3B5LmxlZ3MuZmlsdGVyKGwgPT4gbC5pZCAhPT0gbGVnLmlkKTtcbiAgICB0aGlzLmlzTXV0YXRpbmdMZWdzID0gdHJ1ZTtcbiAgICB0aGlzLnN5bmNQZW5kaW5nTGVnQ2hhbmdlcyhyZW1haW5pbmdMZWdzKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLnNlcnZpY2UucmVtb3ZlTGVnKHRoaXMud29ya2luZ0NvcHkhLmlkLCBsZWcuaWQpKSxcbiAgICAgICAgZmluYWxpemUoKCkgPT4gKHRoaXMuaXNNdXRhdGluZ0xlZ3MgPSBmYWxzZSkpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKHJlc3VsdCA9PiAodGhpcy53b3JraW5nQ29weSA9IHJlc3VsdCkpO1xuICB9XG5cbiAgLy8gWWVuaSBiaXIgYWt0YXLEsW0gacOnaW4gw6dhbMSxxZ9tYSBrb3B5YXPEsW7EsSBpbGsga2V6IG9sdcWfdHVydXIuIFphdGVuIG9sdcWfdHVydWxtdcWfIGFtYSBoZW7DvHpcbiAgLy8gw6dhbMSxxZ90xLFyxLFsbWFtxLHFnyAodGFzbGFrKSBiaXIgYWt0YXLEsW1kYSBzZW5hcnlvIGRlxJ9pxZ90aXJtZWsgacOnaW4gYXBwbHlTY2VuYXJpbygpIGt1bGxhbsSxbMSxciAtXG4gIC8vIMO2cm4uIFwixLDFn2xlbSBHZcOnbWnFn2lcIm5kZW4gZ2VyaSBkw7Zuw7xsZW4gYmlyIHRhc2xhayBrYXnEsXR0YS5cbiAgZmV0Y2hTY2VuYXJpbygpIHtcbiAgICBpZiAoIXRoaXMubmV3U3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmlzRmV0Y2hpbmdTY2VuYXJpbyA9IHRydWU7XG4gICAgdGhpcy5zZXJ2aWNlXG4gICAgICAuY3JlYXRlKHtcbiAgICAgICAgc291cmNlQ29tcGFueUlkOiB0aGlzLm5ld1N0YXRlLnNvdXJjZUNvbXBhbnlJZCxcbiAgICAgICAgc291cmNlT2ludkRvY0VudHJ5OiB0aGlzLm5ld1N0YXRlLmRvY0VudHJ5LFxuICAgICAgICBzY2VuYXJpb0lkOiB0aGlzLnNjZW5hcmlvSWQgfHwgdW5kZWZpbmVkLFxuICAgICAgICBzb3VyY2VEb2N1bWVudExpZmVjeWNsZTogdGhpcy5uZXdTdGF0ZS5zb3VyY2VEb2N1bWVudExpZmVjeWNsZSxcbiAgICAgICAgdGFyZ2V0RG9jdW1lbnRMaWZlY3ljbGU6IHRoaXMubmV3U3RhdGUudGFyZ2V0RG9jdW1lbnRMaWZlY3ljbGUsXG4gICAgICB9KVxuICAgICAgLnBpcGUoZmluYWxpemUoKCkgPT4gKHRoaXMuaXNGZXRjaGluZ1NjZW5hcmlvID0gZmFsc2UpKSlcbiAgICAgIC5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgICAgdGhpcy53b3JraW5nQ29weSA9IHJlc3VsdDtcbiAgICAgICAgdGhpcy5pc05ldyA9IGZhbHNlO1xuICAgICAgICAvLyBVUkwnaSBvbHXFn2FuIGtheWRhIGfDtnJlIGRlxJ9pxZ90aXIgLSBzYXlmYSB5ZW5pbGVuaXJzZSB2ZXlhIGdlcmkvaWxlcmkgZ2lkaWxpcnNlIGRvxJ9ydSBrYXnEsXQgecO8a2xlbnNpbi5cbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvZmJkb2N1bWVudGZsb3cvZG9jdW1lbnQtdHJhbnNmZXJzJywgcmVzdWx0LmlkXSwgeyByZXBsYWNlVXJsOiB0cnVlIH0pO1xuICAgICAgfSk7XG4gIH1cblxuICBhcHBseVNjZW5hcmlvKCkge1xuICAgIGlmICghdGhpcy53b3JraW5nQ29weSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXNGZXRjaGluZ1NjZW5hcmlvID0gdHJ1ZTtcbiAgICB0aGlzLnNlcnZpY2VcbiAgICAgIC5hcHBseVNjZW5hcmlvKHRoaXMud29ya2luZ0NvcHkuaWQsIHsgc2NlbmFyaW9JZDogdGhpcy5zY2VuYXJpb0lkIHx8IHVuZGVmaW5lZCB9KVxuICAgICAgLnBpcGUoZmluYWxpemUoKCkgPT4gKHRoaXMuaXNGZXRjaGluZ1NjZW5hcmlvID0gZmFsc2UpKSlcbiAgICAgIC5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgICAgdGhpcy53b3JraW5nQ29weSA9IHJlc3VsdDtcbiAgICAgICAgdGhpcy5zY2VuYXJpb0lkID0gcmVzdWx0LnNjZW5hcmlvSWQgPz8gJyc7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZFdvcmtpbmdDb3B5KGlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG4gICAgdGhpcy5zZXJ2aWNlXG4gICAgICAuZ2V0KGlkKVxuICAgICAgLnBpcGUoZmluYWxpemUoKCkgPT4gKHRoaXMuaXNMb2FkaW5nID0gZmFsc2UpKSlcbiAgICAgIC5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgICAgdGhpcy53b3JraW5nQ29weSA9IHJlc3VsdDtcbiAgICAgICAgdGhpcy5zY2VuYXJpb0lkID0gcmVzdWx0LnNjZW5hcmlvSWQgPz8gJyc7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRMZWdVcGRhdGVJbnB1dChsZWc6IERvY3VtZW50VHJhbnNmZXJMZWdEdG8pIHtcbiAgICByZXR1cm4ge1xuICAgICAgdGFyZ2V0Q29tcGFueUlkOiBsZWcudGFyZ2V0Q29tcGFueUlkLFxuICAgICAgbGVnQmVoYXZpb3I6IGxlZy5sZWdCZWhhdmlvcixcbiAgICAgIG51bUF0Q2FyZDogbGVnLm51bUF0Q2FyZCxcbiAgICAgIGN1cnJlbmN5OiBsZWcuY3VycmVuY3ksXG4gICAgICBleGNoYW5nZVJhdGU6IGxlZy5leGNoYW5nZVJhdGUsXG4gICAgICBmcmVpZ2h0QW1vdW50OiBsZWcuZnJlaWdodEFtb3VudCxcbiAgICAgIHNlbGVjdGVkQ29uc3RydWN0aW9uRHJhZnREb2NUeXBlOiBsZWcuc2VsZWN0ZWRDb25zdHJ1Y3Rpb25EcmFmdERvY1R5cGUsXG4gICAgfTtcbiAgfVxuXG4gIC8vIE51bUF0Q2FyZC9Ew7Z2aXovS3VyIGFsYW5sYXLEsSBrdWxsYW7EsWPEsSB5YXphcmtlbi9hbGFuxLEgdGVyayBlZGVya2VuIGF5csSxIGJpciBcImtheWRldFwiIGlzdGXEn2lcbiAgLy8gZ8O2bmRlcm1peW9yIChidSwgYXJ0IGFyZGEgaMSxemzEsSBpc3Rla2xlcmluIENvbmN1cnJlbmN5U3RhbXAgeWFyxLHFnyBkdXJ1bXVuYSAtIEFicERiQ29uY3VycmVuY3lFeGNlcHRpb24sXG4gIC8vIFwidmVyaSBiYcWfa2EgYmlyIGt1bGxhbsSxY8SxIHRhcmFmxLFuZGFuIGRlxJ9pxZ90aXJpbG1pxZ9cIiAtIHlvbCBhw6d0xLHEn8SxIGdlcsOnZWsgb3J0YW1kYSBnw7Z6bGVtbGVuZGkpLiBCdW51blxuICAvLyB5ZXJpbmUgZWtyYW5kYWtpIGRlxJ9lcmxlciB5YWxuxLF6Y2EgXCLDh2FsxLHFn3TEsXJcIi9cIkJlbGdlIEFrxLHFn8SxbsSxIEJhxZ9sYXRcIiB0ZXRpa2xlbmRpxJ9pIGFuZGEsIG8gw6dhxJ9yxLFkYW5cbiAgLy8gaGVtZW4gw7ZuY2UgdGVrIHNlZmVyZGUgYmFja2VuZCdlIHNlbmtyb25pemUgZWRpbGlyLiBTcGVjIMKnMTAgLSBkw7Z2aXova3VyIGhlciBiYWNhayBpw6dpbiAoQ29uc3RydWN0aW9uXG4gIC8vIGRhaGlsLCBzb24gYmFjYWsgZGFoaWwpIGdlw6dlcmxpIG9sZHXEn3VuZGFuIE51bUF0Q2FyZCfEsW4gYWtzaW5lIGRhdnJhbsSxxZ8vc8SxcmEgYmF6bMSxIGZpbHRyZWxlbm1lei5cbiAgcHJpdmF0ZSBzeW5jUGVuZGluZ0xlZ0NoYW5nZXMobGVnczogRG9jdW1lbnRUcmFuc2ZlckxlZ0R0b1tdKSB7XG4gICAgLy8gWmF0ZW4gQmHFn2FyxLFsxLEgKFN1Y2Nlc3MpIG9sbXXFnyBiaXIgYmFjYWsgYmFja2VuZCdkZSBhcnTEsWsgZMO8emVubGVuZW1leiAoRW5zdXJlTGVnSXNFZGl0YWJsZSxcbiAgICAvLyBGQkRvY3VtZW50RmxvdzowMTAwMTcgXCJMZWdBbHJlYWR5U3VjY2VlZGVkXCIgZsSxcmxhdMSxcikgLSBidSBmb25rc2l5b25hIMO2bmNlZGVuIFTDnE0gYmFjYWtsYXJcbiAgICAvLyAoemF0ZW4gYmHFn2FyxLFsxLEgb2xhbmxhciBkYWhpbCkgZ8O2bmRlcmlsaXlvcmR1LiBCdSwgw7Zybi4gYmlyIHppbmNpcmRlIDEtMi4gYmFjYWsgQmHFn2FyxLFsxLEsIDMuIGJhY2FrXG4gICAgLy8gSGF0YWzEsSBpa2VuIDMuIGJhY2HEn8SxIHRla3JhciBcIsOHYWzEscWfdMSxclwiYSBiYXNtYXnEsSBUQU1BTUVOIGlta2Fuc8SxeiBoYWxlIGdldGlyaXlvcmR1IC0gc2Vua3Jvbml6YXN5b25cbiAgICAvLyBhZMSxbcSxLCBoZW7DvHogMy4gYmFjYcSfYSBoacOnIHPEsXJhIGdlbG1lZGVuLCB6YXRlbiBiYcWfYXLEsWzEsSAxLiBiYWNha3RhIGJ1IGhhdGF5bGEgcGF0bMSxeW9yZHUgKGdlcsOnZWtcbiAgICAvLyBvcnRhbWRhIGfDtnpsZW1sZW5kaSkuIFlhbG7EsXpjYSBow6Jsw6IgZMO8emVubGVuZWJpbGlyIChTdWNjZXNzIG9sbWF5YW4pIGJhY2FrbGFyIHNlbmtyb25pemUgZWRpbGlyLlxuICAgIGNvbnN0IGVkaXRhYmxlTGVncyA9IGxlZ3MuZmlsdGVyKGwgPT4gbC5zdGF0dXMgIT09IERPQ1VNRU5UX1RSQU5TRkVSX0xFR19TVEFUVVNfU1VDQ0VTUyk7XG5cbiAgICBpZiAoIXRoaXMud29ya2luZ0NvcHkgfHwgZWRpdGFibGVMZWdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgIH1cblxuICAgIC8vIEJhY2FrbGFyIGF5bsSxIERvY3VtZW50VHJhbnNmZXIgKGFnZ3JlZ2F0ZSByb290KSBrYXlkxLFuxLEgcGF5bGHFn3TEscSfxLEgacOnaW4gZm9ya0pvaW4gaWxlIHBhcmFsZWxcbiAgICAvLyBnw7ZuZGVyaWxpcnNlIGhlciBpc3RlayBheW7EsSBDb25jdXJyZW5jeVN0YW1wJ2kgecO8a2xlcjsgaWxrIGtheWRlZGVuIGTEscWfxLFuZGFraWxlclxuICAgIC8vIEFicERiQ29uY3VycmVuY3lFeGNlcHRpb24gKFwidmVyaSBiYcWfa2EgYmlyIGt1bGxhbsSxY8SxL2lzdGVtY2kgdGFyYWbEsW5kYW4gZGXEn2nFn3RpcmlsbWnFn1wiKSBhbMSxciAtXG4gICAgLy8gZ2Vyw6dlayBvcnRhbWRhIGRvxJ9ydWxhbmTEsS4gY29uY2F0TWFwIGlsZSBzxLFyYXlsYSBnw7ZuZGVyaWxpciwgaGVyIGlzdGVrIGJpciDDtm5jZWtpbmluXG4gICAgLy8ga2F5ZGV0dGnEn2kgZ8O8bmNlbCBzdGFtcCDDvHplcmluZGVuIGRldmFtIGVkZXIuXG4gICAgcmV0dXJuIGZyb20oZWRpdGFibGVMZWdzKS5waXBlKFxuICAgICAgY29uY2F0TWFwKGxlZyA9PiB0aGlzLnNlcnZpY2UudXBkYXRlTGVnKHRoaXMud29ya2luZ0NvcHkhLmlkLCBsZWcuaWQsIHRoaXMuYnVpbGRMZWdVcGRhdGVJbnB1dChsZWcpKSksXG4gICAgICB0b0FycmF5KClcbiAgICApO1xuICB9XG5cbiAgYmFja1RvTGlzdCgpIHtcbiAgICBjb25zdCBzb3VyY2VDb21wYW55SWQgPSB0aGlzLm5ld1N0YXRlPy5zb3VyY2VDb21wYW55SWQgPz8gdGhpcy53b3JraW5nQ29weT8uc291cmNlQ29tcGFueUlkO1xuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2ZiZG9jdW1lbnRmbG93L2RvY3VtZW50LXRyYW5zZmVycyddLCB7XG4gICAgICBzdGF0ZTogc291cmNlQ29tcGFueUlkID8geyBzb3VyY2VDb21wYW55SWQgfSA6IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXJ0RmxvdygpIHtcbiAgICBpZiAoIXRoaXMud29ya2luZ0NvcHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTcGVjIMKnOSAtIFVfT3JhbiB0YW7EsW1zxLF6a2VuIGFrxLHFnyBibG9rbGFubWF6OyBhbmNhayBrdWxsYW7EsWPEsW7EsW4gYnVudSBiaWxlcmVrIG9uYXlsYW1hc8SxIGdlcmVraXIuXG4gICAgaWYgKHRoaXMuaGFzTWlzc2luZ0luY3JlYXNlUmF0ZSgpKSB7XG4gICAgICB0aGlzLmNvbmZpcm1hdGlvblxuICAgICAgICAud2FybihcbiAgICAgICAgICAnQnUgxZ9pcmtldHRlIGJ1IHByb2plIGnDp2luIGFydMSxcsSxbSBvcmFuxLEgdGFuxLFtbMSxIGRlxJ9pbGRpci4gQXJ0xLFyxLFtIHV5Z3VsYW5tYWRhbiBkZXZhbSBldG1layBpc3RpeW9yIG11c3VudXo/JyxcbiAgICAgICAgICAnRkJEb2N1bWVudEZsb3c6OkFyZVlvdVN1cmUnXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZShzdGF0dXMgPT4ge1xuICAgICAgICAgIGlmIChzdGF0dXMgPT09IENvbmZpcm1hdGlvbi5TdGF0dXMuY29uZmlybSkge1xuICAgICAgICAgICAgdGhpcy5leGVjdXRlU3RhcnRGbG93KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmV4ZWN1dGVTdGFydEZsb3coKTtcbiAgfVxuXG4gIHByaXZhdGUgZXhlY3V0ZVN0YXJ0RmxvdygpIHtcbiAgICBpZiAoIXRoaXMud29ya2luZ0NvcHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmlzU3RhcnRpbmcgPSB0cnVlO1xuICAgIHRoaXMuc3luY1BlbmRpbmdMZWdDaGFuZ2VzKHRoaXMud29ya2luZ0NvcHkubGVncylcbiAgICAgIC5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5zZXJ2aWNlLmV4ZWN1dGVBbGwodGhpcy53b3JraW5nQ29weSEuaWQpKSxcbiAgICAgICAgZmluYWxpemUoKCkgPT4gKHRoaXMuaXNTdGFydGluZyA9IGZhbHNlKSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiByZXN1bHQgPT4gKHRoaXMud29ya2luZ0NvcHkgPSByZXN1bHQpLFxuICAgICAgICAvLyBBQlAgemF0ZW4gYmHFn2FyxLFzxLF6IEhUVFAgw6dhxJ9yxLFsYXLEsW5kYSBnZW5lbCBiaXIgaGF0YSBkaXlhbG/En3UgZ8O2c3RlcmlyLlxuICAgICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuaXNTdGFydGluZyA9IGZhbHNlO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gIH1cblxuICAvLyBZYWxuxLF6Y2EgW2xlZ10gKMOnYWzEscWfdMSxcsSxbGFuIGJhY2FrKSBzZW5rcm9uaXplIGVkaWxpcnNlLCBrdWxsYW7EsWPEsW7EsW4gQkHFnktBIGJpciBiYWNhxJ9hIHlhemTEscSfxLEgYW1hXG4gIC8vIGhlbsO8eiBnw7ZuZGVyaWxtZW1pxZ8gTnVtQXRDYXJkL0TDtnZpei9LdXIgZGXEn2VybGVyaSBoacOnIGtheWRlZGlsbWVkZW4ga2FsxLFyIC0gYXJkxLFuZGFuIMOnYcSfcsSxbGFuXG4gIC8vIGxvYWRXb3JraW5nQ29weSgpIHN1bnVjdWRha2kgZXNraSAoYm/FnykgZGXEn2VybGUgbyBiYWNhxJ/EsSBlemVyLCBrdWxsYW7EsWPEsSB5YXpkxLHEn8SxIGRlxJ9lcmkga2F5YmVkZXJcbiAgLy8gKGdlcsOnZWsgb3J0YW1kYSBkb8SfcnVsYW5kxLEsIGV4ZWN1dGVTdGFydEZsb3cnZGFraSBnaWJpIFTDnE0gYmFjYWtsYXIgc2Vua3Jvbml6ZSBlZGlsbWVsaSkuXG4gIGV4ZWN1dGVMZWcobGVnOiBEb2N1bWVudFRyYW5zZmVyTGVnRHRvKSB7XG4gICAgaWYgKCF0aGlzLndvcmtpbmdDb3B5IHx8ICF0aGlzLmNhbkV4ZWN1dGVMZWcobGVnKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXNFeGVjdXRpbmcgPSB0cnVlO1xuICAgIHRoaXMuc3luY1BlbmRpbmdMZWdDaGFuZ2VzKHRoaXMud29ya2luZ0NvcHkubGVncylcbiAgICAgIC5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5zZXJ2aWNlLmV4ZWN1dGVMZWcodGhpcy53b3JraW5nQ29weSEuaWQsIGxlZy5pZCkpLFxuICAgICAgICBmaW5hbGl6ZSgoKSA9PiAodGhpcy5pc0V4ZWN1dGluZyA9IGZhbHNlKSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5sb2FkV29ya2luZ0NvcHkodGhpcy53b3JraW5nQ29weSEuaWQpKTtcbiAgfVxuXG4gIC8vIFwiWmluY2lyaSDEsHB0YWwgRXRcIiB5YWxuxLF6Y2EgZmlpbGVuIGlwdGFsIGVkaWxlY2VrIGJpciDFn2V5IHZhcmtlbiAoRGV2YW0gRWRpeW9yL0hhdGFsxLEpIGFubGFtbMSxZMSxcjtcbiAgLy8gemF0ZW4gxLBwdGFsIEVkaWxkaSB2ZXlhIFRhbWFtbGFuZMSxIGR1cnVtdW5kYWtpIGJpciBha3RhcsSxbWRhIHRla3JhciBnw7ZzdGVyaWxtZXNpIGt1bGxhbsSxY8SxecSxXG4gIC8vIHlhbsSxbHTEsXIgKHNwZWMgwqcxMi0xMyAtIGlwdGFsIGVkaWxtacWfIGJpciB6aW5jaXIgdGVrcmFyIGnFn2xlbWUgYWzEsW5tYXosIHllbmlkZW4gb2x1xZ90dXJtYSBzw7xyZWNpbmVcbiAgLy8ga2F5bmFrIGZhdHVyYWRhbiB5ZW5pIGJpciBha3RhcsSxbWxhIGdpcmlsaXIpLlxuICBjYW5DYW5jZWxDaGFpbigpOiBib29sZWFuIHtcbiAgICBjb25zdCBzdGF0dXMgPSB0aGlzLndvcmtpbmdDb3B5Py5zdGF0dXM7XG4gICAgcmV0dXJuIHN0YXR1cyA9PT0gMSB8fCBzdGF0dXMgPT09IDM7IC8vIDE9RGV2YW0gRWRpeW9yLCAzPUhhdGFsxLFcbiAgfVxuXG4gIGNhbmNlbENoYWluKCkge1xuICAgIGlmICghdGhpcy53b3JraW5nQ29weSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY29uZmlybWF0aW9uLndhcm4oJ0ZCRG9jdW1lbnRGbG93OjpEZWxldGVDb25maXJtYXRpb25NZXNzYWdlJywgJ0ZCRG9jdW1lbnRGbG93OjpBcmVZb3VTdXJlJykuc3Vic2NyaWJlKHN0YXR1cyA9PiB7XG4gICAgICBpZiAoc3RhdHVzID09PSBDb25maXJtYXRpb24uU3RhdHVzLmNvbmZpcm0gJiYgdGhpcy53b3JraW5nQ29weSkge1xuICAgICAgICAvLyDEsHB0YWxkZW4gc29ucmEgYnUgc2F5ZmFkYSBrYWxtYWsgeWVyaW5lIGxpc3RleWUgZMO2bsO8bMO8ciAtIGJhY2tUb0xpc3QoKSB6YXRlbiBzZcOnaWxpIGtheW5ha1xuICAgICAgICAvLyDFn2lya2V0aSByb3V0ZXIgc3RhdGUgaWxlIHRhxZ/EsXnEsXAgbGlzdGUgZWtyYW7EsW5kYSBheW7EsSDFn2lya2V0aW4gc2XDp2lsaSBrYWxtYXPEsW7EsSBzYcSfbMSxeW9yLlxuICAgICAgICB0aGlzLnNlcnZpY2UuY2FuY2VsQ2hhaW4odGhpcy53b3JraW5nQ29weS5pbnRlcmNvbXBhbnlJZCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmJhY2tUb0xpc3QoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBzdGF0dXNMYWJlbChzdGF0dXM6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIFsnxLDFn2xlbSBCZWtsaXlvcicsICdEZXZhbSBFZGl5b3InLCAnVGFtYW1sYW5kxLEnLCAnSGF0YWzEsScsICfEsHB0YWwgRWRpbGRpJ11bc3RhdHVzXSA/PyBTdHJpbmcoc3RhdHVzKTtcbiAgfVxuXG4gIC8vIFNwZWMgwqcxNCAoMTguMDkuMjAyNiBrYXJhcsSxKSAtIHPDvHJlw6cgcGFyYW1ldHJpazsgS2F5bmFrIHZlIEhlZGVmIEJlbGdlIER1cnVtdSBpw6dpbiBBWU5JIGV0aWtldFxuICAvLyBrdWxsYW7EsWzEsXIgKGt1bGxhbsSxY8SxIGlzdGXEn2l5bGUgbmV0bGXFn3RpcmlsZGkpLlxuICBzb3VyY2VEb2N1bWVudExpZmVjeWNsZUxhYmVsKGxpZmVjeWNsZT86IFNhcERvY3VtZW50TGlmZWN5Y2xlKTogc3RyaW5nIHtcbiAgICBpZiAobGlmZWN5Y2xlID09IG51bGwpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgcmV0dXJuIGxpZmVjeWNsZSA9PT0gU2FwRG9jdW1lbnRMaWZlY3ljbGUuRHJhZnQgPyAnVGFzbGFrIE3DvMWfdGVyaSBGYXR1cmFzxLEnIDogJ0thecSxdGzEsSBNw7zFn3RlcmkgRmF0dXJhc8SxJztcbiAgfVxuXG4gIGxlZ1N0YXR1c0xhYmVsKHN0YXR1czogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gWydCZWtsaXlvcicsICdCYcWfYXLEsWzEsScsICdIYXRhbMSxJywgJ0F0bGFuZMSxJ11bc3RhdHVzXSA/PyBTdHJpbmcoc3RhdHVzKTtcbiAgfVxuXG4gIC8vIEJpciBiYWNha3RhICjDtnplbGxpa2xlIENvbnN0cnVjdGlvbjogT1BPUuKGkk9QRE7ihpJPUENILCB2ZXlhIEFyYSDFnmlya2V0J3RlIGRldmFtIE9JTlYgb2x1xZ90dcSfdW5kYSlcbiAgLy8gQsSwUkRFTiBGQVpMQSBTQVAgYmVsZ2VzaSBvbHXFn2FiaWxpcjsgw7ZuY2VkZW4geWFsbsSxemNhIFwic29uXCIgYmVsZ2UgKGxlZy5jcmVhdGVkRG9jVHlwZS9jcmVhdGVkRG9jRW50cnkpXG4gIC8vIGfDtnN0ZXJpbGl5b3JkdSwgZGnEn2VybGVyaSAoT1BPUi9PUEROLCBkZXZhbSBPSU5WKSBEVE8nZGEgdmFyZMSxIGFtYSBla3JhbmRhIGhpw6cgZ8O2csO8bm3DvHlvcmR1LlxuICAvLyBTb251w6cgYmVsZ2UgZXRpa2V0bGVyaSAoc3BlYyDCpzE1IC0gVGVrbmlrIFNBUCBCMSBBbGFubGFyxLEgdGFibG9zdW5kYWtpIG5lc25lIGvEsXNhbHRtYWxhcsSxeWxhIGJpcmViaXIpOlxuICAvLyBPUE9SL09QRE4vT1BDSC9PSU5WLiDDlm5jZWRlbiBidXJhZGEgbGVnLmNyZWF0ZWREb2NUeXBlIChiYWNrZW5kJ2RlIGhlciB6YW1hbiBoYW0gU0FQIFNlcnZpY2UgTGF5ZXJcbiAgLy8gZW50aXR5IHNldCBhZMSxIFwiUHVyY2hhc2VJbnZvaWNlc1wiIG9sYXJhayBzYWJpdCkgZG/En3J1ZGFuIGfDtnN0ZXJpbGl5b3JkdSAtIE9QT1IvT1BETiBnaWJpIGvEsXNhIFNBUFxuICAvLyBrb2RsYXLEsXlsYSBheW7EsSBzYXTEsXJkYSBrYXLEscWfxLFrIGfDtnLDvG7DvHAgYW5sYW0ga2FybWHFn2FzxLFuYSB5b2wgYcOnxLF5b3JkdSAoa3VsbGFuxLFjxLEgZ2VyaSBiaWxkaXJpbWl5bGVcbiAgLy8gdGVzcGl0IGVkaWxkaSkuIEFydMSxayB0w7xtIGJlbGdlIHRpcGxlcmkgYXluxLEga8Sxc2FsdG1hIHNldGl5bGUsIHR1dGFybMSxIMWfZWtpbGRlIGfDtnN0ZXJpbGl5b3IuXG4gIC8vIEVrcmFuZGEgZ8O2c3RlcmlsZWNlayBiZWxnZSBudW1hcmFzxLEgaGVyIHphbWFuIERvY051bSDDvHplcmluZGVuIHnDvHLDvHIgKGt1bGxhbsSxY8SxIGdlcmkgYmlsZGlyaW1peWxlXG4gIC8vIG5ldGxlxZ90aXJpbGRpKSAtIERvY0VudHJ5IChTQVAnxLFuIGRhaGlsaSBhbmFodGFyxLEpIHlhbG7EsXpjYSBmYWxsYmFjayd0aXIsIERvY051bSBiaXIgc2ViZXBsZVxuICAvLyB5YWthbGFuYW1hZMSxeXNhICjDtnIuIMOnb2sgZXNraSBiaXIga2F5xLF0KSBiZWxnZSB0YW1hbWVuIGtheWJvbG11xZ8gZ8O2csO8bm1lc2luIGRpeWUuXG4gIGNyZWF0ZWREb2N1bWVudHNTdW1tYXJ5KGxlZzogRG9jdW1lbnRUcmFuc2ZlckxlZ0R0byk6IHN0cmluZyB7XG4gICAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKGxlZy5jcmVhdGVkUHVyY2hhc2VPcmRlckRvY0VudHJ5KSB7XG4gICAgICBwYXJ0cy5wdXNoKGBPUE9SICR7bGVnLmNyZWF0ZWRQdXJjaGFzZU9yZGVyRG9jTnVtID8/IGxlZy5jcmVhdGVkUHVyY2hhc2VPcmRlckRvY0VudHJ5fWApO1xuICAgIH1cbiAgICBpZiAobGVnLmNyZWF0ZWRHb29kc1JlY2VpcHREb2NFbnRyeSkge1xuICAgICAgcGFydHMucHVzaChgT1BETiAke2xlZy5jcmVhdGVkR29vZHNSZWNlaXB0RG9jTnVtID8/IGxlZy5jcmVhdGVkR29vZHNSZWNlaXB0RG9jRW50cnl9YCk7XG4gICAgfVxuICAgIGlmIChsZWcuY3JlYXRlZERvY0VudHJ5KSB7XG4gICAgICBwYXJ0cy5wdXNoKGBPUENIICR7bGVnLmNyZWF0ZWREb2NOdW0gPz8gbGVnLmNyZWF0ZWREb2NFbnRyeX1gKTtcbiAgICB9XG4gICAgaWYgKGxlZy5jcmVhdGVkSW50ZXJuYWxPaW52RG9jRW50cnkpIHtcbiAgICAgIHBhcnRzLnB1c2goYE9JTlYgJHtsZWcuY3JlYXRlZEludGVybmFsT2ludkRvY051bSA/PyBsZWcuY3JlYXRlZEludGVybmFsT2ludkRvY0VudHJ5fWApO1xuICAgIH1cbiAgICByZXR1cm4gcGFydHMuam9pbignIOKGkiAnKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImNhcmRcIj5cbiAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIHB5LTNcIj5cbiAgICA8ZGl2IGNsYXNzPVwicm93IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxuICAgICAgICA8aDUgY2xhc3M9XCJjYXJkLXRpdGxlIG1iLTBcIj5CZWxnZSBBa8SxxZ/EsSAvIEludGVyY29tcGFueSBBa3RhcsSxbcSxPC9oNT5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1hdXRvXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLXNlY29uZGFyeVwiIChjbGljayk9XCJiYWNrVG9MaXN0KClcIj5cbiAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWFycm93LWxlZnQgbWUtMVwiPjwvaT5MaXN0ZXllIETDtm5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgcHQtM1wiPlxuICAgIDxkaXYgKm5nSWY9XCJpc0xvYWRpbmdcIiBjbGFzcz1cInRleHQtY2VudGVyIHB5LTVcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzcGlubmVyLWJvcmRlciB0ZXh0LXByaW1hcnlcIiByb2xlPVwic3RhdHVzXCI+PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwibXQtMiB0ZXh0LW11dGVkXCI+WcO8a2xlbml5b3IuLi48L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNMb2FkaW5nXCI+XG4gICAgICA8IS0tIEJ1IHNhdMSxciBoZW0gXCJ5ZW5pXCIgKGhlbsO8eiBrYXnEsXQgb2x1xZ9tYW3EscWfKSBoZW0gZGUga2F5xLF0IG9sdcWfdHVrdGFuIHNvbnJha2kgdGFzbGFrIGR1cnVtdW5kYVxuICAgICAgICAgICBBWU5JIGFsYW4gc2V0aW5pIGfDtnN0ZXJpciAtIGthecSxdCBvbHXFn3VuY2EgZWtyYW7EsW4gYWxhbiBzZXRpIGRlxJ9pxZ9pcCBrdWxsYW7EsWPEsWRhIFwiYmHFn2thIGJpclxuICAgICAgICAgICBrYXnEsXQgbcSxIGJ1XCIgaXpsZW5pbWkgdmVybWVzaW4gZGl5ZS4gRGXEn2VybGVyIMO2bmNlIG5ld1N0YXRlJ3RlbiAoaXN0ZW1jaWRlIHR1dHVsYW4gw7ZuaXpsZW1lKSxcbiAgICAgICAgICAgbyB5b2tzYSBvbHXFn2FuIGtheWTEsW4gaWxrIGJhY2HEn8SxbmRhbiAod29ya2luZ0NvcHkubGVnc1swXSkgb2t1bnVyIC0gaWxrIGJhY2FrIGhlciB6YW1hblxuICAgICAgICAgICBuZXdTdGF0ZSdpbiB0ZW1zaWwgZXR0acSfaSBcImlsayBoZWRlZlwiIGFkxLFtxLF5bGEgYXluxLEgYmVsZ2VkaXIuIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInJvdyBnLTMgbWItM1wiICpuZ0lmPVwibmV3U3RhdGUgfHwgd29ya2luZ0NvcHlcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0zXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPktheW5hayDFnmlya2V0PC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIFt2YWx1ZV09XCJjb21wYW55TmFtZSgpXCIgZGlzYWJsZWQgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMlwiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj5CZWxnZSBObzwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbdmFsdWVdPVwibmV3U3RhdGU/LmRvY051bSA/PyB3b3JraW5nQ29weT8uc291cmNlT2ludkRvY051bVwiIGRpc2FibGVkIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTJcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+TnVtQXRDYXJkPC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIFt2YWx1ZV09XCJuZXdTdGF0ZT8ubnVtQXRDYXJkID8/IHdvcmtpbmdDb3B5Py5zb3VyY2VPaW52TnVtQXRDYXJkXCIgZGlzYWJsZWQgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMVwiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj5Qcm9qZTwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbdmFsdWVdPVwibmV3U3RhdGU/LnByb2plY3RDb2RlID8/IHdvcmtpbmdDb3B5Py5wcm9qZWN0Q29kZVwiIGRpc2FibGVkIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTJcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+xLBsayBIZWRlZjwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbdmFsdWVdPVwibmV3U3RhdGU/LnRhcmdldENvbXBhbnlOYW1lID8/IHdvcmtpbmdDb3B5Py5sZWdzPy5bMF0/LnRhcmdldENvbXBhbnlOYW1lXCIgZGlzYWJsZWQgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMlwiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj5Ew7Z2aXo8L2xhYmVsPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgW3ZhbHVlXT1cIm5ld1N0YXRlPy5jdXJyZW5jeSA/PyB3b3JraW5nQ29weT8ubGVncz8uWzBdPy5jdXJyZW5jeVwiIGRpc2FibGVkIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gQmVsZ2UgRHVydW11IGhlciB6YW1hbiAoeWVuaSBrYXnEsXR0YSBkYSkgZ8O2csO8bsO8cjsgSW50ZXJjb21wYW55IElkL0FrdGFyxLFtIER1cnVtdS9TZW5hcnlvIHlhbG7EsXpjYVxuICAgICAgICAgICBrYXnEsXQgb2x1xZ90dWt0YW4gc29ucmEgdmFyZMSxciAtIGt1bGxhbsSxY8SxIGlzdGXEn2l5bGUgaGVwc2kgYXluxLEgc2F0xLFyZGEsIEJlbGdlIER1cnVtdSdudW4geWFuxLFuYVxuICAgICAgICAgICB0b3BsYW5kxLEgKMO2bmNlZGVuIEludGVyY29tcGFueSBJZC9Ba3RhcsSxbSBEdXJ1bXUgYXlyxLEgYmlyIHNhdMSxcmRheWTEsSkuIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInJvdyBnLTMgbWItM1wiICpuZ0lmPVwibmV3U3RhdGUgfHwgd29ya2luZ0NvcHlcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0yXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPktheW5hayBCZWxnZSBEdXJ1bXU8L2xhYmVsPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cInNvdXJjZURvY3VtZW50TGlmZWN5Y2xlTGFiZWwobmV3U3RhdGU/LnNvdXJjZURvY3VtZW50TGlmZWN5Y2xlID8/IHdvcmtpbmdDb3B5Py5zb3VyY2VEb2N1bWVudExpZmVjeWNsZSlcIlxuICAgICAgICAgICAgZGlzYWJsZWRcbiAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0yXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkhlZGVmIEJlbGdlIER1cnVtdTwvbGFiZWw+XG4gICAgICAgICAgPCEtLSBBa3RhcsSxbSBoZW7DvHogb2x1xZ90dXJ1bG1hZMSxeXNhIChpc05ldykgYnVyYWRhIHNlw6dpbGViaWxpciAtIGtheW5ha3RhbiBiYcSfxLFtc8SxeiBiaXIga2FyYXJkxLFyXG4gICAgICAgICAgICAgICAoa3VsbGFuxLFjxLEgZ2VyaSBiaWxkaXJpbWl5bGUgbmV0bGXFn3RpcmlsZGk6IGtheW5hxJ/EsW4gbW9kdSBzYWJpdCwgaGVkZWZpbiBtb2R1IGJ1cmFkYSBzZcOnaWxpcikuXG4gICAgICAgICAgICAgICBPbHXFn3R1a3RhbiBzb25yYSBiYWNrZW5kJ2RlIHNhYml0bGVuZGnEn2kgacOnaW4gKHdvcmtpbmdDb3B5KSBzYWx0LW9rdW51ciBnw7ZzdGVyaWxpci4gLS0+XG4gICAgICAgICAgPHNlbGVjdCAqbmdJZj1cImlzTmV3ICYmIG5ld1N0YXRlXCIgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIFsobmdNb2RlbCldPVwibmV3U3RhdGUudGFyZ2V0RG9jdW1lbnRMaWZlY3ljbGVcIj5cbiAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG8gb2YgZG9jdW1lbnRMaWZlY3ljbGVPcHRpb25zXCIgW25nVmFsdWVdPVwiby52YWx1ZVwiPnt7IG8ubGFiZWwgfX08L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICpuZ0lmPVwiIWlzTmV3IHx8ICFuZXdTdGF0ZVwiXG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICBbdmFsdWVdPVwic291cmNlRG9jdW1lbnRMaWZlY3ljbGVMYWJlbChuZXdTdGF0ZT8udGFyZ2V0RG9jdW1lbnRMaWZlY3ljbGUgPz8gd29ya2luZ0NvcHk/LnRhcmdldERvY3VtZW50TGlmZWN5Y2xlKVwiXG4gICAgICAgICAgICBkaXNhYmxlZFxuICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTNcIiAqbmdJZj1cIndvcmtpbmdDb3B5XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkludGVyY29tcGFueSBJZDwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbdmFsdWVdPVwid29ya2luZ0NvcHkuaW50ZXJjb21wYW55SWRcIiBkaXNhYmxlZCAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0yXCIgKm5nSWY9XCJ3b3JraW5nQ29weVwiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj5Ba3RhcsSxbSBEdXJ1bXU8L2xhYmVsPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgW3ZhbHVlXT1cInN0YXR1c0xhYmVsKHdvcmtpbmdDb3B5LnN0YXR1cylcIiBkaXNhYmxlZCAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSBTZW5hcnlvLCBha3RhcsSxbSBoZW7DvHogw6dhbMSxxZ90xLFyxLFsbWFtxLHFn2tlbiAoaXNEcmFmdCgpKSBhbHTEsW5kYWtpIFwiSGF6xLFyIFNlbmFyeW9cIiBkcm9wZG93bifEsW5kYVxuICAgICAgICAgICAgIHphdGVuIGTDvHplbmxlbmViaWxpci9nw7Zyw7xuw7xyIGR1cnVtZGEgLSBheW7EsSBiaWxnaXlpIGJ1cmFkYSBzYWx0LW9rdW51ciB0ZWtyYXIgZ8O2c3Rlcm1la1xuICAgICAgICAgICAgIChrdWxsYW7EsWPEsSBnZXJpIGJpbGRpcmltaXlsZSB0ZXNwaXQgZWRpbGRpKSBrYWZhIGthcsSxxZ90xLFyxLF5b3JkdS4gWWFsbsSxemNhIGFrdGFyxLFtIGFydMSxa1xuICAgICAgICAgICAgIGTDvHplbmxlbmVtZXogaGFsZSBnZWxkacSfaW5kZSAoZHJvcGRvd24ga2F5Ym9sZHXEn3VuZGEpIGJ1cmFkYSBnw7ZzdGVyaWxpci4gLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtM1wiICpuZ0lmPVwid29ya2luZ0NvcHkgJiYgIWlzRHJhZnQoKVwiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj5TZW5hcnlvPC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIFt2YWx1ZV09XCJzY2VuYXJpb05hbWUoKVwiIGRpc2FibGVkIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gVGFzbGFrOiBoYXrEsXIgc2VuYXJ5byBzZcOnaW1pLCBoZW7DvHogw6dhbMSxxZ90xLFyxLFsbWFkxLEuIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzRHJhZnQoKVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGctMyBhbGlnbi1pdGVtcy1lbmQgbWItM1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkhhesSxciBTZW5hcnlvPC9sYWJlbD5cbiAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIFsobmdNb2RlbCldPVwic2NlbmFyaW9JZFwiPlxuICAgICAgICAgICAgICA8b3B0aW9uIFtuZ1ZhbHVlXT1cIicnXCI+U2VuYXJ5b3N1eiAoeWFsbsSxemNhIGlsayBoZWRlZiBiYWNhxJ/EsSk8L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgcyBvZiBhdmFpbGFibGVTY2VuYXJpb3MoKVwiIFtuZ1ZhbHVlXT1cInMuaWRcIj57eyBzLm5hbWUgfX08L29wdGlvbj5cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMlwiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImlzTmV3ID8gZmV0Y2hTY2VuYXJpbygpIDogYXBwbHlTY2VuYXJpbygpXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzRmV0Y2hpbmdTY2VuYXJpb1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXNGZXRjaGluZ1NjZW5hcmlvXCIgY2xhc3M9XCJzcGlubmVyLWJvcmRlciBzcGlubmVyLWJvcmRlci1zbSBtZS0xXCI+PC9zcGFuPlxuICAgICAgICAgICAgICB7eyBpc05ldyA/ICdTZW5hcnlveXUgR2V0aXInIDogJ1NlbmFyeW95dSBVeWd1bGEnIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBOdW1BdENhcmQgYWxhbmxhcsSxIGFydMSxayBpc0RyYWZ0KCknYSBiYcSfbMSxIERFxJ7EsEw6IHRhc2xha3RhIGTDvHplbmxlbmViaWxpciwgw6dhbMSxxZ90xLFyxLFsZMSxa3RhblxuICAgICAgICAgICBzb25yYSAoaXNEcmFmdCgpIGZhbHNlIG9sc2EgZGEpIHNhbHQtb2t1bnVyIG9sYXJhayBla3JhbmRhIGthbMSxciAtIFwiSGF6xLFyIFNlbmFyeW9cIiBibG/En3V5bGFcbiAgICAgICAgICAgYmlybGlrdGUgdGFtYW1lbiBrYXlib2xtYXPEsW4gZGl5ZS4gLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwid29ya2luZ0NvcHlcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBnLTMgYWxpZ24taXRlbXMtZW5kIG1iLTNcIiAqbmdJZj1cImhhc0ludGVybWVkaWF0ZU51bUF0Q2FyZExlZ3MoKVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtM1wiICpuZ0Zvcj1cImxldCBsZWcgb2Ygd29ya2luZ0NvcHkubGVnc1wiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxlZy5sZWdCZWhhdmlvciA9PT0gMCAmJiBsZWcuc2VxdWVuY2VObyA8IHdvcmtpbmdDb3B5LmxlZ3MubGVuZ3RoXCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj57eyBsZWcuc2VxdWVuY2VObyB9fS4gQmFjYWsgLSB7eyBsZWcudGFyZ2V0Q29tcGFueU5hbWUgfX0gTcO8xZ90ZXJpIEZhdHVyYXPEsSBOdW1BdENhcmQ8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIFsobmdNb2RlbCldPVwibGVnLm51bUF0Q2FyZFwiIFtkaXNhYmxlZF09XCIhaXNEcmFmdCgpXCIgLz5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtd2FybmluZ1wiICpuZ0lmPVwiaXNEcmFmdCgpICYmIGhhc01pc3NpbmdJbmNyZWFzZVJhdGUoKVwiPlxuICAgICAgICAgIFV5YXLEsTogxLBsZ2lsaSDFn2lya2V0dGUvcHJvamVkZSBhcnTEsXLEsW0gb3JhbsSxIDAgLyBOVUxMLiBBcnTEsXLEsW0gdXlndWxhbm1hZGFuIGRldmFtIGV0bWVrIGlzdGl5b3IgbXVzdW51ej9cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LXdhcm5pbmdcIiAqbmdJZj1cImlzRHJhZnQoKSAmJiBoYXNNaXNzaW5nQ29uc3RydWN0aW9uRHJhZnRTZWxlY3Rpb24oKVwiPlxuICAgICAgICAgIFV5YXLEsTogSGVkZWYgQmVsZ2UgRHVydW11IFRhc2xhayBvbGR1xJ91bmRhIENvbnN0cnVjdGlvbiBiYWNha2xhcsSxbmRhIE9QT1Ig4oaSIE9QRE4g4oaSIE9QQ0ggemluY2lyaSB0YXNsYWsgYmVsZ2VsZXIgYXJhc8SxbmRhXG4gICAgICAgICAgw6dhbMSxxZ9tYXouIFwiSGVkZWZ0ZSBPbHXFn2FjYWtcIiBzw7x0dW51bmRhbiBidSBiYWNha2xhciBpw6dpbiB0ZWsgYmlyIGJlbGdlIHRpcGkgKE9QT1IgLyBPUEROIC8gT1BDSCkgc2XDp21lbGlzaW5pei5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBUZWsgdGFibG86IHRhc2xha3RhIGRhLCDDp2FsxLHFn3TEsXLEsWxkxLFrdGFuIHNvbnJhIGRhIEFZTkkgc8O8dHVuIHNldGkgKFPEsXJhLi5BcnTEsXLEsW0pIGtvcnVudXI7XG4gICAgICAgICAgIER1cnVtL1NvbnXDpyBCZWxnZS9IYXRhL8OHYWzEscWfdMSxciB5YWxuxLF6Y2Egw6dhbMSxxZ90xLFyxLFsZMSxa3RhbiBzb25yYSwgaGVyIHNhdMSxcsSxbiBBTFRJTkEgaWtpbmNpIGJpclxuICAgICAgICAgICBzYXTEsXIgb2xhcmFrIGVrbGVuaXIgLSBlc2tpZGVuIGJ1IGJpbGdpbGVyIGF5csSxIHZlIGRhaGEgZGFyIGJpciB0YWJsb3lhIGdlw6dpbGVyZWsgZ8O2c3RlcmlsaXlvcmR1LFxuICAgICAgICAgICBidSBkYSBLYXluYWsgQmVsZ2UvSGVkZWZ0ZSBPbHXFn2FjYWsgZ2liaSBzw7x0dW5sYXLEsW4gXCJrYXlib2xtdcWfXCIgZ8O2csO8bm1lc2luZSB5b2wgYcOnxLF5b3JkdS4gLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwid29ya2luZ0NvcHlcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbWItMlwiPlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8aDYgY2xhc3M9XCJtYi0wXCI+e3sgaXNEcmFmdCgpID8gJ1NlbmFyeW8gw4dhbMSxxZ9tYSBLb3B5YXPEsScgOiAnQWt0YXLEsW0gU29udWN1JyB9fTwvaDY+XG4gICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LW11dGVkXCIgKm5nSWY9XCJpc0RyYWZ0KClcIj5CdSB0YWJsbyB5YWxuxLF6Y2Egw6dhbMSxxZ9tYSBrb3B5YXPEsW7EsSBkw7x6ZW5sZXI7IGFuYSBzZW5hcnlveXUgZGXEn2nFn3Rpcm1lei48L3NtYWxsPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLXByaW1hcnlcIiAoY2xpY2spPVwiYWRkTGVnKClcIiAqbmdJZj1cImlzRHJhZnQoKVwiIFtkaXNhYmxlZF09XCJpc011dGF0aW5nTGVnc1wiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1wbHVzIG1lLTFcIj48L2k+QmFjYWsgRWtsZVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLWRhbmdlclwiIChjbGljayk9XCJjYW5jZWxDaGFpbigpXCIgKm5nSWY9XCJjYW5DYW5jZWxDaGFpbigpXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWJhbiBtZS0xXCI+PC9pPlppbmNpcmkgxLBwdGFsIEV0XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1zZWNvbmRhcnkgc21hbGxcIiAqbmdJZj1cIndvcmtpbmdDb3B5LnN0YXR1cyA9PT0gNFwiPlxuICAgICAgICAgIEJ1IHppbmNpciBpcHRhbCBlZGlsZGksIGJhY2FrbGFyxLEgYXJ0xLFrIMOnYWzEscWfdMSxcsSxbGFtYXovZMO8emVubGVuZW1lei4gWWVuaWRlbiBkZW5lbWVrIGnDp2luXG4gICAgICAgICAgXCJMaXN0ZXllIETDtm5cImRlbiBrYXluYWsgZmF0dXJhecSxIHRla3JhciBzZcOnaXAgeWVuaSBiaXIgYWt0YXLEsW0gYmHFn2xhdMSxbiAtIGJ1LCB5ZW5pIGJpciBJbnRlcmNvbXBhbnkgSWQgaWxlXG4gICAgICAgICAgw6dhbMSxxZ/EsXIuXG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1yZXNwb25zaXZlXCI+XG4gICAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgdGFibGUtc20gdGFibGUtYm9yZGVyZWQgYWxpZ24tbWlkZGxlXCI+XG4gICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICA8dGg+U8SxcmE8L3RoPlxuICAgICAgICAgICAgICAgIDx0aD5LYXluYWs8L3RoPlxuICAgICAgICAgICAgICAgIDx0aD5LYXluYWsgQmVsZ2U8L3RoPlxuICAgICAgICAgICAgICAgIDx0aD5IZWRlZjwvdGg+XG4gICAgICAgICAgICAgICAgPHRoPkRhdnJhbsSxxZ88L3RoPlxuICAgICAgICAgICAgICAgIDx0aD5IZWRlZnRlIE9sdcWfYWNhazwvdGg+XG4gICAgICAgICAgICAgICAgPHRoPk9QQ0ggQ2FyZENvZGU8L3RoPlxuICAgICAgICAgICAgICAgIDx0aD5Ew7Z2aXo8L3RoPlxuICAgICAgICAgICAgICAgIDx0aD5LdXI8L3RoPlxuICAgICAgICAgICAgICAgIDx0aD5BcnTEsXLEsW08L3RoPlxuICAgICAgICAgICAgICAgIDx0aCAqbmdJZj1cImlzRHJhZnQoKVwiPjwvdGg+XG4gICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBsZWcgb2Ygd29ya2luZ0NvcHkubGVnc1wiPlxuICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgIDx0ZD57eyBsZWcuc2VxdWVuY2VObyB9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICA8dGQ+e3sgbGVnLnNvdXJjZUNvbXBhbnlOYW1lIH19PC90ZD5cbiAgICAgICAgICAgICAgICAgIDx0ZD5PSU5WPC90ZD5cbiAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXNEcmFmdCgpOyBlbHNlIHRhcmdldFRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1zZWxlY3QgZm9ybS1zZWxlY3Qtc21cIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImxlZy50YXJnZXRDb21wYW55SWRcIlxuICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZUxlZ1RhcmdldChsZWcsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc011dGF0aW5nTGVnc1wiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBjIG9mIGNvbXBhbmllc1wiIFtuZ1ZhbHVlXT1cImMuaWRcIj57eyBjLmNvbXBhbnlOYW1lIH19PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3RhcmdldFRleHQ+e3sgbGVnLnRhcmdldENvbXBhbnlOYW1lIH19PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImlzRHJhZnQoKTsgZWxzZSBiZWhhdmlvclRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1zZWxlY3QgZm9ybS1zZWxlY3Qtc21cIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImxlZy5sZWdCZWhhdmlvclwiXG4gICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlTGVnQmVoYXZpb3IobGVnLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNNdXRhdGluZ0xlZ3NcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgYiBvZiBsZWdCZWhhdmlvcnNcIiBbbmdWYWx1ZV09XCJiLnZhbHVlXCI+e3sgYi5sYWJlbCB9fTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNiZWhhdmlvclRleHQ+e3sgbGVnQmVoYXZpb3JzW2xlZy5sZWdCZWhhdmlvcl0/LmxhYmVsIH19PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImlzRHJhZnQoKSAmJiBpc0NvbnN0cnVjdGlvbkRyYWZ0U2VsZWN0YWJsZShsZWcpOyBlbHNlIHRhcmdldERvY1RleHRcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1zZWxlY3QgZm9ybS1zZWxlY3Qtc21cIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImxlZy5zZWxlY3RlZENvbnN0cnVjdGlvbkRyYWZ0RG9jVHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlTGVnQ29uc3RydWN0aW9uRHJhZnREb2NUeXBlKGxlZywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzTXV0YXRpbmdMZWdzXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW25nVmFsdWVdPVwibnVsbFwiPlNlw6dpbml6Li4uPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgbyBvZiBjb25zdHJ1Y3Rpb25EcmFmdERvY1R5cGVPcHRpb25zXCIgW25nVmFsdWVdPVwiby52YWx1ZVwiPnt7IG8ubGFiZWwgfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjdGFyZ2V0RG9jVGV4dD57eyBsZWdUYXJnZXREb2NMYWJlbChsZWcpIH19PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwibGVnLnJlc29sdmVkT3BjaENhcmRDb2RlXCI+e3sgbGVnLnJlc29sdmVkT3BjaENhcmRDb2RlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWxlZy5yZXNvbHZlZE9wY2hDYXJkQ29kZVwiIGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGFsaWduLWl0ZW1zLXN0YXJ0IHB5LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlIGJnLWRhbmdlclwiPkXFn2xlxZ90aXJpbG1lZGk8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1kYW5nZXIgYnRuLXNtIG10LTIgcHktMCBweC0yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiZm9udC1zaXplOiAwLjcycmVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJnb1RvUGFydG5lck1hcHBpbmcobGVnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cIk11aGF0YXAgRcWfbGXFn3Rpcm1lbGVyaSBla3JhbsSxbmEgZ2l0XCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWxpbmsgbWUtMVwiPjwvaT5FxZ9sZcWfdGlyXG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpc0RyYWZ0KCk7IGVsc2UgY3VycmVuY3lUZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtXCJcbiAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOiA1LjVyZW1cIlxuICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwibGVnLmN1cnJlbmN5XCJcbiAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwibmV3U3RhdGU/LmN1cnJlbmN5IHx8ICdLYXluYWt0YW4nXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjdXJyZW5jeVRleHQ+e3sgbGVnLmN1cnJlbmN5IHx8IG5ld1N0YXRlPy5jdXJyZW5jeSB9fTwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImlzRHJhZnQoKTsgZWxzZSByYXRlVGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtXCJcbiAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOiA2cmVtXCJcbiAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImxlZy5leGNoYW5nZVJhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiS2F5bmFrdGFuXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNyYXRlVGV4dD57eyBsZWcuZXhjaGFuZ2VSYXRlID8/ICctJyB9fTwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgPCEtLSBTcGVjIMKnOSAtIGFydMSxcsSxbSBZQUxOSVpDQSBidSBiYWNhxJ/EsW4gb2x1xZ90dXJkdcSfdSBkZXZhbSBNw7zFn3RlcmkgRmF0dXJhc8SxbmEgKGJpclxuICAgICAgICAgICAgICAgICAgICAgICBzb25yYWtpIGJhY2FrIHZhcnNhKSB1eWd1bGFuxLFyOyBidSBoZW0gSW50ZXJtZWRpYXRlQ2hhaW4gaGVtIENvbnN0cnVjdGlvbkNoYWluIGnDp2luXG4gICAgICAgICAgICAgICAgICAgICAgIGdlw6dlcmxpZGlyIChDb25zdHJ1Y3Rpb24nZGEgZGEgbmV4dFRhcmdldENvbXBhbnlJZC5IYXNWYWx1ZSBpc2UgZGV2YW0gT0lOVidpXG4gICAgICAgICAgICAgICAgICAgICAgIGFydMSxcsSxbWxhIG9sdcWfdHVydWx1eW9yKS4gw5ZuY2VkZW4gQ29uc3RydWN0aW9uIGJhY2FrbGFyxLEgbGVnQmVoYXZpb3InYSBiYWvEsWxhcmFrXG4gICAgICAgICAgICAgICAgICAgICAgIEtPxZ5VTFNVWiBcIi1cIiBnw7ZzdGVyaXlvcmR1IC0gemluY2lyaW4gU09OIGJhY2HEn8SxIG9sbWF5YW4gYmlyIENvbnN0cnVjdGlvbiBiYWNhxJ/EsW7EsW5cbiAgICAgICAgICAgICAgICAgICAgICAgaGVkZWZpbmRlIGFydMSxcsSxbSBvcmFuxLEgdGFuxLFtc8SxemtlbiBrdWxsYW7EsWPEsSBoacOnIHV5YXLEsWxtxLF5b3JkdSAoa29kIGluY2VsZW1lc2l5bGVcbiAgICAgICAgICAgICAgICAgICAgICAgdGVzcGl0IGVkaWxkaSkuIERvxJ9ydSBrb8WfdWwgXCJ6aW5jaXJpbiBzb24gYmFjYcSfxLEgbcSxXCIgKGxlZ1RhcmdldERvY0xhYmVsJ2Rha2lcbiAgICAgICAgICAgICAgICAgICAgICAgaXNMYXN0TGVnIGlsZSBheW7EsSBtYW50xLFrKSwgbGVnQmVoYXZpb3IgZGXEn2lsLiAtLT5cbiAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJsZWcuc2VxdWVuY2VObyA+PSAod29ya2luZ0NvcHk/LmxlZ3M/Lmxlbmd0aCA/PyAwKVwiPi08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsZWcuc2VxdWVuY2VObyA8ICh3b3JraW5nQ29weT8ubGVncz8ubGVuZ3RoID8/IDApXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJsZWcuaW5jcmVhc2VSYXRlQXBwbGllZCA/PyBsZWcucGxhbm5lZEluY3JlYXNlUmF0ZSBhcyByYXRlXCI+e3sgcmF0ZSB8IG51bWJlcjogJzEuMi0yJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiEobGVnLmluY3JlYXNlUmF0ZUFwcGxpZWQgPz8gbGVnLnBsYW5uZWRJbmNyZWFzZVJhdGUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiQnUgxZ9pcmtldHRlIGJ1IHByb2plIGnDp2luIGFydMSxcsSxbSBvcmFuxLEgdGFuxLFtbMSxIGRlxJ9pbGRpci4gQXJ0xLFyxLFtIHV5Z3VsYW5tYWRhbiBkZXZhbSBlZGlsZWNla3Rpci5cIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIFRhbsSxbXPEsXpcbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cImlzRHJhZnQoKVwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLWRhbmdlclwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZUxlZyhsZWcpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNNdXRhdGluZ0xlZ3MgfHwgd29ya2luZ0NvcHkubGVncy5sZW5ndGggPD0gMVwiXG4gICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJCYWNhxJ/EsSBTaWxcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS10cmFzaFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwidGFibGUtbGlnaHRcIiAqbmdJZj1cIiFpc0RyYWZ0KClcIj5cbiAgICAgICAgICAgICAgICAgIDx0ZD48L3RkPlxuICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49XCI5XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGZsZXgtd3JhcCBnYXAtM1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz5EdXJ1bTo8L3N0cm9uZz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYmFkZ2UgbXMtMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5iZy1zZWNvbmRhcnldPVwibGVnLnN0YXR1cyA9PT0gMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5iZy1zdWNjZXNzXT1cImxlZy5zdGF0dXMgPT09IDFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYmctZGFuZ2VyXT1cImxlZy5zdGF0dXMgPT09IDJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYmctd2FybmluZ109XCJsZWcuc3RhdHVzID09PSAzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbGVnU3RhdHVzTGFiZWwobGVnLnN0YXR1cykgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJjcmVhdGVkRG9jdW1lbnRzU3VtbWFyeShsZWcpIGFzIGRvY3NcIj48c3Ryb25nPlNvbnXDpyBCZWxnZShsZXIpOjwvc3Ryb25nPiB7eyBkb2NzIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cImxlZy5lcnJvck1lc3NhZ2VcIj48c3Ryb25nPkhhdGE6PC9zdHJvbmc+IHt7IGxlZy5lcnJvck1lc3NhZ2UgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLXByaW1hcnkgbXMtYXV0b1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZXhlY3V0ZUxlZyhsZWcpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0V4ZWN1dGluZyB8fCAhY2FuRXhlY3V0ZUxlZyhsZWcpXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImlzRXhlY3V0aW5nXCIgY2xhc3M9XCJzcGlubmVyLWJvcmRlciBzcGlubmVyLWJvcmRlci1zbSBtZS0xXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgw4dhbMSxxZ90xLFyXG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPHVsIGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbFwiICpuZ0lmPVwiaXNEcmFmdCgpXCI+XG4gICAgICAgICAgPGxpPsWeaXJrZXRsZXIgYXJhc8SxIE9JTlYg4oaSIE9QQ0ggZ2XDp2nFn2luZGUga2F5bmFrIE51bUF0Q2FyZCBoZWRlZiBPUENILk51bUF0Q2FyZCBhbGFuxLFuYSBheW5lbiB0YcWfxLFuxLFyLjwvbGk+XG4gICAgICAgICAgPGxpPkFydMSxcsSxbSB5YWxuxLF6Y2EgYXluxLEgxZ9pcmtldCBpw6dpbmRlIG9sdcWfdHVydWxhbiB5ZW5pIE3DvMWfdGVyaSBGYXR1cmFzxLFuYSB1eWd1bGFuxLFyOyBuYXZsdW4gYXJ0xLFyxLFtIG9yYW7EsW5kYW4gZXRraWxlbm1lei48L2xpPlxuICAgICAgICAgIDxsaT5NdWhhdGFwIGtvZGxhcsSxIE11aGF0YXAgRcWfbGXFn3Rpcm1lbGVyaSDDvHplcmluZGVuIMOnw7Z6w7xsw7xyLiBLdXIga2F5bmFrIGJlbGdlZGVuIGdlbGlyIHZlIGt1bGxhbsSxY8SxIHRhcmFmxLFuZGFuIGRlxJ9pxZ90aXJpbGViaWxpci48L2xpPlxuICAgICAgICA8L3VsPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZCBnYXAtMiBtdC0zXCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnlcIiAoY2xpY2spPVwiYmFja1RvTGlzdCgpXCI+e3sgaXNEcmFmdCgpID8gJ1Zhemdlw6cnIDogJ0thcGF0JyB9fTwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIlxuICAgICAgICAgIChjbGljayk9XCJzdGFydEZsb3coKVwiXG4gICAgICAgICAgKm5nSWY9XCJpc0RyYWZ0KCkgJiYgd29ya2luZ0NvcHlcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJpc1N0YXJ0aW5nIHx8IGhhc01pc3NpbmdDb25zdHJ1Y3Rpb25EcmFmdFNlbGVjdGlvbigpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXNTdGFydGluZ1wiIGNsYXNzPVwic3Bpbm5lci1ib3JkZXIgc3Bpbm5lci1ib3JkZXItc20gbWUtMVwiPjwvc3Bhbj5cbiAgICAgICAgICBCZWxnZSBBa8SxxZ/EsW7EsSBCYcWfbGF0XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|
|
485
|
+
args: [{ selector: 'hit-document-transfer-detail', template: "<div class=\"card\">\n <div class=\"card-header py-3\">\n <div class=\"row align-items-center\">\n <div class=\"col\">\n <h5 class=\"card-title mb-0\">{{ 'FBDocumentFlow::DocumentFlowTitle' | abpLocalization }}</h5>\n </div>\n <div class=\"col-auto\">\n <button class=\"btn btn-sm btn-outline-secondary\" (click)=\"backToList()\">\n <i class=\"fa fa-arrow-left me-1\"></i>{{ 'FBDocumentFlow::BackToList' | abpLocalization }}\n </button>\n </div>\n </div>\n </div>\n <div class=\"card-body pt-3\">\n <div *ngIf=\"isLoading\" class=\"text-center py-5\">\n <div class=\"spinner-border text-primary\" role=\"status\"></div>\n <div class=\"mt-2 text-muted\">{{ 'FBDocumentFlow::Loading' | abpLocalization }}</div>\n </div>\n\n <ng-container *ngIf=\"!isLoading\">\n <!-- Bu sat\u0131r hem \"yeni\" (hen\u00FCz kay\u0131t olu\u015Fmam\u0131\u015F) hem de kay\u0131t olu\u015Ftuktan sonraki taslak durumunda\n AYNI alan setini g\u00F6sterir - kay\u0131t olu\u015Funca ekran\u0131n alan seti de\u011Fi\u015Fip kullan\u0131c\u0131da \"ba\u015Fka bir\n kay\u0131t m\u0131 bu\" izlenimi vermesin diye. De\u011Ferler \u00F6nce newState'ten (istemcide tutulan \u00F6nizleme),\n o yoksa olu\u015Fan kayd\u0131n ilk baca\u011F\u0131ndan (workingCopy.legs[0]) okunur - ilk bacak her zaman\n newState'in temsil etti\u011Fi \"ilk hedef\" ad\u0131m\u0131yla ayn\u0131 belgedir. -->\n <div class=\"row g-3 mb-3\" *ngIf=\"newState || workingCopy\">\n <div class=\"col-md-3\">\n <label class=\"form-label\">{{ 'FBDocumentFlow::SourceCompany' | abpLocalization }}</label>\n <input type=\"text\" class=\"form-control\" [value]=\"companyName()\" disabled />\n </div>\n <div class=\"col-md-2\">\n <label class=\"form-label\">{{ 'FBDocumentFlow::DocNum' | abpLocalization }}</label>\n <input type=\"text\" class=\"form-control\" [value]=\"newState?.docNum ?? workingCopy?.sourceOinvDocNum\" disabled />\n </div>\n <div class=\"col-md-2\">\n <label class=\"form-label\">{{ 'FBDocumentFlow::NumAtCard' | abpLocalization }}</label>\n <input type=\"text\" class=\"form-control\" [value]=\"newState?.numAtCard ?? workingCopy?.sourceOinvNumAtCard\" disabled />\n </div>\n <div class=\"col-md-1\">\n <label class=\"form-label\">{{ 'FBDocumentFlow::Project' | abpLocalization }}</label>\n <input type=\"text\" class=\"form-control\" [value]=\"newState?.projectCode ?? workingCopy?.projectCode\" disabled />\n </div>\n <div class=\"col-md-2\">\n <label class=\"form-label\">{{ 'FBDocumentFlow::FirstTarget' | abpLocalization }}</label>\n <input type=\"text\" class=\"form-control\" [value]=\"newState?.targetCompanyName ?? workingCopy?.legs?.[0]?.targetCompanyName\" disabled />\n </div>\n <div class=\"col-md-2\">\n <label class=\"form-label\">{{ 'FBDocumentFlow::Currency' | abpLocalization }}</label>\n <input type=\"text\" class=\"form-control\" [value]=\"newState?.currency ?? workingCopy?.legs?.[0]?.currency\" disabled />\n </div>\n </div>\n\n <!-- Belge Durumu her zaman (yeni kay\u0131tta da) g\u00F6r\u00FCn\u00FCr; Intercompany Id/Aktar\u0131m Durumu/Senaryo yaln\u0131zca\n kay\u0131t olu\u015Ftuktan sonra vard\u0131r - kullan\u0131c\u0131 iste\u011Fiyle hepsi ayn\u0131 sat\u0131rda, Belge Durumu'nun yan\u0131na\n topland\u0131 (\u00F6nceden Intercompany Id/Aktar\u0131m Durumu ayr\u0131 bir sat\u0131rdayd\u0131). -->\n <div class=\"row g-3 mb-3\" *ngIf=\"newState || workingCopy\">\n <div class=\"col-md-2\">\n <label class=\"form-label\">{{ 'FBDocumentFlow::SourceDocumentLifecycle' | abpLocalization }}</label>\n <input\n type=\"text\"\n class=\"form-control\"\n [value]=\"sourceDocumentLifecycleLabel(newState?.sourceDocumentLifecycle ?? workingCopy?.sourceDocumentLifecycle)\"\n disabled\n />\n </div>\n <div class=\"col-md-2\">\n <label class=\"form-label\">{{ 'FBDocumentFlow::TargetDocumentLifecycle' | abpLocalization }}</label>\n <!-- Aktar\u0131m hen\u00FCz olu\u015Fturulmad\u0131ysa (isNew) burada se\u00E7ilebilir - kaynaktan ba\u011F\u0131ms\u0131z bir karard\u0131r\n (kullan\u0131c\u0131 geri bildirimiyle netle\u015Ftirildi: kayna\u011F\u0131n modu sabit, hedefin modu burada se\u00E7ilir).\n Olu\u015Ftuktan sonra backend'de sabitlendi\u011Fi i\u00E7in (workingCopy) salt-okunur g\u00F6sterilir. -->\n <select *ngIf=\"isNew && newState\" class=\"form-select\" [(ngModel)]=\"newState.targetDocumentLifecycle\">\n <option *ngFor=\"let o of documentLifecycleOptions\" [ngValue]=\"o.value\">{{ o.label }}</option>\n </select>\n <input\n *ngIf=\"!isNew || !newState\"\n type=\"text\"\n class=\"form-control\"\n [value]=\"sourceDocumentLifecycleLabel(newState?.targetDocumentLifecycle ?? workingCopy?.targetDocumentLifecycle)\"\n disabled\n />\n </div>\n <div class=\"col-md-3\" *ngIf=\"workingCopy\">\n <label class=\"form-label\">{{ 'FBDocumentFlow::IntercompanyId' | abpLocalization }}</label>\n <input type=\"text\" class=\"form-control\" [value]=\"workingCopy.intercompanyId\" disabled />\n </div>\n <div class=\"col-md-2\" *ngIf=\"workingCopy\">\n <label class=\"form-label\">{{ 'FBDocumentFlow::TransferStatusLabel' | abpLocalization }}</label>\n <input type=\"text\" class=\"form-control\" [value]=\"statusLabel(workingCopy.status)\" disabled />\n </div>\n <!-- Senaryo, aktar\u0131m hen\u00FCz \u00E7al\u0131\u015Ft\u0131r\u0131lmam\u0131\u015Fken (isDraft()) alt\u0131ndaki \"Haz\u0131r Senaryo\" dropdown'\u0131nda\n zaten d\u00FCzenlenebilir/g\u00F6r\u00FCn\u00FCr durumda - ayn\u0131 bilgiyi burada salt-okunur tekrar g\u00F6stermek\n (kullan\u0131c\u0131 geri bildirimiyle tespit edildi) kafa kar\u0131\u015Ft\u0131r\u0131yordu. Yaln\u0131zca aktar\u0131m art\u0131k\n d\u00FCzenlenemez hale geldi\u011Finde (dropdown kayboldu\u011Funda) burada g\u00F6sterilir. -->\n <div class=\"col-md-3\" *ngIf=\"workingCopy && !isDraft()\">\n <label class=\"form-label\">{{ 'FBDocumentFlow::Scenario' | abpLocalization }}</label>\n <input type=\"text\" class=\"form-control\" [value]=\"scenarioName()\" disabled />\n </div>\n </div>\n\n <!-- Taslak: haz\u0131r senaryo se\u00E7imi, hen\u00FCz \u00E7al\u0131\u015Ft\u0131r\u0131lmad\u0131. -->\n <ng-container *ngIf=\"isDraft()\">\n <div class=\"row g-3 align-items-end mb-3\">\n <div class=\"col-md-4\">\n <label class=\"form-label\">{{ 'FBDocumentFlow::ReadyScenario' | abpLocalization }}</label>\n <select class=\"form-select\" [(ngModel)]=\"scenarioId\">\n <option [ngValue]=\"''\">{{ 'FBDocumentFlow::NoScenarioOption' | abpLocalization }}</option>\n <option *ngFor=\"let s of availableScenarios()\" [ngValue]=\"s.id\">{{ s.name }}</option>\n </select>\n </div>\n <div class=\"col-md-2\">\n <button\n class=\"btn btn-outline-primary\"\n (click)=\"isNew ? fetchScenario() : applyScenario()\"\n [disabled]=\"isFetchingScenario\"\n >\n <span *ngIf=\"isFetchingScenario\" class=\"spinner-border spinner-border-sm me-1\"></span>\n {{ (isNew ? 'FBDocumentFlow::FetchScenario' : 'FBDocumentFlow::ApplyScenario') | abpLocalization }}\n </button>\n </div>\n </div>\n </ng-container>\n\n <!-- NumAtCard alanlar\u0131 art\u0131k isDraft()'a ba\u011Fl\u0131 DE\u011E\u0130L: taslakta d\u00FCzenlenebilir, \u00E7al\u0131\u015Ft\u0131r\u0131ld\u0131ktan\n sonra (isDraft() false olsa da) salt-okunur olarak ekranda kal\u0131r - \"Haz\u0131r Senaryo\" blo\u011Fuyla\n birlikte tamamen kaybolmas\u0131n diye. -->\n <ng-container *ngIf=\"workingCopy\">\n <div class=\"row g-3 align-items-end mb-3\" *ngIf=\"hasIntermediateNumAtCardLegs()\">\n <div class=\"col-md-3\" *ngFor=\"let leg of workingCopy.legs\">\n <ng-container *ngIf=\"leg.legBehavior === 0 && leg.sequenceNo < workingCopy.legs.length\">\n <label class=\"form-label\">{{ 'FBDocumentFlow::LegNumAtCardLabel' | abpLocalization: leg.sequenceNo.toString():leg.targetCompanyName }}</label>\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"leg.numAtCard\" [disabled]=\"!isDraft()\" />\n </ng-container>\n </div>\n </div>\n\n <div class=\"alert alert-warning\" *ngIf=\"isDraft() && hasMissingIncreaseRate()\">\n {{ 'FBDocumentFlow::IncreaseRateWarning' | abpLocalization }}\n </div>\n\n <div class=\"alert alert-warning\" *ngIf=\"isDraft() && hasMissingConstructionDraftSelection()\">\n {{ 'FBDocumentFlow::ConstructionDraftWarning' | abpLocalization }}\n </div>\n </ng-container>\n\n <!-- Tek tablo: taslakta da, \u00E7al\u0131\u015Ft\u0131r\u0131ld\u0131ktan sonra da AYNI s\u00FCtun seti (S\u0131ra..Art\u0131r\u0131m) korunur;\n Durum/Sonu\u00E7 Belge/Hata/\u00C7al\u0131\u015Ft\u0131r yaln\u0131zca \u00E7al\u0131\u015Ft\u0131r\u0131ld\u0131ktan sonra, her sat\u0131r\u0131n ALTINA ikinci bir\n sat\u0131r olarak eklenir - eskiden bu bilgiler ayr\u0131 ve daha dar bir tabloya ge\u00E7ilerek g\u00F6steriliyordu,\n bu da Kaynak Belge/Hedefte Olu\u015Facak gibi s\u00FCtunlar\u0131n \"kaybolmu\u015F\" g\u00F6r\u00FCnmesine yol a\u00E7\u0131yordu. -->\n <ng-container *ngIf=\"workingCopy\">\n <div class=\"d-flex justify-content-between align-items-center mb-2\">\n <div>\n <h6 class=\"mb-0\">{{ (isDraft() ? 'FBDocumentFlow::ScenarioWorkingCopy' : 'FBDocumentFlow::TransferResult') | abpLocalization }}</h6>\n <small class=\"text-muted\" *ngIf=\"isDraft()\">{{ 'FBDocumentFlow::WorkingCopyHint' | abpLocalization }}</small>\n </div>\n <button class=\"btn btn-sm btn-outline-primary\" (click)=\"addLeg()\" *ngIf=\"isDraft()\" [disabled]=\"isMutatingLegs\">\n <i class=\"fa fa-plus me-1\"></i>{{ 'FBDocumentFlow::AddLeg' | abpLocalization }}\n </button>\n <button class=\"btn btn-sm btn-outline-danger\" (click)=\"cancelChain()\" *ngIf=\"canCancelChain()\">\n <i class=\"fa fa-ban me-1\"></i>{{ 'FBDocumentFlow::CancelChain' | abpLocalization }}\n </button>\n </div>\n\n <div class=\"alert alert-secondary small\" *ngIf=\"workingCopy.status === 4\">\n {{ 'FBDocumentFlow::ChainCancelledNote' | abpLocalization }}\n </div>\n\n <div class=\"table-responsive\">\n <table class=\"table table-sm table-bordered align-middle\">\n <thead>\n <tr>\n <th>{{ 'FBDocumentFlow::SequenceNo' | abpLocalization }}</th>\n <th>{{ 'FBDocumentFlow::Source' | abpLocalization }}</th>\n <th>{{ 'FBDocumentFlow::SourceDocument' | abpLocalization }}</th>\n <th>{{ 'FBDocumentFlow::Target' | abpLocalization }}</th>\n <th>{{ 'FBDocumentFlow::Behavior' | abpLocalization }}</th>\n <th>{{ 'FBDocumentFlow::TargetCreates' | abpLocalization }}</th>\n <th>{{ 'FBDocumentFlow::OpchCardCode' | abpLocalization }}</th>\n <th>{{ 'FBDocumentFlow::Currency' | abpLocalization }}</th>\n <th>{{ 'FBDocumentFlow::ExchangeRate' | abpLocalization }}</th>\n <th>{{ 'FBDocumentFlow::IncreaseRateColumn' | abpLocalization }}</th>\n <th *ngIf=\"isDraft()\"></th>\n </tr>\n </thead>\n <tbody>\n <ng-container *ngFor=\"let leg of workingCopy.legs\">\n <tr>\n <td>{{ leg.sequenceNo }}</td>\n <td>{{ leg.sourceCompanyName }}</td>\n <td>OINV</td>\n <td>\n <select\n *ngIf=\"isDraft(); else targetText\"\n class=\"form-select form-select-sm\"\n [ngModel]=\"leg.targetCompanyId\"\n (ngModelChange)=\"updateLegTarget(leg, $event)\"\n [disabled]=\"isMutatingLegs\"\n >\n <option *ngFor=\"let c of companies\" [ngValue]=\"c.id\">{{ c.companyName }}</option>\n </select>\n <ng-template #targetText>{{ leg.targetCompanyName }}</ng-template>\n </td>\n <td>\n <select\n *ngIf=\"isDraft(); else behaviorText\"\n class=\"form-select form-select-sm\"\n [ngModel]=\"leg.legBehavior\"\n (ngModelChange)=\"updateLegBehavior(leg, $event)\"\n [disabled]=\"isMutatingLegs\"\n >\n <option *ngFor=\"let b of legBehaviors\" [ngValue]=\"b.value\">{{ b.label }}</option>\n </select>\n <ng-template #behaviorText>{{ legBehaviors[leg.legBehavior]?.label }}</ng-template>\n </td>\n <td>\n <select\n *ngIf=\"isDraft() && isConstructionDraftSelectable(leg); else targetDocText\"\n class=\"form-select form-select-sm\"\n [ngModel]=\"leg.selectedConstructionDraftDocType\"\n (ngModelChange)=\"updateLegConstructionDraftDocType(leg, $event)\"\n [disabled]=\"isMutatingLegs\"\n >\n <option [ngValue]=\"null\">{{ 'FBDocumentFlow::SelectPlaceholderEllipsis' | abpLocalization }}</option>\n <option *ngFor=\"let o of constructionDraftDocTypeOptions\" [ngValue]=\"o.value\">{{ o.label }}</option>\n </select>\n <ng-template #targetDocText>{{ legTargetDocLabel(leg) }}</ng-template>\n </td>\n <td>\n <span *ngIf=\"leg.resolvedOpchCardCode\">{{ leg.resolvedOpchCardCode }}</span>\n <div *ngIf=\"!leg.resolvedOpchCardCode\" class=\"d-flex flex-column align-items-start py-1\">\n <span class=\"badge bg-danger\">{{ 'FBDocumentFlow::NotMapped' | abpLocalization }}</span>\n <button\n type=\"button\"\n class=\"btn btn-outline-danger btn-sm mt-2 py-0 px-2\"\n style=\"font-size: 0.72rem\"\n (click)=\"goToPartnerMapping(leg)\"\n [title]=\"'FBDocumentFlow::GoToPartnerMappingTooltip' | abpLocalization\"\n >\n <i class=\"fa fa-link me-1\"></i>{{ 'FBDocumentFlow::Match' | abpLocalization }}\n </button>\n </div>\n </td>\n <td>\n <input\n *ngIf=\"isDraft(); else currencyText\"\n type=\"text\"\n class=\"form-control form-control-sm\"\n style=\"width: 5.5rem\"\n [(ngModel)]=\"leg.currency\"\n [placeholder]=\"newState?.currency || ('FBDocumentFlow::FromSource' | abpLocalization)\"\n />\n <ng-template #currencyText>{{ leg.currency || newState?.currency }}</ng-template>\n </td>\n <td>\n <input\n *ngIf=\"isDraft(); else rateText\"\n type=\"number\"\n class=\"form-control form-control-sm\"\n style=\"width: 6rem\"\n [(ngModel)]=\"leg.exchangeRate\"\n [placeholder]=\"'FBDocumentFlow::FromSource' | abpLocalization\"\n />\n <ng-template #rateText>{{ leg.exchangeRate ?? '-' }}</ng-template>\n </td>\n <!-- Spec \u00A79 - art\u0131r\u0131m YALNIZCA bu baca\u011F\u0131n olu\u015Fturdu\u011Fu devam M\u00FC\u015Fteri Faturas\u0131na (bir\n sonraki bacak varsa) uygulan\u0131r; bu hem IntermediateChain hem ConstructionChain i\u00E7in\n ge\u00E7erlidir (Construction'da da nextTargetCompanyId.HasValue ise devam OINV'i\n art\u0131r\u0131mla olu\u015Fturuluyor). \u00D6nceden Construction bacaklar\u0131 legBehavior'a bak\u0131larak\n KO\u015EULSUZ \"-\" g\u00F6steriyordu - zincirin SON baca\u011F\u0131 olmayan bir Construction baca\u011F\u0131n\u0131n\n hedefinde art\u0131r\u0131m oran\u0131 tan\u0131ms\u0131zken kullan\u0131c\u0131 hi\u00E7 uyar\u0131lm\u0131yordu (kod incelemesiyle\n tespit edildi). Do\u011Fru ko\u015Ful \"zincirin son baca\u011F\u0131 m\u0131\" (legTargetDocLabel'daki\n isLastLeg ile ayn\u0131 mant\u0131k), legBehavior de\u011Fil. -->\n <td>\n <span *ngIf=\"leg.sequenceNo >= (workingCopy?.legs?.length ?? 0)\">-</span>\n <ng-container *ngIf=\"leg.sequenceNo < (workingCopy?.legs?.length ?? 0)\">\n <span *ngIf=\"leg.increaseRateApplied ?? leg.plannedIncreaseRate as rate\">{{ rate | number: '1.2-2' }}</span>\n <span\n class=\"text-danger\"\n *ngIf=\"!(leg.increaseRateApplied ?? leg.plannedIncreaseRate)\"\n [title]=\"'FBDocumentFlow::IncreaseRateUndefinedTooltip' | abpLocalization\"\n >\n {{ 'FBDocumentFlow::Undefined' | abpLocalization }}\n </span>\n </ng-container>\n </td>\n <td *ngIf=\"isDraft()\">\n <button\n class=\"btn btn-sm btn-outline-danger\"\n (click)=\"removeLeg(leg)\"\n [disabled]=\"isMutatingLegs || workingCopy.legs.length <= 1\"\n [title]=\"'FBDocumentFlow::DeleteLegTooltip' | abpLocalization\"\n >\n <i class=\"fa fa-trash\"></i>\n </button>\n </td>\n </tr>\n <tr class=\"table-light\" *ngIf=\"!isDraft()\">\n <td></td>\n <td colspan=\"9\">\n <div class=\"d-flex align-items-center flex-wrap gap-3\">\n <span>\n <strong>{{ 'FBDocumentFlow::Status' | abpLocalization }}:</strong>\n <span\n class=\"badge ms-1\"\n [class.bg-secondary]=\"leg.status === 0\"\n [class.bg-success]=\"leg.status === 1\"\n [class.bg-danger]=\"leg.status === 2\"\n [class.bg-warning]=\"leg.status === 3\"\n >\n {{ legStatusLabel(leg.status) }}\n </span>\n </span>\n <span *ngIf=\"createdDocumentsSummary(leg) as docs\"><strong>{{ 'FBDocumentFlow::ResultDocuments' | abpLocalization }}:</strong> {{ docs }}</span>\n <span class=\"text-danger\" *ngIf=\"leg.errorMessage\"><strong>{{ 'FBDocumentFlow::Error' | abpLocalization }}:</strong> {{ leg.errorMessage }}</span>\n <button\n class=\"btn btn-sm btn-outline-primary ms-auto\"\n (click)=\"executeLeg(leg)\"\n [disabled]=\"isExecuting || !canExecuteLeg(leg)\"\n >\n <span *ngIf=\"isExecuting\" class=\"spinner-border spinner-border-sm me-1\"></span>\n {{ 'FBDocumentFlow::Execute' | abpLocalization }}\n </button>\n </div>\n </td>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </div>\n\n <ul class=\"text-muted small\" *ngIf=\"isDraft()\">\n <li>{{ 'FBDocumentFlow::NoteNumAtCardCarryOver' | abpLocalization }}</li>\n <li>{{ 'FBDocumentFlow::NoteIncreaseRateScope' | abpLocalization }}</li>\n <li>{{ 'FBDocumentFlow::NoteCardCodeResolution' | abpLocalization }}</li>\n </ul>\n </ng-container>\n\n <div class=\"d-flex justify-content-end gap-2 mt-3\">\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"backToList()\">{{ (isDraft() ? 'AbpUi::Cancel' : 'FBDocumentFlow::Close') | abpLocalization }}</button>\n <button\n type=\"button\"\n class=\"btn btn-primary\"\n (click)=\"startFlow()\"\n *ngIf=\"isDraft() && workingCopy\"\n [disabled]=\"isStarting || hasMissingConstructionDraftSelection()\"\n >\n <span *ngIf=\"isStarting\" class=\"spinner-border spinner-border-sm me-1\"></span>\n {{ 'FBDocumentFlow::StartDocumentFlow' | abpLocalization }}\n </button>\n </div>\n </ng-container>\n </div>\n</div>\n" }]
|
|
486
|
+
}], ctorParameters: function () { return [{ type: i1.ActivatedRoute }, { type: i1.Router }, { type: i2.DocumentTransferService }, { type: i3.DocumentScenarioService }, { type: i4.SapCompanyProfileService }, { type: i5.ConfirmationService }, { type: i6.LocalizationService }]; } });
|
|
487
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGl0LWRvY3VtZW50LXRyYW5zZmVyLWRldGFpbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mYmRvY3VtZW50Zmxvdy9zcmMvbGliL2NvbXBvbmVudHMvaGl0LWRvY3VtZW50LXRyYW5zZmVycy9jb21wb25lbnRzL2hpdC1kb2N1bWVudC10cmFuc2Zlci1kZXRhaWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZmJkb2N1bWVudGZsb3cvc3JjL2xpYi9jb21wb25lbnRzL2hpdC1kb2N1bWVudC10cmFuc2ZlcnMvY29tcG9uZW50cy9oaXQtZG9jdW1lbnQtdHJhbnNmZXItZGV0YWlsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFHbEQsT0FBTyxFQUFFLFlBQVksRUFBdUIsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUNMLDZCQUE2QixFQUk3QixvQkFBb0IsR0FDckIsTUFBTSxtQ0FBbUMsQ0FBQztBQUMzQyxPQUFPLEVBQWdELFdBQVcsRUFBRSxNQUFNLG1DQUFtQyxDQUFDOzs7Ozs7Ozs7O0FBRzlHLE1BQU0sOEJBQThCLEdBQUcsQ0FBQyxDQUFDO0FBQ3pDLE1BQU0sa0NBQWtDLEdBQUcsQ0FBQyxDQUFDO0FBQzdDLE1BQU0sa0NBQWtDLEdBQUcsQ0FBQyxDQUFDO0FBQzdDLE1BQU0sb0NBQW9DLEdBQUcsQ0FBQyxDQUFDO0FBQy9DLE1BQU0sb0NBQW9DLEdBQUcsQ0FBQyxDQUFDO0FBQy9DLE1BQU0sbUNB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QUksR0FBRyxDQUFDLGVBQWUsRUFBRTtZQUN2QixLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLGFBQWEsSUFBSSxHQUFHLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQztTQUNoRTtRQUNELElBQUksR0FBRyxDQUFDLDJCQUEyQixFQUFFO1lBQ25DLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMseUJBQXlCLElBQUksR0FBRyxDQUFDLDJCQUEyQixFQUFFLENBQUMsQ0FBQztTQUN4RjtRQUNELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzQixDQUFDOzsrSEEzaEJVLGtDQUFrQzttSEFBbEMsa0NBQWtDLG9FQ2pEL0MscXdxQkFnV0E7MkZEL1NhLGtDQUFrQztrQkFKOUMsU0FBUzsrQkFDRSw4QkFBOEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBMb2NhbGl6YXRpb25TZXJ2aWNlIH0gZnJvbSAnQGFicC9uZy5jb3JlJztcbmltcG9ydCB7IENvbmZpcm1hdGlvbiwgQ29uZmlybWF0aW9uU2VydmljZSB9IGZyb20gJ0BhYnAvbmcudGhlbWUuc2hhcmVkJztcbmltcG9ydCB7IGZyb20sIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjb25jYXRNYXAsIGZpbmFsaXplLCBzd2l0Y2hNYXAsIHRvQXJyYXkgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICBDb25zdHJ1Y3Rpb25EcmFmdERvY3VtZW50VHlwZSxcbiAgRG9jdW1lbnRUcmFuc2ZlckR0byxcbiAgRG9jdW1lbnRUcmFuc2ZlckxlZ0R0byxcbiAgRG9jdW1lbnRUcmFuc2ZlclNlcnZpY2UsXG4gIFNhcERvY3VtZW50TGlmZWN5Y2xlLFxufSBmcm9tICcuLi8uLi8uLi9wcm94eS9kb2N1bWVudC10cmFuc2ZlcnMnO1xuaW1wb3J0IHsgRG9jdW1lbnRTY2VuYXJpb0R0bywgRG9jdW1lbnRTY2VuYXJpb1NlcnZpY2UsIExlZ0JlaGF2aW9yIH0gZnJvbSAnLi4vLi4vLi4vcHJveHkvZG9jdW1lbnQtc2NlbmFyaW9zJztcbmltcG9ydCB7IFNhcENvbXBhbnlQcm9maWxlRHRvLCBTYXBDb21wYW55UHJvZmlsZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9wcm94eS9zYXAtY29tcGFueS1wcm9maWxlcyc7XG5cbmNvbnN0IERPQ1VNRU5UX1RSQU5TRkVSX1NUQVRVU19EUkFGVCA9IDA7XG5jb25zdCBET0NVTUVOVF9UUkFOU0ZFUl9TVEFUVVNfQ09NUExFVEVEID0gMjtcbmNvbnN0IERPQ1VNRU5UX1RSQU5TRkVSX1NUQVRVU19DQU5DRUxMRUQgPSA0O1xuY29uc3QgRE9DVU1FTlRfVFJBTlNGRVJfTEVHX1NUQVRVU19QRU5ESU5HID0gMDtcbmNvbnN0IERPQ1VNRU5UX1RSQU5TRkVSX0xFR19TVEFUVVNfU1VDQ0VTUyA9IDE7XG5jb25zdCBET0NVTUVOVF9UUkFOU0ZFUl9MRUdfU1RBVFVTX0ZBSUxFRCA9IDI7XG5cbi8vLyBCZWxnZSBBa3RhcsSxbcSxIGxpc3Rlc2luZGVuIFwixLDFn2xlbWxlclwiIGlsZSBidXJheWEgZ2VsaW5pci4gUG9wdXAgeWVyaW5lIGF5csSxIGJpciBzYXlmYSBvbGFyYWtcbi8vLyB0YXNhcmxhbm3EscWfdMSxciBraSBrdWxsYW7EsWPEsSBzb251Y3UgKMO2emVsbGlrbGUgaGF0YSkga2F5YmV0bWVkZW4gaW5jZWxleWViaWxzaW4sIHNheWZhecSxIHllbmlsZXllYmlsc2luXG4vLy8gdmUgXCJMaXN0ZXllIETDtm5cIiBpbGUgaGVyIHphbWFuIGF5bsSxIHllcmUgZ2VyaSBkw7ZuZWJpbHNpbi5cbmludGVyZmFjZSBOZXdUcmFuc2ZlclN0YXRlIHtcbiAgc291cmNlQ29tcGFueUlkOiBzdHJpbmc7XG4gIHNvdXJjZUNvbXBhbnlOYW1lPzogc3RyaW5nO1xuICBkb2NFbnRyeTogbnVtYmVyO1xuICBkb2NOdW0/OiBzdHJpbmc7XG4gIG51bUF0Q2FyZD86IHN0cmluZztcbiAgcHJvamVjdENvZGU/OiBzdHJpbmc7XG4gIHRhcmdldENvbXBhbnlJZD86IHN0cmluZztcbiAgdGFyZ2V0Q29tcGFueU5hbWU/OiBzdHJpbmc7XG4gIGN1cnJlbmN5Pzogc3RyaW5nO1xuICAvLyBLYXluYWsgZmF0dXJhbsSxbiBrZW5kaSBtb2R1IC0gQmVsZ2UgQWt0YXLEsW3EsSBsaXN0ZXNpbmRla2kgZmlsdHJlZGVuIChoYW5naSBmYXR1cmEgc2XDp2lsZGl5c2Ugb25hIGfDtnJlKVxuICAvLyBnZWxpciwgU0FCxLBUVMSwUiB2ZSBidSBla3JhbmRhIERFxJ7EsMWeVMSwUsSwTEVNRVogKGt1bGxhbsSxY8SxIGdlcmkgYmlsZGlyaW1peWxlIG5ldGxlxZ90aXJpbGRpOiBrYXluYcSfxLFuXG4gIC8vIHRhc2xhay9pxZ9sZW5tacWfIG9sbWEgaGFsaSwgaGFuZ2kgRG9jRW50cnknbmluIHNlw6dpbGRpxJ9pbmUgYmHEn2zEsSBkZcSfacWfbWV6IGJpciBnZXLDp2VrdGlyKS5cbiAgc291cmNlRG9jdW1lbnRMaWZlY3ljbGU6IFNhcERvY3VtZW50TGlmZWN5Y2xlO1xuICAvLyBIZWRlZnRlIG9sdcWfYWNhayBiZWxnZWxlcmluIG1vZHUgLSBrYXluYWt0YW4gQkHEnklNU0laLCBrdWxsYW7EsWPEsSBidSBla3JhbmRhIHNlw6dlciAow7ZyLiBLYXnEsXRsxLEgYmlyXG4gIC8vIGtheW5ha3RhbiBUYXNsYWsgaGVkZWYgYmVsZ2VsZXIgw7xyZXRpbGViaWxpcikuXG4gIHRhcmdldERvY3VtZW50TGlmZWN5Y2xlOiBTYXBEb2N1bWVudExpZmVjeWNsZTtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaGl0LWRvY3VtZW50LXRyYW5zZmVyLWRldGFpbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9oaXQtZG9jdW1lbnQtdHJhbnNmZXItZGV0YWlsLmNvbXBvbmVudC5odG1sJyxcbn0pXG5leHBvcnQgY2xhc3MgSGl0RG9jdW1lbnRUcmFuc2ZlckRldGFpbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIGlzTmV3ID0gZmFsc2U7XG4gIG5ld1N0YXRlOiBOZXdUcmFuc2ZlclN0YXRlIHwgbnVsbCA9IG51bGw7XG5cbiAgc2NlbmFyaW9zOiBEb2N1bWVudFNjZW5hcmlvRHRvW10gPSBbXTtcbiAgc2NlbmFyaW9JZCA9ICcnO1xuICBpc0ZldGNoaW5nU2NlbmFyaW8gPSBmYWxzZTtcblxuICBjb21wYW5pZXM6IFNhcENvbXBhbnlQcm9maWxlRHRvW10gPSBbXTtcbiAgbGVnQmVoYXZpb3JzOiB7IHZhbHVlOiBMZWdCZWhhdmlvcjsgbGFiZWw6IHN0cmluZyB9W10gPSBbXTtcblxuICAvLyBTcGVjIMKnMTQgKDE4LjA5LjIwMjYga2FyYXLEsSkgLSBzw7xyZcOnIHBhcmFtZXRyaWsuIEFrdGFyxLFtIGhlbsO8eiBvbHXFn3R1cnVsbWFkxLF5c2EgKGlzTmV3KSBrdWxsYW7EsWPEsSBidVxuICAvLyBla3JhbmRhIFwiSGVkZWYgQmVsZ2UgRHVydW11XCJudSBzZcOnZWJpbGlyIChrYXluYWt0YW4gYmHEn8SxbXPEsXopLiBBa3RhcsSxbSBvbHXFn3R1a3RhbiBzb25yYSBidSBhbGFuXG4gIC8vIGJhY2tlbmQnZGUgc2FiaXRsZW5pciAoRG9jdW1lbnRUcmFuc2Zlci5UYXJnZXREb2N1bWVudExpZmVjeWNsZSBpbW11dGFibGUpLCBidSB5w7x6ZGVuIHdvcmtpbmdDb3B5XG4gIC8vIHZhcmtlbiBzYWx0LW9rdW51ciBnw7ZzdGVyaWxpci4gS3VsbGFuxLFjxLEgaXN0ZcSfaXlsZSBLYXluYWsgQmVsZ2UgRHVydW11IGlsZSBBWU5JIGV0aWtldGxlciBrdWxsYW7EsWzEsXIuXG4gIGRvY3VtZW50TGlmZWN5Y2xlT3B0aW9uczogeyB2YWx1ZTogU2FwRG9jdW1lbnRMaWZlY3ljbGU7IGxhYmVsOiBzdHJpbmcgfVtdID0gW107XG5cbiAgLy8gU3BlYyBlayBrYXJhciAoMTguMDkuMjAyNikgLSBoZWRlZiBUYXNsYWsgaWtlbiBDb25zdHJ1Y3Rpb24gYmFjYcSfxLFuxLFuIChPUE9S4oaST1BETuKGkk9QQ0gpIHRhYmFuIGJlbGdlXG4gIC8vIHppbmNpcmkgdGFzbGFrbGFyIGFyYXPEsW5kYSDDp2FsxLHFn21hejsgYnUgZHVydW1kYSBrdWxsYW7EsWPEsSDDvMOnIGJlbGdlIHRpcGluZGVuIHlhbG7EsXpjYSBiaXJpbmkgc2XDp2VyLlxuICBjb25zdHJ1Y3Rpb25EcmFmdERvY1R5cGVPcHRpb25zID0gW1xuICAgIHsgdmFsdWU6IENvbnN0cnVjdGlvbkRyYWZ0RG9jdW1lbnRUeXBlLlB1cmNoYXNlT3JkZXIsIGxhYmVsOiAnT1BPUicgfSxcbiAgICB7IHZhbHVlOiBDb25zdHJ1Y3Rpb25EcmFmdERvY3VtZW50VHlwZS5Hb29kc1JlY2VpcHQsIGxhYmVsOiAnT1BETicgfSxcbiAgICB7IHZhbHVlOiBDb25zdHJ1Y3Rpb25EcmFmdERvY3VtZW50VHlwZS5BUEludm9pY2UsIGxhYmVsOiAnT1BDSCcgfSxcbiAgXTtcblxuICB3b3JraW5nQ29weTogRG9jdW1lbnRUcmFuc2ZlckR0byB8IG51bGwgPSBudWxsO1xuICBpc0xvYWRpbmcgPSBmYWxzZTtcbiAgaXNTdGFydGluZyA9IGZhbHNlO1xuICBpc0V4ZWN1dGluZyA9IGZhbHNlO1xuICBpc011dGF0aW5nTGVncyA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSBzZXJ2aWNlOiBEb2N1bWVudFRyYW5zZmVyU2VydmljZSxcbiAgICBwcml2YXRlIHNjZW5hcmlvU2VydmljZTogRG9jdW1lbnRTY2VuYXJpb1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb21wYW55U2VydmljZTogU2FwQ29tcGFueVByb2ZpbGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgY29uZmlybWF0aW9uOiBDb25maXJtYXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgbG9jYWxpemF0aW9uOiBMb2NhbGl6YXRpb25TZXJ2aWNlXG4gICkge1xuICAgIHRoaXMubGVnQmVoYXZpb3JzID0gW1xuICAgICAgeyB2YWx1ZTogTGVnQmVoYXZpb3IuSW50ZXJtZWRpYXRlQ2hhaW4sIGxhYmVsOiB0aGlzLmxvY2FsaXphdGlvbi5pbnN0YW50KCdGQkRvY3VtZW50Rmxvdzo6TGVnQmVoYXZpb3I6SW50ZXJtZWRpYXRlQ2hhaW4nKSB9LFxuICAgICAgeyB2YWx1ZTogTGVnQmVoYXZpb3IuQ29uc3RydWN0aW9uQ2hhaW4sIGxhYmVsOiB0aGlzLmxvY2FsaXphdGlvbi5pbnN0YW50KCdGQkRvY3VtZW50Rmxvdzo6TGVnQmVoYXZpb3I6Q29uc3RydWN0aW9uQ2hhaW4nKSB9LFxuICAgIF07XG4gICAgdGhpcy5kb2N1bWVudExpZmVjeWNsZU9wdGlvbnMgPSBbXG4gICAgICB7IHZhbHVlOiBTYXBEb2N1bWVudExpZmVjeWNsZS5Qb3N0ZWQsIGxhYmVsOiB0aGlzLmxvY2FsaXphdGlvbi5pbnN0YW50KCdGQkRvY3VtZW50Rmxvdzo6RG9jdW1lbnRMaWZlY3ljbGU6UG9zdGVkJykgfSxcbiAgICAgIHsgdmFsdWU6IFNhcERvY3VtZW50TGlmZWN5Y2xlLkRyYWZ0LCBsYWJlbDogdGhpcy5sb2NhbGl6YXRpb24uaW5zdGFudCgnRkJEb2N1bWVudEZsb3c6OkRvY3VtZW50TGlmZWN5Y2xlOkRyYWZ0JykgfSxcbiAgICBdO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5zY2VuYXJpb1NlcnZpY2UuZ2V0TGlzdCh7IG1heFJlc3VsdENvdW50OiAxMDAwLCBza2lwQ291bnQ6IDAsIGlzQWN0aXZlOiB0cnVlIH0pLnN1YnNjcmliZShyZXN1bHQgPT4gKHRoaXMuc2NlbmFyaW9zID0gcmVzdWx0Lml0ZW1zKSk7XG4gICAgdGhpcy5jb21wYW55U2VydmljZS5nZXRMaXN0KHsgbWF4UmVzdWx0Q291bnQ6IDEwMDAsIHNraXBDb3VudDogMCwgaXNBY3RpdmU6IHRydWUgfSkuc3Vic2NyaWJlKHJlc3VsdCA9PiAodGhpcy5jb21wYW5pZXMgPSByZXN1bHQuaXRlbXMpKTtcblxuICAgIGNvbnN0IGlkID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5wYXJhbU1hcC5nZXQoJ2lkJyk7XG4gICAgaWYgKGlkID09PSAnbmV3Jykge1xuICAgICAgdGhpcy5pc05ldyA9IHRydWU7XG4gICAgICBjb25zdCBzdGF0ZSA9IGhpc3Rvcnkuc3RhdGUgYXMgTmV3VHJhbnNmZXJTdGF0ZSB8IHVuZGVmaW5lZDtcbiAgICAgIGlmICghc3RhdGU/LnNvdXJjZUNvbXBhbnlJZCB8fCBzdGF0ZS5kb2NFbnRyeSA9PSBudWxsKSB7XG4gICAgICAgIC8vIFNheWZhIGRvxJ9ydWRhbiB5ZW5pbGVubWnFny95ZW5pIHNla21lZGUgYcOnxLFsbcSxxZ9zYSByb3V0ZXIgc3RhdGUga2F5Ym9sdXI7IGtheW5hayBmYXR1cmFuxLFuXG4gICAgICAgIC8vIHNlw6dpbG1lc2kgZ2VyZWtlbiBsaXN0ZXllIGdlcmkgecO2bmxlbmRpcmlsaXIuXG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2ZiZG9jdW1lbnRmbG93L2RvY3VtZW50LXRyYW5zZmVycyddKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gc291cmNlRG9jdW1lbnRMaWZlY3ljbGUsIEJlbGdlIEFrdGFyxLFtxLEgbGlzdGVzaW5kZWtpIGZpbHRyZWRlbiBnZWxpciB2ZSBzYWJpdHRpciAocm91dGVyIHN0YXRlIGhpw6dcbiAgICAgIC8vIHRhxZ/EsW5tYWTEsXlzYSAtIMO2ci4gZG/En3J1ZGFuIGJhxJ9sYW50xLF5bGEgZ2VsaW5tacWfc2UgLSB2YXJzYXnEsWxhbiBLYXnEsXRsxLEga2FidWwgZWRpbGlyKS5cbiAgICAgIC8vIHRhcmdldERvY3VtZW50TGlmZWN5Y2xlIGlzZSBrdWxsYW7EsWPEsW7EsW4gYnUgZWtyYW5kYSBzZcOnZWNlxJ9pLCBrYXluYWt0YW4gYmHEn8SxbXPEsXogYmlyIGRlxJ9lcmRpcjtcbiAgICAgIC8vIGJhxZ9sYW5nxLHDp3RhIHZhcnNhecSxbGFuIG9sYXJhayBLYXnEsXRsxLEgZ2VsaXIsIGt1bGxhbsSxY8SxIGlzdGVyc2UgVGFzbGFrJ2Egw6dldmlyaXIuXG4gICAgICB0aGlzLm5ld1N0YXRlID0ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgc291cmNlRG9jdW1lbnRMaWZlY3ljbGU6IHN0YXRlLnNvdXJjZURvY3VtZW50TGlmZWN5Y2xlID8/IFNhcERvY3VtZW50TGlmZWN5Y2xlLlBvc3RlZCxcbiAgICAgICAgdGFyZ2V0RG9jdW1lbnRMaWZlY3ljbGU6IFNhcERvY3VtZW50TGlmZWN5Y2xlLlBvc3RlZCxcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChpZCkge1xuICAgICAgdGhpcy5sb2FkV29ya2luZ0NvcHkoaWQpO1xuICAgIH1cbiAgfVxuXG4gIGNvbXBhbnlOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubmV3U3RhdGU/LnNvdXJjZUNvbXBhbnlOYW1lID8/IHRoaXMud29ya2luZ0NvcHk/LnNvdXJjZUNvbXBhbnlOYW1lID8/ICcnO1xuICB9XG5cbiAgc2NlbmFyaW9OYW1lKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLndvcmtpbmdDb3B5Py5zY2VuYXJpb0lkKSB7XG4gICAgICByZXR1cm4gdGhpcy5sb2NhbGl6YXRpb24uaW5zdGFudCgnRkJEb2N1bWVudEZsb3c6Ok5vU2NlbmFyaW9PcHRpb24nKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2NlbmFyaW9zLmZpbmQocyA9PiBzLmlkID09PSB0aGlzLndvcmtpbmdDb3B5Py5zY2VuYXJpb0lkKT8ubmFtZSA/PyB0aGlzLndvcmtpbmdDb3B5LnNjZW5hcmlvSWQ7XG4gIH1cblxuICAvLyBCaXIgc2VuYXJ5b251biBpbGsgYmFjYcSfxLEgYmVsaXJsaSBiaXIga2F5bmFrIMWfaXJrZXQgdmUgaGVkZWYgxZ9pcmtldCBpw6dpbiB0YW7EsW1sYW5txLHFn3TEsXIuIFNwZWMgwqczIC1cbiAgLy8ga2F5bmFrIGJlbGdlbmluIGlsayBoZWRlZmkgaGVyIHphbWFuIE9JTlYuQ2FyZENvZGUgKyBNdWhhdGFwIEXFn2xlxZ90aXJtZWxlcmkgaWxlIHRlc3BpdCBlZGlsaXI7IGhhesSxclxuICAvLyBzZW5hcnlvIGJ1IGhlZGVmaSBkZcSfacWfdGlyZW1lei4gQnUgecO8emRlbiBoZW0ga2F5bmFrIMWfaXJrZXRpIGhlbSBkZSB6YXRlbiB0ZXNwaXQgZWRpbG1pxZ8gaWxrIGhlZGVmaVxuICAvLyB1eXXFn21heWFuIHNlbmFyeW9sYXIgc2XDp2lsZWJpbGlyIGxpc3RlZGVuIMOnxLFrYXLEsWzEsXIgLSBha3NpIGhhbGRlIGJhY2tlbmRcbiAgLy8gU2NlbmFyaW9Tb3VyY2VDb21wYW55TWlzbWF0Y2gvU2NlbmFyaW9GaXJzdFRhcmdldE1pc21hdGNoIGhhdGFzxLEgdmVyaXIuXG4gIGF2YWlsYWJsZVNjZW5hcmlvcygpOiBEb2N1bWVudFNjZW5hcmlvRHRvW10ge1xuICAgIGNvbnN0IHNvdXJjZUNvbXBhbnlJZCA9IHRoaXMubmV3U3RhdGU/LnNvdXJjZUNvbXBhbnlJZCA/PyB0aGlzLndvcmtpbmdDb3B5Py5zb3VyY2VDb21wYW55SWQ7XG4gICAgY29uc3QgcmVzb2x2ZWRUYXJnZXRDb21wYW55SWQgPSB0aGlzLm5ld1N0YXRlPy50YXJnZXRDb21wYW55SWQgPz8gdGhpcy53b3JraW5nQ29weT8ubGVncz8uWzBdPy50YXJnZXRDb21wYW55SWQ7XG4gICAgaWYgKCFzb3VyY2VDb21wYW55SWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjZW5hcmlvcztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zY2VuYXJpb3MuZmlsdGVyKHMgPT4ge1xuICAgICAgY29uc3QgZmlyc3RMZWcgPSBbLi4ucy5sZWdzXS5zb3J0KChhLCBiKSA9PiBhLnNlcXVlbmNlTm8gLSBiLnNlcXVlbmNlTm8pWzBdO1xuICAgICAgaWYgKCFmaXJzdExlZykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChmaXJzdExlZy5zb3VyY2VDb21wYW55SWQgIT09IHNvdXJjZUNvbXBhbnlJZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gIXJlc29sdmVkVGFyZ2V0Q29tcGFueUlkIHx8IGZpcnN0TGVnLnRhcmdldENvbXBhbnlJZCA9PT0gcmVzb2x2ZWRUYXJnZXRDb21wYW55SWQ7XG4gICAgfSk7XG4gIH1cblxuICBpc0RyYWZ0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzTmV3IHx8ICh0aGlzLndvcmtpbmdDb3B5Py5zdGF0dXMgPz8gRE9DVU1FTlRfVFJBTlNGRVJfU1RBVFVTX0RSQUZUKSA9PT0gRE9DVU1FTlRfVFJBTlNGRVJfU1RBVFVTX0RSQUZUO1xuICB9XG5cbiAgLy8gQmVrbGV5ZW4gYmFjYWtsYXIgaWxrIGtleiDDp2FsxLHFn3TEsXLEsWxhYmlsaXI7IGhhdGFsxLEgYmFjYWtsYXIgZGEgdGVrcmFyIGRlbmVuZWJpbGlyIMOnw7xua8O8IGJ1IG5va3RhZGFcbiAgLy8gaGVuw7x6IGhpw6diaXIgU0FQIGJlbGdlc2kgb2x1xZ9tYW3EscWfdMSxciAoYWtzaSBoYWxkZSBzcGVjIMKnMTMgZ2VyZcSfaSB0w7xtIHppbmNpciBpcHRhbCBlZGlsaXAgeWVuaWRlblxuICAvLyBrdXJ1bG1hbMSxZMSxciwgdGVrIGJhY2FrIHRla3JhcsSxIGRlxJ9pbCkuXG4gIC8vIFNwZWMgwqcxMi0xMyAtIGlwdGFsIGVkaWxtacWfICh2ZXlhIHRhbWFtbGFubcSxxZ8pIGJpciB6aW5jaXIgdGVrcmFyIMOnYWzEscWfdMSxcsSxbG1hejsga3VsbGFuxLFjxLEgeWVuaWRlblxuICAvLyBvbHXFn3R1cm1hIHPDvHJlY2luaSAoa2F5bmFrIGZhdHVyYWRhbiB5ZW5pIGJpciBha3RhcsSxbSBiYcWfbGF0YXJhaywgeWVuaSBiaXIgSW50ZXJjb21wYW55IElkIGlsZSlcbiAgLy8gYmHFn2xhdMSxci4gQmVrbGV5ZW4vSGF0YWzEsSBiaXIgYmFjYWsga2FsbcSxxZ8gb2xzYSBiaWxlICh6aW5jaXIgaGVuw7x6IHTDvG0gYmFjYWtsYXLEsSDDp2FsxLHFn3TEsXJtYWRhbiBpcHRhbFxuICAvLyBlZGlsZGl5c2UpIGJ1IGJhY2FrbGFyIGFydMSxayDDp2FsxLHFn3TEsXLEsWxhbWF6IC0gYmFja2VuZCBkYSBidW51IFRyYW5zZmVyTm90RWRpdGFibGUgaWxlIHJlZGRlZGVyLFxuICAvLyBidXJhZGEgYnV0b24gZW4gYmHFn3RhbiBkZXZyZSBkxLHFn8SxIGLEsXJha8SxbGFyYWsga3VsbGFuxLFjxLF5YSBuZXQgYmlyIHNpbnlhbCB2ZXJpbGlyLlxuICBjYW5FeGVjdXRlTGVnKGxlZzogRG9jdW1lbnRUcmFuc2ZlckxlZ0R0byk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHRyYW5zZmVyU3RhdHVzID0gdGhpcy53b3JraW5nQ29weT8uc3RhdHVzO1xuICAgIGlmICh0cmFuc2ZlclN0YXR1cyA9PT0gRE9DVU1FTlRfVFJBTlNGRVJfU1RBVFVTX0NBTkNFTExFRCB8fCB0cmFuc2ZlclN0YXR1cyA9PT0gRE9DVU1FTlRfVFJBTlNGRVJfU1RBVFVTX0NPTVBMRVRFRCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc0NvbnN0cnVjdGlvbkRyYWZ0U2VsZWN0YWJsZShsZWcpICYmIGxlZy5zZWxlY3RlZENvbnN0cnVjdGlvbkRyYWZ0RG9jVHlwZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBsZWcuc3RhdHVzID09PSBET0NVTUVOVF9UUkFOU0ZFUl9MRUdfU1RBVFVTX1BFTkRJTkcgfHwgbGVnLnN0YXR1cyA9PT0gRE9DVU1FTlRfVFJBTlNGRVJfTEVHX1NUQVRVU19GQUlMRUQ7XG4gIH1cblxuICAvLyBTcGVjIGVrIGthcmFyICgxOC4wOS4yMDI2KSAtIGhlZGVmIFRhc2xhayBpa2VuIENvbnN0cnVjdGlvbiBiYWNhxJ/EsW7EsW4gT1BPUuKGkk9QRE7ihpJPUENIIHRhYmFuIGJlbGdlXG4gIC8vIHppbmNpcmkgdGFzbGFrbGFyIGFyYXPEsW5kYSDDp2FsxLHFn21hejsgYnUgYmFjYWtsYXJkYSBrdWxsYW7EsWPEsSB6aW5jaXIgeWVyaW5lIFRFSyBiaXIgYmVsZ2UgdGlwaSBzZcOnZXJcbiAgLy8gKGJrei4gRXhlY3V0ZVNpbmdsZURyYWZ0RG9jdW1lbnRBc3luYywgYmFja2VuZCkuIEhlZGVmIEthecSxdGzEsSBpa2VuIChub3JtYWwgemluY2lyKSBidSBnZcOnZXJsaSBkZcSfaWxkaXIuXG4gIGlzQ29uc3RydWN0aW9uRHJhZnRTZWxlY3RhYmxlKGxlZzogRG9jdW1lbnRUcmFuc2ZlckxlZ0R0byk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBsZWcubGVnQmVoYXZpb3IgPT09IExlZ0JlaGF2aW9yLkNvbnN0cnVjdGlvbkNoYWluICYmIHRoaXMud29ya2luZ0NvcHk/LnRhcmdldERvY3VtZW50TGlmZWN5Y2xlID09PSBTYXBEb2N1bWVudExpZmVjeWNsZS5EcmFmdDtcbiAgfVxuXG4gIGhhc01pc3NpbmdDb25zdHJ1Y3Rpb25EcmFmdFNlbGVjdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHRoaXMud29ya2luZ0NvcHk/LmxlZ3MgPz8gW10pLnNvbWUobCA9PiB0aGlzLmlzQ29uc3RydWN0aW9uRHJhZnRTZWxlY3RhYmxlKGwpICYmIGwuc2VsZWN0ZWRDb25zdHJ1Y3Rpb25EcmFmdERvY1R5cGUgPT0gbnVsbCk7XG4gIH1cblxuICB1cGRhdGVMZWdDb25zdHJ1Y3Rpb25EcmFmdERvY1R5cGUobGVnOiBEb2N1bWVudFRyYW5zZmVyTGVnRHRvLCB2YWx1ZTogQ29uc3RydWN0aW9uRHJhZnREb2N1bWVudFR5cGUgfCBudWxsKSB7XG4gICAgaWYgKCF0aGlzLndvcmtpbmdDb3B5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGVnLnNlbGVjdGVkQ29uc3RydWN0aW9uRHJhZnREb2NUeXBlID0gdmFsdWUgPz8gdW5kZWZpbmVkO1xuICAgIHRoaXMucGVyc2lzdExlZ0NoYW5nZXMoKTtcbiAgfVxuXG4gIGxlZ1RhcmdldERvY0xhYmVsKGxlZzogRG9jdW1lbnRUcmFuc2ZlckxlZ0R0byk6IHN0cmluZyB7XG4gICAgY29uc3QgaXNMYXN0TGVnID0gbGVnLnNlcXVlbmNlTm8gPj0gKHRoaXMud29ya2luZ0NvcHk/LmxlZ3MubGVuZ3RoID8/IDApO1xuICAgIGlmIChsZWcubGVnQmVoYXZpb3IgPT09IExlZ0JlaGF2aW9yLkNvbnN0cnVjdGlvbkNoYWluKSB7XG4gICAgICBpZiAodGhpcy5pc0NvbnN0cnVjdGlvbkRyYWZ0U2VsZWN0YWJsZShsZWcpKSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkTGFiZWwgPVxuICAgICAgICAgIHRoaXMuY29uc3RydWN0aW9uRHJhZnREb2NUeXBlT3B0aW9ucy5maW5kKG8gPT4gby52YWx1ZSA9PT0gbGVnLnNlbGVjdGVkQ29uc3RydWN0aW9uRHJhZnREb2NUeXBlKT8ubGFiZWwgPz9cbiAgICAgICAgICB0aGlzLmxvY2FsaXphdGlvbi5pbnN0YW50KCdGQkRvY3VtZW50Rmxvdzo6Tm90U2VsZWN0ZWQnKTtcbiAgICAgICAgcmV0dXJuIGlzTGFzdExlZyA/IHNlbGVjdGVkTGFiZWwgOiBgJHtzZWxlY3RlZExhYmVsfSDihpIgT0lOVmA7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXNMYXN0TGVnID8gJ09QT1Ig4oaSIE9QRE4g4oaSIE9QQ0gnIDogJ09QT1Ig4oaSIE9QRE4g4oaSIE9QQ0gg4oaSIE9JTlYnO1xuICAgIH1cbiAgICByZXR1cm4gaXNMYXN0TGVnID8gJ09QQ0gnIDogJ09QQ0gg4oaSIE9JTlYnO1xuICB9XG5cbiAgLy8gU3BlYyDCpzkgLSBhcnTEsXLEsW0geWFsbsSxemNhIEludGVybWVkaWF0ZUNoYWluJ2RlIGRlxJ9pbCwgQ29uc3RydWN0aW9uQ2hhaW4gYmFjYcSfxLFuxLFuIChzb25yYWtpIGJhY2FrXG4gIC8vIHZhcnNhKSBvbHXFn3R1cmR1xJ91IGRldmFtIE3DvMWfdGVyaSBGYXR1cmFzxLFuZGEgZGEgdXlndWxhbsSxciAtIMO2bmNlZGVuIHlhbG7EsXpjYSBJbnRlcm1lZGlhdGVDaGFpblxuICAvLyBrb250cm9sIGVkaWxpeW9yZHUsIGJ1IGRhIGJpciBDb25zdHJ1Y3Rpb24gYmFjYcSfxLFuxLFuIGhlZGVmaW5kZSBhcnTEsXLEsW0gb3JhbsSxIHRhbsSxbXPEsXprZW4ga3VsbGFuxLFjxLFuxLFuXG4gIC8vIGhpw6cgdXlhcsSxbG1hZGFuIHNlc3NpemNlIGFydMSxcsSxbXPEsXogZGV2YW0gZWRpbG1lc2luZSB5b2wgYcOnxLF5b3JkdSAoa29kIGluY2VsZW1lc2l5bGUgdGVzcGl0IGVkaWxkaSkuXG4gIGhhc01pc3NpbmdJbmNyZWFzZVJhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLndvcmtpbmdDb3B5Py5sZWdzID8/IFtdKS5zb21lKFxuICAgICAgbCA9PlxuICAgICAgICAobC5sZWdCZWhhdmlvciA9PT0gTGVnQmVoYXZpb3IuSW50ZXJtZWRpYXRlQ2hhaW4gfHwgbC5sZWdCZWhhdmlvciA9PT0gTGVnQmVoYXZpb3IuQ29uc3RydWN0aW9uQ2hhaW4pICYmXG4gICAgICAgIGwucGxhbm5lZEluY3JlYXNlUmF0ZSA9PSBudWxsXG4gICAgKTtcbiAgfVxuXG4gIC8vIE51bUF0Q2FyZCBnaXJpxZ9pIHlhbG7EsXpjYSBhcmEgxZ9pcmtldCBiYWNha2xhcsSxbmRhbiwgemluY2lyaW4gU09OIGJhY2HEn8SxIE9MTUFZQU5MQVIgacOnaW4gYW5sYW1sxLFkxLFyXG4gIC8vIChvIGJhY2FrdGEgYXluxLEgxZ9pcmtldHRlIHllbmkgYmlyIE3DvMWfdGVyaSBGYXR1cmFzxLEgb2x1xZ91eW9yIHZlIE51bUF0Q2FyZCfEsSBrdWxsYW7EsWPEsSBiZWxpcmxlcikuXG4gIGhhc0ludGVybWVkaWF0ZU51bUF0Q2FyZExlZ3MoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgbGVncyA9IHRoaXMud29ya2luZ0NvcHk/LmxlZ3MgPz8gW107XG4gICAgcmV0dXJuIGxlZ3Muc29tZShsID0+IGwubGVnQmVoYXZpb3IgPT09IExlZ0JlaGF2aW9yLkludGVybWVkaWF0ZUNoYWluICYmIGwuc2VxdWVuY2VObyA8IGxlZ3MubGVuZ3RoKTtcbiAgfVxuXG4gIC8vIFNwZWMgwqc0IC0ga3VsbGFuxLFjxLEgw6dhbMSxxZ9tYSBrb3B5YXPEsW5kYWtpIGJhY2FrbGFyxLFuIGhlZGVmIMWfaXJrZXRpbmkvZGF2cmFuxLHFn8SxbsSxIChBcmEgxZ5pcmtldCB2ZXlhXG4gIC8vIENvbnN0cnVjdGlvbikgZGXEn2nFn3RpcmViaWxtZWxpOyBidSBkZcSfacWfaWtsaWsgeWFsbsSxemNhIGJ1IGFrdGFyxLFtxLFuIMOnYWzEscWfbWEga29weWFzxLFuxLEgZXRraWxlciwgYW5hXG4gIC8vIEhhesSxciBTZW5hcnlvIHRhbsSxbcSxbsSxICh2YXJzYSkgaGnDpyBkZcSfacWfdGlybWV6LiBLYXluYWsgxZ9pcmtldCBheXLEsWNhIGTDvHplbmxlbm1lejogemluY2lyZGVraSBoZXJcbiAgLy8gYmFjYcSfxLFuIGtheW5hxJ/EsSwgYmlyIMO2bmNla2kgYmFjYcSfxLFuIGhlZGVmaW5kZW4gKHZleWEgaWxrIGJhY2Frc2EgYWt0YXLEsW3EsW4ga2VuZGkga2F5bmHEn8SxbmRhbikgYmFja2VuZFxuICAvLyB0YXJhZsSxbmRhbiBvdG9tYXRpayB0w7xyZXRpbGlyIChia3ouIERvY3VtZW50VHJhbnNmZXJBcHBTZXJ2aWNlLkFkZExlZ0FzeW5jKS5cbiAgdXBkYXRlTGVnVGFyZ2V0KGxlZzogRG9jdW1lbnRUcmFuc2ZlckxlZ0R0bywgdGFyZ2V0Q29tcGFueUlkOiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMud29ya2luZ0NvcHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZWcudGFyZ2V0Q29tcGFueUlkID0gdGFyZ2V0Q29tcGFueUlkO1xuICAgIGxlZy50YXJnZXRDb21wYW55TmFtZSA9IHRoaXMuY29tcGFuaWVzLmZpbmQoYyA9PiBjLmlkID09PSB0YXJnZXRDb21wYW55SWQpPy5jb21wYW55TmFtZTtcbiAgICB0aGlzLnBlcnNpc3RMZWdDaGFuZ2VzKCk7XG4gIH1cblxuICB1cGRhdGVMZWdCZWhhdmlvcihsZWc6IERvY3VtZW50VHJhbnNmZXJMZWdEdG8sIGxlZ0JlaGF2aW9yOiBMZWdCZWhhdmlvcikge1xuICAgIGlmICghdGhpcy53b3JraW5nQ29weSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxlZy5sZWdCZWhhdmlvciA9IGxlZ0JlaGF2aW9yO1xuICAgIHRoaXMucGVyc2lzdExlZ0NoYW5nZXMoKTtcbiAgfVxuXG4gIC8vIEhlZGVmL0RhdnJhbsSxxZ8gZHJvcGRvd24nxLEgZGXEn2nFn3RpxJ9pbmRlIHlhbG7EsXpjYSBPIGJhY2HEn8SxIGtheWRlZGlwIHN1bnVjdWRhbiBkw7ZuZW4gdGFtIHdvcmtpbmdDb3B5J3lpXG4gIC8vIG9sZHXEn3UgZ2liaSBla3JhbmEgeWFuc8SxdMSxcnNhaywga3VsbGFuxLFjxLFuxLFuIEJBxZ5LQSBiaXIgYmFjYcSfYSBoZW7DvHogeWF6ZMSxxJ/EsSBhbWEgaGVuw7x6IHNlbmtyb25pemVcbiAgLy8gZWRpbG1lbWnFnyBOdW1BdENhcmQvRMO2dml6L0t1ciBkZcSfZXJsZXJpIChidW5sYXIgeWFsbsSxemNhIFwiw4dhbMSxxZ90xLFyXCIvXCJCYcWfbGF0XCIgw7ZuY2VzaSB0b3BsdSBnw7ZuZGVyaWxpcilcbiAgLy8gc3VudWN1ZGFraSBlc2tpIGRlxJ9lcmxlIGdlcmkgZ2VsZW4gbyBiYWNhayBuZXNuZXNpIHRhcmFmxLFuZGFuIHNlc3NpemNlIGV6aWxpci9ib8WfYWzEsXIgLSBnZXLDp2VrXG4gIC8vIG9ydGFtZGEgZG/En3J1bGFuZMSxLiBCdSB5w7x6ZGVuIGRyb3Bkb3duIGRlxJ9pxZ9pa2xpxJ9pbmRlIGRlIFTDnE0gYmFjYWtsYXJkYWtpIG1ldmN1dCBkZcSfZXJsZXJcbiAgLy8gKHN5bmNQZW5kaW5nTGVnQ2hhbmdlcyBpbGUsIHPEsXJhbMSxL2NvbmN1cnJlbmN5LXNhZmUpIGJpcmxpa3RlIGfDtm5kZXJpbGlyLlxuICBwcml2YXRlIHBlcnNpc3RMZWdDaGFuZ2VzKCkge1xuICAgIGlmICghdGhpcy53b3JraW5nQ29weSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXNNdXRhdGluZ0xlZ3MgPSB0cnVlO1xuICAgIHRoaXMuc3luY1BlbmRpbmdMZWdDaGFuZ2VzKHRoaXMud29ya2luZ0NvcHkubGVncylcbiAgICAgIC5waXBlKGZpbmFsaXplKCgpID0+ICh0aGlzLmlzTXV0YXRpbmdMZWdzID0gZmFsc2UpKSlcbiAgICAgIC5zdWJzY3JpYmUocmVzdWx0cyA9PiB7XG4gICAgICAgIGNvbnN0IGxhc3QgPSByZXN1bHRzPy5bcmVzdWx0cy5sZW5ndGggLSAxXTtcbiAgICAgICAgaWYgKGxhc3QpIHtcbiAgICAgICAgICB0aGlzLndvcmtpbmdDb3B5ID0gbGFzdDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICAvLyBaaW5jaXJlIHllbmkgYmlyIGJhY2FrIGVrbGVyOiBrYXluYcSfxLEgb3RvbWF0aWsgb2xhcmFrIHNvbiBiYWNhxJ/EsW4gaGVkZWZpbmRlbiAoaWxrIGJhY2Frc2EgYWt0YXLEsW3EsW5cbiAgLy8ga2VuZGkga2F5bmFrIMWfaXJrZXRpbmRlbikgdMO8cmV0aWxpci4gVmFyc2F5xLFsYW4gaGVkZWYsIGhlbsO8eiB6aW5jaXJkZSBvbG1heWFuIGlsayDFn2lya2V0dGlyOyBrdWxsYW7EsWPEsVxuICAvLyBla2xlZGlrdGVuIHNvbnJhIGRyb3Bkb3duJ2xhcmRhbiBoZWRlZmkvZGF2cmFuxLHFn8SxIGRlxJ9pxZ90aXJlYmlsaXIuXG4gIGFkZExlZygpIHtcbiAgICBpZiAoIXRoaXMud29ya2luZ0NvcHkgfHwgdGhpcy5jb21wYW5pZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gWWVuaSBiYWNhxJ/EsW4ga2F5bmHEn8SxIGJhY2tlbmQnZGUgb3RvbWF0aWsgb2xhcmFrIHNvbiBiYWNhxJ/EsW4gaGVkZWZpbmRlbiB0w7xyZXRpbGlyIChia3ouXG4gICAgLy8gRG9jdW1lbnRUcmFuc2ZlckFwcFNlcnZpY2UuQWRkTGVnQXN5bmMpLiBWYXJzYXnEsWxhbiBIRURFRiBzZcOnaWxpcmtlbiBidSBrYXluYWtsYSBBWU5JIMWfaXJrZXQgYXNsYVxuICAgIC8vIMO2bmVyaWxtZW1lbGlkaXIgLSBha3NpIGhhbGRlIGJpciDFn2lya2V0aW4ga2VuZGkga2VuZGluZSBmYXR1cmEga2VzdGnEn2kgYW5sYW1zxLF6IGJpciBiYWNhayBvbHXFn3VyLlxuICAgIC8vIMOWbmNlZGVuIMWfaXJrZXQgaGF2dXp1IHTDvGtlbmRpxJ9pbmRlICh0w7xtIMWfaXJrZXRsZXIgemF0ZW4gYmlyIGJhY2FrdGEgaGVkZWYgb2xhcmFrIGt1bGxhbsSxbG3EscWfc2EpXG4gICAgLy8gZmFsbGJhY2sgZG/En3J1ZGFuIGNvbXBhbmllc1swXSdhIGTDvMWfw7x5b3JkdTsgYnUgdGVzYWTDvGZlbiBrYXluYWtsYSBheW7EsSDFn2lya2V0ZSBkZW5rIGdlbGlwIHNlbGYtbG9vcFxuICAgIC8vIChLYXluYWs9SGVkZWYpIGJhY2FrIG9sdcWfdHVyYWJpbGl5b3JkdSAoa3VsbGFuxLFjxLEgZ2VyaSBiaWxkaXJpbWl5bGUgdGVzcGl0IGVkaWxkaSkuXG4gICAgY29uc3QgbGFzdExlZyA9IFsuLi50aGlzLndvcmtpbmdDb3B5LmxlZ3NdLnNvcnQoKGEsIGIpID0+IGEuc2VxdWVuY2VObyAtIGIuc2VxdWVuY2VObykuc2xpY2UoLTEpWzBdO1xuICAgIGNvbnN0IG5ld0xlZ1NvdXJjZUNvbXBhbnlJZCA9IGxhc3RMZWc/LnRhcmdldENvbXBhbnlJZCA/PyB0aGlzLndvcmtpbmdDb3B5LnNvdXJjZUNvbXBhbnlJZDtcblxuICAgIGNvbnN0IHVzZWRDb21wYW55SWRzID0gbmV3IFNldCh0aGlzLndvcmtpbmdDb3B5LmxlZ3MubWFwKGwgPT4gbC50YXJnZXRDb21wYW55SWQpKTtcbiAgICBjb25zdCBkZWZhdWx0VGFyZ2V0ID1cbiAgICAgIHRoaXMuY29tcGFuaWVzLmZpbmQoYyA9PiAhdXNlZENvbXBhbnlJZHMuaGFzKGMuaWQpICYmIGMuaWQgIT09IG5ld0xlZ1NvdXJjZUNvbXBhbnlJZCkgPz9cbiAgICAgIHRoaXMuY29tcGFuaWVzLmZpbmQoYyA9PiBjLmlkICE9PSBuZXdMZWdTb3VyY2VDb21wYW55SWQpID8/XG4gICAgICB0aGlzLmNvbXBhbmllc1swXTtcblxuICAgIC8vIMOWbmNlIG1ldmN1dCBiYWNha2xhcmRha2kgaGVuw7x6IHNlbmtyb25pemUgZWRpbG1lbWnFnyBOdW1BdENhcmQvRMO2dml6L0t1ciBkZcSfZXJsZXJpIGtheWRlZGlsaXIgLVxuICAgIC8vIGFrc2kgaGFsZGUgeWVuaSBiYWNhayBla2xlbmRpxJ9pbmRlIGTDtm5lbiB0YW0gd29ya2luZ0NvcHksIGt1bGxhbsSxY8SxbsSxbiBheiDDtm5jZSB5YXpkxLHEn8SxIGFtYSBoacOnXG4gICAgLy8gc3VudWN1eWEgZ8O2bmRlcmlsbWVtacWfIGRlxJ9lcmxlcmkgZXNraS9ib8WfIERCIGRlxJ9lcml5bGUgZXplcmRpIChwZXJzaXN0TGVnQ2hhbmdlcyBpbGUgYXluxLEgc29ydW4pLlxuICAgIHRoaXMuaXNNdXRhdGluZ0xlZ3MgPSB0cnVlO1xuICAgIHRoaXMuc3luY1BlbmRpbmdMZWdDaGFuZ2VzKHRoaXMud29ya2luZ0NvcHkubGVncylcbiAgICAgIC5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT5cbiAgICAgICAgICB0aGlzLnNlcnZpY2UuYWRkTGVnKHRoaXMud29ya2luZ0NvcHkhLmlkLCB7XG4gICAgICAgICAgICB0YXJnZXRDb21wYW55SWQ6IGRlZmF1bHRUYXJnZXQuaWQsXG4gICAgICAgICAgICBsZWdCZWhhdmlvcjogTGVnQmVoYXZpb3IuSW50ZXJtZWRpYXRlQ2hhaW4sXG4gICAgICAgICAgfSlcbiAgICAgICAgKSxcbiAgICAgICAgZmluYWxpemUoKCkgPT4gKHRoaXMuaXNNdXRhdGluZ0xlZ3MgPSBmYWxzZSkpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKHJlc3VsdCA9PiAodGhpcy53b3JraW5nQ29weSA9IHJlc3VsdCkpO1xuICB9XG5cbiAgLy8gU3BlYyDCpzUgLSBtdWhhdGFwIGXFn2xlxZ90aXJtZXNpIGJ1bHVuYW1heWFuIGJhY2FrdGEga3VsbGFuxLFjxLFkYW4gaGVkZWYgU0FQIMWfaXJrZXRpbmRla2kgZG/En3J1XG4gIC8vIE3DvMWfdGVyaS9TYXTEsWPEsSBDYXJkQ29kZSBzZcOnaW1pIGlzdGVuZWNla3RpcjsgYnUsIE11aGF0YXAgRcWfbGXFn3Rpcm1lbGVyaSBla3JhbsSxbmEgecO2bmxlbmRpcmlsZXJla1xuICAvLyB5YXB0xLFyxLFsYWJpbGlyIChzcGVjIHRhcmFmxLFuZGFuIGHDp8Sxa8OnYSBpemluIHZlcmlsZW4gYXJhecO8eiBzZcOnZW5la2xlcmluZGVuIGJpcmkpLiBcIkJ1bHVudWxhbiDFnmlya2V0XCJcbiAgLy8gYnVyYWRhIGhlZGVmIChPUENIJ25pbiBvbHXFn2FjYcSfxLEpIMWfaXJrZXR0aXIsIFwixLBsacWfa2lsaSDFnmlya2V0XCIgaXNlIGtheW5hayDFn2lya2V0dGlyIC0gYmt6LlxuICAvLyBSZXNvbHZlVmVuZG9yQ2FyZENvZGVBc3luYyhpbkNvbXBhbnlJZDogaGVkZWYsIGZvclJlbGF0ZWRDb21wYW55SWQ6IGtheW5haykuXG4gIGdvVG9QYXJ0bmVyTWFwcGluZyhsZWc6IERvY3VtZW50VHJhbnNmZXJMZWdEdG8pIHtcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9mYmRvY3VtZW50Zmxvdy9wYXJ0bmVyLW1hcHBpbmdzJ10sIHtcbiAgICAgIHN0YXRlOiB7IHNvdXJjZUNvbXBhbnlJZDogbGVnLnRhcmdldENvbXBhbnlJZCwgcmVsYXRlZENvbXBhbnlJZDogbGVnLnNvdXJjZUNvbXBhbnlJZCB9LFxuICAgIH0pO1xuICB9XG5cbiAgcmVtb3ZlTGVnKGxlZzogRG9jdW1lbnRUcmFuc2ZlckxlZ0R0bykge1xuICAgIGlmICghdGhpcy53b3JraW5nQ29weSB8fCB0aGlzLndvcmtpbmdDb3B5LmxlZ3MubGVuZ3RoIDw9IDEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBeW7EsSBuZWRlbmxlIChia3ouIGFkZExlZykgc2lsaW5tZXllbiBkacSfZXIgYmFjYWtsYXJkYWtpIHNlbmtyb25pemUgZWRpbG1lbWnFnyBkZcSfZXJsZXIgw7ZuY2Uga2F5ZGVkaWxpci5cbiAgICBjb25zdCByZW1haW5pbmdMZWdzID0gdGhpcy53b3JraW5nQ29weS5sZWdzLmZpbHRlcihsID0+IGwuaWQgIT09IGxlZy5pZCk7XG4gICAgdGhpcy5pc011dGF0aW5nTGVncyA9IHRydWU7XG4gICAgdGhpcy5zeW5jUGVuZGluZ0xlZ0NoYW5nZXMocmVtYWluaW5nTGVncylcbiAgICAgIC5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5zZXJ2aWNlLnJlbW92ZUxlZyh0aGlzLndvcmtpbmdDb3B5IS5pZCwgbGVnLmlkKSksXG4gICAgICAgIGZpbmFsaXplKCgpID0+ICh0aGlzLmlzTXV0YXRpbmdMZWdzID0gZmFsc2UpKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZShyZXN1bHQgPT4gKHRoaXMud29ya2luZ0NvcHkgPSByZXN1bHQpKTtcbiAgfVxuXG4gIC8vIFllbmkgYmlyIGFrdGFyxLFtIGnDp2luIMOnYWzEscWfbWEga29weWFzxLFuxLEgaWxrIGtleiBvbHXFn3R1cnVyLiBaYXRlbiBvbHXFn3R1cnVsbXXFnyBhbWEgaGVuw7x6XG4gIC8vIMOnYWzEscWfdMSxcsSxbG1hbcSxxZ8gKHRhc2xhaykgYmlyIGFrdGFyxLFtZGEgc2VuYXJ5byBkZcSfacWfdGlybWVrIGnDp2luIGFwcGx5U2NlbmFyaW8oKSBrdWxsYW7EsWzEsXIgLVxuICAvLyDDtnJuLiBcIsSwxZ9sZW0gR2XDp21pxZ9pXCJuZGVuIGdlcmkgZMO2bsO8bGVuIGJpciB0YXNsYWsga2F5xLF0dGEuXG4gIGZldGNoU2NlbmFyaW8oKSB7XG4gICAgaWYgKCF0aGlzLm5ld1N0YXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5pc0ZldGNoaW5nU2NlbmFyaW8gPSB0cnVlO1xuICAgIHRoaXMuc2VydmljZVxuICAgICAgLmNyZWF0ZSh7XG4gICAgICAgIHNvdXJjZUNvbXBhbnlJZDogdGhpcy5uZXdTdGF0ZS5zb3VyY2VDb21wYW55SWQsXG4gICAgICAgIHNvdXJjZU9pbnZEb2NFbnRyeTogdGhpcy5uZXdTdGF0ZS5kb2NFbnRyeSxcbiAgICAgICAgc2NlbmFyaW9JZDogdGhpcy5zY2VuYXJpb0lkIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgc291cmNlRG9jdW1lbnRMaWZlY3ljbGU6IHRoaXMubmV3U3RhdGUuc291cmNlRG9jdW1lbnRMaWZlY3ljbGUsXG4gICAgICAgIHRhcmdldERvY3VtZW50TGlmZWN5Y2xlOiB0aGlzLm5ld1N0YXRlLnRhcmdldERvY3VtZW50TGlmZWN5Y2xlLFxuICAgICAgfSlcbiAgICAgIC5waXBlKGZpbmFsaXplKCgpID0+ICh0aGlzLmlzRmV0Y2hpbmdTY2VuYXJpbyA9IGZhbHNlKSkpXG4gICAgICAuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG4gICAgICAgIHRoaXMud29ya2luZ0NvcHkgPSByZXN1bHQ7XG4gICAgICAgIHRoaXMuaXNOZXcgPSBmYWxzZTtcbiAgICAgICAgLy8gVVJMJ2kgb2x1xZ9hbiBrYXlkYSBnw7ZyZSBkZcSfacWfdGlyIC0gc2F5ZmEgeWVuaWxlbmlyc2UgdmV5YSBnZXJpL2lsZXJpIGdpZGlsaXJzZSBkb8SfcnUga2F5xLF0IHnDvGtsZW5zaW4uXG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2ZiZG9jdW1lbnRmbG93L2RvY3VtZW50LXRyYW5zZmVycycsIHJlc3VsdC5pZF0sIHsgcmVwbGFjZVVybDogdHJ1ZSB9KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgYXBwbHlTY2VuYXJpbygpIHtcbiAgICBpZiAoIXRoaXMud29ya2luZ0NvcHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmlzRmV0Y2hpbmdTY2VuYXJpbyA9IHRydWU7XG4gICAgdGhpcy5zZXJ2aWNlXG4gICAgICAuYXBwbHlTY2VuYXJpbyh0aGlzLndvcmtpbmdDb3B5LmlkLCB7IHNjZW5hcmlvSWQ6IHRoaXMuc2NlbmFyaW9JZCB8fCB1bmRlZmluZWQgfSlcbiAgICAgIC5waXBlKGZpbmFsaXplKCgpID0+ICh0aGlzLmlzRmV0Y2hpbmdTY2VuYXJpbyA9IGZhbHNlKSkpXG4gICAgICAuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG4gICAgICAgIHRoaXMud29ya2luZ0NvcHkgPSByZXN1bHQ7XG4gICAgICAgIHRoaXMuc2NlbmFyaW9JZCA9IHJlc3VsdC5zY2VuYXJpb0lkID8/ICcnO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGxvYWRXb3JraW5nQ29weShpZDogc3RyaW5nKSB7XG4gICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuICAgIHRoaXMuc2VydmljZVxuICAgICAgLmdldChpZClcbiAgICAgIC5waXBlKGZpbmFsaXplKCgpID0+ICh0aGlzLmlzTG9hZGluZyA9IGZhbHNlKSkpXG4gICAgICAuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG4gICAgICAgIHRoaXMud29ya2luZ0NvcHkgPSByZXN1bHQ7XG4gICAgICAgIHRoaXMuc2NlbmFyaW9JZCA9IHJlc3VsdC5zY2VuYXJpb0lkID8/ICcnO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkTGVnVXBkYXRlSW5wdXQobGVnOiBEb2N1bWVudFRyYW5zZmVyTGVnRHRvKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRhcmdldENvbXBhbnlJZDogbGVnLnRhcmdldENvbXBhbnlJZCxcbiAgICAgIGxlZ0JlaGF2aW9yOiBsZWcubGVnQmVoYXZpb3IsXG4gICAgICBudW1BdENhcmQ6IGxlZy5udW1BdENhcmQsXG4gICAgICBjdXJyZW5jeTogbGVnLmN1cnJlbmN5LFxuICAgICAgZXhjaGFuZ2VSYXRlOiBsZWcuZXhjaGFuZ2VSYXRlLFxuICAgICAgZnJlaWdodEFtb3VudDogbGVnLmZyZWlnaHRBbW91bnQsXG4gICAgICBzZWxlY3RlZENvbnN0cnVjdGlvbkRyYWZ0RG9jVHlwZTogbGVnLnNlbGVjdGVkQ29uc3RydWN0aW9uRHJhZnREb2NUeXBlLFxuICAgIH07XG4gIH1cblxuICAvLyBOdW1BdENhcmQvRMO2dml6L0t1ciBhbGFubGFyxLEga3VsbGFuxLFjxLEgeWF6YXJrZW4vYWxhbsSxIHRlcmsgZWRlcmtlbiBheXLEsSBiaXIgXCJrYXlkZXRcIiBpc3RlxJ9pXG4gIC8vIGfDtm5kZXJtaXlvciAoYnUsIGFydCBhcmRhIGjEsXpsxLEgaXN0ZWtsZXJpbiBDb25jdXJyZW5jeVN0YW1wIHlhcsSxxZ8gZHVydW11bmEgLSBBYnBEYkNvbmN1cnJlbmN5RXhjZXB0aW9uLFxuICAvLyBcInZlcmkgYmHFn2thIGJpciBrdWxsYW7EsWPEsSB0YXJhZsSxbmRhbiBkZcSfacWfdGlyaWxtacWfXCIgLSB5b2wgYcOndMSxxJ/EsSBnZXLDp2VrIG9ydGFtZGEgZ8O2emxlbWxlbmRpKS4gQnVudW5cbiAgLy8geWVyaW5lIGVrcmFuZGFraSBkZcSfZXJsZXIgeWFsbsSxemNhIFwiw4dhbMSxxZ90xLFyXCIvXCJCZWxnZSBBa8SxxZ/EsW7EsSBCYcWfbGF0XCIgdGV0aWtsZW5kacSfaSBhbmRhLCBvIMOnYcSfcsSxZGFuXG4gIC8vIGhlbWVuIMO2bmNlIHRlayBzZWZlcmRlIGJhY2tlbmQnZSBzZW5rcm9uaXplIGVkaWxpci4gU3BlYyDCpzEwIC0gZMO2dml6L2t1ciBoZXIgYmFjYWsgacOnaW4gKENvbnN0cnVjdGlvblxuICAvLyBkYWhpbCwgc29uIGJhY2FrIGRhaGlsKSBnZcOnZXJsaSBvbGR1xJ91bmRhbiBOdW1BdENhcmQnxLFuIGFrc2luZSBkYXZyYW7EscWfL3PEsXJhIGJhemzEsSBmaWx0cmVsZW5tZXouXG4gIHByaXZhdGUgc3luY1BlbmRpbmdMZWdDaGFuZ2VzKGxlZ3M6IERvY3VtZW50VHJhbnNmZXJMZWdEdG9bXSkge1xuICAgIC8vIFphdGVuIEJhxZ9hcsSxbMSxIChTdWNjZXNzKSBvbG11xZ8gYmlyIGJhY2FrIGJhY2tlbmQnZGUgYXJ0xLFrIGTDvHplbmxlbmVtZXogKEVuc3VyZUxlZ0lzRWRpdGFibGUsXG4gICAgLy8gRkJEb2N1bWVudEZsb3c6MDEwMDE3IFwiTGVnQWxyZWFkeVN1Y2NlZWRlZFwiIGbEsXJsYXTEsXIpIC0gYnUgZm9ua3NpeW9uYSDDtm5jZWRlbiBUw5xNIGJhY2FrbGFyXG4gICAgLy8gKHphdGVuIGJhxZ9hcsSxbMSxIG9sYW5sYXIgZGFoaWwpIGfDtm5kZXJpbGl5b3JkdS4gQnUsIMO2cm4uIGJpciB6aW5jaXJkZSAxLTIuIGJhY2FrIEJhxZ9hcsSxbMSxLCAzLiBiYWNha1xuICAgIC8vIEhhdGFsxLEgaWtlbiAzLiBiYWNhxJ/EsSB0ZWtyYXIgXCLDh2FsxLHFn3TEsXJcImEgYmFzbWF5xLEgVEFNQU1FTiBpbWthbnPEsXogaGFsZSBnZXRpcml5b3JkdSAtIHNlbmtyb25pemFzeW9uXG4gICAgLy8gYWTEsW3EsSwgaGVuw7x6IDMuIGJhY2HEn2EgaGnDpyBzxLFyYSBnZWxtZWRlbiwgemF0ZW4gYmHFn2FyxLFsxLEgMS4gYmFjYWt0YSBidSBoYXRheWxhIHBhdGzEsXlvcmR1IChnZXLDp2VrXG4gICAgLy8gb3J0YW1kYSBnw7Z6bGVtbGVuZGkpLiBZYWxuxLF6Y2EgaMOibMOiIGTDvHplbmxlbmViaWxpciAoU3VjY2VzcyBvbG1heWFuKSBiYWNha2xhciBzZW5rcm9uaXplIGVkaWxpci5cbiAgICBjb25zdCBlZGl0YWJsZUxlZ3MgPSBsZWdzLmZpbHRlcihsID0+IGwuc3RhdHVzICE9PSBET0NVTUVOVF9UUkFOU0ZFUl9MRUdfU1RBVFVTX1NVQ0NFU1MpO1xuXG4gICAgaWYgKCF0aGlzLndvcmtpbmdDb3B5IHx8IGVkaXRhYmxlTGVncy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBvZihudWxsKTtcbiAgICB9XG5cbiAgICAvLyBCYWNha2xhciBheW7EsSBEb2N1bWVudFRyYW5zZmVyIChhZ2dyZWdhdGUgcm9vdCkga2F5ZMSxbsSxIHBheWxhxZ90xLHEn8SxIGnDp2luIGZvcmtKb2luIGlsZSBwYXJhbGVsXG4gICAgLy8gZ8O2bmRlcmlsaXJzZSBoZXIgaXN0ZWsgYXluxLEgQ29uY3VycmVuY3lTdGFtcCdpIHnDvGtsZXI7IGlsayBrYXlkZWRlbiBkxLHFn8SxbmRha2lsZXJcbiAgICAvLyBBYnBEYkNvbmN1cnJlbmN5RXhjZXB0aW9uIChcInZlcmkgYmHFn2thIGJpciBrdWxsYW7EsWPEsS9pc3RlbWNpIHRhcmFmxLFuZGFuIGRlxJ9pxZ90aXJpbG1pxZ9cIikgYWzEsXIgLVxuICAgIC8vIGdlcsOnZWsgb3J0YW1kYSBkb8SfcnVsYW5kxLEuIGNvbmNhdE1hcCBpbGUgc8SxcmF5bGEgZ8O2bmRlcmlsaXIsIGhlciBpc3RlayBiaXIgw7ZuY2VraW5pblxuICAgIC8vIGtheWRldHRpxJ9pIGfDvG5jZWwgc3RhbXAgw7x6ZXJpbmRlbiBkZXZhbSBlZGVyLlxuICAgIHJldHVybiBmcm9tKGVkaXRhYmxlTGVncykucGlwZShcbiAgICAgIGNvbmNhdE1hcChsZWcgPT4gdGhpcy5zZXJ2aWNlLnVwZGF0ZUxlZyh0aGlzLndvcmtpbmdDb3B5IS5pZCwgbGVnLmlkLCB0aGlzLmJ1aWxkTGVnVXBkYXRlSW5wdXQobGVnKSkpLFxuICAgICAgdG9BcnJheSgpXG4gICAgKTtcbiAgfVxuXG4gIGJhY2tUb0xpc3QoKSB7XG4gICAgY29uc3Qgc291cmNlQ29tcGFueUlkID0gdGhpcy5uZXdTdGF0ZT8uc291cmNlQ29tcGFueUlkID8/IHRoaXMud29ya2luZ0NvcHk/LnNvdXJjZUNvbXBhbnlJZDtcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9mYmRvY3VtZW50Zmxvdy9kb2N1bWVudC10cmFuc2ZlcnMnXSwge1xuICAgICAgc3RhdGU6IHNvdXJjZUNvbXBhbnlJZCA/IHsgc291cmNlQ29tcGFueUlkIH0gOiB1bmRlZmluZWQsXG4gICAgfSk7XG4gIH1cblxuICBzdGFydEZsb3coKSB7XG4gICAgaWYgKCF0aGlzLndvcmtpbmdDb3B5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU3BlYyDCpzkgLSBVX09yYW4gdGFuxLFtc8SxemtlbiBha8SxxZ8gYmxva2xhbm1hejsgYW5jYWsga3VsbGFuxLFjxLFuxLFuIGJ1bnUgYmlsZXJlayBvbmF5bGFtYXPEsSBnZXJla2lyLlxuICAgIGlmICh0aGlzLmhhc01pc3NpbmdJbmNyZWFzZVJhdGUoKSkge1xuICAgICAgdGhpcy5jb25maXJtYXRpb24ud2FybignRkJEb2N1bWVudEZsb3c6OkluY3JlYXNlUmF0ZU5vdERlZmluZWRDb25maXJtJywgJ0ZCRG9jdW1lbnRGbG93OjpBcmVZb3VTdXJlJykuc3Vic2NyaWJlKHN0YXR1cyA9PiB7XG4gICAgICAgIGlmIChzdGF0dXMgPT09IENvbmZpcm1hdGlvbi5TdGF0dXMuY29uZmlybSkge1xuICAgICAgICAgIHRoaXMuZXhlY3V0ZVN0YXJ0RmxvdygpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmV4ZWN1dGVTdGFydEZsb3coKTtcbiAgfVxuXG4gIHByaXZhdGUgZXhlY3V0ZVN0YXJ0RmxvdygpIHtcbiAgICBpZiAoIXRoaXMud29ya2luZ0NvcHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmlzU3RhcnRpbmcgPSB0cnVlO1xuICAgIHRoaXMuc3luY1BlbmRpbmdMZWdDaGFuZ2VzKHRoaXMud29ya2luZ0NvcHkubGVncylcbiAgICAgIC5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5zZXJ2aWNlLmV4ZWN1dGVBbGwodGhpcy53b3JraW5nQ29weSEuaWQpKSxcbiAgICAgICAgZmluYWxpemUoKCkgPT4gKHRoaXMuaXNTdGFydGluZyA9IGZhbHNlKSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiByZXN1bHQgPT4gKHRoaXMud29ya2luZ0NvcHkgPSByZXN1bHQpLFxuICAgICAgICAvLyBBQlAgemF0ZW4gYmHFn2FyxLFzxLF6IEhUVFAgw6dhxJ9yxLFsYXLEsW5kYSBnZW5lbCBiaXIgaGF0YSBkaXlhbG/En3UgZ8O2c3RlcmlyLlxuICAgICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuaXNTdGFydGluZyA9IGZhbHNlO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gIH1cblxuICAvLyBZYWxuxLF6Y2EgW2xlZ10gKMOnYWzEscWfdMSxcsSxbGFuIGJhY2FrKSBzZW5rcm9uaXplIGVkaWxpcnNlLCBrdWxsYW7EsWPEsW7EsW4gQkHFnktBIGJpciBiYWNhxJ9hIHlhemTEscSfxLEgYW1hXG4gIC8vIGhlbsO8eiBnw7ZuZGVyaWxtZW1pxZ8gTnVtQXRDYXJkL0TDtnZpei9LdXIgZGXEn2VybGVyaSBoacOnIGtheWRlZGlsbWVkZW4ga2FsxLFyIC0gYXJkxLFuZGFuIMOnYcSfcsSxbGFuXG4gIC8vIGxvYWRXb3JraW5nQ29weSgpIHN1bnVjdWRha2kgZXNraSAoYm/FnykgZGXEn2VybGUgbyBiYWNhxJ/EsSBlemVyLCBrdWxsYW7EsWPEsSB5YXpkxLHEn8SxIGRlxJ9lcmkga2F5YmVkZXJcbiAgLy8gKGdlcsOnZWsgb3J0YW1kYSBkb8SfcnVsYW5kxLEsIGV4ZWN1dGVTdGFydEZsb3cnZGFraSBnaWJpIFTDnE0gYmFjYWtsYXIgc2Vua3Jvbml6ZSBlZGlsbWVsaSkuXG4gIGV4ZWN1dGVMZWcobGVnOiBEb2N1bWVudFRyYW5zZmVyTGVnRHRvKSB7XG4gICAgaWYgKCF0aGlzLndvcmtpbmdDb3B5IHx8ICF0aGlzLmNhbkV4ZWN1dGVMZWcobGVnKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXNFeGVjdXRpbmcgPSB0cnVlO1xuICAgIHRoaXMuc3luY1BlbmRpbmdMZWdDaGFuZ2VzKHRoaXMud29ya2luZ0NvcHkubGVncylcbiAgICAgIC5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5zZXJ2aWNlLmV4ZWN1dGVMZWcodGhpcy53b3JraW5nQ29weSEuaWQsIGxlZy5pZCkpLFxuICAgICAgICBmaW5hbGl6ZSgoKSA9PiAodGhpcy5pc0V4ZWN1dGluZyA9IGZhbHNlKSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5sb2FkV29ya2luZ0NvcHkodGhpcy53b3JraW5nQ29weSEuaWQpKTtcbiAgfVxuXG4gIC8vIFwiWmluY2lyaSDEsHB0YWwgRXRcIiB5YWxuxLF6Y2EgZmlpbGVuIGlwdGFsIGVkaWxlY2VrIGJpciDFn2V5IHZhcmtlbiAoRGV2YW0gRWRpeW9yL0hhdGFsxLEpIGFubGFtbMSxZMSxcjtcbiAgLy8gemF0ZW4gxLBwdGFsIEVkaWxkaSB2ZXlhIFRhbWFtbGFuZMSxIGR1cnVtdW5kYWtpIGJpciBha3RhcsSxbWRhIHRla3JhciBnw7ZzdGVyaWxtZXNpIGt1bGxhbsSxY8SxecSxXG4gIC8vIHlhbsSxbHTEsXIgKHNwZWMgwqcxMi0xMyAtIGlwdGFsIGVkaWxtacWfIGJpciB6aW5jaXIgdGVrcmFyIGnFn2xlbWUgYWzEsW5tYXosIHllbmlkZW4gb2x1xZ90dXJtYSBzw7xyZWNpbmVcbiAgLy8ga2F5bmFrIGZhdHVyYWRhbiB5ZW5pIGJpciBha3RhcsSxbWxhIGdpcmlsaXIpLlxuICBjYW5DYW5jZWxDaGFpbigpOiBib29sZWFuIHtcbiAgICBjb25zdCBzdGF0dXMgPSB0aGlzLndvcmtpbmdDb3B5Py5zdGF0dXM7XG4gICAgcmV0dXJuIHN0YXR1cyA9PT0gMSB8fCBzdGF0dXMgPT09IDM7IC8vIDE9RGV2YW0gRWRpeW9yLCAzPUhhdGFsxLFcbiAgfVxuXG4gIGNhbmNlbENoYWluKCkge1xuICAgIGlmICghdGhpcy53b3JraW5nQ29weSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY29uZmlybWF0aW9uLndhcm4oJ0ZCRG9jdW1lbnRGbG93OjpEZWxldGVDb25maXJtYXRpb25NZXNzYWdlJywgJ0ZCRG9jdW1lbnRGbG93OjpBcmVZb3VTdXJlJykuc3Vic2NyaWJlKHN0YXR1cyA9PiB7XG4gICAgICBpZiAoc3RhdHVzID09PSBDb25maXJtYXRpb24uU3RhdHVzLmNvbmZpcm0gJiYgdGhpcy53b3JraW5nQ29weSkge1xuICAgICAgICAvLyDEsHB0YWxkZW4gc29ucmEgYnUgc2F5ZmFkYSBrYWxtYWsgeWVyaW5lIGxpc3RleWUgZMO2bsO8bMO8ciAtIGJhY2tUb0xpc3QoKSB6YXRlbiBzZcOnaWxpIGtheW5ha1xuICAgICAgICAvLyDFn2lya2V0aSByb3V0ZXIgc3RhdGUgaWxlIHRhxZ/EsXnEsXAgbGlzdGUgZWtyYW7EsW5kYSBheW7EsSDFn2lya2V0aW4gc2XDp2lsaSBrYWxtYXPEsW7EsSBzYcSfbMSxeW9yLlxuICAgICAgICB0aGlzLnNlcnZpY2UuY2FuY2VsQ2hhaW4odGhpcy53b3JraW5nQ29weS5pbnRlcmNvbXBhbnlJZCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmJhY2tUb0xpc3QoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBzdGF0dXNMYWJlbChzdGF0dXM6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3Qga2V5cyA9IFtcbiAgICAgICdGQkRvY3VtZW50Rmxvdzo6VHJhbnNmZXJTdGF0dXM6UGVuZGluZycsXG4gICAgICAnRkJEb2N1bWVudEZsb3c6OlRyYW5zZmVyU3RhdHVzOkluUHJvZ3Jlc3MnLFxuICAgICAgJ0ZCRG9jdW1lbnRGbG93OjpUcmFuc2ZlclN0YXR1czpDb21wbGV0ZWQnLFxuICAgICAgJ0ZCRG9jdW1lbnRGbG93OjpUcmFuc2ZlclN0YXR1czpGYWlsZWQnLFxuICAgICAgJ0ZCRG9jdW1lbnRGbG93OjpUcmFuc2ZlclN0YXR1czpDYW5jZWxsZWQnLFxuICAgIF07XG4gICAgY29uc3Qga2V5ID0ga2V5c1tzdGF0dXNdO1xuICAgIHJldHVybiBrZXkgPyB0aGlzLmxvY2FsaXphdGlvbi5pbnN0YW50KGtleSkgOiBTdHJpbmcoc3RhdHVzKTtcbiAgfVxuXG4gIC8vIFNwZWMgwqcxNCAoMTguMDkuMjAyNiBrYXJhcsSxKSAtIHPDvHJlw6cgcGFyYW1ldHJpazsgS2F5bmFrIHZlIEhlZGVmIEJlbGdlIER1cnVtdSBpw6dpbiBBWU5JIGV0aWtldFxuICAvLyBrdWxsYW7EsWzEsXIgKGt1bGxhbsSxY8SxIGlzdGXEn2l5bGUgbmV0bGXFn3RpcmlsZGkpLlxuICBzb3VyY2VEb2N1bWVudExpZmVjeWNsZUxhYmVsKGxpZmVjeWNsZT86IFNhcERvY3VtZW50TGlmZWN5Y2xlKTogc3RyaW5nIHtcbiAgICBpZiAobGlmZWN5Y2xlID09IG51bGwpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubG9jYWxpemF0aW9uLmluc3RhbnQoXG4gICAgICBsaWZlY3ljbGUgPT09IFNhcERvY3VtZW50TGlmZWN5Y2xlLkRyYWZ0ID8gJ0ZCRG9jdW1lbnRGbG93OjpEb2N1bWVudExpZmVjeWNsZTpEcmFmdCcgOiAnRkJEb2N1bWVudEZsb3c6OkRvY3VtZW50TGlmZWN5Y2xlOlBvc3RlZCdcbiAgICApO1xuICB9XG5cbiAgbGVnU3RhdHVzTGFiZWwoc3RhdHVzOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IGtleXMgPSBbJ0ZCRG9jdW1lbnRGbG93OjpMZWdTdGF0dXM6UGVuZGluZycsICdGQkRvY3VtZW50Rmxvdzo6TGVnU3RhdHVzOlN1Y2Nlc3MnLCAnRkJEb2N1bWVudEZsb3c6OkxlZ1N0YXR1czpGYWlsZWQnLCAnRkJEb2N1bWVudEZsb3c6OkxlZ1N0YXR1czpTa2lwcGVkJ107XG4gICAgY29uc3Qga2V5ID0ga2V5c1tzdGF0dXNdO1xuICAgIHJldHVybiBrZXkgPyB0aGlzLmxvY2FsaXphdGlvbi5pbnN0YW50KGtleSkgOiBTdHJpbmcoc3RhdHVzKTtcbiAgfVxuXG4gIC8vIEJpciBiYWNha3RhICjDtnplbGxpa2xlIENvbnN0cnVjdGlvbjogT1BPUuKGkk9QRE7ihpJPUENILCB2ZXlhIEFyYSDFnmlya2V0J3RlIGRldmFtIE9JTlYgb2x1xZ90dcSfdW5kYSlcbiAgLy8gQsSwUkRFTiBGQVpMQSBTQVAgYmVsZ2VzaSBvbHXFn2FiaWxpcjsgw7ZuY2VkZW4geWFsbsSxemNhIFwic29uXCIgYmVsZ2UgKGxlZy5jcmVhdGVkRG9jVHlwZS9jcmVhdGVkRG9jRW50cnkpXG4gIC8vIGfDtnN0ZXJpbGl5b3JkdSwgZGnEn2VybGVyaSAoT1BPUi9PUEROLCBkZXZhbSBPSU5WKSBEVE8nZGEgdmFyZMSxIGFtYSBla3JhbmRhIGhpw6cgZ8O2csO8bm3DvHlvcmR1LlxuICAvLyBTb251w6cgYmVsZ2UgZXRpa2V0bGVyaSAoc3BlYyDCpzE1IC0gVGVrbmlrIFNBUCBCMSBBbGFubGFyxLEgdGFibG9zdW5kYWtpIG5lc25lIGvEsXNhbHRtYWxhcsSxeWxhIGJpcmViaXIpOlxuICAvLyBPUE9SL09QRE4vT1BDSC9PSU5WLiDDlm5jZWRlbiBidXJhZGEgbGVnLmNyZWF0ZWREb2NUeXBlIChiYWNrZW5kJ2RlIGhlciB6YW1hbiBoYW0gU0FQIFNlcnZpY2UgTGF5ZXJcbiAgLy8gZW50aXR5IHNldCBhZMSxIFwiUHVyY2hhc2VJbnZvaWNlc1wiIG9sYXJhayBzYWJpdCkgZG/En3J1ZGFuIGfDtnN0ZXJpbGl5b3JkdSAtIE9QT1IvT1BETiBnaWJpIGvEsXNhIFNBUFxuICAvLyBrb2RsYXLEsXlsYSBheW7EsSBzYXTEsXJkYSBrYXLEscWfxLFrIGfDtnLDvG7DvHAgYW5sYW0ga2FybWHFn2FzxLFuYSB5b2wgYcOnxLF5b3JkdSAoa3VsbGFuxLFjxLEgZ2VyaSBiaWxkaXJpbWl5bGVcbiAgLy8gdGVzcGl0IGVkaWxkaSkuIEFydMSxayB0w7xtIGJlbGdlIHRpcGxlcmkgYXluxLEga8Sxc2FsdG1hIHNldGl5bGUsIHR1dGFybMSxIMWfZWtpbGRlIGfDtnN0ZXJpbGl5b3IuXG4gIC8vIEVrcmFuZGEgZ8O2c3RlcmlsZWNlayBiZWxnZSBudW1hcmFzxLEgaGVyIHphbWFuIERvY051bSDDvHplcmluZGVuIHnDvHLDvHIgKGt1bGxhbsSxY8SxIGdlcmkgYmlsZGlyaW1peWxlXG4gIC8vIG5ldGxlxZ90aXJpbGRpKSAtIERvY0VudHJ5IChTQVAnxLFuIGRhaGlsaSBhbmFodGFyxLEpIHlhbG7EsXpjYSBmYWxsYmFjayd0aXIsIERvY051bSBiaXIgc2ViZXBsZVxuICAvLyB5YWthbGFuYW1hZMSxeXNhICjDtnIuIMOnb2sgZXNraSBiaXIga2F5xLF0KSBiZWxnZSB0YW1hbWVuIGtheWJvbG11xZ8gZ8O2csO8bm1lc2luIGRpeWUuXG4gIGNyZWF0ZWREb2N1bWVudHNTdW1tYXJ5KGxlZzogRG9jdW1lbnRUcmFuc2ZlckxlZ0R0byk6IHN0cmluZyB7XG4gICAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKGxlZy5jcmVhdGVkUHVyY2hhc2VPcmRlckRvY0VudHJ5KSB7XG4gICAgICBwYXJ0cy5wdXNoKGBPUE9SICR7bGVnLmNyZWF0ZWRQdXJjaGFzZU9yZGVyRG9jTnVtID8/IGxlZy5jcmVhdGVkUHVyY2hhc2VPcmRlckRvY0VudHJ5fWApO1xuICAgIH1cbiAgICBpZiAobGVnLmNyZWF0ZWRHb29kc1JlY2VpcHREb2NFbnRyeSkge1xuICAgICAgcGFydHMucHVzaChgT1BETiAke2xlZy5jcmVhdGVkR29vZHNSZWNlaXB0RG9jTnVtID8/IGxlZy5jcmVhdGVkR29vZHNSZWNlaXB0RG9jRW50cnl9YCk7XG4gICAgfVxuICAgIGlmIChsZWcuY3JlYXRlZERvY0VudHJ5KSB7XG4gICAgICBwYXJ0cy5wdXNoKGBPUENIICR7bGVnLmNyZWF0ZWREb2NOdW0gPz8gbGVnLmNyZWF0ZWREb2NFbnRyeX1gKTtcbiAgICB9XG4gICAgaWYgKGxlZy5jcmVhdGVkSW50ZXJuYWxPaW52RG9jRW50cnkpIHtcbiAgICAgIHBhcnRzLnB1c2goYE9JTlYgJHtsZWcuY3JlYXRlZEludGVybmFsT2ludkRvY051bSA/PyBsZWcuY3JlYXRlZEludGVybmFsT2ludkRvY0VudHJ5fWApO1xuICAgIH1cbiAgICByZXR1cm4gcGFydHMuam9pbignIOKGkiAnKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImNhcmRcIj5cbiAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIHB5LTNcIj5cbiAgICA8ZGl2IGNsYXNzPVwicm93IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxuICAgICAgICA8aDUgY2xhc3M9XCJjYXJkLXRpdGxlIG1iLTBcIj57eyAnRkJEb2N1bWVudEZsb3c6OkRvY3VtZW50Rmxvd1RpdGxlJyB8IGFicExvY2FsaXphdGlvbiB9fTwvaDU+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtYXV0b1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tb3V0bGluZS1zZWNvbmRhcnlcIiAoY2xpY2spPVwiYmFja1RvTGlzdCgpXCI+XG4gICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1hcnJvdy1sZWZ0IG1lLTFcIj48L2k+e3sgJ0ZCRG9jdW1lbnRGbG93OjpCYWNrVG9MaXN0JyB8IGFicExvY2FsaXphdGlvbiB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBwdC0zXCI+XG4gICAgPGRpdiAqbmdJZj1cImlzTG9hZGluZ1wiIGNsYXNzPVwidGV4dC1jZW50ZXIgcHktNVwiPlxuICAgICAgPGRpdiBjbGFzcz1cInNwaW5uZXItYm9yZGVyIHRleHQtcHJpbWFyeVwiIHJvbGU9XCJzdGF0dXNcIj48L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtdC0yIHRleHQtbXV0ZWRcIj57eyAnRkJEb2N1bWVudEZsb3c6OkxvYWRpbmcnIHwgYWJwTG9jYWxpemF0aW9uIH19PC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzTG9hZGluZ1wiPlxuICAgICAgPCEtLSBCdSBzYXTEsXIgaGVtIFwieWVuaVwiIChoZW7DvHoga2F5xLF0IG9sdcWfbWFtxLHFnykgaGVtIGRlIGthecSxdCBvbHXFn3R1a3RhbiBzb25yYWtpIHRhc2xhayBkdXJ1bXVuZGFcbiAgICAgICAgICAgQVlOSSBhbGFuIHNldGluaSBnw7ZzdGVyaXIgLSBrYXnEsXQgb2x1xZ91bmNhIGVrcmFuxLFuIGFsYW4gc2V0aSBkZcSfacWfaXAga3VsbGFuxLFjxLFkYSBcImJhxZ9rYSBiaXJcbiAgICAgICAgICAga2F5xLF0IG3EsSBidVwiIGl6bGVuaW1pIHZlcm1lc2luIGRpeWUuIERlxJ9lcmxlciDDtm5jZSBuZXdTdGF0ZSd0ZW4gKGlzdGVtY2lkZSB0dXR1bGFuIMO2bml6bGVtZSksXG4gICAgICAgICAgIG8geW9rc2Egb2x1xZ9hbiBrYXlkxLFuIGlsayBiYWNhxJ/EsW5kYW4gKHdvcmtpbmdDb3B5LmxlZ3NbMF0pIG9rdW51ciAtIGlsayBiYWNhayBoZXIgemFtYW5cbiAgICAgICAgICAgbmV3U3RhdGUnaW4gdGVtc2lsIGV0dGnEn2kgXCJpbGsgaGVkZWZcIiBhZMSxbcSxeWxhIGF5bsSxIGJlbGdlZGlyLiAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJyb3cgZy0zIG1iLTNcIiAqbmdJZj1cIm5ld1N0YXRlIHx8IHdvcmtpbmdDb3B5XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtM1wiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj57eyAnRkJEb2N1bWVudEZsb3c6OlNvdXJjZUNvbXBhbnknIHwgYWJwTG9jYWxpemF0aW9uIH19PC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIFt2YWx1ZV09XCJjb21wYW55TmFtZSgpXCIgZGlzYWJsZWQgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMlwiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj57eyAnRkJEb2N1bWVudEZsb3c6OkRvY051bScgfCBhYnBMb2NhbGl6YXRpb24gfX08L2xhYmVsPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgW3ZhbHVlXT1cIm5ld1N0YXRlPy5kb2NOdW0gPz8gd29ya2luZ0NvcHk/LnNvdXJjZU9pbnZEb2NOdW1cIiBkaXNhYmxlZCAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0yXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPnt7ICdGQkRvY3VtZW50Rmxvdzo6TnVtQXRDYXJkJyB8IGFicExvY2FsaXphdGlvbiB9fTwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbdmFsdWVdPVwibmV3U3RhdGU/Lm51bUF0Q2FyZCA/PyB3b3JraW5nQ29weT8uc291cmNlT2ludk51bUF0Q2FyZFwiIGRpc2FibGVkIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTFcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+e3sgJ0ZCRG9jdW1lbnRGbG93OjpQcm9qZWN0JyB8IGFicExvY2FsaXphdGlvbiB9fTwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbdmFsdWVdPVwibmV3U3RhdGU/LnByb2plY3RDb2RlID8/IHdvcmtpbmdDb3B5Py5wcm9qZWN0Q29kZVwiIGRpc2FibGVkIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTJcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+e3sgJ0ZCRG9jdW1lbnRGbG93OjpGaXJzdFRhcmdldCcgfCBhYnBMb2NhbGl6YXRpb24gfX08L2xhYmVsPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgW3ZhbHVlXT1cIm5ld1N0YXRlPy50YXJnZXRDb21wYW55TmFtZSA/PyB3b3JraW5nQ29weT8ubGVncz8uWzBdPy50YXJnZXRDb21wYW55TmFtZVwiIGRpc2FibGVkIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTJcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+e3sgJ0ZCRG9jdW1lbnRGbG93OjpDdXJyZW5jeScgfCBhYnBMb2NhbGl6YXRpb24gfX08L2xhYmVsPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgW3ZhbHVlXT1cIm5ld1N0YXRlPy5jdXJyZW5jeSA/PyB3b3JraW5nQ29weT8ubGVncz8uWzBdPy5jdXJyZW5jeVwiIGRpc2FibGVkIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gQmVsZ2UgRHVydW11IGhlciB6YW1hbiAoeWVuaSBrYXnEsXR0YSBkYSkgZ8O2csO8bsO8cjsgSW50ZXJjb21wYW55IElkL0FrdGFyxLFtIER1cnVtdS9TZW5hcnlvIHlhbG7EsXpjYVxuICAgICAgICAgICBrYXnEsXQgb2x1xZ90dWt0YW4gc29ucmEgdmFyZMSxciAtIGt1bGxhbsSxY8SxIGlzdGXEn2l5bGUgaGVwc2kgYXluxLEgc2F0xLFyZGEsIEJlbGdlIER1cnVtdSdudW4geWFuxLFuYVxuICAgICAgICAgICB0b3BsYW5kxLEgKMO2bmNlZGVuIEludGVyY29tcGFueSBJZC9Ba3RhcsSxbSBEdXJ1bXUgYXlyxLEgYmlyIHNhdMSxcmRheWTEsSkuIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInJvdyBnLTMgbWItM1wiICpuZ0lmPVwibmV3U3RhdGUgfHwgd29ya2luZ0NvcHlcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0yXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPnt7ICdGQkRvY3VtZW50Rmxvdzo6U291cmNlRG9jdW1lbnRMaWZlY3ljbGUnIHwgYWJwTG9jYWxpemF0aW9uIH19PC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJzb3VyY2VEb2N1bWVudExpZmVjeWNsZUxhYmVsKG5ld1N0YXRlPy5zb3VyY2VEb2N1bWVudExpZmVjeWNsZSA/PyB3b3JraW5nQ29weT8uc291cmNlRG9jdW1lbnRMaWZlY3ljbGUpXCJcbiAgICAgICAgICAgIGRpc2FibGVkXG4gICAgICAgICAgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMlwiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj57eyAnRkJEb2N1bWVudEZsb3c6OlRhcmdldERvY3VtZW50TGlmZWN5Y2xlJyB8IGFicExvY2FsaXphdGlvbiB9fTwvbGFiZWw+XG4gICAgICAgICAgPCEtLSBBa3RhcsSxbSBoZW7DvHogb2x1xZ90dXJ1bG1hZMSxeXNhIChpc05ldykgYnVyYWRhIHNlw6dpbGViaWxpciAtIGtheW5ha3RhbiBiYcSfxLFtc8SxeiBiaXIga2FyYXJkxLFyXG4gICAgICAgICAgICAgICAoa3VsbGFuxLFjxLEgZ2VyaSBiaWxkaXJpbWl5bGUgbmV0bGXFn3RpcmlsZGk6IGtheW5hxJ/EsW4gbW9kdSBzYWJpdCwgaGVkZWZpbiBtb2R1IGJ1cmFkYSBzZcOnaWxpcikuXG4gICAgICAgICAgICAgICBPbHXFn3R1a3RhbiBzb25yYSBiYWNrZW5kJ2RlIHNhYml0bGVuZGnEn2kgacOnaW4gKHdvcmtpbmdDb3B5KSBzYWx0LW9rdW51ciBnw7ZzdGVyaWxpci4gLS0+XG4gICAgICAgICAgPHNlbGVjdCAqbmdJZj1cImlzTmV3ICYmIG5ld1N0YXRlXCIgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIFsobmdNb2RlbCldPVwibmV3U3RhdGUudGFyZ2V0RG9jdW1lbnRMaWZlY3ljbGVcIj5cbiAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG8gb2YgZG9jdW1lbnRMaWZlY3ljbGVPcHRpb25zXCIgW25nVmFsdWVdPVwiby52YWx1ZVwiPnt7IG8ubGFiZWwgfX08L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICpuZ0lmPVwiIWlzTmV3IHx8ICFuZXdTdGF0ZVwiXG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICBbdmFsdWVdPVwic291cmNlRG9jdW1lbnRMaWZlY3ljbGVMYWJlbChuZXdTdGF0ZT8udGFyZ2V0RG9jdW1lbnRMaWZlY3ljbGUgPz8gd29ya2luZ0NvcHk/LnRhcmdldERvY3VtZW50TGlmZWN5Y2xlKVwiXG4gICAgICAgICAgICBkaXNhYmxlZFxuICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTNcIiAqbmdJZj1cIndvcmtpbmdDb3B5XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPnt7ICdGQkRvY3VtZW50Rmxvdzo6SW50ZXJjb21wYW55SWQnIHwgYWJwTG9jYWxpemF0aW9uIH19PC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIFt2YWx1ZV09XCJ3b3JraW5nQ29weS5pbnRlcmNvbXBhbnlJZFwiIGRpc2FibGVkIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTJcIiAqbmdJZj1cIndvcmtpbmdDb3B5XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPnt7ICdGQkRvY3VtZW50Rmxvdzo6VHJhbnNmZXJTdGF0dXNMYWJlbCcgfCBhYnBMb2NhbGl6YXRpb24gfX08L2xhYmVsPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgW3ZhbHVlXT1cInN0YXR1c0xhYmVsKHdvcmtpbmdDb3B5LnN0YXR1cylcIiBkaXNhYmxlZCAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSBTZW5hcnlvLCBha3RhcsSxbSBoZW7DvHogw6dhbMSxxZ90xLFyxLFsbWFtxLHFn2tlbiAoaXNEcmFmdCgpKSBhbHTEsW5kYWtpIFwiSGF6xLFyIFNlbmFyeW9cIiBkcm9wZG93bifEsW5kYVxuICAgICAgICAgICAgIHphdGVuIGTDvHplbmxlbmViaWxpci9nw7Zyw7xuw7xyIGR1cnVtZGEgLSBheW7EsSBiaWxnaXlpIGJ1cmFkYSBzYWx0LW9rdW51ciB0ZWtyYXIgZ8O2c3Rlcm1la1xuICAgICAgICAgICAgIChrdWxsYW7EsWPEsSBnZXJpIGJpbGRpcmltaXlsZSB0ZXNwaXQgZWRpbGRpKSBrYWZhIGthcsSxxZ90xLFyxLF5b3JkdS4gWWFsbsSxemNhIGFrdGFyxLFtIGFydMSxa1xuICAgICAgICAgICAgIGTDvHplbmxlbmVtZXogaGFsZSBnZWxkacSfaW5kZSAoZHJvcGRvd24ga2F5Ym9sZHXEn3VuZGEpIGJ1cmFkYSBnw7ZzdGVyaWxpci4gLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtM1wiICpuZ0lmPVwid29ya2luZ0NvcHkgJiYgIWlzRHJhZnQoKVwiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj57eyAnRkJEb2N1bWVudEZsb3c6OlNjZW5hcmlvJyB8IGFicExvY2FsaXphdGlvbiB9fTwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbdmFsdWVdPVwic2NlbmFyaW9OYW1lKClcIiBkaXNhYmxlZCAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFRhc2xhazogaGF6xLFyIHNlbmFyeW8gc2XDp2ltaSwgaGVuw7x6IMOnYWzEscWfdMSxcsSxbG1hZMSxLiAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0RyYWZ0KClcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBnLTMgYWxpZ24taXRlbXMtZW5kIG1iLTNcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTRcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj57eyAnRkJEb2N1bWVudEZsb3c6OlJlYWR5U2NlbmFyaW8nIHwgYWJwTG9jYWxpemF0aW9uIH19PC9sYWJlbD5cbiAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIFsobmdNb2RlbCldPVwic2NlbmFyaW9JZFwiPlxuICAgICAgICAgICAgICA8b3B0aW9uIFtuZ1ZhbHVlXT1cIicnXCI+e3sgJ0ZCRG9jdW1lbnRGbG93OjpOb1NjZW5hcmlvT3B0aW9uJyB8IGFicExvY2FsaXphdGlvbiB9fTwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBzIG9mIGF2YWlsYWJsZVNjZW5hcmlvcygpXCIgW25nVmFsdWVdPVwicy5pZFwiPnt7IHMubmFtZSB9fTwvb3B0aW9uPlxuICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0yXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnlcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiaXNOZXcgPyBmZXRjaFNjZW5hcmlvKCkgOiBhcHBseVNjZW5hcmlvKClcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNGZXRjaGluZ1NjZW5hcmlvXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpc0ZldGNoaW5nU2NlbmFyaW9cIiBjbGFzcz1cInNwaW5uZXItYm9yZGVyIHNwaW5uZXItYm9yZGVyLXNtIG1lLTFcIj48L3NwYW4+XG4gICAgICAgICAgICAgIHt7IChpc05ldyA/ICdGQkRvY3VtZW50Rmxvdzo6RmV0Y2hTY2VuYXJpbycgOiAnRkJEb2N1bWVudEZsb3c6OkFwcGx5U2NlbmFyaW8nKSB8IGFicExvY2FsaXphdGlvbiB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gTnVtQXRDYXJkIGFsYW5sYXLEsSBhcnTEsWsgaXNEcmFmdCgpJ2EgYmHEn2zEsSBERcSexLBMOiB0YXNsYWt0YSBkw7x6ZW5sZW5lYmlsaXIsIMOnYWzEscWfdMSxcsSxbGTEsWt0YW5cbiAgICAgICAgICAgc29ucmEgKGlzRHJhZnQoKSBmYWxzZSBvbHNhIGRhKSBzYWx0LW9rdW51ciBvbGFyYWsgZWtyYW5kYSBrYWzEsXIgLSBcIkhhesSxciBTZW5hcnlvXCIgYmxvxJ91eWxhXG4gICAgICAgICAgIGJpcmxpa3RlIHRhbWFtZW4ga2F5Ym9sbWFzxLFuIGRpeWUuIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIndvcmtpbmdDb3B5XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgZy0zIGFsaWduLWl0ZW1zLWVuZCBtYi0zXCIgKm5nSWY9XCJoYXNJbnRlcm1lZGlhdGVOdW1BdENhcmRMZWdzKClcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTNcIiAqbmdGb3I9XCJsZXQgbGVnIG9mIHdvcmtpbmdDb3B5LmxlZ3NcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsZWcubGVnQmVoYXZpb3IgPT09IDAgJiYgbGVnLnNlcXVlbmNlTm8gPCB3b3JraW5nQ29weS5sZWdzLmxlbmd0aFwiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+e3sgJ0ZCRG9jdW1lbnRGbG93OjpMZWdOdW1BdENhcmRMYWJlbCcgfCBhYnBMb2NhbGl6YXRpb246IGxlZy5zZXF1ZW5jZU5vLnRvU3RyaW5nKCk6bGVnLnRhcmdldENvbXBhbnlOYW1lIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cImxlZy5udW1BdENhcmRcIiBbZGlzYWJsZWRdPVwiIWlzRHJhZnQoKVwiIC8+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LXdhcm5pbmdcIiAqbmdJZj1cImlzRHJhZnQoKSAmJiBoYXNNaXNzaW5nSW5jcmVhc2VSYXRlKClcIj5cbiAgICAgICAgICB7eyAnRkJEb2N1bWVudEZsb3c6OkluY3JlYXNlUmF0ZVdhcm5pbmcnIHwgYWJwTG9jYWxpemF0aW9uIH19XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC13YXJuaW5nXCIgKm5nSWY9XCJpc0RyYWZ0KCkgJiYgaGFzTWlzc2luZ0NvbnN0cnVjdGlvbkRyYWZ0U2VsZWN0aW9uKClcIj5cbiAgICAgICAgICB7eyAnRkJEb2N1bWVudEZsb3c6OkNvbnN0cnVjdGlvbkRyYWZ0V2FybmluZycgfCBhYnBMb2NhbGl6YXRpb24gfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBUZWsgdGFibG86IHRhc2xha3RhIGRhLCDDp2FsxLHFn3TEsXLEsWxkxLFrdGFuIHNvbnJhIGRhIEFZTkkgc8O8dHVuIHNldGkgKFPEsXJhLi5BcnTEsXLEsW0pIGtvcnVudXI7XG4gICAgICAgICAgIER1cnVtL1NvbnXDpyBCZWxnZS9IYXRhL8OHYWzEscWfdMSxciB5YWxuxLF6Y2Egw6dhbMSxxZ90xLFyxLFsZMSxa3RhbiBzb25yYSwgaGVyIHNhdMSxcsSxbiBBTFRJTkEgaWtpbmNpIGJpclxuICAgICAgICAgICBzYXTEsXIgb2xhcmFrIGVrbGVuaXIgLSBlc2tpZGVuIGJ1IGJpbGdpbGVyIGF5csSxIHZlIGRhaGEgZGFyIGJpciB0YWJsb3lhIGdlw6dpbGVyZWsgZ8O2c3RlcmlsaXlvcmR1LFxuICAgICAgICAgICBidSBkYSBLYXluYWsgQmVsZ2UvSGVkZWZ0ZSBPbHXFn2FjYWsgZ2liaSBzw7x0dW5sYXLEsW4gXCJrYXlib2xtdcWfXCIgZ8O2csO8bm1lc2luZSB5b2wgYcOnxLF5b3JkdS4gLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwid29ya2luZ0NvcHlcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbWItMlwiPlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8aDYgY2xhc3M9XCJtYi0wXCI+e3sgKGlzRHJhZnQoKSA/ICdGQkRvY3VtZW50Rmxvdzo6U2NlbmFyaW9Xb3JraW5nQ29weScgOiAnRkJEb2N1bWVudEZsb3c6OlRyYW5zZmVyUmVzdWx0JykgfCBhYnBMb2NhbGl6YXRpb24gfX08L2g2PlxuICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1tdXRlZFwiICpuZ0lmPVwiaXNEcmFmdCgpXCI+e3sgJ0ZCRG9jdW1lbnRGbG93OjpXb3JraW5nQ29weUhpbnQnIHwgYWJwTG9jYWxpemF0aW9uIH19PC9zbWFsbD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tb3V0bGluZS1wcmltYXJ5XCIgKGNsaWNrKT1cImFkZExlZygpXCIgKm5nSWY9XCJpc0RyYWZ0KClcIiBbZGlzYWJsZWRdPVwiaXNNdXRhdGluZ0xlZ3NcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtcGx1cyBtZS0xXCI+PC9pPnt7ICdGQkRvY3VtZW50Rmxvdzo6QWRkTGVnJyB8IGFicExvY2FsaXphdGlvbiB9fVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLWRhbmdlclwiIChjbGljayk9XCJjYW5jZWxDaGFpbigpXCIgKm5nSWY9XCJjYW5DYW5jZWxDaGFpbigpXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWJhbiBtZS0xXCI+PC9pPnt7ICdGQkRvY3VtZW50Rmxvdzo6Q2FuY2VsQ2hhaW4nIHwgYWJwTG9jYWxpemF0aW9uIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1zZWNvbmRhcnkgc21hbGxcIiAqbmdJZj1cIndvcmtpbmdDb3B5LnN0YXR1cyA9PT0gNFwiPlxuICAgICAgICAgIHt7ICdGQkRvY3VtZW50Rmxvdzo6Q2hhaW5DYW5jZWxsZWROb3RlJyB8IGFicExvY2FsaXphdGlvbiB9fVxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiPlxuICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIHRhYmxlLXNtIHRhYmxlLWJvcmRlcmVkIGFsaWduLW1pZGRsZVwiPlxuICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgPHRoPnt7ICdGQkRvY3VtZW50Rmxvdzo6U2VxdWVuY2VObycgfCBhYnBMb2NhbGl6YXRpb24gfX08L3RoPlxuICAgICAgICAgICAgICAgIDx0aD57eyAnRkJEb2N1bWVudEZsb3c6OlNvdXJjZScgfCBhYnBMb2NhbGl6YXRpb24gfX08L3RoPlxuICAgICAgICAgICAgICAgIDx0aD57eyAnRkJEb2N1bWVudEZsb3c6OlNvdXJjZURvY3VtZW50JyB8IGFicExvY2FsaXphdGlvbiB9fTwvdGg+XG4gICAgICAgICAgICAgICAgPHRoPnt7ICdGQkRvY3VtZW50Rmxvdzo6VGFyZ2V0JyB8IGFicExvY2FsaXphdGlvbiB9fTwvdGg+XG4gICAgICAgICAgICAgICAgPHRoPnt7ICdGQkRvY3VtZW50Rmxvdzo6QmVoYXZpb3InIHwgYWJwTG9jYWxpemF0aW9uIH19PC90aD5cbiAgICAgICAgICAgICAgICA8dGg+e3sgJ0ZCRG9jdW1lbnRGbG93OjpUYXJnZXRDcmVhdGVzJyB8IGFicExvY2FsaXphdGlvbiB9fTwvdGg+XG4gICAgICAgICAgICAgICAgPHRoPnt7ICdGQkRvY3VtZW50Rmxvdzo6T3BjaENhcmRDb2RlJyB8IGFicExvY2FsaXphdGlvbiB9fTwvdGg+XG4gICAgICAgICAgICAgICAgPHRoPnt7ICdGQkRvY3VtZW50Rmxvdzo6Q3VycmVuY3knIHwgYWJwTG9jYWxpemF0aW9uIH19PC90aD5cbiAgICAgICAgICAgICAgICA8dGg+e3sgJ0ZCRG9jdW1lbnRGbG93OjpFeGNoYW5nZVJhdGUnIHwgYWJwTG9jYWxpemF0aW9uIH19PC90aD5cbiAgICAgICAgICAgICAgICA8dGg+e3sgJ0ZCRG9jdW1lbnRGbG93OjpJbmNyZWFzZVJhdGVDb2x1bW4nIHwgYWJwTG9jYWxpemF0aW9uIH19PC90aD5cbiAgICAgICAgICAgICAgICA8dGggKm5nSWY9XCJpc0RyYWZ0KClcIj48L3RoPlxuICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICAgIDx0Ym9keT5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgbGVnIG9mIHdvcmtpbmdDb3B5LmxlZ3NcIj5cbiAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICA8dGQ+e3sgbGVnLnNlcXVlbmNlTm8gfX08L3RkPlxuICAgICAgICAgICAgICAgICAgPHRkPnt7IGxlZy5zb3VyY2VDb21wYW55TmFtZSB9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICA8dGQ+T0lOVjwvdGQ+XG4gICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImlzRHJhZnQoKTsgZWxzZSB0YXJnZXRUZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tc2VsZWN0IGZvcm0tc2VsZWN0LXNtXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJsZWcudGFyZ2V0Q29tcGFueUlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVMZWdUYXJnZXQobGVnLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNNdXRhdGluZ0xlZ3NcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgYyBvZiBjb21wYW5pZXNcIiBbbmdWYWx1ZV09XCJjLmlkXCI+e3sgYy5jb21wYW55TmFtZSB9fTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICN0YXJnZXRUZXh0Pnt7IGxlZy50YXJnZXRDb21wYW55TmFtZSB9fTwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpc0RyYWZ0KCk7IGVsc2UgYmVoYXZpb3JUZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tc2VsZWN0IGZvcm0tc2VsZWN0LXNtXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJsZWcubGVnQmVoYXZpb3JcIlxuICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZUxlZ0JlaGF2aW9yKGxlZywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzTXV0YXRpbmdMZWdzXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGIgb2YgbGVnQmVoYXZpb3JzXCIgW25nVmFsdWVdPVwiYi52YWx1ZVwiPnt7IGIubGFiZWwgfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjYmVoYXZpb3JUZXh0Pnt7IGxlZ0JlaGF2aW9yc1tsZWcubGVnQmVoYXZpb3JdPy5sYWJlbCB9fTwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpc0RyYWZ0KCkgJiYgaXNDb25zdHJ1Y3Rpb25EcmFmdFNlbGVjdGFibGUobGVnKTsgZWxzZSB0YXJnZXREb2NUZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tc2VsZWN0IGZvcm0tc2VsZWN0LXNtXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJsZWcuc2VsZWN0ZWRDb25zdHJ1Y3Rpb25EcmFmdERvY1R5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZUxlZ0NvbnN0cnVjdGlvbkRyYWZ0RG9jVHlwZShsZWcsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc011dGF0aW5nTGVnc1wiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFtuZ1ZhbHVlXT1cIm51bGxcIj57eyAnRkJEb2N1bWVudEZsb3c6OlNlbGVjdFBsYWNlaG9sZGVyRWxsaXBzaXMnIHwgYWJwTG9jYWxpemF0aW9uIH19PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgbyBvZiBjb25zdHJ1Y3Rpb25EcmFmdERvY1R5cGVPcHRpb25zXCIgW25nVmFsdWVdPVwiby52YWx1ZVwiPnt7IG8ubGFiZWwgfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjdGFyZ2V0RG9jVGV4dD57eyBsZWdUYXJnZXREb2NMYWJlbChsZWcpIH19PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwibGVnLnJlc29sdmVkT3BjaENhcmRDb2RlXCI+e3sgbGVnLnJlc29sdmVkT3BjaENhcmRDb2RlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWxlZy5yZXNvbHZlZE9wY2hDYXJkQ29kZVwiIGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGFsaWduLWl0ZW1zLXN0YXJ0IHB5LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlIGJnLWRhbmdlclwiPnt7ICdGQkRvY3VtZW50Rmxvdzo6Tm90TWFwcGVkJyB8IGFicExvY2FsaXphdGlvbiB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLWRhbmdlciBidG4tc20gbXQtMiBweS0wIHB4LTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6IDAuNzJyZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImdvVG9QYXJ0bmVyTWFwcGluZyhsZWcpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCInRkJEb2N1bWVudEZsb3c6OkdvVG9QYXJ0bmVyTWFwcGluZ1Rvb2x0aXAnIHwgYWJwTG9jYWxpemF0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWxpbmsgbWUtMVwiPjwvaT57eyAnRkJEb2N1bWVudEZsb3c6Ok1hdGNoJyB8IGFicExvY2FsaXphdGlvbiB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXNEcmFmdCgpOyBlbHNlIGN1cnJlbmN5VGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0tY29udHJvbC1zbVwiXG4gICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogNS41cmVtXCJcbiAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImxlZy5jdXJyZW5jeVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIm5ld1N0YXRlPy5jdXJyZW5jeSB8fCAoJ0ZCRG9jdW1lbnRGbG93OjpGcm9tU291cmNlJyB8IGFicExvY2FsaXphdGlvbilcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2N1cnJlbmN5VGV4dD57eyBsZWcuY3VycmVuY3kgfHwgbmV3U3RhdGU/LmN1cnJlbmN5IH19PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXNEcmFmdCgpOyBlbHNlIHJhdGVUZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2wtc21cIlxuICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDZyZW1cIlxuICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwibGVnLmV4Y2hhbmdlUmF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidGQkRvY3VtZW50Rmxvdzo6RnJvbVNvdXJjZScgfCBhYnBMb2NhbGl6YXRpb25cIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3JhdGVUZXh0Pnt7IGxlZy5leGNoYW5nZVJhdGUgPz8gJy0nIH19PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICA8IS0tIFNwZWMgwqc5IC0gYXJ0xLFyxLFtIFlBTE5JWkNBIGJ1IGJhY2HEn8SxbiBvbHXFn3R1cmR1xJ91IGRldmFtIE3DvMWfdGVyaSBGYXR1cmFzxLFuYSAoYmlyXG4gICAgICAgICAgICAgICAgICAgICAgIHNvbnJha2kgYmFjYWsgdmFyc2EpIHV5Z3VsYW7EsXI7IGJ1IGhlbSBJbnRlcm1lZGlhdGVDaGFpbiBoZW0gQ29uc3RydWN0aW9uQ2hhaW4gacOnaW5cbiAgICAgICAgICAgICAgICAgICAgICAgZ2XDp2VybGlkaXIgKENvbnN0cnVjdGlvbidkYSBkYSBuZXh0VGFyZ2V0Q29tcGFueUlkLkhhc1ZhbHVlIGlzZSBkZXZhbSBPSU5WJ2lcbiAgICAgICAgICAgICAgICAgICAgICAgYXJ0xLFyxLFtbGEgb2x1xZ90dXJ1bHV5b3IpLiDDlm5jZWRlbiBDb25zdHJ1Y3Rpb24gYmFjYWtsYXLEsSBsZWdCZWhhdmlvcidhIGJha8SxbGFyYWtcbiAgICAgICAgICAgICAgICAgICAgICAgS0/FnlVMU1VaIFwiLVwiIGfDtnN0ZXJpeW9yZHUgLSB6aW5jaXJpbiBTT04gYmFjYcSfxLEgb2xtYXlhbiBiaXIgQ29uc3RydWN0aW9uIGJhY2HEn8SxbsSxblxuICAgICAgICAgICAgICAgICAgICAgICBoZWRlZmluZGUgYXJ0xLFyxLFtIG9yYW7EsSB0YW7EsW1zxLF6a2VuIGt1bGxhbsSxY8SxIGhpw6cgdXlhcsSxbG3EsXlvcmR1IChrb2QgaW5jZWxlbWVzaXlsZVxuICAgICAgICAgICAgICAgICAgICAgICB0ZXNwaXQgZWRpbGRpKS4gRG/En3J1IGtvxZ91bCBcInppbmNpcmluIHNvbiBiYWNhxJ/EsSBtxLFcIiAobGVnVGFyZ2V0RG9jTGFiZWwnZGFraVxuICAgICAgICAgICAgICAgICAgICAgICBpc0xhc3RMZWcgaWxlIGF5bsSxIG1hbnTEsWspLCBsZWdCZWhhdmlvciBkZcSfaWwuIC0tPlxuICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImxlZy5zZXF1ZW5jZU5vID49ICh3b3JraW5nQ29weT8ubGVncz8ubGVuZ3RoID8/IDApXCI+LTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxlZy5zZXF1ZW5jZU5vIDwgKHdvcmtpbmdDb3B5Py5sZWdzPy5sZW5ndGggPz8gMClcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImxlZy5pbmNyZWFzZVJhdGVBcHBsaWVkID8/IGxlZy5wbGFubmVkSW5jcmVhc2VSYXRlIGFzIHJhdGVcIj57eyByYXRlIHwgbnVtYmVyOiAnMS4yLTInIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtZGFuZ2VyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIShsZWcuaW5jcmVhc2VSYXRlQXBwbGllZCA/PyBsZWcucGxhbm5lZEluY3JlYXNlUmF0ZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIidGQkRvY3VtZW50Rmxvdzo6SW5jcmVhc2VSYXRlVW5kZWZpbmVkVG9vbHRpcCcgfCBhYnBMb2NhbGl6YXRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdGQkRvY3VtZW50Rmxvdzo6VW5kZWZpbmVkJyB8IGFicExvY2FsaXphdGlvbiB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiaXNEcmFmdCgpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtZGFuZ2VyXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlTGVnKGxlZylcIlxuICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc011dGF0aW5nTGVncyB8fCB3b3JraW5nQ29weS5sZWdzLmxlbmd0aCA8PSAxXCJcbiAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiJ0ZCRG9jdW1lbnRGbG93OjpEZWxldGVMZWdUb29sdGlwJyB8IGFicExvY2FsaXphdGlvblwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXRyYXNoXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJ0YWJsZS1saWdodFwiICpuZ0lmPVwiIWlzRHJhZnQoKVwiPlxuICAgICAgICAgICAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjlcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZmxleC13cmFwIGdhcC0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPnt7ICdGQkRvY3VtZW50Rmxvdzo6U3RhdHVzJyB8IGFicExvY2FsaXphdGlvbiB9fTo8L3N0cm9uZz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYmFkZ2UgbXMtMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5iZy1zZWNvbmRhcnldPVwibGVnLnN0YXR1cyA9PT0gMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5iZy1zdWNjZXNzXT1cImxlZy5zdGF0dXMgPT09IDFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYmctZGFuZ2VyXT1cImxlZy5zdGF0dXMgPT09IDJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYmctd2FybmluZ109XCJsZWcuc3RhdHVzID09PSAzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbGVnU3RhdHVzTGFiZWwobGVnLnN0YXR1cykgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJjcmVhdGVkRG9jdW1lbnRzU3VtbWFyeShsZWcpIGFzIGRvY3NcIj48c3Ryb25nPnt7ICdGQkRvY3VtZW50Rmxvdzo6UmVzdWx0RG9jdW1lbnRzJyB8IGFicExvY2FsaXphdGlvbiB9fTo8L3N0cm9uZz4ge3sgZG9jcyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJsZWcuZXJyb3JNZXNzYWdlXCI+PHN0cm9uZz57eyAnRkJEb2N1bWVudEZsb3c6OkVycm9yJyB8IGFicExvY2FsaXphdGlvbiB9fTo8L3N0cm9uZz4ge3sgbGVnLmVycm9yTWVzc2FnZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtcHJpbWFyeSBtcy1hdXRvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJleGVjdXRlTGVnKGxlZylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzRXhlY3V0aW5nIHx8ICFjYW5FeGVjdXRlTGVnKGxlZylcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXNFeGVjdXRpbmdcIiBjbGFzcz1cInNwaW5uZXItYm9yZGVyIHNwaW5uZXItYm9yZGVyLXNtIG1lLTFcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyAnRkJEb2N1bWVudEZsb3c6OkV4ZWN1dGUnIHwgYWJwTG9jYWxpemF0aW9uIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPHVsIGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbFwiICpuZ0lmPVwiaXNEcmFmdCgpXCI+XG4gICAgICAgICAgPGxpPnt7ICdGQkRvY3VtZW50Rmxvdzo6Tm90ZU51bUF0Q2FyZENhcnJ5T3ZlcicgfCBhYnBMb2NhbGl6YXRpb24gfX08L2xpPlxuICAgICAgICAgIDxsaT57eyAnRkJEb2N1bWVudEZsb3c6Ok5vdGVJbmNyZWFzZVJhdGVTY29wZScgfCBhYnBMb2NhbGl6YXRpb24gfX08L2xpPlxuICAgICAgICAgIDxsaT57eyAnRkJEb2N1bWVudEZsb3c6Ok5vdGVDYXJkQ29kZVJlc29sdXRpb24nIHwgYWJwTG9jYWxpemF0aW9uIH19PC9saT5cbiAgICAgICAgPC91bD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmQgZ2FwLTIgbXQtM1wiPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5XCIgKGNsaWNrKT1cImJhY2tUb0xpc3QoKVwiPnt7IChpc0RyYWZ0KCkgPyAnQWJwVWk6OkNhbmNlbCcgOiAnRkJEb2N1bWVudEZsb3c6OkNsb3NlJykgfCBhYnBMb2NhbGl6YXRpb24gfX08L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCJcbiAgICAgICAgICAoY2xpY2spPVwic3RhcnRGbG93KClcIlxuICAgICAgICAgICpuZ0lmPVwiaXNEcmFmdCgpICYmIHdvcmtpbmdDb3B5XCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNTdGFydGluZyB8fCBoYXNNaXNzaW5nQ29uc3RydWN0aW9uRHJhZnRTZWxlY3Rpb24oKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImlzU3RhcnRpbmdcIiBjbGFzcz1cInNwaW5uZXItYm9yZGVyIHNwaW5uZXItYm9yZGVyLXNtIG1lLTFcIj48L3NwYW4+XG4gICAgICAgICAge3sgJ0ZCRG9jdW1lbnRGbG93OjpTdGFydERvY3VtZW50RmxvdycgfCBhYnBMb2NhbGl6YXRpb24gfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
|