@hitsoft/smart-warehouse 1.0.1
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/README.md +24 -0
- package/config/enums/index.d.ts +1 -0
- package/config/enums/route-names.d.ts +12 -0
- package/config/index.d.ts +5 -0
- package/config/providers/connector-params-route.provider.d.ts +8 -0
- package/config/providers/index.d.ts +7 -0
- package/config/providers/order-station-route.provider.d.ts +8 -0
- package/config/providers/orders-route.provider.d.ts +8 -0
- package/config/providers/quantity-correction-route.provider.d.ts +8 -0
- package/config/providers/route.provider.d.ts +8 -0
- package/config/providers/shelf-placement-route.provider.d.ts +8 -0
- package/config/providers/shelf-transfer-route.provider.d.ts +8 -0
- package/config/providers/shortages-route.provider.d.ts +8 -0
- package/config/providers/station.provider.d.ts +8 -0
- package/config/providers/stock-report.d.ts +8 -0
- package/config/public-api.d.ts +3 -0
- package/config/smart-warehouse-config.module.d.ts +8 -0
- package/esm2020/config/enums/index.mjs +2 -0
- package/esm2020/config/enums/route-names.mjs +2 -0
- package/esm2020/config/hitsoft-smart-warehouse-config.mjs +5 -0
- package/esm2020/config/providers/connector-params-route.provider.mjs +25 -0
- package/esm2020/config/providers/index.mjs +8 -0
- package/esm2020/config/providers/order-station-route.provider.mjs +25 -0
- package/esm2020/config/providers/orders-route.provider.mjs +25 -0
- package/esm2020/config/providers/quantity-correction-route.provider.mjs +25 -0
- package/esm2020/config/providers/route.provider.mjs +24 -0
- package/esm2020/config/providers/shelf-placement-route.provider.mjs +25 -0
- package/esm2020/config/providers/shelf-transfer-route.provider.mjs +25 -0
- package/esm2020/config/providers/shortages-route.provider.mjs +25 -0
- package/esm2020/config/providers/station.provider.mjs +25 -0
- package/esm2020/config/providers/stock-report.mjs +25 -0
- package/esm2020/config/public-api.mjs +4 -0
- package/esm2020/config/smart-warehouse-config.module.mjs +37 -0
- package/esm2020/hitsoft-smart-warehouse.mjs +5 -0
- package/esm2020/lib/components/connector-params/connector-params.component.mjs +182 -0
- package/esm2020/lib/components/connector-params/connector-params.module.mjs +41 -0
- package/esm2020/lib/components/order-station/order-station.component.mjs +160 -0
- package/esm2020/lib/components/order-station/order-station.module.mjs +57 -0
- package/esm2020/lib/components/orders/orders.component.mjs +445 -0
- package/esm2020/lib/components/orders/orders.module.mjs +75 -0
- package/esm2020/lib/components/quantity-correction/quantity-correction.component.mjs +231 -0
- package/esm2020/lib/components/quantity-correction/quantity-correction.module.mjs +41 -0
- package/esm2020/lib/components/shelf-placement/shelf-placement.component.mjs +297 -0
- package/esm2020/lib/components/shelf-placement/shelf-placement.module.mjs +66 -0
- package/esm2020/lib/components/shelf-transfer/shelf-transfer.component.mjs +146 -0
- package/esm2020/lib/components/shelf-transfer/shelf-transfer.module.mjs +41 -0
- package/esm2020/lib/components/shortages/shortages.component.mjs +75 -0
- package/esm2020/lib/components/shortages/shortages.module.mjs +42 -0
- package/esm2020/lib/components/smart-warehouse.component.mjs +18 -0
- package/esm2020/lib/components/stock-report/stock-report.component.mjs +29 -0
- package/esm2020/lib/components/stock-report/stock-report.module.mjs +42 -0
- package/esm2020/lib/guards/connector-params.guard.mjs +58 -0
- package/esm2020/lib/hit-proxy/connector-params/connector-params.service.mjs +27 -0
- package/esm2020/lib/hit-proxy/devexpress-query-builder/devexpress-load-options.model.mjs +2 -0
- package/esm2020/lib/hit-proxy/devexpress-query-builder/devexpress-query-builder.mjs +62 -0
- package/esm2020/lib/hit-proxy/inventory/inventory.service.mjs +21 -0
- package/esm2020/lib/hit-proxy/order-station/order-station.service.mjs +18 -0
- package/esm2020/lib/hit-proxy/orders/model.mjs +2 -0
- package/esm2020/lib/hit-proxy/orders/order.service.mjs +81 -0
- package/esm2020/lib/hit-proxy/quantity-correction/quantity-correction.service.mjs +47 -0
- package/esm2020/lib/hit-proxy/shortages/model.mjs +2 -0
- package/esm2020/lib/hit-proxy/shortages/shortages.service.mjs +26 -0
- package/esm2020/lib/hit-proxy/stations/station.service.mjs +86 -0
- package/esm2020/lib/hit-proxy/stock-report/stock-report.service.mjs +22 -0
- package/esm2020/lib/hit-proxy/stock-transfer/stock-transfer.service.mjs +21 -0
- package/esm2020/lib/hit-proxy/warehouse/warehouse.service.mjs +65 -0
- package/esm2020/lib/services/smart-warehouse.service.mjs +21 -0
- package/esm2020/lib/smart-warehouse-routing.module.mjs +79 -0
- package/esm2020/lib/smart-warehouse.module.mjs +34 -0
- package/esm2020/lib/stations/station.component.mjs +43 -0
- package/esm2020/lib/stations/station.module.mjs +42 -0
- package/esm2020/public-api.mjs +20 -0
- package/fesm2015/hitsoft-smart-warehouse-config.mjs +264 -0
- package/fesm2015/hitsoft-smart-warehouse-config.mjs.map +1 -0
- package/fesm2015/hitsoft-smart-warehouse.mjs +2577 -0
- package/fesm2015/hitsoft-smart-warehouse.mjs.map +1 -0
- package/fesm2020/hitsoft-smart-warehouse-config.mjs +264 -0
- package/fesm2020/hitsoft-smart-warehouse-config.mjs.map +1 -0
- package/fesm2020/hitsoft-smart-warehouse.mjs +2515 -0
- package/fesm2020/hitsoft-smart-warehouse.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/components/connector-params/connector-params.component.d.ts +44 -0
- package/lib/components/connector-params/connector-params.module.d.ts +13 -0
- package/lib/components/order-station/order-station.component.d.ts +31 -0
- package/lib/components/order-station/order-station.module.d.ts +16 -0
- package/lib/components/orders/orders.component.d.ts +63 -0
- package/lib/components/orders/orders.module.d.ts +17 -0
- package/lib/components/quantity-correction/quantity-correction.component.d.ts +52 -0
- package/lib/components/quantity-correction/quantity-correction.module.d.ts +16 -0
- package/lib/components/shelf-placement/shelf-placement.component.d.ts +93 -0
- package/lib/components/shelf-placement/shelf-placement.module.d.ts +17 -0
- package/lib/components/shelf-transfer/shelf-transfer.component.d.ts +26 -0
- package/lib/components/shelf-transfer/shelf-transfer.module.d.ts +16 -0
- package/lib/components/shortages/shortages.component.d.ts +25 -0
- package/lib/components/shortages/shortages.module.d.ts +17 -0
- package/lib/components/smart-warehouse.component.d.ts +10 -0
- package/lib/components/stock-report/stock-report.component.d.ts +16 -0
- package/lib/components/stock-report/stock-report.module.d.ts +17 -0
- package/lib/guards/connector-params.guard.d.ts +21 -0
- package/lib/hit-proxy/connector-params/connector-params.service.d.ts +46 -0
- package/lib/hit-proxy/devexpress-query-builder/devexpress-load-options.model.d.ts +8 -0
- package/lib/hit-proxy/devexpress-query-builder/devexpress-query-builder.d.ts +17 -0
- package/lib/hit-proxy/inventory/inventory.service.d.ts +22 -0
- package/lib/hit-proxy/order-station/order-station.service.d.ts +24 -0
- package/lib/hit-proxy/orders/model.d.ts +74 -0
- package/lib/hit-proxy/orders/order.service.d.ts +26 -0
- package/lib/hit-proxy/quantity-correction/quantity-correction.service.d.ts +88 -0
- package/lib/hit-proxy/shortages/model.d.ts +17 -0
- package/lib/hit-proxy/shortages/shortages.service.d.ts +13 -0
- package/lib/hit-proxy/stations/station.service.d.ts +25 -0
- package/lib/hit-proxy/stock-report/stock-report.service.d.ts +12 -0
- package/lib/hit-proxy/stock-transfer/stock-transfer.service.d.ts +19 -0
- package/lib/hit-proxy/warehouse/warehouse.service.d.ts +59 -0
- package/lib/services/smart-warehouse.service.d.ts +10 -0
- package/lib/smart-warehouse-routing.module.d.ts +7 -0
- package/lib/smart-warehouse.module.d.ts +13 -0
- package/lib/stations/station.component.d.ts +14 -0
- package/lib/stations/station.module.d.ts +17 -0
- package/package.json +45 -0
- package/public-api.d.ts +16 -0
|
@@ -0,0 +1,445 @@
|
|
|
1
|
+
import { Component, ViewChild } from '@angular/core';
|
|
2
|
+
import DataSource from 'devextreme/data/data_source';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "../../hit-proxy/orders/order.service";
|
|
5
|
+
import * as i2 from "../../hit-proxy/warehouse/warehouse.service";
|
|
6
|
+
import * as i3 from "@abp/ng.theme.shared";
|
|
7
|
+
import * as i4 from "@angular/common";
|
|
8
|
+
import * as i5 from "@angular/forms";
|
|
9
|
+
import * as i6 from "devextreme-angular";
|
|
10
|
+
import * as i7 from "devextreme-angular/ui/nested";
|
|
11
|
+
import * as i8 from "devextreme-angular/core";
|
|
12
|
+
import * as i9 from "@abp/ng.components/page";
|
|
13
|
+
import * as i10 from "@abp/ng.core";
|
|
14
|
+
export class OrdersComponent {
|
|
15
|
+
constructor(orderService, warehouseService, toasterService, confirmationService) {
|
|
16
|
+
this.orderService = orderService;
|
|
17
|
+
this.warehouseService = warehouseService;
|
|
18
|
+
this.toasterService = toasterService;
|
|
19
|
+
this.confirmationService = confirmationService;
|
|
20
|
+
this.selectedOrders = [];
|
|
21
|
+
// Toolbar filters
|
|
22
|
+
this.selectedWarehouse = '';
|
|
23
|
+
this.selectedDate = new Date().toISOString().substring(0, 10);
|
|
24
|
+
this.activeListType = null; // null = tümü, '1' | '2' | '3'
|
|
25
|
+
this.activeStatus = null; // null = tümü, 'beklemede' (0) | 'onayBekliyor' (1) | 'isleniyor' (2) | 'tamamlandi' (3)
|
|
26
|
+
this.statusMap = {
|
|
27
|
+
beklemede: '0',
|
|
28
|
+
onayBekliyor: '1',
|
|
29
|
+
isleniyor: '2',
|
|
30
|
+
tamamlandi: '3',
|
|
31
|
+
};
|
|
32
|
+
// Additional inputs
|
|
33
|
+
this.customInputValue = '';
|
|
34
|
+
this.warehouses = [];
|
|
35
|
+
this.isLoadingWarehouses = false;
|
|
36
|
+
this.isGorevBaslatLoading = false;
|
|
37
|
+
this.isReservationLoading = false;
|
|
38
|
+
this.isBeeCellLoading = false;
|
|
39
|
+
this.bosKasaPopupVisible = false;
|
|
40
|
+
this.bosKasaStationId = 1;
|
|
41
|
+
this.bosKasaShelfId = 1;
|
|
42
|
+
this.bosKasaBoxCount = 5;
|
|
43
|
+
this.bosKasaMode = 'empty';
|
|
44
|
+
}
|
|
45
|
+
ngOnInit() {
|
|
46
|
+
this.loadWarehouses();
|
|
47
|
+
this.setupDataSource();
|
|
48
|
+
}
|
|
49
|
+
loadWarehouses() {
|
|
50
|
+
this.isLoadingWarehouses = true;
|
|
51
|
+
this.warehouseService.getSmartWarehouses().subscribe({
|
|
52
|
+
next: (data) => {
|
|
53
|
+
this.warehouses = data || [];
|
|
54
|
+
if (this.warehouses.length > 0) {
|
|
55
|
+
this.selectedWarehouse = this.warehouses[0].WhsCode;
|
|
56
|
+
}
|
|
57
|
+
this.isLoadingWarehouses = false;
|
|
58
|
+
},
|
|
59
|
+
error: (err) => {
|
|
60
|
+
console.error('Depolar yüklenemedi:', err);
|
|
61
|
+
this.toasterService.error('Depolar yüklenemedi.');
|
|
62
|
+
this.isLoadingWarehouses = false;
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
setupDataSource() {
|
|
67
|
+
this.ordersDataSource = new DataSource({
|
|
68
|
+
store: this.orderService.loadOrders,
|
|
69
|
+
filter: this.buildCombinedFilter(),
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
buildCombinedFilter() {
|
|
73
|
+
const statusFilter = this.buildStatusFilter();
|
|
74
|
+
const listTypeFilter = this.buildListTypeFilter();
|
|
75
|
+
if (statusFilter && listTypeFilter) {
|
|
76
|
+
return [statusFilter, 'and', listTypeFilter];
|
|
77
|
+
}
|
|
78
|
+
return statusFilter || listTypeFilter || null;
|
|
79
|
+
}
|
|
80
|
+
buildListTypeFilter() {
|
|
81
|
+
if (!this.activeListType) {
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
return ['U_SWOrderType', '=', this.activeListType];
|
|
85
|
+
}
|
|
86
|
+
buildStatusFilter() {
|
|
87
|
+
if (!this.activeStatus) {
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
if (this.activeStatus === 'beklemede') {
|
|
91
|
+
// SAP'dan gelen U_SWDurum null/boş değerler backend'de '0' olarak normalize ediliyor
|
|
92
|
+
return ['U_SWDurum', '=', '0'];
|
|
93
|
+
}
|
|
94
|
+
return ['U_SWDurum', '=', this.statusMap[this.activeStatus]];
|
|
95
|
+
}
|
|
96
|
+
toggleStatus(key) {
|
|
97
|
+
this.activeStatus = this.activeStatus === key ? null : key;
|
|
98
|
+
this.applyFilters();
|
|
99
|
+
}
|
|
100
|
+
toggleListType(key) {
|
|
101
|
+
this.activeListType = this.activeListType === key ? null : key;
|
|
102
|
+
this.applyFilters();
|
|
103
|
+
}
|
|
104
|
+
applyFilters() {
|
|
105
|
+
// Depo Talepleri de dahil, üç chip de aynı SAP siparişleri kaynağını (U_SWOrderType filtresiyle) kullanır.
|
|
106
|
+
// DataSource yeniden oluşturulup grid'e atanıyor; mevcut DataSource üzerinde .filter()+.reload()
|
|
107
|
+
// çağırmak grid'e yansımıyordu çünkü Angular binding sadece referans değişince tetikleniyor.
|
|
108
|
+
this.ordersDataSource = new DataSource({
|
|
109
|
+
store: this.orderService.loadOrders,
|
|
110
|
+
filter: this.buildCombinedFilter(),
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
onSelectionChanged(e) {
|
|
114
|
+
this.selectedOrders = e.selectedRowsData || [];
|
|
115
|
+
}
|
|
116
|
+
onRowClick(e) {
|
|
117
|
+
// Eğer expand/collapse icon'una veya checkbox'a tıklandıysa, DevExtreme'in kendi davranışını kullan
|
|
118
|
+
const target = e.event?.target;
|
|
119
|
+
if (target?.closest('.dx-command-expand') || target?.closest('.dx-master-detail-cell') || target?.closest('.dx-select-checkbox') || target?.closest('.dx-command-select')) {
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
if (e.rowType === 'data') {
|
|
123
|
+
const isExpanded = e.component.isRowExpanded(e.key);
|
|
124
|
+
if (isExpanded) {
|
|
125
|
+
e.component.collapseRow(e.key);
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
e.component.expandRow(e.key);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
onRowPrepared(e) {
|
|
133
|
+
if (e.rowType === 'data' && e.data?.U_SWIsError === 'Y') {
|
|
134
|
+
e.rowElement.classList.add('order-row-error');
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
onGorevBaslat() {
|
|
138
|
+
if (!this.selectedOrders || this.selectedOrders.length === 0) {
|
|
139
|
+
this.toasterService.warn('Lütfen en az bir sipariş seçiniz.');
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
// Validate: U_SWDurum must be "1" (Onay Bekliyor)
|
|
143
|
+
const invalidStatus = this.selectedOrders.filter(o => o.U_SWDurum !== '1');
|
|
144
|
+
if (invalidStatus.length > 0) {
|
|
145
|
+
const docNums = invalidStatus.map(o => o.DocNum).join(', ');
|
|
146
|
+
this.toasterService.error(`Şu siparişlerin durumu "Onay Bekliyor" değil: ${docNums}. Sadece eşlemesi yapılmış siparişler için görev başlatılabilir.`);
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
// Validate: U_SWStationCode must be filled
|
|
150
|
+
const noStation = this.selectedOrders.filter(o => !o.U_SWStationCode || o.U_SWStationCode.trim() === '');
|
|
151
|
+
if (noStation.length > 0) {
|
|
152
|
+
const docNums = noStation.map(o => o.DocNum).join(', ');
|
|
153
|
+
this.toasterService.error(`Şu siparişlerin istasyon bilgisi boş: ${docNums}. İstasyon alanı dolu olmalıdır.`);
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
const docEntries = this.selectedOrders.map(o => o.DocEntry);
|
|
157
|
+
this.isGorevBaslatLoading = true;
|
|
158
|
+
this.orderService.startTask(docEntries).subscribe({
|
|
159
|
+
next: (result) => {
|
|
160
|
+
this.toasterService.success(result);
|
|
161
|
+
this.isGorevBaslatLoading = false;
|
|
162
|
+
this.dxOrdersInstance?.instance?.refresh();
|
|
163
|
+
this.dxOrdersInstance?.instance?.clearSelection();
|
|
164
|
+
},
|
|
165
|
+
error: (error) => {
|
|
166
|
+
const errorMessage = error?.error?.error?.message || 'Görev başlatılırken bir hata oluştu.';
|
|
167
|
+
this.toasterService.error(errorMessage);
|
|
168
|
+
this.isGorevBaslatLoading = false;
|
|
169
|
+
},
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
// Görevi Tamamla: İşleniyor (2) durumundaki siparişleri BeeCell görevi bitmişse doğrudan
|
|
173
|
+
// Tamamlandı'ya (3) götürür — eski "Görev Tamamla" + "Onay Ver" iki adımı, eski sistemin
|
|
174
|
+
// tek-aksiyon davranışına uygun şekilde tek butonda birleştirir.
|
|
175
|
+
onOnayVer() {
|
|
176
|
+
if (!this.selectedOrders || this.selectedOrders.length === 0) {
|
|
177
|
+
this.toasterService.warn('Lütfen en az bir sipariş seçiniz.');
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
// Validate: U_SWDurum "2" (İşleniyor) olmalı
|
|
181
|
+
const invalidStatus = this.selectedOrders.filter(o => !o.U_SWDurum || o.U_SWDurum !== '2');
|
|
182
|
+
if (invalidStatus.length > 0) {
|
|
183
|
+
const docNums = invalidStatus.map(o => o.DocNum).join(', ');
|
|
184
|
+
this.toasterService.error(`Şu siparişlerin durumu "İşleniyor" değil: ${docNums}. Sadece bu durumdaki siparişler tamamlanabilir.`);
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
const docEntries = this.selectedOrders.map(o => o.DocEntry);
|
|
188
|
+
this.confirmationService
|
|
189
|
+
.warn('Seçili siparişler tamamlanacak. Stok nakli ve fatura oluşturulacaktır. Emin misiniz?', 'Görevi Tamamla')
|
|
190
|
+
.subscribe((status) => {
|
|
191
|
+
if (status === 'confirm') {
|
|
192
|
+
this.orderService.approveTask(docEntries, this.activeListType).subscribe({
|
|
193
|
+
next: (result) => {
|
|
194
|
+
this.toasterService.success(result);
|
|
195
|
+
this.dxOrdersInstance?.instance?.refresh();
|
|
196
|
+
this.dxOrdersInstance?.instance?.clearSelection();
|
|
197
|
+
},
|
|
198
|
+
error: (error) => {
|
|
199
|
+
const errorMessage = error?.error?.error?.message || 'Onay verilirken bir hata oluştu.';
|
|
200
|
+
this.toasterService.error(errorMessage);
|
|
201
|
+
},
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
// ── Sipariş(ler)i sevkiyata sokmadan doğrudan kapat ──
|
|
207
|
+
onSiparisKapat() {
|
|
208
|
+
if (!this.selectedOrders || this.selectedOrders.length === 0) {
|
|
209
|
+
this.toasterService.warn('Lütfen en az bir sipariş seçiniz.');
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
// "İşleniyor" (aktif BeeCell görevi) durumundaki siparişler kapatılamaz
|
|
213
|
+
const invalidStatus = this.selectedOrders.filter(o => o.U_SWDurum === '2');
|
|
214
|
+
if (invalidStatus.length > 0) {
|
|
215
|
+
const docNums = invalidStatus.map(o => o.DocNum).join(', ');
|
|
216
|
+
this.toasterService.error(`Şu siparişler "İşleniyor" durumunda (aktif görev var): ${docNums}. Önce görevi tamamlayın ya da BeeCell'de iptal edin.`);
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
const docEntries = this.selectedOrders.map(o => o.DocEntry);
|
|
220
|
+
const docNums = this.selectedOrders.map(o => o.DocNum).join(', ');
|
|
221
|
+
this.confirmationService
|
|
222
|
+
.warn(`${docNums} numaralı siparişler sevkiyata sokulmadan doğrudan "Tamamlandı" olarak kapatılacak. ` +
|
|
223
|
+
'Hiçbir stok hareketi/irsaliye/fatura oluşturulmayacak. Emin misiniz?', 'Sipariş Kapat')
|
|
224
|
+
.subscribe((status) => {
|
|
225
|
+
if (status === 'confirm') {
|
|
226
|
+
this.orderService.closeOrder(docEntries).subscribe({
|
|
227
|
+
next: (result) => {
|
|
228
|
+
this.toasterService.success(result);
|
|
229
|
+
this.dxOrdersInstance?.instance?.refresh();
|
|
230
|
+
this.dxOrdersInstance?.instance?.clearSelection();
|
|
231
|
+
},
|
|
232
|
+
error: (error) => {
|
|
233
|
+
const errorMessage = error?.error?.error?.message || 'Sipariş kapatılırken bir hata oluştu.';
|
|
234
|
+
this.toasterService.error(errorMessage);
|
|
235
|
+
},
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
onBosKasaGetir() {
|
|
241
|
+
this.bosKasaMode = 'empty';
|
|
242
|
+
this.bosKasaPopupVisible = true;
|
|
243
|
+
}
|
|
244
|
+
onYarimKasa() {
|
|
245
|
+
this.bosKasaMode = 'half';
|
|
246
|
+
this.bosKasaPopupVisible = true;
|
|
247
|
+
}
|
|
248
|
+
onBosKasaGonder() {
|
|
249
|
+
this.bosKasaPopupVisible = false;
|
|
250
|
+
this.isBeeCellLoading = true;
|
|
251
|
+
const call = this.bosKasaMode === 'empty'
|
|
252
|
+
? this.orderService.getEmptyBoxes(this.bosKasaStationId, this.bosKasaShelfId, this.bosKasaBoxCount, this.selectedWarehouse)
|
|
253
|
+
: this.orderService.getHalfBoxes(this.bosKasaStationId, this.bosKasaShelfId, this.bosKasaBoxCount, this.selectedWarehouse);
|
|
254
|
+
call.subscribe({
|
|
255
|
+
next: (result) => {
|
|
256
|
+
this.toasterService.success(result);
|
|
257
|
+
this.isBeeCellLoading = false;
|
|
258
|
+
},
|
|
259
|
+
error: (error) => {
|
|
260
|
+
const errorMessage = error?.error?.error?.message || 'BeeCell görevi oluşturulurken hata oluştu.';
|
|
261
|
+
this.toasterService.error(errorMessage);
|
|
262
|
+
this.isBeeCellLoading = false;
|
|
263
|
+
},
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
onDurumGuncelle() {
|
|
267
|
+
if (!this.selectedOrders || this.selectedOrders.length === 0) {
|
|
268
|
+
this.toasterService.warn('Lütfen en az bir sipariş seçiniz.');
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
271
|
+
const docEntries = this.selectedOrders.map(o => o.DocEntry);
|
|
272
|
+
this.isBeeCellLoading = true;
|
|
273
|
+
this.orderService.updateTaskStatus(docEntries).subscribe({
|
|
274
|
+
next: (result) => {
|
|
275
|
+
this.toasterService.success(result);
|
|
276
|
+
this.isBeeCellLoading = false;
|
|
277
|
+
this.dxOrdersInstance?.instance?.refresh();
|
|
278
|
+
},
|
|
279
|
+
error: (error) => {
|
|
280
|
+
const errorMessage = error?.error?.error?.message || 'Durum güncellenirken hata oluştu.';
|
|
281
|
+
this.toasterService.error(errorMessage);
|
|
282
|
+
this.isBeeCellLoading = false;
|
|
283
|
+
},
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
// ── Seçili siparişler için rezervasyon yap ──
|
|
287
|
+
onRezervasyonYap() {
|
|
288
|
+
if (!this.selectedOrders || this.selectedOrders.length === 0) {
|
|
289
|
+
this.toasterService.warn('Lütfen en az bir sipariş seçiniz.');
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
if (!this.selectedWarehouse) {
|
|
293
|
+
this.toasterService.warn('Lütfen bir depo seçiniz.');
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
// Sadece Beklemede (0) siparişler için rezervasyon yapılabilir
|
|
297
|
+
const invalidStatus = this.selectedOrders.filter(o => o.U_SWDurum && o.U_SWDurum !== '0');
|
|
298
|
+
if (invalidStatus.length > 0) {
|
|
299
|
+
const docNums = invalidStatus.map(o => o.DocNum).join(', ');
|
|
300
|
+
this.toasterService.error(`Şu siparişlerin durumu "Beklemede" değil: ${docNums}. Sadece beklemede olan siparişler için rezervasyon yapılabilir.`);
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
const docEntries = this.selectedOrders.map(o => o.DocEntry);
|
|
304
|
+
this.isReservationLoading = true;
|
|
305
|
+
this.orderService.reserveOrders(docEntries, this.selectedWarehouse).subscribe({
|
|
306
|
+
next: (result) => {
|
|
307
|
+
this.handleReservationResult(result);
|
|
308
|
+
this.isReservationLoading = false;
|
|
309
|
+
this.dxOrdersInstance?.instance?.refresh();
|
|
310
|
+
this.dxOrdersInstance?.instance?.clearSelection();
|
|
311
|
+
},
|
|
312
|
+
error: (error) => {
|
|
313
|
+
const errorMessage = error?.error?.error?.message || 'Rezervasyon yapılırken bir hata oluştu.';
|
|
314
|
+
this.toasterService.error(errorMessage);
|
|
315
|
+
this.isReservationLoading = false;
|
|
316
|
+
},
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
// ── Seçili siparişlerin rezervasyonlarını sil ──
|
|
320
|
+
onRezervasyonSil() {
|
|
321
|
+
if (!this.selectedOrders || this.selectedOrders.length === 0) {
|
|
322
|
+
this.toasterService.warn('Lütfen en az bir sipariş seçiniz.');
|
|
323
|
+
return;
|
|
324
|
+
}
|
|
325
|
+
const docEntries = this.selectedOrders.map(o => o.DocEntry);
|
|
326
|
+
const docNums = this.selectedOrders.map(o => o.DocNum).join(', ');
|
|
327
|
+
this.confirmationService
|
|
328
|
+
.warn(`${docNums} numaralı siparişlerin rezervasyonları iptal edilecektir. Emin misiniz?`, 'Rezervasyon İptal')
|
|
329
|
+
.subscribe((status) => {
|
|
330
|
+
if (status === 'confirm') {
|
|
331
|
+
this.isReservationLoading = true;
|
|
332
|
+
this.orderService.cancelReservations(docEntries).subscribe({
|
|
333
|
+
next: (result) => {
|
|
334
|
+
this.handleReservationResult(result);
|
|
335
|
+
this.isReservationLoading = false;
|
|
336
|
+
this.dxOrdersInstance?.instance?.refresh();
|
|
337
|
+
this.dxOrdersInstance?.instance?.clearSelection();
|
|
338
|
+
},
|
|
339
|
+
error: (error) => {
|
|
340
|
+
const errorMessage = error?.error?.error?.message || 'Rezervasyon iptal edilirken bir hata oluştu.';
|
|
341
|
+
this.toasterService.error(errorMessage);
|
|
342
|
+
this.isReservationLoading = false;
|
|
343
|
+
},
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
// ── Toplu rezervasyon yap (tüm uygun siparişler) ──
|
|
349
|
+
onTopluRezervasyonYap() {
|
|
350
|
+
if (!this.selectedWarehouse) {
|
|
351
|
+
this.toasterService.warn('Lütfen bir depo seçiniz.');
|
|
352
|
+
return;
|
|
353
|
+
}
|
|
354
|
+
// Zaten rezervasyonu olan siparişler için kullanıcıya seçim sun:
|
|
355
|
+
// - "Yeniden Hesapla" (confirm) → mevcut rezervasyonları silip yeniden kurar (overwriteExisting=true)
|
|
356
|
+
// - "Sadece Yeni Siparişler" (reject) → mevcutları korur, yalnızca rezervasyonsuzları işler (false)
|
|
357
|
+
// - Diyaloğu kapatma (dismiss) → işlemi iptal eder
|
|
358
|
+
this.confirmationService
|
|
359
|
+
.warn('Zaten rezervasyonu olan siparişler için ne yapılsın? "Yeniden Hesapla" mevcut rezervasyonları silip yeniden kurar; ' +
|
|
360
|
+
'"Sadece Yeni Siparişler" mevcutları korur ve yalnızca rezervasyonsuz siparişleri işler.', 'Toplu Rezervasyon', { yesText: 'Yeniden Hesapla', cancelText: 'Sadece Yeni Siparişler', dismissible: true })
|
|
361
|
+
.subscribe((status) => {
|
|
362
|
+
if (status === 'dismiss') {
|
|
363
|
+
return; // iptal
|
|
364
|
+
}
|
|
365
|
+
const overwriteExisting = status === 'confirm';
|
|
366
|
+
this.isReservationLoading = true;
|
|
367
|
+
this.orderService.reserveAllOrders(this.selectedWarehouse, this.activeListType, overwriteExisting).subscribe({
|
|
368
|
+
next: (result) => {
|
|
369
|
+
this.handleReservationResult(result);
|
|
370
|
+
this.isReservationLoading = false;
|
|
371
|
+
this.dxOrdersInstance?.instance?.refresh();
|
|
372
|
+
this.dxOrdersInstance?.instance?.clearSelection();
|
|
373
|
+
},
|
|
374
|
+
error: (error) => {
|
|
375
|
+
const errorMessage = error?.error?.error?.message || 'Toplu rezervasyon yapılırken bir hata oluştu.';
|
|
376
|
+
this.toasterService.error(errorMessage);
|
|
377
|
+
this.isReservationLoading = false;
|
|
378
|
+
},
|
|
379
|
+
});
|
|
380
|
+
});
|
|
381
|
+
}
|
|
382
|
+
// ── Toplu rezervasyon sil (tüm aktif rezervasyonlar) ──
|
|
383
|
+
onTumRezervasyonlariSil() {
|
|
384
|
+
this.confirmationService
|
|
385
|
+
.warn('Tüm aktif rezervasyonlar silinecektir. Emin misiniz?', 'Tüm Rezervasyonları Sil')
|
|
386
|
+
.subscribe((status) => {
|
|
387
|
+
if (status === 'confirm') {
|
|
388
|
+
this.isReservationLoading = true;
|
|
389
|
+
this.orderService.cancelAllReservations(this.activeListType).subscribe({
|
|
390
|
+
next: (result) => {
|
|
391
|
+
this.handleReservationResult(result);
|
|
392
|
+
this.isReservationLoading = false;
|
|
393
|
+
this.dxOrdersInstance?.instance?.refresh();
|
|
394
|
+
this.dxOrdersInstance?.instance?.clearSelection();
|
|
395
|
+
},
|
|
396
|
+
error: (error) => {
|
|
397
|
+
const errorMessage = error?.error?.error?.message || 'Rezervasyonlar silinirken bir hata oluştu.';
|
|
398
|
+
this.toasterService.error(errorMessage);
|
|
399
|
+
this.isReservationLoading = false;
|
|
400
|
+
},
|
|
401
|
+
});
|
|
402
|
+
}
|
|
403
|
+
});
|
|
404
|
+
}
|
|
405
|
+
handleReservationResult(result) {
|
|
406
|
+
const shortsOrders = result.OrderResults?.filter(r => r.Shorts && r.Shorts.length > 0) || [];
|
|
407
|
+
const hasShorts = shortsOrders.length > 0;
|
|
408
|
+
if (result.FailCount === 0 && !hasShorts) {
|
|
409
|
+
this.toasterService.success(result.Summary);
|
|
410
|
+
}
|
|
411
|
+
else if (result.SuccessCount > 0) {
|
|
412
|
+
this.toasterService.warn(result.Summary);
|
|
413
|
+
}
|
|
414
|
+
else {
|
|
415
|
+
this.toasterService.error(result.Summary);
|
|
416
|
+
}
|
|
417
|
+
// Eksik kalemler varsa detay göster
|
|
418
|
+
if (hasShorts) {
|
|
419
|
+
const totalShortItems = shortsOrders.reduce((sum, o) => sum + o.Shorts.length, 0);
|
|
420
|
+
const shortMessage = totalShortItems > OrdersComponent.MAX_SHORT_ITEMS_DETAILED
|
|
421
|
+
? `Kalem miktarları eksik (${shortsOrders.length} sipariş, ${totalShortItems} kalem).`
|
|
422
|
+
: `Eksik Kalemler:\n${shortsOrders
|
|
423
|
+
.map(o => `Sipariş ${o.DocNum}: ${o.Shorts.map(s => `${s.ItemCode} (eksik: ${s.ShortQty})`).join(', ')}`)
|
|
424
|
+
.join('\n')}`;
|
|
425
|
+
this.toasterService.warn(shortMessage);
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
onRefresh() {
|
|
429
|
+
this.dxOrdersInstance?.instance?.refresh();
|
|
430
|
+
}
|
|
431
|
+
onExportExcel() {
|
|
432
|
+
// TODO: Implement
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
OrdersComponent.MAX_SHORT_ITEMS_DETAILED = 5;
|
|
436
|
+
OrdersComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: OrdersComponent, deps: [{ token: i1.OrderService }, { token: i2.WarehouseService }, { token: i3.ToasterService }, { token: i3.ConfirmationService }], target: i0.ɵɵFactoryTarget.Component });
|
|
437
|
+
OrdersComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: OrdersComponent, selector: "lib-orders", viewQueries: [{ propertyName: "dxOrdersInstance", first: true, predicate: ["dxOrdersInstance"], descendants: true }], ngImport: i0, template: "<abp-page [title]=\"'SmartWarehouse::Orders' | abpLocalization\">\r\n\r\n <!-- Toolbar -->\r\n <div class=\"orders-toolbar\">\r\n <!-- Row 1: Filters -->\r\n <div class=\"toolbar-row\">\r\n <div class=\"toolbar-group\">\r\n <label>Sipari\u015F Grubu</label>\r\n <div class=\"status-group\">\r\n <span class=\"status-chip list-purchase\" [class.active]=\"activeListType === '1'\"\r\n (click)=\"toggleListType('1')\">\r\n <i class=\"fa fa-shopping-cart\"></i> Sanayi Sipari\u015Fleri\r\n </span>\r\n <span class=\"status-chip list-distribution\" [class.active]=\"activeListType === '2'\"\r\n (click)=\"toggleListType('2')\">\r\n <i class=\"fa fa-truck\"></i> Da\u011F\u0131t\u0131m Sipari\u015Fleri\r\n </span>\r\n <span class=\"status-chip list-warehouse\" [class.active]=\"activeListType === '3'\"\r\n (click)=\"toggleListType('3')\">\r\n <i class=\"fa fa-warehouse\"></i> Depo Talepleri\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"toolbar-group toolbar-group--durum\">\r\n <label>Durum</label>\r\n <div class=\"status-group\">\r\n <span class=\"status-chip pending\" [class.active]=\"activeStatus === 'beklemede'\"\r\n (click)=\"toggleStatus('beklemede')\">\r\n <i class=\"fa fa-clock\"></i> Beklemede\r\n </span>\r\n <span class=\"status-chip processing\" [class.active]=\"activeStatus === 'isleniyor'\"\r\n (click)=\"toggleStatus('isleniyor')\">\r\n <i class=\"fa fa-spinner\"></i> \u0130\u015Fleniyor\r\n </span>\r\n <span class=\"status-chip awaiting\" [class.active]=\"activeStatus === 'onayBekliyor'\"\r\n (click)=\"toggleStatus('onayBekliyor')\">\r\n <i class=\"fa fa-hourglass-half\"></i> Onay Bekliyor\r\n </span>\r\n <span class=\"status-chip completed\" [class.active]=\"activeStatus === 'tamamlandi'\"\r\n (click)=\"toggleStatus('tamamlandi')\">\r\n <i class=\"fa fa-check-circle\"></i> Tamamland\u0131\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"toolbar-group toolbar-group--depo\">\r\n <label>Depo</label>\r\n <select [(ngModel)]=\"selectedWarehouse\" class=\"form-select\">\r\n <option value=\"\">T\u00FCm\u00FC</option>\r\n <option *ngFor=\"let wh of warehouses\" [value]=\"wh.WhsCode\">{{ wh.WhsName }}</option>\r\n </select>\r\n </div>\r\n </div>\r\n\r\n <hr class=\"toolbar-divider\" />\r\n\r\n <!-- Row 3: Action input + related buttons | Reservation | Refresh/Excel -->\r\n <div class=\"toolbar-row\">\r\n <div class=\"action-group\">\r\n <button class=\"btn btn-action-primary btn-sm\" (click)=\"onGorevBaslat()\" [disabled]=\"isGorevBaslatLoading\">\r\n <i class=\"fa fa-plus-circle\"></i> G\u00F6rev Ba\u015Flat\r\n </button>\r\n <button class=\"btn btn-action-approve btn-sm\" (click)=\"onOnayVer()\">\r\n <i class=\"fa fa-thumbs-up\"></i> G\u00F6revi Tamamla\r\n </button>\r\n <button class=\"btn btn-action-danger btn-sm\" (click)=\"onSiparisKapat()\">\r\n <i class=\"fa fa-times-circle\"></i> Sipari\u015F Kapat\r\n </button>\r\n <button class=\"btn btn-action-sync btn-sm\" (click)=\"onDurumGuncelle()\" [disabled]=\"isBeeCellLoading\">\r\n <i class=\"fa fa-sync-alt\"></i> Durum G\u00FCncelle\r\n </button>\r\n <button class=\"btn btn-action-info btn-sm\" (click)=\"onBosKasaGetir()\" [disabled]=\"isBeeCellLoading\">\r\n <i class=\"fa fa-box-open\"></i> Bo\u015F Kasa Getir\r\n </button>\r\n <button class=\"btn btn-action-warning btn-sm\" (click)=\"onYarimKasa()\" [disabled]=\"isBeeCellLoading\">\r\n <i class=\"fa fa-box\"></i> Yar\u0131m Kasa Getir\r\n </button>\r\n <span class=\"action-divider\"></span>\r\n <button class=\"btn btn-action-reservation btn-sm\" (click)=\"onRezervasyonYap()\" [disabled]=\"isReservationLoading\">\r\n <i class=\"fa fa-lock\"></i> Rezervasyon Yap\r\n </button>\r\n <button class=\"btn btn-action-reservation-cancel btn-sm\" (click)=\"onRezervasyonSil()\" [disabled]=\"isReservationLoading\">\r\n <i class=\"fa fa-unlock\"></i> Rezervasyon Sil\r\n </button>\r\n <button class=\"btn btn-action-reservation-bulk btn-sm\" (click)=\"onTopluRezervasyonYap()\" [disabled]=\"isReservationLoading\">\r\n <i class=\"fa fa-lock\"></i> Toplu Rez. Yap\r\n </button>\r\n <button class=\"btn btn-action-reservation-bulk-cancel btn-sm\" (click)=\"onTumRezervasyonlariSil()\" [disabled]=\"isReservationLoading\">\r\n <i class=\"fa fa-unlock\"></i> Toplu Rez. Sil\r\n </button>\r\n <span class=\"action-divider\"></span>\r\n <button class=\"btn btn-action-secondary btn-sm\" (click)=\"onRefresh()\">\r\n <i class=\"fa fa-redo\"></i> Yenile\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Data Grid -->\r\n <div class=\"card orders-grid-card\">\r\n <div class=\"card-body\">\r\n <dx-data-grid\r\n #dxOrdersInstance\r\n [dataSource]=\"ordersDataSource\"\r\n [showRowLines]=\"true\"\r\n [showBorders]=\"true\"\r\n [remoteOperations]=\"true\"\r\n [hoverStateEnabled]=\"true\"\r\n [repaintChangesOnly]=\"true\"\r\n [allowColumnResizing]=\"true\"\r\n columnResizingMode=\"widget\"\r\n [allowColumnReordering]=\"true\"\r\n [columnAutoWidth]=\"true\"\r\n [columnHidingEnabled]=\"true\"\r\n (onRowClick)=\"onRowClick($event)\"\r\n (onSelectionChanged)=\"onSelectionChanged($event)\"\r\n (onRowPrepared)=\"onRowPrepared($event)\"\r\n style=\"height: 60vh\"\r\n >\r\n <dxo-pager\r\n [visible]=\"true\"\r\n [showInfo]=\"true\"\r\n [allowedPageSizes]=\"[5, 10, 20]\"\r\n [showNavigationButtons]=\"true\"\r\n [showPageSizeSelector]=\"true\"\r\n >\r\n </dxo-pager>\r\n <dxo-paging [pageSize]=\"10\"></dxo-paging>\r\n <dxo-column-chooser\r\n [allowSearch]=\"true\"\r\n [enabled]=\"true\"\r\n mode=\"select\"\r\n ></dxo-column-chooser>\r\n <dxo-column-fixing [enabled]=\"true\"></dxo-column-fixing>\r\n <dxo-header-filter [allowSearch]=\"true\" [visible]=\"true\"></dxo-header-filter>\r\n <dxo-filter-row [visible]=\"true\"></dxo-filter-row>\r\n <dxo-export [enabled]=\"true\" [allowExportSelectedData]=\"false\"></dxo-export>\r\n <dxo-filter-builder [allowHierarchicalFields]=\"true\"></dxo-filter-builder>\r\n <dxo-filter-panel [visible]=\"true\"></dxo-filter-panel>\r\n <dxo-sorting mode=\"single\"></dxo-sorting>\r\n <dxo-scrolling mode=\"standard\" showScrollbar=\"always\"></dxo-scrolling>\r\n <dxo-selection\r\n mode=\"multiple\"\r\n showCheckBoxesMode=\"always\"\r\n [allowSelectAll]=\"true\"\r\n ></dxo-selection>\r\n\r\n <dxi-column\r\n dataField=\"DocNum\"\r\n caption=\"{{ 'SmartWarehouse::Order:DocNum' | abpLocalization }}\"\r\n [width]=\"110\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"CardCode\"\r\n caption=\"{{ 'SmartWarehouse::Order:CardCode' | abpLocalization }}\"\r\n [width]=\"140\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"CardName\"\r\n caption=\"{{ 'SmartWarehouse::Order:CardName' | abpLocalization }}\"\r\n [width]=\"220\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"DocDate\"\r\n caption=\"{{ 'SmartWarehouse::Order:DocDate' | abpLocalization }}\"\r\n dataType=\"date\"\r\n format=\"dd.MM.yyyy\"\r\n [width]=\"120\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"DocDueDate\"\r\n caption=\"{{ 'SmartWarehouse::Order:DocDueDate' | abpLocalization }}\"\r\n dataType=\"date\"\r\n format=\"dd.MM.yyyy\"\r\n [width]=\"120\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"U_SWTalepTarihi\"\r\n caption=\"{{ 'SmartWarehouse::Order:U_SWTalepTarihi' | abpLocalization }}\"\r\n dataType=\"date\"\r\n format=\"dd.MM.yyyy\"\r\n [width]=\"130\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"U_SWDurum\"\r\n caption=\"{{ 'SmartWarehouse::Order:U_SWDurum' | abpLocalization }}\"\r\n [width]=\"110\"\r\n cellTemplate=\"swDurumTemplate\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"U_SWIsError\"\r\n caption=\"{{ 'SmartWarehouse::Order:U_SWIsError' | abpLocalization }}\"\r\n [width]=\"50\"\r\n cellTemplate=\"errorTemplate\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"U_SWErrorMessage\"\r\n caption=\"{{ 'SmartWarehouse::Order:U_SWErrorMessage' | abpLocalization }}\"\r\n [width]=\"260\"\r\n cellTemplate=\"errorMessageTemplate\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"OwnerCode\"\r\n caption=\"{{ 'SmartWarehouse::Order:OwnerCode' | abpLocalization }}\"\r\n [width]=\"120\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"Comments\"\r\n caption=\"{{ 'SmartWarehouse::Order:Comments' | abpLocalization }}\"\r\n [width]=\"200\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"U_SWGonderildi\"\r\n caption=\"{{ 'SmartWarehouse::Order:U_SWGonderildi' | abpLocalization }}\"\r\n [width]=\"110\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"U_SWStationCode\"\r\n caption=\"{{ 'SmartWarehouse::Order:U_SWStationCode' | abpLocalization }}\"\r\n [width]=\"120\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"U_SWEyeCode\"\r\n caption=\"{{ 'SmartWarehouse::Order:U_SWEyeCode' | abpLocalization }}\"\r\n [width]=\"140\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"U_SWOrderType\"\r\n caption=\"{{ 'SmartWarehouse::Order:U_SWOrderType' | abpLocalization }}\"\r\n [width]=\"160\"\r\n cellTemplate=\"orderTypeTemplate\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"NumAtCard\"\r\n caption=\"{{ 'SmartWarehouse::Order:NumAtCard' | abpLocalization }}\"\r\n [width]=\"140\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"DocTotal\"\r\n caption=\"{{ 'SmartWarehouse::Order:DocTotal' | abpLocalization }}\"\r\n dataType=\"number\"\r\n format=\"#,##0.00\"\r\n [width]=\"130\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"DocCur\"\r\n caption=\"{{ 'SmartWarehouse::Order:DocCur' | abpLocalization }}\"\r\n [width]=\"90\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"DocStatus\"\r\n caption=\"{{ 'SmartWarehouse::Order:DocStatus' | abpLocalization }}\"\r\n [width]=\"90\"\r\n cellTemplate=\"statusTemplate\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"DocEntry\"\r\n caption=\"{{ 'SmartWarehouse::Order:DocEntry' | abpLocalization }}\"\r\n [width]=\"100\"\r\n ></dxi-column>\r\n\r\n <div *dxTemplate=\"let cell of 'statusTemplate'\">\r\n <span\r\n class=\"badge\"\r\n [ngClass]=\"{\r\n 'bg-success': cell.value === 'O',\r\n 'bg-secondary': cell.value === 'C'\r\n }\"\r\n >\r\n {{ cell.value === 'O' ? 'A\u00E7\u0131k' : 'Kapal\u0131' }}\r\n </span>\r\n </div>\r\n\r\n <div *dxTemplate=\"let cell of 'swDurumTemplate'\">\r\n <span\r\n class=\"badge\"\r\n [ngClass]=\"{\r\n 'bg-warning': cell.value === '0' || !cell.value,\r\n 'bg-info': cell.value === '1',\r\n 'bg-primary': cell.value === '2',\r\n 'bg-success': cell.value === '3'\r\n }\"\r\n >\r\n {{\r\n cell.value === '1' ? 'Onay Bekliyor' :\r\n cell.value === '2' ? '\u0130\u015Fleniyor' :\r\n cell.value === '3' ? 'Tamamland\u0131' : 'Beklemede'\r\n }}\r\n </span>\r\n </div>\r\n\r\n <div *dxTemplate=\"let cell of 'errorTemplate'\">\r\n <i\r\n *ngIf=\"cell.value === 'Y'\"\r\n class=\"fa fa-exclamation-triangle text-danger\"\r\n [title]=\"cell.data.U_SWErrorMessage\"\r\n ></i>\r\n </div>\r\n\r\n <div *dxTemplate=\"let cell of 'errorMessageTemplate'\">\r\n <span\r\n *ngIf=\"cell.data.U_SWIsError === 'Y'\"\r\n class=\"error-message-cell\"\r\n [title]=\"cell.value\"\r\n >{{ cell.value }}</span>\r\n </div>\r\n\r\n <div *dxTemplate=\"let cell of 'orderTypeTemplate'\">\r\n <span class=\"badge bg-secondary\">\r\n {{\r\n cell.value === '1' ? 'Sanayi Sipari\u015Fleri' :\r\n cell.value === '2' ? 'Da\u011F\u0131t\u0131m Sipari\u015Fleri' :\r\n cell.value === '3' ? 'Depo Talepleri' : '-'\r\n }}\r\n </span>\r\n </div>\r\n\r\n <!-- Master-Detail: Sipari\u015F Sat\u0131rlar\u0131 -->\r\n <dxo-master-detail [enabled]=\"true\" template=\"orderLinesTemplate\"></dxo-master-detail>\r\n\r\n <div *dxTemplate=\"let detail of 'orderLinesTemplate'\">\r\n <div class=\"p-3\">\r\n <h6 class=\"mb-3\">\r\n <i class=\"fa fa-list me-1\"></i>\r\n {{ 'SmartWarehouse::Order:DocNum' | abpLocalization }}:\r\n {{ detail.data.DocNum }} - Sipari\u015F Sat\u0131rlar\u0131\r\n </h6>\r\n <dx-data-grid\r\n [dataSource]=\"detail.data.DocumentLines\"\r\n [showRowLines]=\"true\"\r\n [showBorders]=\"true\"\r\n [columnAutoWidth]=\"true\"\r\n [hoverStateEnabled]=\"true\"\r\n [rowAlternationEnabled]=\"true\"\r\n >\r\n <dxi-column\r\n dataField=\"LineNum\"\r\n caption=\"{{ 'SmartWarehouse::Order:LineNum' | abpLocalization }}\"\r\n [width]=\"70\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"ItemCode\"\r\n caption=\"{{ 'SmartWarehouse::Order:ItemCode' | abpLocalization }}\"\r\n [width]=\"140\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"ItemDescription\"\r\n caption=\"Kalem Ad\u0131\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"Quantity\"\r\n caption=\"{{ 'SmartWarehouse::Order:Quantity' | abpLocalization }}\"\r\n dataType=\"number\"\r\n format=\"#,##0.##\"\r\n [width]=\"100\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"U_SWTeslimMiktar\"\r\n caption=\"{{ 'SmartWarehouse::Order:U_SWTeslimMiktar' | abpLocalization }}\"\r\n dataType=\"number\"\r\n format=\"#,##0.##\"\r\n [width]=\"120\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"LineTotal\"\r\n caption=\"{{ 'SmartWarehouse::Order:LineTotal' | abpLocalization }}\"\r\n dataType=\"number\"\r\n format=\"#,##0.00\"\r\n [width]=\"120\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"WarehouseCode\"\r\n caption=\"{{ 'SmartWarehouse::Order:WhsCode' | abpLocalization }}\"\r\n [width]=\"100\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"ShipDate\"\r\n caption=\"{{ 'SmartWarehouse::Order:ShipDate' | abpLocalization }}\"\r\n dataType=\"date\"\r\n format=\"dd.MM.yyyy\"\r\n [width]=\"110\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"U_SonGorevId\"\r\n caption=\"{{ 'SmartWarehouse::Order:U_SonGorevId' | abpLocalization }}\"\r\n [width]=\"120\"\r\n ></dxi-column>\r\n\r\n <dxo-summary>\r\n <dxi-total-item\r\n column=\"lineTotal\"\r\n summaryType=\"sum\"\r\n displayFormat=\"Toplam: {0}\"\r\n valueFormat=\"#,##0.00\"\r\n ></dxi-total-item>\r\n <dxi-total-item\r\n column=\"quantity\"\r\n summaryType=\"sum\"\r\n displayFormat=\"Toplam: {0}\"\r\n valueFormat=\"#,##0.##\"\r\n ></dxi-total-item>\r\n </dxo-summary>\r\n </dx-data-grid>\r\n </div>\r\n </div>\r\n </dx-data-grid>\r\n </div>\r\n </div>\r\n\r\n <!-- Bo\u015F / Yar\u0131m Kasa Popup -->\r\n <dx-popup\r\n [visible]=\"bosKasaPopupVisible\"\r\n (onHidden)=\"bosKasaPopupVisible = false\"\r\n [width]=\"380\"\r\n [height]=\"'auto'\"\r\n [showTitle]=\"true\"\r\n [title]=\"bosKasaMode === 'empty' ? 'Bo\u015F Kasa Getir' : 'Yar\u0131m Kasa Getir'\"\r\n [dragEnabled]=\"true\"\r\n [resizeEnabled]=\"false\"\r\n [showCloseButton]=\"true\"\r\n [closeOnOutsideClick]=\"false\"\r\n >\r\n <div *dxTemplate=\"let data of 'content'\" class=\"p-3\">\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\">\u0130stasyon No</label>\r\n <dx-number-box [(value)]=\"bosKasaStationId\" [min]=\"1\" [showSpinButtons]=\"true\"></dx-number-box>\r\n </div>\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\">Raf No (Shelf ID)</label>\r\n <dx-number-box [(value)]=\"bosKasaShelfId\" [min]=\"1\" [showSpinButtons]=\"true\"></dx-number-box>\r\n </div>\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\">Kasa Adedi</label>\r\n <dx-number-box [(value)]=\"bosKasaBoxCount\" [min]=\"1\" [max]=\"50\" [showSpinButtons]=\"true\"></dx-number-box>\r\n </div>\r\n <div class=\"d-flex justify-content-end gap-2 mt-3\">\r\n <dx-button text=\"\u0130ptal\" (onClick)=\"bosKasaPopupVisible = false\" type=\"normal\"></dx-button>\r\n <dx-button\r\n [text]=\"bosKasaMode === 'empty' ? 'Bo\u015F Kasa G\u00F6nder' : 'Yar\u0131m Kasa G\u00F6nder'\"\r\n type=\"default\"\r\n (onClick)=\"onBosKasaGonder()\"\r\n ></dx-button>\r\n </div>\r\n </div>\r\n </dx-popup>\r\n\r\n</abp-page>\r\n", styles: [":host{display:block;max-width:100%;overflow-x:hidden}.orders-toolbar{background:#fff;border:1px solid #e0e0e0;border-radius:8px;padding:16px 20px;margin-bottom:16px;box-shadow:0 1px 3px #0000000f;max-width:100%;overflow:hidden}.toolbar-divider{border:none;border-top:1px solid #eee;margin:10px 0}.toolbar-row{display:flex;flex-wrap:wrap;align-items:center;gap:16px}.toolbar-group{display:flex;flex-direction:column;gap:4px}.toolbar-group--durum{margin-left:80px}.toolbar-group--depo{margin-left:auto}.toolbar-group label{font-size:11px;font-weight:600;color:#6c757d;text-transform:uppercase;letter-spacing:.5px}.toolbar-group select,.toolbar-group input[type=date]{height:36px;border:1px solid #ced4da;border-radius:6px;padding:0 10px;font-size:13px;background:#fff;transition:border-color .15s}.toolbar-group select:focus,.toolbar-group input[type=date]:focus{border-color:#556ee6;outline:none;box-shadow:0 0 0 2px #556ee626}.toolbar-group select{min-width:180px}.radio-group{display:flex;gap:12px;height:36px;align-items:center}.radio-group .form-check{margin:0;padding-left:22px}.radio-group .form-check-label{font-size:13px;cursor:pointer;white-space:nowrap}.status-group{display:flex;gap:10px;align-items:center}.status-chip{display:inline-flex;align-items:center;gap:6px;padding:4px 12px;border-radius:20px;font-size:12px;font-weight:500;cursor:pointer;border:1px solid transparent;transition:all .15s;-webkit-user-select:none;user-select:none}.status-chip.pending{background:#fff9e6;color:#c9a227;border-color:#ffe082}.status-chip.pending.active{background:#ffc107;color:#fff;border-color:#ffc107}.status-chip.processing{background:#e8f0fe;color:#7aadf5;border-color:#a8c8f7}.status-chip.processing.active{background:#0d6efd;color:#fff;border-color:#0d6efd}.status-chip.awaiting{background:#e6f9fc;color:#6ec6d8;border-color:#a0e1ed}.status-chip.awaiting.active{background:#0dcaf0;color:#fff;border-color:#0dcaf0}.status-chip.completed{background:#e8f5e9;color:#6db680;border-color:#a5d6a7}.status-chip.completed.active{background:#198754;color:#fff;border-color:#198754}.status-chip.list-purchase{background:#eef0fa;color:#9aa1d4;border-color:#b3b9e6}.status-chip.list-purchase.active{background:#5c6bc0;color:#fff;border-color:#5c6bc0}.status-chip.list-distribution{background:#fce8ee;color:#e87a9e;border-color:#f0a3bb}.status-chip.list-distribution.active{background:#e91e63;color:#fff;border-color:#e91e63}.status-chip.list-warehouse{background:#e5f5f4;color:#6db5ab;border-color:#a0d4cd}.status-chip.list-warehouse.active{background:#009688;color:#fff;border-color:#009688}.action-group{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.action-input{width:140px;height:32px;border:1px solid #ced4da;border-radius:6px;padding:0 10px;font-size:13px}.action-input:focus{border-color:#556ee6;outline:none;box-shadow:0 0 0 2px #556ee626}.toolbar-separator{width:1px;height:28px;background:#dee2e6;align-self:center}.reservation-group{display:flex;align-items:center;gap:8px}.toolbar-actions{display:flex;gap:8px;margin-left:auto;align-items:center}.action-group .btn,.reservation-group .btn,.toolbar-actions .btn{display:inline-flex;align-items:center;gap:5px;font-size:12px;padding:5px 12px;border-radius:6px;font-weight:500;white-space:nowrap;transition:all .15s}.btn-action-primary{background:#556ee6;color:#fff;border:none}.btn-action-primary:hover{background:#4458cb;color:#fff}.btn-action-success{background:#34c38f;color:#fff;border:none}.btn-action-success:hover{background:#2ca67a;color:#fff}.btn-action-approve{background:#6f42c1;color:#fff;border:none}.btn-action-approve:hover{background:#5a32a3;color:#fff}.btn-action-warning{background:#f1b44c;color:#fff;border:none}.btn-action-warning:hover{background:#d9a043;color:#fff}.btn-action-info{background:#50a5f1;color:#fff;border:none}.btn-action-info:hover{background:#3d8ed8;color:#fff}.btn-action-danger{background:#f46a6a;color:#fff;border:none}.btn-action-danger:hover{background:#e05555;color:#fff}.btn-action-outline{background:transparent;color:#556ee6;border:1px solid #556ee6}.btn-action-outline:hover{background:#556ee6;color:#fff}.btn-action-secondary{background:#74788d;color:#fff;border:none}.btn-action-secondary:hover{background:#5f6373;color:#fff}.btn-action-reservation{background:#7c4dff;color:#fff;border:none}.btn-action-reservation:hover{background:#651fff;color:#fff}.btn-action-reservation:disabled{background:#b39ddb;cursor:not-allowed}.btn-action-reservation-cancel{background:#ff6e40;color:#fff;border:none}.btn-action-reservation-cancel:hover{background:#ff3d00;color:#fff}.btn-action-reservation-cancel:disabled{background:#ffab91;cursor:not-allowed}.btn-action-reservation-bulk{background:#536dfe;color:#fff;border:none}.btn-action-reservation-bulk:hover{background:#304ffe;color:#fff}.btn-action-reservation-bulk:disabled{background:#8c9eff;cursor:not-allowed}.btn-action-reservation-bulk-cancel{background:#ff5252;color:#fff;border:none}.btn-action-reservation-bulk-cancel:hover{background:#ff1744;color:#fff}.btn-action-reservation-bulk-cancel:disabled{background:#ff8a80;cursor:not-allowed}.action-divider{width:1px;height:24px;background:#dee2e6;display:inline-block;vertical-align:middle;margin:0 4px}.orders-grid-card{border-radius:8px;border:1px solid #e0e0e0;box-shadow:0 1px 3px #0000000f;overflow:hidden;max-width:100%}.orders-grid-card .card-body{padding:12px;overflow-x:auto}::ng-deep .order-row-error{background-color:#fdecea!important}::ng-deep .order-row-error:hover{background-color:#fbd9d5!important}::ng-deep .error-message-cell{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#b02a37;font-size:12px}@media (max-width: 1200px){.toolbar-actions{margin-left:0}.radio-group{flex-wrap:wrap;height:auto}.action-group{width:100%}.toolbar-separator{display:none}}@media (max-width: 992px){.toolbar-group--durum,.toolbar-group--depo{margin-left:0}.toolbar-row{gap:12px}.toolbar-group select{min-width:0}.status-group{flex-wrap:wrap;gap:6px}.reservation-group{flex-wrap:wrap}}@media (max-width: 768px){.orders-toolbar{padding:12px}.toolbar-row{flex-direction:column;align-items:stretch;gap:10px}.toolbar-group,.toolbar-group select,.toolbar-group input[type=date]{width:100%}.radio-group{flex-direction:column;align-items:flex-start;gap:8px}.status-group{flex-wrap:wrap;gap:6px}.status-chip{font-size:11px;padding:3px 10px}.action-group,.reservation-group,.toolbar-actions{flex-wrap:wrap;gap:6px}.action-divider{display:none}.action-input{width:100%}.action-group .btn,.reservation-group .btn,.toolbar-actions .btn{font-size:11px;padding:5px 10px}}@media (max-width: 480px){.action-group .btn,.reservation-group .btn,.toolbar-actions .btn{flex:1 1 calc(50% - 6px);justify-content:center}.status-chip{font-size:10px;padding:2px 8px}}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i6.DxDataGridComponent, selector: "dx-data-grid", inputs: ["accessKey", "activeStateEnabled", "allowColumnReordering", "allowColumnResizing", "autoNavigateToFocusedRow", "cacheEnabled", "cellHintEnabled", "columnAutoWidth", "columnChooser", "columnFixing", "columnHidingEnabled", "columnMinWidth", "columnResizingMode", "columns", "columnWidth", "customizeColumns", "dataRowTemplate", "dataSource", "dateSerializationFormat", "disabled", "editing", "elementAttr", "errorRowEnabled", "export", "filterBuilder", "filterBuilderPopup", "filterPanel", "filterRow", "filterSyncEnabled", "filterValue", "focusedColumnIndex", "focusedRowEnabled", "focusedRowIndex", "focusedRowKey", "grouping", "groupPanel", "headerFilter", "height", "highlightChanges", "hint", "hoverStateEnabled", "keyboardNavigation", "keyExpr", "loadPanel", "masterDetail", "noDataText", "pager", "paging", "remoteOperations", "renderAsync", "repaintChangesOnly", "rowAlternationEnabled", "rowDragging", "rowTemplate", "rtlEnabled", "scrolling", "searchPanel", "selectedRowKeys", "selection", "selectionFilter", "showBorders", "showColumnHeaders", "showColumnLines", "showRowLines", "sortByGroupSummaryInfo", "sorting", "stateStoring", "summary", "syncLookupFilterValues", "tabIndex", "toolbar", "twoWayBindingEnabled", "visible", "width", "wordWrapEnabled"], outputs: ["onAdaptiveDetailRowPreparing", "onCellClick", "onCellDblClick", "onCellHoverChanged", "onCellPrepared", "onContentReady", "onContextMenuPreparing", "onDataErrorOccurred", "onDisposing", "onEditCanceled", "onEditCanceling", "onEditingStart", "onEditorPrepared", "onEditorPreparing", "onExporting", "onFocusedCellChanged", "onFocusedCellChanging", "onFocusedRowChanged", "onFocusedRowChanging", "onInitialized", "onInitNewRow", "onKeyDown", "onOptionChanged", "onRowClick", "onRowCollapsed", "onRowCollapsing", "onRowDblClick", "onRowExpanded", "onRowExpanding", "onRowInserted", "onRowInserting", "onRowPrepared", "onRowRemoved", "onRowRemoving", "onRowUpdated", "onRowUpdating", "onRowValidating", "onSaved", "onSaving", "onSelectionChanged", "onToolbarPreparing", "accessKeyChange", "activeStateEnabledChange", "allowColumnReorderingChange", "allowColumnResizingChange", "autoNavigateToFocusedRowChange", "cacheEnabledChange", "cellHintEnabledChange", "columnAutoWidthChange", "columnChooserChange", "columnFixingChange", "columnHidingEnabledChange", "columnMinWidthChange", "columnResizingModeChange", "columnsChange", "columnWidthChange", "customizeColumnsChange", "dataRowTemplateChange", "dataSourceChange", "dateSerializationFormatChange", "disabledChange", "editingChange", "elementAttrChange", "errorRowEnabledChange", "exportChange", "filterBuilderChange", "filterBuilderPopupChange", "filterPanelChange", "filterRowChange", "filterSyncEnabledChange", "filterValueChange", "focusedColumnIndexChange", "focusedRowEnabledChange", "focusedRowIndexChange", "focusedRowKeyChange", "groupingChange", "groupPanelChange", "headerFilterChange", "heightChange", "highlightChangesChange", "hintChange", "hoverStateEnabledChange", "keyboardNavigationChange", "keyExprChange", "loadPanelChange", "masterDetailChange", "noDataTextChange", "pagerChange", "pagingChange", "remoteOperationsChange", "renderAsyncChange", "repaintChangesOnlyChange", "rowAlternationEnabledChange", "rowDraggingChange", "rowTemplateChange", "rtlEnabledChange", "scrollingChange", "searchPanelChange", "selectedRowKeysChange", "selectionChange", "selectionFilterChange", "showBordersChange", "showColumnHeadersChange", "showColumnLinesChange", "showRowLinesChange", "sortByGroupSummaryInfoChange", "sortingChange", "stateStoringChange", "summaryChange", "syncLookupFilterValuesChange", "tabIndexChange", "toolbarChange", "twoWayBindingEnabledChange", "visibleChange", "widthChange", "wordWrapEnabledChange"] }, { kind: "component", type: i7.DxoColumnChooserComponent, selector: "dxo-column-chooser", inputs: ["allowSearch", "emptyPanelText", "enabled", "height", "mode", "searchTimeout", "sortOrder", "title", "width"] }, { kind: "component", type: i7.DxoColumnFixingComponent, selector: "dxo-column-fixing", inputs: ["enabled", "texts"] }, { kind: "component", type: i7.DxiColumnComponent, selector: "dxi-column", inputs: ["alignment", "allowEditing", "allowExporting", "allowFiltering", "allowFixing", "allowGrouping", "allowHeaderFiltering", "allowHiding", "allowReordering", "allowResizing", "allowSearch", "allowSorting", "autoExpandGroup", "buttons", "calculateCellValue", "calculateDisplayValue", "calculateFilterExpression", "calculateGroupValue", "calculateSortValue", "caption", "cellTemplate", "columns", "cssClass", "customizeText", "dataField", "dataType", "editCellTemplate", "editorOptions", "encodeHtml", "falseText", "filterOperations", "filterType", "filterValue", "filterValues", "fixed", "fixedPosition", "format", "formItem", "groupCellTemplate", "groupIndex", "headerCellTemplate", "headerFilter", "hidingPriority", "isBand", "lookup", "minWidth", "name", "ownerBand", "renderAsync", "selectedFilterOperation", "setCellValue", "showEditorAlways", "showInColumnChooser", "showWhenGrouped", "sortIndex", "sortingMethod", "sortOrder", "trueText", "type", "validationRules", "visible", "visibleIndex", "width"], outputs: ["filterValueChange", "filterValuesChange", "groupIndexChange", "selectedFilterOperationChange", "sortIndexChange", "sortOrderChange", "visibleChange", "visibleIndexChange"] }, { kind: "component", type: i7.DxoHeaderFilterComponent, selector: "dxo-header-filter", inputs: ["allowSearch", "dataSource", "groupInterval", "height", "searchMode", "width", "searchTimeout", "texts", "visible", "showRelevantValues"] }, { kind: "component", type: i7.DxoExportComponent, selector: "dxo-export", inputs: ["backgroundColor", "enabled", "fileName", "formats", "margin", "printingEnabled", "svgToCanvas", "allowExportSelectedData", "texts"] }, { kind: "component", type: i7.DxoFilterBuilderComponent, selector: "dxo-filter-builder", inputs: ["accessKey", "activeStateEnabled", "allowHierarchicalFields", "customOperations", "disabled", "elementAttr", "fields", "filterOperationDescriptions", "focusStateEnabled", "groupOperationDescriptions", "groupOperations", "height", "hint", "hoverStateEnabled", "maxGroupLevel", "onContentReady", "onDisposing", "onEditorPrepared", "onEditorPreparing", "onInitialized", "onOptionChanged", "onValueChanged", "rtlEnabled", "tabIndex", "value", "visible", "width"], outputs: ["valueChange"] }, { kind: "component", type: i7.DxoFilterPanelComponent, selector: "dxo-filter-panel", inputs: ["customizeText", "filterEnabled", "texts", "visible"], outputs: ["filterEnabledChange"] }, { kind: "component", type: i7.DxoFilterRowComponent, selector: "dxo-filter-row", inputs: ["applyFilter", "applyFilterText", "betweenEndText", "betweenStartText", "operationDescriptions", "resetOperationText", "showAllText", "showOperationChooser", "visible"] }, { kind: "component", type: i7.DxoMasterDetailComponent, selector: "dxo-master-detail", inputs: ["autoExpandAll", "enabled", "template"] }, { kind: "component", type: i7.DxoPagerComponent, selector: "dxo-pager", inputs: ["allowedPageSizes", "displayMode", "infoText", "label", "showInfo", "showNavigationButtons", "showPageSizeSelector", "visible"] }, { kind: "component", type: i7.DxoPagingComponent, selector: "dxo-paging", inputs: ["enabled", "pageIndex", "pageSize"], outputs: ["pageIndexChange", "pageSizeChange"] }, { kind: "component", type: i7.DxoScrollingComponent, selector: "dxo-scrolling", inputs: ["columnRenderingMode", "mode", "preloadEnabled", "renderAsync", "rowRenderingMode", "scrollByContent", "scrollByThumb", "showScrollbar", "useNative"] }, { kind: "component", type: i7.DxoSelectionComponent, selector: "dxo-selection", inputs: ["allowSelectAll", "deferred", "mode", "selectAllMode", "showCheckBoxesMode", "recursive"] }, { kind: "component", type: i7.DxoSortingComponent, selector: "dxo-sorting", inputs: ["ascendingText", "clearText", "descendingText", "mode", "showSortIndexes"] }, { kind: "component", type: i7.DxoSummaryComponent, selector: "dxo-summary", inputs: ["calculateCustomSummary", "groupItems", "recalculateWhileEditing", "skipEmptyValues", "texts", "totalItems"] }, { kind: "component", type: i7.DxiTotalItemComponent, selector: "dxi-total-item", inputs: ["alignment", "column", "cssClass", "customizeText", "displayFormat", "name", "showInColumn", "skipEmptyValues", "summaryType", "valueFormat"] }, { kind: "directive", type: i8.DxTemplateDirective, selector: "[dxTemplate]", inputs: ["dxTemplateOf"] }, { kind: "component", type: i6.DxPopupComponent, selector: "dx-popup", inputs: ["accessKey", "animation", "closeOnOutsideClick", "container", "contentTemplate", "copyRootClassesToWrapper", "deferRendering", "disabled", "dragAndResizeArea", "dragEnabled", "dragOutsideBoundary", "elementAttr", "focusStateEnabled", "fullScreen", "height", "hideOnOutsideClick", "hideOnParentScroll", "hint", "hoverStateEnabled", "maxHeight", "maxWidth", "minHeight", "minWidth", "position", "resizeEnabled", "restorePosition", "rtlEnabled", "shading", "shadingColor", "showCloseButton", "showTitle", "tabIndex", "title", "titleTemplate", "toolbarItems", "visible", "width", "wrapperAttr"], outputs: ["onContentReady", "onDisposing", "onHidden", "onHiding", "onInitialized", "onOptionChanged", "onResize", "onResizeEnd", "onResizeStart", "onShowing", "onShown", "onTitleRendered", "accessKeyChange", "animationChange", "closeOnOutsideClickChange", "containerChange", "contentTemplateChange", "copyRootClassesToWrapperChange", "deferRenderingChange", "disabledChange", "dragAndResizeAreaChange", "dragEnabledChange", "dragOutsideBoundaryChange", "elementAttrChange", "focusStateEnabledChange", "fullScreenChange", "heightChange", "hideOnOutsideClickChange", "hideOnParentScrollChange", "hintChange", "hoverStateEnabledChange", "maxHeightChange", "maxWidthChange", "minHeightChange", "minWidthChange", "positionChange", "resizeEnabledChange", "restorePositionChange", "rtlEnabledChange", "shadingChange", "shadingColorChange", "showCloseButtonChange", "showTitleChange", "tabIndexChange", "titleChange", "titleTemplateChange", "toolbarItemsChange", "visibleChange", "widthChange", "wrapperAttrChange"] }, { kind: "component", type: i6.DxNumberBoxComponent, selector: "dx-number-box", inputs: ["accessKey", "activeStateEnabled", "buttons", "disabled", "elementAttr", "focusStateEnabled", "format", "height", "hint", "hoverStateEnabled", "inputAttr", "invalidValueMessage", "isValid", "label", "labelMode", "max", "min", "mode", "name", "placeholder", "readOnly", "rtlEnabled", "showClearButton", "showSpinButtons", "step", "stylingMode", "tabIndex", "text", "useLargeSpinButtons", "validationError", "validationErrors", "validationMessageMode", "validationMessagePosition", "validationStatus", "value", "valueChangeEvent", "visible", "width"], outputs: ["onChange", "onContentReady", "onCopy", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onKeyDown", "onKeyUp", "onOptionChanged", "onPaste", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "formatChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "invalidValueMessageChange", "isValidChange", "labelChange", "labelModeChange", "maxChange", "minChange", "modeChange", "nameChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "showClearButtonChange", "showSpinButtonsChange", "stepChange", "stylingModeChange", "tabIndexChange", "textChange", "useLargeSpinButtonsChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationMessagePositionChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "component", type: i6.DxButtonComponent, selector: "dx-button", inputs: ["accessKey", "activeStateEnabled", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "icon", "rtlEnabled", "stylingMode", "tabIndex", "template", "text", "type", "useSubmitBehavior", "validationGroup", "visible", "width"], outputs: ["onClick", "onContentReady", "onDisposing", "onInitialized", "onOptionChanged", "accessKeyChange", "activeStateEnabledChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "iconChange", "rtlEnabledChange", "stylingModeChange", "tabIndexChange", "templateChange", "textChange", "typeChange", "useSubmitBehaviorChange", "validationGroupChange", "visibleChange", "widthChange"] }, { kind: "component", type: i9.PageComponent, selector: "abp-page", inputs: ["title", "toolbar", "breadcrumb"] }, { kind: "pipe", type: i10.LocalizationPipe, name: "abpLocalization" }] });
|
|
438
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: OrdersComponent, decorators: [{
|
|
439
|
+
type: Component,
|
|
440
|
+
args: [{ selector: 'lib-orders', template: "<abp-page [title]=\"'SmartWarehouse::Orders' | abpLocalization\">\r\n\r\n <!-- Toolbar -->\r\n <div class=\"orders-toolbar\">\r\n <!-- Row 1: Filters -->\r\n <div class=\"toolbar-row\">\r\n <div class=\"toolbar-group\">\r\n <label>Sipari\u015F Grubu</label>\r\n <div class=\"status-group\">\r\n <span class=\"status-chip list-purchase\" [class.active]=\"activeListType === '1'\"\r\n (click)=\"toggleListType('1')\">\r\n <i class=\"fa fa-shopping-cart\"></i> Sanayi Sipari\u015Fleri\r\n </span>\r\n <span class=\"status-chip list-distribution\" [class.active]=\"activeListType === '2'\"\r\n (click)=\"toggleListType('2')\">\r\n <i class=\"fa fa-truck\"></i> Da\u011F\u0131t\u0131m Sipari\u015Fleri\r\n </span>\r\n <span class=\"status-chip list-warehouse\" [class.active]=\"activeListType === '3'\"\r\n (click)=\"toggleListType('3')\">\r\n <i class=\"fa fa-warehouse\"></i> Depo Talepleri\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"toolbar-group toolbar-group--durum\">\r\n <label>Durum</label>\r\n <div class=\"status-group\">\r\n <span class=\"status-chip pending\" [class.active]=\"activeStatus === 'beklemede'\"\r\n (click)=\"toggleStatus('beklemede')\">\r\n <i class=\"fa fa-clock\"></i> Beklemede\r\n </span>\r\n <span class=\"status-chip processing\" [class.active]=\"activeStatus === 'isleniyor'\"\r\n (click)=\"toggleStatus('isleniyor')\">\r\n <i class=\"fa fa-spinner\"></i> \u0130\u015Fleniyor\r\n </span>\r\n <span class=\"status-chip awaiting\" [class.active]=\"activeStatus === 'onayBekliyor'\"\r\n (click)=\"toggleStatus('onayBekliyor')\">\r\n <i class=\"fa fa-hourglass-half\"></i> Onay Bekliyor\r\n </span>\r\n <span class=\"status-chip completed\" [class.active]=\"activeStatus === 'tamamlandi'\"\r\n (click)=\"toggleStatus('tamamlandi')\">\r\n <i class=\"fa fa-check-circle\"></i> Tamamland\u0131\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"toolbar-group toolbar-group--depo\">\r\n <label>Depo</label>\r\n <select [(ngModel)]=\"selectedWarehouse\" class=\"form-select\">\r\n <option value=\"\">T\u00FCm\u00FC</option>\r\n <option *ngFor=\"let wh of warehouses\" [value]=\"wh.WhsCode\">{{ wh.WhsName }}</option>\r\n </select>\r\n </div>\r\n </div>\r\n\r\n <hr class=\"toolbar-divider\" />\r\n\r\n <!-- Row 3: Action input + related buttons | Reservation | Refresh/Excel -->\r\n <div class=\"toolbar-row\">\r\n <div class=\"action-group\">\r\n <button class=\"btn btn-action-primary btn-sm\" (click)=\"onGorevBaslat()\" [disabled]=\"isGorevBaslatLoading\">\r\n <i class=\"fa fa-plus-circle\"></i> G\u00F6rev Ba\u015Flat\r\n </button>\r\n <button class=\"btn btn-action-approve btn-sm\" (click)=\"onOnayVer()\">\r\n <i class=\"fa fa-thumbs-up\"></i> G\u00F6revi Tamamla\r\n </button>\r\n <button class=\"btn btn-action-danger btn-sm\" (click)=\"onSiparisKapat()\">\r\n <i class=\"fa fa-times-circle\"></i> Sipari\u015F Kapat\r\n </button>\r\n <button class=\"btn btn-action-sync btn-sm\" (click)=\"onDurumGuncelle()\" [disabled]=\"isBeeCellLoading\">\r\n <i class=\"fa fa-sync-alt\"></i> Durum G\u00FCncelle\r\n </button>\r\n <button class=\"btn btn-action-info btn-sm\" (click)=\"onBosKasaGetir()\" [disabled]=\"isBeeCellLoading\">\r\n <i class=\"fa fa-box-open\"></i> Bo\u015F Kasa Getir\r\n </button>\r\n <button class=\"btn btn-action-warning btn-sm\" (click)=\"onYarimKasa()\" [disabled]=\"isBeeCellLoading\">\r\n <i class=\"fa fa-box\"></i> Yar\u0131m Kasa Getir\r\n </button>\r\n <span class=\"action-divider\"></span>\r\n <button class=\"btn btn-action-reservation btn-sm\" (click)=\"onRezervasyonYap()\" [disabled]=\"isReservationLoading\">\r\n <i class=\"fa fa-lock\"></i> Rezervasyon Yap\r\n </button>\r\n <button class=\"btn btn-action-reservation-cancel btn-sm\" (click)=\"onRezervasyonSil()\" [disabled]=\"isReservationLoading\">\r\n <i class=\"fa fa-unlock\"></i> Rezervasyon Sil\r\n </button>\r\n <button class=\"btn btn-action-reservation-bulk btn-sm\" (click)=\"onTopluRezervasyonYap()\" [disabled]=\"isReservationLoading\">\r\n <i class=\"fa fa-lock\"></i> Toplu Rez. Yap\r\n </button>\r\n <button class=\"btn btn-action-reservation-bulk-cancel btn-sm\" (click)=\"onTumRezervasyonlariSil()\" [disabled]=\"isReservationLoading\">\r\n <i class=\"fa fa-unlock\"></i> Toplu Rez. Sil\r\n </button>\r\n <span class=\"action-divider\"></span>\r\n <button class=\"btn btn-action-secondary btn-sm\" (click)=\"onRefresh()\">\r\n <i class=\"fa fa-redo\"></i> Yenile\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Data Grid -->\r\n <div class=\"card orders-grid-card\">\r\n <div class=\"card-body\">\r\n <dx-data-grid\r\n #dxOrdersInstance\r\n [dataSource]=\"ordersDataSource\"\r\n [showRowLines]=\"true\"\r\n [showBorders]=\"true\"\r\n [remoteOperations]=\"true\"\r\n [hoverStateEnabled]=\"true\"\r\n [repaintChangesOnly]=\"true\"\r\n [allowColumnResizing]=\"true\"\r\n columnResizingMode=\"widget\"\r\n [allowColumnReordering]=\"true\"\r\n [columnAutoWidth]=\"true\"\r\n [columnHidingEnabled]=\"true\"\r\n (onRowClick)=\"onRowClick($event)\"\r\n (onSelectionChanged)=\"onSelectionChanged($event)\"\r\n (onRowPrepared)=\"onRowPrepared($event)\"\r\n style=\"height: 60vh\"\r\n >\r\n <dxo-pager\r\n [visible]=\"true\"\r\n [showInfo]=\"true\"\r\n [allowedPageSizes]=\"[5, 10, 20]\"\r\n [showNavigationButtons]=\"true\"\r\n [showPageSizeSelector]=\"true\"\r\n >\r\n </dxo-pager>\r\n <dxo-paging [pageSize]=\"10\"></dxo-paging>\r\n <dxo-column-chooser\r\n [allowSearch]=\"true\"\r\n [enabled]=\"true\"\r\n mode=\"select\"\r\n ></dxo-column-chooser>\r\n <dxo-column-fixing [enabled]=\"true\"></dxo-column-fixing>\r\n <dxo-header-filter [allowSearch]=\"true\" [visible]=\"true\"></dxo-header-filter>\r\n <dxo-filter-row [visible]=\"true\"></dxo-filter-row>\r\n <dxo-export [enabled]=\"true\" [allowExportSelectedData]=\"false\"></dxo-export>\r\n <dxo-filter-builder [allowHierarchicalFields]=\"true\"></dxo-filter-builder>\r\n <dxo-filter-panel [visible]=\"true\"></dxo-filter-panel>\r\n <dxo-sorting mode=\"single\"></dxo-sorting>\r\n <dxo-scrolling mode=\"standard\" showScrollbar=\"always\"></dxo-scrolling>\r\n <dxo-selection\r\n mode=\"multiple\"\r\n showCheckBoxesMode=\"always\"\r\n [allowSelectAll]=\"true\"\r\n ></dxo-selection>\r\n\r\n <dxi-column\r\n dataField=\"DocNum\"\r\n caption=\"{{ 'SmartWarehouse::Order:DocNum' | abpLocalization }}\"\r\n [width]=\"110\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"CardCode\"\r\n caption=\"{{ 'SmartWarehouse::Order:CardCode' | abpLocalization }}\"\r\n [width]=\"140\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"CardName\"\r\n caption=\"{{ 'SmartWarehouse::Order:CardName' | abpLocalization }}\"\r\n [width]=\"220\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"DocDate\"\r\n caption=\"{{ 'SmartWarehouse::Order:DocDate' | abpLocalization }}\"\r\n dataType=\"date\"\r\n format=\"dd.MM.yyyy\"\r\n [width]=\"120\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"DocDueDate\"\r\n caption=\"{{ 'SmartWarehouse::Order:DocDueDate' | abpLocalization }}\"\r\n dataType=\"date\"\r\n format=\"dd.MM.yyyy\"\r\n [width]=\"120\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"U_SWTalepTarihi\"\r\n caption=\"{{ 'SmartWarehouse::Order:U_SWTalepTarihi' | abpLocalization }}\"\r\n dataType=\"date\"\r\n format=\"dd.MM.yyyy\"\r\n [width]=\"130\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"U_SWDurum\"\r\n caption=\"{{ 'SmartWarehouse::Order:U_SWDurum' | abpLocalization }}\"\r\n [width]=\"110\"\r\n cellTemplate=\"swDurumTemplate\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"U_SWIsError\"\r\n caption=\"{{ 'SmartWarehouse::Order:U_SWIsError' | abpLocalization }}\"\r\n [width]=\"50\"\r\n cellTemplate=\"errorTemplate\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"U_SWErrorMessage\"\r\n caption=\"{{ 'SmartWarehouse::Order:U_SWErrorMessage' | abpLocalization }}\"\r\n [width]=\"260\"\r\n cellTemplate=\"errorMessageTemplate\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"OwnerCode\"\r\n caption=\"{{ 'SmartWarehouse::Order:OwnerCode' | abpLocalization }}\"\r\n [width]=\"120\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"Comments\"\r\n caption=\"{{ 'SmartWarehouse::Order:Comments' | abpLocalization }}\"\r\n [width]=\"200\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"U_SWGonderildi\"\r\n caption=\"{{ 'SmartWarehouse::Order:U_SWGonderildi' | abpLocalization }}\"\r\n [width]=\"110\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"U_SWStationCode\"\r\n caption=\"{{ 'SmartWarehouse::Order:U_SWStationCode' | abpLocalization }}\"\r\n [width]=\"120\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"U_SWEyeCode\"\r\n caption=\"{{ 'SmartWarehouse::Order:U_SWEyeCode' | abpLocalization }}\"\r\n [width]=\"140\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"U_SWOrderType\"\r\n caption=\"{{ 'SmartWarehouse::Order:U_SWOrderType' | abpLocalization }}\"\r\n [width]=\"160\"\r\n cellTemplate=\"orderTypeTemplate\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"NumAtCard\"\r\n caption=\"{{ 'SmartWarehouse::Order:NumAtCard' | abpLocalization }}\"\r\n [width]=\"140\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"DocTotal\"\r\n caption=\"{{ 'SmartWarehouse::Order:DocTotal' | abpLocalization }}\"\r\n dataType=\"number\"\r\n format=\"#,##0.00\"\r\n [width]=\"130\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"DocCur\"\r\n caption=\"{{ 'SmartWarehouse::Order:DocCur' | abpLocalization }}\"\r\n [width]=\"90\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"DocStatus\"\r\n caption=\"{{ 'SmartWarehouse::Order:DocStatus' | abpLocalization }}\"\r\n [width]=\"90\"\r\n cellTemplate=\"statusTemplate\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"DocEntry\"\r\n caption=\"{{ 'SmartWarehouse::Order:DocEntry' | abpLocalization }}\"\r\n [width]=\"100\"\r\n ></dxi-column>\r\n\r\n <div *dxTemplate=\"let cell of 'statusTemplate'\">\r\n <span\r\n class=\"badge\"\r\n [ngClass]=\"{\r\n 'bg-success': cell.value === 'O',\r\n 'bg-secondary': cell.value === 'C'\r\n }\"\r\n >\r\n {{ cell.value === 'O' ? 'A\u00E7\u0131k' : 'Kapal\u0131' }}\r\n </span>\r\n </div>\r\n\r\n <div *dxTemplate=\"let cell of 'swDurumTemplate'\">\r\n <span\r\n class=\"badge\"\r\n [ngClass]=\"{\r\n 'bg-warning': cell.value === '0' || !cell.value,\r\n 'bg-info': cell.value === '1',\r\n 'bg-primary': cell.value === '2',\r\n 'bg-success': cell.value === '3'\r\n }\"\r\n >\r\n {{\r\n cell.value === '1' ? 'Onay Bekliyor' :\r\n cell.value === '2' ? '\u0130\u015Fleniyor' :\r\n cell.value === '3' ? 'Tamamland\u0131' : 'Beklemede'\r\n }}\r\n </span>\r\n </div>\r\n\r\n <div *dxTemplate=\"let cell of 'errorTemplate'\">\r\n <i\r\n *ngIf=\"cell.value === 'Y'\"\r\n class=\"fa fa-exclamation-triangle text-danger\"\r\n [title]=\"cell.data.U_SWErrorMessage\"\r\n ></i>\r\n </div>\r\n\r\n <div *dxTemplate=\"let cell of 'errorMessageTemplate'\">\r\n <span\r\n *ngIf=\"cell.data.U_SWIsError === 'Y'\"\r\n class=\"error-message-cell\"\r\n [title]=\"cell.value\"\r\n >{{ cell.value }}</span>\r\n </div>\r\n\r\n <div *dxTemplate=\"let cell of 'orderTypeTemplate'\">\r\n <span class=\"badge bg-secondary\">\r\n {{\r\n cell.value === '1' ? 'Sanayi Sipari\u015Fleri' :\r\n cell.value === '2' ? 'Da\u011F\u0131t\u0131m Sipari\u015Fleri' :\r\n cell.value === '3' ? 'Depo Talepleri' : '-'\r\n }}\r\n </span>\r\n </div>\r\n\r\n <!-- Master-Detail: Sipari\u015F Sat\u0131rlar\u0131 -->\r\n <dxo-master-detail [enabled]=\"true\" template=\"orderLinesTemplate\"></dxo-master-detail>\r\n\r\n <div *dxTemplate=\"let detail of 'orderLinesTemplate'\">\r\n <div class=\"p-3\">\r\n <h6 class=\"mb-3\">\r\n <i class=\"fa fa-list me-1\"></i>\r\n {{ 'SmartWarehouse::Order:DocNum' | abpLocalization }}:\r\n {{ detail.data.DocNum }} - Sipari\u015F Sat\u0131rlar\u0131\r\n </h6>\r\n <dx-data-grid\r\n [dataSource]=\"detail.data.DocumentLines\"\r\n [showRowLines]=\"true\"\r\n [showBorders]=\"true\"\r\n [columnAutoWidth]=\"true\"\r\n [hoverStateEnabled]=\"true\"\r\n [rowAlternationEnabled]=\"true\"\r\n >\r\n <dxi-column\r\n dataField=\"LineNum\"\r\n caption=\"{{ 'SmartWarehouse::Order:LineNum' | abpLocalization }}\"\r\n [width]=\"70\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"ItemCode\"\r\n caption=\"{{ 'SmartWarehouse::Order:ItemCode' | abpLocalization }}\"\r\n [width]=\"140\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"ItemDescription\"\r\n caption=\"Kalem Ad\u0131\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"Quantity\"\r\n caption=\"{{ 'SmartWarehouse::Order:Quantity' | abpLocalization }}\"\r\n dataType=\"number\"\r\n format=\"#,##0.##\"\r\n [width]=\"100\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"U_SWTeslimMiktar\"\r\n caption=\"{{ 'SmartWarehouse::Order:U_SWTeslimMiktar' | abpLocalization }}\"\r\n dataType=\"number\"\r\n format=\"#,##0.##\"\r\n [width]=\"120\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"LineTotal\"\r\n caption=\"{{ 'SmartWarehouse::Order:LineTotal' | abpLocalization }}\"\r\n dataType=\"number\"\r\n format=\"#,##0.00\"\r\n [width]=\"120\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"WarehouseCode\"\r\n caption=\"{{ 'SmartWarehouse::Order:WhsCode' | abpLocalization }}\"\r\n [width]=\"100\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"ShipDate\"\r\n caption=\"{{ 'SmartWarehouse::Order:ShipDate' | abpLocalization }}\"\r\n dataType=\"date\"\r\n format=\"dd.MM.yyyy\"\r\n [width]=\"110\"\r\n ></dxi-column>\r\n <dxi-column\r\n dataField=\"U_SonGorevId\"\r\n caption=\"{{ 'SmartWarehouse::Order:U_SonGorevId' | abpLocalization }}\"\r\n [width]=\"120\"\r\n ></dxi-column>\r\n\r\n <dxo-summary>\r\n <dxi-total-item\r\n column=\"lineTotal\"\r\n summaryType=\"sum\"\r\n displayFormat=\"Toplam: {0}\"\r\n valueFormat=\"#,##0.00\"\r\n ></dxi-total-item>\r\n <dxi-total-item\r\n column=\"quantity\"\r\n summaryType=\"sum\"\r\n displayFormat=\"Toplam: {0}\"\r\n valueFormat=\"#,##0.##\"\r\n ></dxi-total-item>\r\n </dxo-summary>\r\n </dx-data-grid>\r\n </div>\r\n </div>\r\n </dx-data-grid>\r\n </div>\r\n </div>\r\n\r\n <!-- Bo\u015F / Yar\u0131m Kasa Popup -->\r\n <dx-popup\r\n [visible]=\"bosKasaPopupVisible\"\r\n (onHidden)=\"bosKasaPopupVisible = false\"\r\n [width]=\"380\"\r\n [height]=\"'auto'\"\r\n [showTitle]=\"true\"\r\n [title]=\"bosKasaMode === 'empty' ? 'Bo\u015F Kasa Getir' : 'Yar\u0131m Kasa Getir'\"\r\n [dragEnabled]=\"true\"\r\n [resizeEnabled]=\"false\"\r\n [showCloseButton]=\"true\"\r\n [closeOnOutsideClick]=\"false\"\r\n >\r\n <div *dxTemplate=\"let data of 'content'\" class=\"p-3\">\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\">\u0130stasyon No</label>\r\n <dx-number-box [(value)]=\"bosKasaStationId\" [min]=\"1\" [showSpinButtons]=\"true\"></dx-number-box>\r\n </div>\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\">Raf No (Shelf ID)</label>\r\n <dx-number-box [(value)]=\"bosKasaShelfId\" [min]=\"1\" [showSpinButtons]=\"true\"></dx-number-box>\r\n </div>\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\">Kasa Adedi</label>\r\n <dx-number-box [(value)]=\"bosKasaBoxCount\" [min]=\"1\" [max]=\"50\" [showSpinButtons]=\"true\"></dx-number-box>\r\n </div>\r\n <div class=\"d-flex justify-content-end gap-2 mt-3\">\r\n <dx-button text=\"\u0130ptal\" (onClick)=\"bosKasaPopupVisible = false\" type=\"normal\"></dx-button>\r\n <dx-button\r\n [text]=\"bosKasaMode === 'empty' ? 'Bo\u015F Kasa G\u00F6nder' : 'Yar\u0131m Kasa G\u00F6nder'\"\r\n type=\"default\"\r\n (onClick)=\"onBosKasaGonder()\"\r\n ></dx-button>\r\n </div>\r\n </div>\r\n </dx-popup>\r\n\r\n</abp-page>\r\n", styles: [":host{display:block;max-width:100%;overflow-x:hidden}.orders-toolbar{background:#fff;border:1px solid #e0e0e0;border-radius:8px;padding:16px 20px;margin-bottom:16px;box-shadow:0 1px 3px #0000000f;max-width:100%;overflow:hidden}.toolbar-divider{border:none;border-top:1px solid #eee;margin:10px 0}.toolbar-row{display:flex;flex-wrap:wrap;align-items:center;gap:16px}.toolbar-group{display:flex;flex-direction:column;gap:4px}.toolbar-group--durum{margin-left:80px}.toolbar-group--depo{margin-left:auto}.toolbar-group label{font-size:11px;font-weight:600;color:#6c757d;text-transform:uppercase;letter-spacing:.5px}.toolbar-group select,.toolbar-group input[type=date]{height:36px;border:1px solid #ced4da;border-radius:6px;padding:0 10px;font-size:13px;background:#fff;transition:border-color .15s}.toolbar-group select:focus,.toolbar-group input[type=date]:focus{border-color:#556ee6;outline:none;box-shadow:0 0 0 2px #556ee626}.toolbar-group select{min-width:180px}.radio-group{display:flex;gap:12px;height:36px;align-items:center}.radio-group .form-check{margin:0;padding-left:22px}.radio-group .form-check-label{font-size:13px;cursor:pointer;white-space:nowrap}.status-group{display:flex;gap:10px;align-items:center}.status-chip{display:inline-flex;align-items:center;gap:6px;padding:4px 12px;border-radius:20px;font-size:12px;font-weight:500;cursor:pointer;border:1px solid transparent;transition:all .15s;-webkit-user-select:none;user-select:none}.status-chip.pending{background:#fff9e6;color:#c9a227;border-color:#ffe082}.status-chip.pending.active{background:#ffc107;color:#fff;border-color:#ffc107}.status-chip.processing{background:#e8f0fe;color:#7aadf5;border-color:#a8c8f7}.status-chip.processing.active{background:#0d6efd;color:#fff;border-color:#0d6efd}.status-chip.awaiting{background:#e6f9fc;color:#6ec6d8;border-color:#a0e1ed}.status-chip.awaiting.active{background:#0dcaf0;color:#fff;border-color:#0dcaf0}.status-chip.completed{background:#e8f5e9;color:#6db680;border-color:#a5d6a7}.status-chip.completed.active{background:#198754;color:#fff;border-color:#198754}.status-chip.list-purchase{background:#eef0fa;color:#9aa1d4;border-color:#b3b9e6}.status-chip.list-purchase.active{background:#5c6bc0;color:#fff;border-color:#5c6bc0}.status-chip.list-distribution{background:#fce8ee;color:#e87a9e;border-color:#f0a3bb}.status-chip.list-distribution.active{background:#e91e63;color:#fff;border-color:#e91e63}.status-chip.list-warehouse{background:#e5f5f4;color:#6db5ab;border-color:#a0d4cd}.status-chip.list-warehouse.active{background:#009688;color:#fff;border-color:#009688}.action-group{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.action-input{width:140px;height:32px;border:1px solid #ced4da;border-radius:6px;padding:0 10px;font-size:13px}.action-input:focus{border-color:#556ee6;outline:none;box-shadow:0 0 0 2px #556ee626}.toolbar-separator{width:1px;height:28px;background:#dee2e6;align-self:center}.reservation-group{display:flex;align-items:center;gap:8px}.toolbar-actions{display:flex;gap:8px;margin-left:auto;align-items:center}.action-group .btn,.reservation-group .btn,.toolbar-actions .btn{display:inline-flex;align-items:center;gap:5px;font-size:12px;padding:5px 12px;border-radius:6px;font-weight:500;white-space:nowrap;transition:all .15s}.btn-action-primary{background:#556ee6;color:#fff;border:none}.btn-action-primary:hover{background:#4458cb;color:#fff}.btn-action-success{background:#34c38f;color:#fff;border:none}.btn-action-success:hover{background:#2ca67a;color:#fff}.btn-action-approve{background:#6f42c1;color:#fff;border:none}.btn-action-approve:hover{background:#5a32a3;color:#fff}.btn-action-warning{background:#f1b44c;color:#fff;border:none}.btn-action-warning:hover{background:#d9a043;color:#fff}.btn-action-info{background:#50a5f1;color:#fff;border:none}.btn-action-info:hover{background:#3d8ed8;color:#fff}.btn-action-danger{background:#f46a6a;color:#fff;border:none}.btn-action-danger:hover{background:#e05555;color:#fff}.btn-action-outline{background:transparent;color:#556ee6;border:1px solid #556ee6}.btn-action-outline:hover{background:#556ee6;color:#fff}.btn-action-secondary{background:#74788d;color:#fff;border:none}.btn-action-secondary:hover{background:#5f6373;color:#fff}.btn-action-reservation{background:#7c4dff;color:#fff;border:none}.btn-action-reservation:hover{background:#651fff;color:#fff}.btn-action-reservation:disabled{background:#b39ddb;cursor:not-allowed}.btn-action-reservation-cancel{background:#ff6e40;color:#fff;border:none}.btn-action-reservation-cancel:hover{background:#ff3d00;color:#fff}.btn-action-reservation-cancel:disabled{background:#ffab91;cursor:not-allowed}.btn-action-reservation-bulk{background:#536dfe;color:#fff;border:none}.btn-action-reservation-bulk:hover{background:#304ffe;color:#fff}.btn-action-reservation-bulk:disabled{background:#8c9eff;cursor:not-allowed}.btn-action-reservation-bulk-cancel{background:#ff5252;color:#fff;border:none}.btn-action-reservation-bulk-cancel:hover{background:#ff1744;color:#fff}.btn-action-reservation-bulk-cancel:disabled{background:#ff8a80;cursor:not-allowed}.action-divider{width:1px;height:24px;background:#dee2e6;display:inline-block;vertical-align:middle;margin:0 4px}.orders-grid-card{border-radius:8px;border:1px solid #e0e0e0;box-shadow:0 1px 3px #0000000f;overflow:hidden;max-width:100%}.orders-grid-card .card-body{padding:12px;overflow-x:auto}::ng-deep .order-row-error{background-color:#fdecea!important}::ng-deep .order-row-error:hover{background-color:#fbd9d5!important}::ng-deep .error-message-cell{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#b02a37;font-size:12px}@media (max-width: 1200px){.toolbar-actions{margin-left:0}.radio-group{flex-wrap:wrap;height:auto}.action-group{width:100%}.toolbar-separator{display:none}}@media (max-width: 992px){.toolbar-group--durum,.toolbar-group--depo{margin-left:0}.toolbar-row{gap:12px}.toolbar-group select{min-width:0}.status-group{flex-wrap:wrap;gap:6px}.reservation-group{flex-wrap:wrap}}@media (max-width: 768px){.orders-toolbar{padding:12px}.toolbar-row{flex-direction:column;align-items:stretch;gap:10px}.toolbar-group,.toolbar-group select,.toolbar-group input[type=date]{width:100%}.radio-group{flex-direction:column;align-items:flex-start;gap:8px}.status-group{flex-wrap:wrap;gap:6px}.status-chip{font-size:11px;padding:3px 10px}.action-group,.reservation-group,.toolbar-actions{flex-wrap:wrap;gap:6px}.action-divider{display:none}.action-input{width:100%}.action-group .btn,.reservation-group .btn,.toolbar-actions .btn{font-size:11px;padding:5px 10px}}@media (max-width: 480px){.action-group .btn,.reservation-group .btn,.toolbar-actions .btn{flex:1 1 calc(50% - 6px);justify-content:center}.status-chip{font-size:10px;padding:2px 8px}}\n"] }]
|
|
441
|
+
}], ctorParameters: function () { return [{ type: i1.OrderService }, { type: i2.WarehouseService }, { type: i3.ToasterService }, { type: i3.ConfirmationService }]; }, propDecorators: { dxOrdersInstance: [{
|
|
442
|
+
type: ViewChild,
|
|
443
|
+
args: ['dxOrdersInstance', { static: false }]
|
|
444
|
+
}] } });
|
|
445
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JkZXJzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LXdhcmVob3VzZS9zcmMvbGliL2NvbXBvbmVudHMvb3JkZXJzL29yZGVycy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC13YXJlaG91c2Uvc3JjL2xpYi9jb21wb25lbnRzL29yZGVycy9vcmRlcnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFNN0QsT0FBTyxVQUFVLE1BQU0sNkJBQTZCLENBQUM7Ozs7Ozs7Ozs7OztBQU9yRCxNQUFNLE9BQU8sZUFBZTtJQW1DeEIsWUFDcUIsWUFBMEIsRUFDMUIsZ0JBQWtDLEVBQ2xDLGNBQThCLEVBQzlCLG1CQUF3QztRQUh4QyxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5Qix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBbkM3RCxtQkFBYyxHQUFrQixFQUFFLENBQUM7UUFFbkMsa0JBQWtCO1FBQ2xCLHNCQUFpQixHQUFXLEVBQUUsQ0FBQztRQUMvQixpQkFBWSxHQUFXLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNqRSxtQkFBYyxHQUFrQixJQUFJLENBQUMsQ0FBQywrQkFBK0I7UUFDckUsaUJBQVksR0FBa0IsSUFBSSxDQUFDLENBQUMseUZBQXlGO1FBRTVHLGNBQVMsR0FBOEI7WUFDcEQsU0FBUyxFQUFFLEdBQUc7WUFDZCxZQUFZLEVBQUUsR0FBRztZQUNqQixTQUFTLEVBQUUsR0FBRztZQUNkLFVBQVUsRUFBRSxHQUFHO1NBQ2xCLENBQUM7UUFFRixvQkFBb0I7UUFDcEIscUJBQWdCLEdBQVcsRUFBRSxDQUFDO1FBRTlCLGVBQVUsR0FBbUIsRUFBRSxDQUFDO1FBQ2hDLHdCQUFtQixHQUFZLEtBQUssQ0FBQztRQUVyQyx5QkFBb0IsR0FBWSxLQUFLLENBQUM7UUFDdEMseUJBQW9CLEdBQVksS0FBSyxDQUFDO1FBQ3RDLHFCQUFnQixHQUFZLEtBQUssQ0FBQztRQUVsQyx3QkFBbUIsR0FBWSxLQUFLLENBQUM7UUFDckMscUJBQWdCLEdBQVcsQ0FBQyxDQUFDO1FBQzdCLG1CQUFjLEdBQVcsQ0FBQyxDQUFDO1FBQzNCLG9CQUFlLEdBQVcsQ0FBQyxDQUFDO1FBQzVCLGdCQUFXLEdBQXFCLE9BQU8sQ0FBQztJQU9yQyxDQUFDO0lBRUosUUFBUTtRQUNKLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVPLGNBQWM7UUFDbEIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQztRQUNoQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxTQUFTLENBQUM7WUFDakQsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQ1gsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUM3QixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDNUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO2lCQUN2RDtnQkFDRCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO1lBQ3JDLENBQUM7WUFDRCxLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDWCxPQUFPLENBQUMsS0FBSyxDQUFDLHNCQUFzQixFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUMzQyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO2dCQUNsRCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO1lBQ3JDLENBQUM7U0FDSixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8sZUFBZTtRQUNuQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxVQUFVLENBQUM7WUFDbkMsS0FBSyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVTtZQUNuQyxNQUFNLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixFQUFFO1NBQ3JDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTyxtQkFBbUI7UUFDdkIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDOUMsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFFbEQsSUFBSSxZQUFZLElBQUksY0FBYyxFQUFFO1lBQ2hDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsS0FBSyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1NBQ2hEO1FBQ0QsT0FBTyxZQUFZLElBQUksY0FBYyxJQUFJLElBQUksQ0FBQztJQUNsRCxDQUFDO0lBRU8sbUJBQW1CO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3RCLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFDRCxPQUFPLENBQUMsZUFBZSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVPLGlCQUFpQjtRQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNwQixPQUFPLElBQUksQ0FBQztTQUNmO1FBRUQsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLFdBQVcsRUFBRTtZQUNuQyxxRkFBcUY7WUFDckYsT0FBTyxDQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FDbEM7UUFFRCxPQUFPLENBQUMsV0FBVyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFRCxZQUFZLENBQUMsR0FBVztRQUNwQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUMzRCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVELGNBQWMsQ0FBQyxHQUFXO1FBQ3RCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQy9ELElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRU8sWUFBWTtRQUNoQiwyR0FBMkc7UUFDM0csaUdBQWlHO1FBQ2pHLDZGQUE2RjtRQUM3RixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxVQUFVLENBQUM7WUFDbkMsS0FBSyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVTtZQUNuQyxNQUFNLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixFQUFFO1NBQ3JDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxDQUFNO1FBQ3JCLElBQUksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFDLGdCQUFnQixJQUFJLEVBQUUsQ0FBQztJQUNuRCxDQUFDO0lBRUQsVUFBVSxDQUFDLENBQU07UUFDYixvR0FBb0c7UUFDcEcsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxNQUFxQixDQUFDO1FBQzlDLElBQUksTUFBTSxFQUFFLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLE1BQU0sRUFBRSxPQUFPLENBQUMsd0JBQXdCLENBQUMsSUFBSSxNQUFNLEVBQUUsT0FBTyxDQUFDLHFCQUFxQixDQUFDLElBQUksTUFBTSxFQUFFLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFO1lBQ3ZLLE9BQU87U0FDVjtRQUVELElBQUksQ0FBQyxDQUFDLE9BQU8sS0FBSyxNQUFNLEVBQUU7WUFDdEIsTUFBTSxVQUFVLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3BELElBQUksVUFBVSxFQUFFO2dCQUNaLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUNsQztpQkFBTTtnQkFDSCxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDaEM7U0FDSjtJQUNMLENBQUM7SUFFRCxhQUFhLENBQUMsQ0FBTTtRQUNoQixJQUFJLENBQUMsQ0FBQyxPQUFPLEtBQUssTUFBTSxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsV0FBVyxLQUFLLEdBQUcsRUFBRTtZQUNyRCxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQztTQUNqRDtJQUNMLENBQUM7SUFFRCxhQUFhO1FBQ1QsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQzFELElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLG1DQUFtQyxDQUFDLENBQUM7WUFDOUQsT0FBTztTQUNWO1FBRUQsa0RBQWtEO1FBQ2xELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUM1QyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLEtBQUssR0FBRyxDQUMzQixDQUFDO1FBQ0YsSUFBSSxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMxQixNQUFNLE9BQU8sR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1RCxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FDckIsaURBQWlELE9BQU8sa0VBQWtFLENBQzdILENBQUM7WUFDRixPQUFPO1NBQ1Y7UUFFRCwyQ0FBMkM7UUFDM0MsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQ3hDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxJQUFJLENBQUMsQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUM3RCxDQUFDO1FBQ0YsSUFBSSxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUN0QixNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4RCxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FDckIseUNBQXlDLE9BQU8sa0NBQWtDLENBQ3JGLENBQUM7WUFDRixPQUFPO1NBQ1Y7UUFFRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUU1RCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUM5QyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRTtnQkFDYixJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDcEMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQztnQkFDbEMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQztnQkFDM0MsSUFBSSxDQUFDLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsQ0FBQztZQUN0RCxDQUFDO1lBQ0QsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ2IsTUFBTSxZQUFZLEdBQUcsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxJQUFJLHNDQUFzQyxDQUFDO2dCQUM1RixJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDeEMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQztZQUN0QyxDQUFDO1NBQ0osQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELHlGQUF5RjtJQUN6Rix5RkFBeUY7SUFDekYsaUVBQWlFO0lBQ2pFLFNBQVM7UUFDTCxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDMUQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsbUNBQW1DLENBQUMsQ0FBQztZQUM5RCxPQUFPO1NBQ1Y7UUFFRCw2Q0FBNkM7UUFDN0MsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQzVDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxTQUFTLEtBQUssR0FBRyxDQUMzQyxDQUFDO1FBQ0YsSUFBSSxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMxQixNQUFNLE9BQU8sR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1RCxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FDckIsNkNBQTZDLE9BQU8sa0RBQWtELENBQ3pHLENBQUM7WUFDRixPQUFPO1NBQ1Y7UUFFRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUU1RCxJQUFJLENBQUMsbUJBQW1CO2FBQ25CLElBQUksQ0FBQyxzRkFBc0YsRUFBRSxnQkFBZ0IsQ0FBQzthQUM5RyxTQUFTLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUNsQixJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUU7Z0JBQ3RCLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsU0FBUyxDQUFDO29CQUNyRSxJQUFJLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRTt3QkFDYixJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQzt3QkFDcEMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQzt3QkFDM0MsSUFBSSxDQUFDLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsQ0FBQztvQkFDdEQsQ0FBQztvQkFDRCxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTt3QkFDYixNQUFNLFlBQVksR0FBRyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLElBQUksa0NBQWtDLENBQUM7d0JBQ3hGLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO29CQUM1QyxDQUFDO2lCQUNKLENBQUMsQ0FBQzthQUNOO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRUQsd0RBQXdEO0lBQ3hELGNBQWM7UUFDVixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDMUQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsbUNBQW1DLENBQUMsQ0FBQztZQUM5RCxPQUFPO1NBQ1Y7UUFFRCx3RUFBd0U7UUFDeEUsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQzNFLElBQUksYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDMUIsTUFBTSxPQUFPLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQ3JCLDBEQUEwRCxPQUFPLHVEQUF1RCxDQUMzSCxDQUFDO1lBQ0YsT0FBTztTQUNWO1FBRUQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDNUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWxFLElBQUksQ0FBQyxtQkFBbUI7YUFDbkIsSUFBSSxDQUNELEdBQUcsT0FBTyxzRkFBc0Y7WUFDNUYsc0VBQXNFLEVBQzFFLGVBQWUsQ0FDbEI7YUFDQSxTQUFTLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUNsQixJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUU7Z0JBQ3RCLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFNBQVMsQ0FBQztvQkFDL0MsSUFBSSxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUU7d0JBQ2IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7d0JBQ3BDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUM7d0JBQzNDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFLENBQUM7b0JBQ3RELENBQUM7b0JBQ0QsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7d0JBQ2IsTUFBTSxZQUFZLEdBQUcsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxJQUFJLHVDQUF1QyxDQUFDO3dCQUM3RixJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztvQkFDNUMsQ0FBQztpQkFDSixDQUFDLENBQUM7YUFDTjtRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVELGNBQWM7UUFDVixJQUFJLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQztRQUMzQixJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO0lBQ3BDLENBQUM7SUFFRCxXQUFXO1FBQ1AsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUM7UUFDMUIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQztJQUNwQyxDQUFDO0lBRUQsZUFBZTtRQUNYLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7UUFDakMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztRQUU3QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxLQUFLLE9BQU87WUFDckMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1lBQzNILENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBRS9ILElBQUksQ0FBQyxTQUFTLENBQUM7WUFDWCxJQUFJLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRTtnQkFDYixJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDcEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztZQUNsQyxDQUFDO1lBQ0QsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ2IsTUFBTSxZQUFZLEdBQUcsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxJQUFJLDRDQUE0QyxDQUFDO2dCQUNsRyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDeEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztZQUNsQyxDQUFDO1NBQ0osQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELGVBQWU7UUFDWCxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDMUQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsbUNBQW1DLENBQUMsQ0FBQztZQUM5RCxPQUFPO1NBQ1Y7UUFFRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM1RCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1FBRTdCLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ3JELElBQUksRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFO2dCQUNiLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNwQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO2dCQUM5QixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDO1lBQy9DLENBQUM7WUFDRCxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDYixNQUFNLFlBQVksR0FBRyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLElBQUksbUNBQW1DLENBQUM7Z0JBQ3pGLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUN4QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO1lBQ2xDLENBQUM7U0FDSixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsK0NBQStDO0lBQy9DLGdCQUFnQjtRQUNaLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUMxRCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO1lBQzlELE9BQU87U0FDVjtRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDekIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsQ0FBQztZQUNyRCxPQUFPO1NBQ1Y7UUFFRCwrREFBK0Q7UUFDL0QsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQzVDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsU0FBUyxLQUFLLEdBQUcsQ0FDMUMsQ0FBQztRQUNGLElBQUksYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDMUIsTUFBTSxPQUFPLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQ3JCLDZDQUE2QyxPQUFPLGtFQUFrRSxDQUN6SCxDQUFDO1lBQ0YsT0FBTztTQUNWO1FBRUQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQztRQUVqQyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsU0FBUyxDQUFDO1lBQzFFLElBQUksRUFBRSxDQUFDLE1BQTRCLEVBQUUsRUFBRTtnQkFDbkMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNyQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsS0FBSyxDQUFDO2dCQUNsQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDO2dCQUMzQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxDQUFDO1lBQ3RELENBQUM7WUFDRCxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDYixNQUFNLFlBQVksR0FBRyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLElBQUkseUNBQXlDLENBQUM7Z0JBQy9GLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUN4QyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsS0FBSyxDQUFDO1lBQ3RDLENBQUM7U0FDSixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsa0RBQWtEO0lBQ2xELGdCQUFnQjtRQUNaLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUMxRCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO1lBQzlELE9BQU87U0FDVjtRQUVELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzVELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVsRSxJQUFJLENBQUMsbUJBQW1CO2FBQ25CLElBQUksQ0FBQyxHQUFHLE9BQU8seUVBQXlFLEVBQUUsbUJBQW1CLENBQUM7YUFDOUcsU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDbEIsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFO2dCQUN0QixJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDO2dCQUNqQyxJQUFJLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxDQUFDLFNBQVMsQ0FBQztvQkFDdkQsSUFBSSxFQUFFLENBQUMsTUFBNEIsRUFBRSxFQUFFO3dCQUNuQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLENBQUM7d0JBQ3JDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxLQUFLLENBQUM7d0JBQ2xDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUM7d0JBQzNDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFLENBQUM7b0JBQ3RELENBQUM7b0JBQ0QsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7d0JBQ2IsTUFBTSxZQUFZLEdBQUcsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxJQUFJLDhDQUE4QyxDQUFDO3dCQUNwRyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQzt3QkFDeEMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQztvQkFDdEMsQ0FBQztpQkFDSixDQUFDLENBQUM7YUFDTjtRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVELHFEQUFxRDtJQUNyRCxxQkFBcUI7UUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUN6QixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1lBQ3JELE9BQU87U0FDVjtRQUVELGlFQUFpRTtRQUNqRSx1R0FBdUc7UUFDdkcscUdBQXFHO1FBQ3JHLG9EQUFvRDtRQUNwRCxJQUFJLENBQUMsbUJBQW1CO2FBQ25CLElBQUksQ0FDRCxxSEFBcUg7WUFDakgseUZBQXlGLEVBQzdGLG1CQUFtQixFQUNuQixFQUFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsd0JBQXdCLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxDQUMxRjthQUNBLFNBQVMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ2xCLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRTtnQkFDdEIsT0FBTyxDQUFDLFFBQVE7YUFDbkI7WUFFRCxNQUFNLGlCQUFpQixHQUFHLE1BQU0sS0FBSyxTQUFTLENBQUM7WUFFL0MsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQztZQUNqQyxJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLGlCQUFpQixDQUFDLENBQUMsU0FBUyxDQUFDO2dCQUN6RyxJQUFJLEVBQUUsQ0FBQyxNQUE0QixFQUFFLEVBQUU7b0JBQ25DLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDckMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQztvQkFDbEMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQztvQkFDM0MsSUFBSSxDQUFDLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsQ0FBQztnQkFDdEQsQ0FBQztnQkFDRCxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtvQkFDYixNQUFNLFlBQVksR0FBRyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLElBQUksK0NBQStDLENBQUM7b0JBQ3JHLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO29CQUN4QyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsS0FBSyxDQUFDO2dCQUN0QyxDQUFDO2FBQ0osQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRUQseURBQXlEO0lBQ3pELHVCQUF1QjtRQUNuQixJQUFJLENBQUMsbUJBQW1CO2FBQ25CLElBQUksQ0FBQyxzREFBc0QsRUFBRSx5QkFBeUIsQ0FBQzthQUN2RixTQUFTLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUNsQixJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUU7Z0JBQ3RCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxZQUFZLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztvQkFDbkUsSUFBSSxFQUFFLENBQUMsTUFBNEIsRUFBRSxFQUFFO3dCQUNuQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLENBQUM7d0JBQ3JDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxLQUFLLENBQUM7d0JBQ2xDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUM7d0JBQzNDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFLENBQUM7b0JBQ3RELENBQUM7b0JBQ0QsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7d0JBQ2IsTUFBTSxZQUFZLEdBQUcsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxJQUFJLDRDQUE0QyxDQUFDO3dCQUNsRyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQzt3QkFDeEMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQztvQkFDdEMsQ0FBQztpQkFDSixDQUFDLENBQUM7YUFDTjtRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUlPLHVCQUF1QixDQUFDLE1BQTRCO1FBQ3hELE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDN0YsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFFMUMsSUFBSSxNQUFNLENBQUMsU0FBUyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUN0QyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDL0M7YUFBTSxJQUFJLE1BQU0sQ0FBQyxZQUFZLEdBQUcsQ0FBQyxFQUFFO1lBQ2hDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUM1QzthQUFNO1lBQ0gsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzdDO1FBRUQsb0NBQW9DO1FBQ3BDLElBQUksU0FBUyxFQUFFO1lBQ1gsTUFBTSxlQUFlLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztZQUVsRixNQUFNLFlBQVksR0FBRyxlQUFlLEdBQUcsZUFBZSxDQUFDLHdCQUF3QjtnQkFDM0UsQ0FBQyxDQUFDLDJCQUEyQixZQUFZLENBQUMsTUFBTSxhQUFhLGVBQWUsVUFBVTtnQkFDdEYsQ0FBQyxDQUFDLG9CQUFvQixZQUFZO3FCQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLFlBQVksQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7cUJBQ3hHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBRXhCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQzFDO0lBQ0wsQ0FBQztJQUVELFNBQVM7UUFDTCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBQy9DLENBQUM7SUFFRCxhQUFhO1FBQ1Qsa0JBQWtCO0lBQ3RCLENBQUM7O0FBbEN1Qix3Q0FBd0IsR0FBRyxDQUFDLENBQUM7NEdBNWQ1QyxlQUFlO2dHQUFmLGVBQWUsd0tDYjVCLGszbEJBZ2NBOzJGRG5iYSxlQUFlO2tCQUwzQixTQUFTOytCQUNJLFlBQVk7aU1BSzRCLGdCQUFnQjtzQkFBakUsU0FBUzt1QkFBQyxrQkFBa0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IER4RGF0YUdyaWRDb21wb25lbnQgfSBmcm9tICdkZXZleHRyZW1lLWFuZ3VsYXInO1xyXG5pbXBvcnQgeyBPcmRlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9oaXQtcHJveHkvb3JkZXJzL29yZGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTYXBPcmRlckR0bywgUmVzZXJ2YXRpb25SZXN1bHREdG8gfSBmcm9tICcuLi8uLi9oaXQtcHJveHkvb3JkZXJzL21vZGVsJztcclxuaW1wb3J0IHsgV2FyZWhvdXNlU2VydmljZSwgV2FyZWhvdXNlRHRvIH0gZnJvbSAnLi4vLi4vaGl0LXByb3h5L3dhcmVob3VzZS93YXJlaG91c2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IENvbmZpcm1hdGlvblNlcnZpY2UsIFRvYXN0ZXJTZXJ2aWNlIH0gZnJvbSAnQGFicC9uZy50aGVtZS5zaGFyZWQnO1xyXG5pbXBvcnQgRGF0YVNvdXJjZSBmcm9tICdkZXZleHRyZW1lL2RhdGEvZGF0YV9zb3VyY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2xpYi1vcmRlcnMnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL29yZGVycy5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9vcmRlcnMuY29tcG9uZW50LnNjc3MnXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIE9yZGVyc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgICBAVmlld0NoaWxkKCdkeE9yZGVyc0luc3RhbmNlJywgeyBzdGF0aWM6IGZhbHNlIH0pIGR4T3JkZXJzSW5zdGFuY2U6IER4RGF0YUdyaWRDb21wb25lbnQ7XHJcblxyXG4gICAgb3JkZXJzRGF0YVNvdXJjZTogRGF0YVNvdXJjZTtcclxuICAgIHNlbGVjdGVkT3JkZXJzOiBTYXBPcmRlckR0b1tdID0gW107XHJcblxyXG4gICAgLy8gVG9vbGJhciBmaWx0ZXJzXHJcbiAgICBzZWxlY3RlZFdhcmVob3VzZTogc3RyaW5nID0gJyc7XHJcbiAgICBzZWxlY3RlZERhdGU6IHN0cmluZyA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zdWJzdHJpbmcoMCwgMTApO1xyXG4gICAgYWN0aXZlTGlzdFR5cGU6IHN0cmluZyB8IG51bGwgPSBudWxsOyAvLyBudWxsID0gdMO8bcO8LCAnMScgfCAnMicgfCAnMydcclxuICAgIGFjdGl2ZVN0YXR1czogc3RyaW5nIHwgbnVsbCA9IG51bGw7IC8vIG51bGwgPSB0w7xtw7wsICdiZWtsZW1lZGUnICgwKSB8ICdvbmF5QmVrbGl5b3InICgxKSB8ICdpc2xlbml5b3InICgyKSB8ICd0YW1hbWxhbmRpJyAoMylcclxuXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN0YXR1c01hcDogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcclxuICAgICAgICBiZWtsZW1lZGU6ICcwJyxcclxuICAgICAgICBvbmF5QmVrbGl5b3I6ICcxJyxcclxuICAgICAgICBpc2xlbml5b3I6ICcyJyxcclxuICAgICAgICB0YW1hbWxhbmRpOiAnMycsXHJcbiAgICB9O1xyXG5cclxuICAgIC8vIEFkZGl0aW9uYWwgaW5wdXRzXHJcbiAgICBjdXN0b21JbnB1dFZhbHVlOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgICB3YXJlaG91c2VzOiBXYXJlaG91c2VEdG9bXSA9IFtdO1xyXG4gICAgaXNMb2FkaW5nV2FyZWhvdXNlczogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGlzR29yZXZCYXNsYXRMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBpc1Jlc2VydmF0aW9uTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgaXNCZWVDZWxsTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGJvc0thc2FQb3B1cFZpc2libGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGJvc0thc2FTdGF0aW9uSWQ6IG51bWJlciA9IDE7XHJcbiAgICBib3NLYXNhU2hlbGZJZDogbnVtYmVyID0gMTtcclxuICAgIGJvc0thc2FCb3hDb3VudDogbnVtYmVyID0gNTtcclxuICAgIGJvc0thc2FNb2RlOiAnZW1wdHknIHwgJ2hhbGYnID0gJ2VtcHR5JztcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG9yZGVyU2VydmljZTogT3JkZXJTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgd2FyZWhvdXNlU2VydmljZTogV2FyZWhvdXNlU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHRvYXN0ZXJTZXJ2aWNlOiBUb2FzdGVyU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpcm1hdGlvblNlcnZpY2U6IENvbmZpcm1hdGlvblNlcnZpY2VcclxuICAgICkge31cclxuXHJcbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmxvYWRXYXJlaG91c2VzKCk7XHJcbiAgICAgICAgdGhpcy5zZXR1cERhdGFTb3VyY2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGxvYWRXYXJlaG91c2VzKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaXNMb2FkaW5nV2FyZWhvdXNlcyA9IHRydWU7XHJcbiAgICAgICAgdGhpcy53YXJlaG91c2VTZXJ2aWNlLmdldFNtYXJ0V2FyZWhvdXNlcygpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgIG5leHQ6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLndhcmVob3VzZXMgPSBkYXRhIHx8IFtdO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMud2FyZWhvdXNlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFdhcmVob3VzZSA9IHRoaXMud2FyZWhvdXNlc1swXS5XaHNDb2RlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmdXYXJlaG91c2VzID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdEZXBvbGFyIHnDvGtsZW5lbWVkaTonLCBlcnIpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy50b2FzdGVyU2VydmljZS5lcnJvcignRGVwb2xhciB5w7xrbGVuZW1lZGkuJyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzTG9hZGluZ1dhcmVob3VzZXMgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2V0dXBEYXRhU291cmNlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMub3JkZXJzRGF0YVNvdXJjZSA9IG5ldyBEYXRhU291cmNlKHtcclxuICAgICAgICAgICAgc3RvcmU6IHRoaXMub3JkZXJTZXJ2aWNlLmxvYWRPcmRlcnMsXHJcbiAgICAgICAgICAgIGZpbHRlcjogdGhpcy5idWlsZENvbWJpbmVkRmlsdGVyKCksXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBidWlsZENvbWJpbmVkRmlsdGVyKCk6IGFueSB7XHJcbiAgICAgICAgY29uc3Qgc3RhdHVzRmlsdGVyID0gdGhpcy5idWlsZFN0YXR1c0ZpbHRlcigpO1xyXG4gICAgICAgIGNvbnN0IGxpc3RUeXBlRmlsdGVyID0gdGhpcy5idWlsZExpc3RUeXBlRmlsdGVyKCk7XHJcblxyXG4gICAgICAgIGlmIChzdGF0dXNGaWx0ZXIgJiYgbGlzdFR5cGVGaWx0ZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtzdGF0dXNGaWx0ZXIsICdhbmQnLCBsaXN0VHlwZUZpbHRlcl07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzdGF0dXNGaWx0ZXIgfHwgbGlzdFR5cGVGaWx0ZXIgfHwgbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGJ1aWxkTGlzdFR5cGVGaWx0ZXIoKTogYW55IHtcclxuICAgICAgICBpZiAoIXRoaXMuYWN0aXZlTGlzdFR5cGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBbJ1VfU1dPcmRlclR5cGUnLCAnPScsIHRoaXMuYWN0aXZlTGlzdFR5cGVdO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYnVpbGRTdGF0dXNGaWx0ZXIoKTogYW55IHtcclxuICAgICAgICBpZiAoIXRoaXMuYWN0aXZlU3RhdHVzKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlU3RhdHVzID09PSAnYmVrbGVtZWRlJykge1xyXG4gICAgICAgICAgICAvLyBTQVAnZGFuIGdlbGVuIFVfU1dEdXJ1bSBudWxsL2JvxZ8gZGXEn2VybGVyIGJhY2tlbmQnZGUgJzAnIG9sYXJhayBub3JtYWxpemUgZWRpbGl5b3JcclxuICAgICAgICAgICAgcmV0dXJuIFsnVV9TV0R1cnVtJywgJz0nLCAnMCddO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIFsnVV9TV0R1cnVtJywgJz0nLCB0aGlzLnN0YXR1c01hcFt0aGlzLmFjdGl2ZVN0YXR1c11dO1xyXG4gICAgfVxyXG5cclxuICAgIHRvZ2dsZVN0YXR1cyhrZXk6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuYWN0aXZlU3RhdHVzID0gdGhpcy5hY3RpdmVTdGF0dXMgPT09IGtleSA/IG51bGwgOiBrZXk7XHJcbiAgICAgICAgdGhpcy5hcHBseUZpbHRlcnMoKTtcclxuICAgIH1cclxuXHJcbiAgICB0b2dnbGVMaXN0VHlwZShrZXk6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuYWN0aXZlTGlzdFR5cGUgPSB0aGlzLmFjdGl2ZUxpc3RUeXBlID09PSBrZXkgPyBudWxsIDoga2V5O1xyXG4gICAgICAgIHRoaXMuYXBwbHlGaWx0ZXJzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhcHBseUZpbHRlcnMoKTogdm9pZCB7XHJcbiAgICAgICAgLy8gRGVwbyBUYWxlcGxlcmkgZGUgZGFoaWwsIMO8w6cgY2hpcCBkZSBheW7EsSBTQVAgc2lwYXJpxZ9sZXJpIGtheW5hxJ/EsW7EsSAoVV9TV09yZGVyVHlwZSBmaWx0cmVzaXlsZSkga3VsbGFuxLFyLlxyXG4gICAgICAgIC8vIERhdGFTb3VyY2UgeWVuaWRlbiBvbHXFn3R1cnVsdXAgZ3JpZCdlIGF0YW7EsXlvcjsgbWV2Y3V0IERhdGFTb3VyY2Ugw7x6ZXJpbmRlIC5maWx0ZXIoKSsucmVsb2FkKClcclxuICAgICAgICAvLyDDp2HEn8Sxcm1hayBncmlkJ2UgeWFuc8SxbcSxeW9yZHUgw6fDvG5rw7wgQW5ndWxhciBiaW5kaW5nIHNhZGVjZSByZWZlcmFucyBkZcSfacWfaW5jZSB0ZXRpa2xlbml5b3IuXHJcbiAgICAgICAgdGhpcy5vcmRlcnNEYXRhU291cmNlID0gbmV3IERhdGFTb3VyY2Uoe1xyXG4gICAgICAgICAgICBzdG9yZTogdGhpcy5vcmRlclNlcnZpY2UubG9hZE9yZGVycyxcclxuICAgICAgICAgICAgZmlsdGVyOiB0aGlzLmJ1aWxkQ29tYmluZWRGaWx0ZXIoKSxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBvblNlbGVjdGlvbkNoYW5nZWQoZTogYW55KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZE9yZGVycyA9IGUuc2VsZWN0ZWRSb3dzRGF0YSB8fCBbXTtcclxuICAgIH1cclxuXHJcbiAgICBvblJvd0NsaWNrKGU6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIC8vIEXEn2VyIGV4cGFuZC9jb2xsYXBzZSBpY29uJ3VuYSB2ZXlhIGNoZWNrYm94J2EgdMSxa2xhbmTEsXlzYSwgRGV2RXh0cmVtZSdpbiBrZW5kaSBkYXZyYW7EscWfxLFuxLEga3VsbGFuXHJcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZS5ldmVudD8udGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIGlmICh0YXJnZXQ/LmNsb3Nlc3QoJy5keC1jb21tYW5kLWV4cGFuZCcpIHx8IHRhcmdldD8uY2xvc2VzdCgnLmR4LW1hc3Rlci1kZXRhaWwtY2VsbCcpIHx8IHRhcmdldD8uY2xvc2VzdCgnLmR4LXNlbGVjdC1jaGVja2JveCcpIHx8IHRhcmdldD8uY2xvc2VzdCgnLmR4LWNvbW1hbmQtc2VsZWN0JykpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGUucm93VHlwZSA9PT0gJ2RhdGEnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzRXhwYW5kZWQgPSBlLmNvbXBvbmVudC5pc1Jvd0V4cGFuZGVkKGUua2V5KTtcclxuICAgICAgICAgICAgaWYgKGlzRXhwYW5kZWQpIHtcclxuICAgICAgICAgICAgICAgIGUuY29tcG9uZW50LmNvbGxhcHNlUm93KGUua2V5KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGUuY29tcG9uZW50LmV4cGFuZFJvdyhlLmtleSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25Sb3dQcmVwYXJlZChlOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBpZiAoZS5yb3dUeXBlID09PSAnZGF0YScgJiYgZS5kYXRhPy5VX1NXSXNFcnJvciA9PT0gJ1knKSB7XHJcbiAgICAgICAgICAgIGUucm93RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdvcmRlci1yb3ctZXJyb3InKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25Hb3JldkJhc2xhdCgpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRPcmRlcnMgfHwgdGhpcy5zZWxlY3RlZE9yZGVycy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgdGhpcy50b2FzdGVyU2VydmljZS53YXJuKCdMw7x0ZmVuIGVuIGF6IGJpciBzaXBhcmnFnyBzZcOnaW5pei4nKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gVmFsaWRhdGU6IFVfU1dEdXJ1bSBtdXN0IGJlIFwiMVwiIChPbmF5IEJla2xpeW9yKVxyXG4gICAgICAgIGNvbnN0IGludmFsaWRTdGF0dXMgPSB0aGlzLnNlbGVjdGVkT3JkZXJzLmZpbHRlcihcclxuICAgICAgICAgICAgbyA9PiBvLlVfU1dEdXJ1bSAhPT0gJzEnXHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAoaW52YWxpZFN0YXR1cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRvY051bXMgPSBpbnZhbGlkU3RhdHVzLm1hcChvID0+IG8uRG9jTnVtKS5qb2luKCcsICcpO1xyXG4gICAgICAgICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLmVycm9yKFxyXG4gICAgICAgICAgICAgICAgYMWedSBzaXBhcmnFn2xlcmluIGR1cnVtdSBcIk9uYXkgQmVrbGl5b3JcIiBkZcSfaWw6ICR7ZG9jTnVtc30uIFNhZGVjZSBlxZ9sZW1lc2kgeWFwxLFsbcSxxZ8gc2lwYXJpxZ9sZXIgacOnaW4gZ8O2cmV2IGJhxZ9sYXTEsWxhYmlsaXIuYFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBWYWxpZGF0ZTogVV9TV1N0YXRpb25Db2RlIG11c3QgYmUgZmlsbGVkXHJcbiAgICAgICAgY29uc3Qgbm9TdGF0aW9uID0gdGhpcy5zZWxlY3RlZE9yZGVycy5maWx0ZXIoXHJcbiAgICAgICAgICAgIG8gPT4gIW8uVV9TV1N0YXRpb25Db2RlIHx8IG8uVV9TV1N0YXRpb25Db2RlLnRyaW0oKSA9PT0gJydcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmIChub1N0YXRpb24ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBjb25zdCBkb2NOdW1zID0gbm9TdGF0aW9uLm1hcChvID0+IG8uRG9jTnVtKS5qb2luKCcsICcpO1xyXG4gICAgICAgICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLmVycm9yKFxyXG4gICAgICAgICAgICAgICAgYMWedSBzaXBhcmnFn2xlcmluIGlzdGFzeW9uIGJpbGdpc2kgYm/FnzogJHtkb2NOdW1zfS4gxLBzdGFzeW9uIGFsYW7EsSBkb2x1IG9sbWFsxLFkxLFyLmBcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZG9jRW50cmllcyA9IHRoaXMuc2VsZWN0ZWRPcmRlcnMubWFwKG8gPT4gby5Eb2NFbnRyeSk7XHJcblxyXG4gICAgICAgIHRoaXMuaXNHb3JldkJhc2xhdExvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMub3JkZXJTZXJ2aWNlLnN0YXJ0VGFzayhkb2NFbnRyaWVzKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICBuZXh0OiAocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLnN1Y2Nlc3MocmVzdWx0KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNHb3JldkJhc2xhdExvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZHhPcmRlcnNJbnN0YW5jZT8uaW5zdGFuY2U/LnJlZnJlc2goKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZHhPcmRlcnNJbnN0YW5jZT8uaW5zdGFuY2U/LmNsZWFyU2VsZWN0aW9uKCk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yPy5lcnJvcj8uZXJyb3I/Lm1lc3NhZ2UgfHwgJ0fDtnJldiBiYcWfbGF0xLFsxLFya2VuIGJpciBoYXRhIG9sdcWfdHUuJztcclxuICAgICAgICAgICAgICAgIHRoaXMudG9hc3RlclNlcnZpY2UuZXJyb3IoZXJyb3JNZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNHb3JldkJhc2xhdExvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBHw7ZyZXZpIFRhbWFtbGE6IMSwxZ9sZW5peW9yICgyKSBkdXJ1bXVuZGFraSBzaXBhcmnFn2xlcmkgQmVlQ2VsbCBnw7ZyZXZpIGJpdG1pxZ9zZSBkb8SfcnVkYW5cclxuICAgIC8vIFRhbWFtbGFuZMSxJ3lhICgzKSBnw7Z0w7xyw7xyIOKAlCBlc2tpIFwiR8O2cmV2IFRhbWFtbGFcIiArIFwiT25heSBWZXJcIiBpa2kgYWTEsW3EsSwgZXNraSBzaXN0ZW1pblxyXG4gICAgLy8gdGVrLWFrc2l5b24gZGF2cmFuxLHFn8SxbmEgdXlndW4gxZ9la2lsZGUgdGVrIGJ1dG9uZGEgYmlybGXFn3RpcmlyLlxyXG4gICAgb25PbmF5VmVyKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy5zZWxlY3RlZE9yZGVycyB8fCB0aGlzLnNlbGVjdGVkT3JkZXJzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLndhcm4oJ0zDvHRmZW4gZW4gYXogYmlyIHNpcGFyacWfIHNlw6dpbml6LicpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBWYWxpZGF0ZTogVV9TV0R1cnVtIFwiMlwiICjEsMWfbGVuaXlvcikgb2xtYWzEsVxyXG4gICAgICAgIGNvbnN0IGludmFsaWRTdGF0dXMgPSB0aGlzLnNlbGVjdGVkT3JkZXJzLmZpbHRlcihcclxuICAgICAgICAgICAgbyA9PiAhby5VX1NXRHVydW0gfHwgby5VX1NXRHVydW0gIT09ICcyJ1xyXG4gICAgICAgICk7XHJcbiAgICAgICAgaWYgKGludmFsaWRTdGF0dXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBjb25zdCBkb2NOdW1zID0gaW52YWxpZFN0YXR1cy5tYXAobyA9PiBvLkRvY051bSkuam9pbignLCAnKTtcclxuICAgICAgICAgICAgdGhpcy50b2FzdGVyU2VydmljZS5lcnJvcihcclxuICAgICAgICAgICAgICAgIGDFnnUgc2lwYXJpxZ9sZXJpbiBkdXJ1bXUgXCLEsMWfbGVuaXlvclwiIGRlxJ9pbDogJHtkb2NOdW1zfS4gU2FkZWNlIGJ1IGR1cnVtZGFraSBzaXBhcmnFn2xlciB0YW1hbWxhbmFiaWxpci5gXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGRvY0VudHJpZXMgPSB0aGlzLnNlbGVjdGVkT3JkZXJzLm1hcChvID0+IG8uRG9jRW50cnkpO1xyXG5cclxuICAgICAgICB0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2VcclxuICAgICAgICAgICAgLndhcm4oJ1Nlw6dpbGkgc2lwYXJpxZ9sZXIgdGFtYW1sYW5hY2FrLiBTdG9rIG5ha2xpIHZlIGZhdHVyYSBvbHXFn3R1cnVsYWNha3TEsXIuIEVtaW4gbWlzaW5pej8nLCAnR8O2cmV2aSBUYW1hbWxhJylcclxuICAgICAgICAgICAgLnN1YnNjcmliZSgoc3RhdHVzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09PSAnY29uZmlybScpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9yZGVyU2VydmljZS5hcHByb3ZlVGFzayhkb2NFbnRyaWVzLCB0aGlzLmFjdGl2ZUxpc3RUeXBlKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0OiAocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLnN1Y2Nlc3MocmVzdWx0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHhPcmRlcnNJbnN0YW5jZT8uaW5zdGFuY2U/LnJlZnJlc2goKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHhPcmRlcnNJbnN0YW5jZT8uaW5zdGFuY2U/LmNsZWFyU2VsZWN0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yPy5lcnJvcj8uZXJyb3I/Lm1lc3NhZ2UgfHwgJ09uYXkgdmVyaWxpcmtlbiBiaXIgaGF0YSBvbHXFn3R1Lic7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLmVycm9yKGVycm9yTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOKUgOKUgCBTaXBhcmnFnyhsZXIpaSBzZXZraXlhdGEgc29rbWFkYW4gZG/En3J1ZGFuIGthcGF0IOKUgOKUgFxyXG4gICAgb25TaXBhcmlzS2FwYXQoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkT3JkZXJzIHx8IHRoaXMuc2VsZWN0ZWRPcmRlcnMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMudG9hc3RlclNlcnZpY2Uud2FybignTMO8dGZlbiBlbiBheiBiaXIgc2lwYXJpxZ8gc2XDp2luaXouJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFwixLDFn2xlbml5b3JcIiAoYWt0aWYgQmVlQ2VsbCBnw7ZyZXZpKSBkdXJ1bXVuZGFraSBzaXBhcmnFn2xlciBrYXBhdMSxbGFtYXpcclxuICAgICAgICBjb25zdCBpbnZhbGlkU3RhdHVzID0gdGhpcy5zZWxlY3RlZE9yZGVycy5maWx0ZXIobyA9PiBvLlVfU1dEdXJ1bSA9PT0gJzInKTtcclxuICAgICAgICBpZiAoaW52YWxpZFN0YXR1cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRvY051bXMgPSBpbnZhbGlkU3RhdHVzLm1hcChvID0+IG8uRG9jTnVtKS5qb2luKCcsICcpO1xyXG4gICAgICAgICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLmVycm9yKFxyXG4gICAgICAgICAgICAgICAgYMWedSBzaXBhcmnFn2xlciBcIsSwxZ9sZW5peW9yXCIgZHVydW11bmRhIChha3RpZiBnw7ZyZXYgdmFyKTogJHtkb2NOdW1zfS4gw5ZuY2UgZ8O2cmV2aSB0YW1hbWxhecSxbiB5YSBkYSBCZWVDZWxsJ2RlIGlwdGFsIGVkaW4uYFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBkb2NFbnRyaWVzID0gdGhpcy5zZWxlY3RlZE9yZGVycy5tYXAobyA9PiBvLkRvY0VudHJ5KTtcclxuICAgICAgICBjb25zdCBkb2NOdW1zID0gdGhpcy5zZWxlY3RlZE9yZGVycy5tYXAobyA9PiBvLkRvY051bSkuam9pbignLCAnKTtcclxuXHJcbiAgICAgICAgdGhpcy5jb25maXJtYXRpb25TZXJ2aWNlXHJcbiAgICAgICAgICAgIC53YXJuKFxyXG4gICAgICAgICAgICAgICAgYCR7ZG9jTnVtc30gbnVtYXJhbMSxIHNpcGFyacWfbGVyIHNldmtpeWF0YSBzb2t1bG1hZGFuIGRvxJ9ydWRhbiBcIlRhbWFtbGFuZMSxXCIgb2xhcmFrIGthcGF0xLFsYWNhay4gYCArXHJcbiAgICAgICAgICAgICAgICAgICAgJ0hpw6diaXIgc3RvayBoYXJla2V0aS9pcnNhbGl5ZS9mYXR1cmEgb2x1xZ90dXJ1bG1heWFjYWsuIEVtaW4gbWlzaW5pej8nLFxyXG4gICAgICAgICAgICAgICAgJ1NpcGFyacWfIEthcGF0J1xyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHN0YXR1cykgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PT0gJ2NvbmZpcm0nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcmRlclNlcnZpY2UuY2xvc2VPcmRlcihkb2NFbnRyaWVzKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0OiAocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLnN1Y2Nlc3MocmVzdWx0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHhPcmRlcnNJbnN0YW5jZT8uaW5zdGFuY2U/LnJlZnJlc2goKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHhPcmRlcnNJbnN0YW5jZT8uaW5zdGFuY2U/LmNsZWFyU2VsZWN0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yPy5lcnJvcj8uZXJyb3I/Lm1lc3NhZ2UgfHwgJ1NpcGFyacWfIGthcGF0xLFsxLFya2VuIGJpciBoYXRhIG9sdcWfdHUuJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9hc3RlclNlcnZpY2UuZXJyb3IoZXJyb3JNZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgb25Cb3NLYXNhR2V0aXIoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5ib3NLYXNhTW9kZSA9ICdlbXB0eSc7XHJcbiAgICAgICAgdGhpcy5ib3NLYXNhUG9wdXBWaXNpYmxlID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBvbllhcmltS2FzYSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmJvc0thc2FNb2RlID0gJ2hhbGYnO1xyXG4gICAgICAgIHRoaXMuYm9zS2FzYVBvcHVwVmlzaWJsZSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgb25Cb3NLYXNhR29uZGVyKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuYm9zS2FzYVBvcHVwVmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuaXNCZWVDZWxsTG9hZGluZyA9IHRydWU7XHJcblxyXG4gICAgICAgIGNvbnN0IGNhbGwgPSB0aGlzLmJvc0thc2FNb2RlID09PSAnZW1wdHknXHJcbiAgICAgICAgICAgID8gdGhpcy5vcmRlclNlcnZpY2UuZ2V0RW1wdHlCb3hlcyh0aGlzLmJvc0thc2FTdGF0aW9uSWQsIHRoaXMuYm9zS2FzYVNoZWxmSWQsIHRoaXMuYm9zS2FzYUJveENvdW50LCB0aGlzLnNlbGVjdGVkV2FyZWhvdXNlKVxyXG4gICAgICAgICAgICA6IHRoaXMub3JkZXJTZXJ2aWNlLmdldEhhbGZCb3hlcyh0aGlzLmJvc0thc2FTdGF0aW9uSWQsIHRoaXMuYm9zS2FzYVNoZWxmSWQsIHRoaXMuYm9zS2FzYUJveENvdW50LCB0aGlzLnNlbGVjdGVkV2FyZWhvdXNlKTtcclxuXHJcbiAgICAgICAgY2FsbC5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICBuZXh0OiAocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLnN1Y2Nlc3MocmVzdWx0KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNCZWVDZWxsTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvcj8uZXJyb3I/LmVycm9yPy5tZXNzYWdlIHx8ICdCZWVDZWxsIGfDtnJldmkgb2x1xZ90dXJ1bHVya2VuIGhhdGEgb2x1xZ90dS4nO1xyXG4gICAgICAgICAgICAgICAgdGhpcy50b2FzdGVyU2VydmljZS5lcnJvcihlcnJvck1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc0JlZUNlbGxMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgb25EdXJ1bUd1bmNlbGxlKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy5zZWxlY3RlZE9yZGVycyB8fCB0aGlzLnNlbGVjdGVkT3JkZXJzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLndhcm4oJ0zDvHRmZW4gZW4gYXogYmlyIHNpcGFyacWfIHNlw6dpbml6LicpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBkb2NFbnRyaWVzID0gdGhpcy5zZWxlY3RlZE9yZGVycy5tYXAobyA9PiBvLkRvY0VudHJ5KTtcclxuICAgICAgICB0aGlzLmlzQmVlQ2VsbExvYWRpbmcgPSB0cnVlO1xyXG5cclxuICAgICAgICB0aGlzLm9yZGVyU2VydmljZS51cGRhdGVUYXNrU3RhdHVzKGRvY0VudHJpZXMpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgIG5leHQ6IChyZXN1bHQpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMudG9hc3RlclNlcnZpY2Uuc3VjY2VzcyhyZXN1bHQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc0JlZUNlbGxMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmR4T3JkZXJzSW5zdGFuY2U/Lmluc3RhbmNlPy5yZWZyZXNoKCk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yPy5lcnJvcj8uZXJyb3I/Lm1lc3NhZ2UgfHwgJ0R1cnVtIGfDvG5jZWxsZW5pcmtlbiBoYXRhIG9sdcWfdHUuJztcclxuICAgICAgICAgICAgICAgIHRoaXMudG9hc3RlclNlcnZpY2UuZXJyb3IoZXJyb3JNZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNCZWVDZWxsTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOKUgOKUgCBTZcOnaWxpIHNpcGFyacWfbGVyIGnDp2luIHJlemVydmFzeW9uIHlhcCDilIDilIBcclxuICAgIG9uUmV6ZXJ2YXN5b25ZYXAoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkT3JkZXJzIHx8IHRoaXMuc2VsZWN0ZWRPcmRlcnMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMudG9hc3RlclNlcnZpY2Uud2FybignTMO8dGZlbiBlbiBheiBiaXIgc2lwYXJpxZ8gc2XDp2luaXouJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5zZWxlY3RlZFdhcmVob3VzZSkge1xyXG4gICAgICAgICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLndhcm4oJ0zDvHRmZW4gYmlyIGRlcG8gc2XDp2luaXouJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFNhZGVjZSBCZWtsZW1lZGUgKDApIHNpcGFyacWfbGVyIGnDp2luIHJlemVydmFzeW9uIHlhcMSxbGFiaWxpclxyXG4gICAgICAgIGNvbnN0IGludmFsaWRTdGF0dXMgPSB0aGlzLnNlbGVjdGVkT3JkZXJzLmZpbHRlcihcclxuICAgICAgICAgICAgbyA9PiBvLlVfU1dEdXJ1bSAmJiBvLlVfU1dEdXJ1bSAhPT0gJzAnXHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAoaW52YWxpZFN0YXR1cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRvY051bXMgPSBpbnZhbGlkU3RhdHVzLm1hcChvID0+IG8uRG9jTnVtKS5qb2luKCcsICcpO1xyXG4gICAgICAgICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLmVycm9yKFxyXG4gICAgICAgICAgICAgICAgYMWedSBzaXBhcmnFn2xlcmluIGR1cnVtdSBcIkJla2xlbWVkZVwiIGRlxJ9pbDogJHtkb2NOdW1zfS4gU2FkZWNlIGJla2xlbWVkZSBvbGFuIHNpcGFyacWfbGVyIGnDp2luIHJlemVydmFzeW9uIHlhcMSxbGFiaWxpci5gXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGRvY0VudHJpZXMgPSB0aGlzLnNlbGVjdGVkT3JkZXJzLm1hcChvID0+IG8uRG9jRW50cnkpO1xyXG4gICAgICAgIHRoaXMuaXNSZXNlcnZhdGlvbkxvYWRpbmcgPSB0cnVlO1xyXG5cclxuICAgICAgICB0aGlzLm9yZGVyU2VydmljZS5yZXNlcnZlT3JkZXJzKGRvY0VudHJpZXMsIHRoaXMuc2VsZWN0ZWRXYXJlaG91c2UpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgIG5leHQ6IChyZXN1bHQ6IFJlc2VydmF0aW9uUmVzdWx0RHRvKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVJlc2VydmF0aW9uUmVzdWx0KHJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzUmVzZXJ2YXRpb25Mb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmR4T3JkZXJzSW5zdGFuY2U/Lmluc3RhbmNlPy5yZWZyZXNoKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmR4T3JkZXJzSW5zdGFuY2U/Lmluc3RhbmNlPy5jbGVhclNlbGVjdGlvbigpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvcj8uZXJyb3I/LmVycm9yPy5tZXNzYWdlIHx8ICdSZXplcnZhc3lvbiB5YXDEsWzEsXJrZW4gYmlyIGhhdGEgb2x1xZ90dS4nO1xyXG4gICAgICAgICAgICAgICAgdGhpcy50b2FzdGVyU2VydmljZS5lcnJvcihlcnJvck1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc1Jlc2VydmF0aW9uTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOKUgOKUgCBTZcOnaWxpIHNpcGFyacWfbGVyaW4gcmV6ZXJ2YXN5b25sYXLEsW7EsSBzaWwg4pSA4pSAXHJcbiAgICBvblJlemVydmFzeW9uU2lsKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy5zZWxlY3RlZE9yZGVycyB8fCB0aGlzLnNlbGVjdGVkT3JkZXJzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLndhcm4oJ0zDvHRmZW4gZW4gYXogYmlyIHNpcGFyacWfIHNlw6dpbml6LicpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBkb2NFbnRyaWVzID0gdGhpcy5zZWxlY3RlZE9yZGVycy5tYXAobyA9PiBvLkRvY0VudHJ5KTtcclxuICAgICAgICBjb25zdCBkb2NOdW1zID0gdGhpcy5zZWxlY3RlZE9yZGVycy5tYXAobyA9PiBvLkRvY051bSkuam9pbignLCAnKTtcclxuXHJcbiAgICAgICAgdGhpcy5jb25maXJtYXRpb25TZXJ2aWNlXHJcbiAgICAgICAgICAgIC53YXJuKGAke2RvY051bXN9IG51bWFyYWzEsSBzaXBhcmnFn2xlcmluIHJlemVydmFzeW9ubGFyxLEgaXB0YWwgZWRpbGVjZWt0aXIuIEVtaW4gbWlzaW5pej9gLCAnUmV6ZXJ2YXN5b24gxLBwdGFsJylcclxuICAgICAgICAgICAgLnN1YnNjcmliZSgoc3RhdHVzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09PSAnY29uZmlybScpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzUmVzZXJ2YXRpb25Mb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9yZGVyU2VydmljZS5jYW5jZWxSZXNlcnZhdGlvbnMoZG9jRW50cmllcykuc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dDogKHJlc3VsdDogUmVzZXJ2YXRpb25SZXN1bHREdG8pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlUmVzZXJ2YXRpb25SZXN1bHQocmVzdWx0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNSZXNlcnZhdGlvbkxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHhPcmRlcnNJbnN0YW5jZT8uaW5zdGFuY2U/LnJlZnJlc2goKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHhPcmRlcnNJbnN0YW5jZT8uaW5zdGFuY2U/LmNsZWFyU2VsZWN0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yPy5lcnJvcj8uZXJyb3I/Lm1lc3NhZ2UgfHwgJ1JlemVydmFzeW9uIGlwdGFsIGVkaWxpcmtlbiBiaXIgaGF0YSBvbHXFn3R1Lic7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLmVycm9yKGVycm9yTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzUmVzZXJ2YXRpb25Mb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOKUgOKUgCBUb3BsdSByZXplcnZhc3lvbiB5YXAgKHTDvG0gdXlndW4gc2lwYXJpxZ9sZXIpIOKUgOKUgFxyXG4gICAgb25Ub3BsdVJlemVydmFzeW9uWWFwKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy5zZWxlY3RlZFdhcmVob3VzZSkge1xyXG4gICAgICAgICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLndhcm4oJ0zDvHRmZW4gYmlyIGRlcG8gc2XDp2luaXouJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFphdGVuIHJlemVydmFzeW9udSBvbGFuIHNpcGFyacWfbGVyIGnDp2luIGt1bGxhbsSxY8SxeWEgc2XDp2ltIHN1bjpcclxuICAgICAgICAvLyAgLSBcIlllbmlkZW4gSGVzYXBsYVwiIChjb25maXJtKSDihpIgbWV2Y3V0IHJlemVydmFzeW9ubGFyxLEgc2lsaXAgeWVuaWRlbiBrdXJhciAob3ZlcndyaXRlRXhpc3Rpbmc9dHJ1ZSlcclxuICAgICAgICAvLyAgLSBcIlNhZGVjZSBZZW5pIFNpcGFyacWfbGVyXCIgKHJlamVjdCkg4oaSIG1ldmN1dGxhcsSxIGtvcnVyLCB5YWxuxLF6Y2EgcmV6ZXJ2YXN5b25zdXpsYXLEsSBpxZ9sZXIgKGZhbHNlKVxyXG4gICAgICAgIC8vICAtIERpeWFsb8SfdSBrYXBhdG1hIChkaXNtaXNzKSDihpIgacWfbGVtaSBpcHRhbCBlZGVyXHJcbiAgICAgICAgdGhpcy5jb25maXJtYXRpb25TZXJ2aWNlXHJcbiAgICAgICAgICAgIC53YXJuKFxyXG4gICAgICAgICAgICAgICAgJ1phdGVuIHJlemVydmFzeW9udSBvbGFuIHNpcGFyacWfbGVyIGnDp2luIG5lIHlhcMSxbHPEsW4/IFwiWWVuaWRlbiBIZXNhcGxhXCIgbWV2Y3V0IHJlemVydmFzeW9ubGFyxLEgc2lsaXAgeWVuaWRlbiBrdXJhcjsgJyArXHJcbiAgICAgICAgICAgICAgICAgICAgJ1wiU2FkZWNlIFllbmkgU2lwYXJpxZ9sZXJcIiBtZXZjdXRsYXLEsSBrb3J1ciB2ZSB5YWxuxLF6Y2EgcmV6ZXJ2YXN5b25zdXogc2lwYXJpxZ9sZXJpIGnFn2xlci4nLFxyXG4gICAgICAgICAgICAgICAgJ1RvcGx1IFJlemVydmFzeW9uJyxcclxuICAgICAgICAgICAgICAgIHsgeWVzVGV4dDogJ1llbmlkZW4gSGVzYXBsYScsIGNhbmNlbFRleHQ6ICdTYWRlY2UgWWVuaSBTaXBhcmnFn2xlcicsIGRpc21pc3NpYmxlOiB0cnVlIH1cclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChzdGF0dXMpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT09ICdkaXNtaXNzJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy8gaXB0YWxcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBvdmVyd3JpdGVFeGlzdGluZyA9IHN0YXR1cyA9PT0gJ2NvbmZpcm0nO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuaXNSZXNlcnZhdGlvbkxvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vcmRlclNlcnZpY2UucmVzZXJ2ZUFsbE9yZGVycyh0aGlzLnNlbGVjdGVkV2FyZWhvdXNlLCB0aGlzLmFjdGl2ZUxpc3RUeXBlLCBvdmVyd3JpdGVFeGlzdGluZykuc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgICAgICAgICBuZXh0OiAocmVzdWx0OiBSZXNlcnZhdGlvblJlc3VsdER0bykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVJlc2VydmF0aW9uUmVzdWx0KHJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNSZXNlcnZhdGlvbkxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5keE9yZGVyc0luc3RhbmNlPy5pbnN0YW5jZT8ucmVmcmVzaCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmR4T3JkZXJzSW5zdGFuY2U/Lmluc3RhbmNlPy5jbGVhclNlbGVjdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvcj8uZXJyb3I/LmVycm9yPy5tZXNzYWdlIHx8ICdUb3BsdSByZXplcnZhc3lvbiB5YXDEsWzEsXJrZW4gYmlyIGhhdGEgb2x1xZ90dS4nO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLmVycm9yKGVycm9yTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNSZXNlcnZhdGlvbkxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOKUgOKUgCBUb3BsdSByZXplcnZhc3lvbiBzaWwgKHTDvG0gYWt0aWYgcmV6ZXJ2YXN5b25sYXIpIOKUgOKUgFxyXG4gICAgb25UdW1SZXplcnZhc3lvbmxhcmlTaWwoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jb25maXJtYXRpb25TZXJ2aWNlXHJcbiAgICAgICAgICAgIC53YXJuKCdUw7xtIGFrdGlmIHJlemVydmFzeW9ubGFyIHNpbGluZWNla3Rpci4gRW1pbiBtaXNpbml6PycsICdUw7xtIFJlemVydmFzeW9ubGFyxLEgU2lsJylcclxuICAgICAgICAgICAgLnN1YnNjcmliZSgoc3RhdHVzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09PSAnY29uZmlybScpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzUmVzZXJ2YXRpb25Mb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9yZGVyU2VydmljZS5jYW5jZWxBbGxSZXNlcnZhdGlvbnModGhpcy5hY3RpdmVMaXN0VHlwZSkuc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dDogKHJlc3VsdDogUmVzZXJ2YXRpb25SZXN1bHREdG8pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlUmVzZXJ2YXRpb25SZXN1bHQocmVzdWx0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNSZXNlcnZhdGlvbkxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHhPcmRlcnNJbnN0YW5jZT8uaW5zdGFuY2U/LnJlZnJlc2goKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHhPcmRlcnNJbnN0YW5jZT8uaW5zdGFuY2U/LmNsZWFyU2VsZWN0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yPy5lcnJvcj8uZXJyb3I/Lm1lc3NhZ2UgfHwgJ1JlemVydmFzeW9ubGFyIHNpbGluaXJrZW4gYmlyIGhhdGEgb2x1xZ90dS4nO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2FzdGVyU2VydmljZS5lcnJvcihlcnJvck1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1Jlc2VydmF0aW9uTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNQVhfU0hPUlRfSVRFTVNfREVUQUlMRUQgPSA1O1xyXG5cclxuICAgIHByaXZhdGUgaGFuZGxlUmVzZXJ2YXRpb25SZXN1bHQocmVzdWx0OiBSZXNlcnZhdGlvblJlc3VsdER0byk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHNob3J0c09yZGVycyA9IHJlc3VsdC5PcmRlclJlc3VsdHM/LmZpbHRlcihyID0+IHIuU2hvcnRzICYmIHIuU2hvcnRzLmxlbmd0aCA+IDApIHx8IFtdO1xyXG4gICAgICAgIGNvbnN0IGhhc1Nob3J0cyA9IHNob3J0c09yZGVycy5sZW5ndGggPiAwO1xyXG5cclxuICAgICAgICBpZiAocmVzdWx0LkZhaWxDb3VudCA9PT0gMCAmJiAhaGFzU2hvcnRzKSB7XHJcbiAgICAgICAgICAgIHRoaXMudG9hc3RlclNlcnZpY2Uuc3VjY2VzcyhyZXN1bHQuU3VtbWFyeSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQuU3VjY2Vzc0NvdW50ID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLndhcm4ocmVzdWx0LlN1bW1hcnkpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMudG9hc3RlclNlcnZpY2UuZXJyb3IocmVzdWx0LlN1bW1hcnkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gRWtzaWsga2FsZW1sZXIgdmFyc2EgZGV0YXkgZ8O2c3RlclxyXG4gICAgICAgIGlmIChoYXNTaG9ydHMpIHtcclxuICAgICAgICAgICAgY29uc3QgdG90YWxTaG9ydEl0ZW1zID0gc2hvcnRzT3JkZXJzLnJlZHVjZSgoc3VtLCBvKSA9PiBzdW0gKyBvLlNob3J0cy5sZW5ndGgsIDApO1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgc2hvcnRNZXNzYWdlID0gdG90YWxTaG9ydEl0ZW1zID4gT3JkZXJzQ29tcG9uZW50Lk1BWF9TSE9SVF9JVEVNU19ERVRBSUxFRFxyXG4gICAgICAgICAgICAgICAgPyBgS2FsZW0gbWlrdGFybGFyxLEgZWtzaWsgKCR7c2hvcnRzT3JkZXJzLmxlbmd0aH0gc2lwYXJpxZ8sICR7dG90YWxTaG9ydEl0ZW1zfSBrYWxlbSkuYFxyXG4gICAgICAgICAgICAgICAgOiBgRWtzaWsgS2FsZW1sZXI6XFxuJHtzaG9ydHNPcmRlcnNcclxuICAgICAgICAgICAgICAgICAgICAgIC5tYXAobyA9PiBgU2lwYXJpxZ8gJHtvLkRvY051bX06ICR7by5TaG9ydHMubWFwKHMgPT4gYCR7cy5JdGVtQ29kZX0gKGVrc2lrOiAke3MuU2hvcnRRdHl9KWApLmpvaW4oJywgJyl9YClcclxuICAgICAgICAgICAgICAgICAgICAgIC5qb2luKCdcXG4nKX1gO1xyXG5cclxuICAgICAgICAgICAgdGhpcy50b2FzdGVyU2VydmljZS53YXJuKHNob3J0TWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9uUmVmcmVzaCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmR4T3JkZXJzSW5zdGFuY2U/Lmluc3RhbmNlPy5yZWZyZXNoKCk7XHJcbiAgICB9XHJcblxyXG4gICAgb25FeHBvcnRFeGNlbCgpOiB2b2lkIHtcclxuICAgICAgICAvLyBUT0RPOiBJbXBsZW1lbnRcclxuICAgIH1cclxufVxyXG4iLCI8YWJwLXBhZ2UgW3RpdGxlXT1cIidTbWFydFdhcmVob3VzZTo6T3JkZXJzJyB8IGFicExvY2FsaXphdGlvblwiPlxyXG5cclxuICA8IS0tIFRvb2xiYXIgLS0+XHJcbiAgPGRpdiBjbGFzcz1cIm9yZGVycy10b29sYmFyXCI+XHJcbiAgICA8IS0tIFJvdyAxOiBGaWx0ZXJzIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cInRvb2xiYXItcm93XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ0b29sYmFyLWdyb3VwXCI+XHJcbiAgICAgICAgPGxhYmVsPlNpcGFyacWfIEdydWJ1PC9sYWJlbD5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3RhdHVzLWdyb3VwXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXR1cy1jaGlwIGxpc3QtcHVyY2hhc2VcIiBbY2xhc3MuYWN0aXZlXT1cImFjdGl2ZUxpc3RUeXBlID09PSAnMSdcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUxpc3RUeXBlKCcxJylcIj5cclxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1zaG9wcGluZy1jYXJ0XCI+PC9pPiBTYW5heWkgU2lwYXJpxZ9sZXJpXHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXR1cy1jaGlwIGxpc3QtZGlzdHJpYnV0aW9uXCIgW2NsYXNzLmFjdGl2ZV09XCJhY3RpdmVMaXN0VHlwZSA9PT0gJzInXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVMaXN0VHlwZSgnMicpXCI+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtdHJ1Y2tcIj48L2k+IERhxJ/EsXTEsW0gU2lwYXJpxZ9sZXJpXHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXR1cy1jaGlwIGxpc3Qtd2FyZWhvdXNlXCIgW2NsYXNzLmFjdGl2ZV09XCJhY3RpdmVMaXN0VHlwZSA9PT0gJzMnXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVMaXN0VHlwZSgnMycpXCI+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtd2FyZWhvdXNlXCI+PC9pPiBEZXBvIFRhbGVwbGVyaVxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ0b29sYmFyLWdyb3VwIHRvb2xiYXItZ3JvdXAtLWR1cnVtXCI+XHJcbiAgICAgICAgPGxhYmVsPkR1cnVtPC9sYWJlbD5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3RhdHVzLWdyb3VwXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXR1cy1jaGlwIHBlbmRpbmdcIiBbY2xhc3MuYWN0aXZlXT1cImFjdGl2ZVN0YXR1cyA9PT0gJ2Jla2xlbWVkZSdcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVN0YXR1cygnYmVrbGVtZWRlJylcIj5cclxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jbG9ja1wiPjwvaT4gQmVrbGVtZWRlXHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXR1cy1jaGlwIHByb2Nlc3NpbmdcIiBbY2xhc3MuYWN0aXZlXT1cImFjdGl2ZVN0YXR1cyA9PT0gJ2lzbGVuaXlvcidcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVN0YXR1cygnaXNsZW5peW9yJylcIj5cclxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1zcGlubmVyXCI+PC9pPiDEsMWfbGVuaXlvclxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0dXMtY2hpcCBhd2FpdGluZ1wiIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlU3RhdHVzID09PSAnb25heUJla2xpeW9yJ1wiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlU3RhdHVzKCdvbmF5QmVrbGl5b3InKVwiPlxyXG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWhvdXJnbGFzcy1oYWxmXCI+PC9pPiBPbmF5IEJla2xpeW9yXHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXR1cy1jaGlwIGNvbXBsZXRlZFwiIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlU3RhdHVzID09PSAndGFtYW1sYW5kaSdcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVN0YXR1cygndGFtYW1sYW5kaScpXCI+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY2hlY2stY2lyY2xlXCI+PC9pPiBUYW1hbWxhbmTEsVxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ0b29sYmFyLWdyb3VwIHRvb2xiYXItZ3JvdXAtLWRlcG9cIj5cclxuICAgICAgICA8bGFiZWw+RGVwbzwvbGFiZWw+XHJcbiAgICAgICAgPHNlbGVjdCBbKG5nTW9kZWwpXT1cInNlbGVjdGVkV2FyZWhvdXNlXCIgY2xhc3M9XCJmb3JtLXNlbGVjdFwiPlxyXG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPlTDvG3DvDwvb3B0aW9uPlxyXG4gICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgd2ggb2Ygd2FyZWhvdXNlc1wiIFt2YWx1ZV09XCJ3aC5XaHNDb2RlXCI+e3sgd2guV2hzTmFtZSB9fTwvb3B0aW9uPlxyXG4gICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxociBjbGFzcz1cInRvb2xiYXItZGl2aWRlclwiIC8+XHJcblxyXG4gICAgPCEtLSBSb3cgMzogQWN0aW9uIGlucHV0ICsgcmVsYXRlZCBidXR0b25zIHwgUmVzZXJ2YXRpb24gfCBSZWZyZXNoL0V4Y2VsIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cInRvb2xiYXItcm93XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24tZ3JvdXBcIj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1hY3Rpb24tcHJpbWFyeSBidG4tc21cIiAoY2xpY2spPVwib25Hb3JldkJhc2xhdCgpXCIgW2Rpc2FibGVkXT1cImlzR29yZXZCYXNsYXRMb2FkaW5nXCI+XHJcbiAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXBsdXMtY2lyY2xlXCI+PC9pPiBHw7ZyZXYgQmHFn2xhdFxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWFjdGlvbi1hcHByb3ZlIGJ0bi1zbVwiIChjbGljayk9XCJvbk9uYXlWZXIoKVwiPlxyXG4gICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS10aHVtYnMtdXBcIj48L2k+IEfDtnJldmkgVGFtYW1sYVxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWFjdGlvbi1kYW5nZXIgYnRuLXNtXCIgKGNsaWNrKT1cIm9uU2lwYXJpc0thcGF0KClcIj5cclxuICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtdGltZXMtY2lyY2xlXCI+PC9pPiBTaXBhcmnFnyBLYXBhdFxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWFjdGlvbi1zeW5jIGJ0bi1zbVwiIChjbGljayk9XCJvbkR1cnVtR3VuY2VsbGUoKVwiIFtkaXNhYmxlZF09XCJpc0JlZUNlbGxMb2FkaW5nXCI+XHJcbiAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXN5bmMtYWx0XCI+PC9pPiBEdXJ1bSBHw7xuY2VsbGVcclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1hY3Rpb24taW5mbyBidG4tc21cIiAoY2xpY2spPVwib25Cb3NLYXNhR2V0aXIoKVwiIFtkaXNhYmxlZF09XCJpc0JlZUNlbGxMb2FkaW5nXCI+XHJcbiAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWJveC1vcGVuXCI+PC9pPiBCb8WfIEthc2EgR2V0aXJcclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1hY3Rpb24td2FybmluZyBidG4tc21cIiAoY2xpY2spPVwib25ZYXJpbUthc2EoKVwiIFtkaXNhYmxlZF09XCJpc0JlZUNlbGxMb2FkaW5nXCI+XHJcbiAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWJveFwiPjwvaT4gWWFyxLFtIEthc2EgR2V0aXJcclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImFjdGlvbi1kaXZpZGVyXCI+PC9zcGFuPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWFjdGlvbi1yZXNlcnZhdGlvbiBidG4tc21cIiAoY2xpY2spPVwib25SZXplcnZhc3lvbllhcCgpXCIgW2Rpc2FibGVkXT1cImlzUmVzZXJ2YXRpb25Mb2FkaW5nXCI+XHJcbiAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWxvY2tcIj48L2k+IFJlemVydmFzeW9uIFlhcFxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWFjdGlvbi1yZXNlcnZhdGlvbi1jYW5jZWwgYnRuLXNtXCIgKGNsaWNrKT1cIm9uUmV6ZXJ2YXN5b25TaWwoKVwiIFtkaXNhYmxlZF09XCJpc1Jlc2VydmF0aW9uTG9hZGluZ1wiPlxyXG4gICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS11bmxvY2tcIj48L2k+IFJlemVydmFzeW9uIFNpbFxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWFjdGlvbi1yZXNlcnZhdGlvbi1idWxrIGJ0bi1zbVwiIChjbGljayk9XCJvblRvcGx1UmV6ZXJ2YXN5b25ZYXAoKVwiIFtkaXNhYmxlZF09XCJpc1Jlc2VydmF0aW9uTG9hZGluZ1wiPlxyXG4gICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1sb2NrXCI+PC9pPiBUb3BsdSBSZXouIFlhcFxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWFjdGlvbi1yZXNlcnZhdGlvbi1idWxrLWNhbmNlbCBidG4tc21cIiAoY2xpY2spPVwib25UdW1SZXplcnZhc3lvbmxhcmlTaWwoKVwiIFtkaXNhYmxlZF09XCJpc1Jlc2VydmF0aW9uTG9hZGluZ1wiPlxyXG4gICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS11bmxvY2tcIj48L2k+IFRvcGx1IFJlei4gU2lsXHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJhY3Rpb24tZGl2aWRlclwiPjwvc3Bhbj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1hY3Rpb24tc2Vjb25kYXJ5IGJ0bi1zbVwiIChjbGljayk9XCJvblJlZnJlc2goKVwiPlxyXG4gICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1yZWRvXCI+PC9pPiBZZW5pbGVcclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPCEtLSBEYXRhIEdyaWQgLS0+XHJcbiAgPGRpdiBjbGFzcz1cImNhcmQgb3JkZXJzLWdyaWQtY2FyZFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keVwiPlxyXG4gICAgICA8ZHgtZGF0YS1ncmlkXHJcbiAgICAgICAgI2R4T3JkZXJzSW5zdGFuY2VcclxuICAgICAgICBbZGF0YVNvdXJjZV09XCJvcmRlcnNEYXRhU291cmNlXCJcclxuICAgICAgICBbc2hvd1Jvd0xpbmVzXT1cInRydWVcIlxyXG4gICAgICAgIFtzaG93Qm9yZGVyc109XCJ0cnVlXCJcclxuICAgICAgICBbcmVtb3RlT3BlcmF0aW9uc109XCJ0cnVlXCJcclxuICAgICAgICBbaG92ZXJTdGF0ZUVuYWJsZWRdPVwidHJ1ZVwiXHJcbiAgICAgICAgW3JlcGFpbnRDaGFuZ2VzT25seV09XCJ0cnVlXCJcclxuICAgICAgICBbYWxsb3dDb2x1bW5SZXNpemluZ109XCJ0cnVlXCJcclxuICAgICAgICBjb2x1bW5SZXNpemluZ01vZGU9XCJ3aWRnZXRcIlxyXG4gICAgICAgIFthbGxvd0NvbHVtblJlb3JkZXJpbmddPVwidHJ1ZVwiXHJcbiAgICAgICAgW2NvbHVtbkF1dG9XaWR0aF09XCJ0cnVlXCJcclxuICAgICAgICBbY29sdW1uSGlkaW5nRW5hYmxlZF09XCJ0cnVlXCJcclxuICAgICAgICAob25Sb3dDbGljayk9XCJvblJvd0NsaWNrKCRldmVudClcIlxyXG4gICAgICAgIChvblNlbGVjdGlvbkNoYW5nZWQpPVwib25TZWxlY3Rpb25DaGFuZ2VkKCRldmVudClcIlxyXG4gICAgICAgIChvblJvd1ByZXBhcmVkKT1cIm9uUm93UHJlcGFyZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgc3R5bGU9XCJoZWlnaHQ6IDYwdmhcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGR4by1wYWdlclxyXG4gICAgICAgICAgW3Zpc2libGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICBbc2hvd0luZm9dPVwidHJ1ZVwiXHJcbiAgICAgICAgICBbYWxsb3dlZFBhZ2VTaXplc109XCJbNSwgMTAsIDIwXVwiXHJcbiAgICAgICAgICBbc2hvd05hdmlnYXRpb25CdXR0b25zXT1cInRydWVcIlxyXG4gICAgICAgICAgW3Nob3dQYWdlU2l6ZVNlbGVjdG9yXT1cInRydWVcIlxyXG4gICAgICAgID5cclxuICAgICAgICA8L2R4by1wYWdlcj5cclxuICAgICAgICA8ZHhvLXBhZ2luZyBbcGFnZVNpemVdPVwiMTBcIj48L2R4by1wYWdpbmc+XHJcbiAgICAgICAgPGR4by1jb2x1bW4tY2hvb3NlclxyXG4gICAgICAgICAgW2FsbG93U2VhcmNoXT1cInRydWVcIlxyXG4gICAgICAgICAgW2VuYWJsZWRdPVwidHJ1ZVwiXHJcbiAgICAgICAgICBtb2RlPVwic2VsZWN0XCJcclxuICAgICAgICA+PC9keG8tY29sdW1uLWNob29zZXI+XHJcbiAgICAgICAgPGR4by1jb2x1bW4tZml4aW5nIFtlbmFibGVkXT1cInRydWVcIj48L2R4by1jb2x1bW4tZml4aW5nPlxyXG4gICAgICAgIDxkeG8taGVhZGVyLWZpbHRlciBbYWxsb3dTZWFyY2hdPVwidHJ1ZVwiIFt2aXNpYmxlXT1cInRydWVcIj48L2R4by1oZWFkZXItZmlsdGVyPlxyXG4gICAgICAgIDxkeG8tZmlsdGVyLXJvdyBbdmlzaWJsZV09XCJ0cnVlXCI+PC9keG8tZmlsdGVyLXJvdz5cclxuICAgICAgICA8ZHhvLWV4cG9ydCBbZW5hYmxlZF09XCJ0cnVlXCIgW2FsbG93RXhwb3J0U2VsZWN0ZWREYXRhXT1cImZhbHNlXCI+PC9keG8tZXhwb3J0PlxyXG4gICAgICAgIDxkeG8tZmlsdGVyLWJ1aWxkZXIgW2FsbG93SGllcmFyY2hpY2FsRmllbGRzXT1cInRydWVcIj48L2R4by1maWx0ZXItYnVpbGRlcj5cclxuICAgICAgICA8ZHhvLWZpbHRlci1wYW5lbCBbdmlzaWJsZV09XCJ0cnVlXCI+PC9keG8tZmlsdGVyLXBhbmVsPlxyXG4gICAgICAgIDxkeG8tc29ydGluZyBtb2RlPVwic2luZ2xlXCI+PC9keG8tc29ydGluZz5cclxuICAgICAgICA8ZHhvLXNjcm9sbGluZyBtb2RlPVwic3RhbmRhcmRcIiBzaG93U2Nyb2xsYmFyPVwiYWx3YXlzXCI+PC9keG8tc2Nyb2xsaW5nPlxyXG4gICAgICAgIDxkeG8tc2VsZWN0aW9uXHJcbiAgICAgICAgICBtb2RlPVwibXVsdGlwbGVcIlxyXG4gICAgICAgICAgc2hvd0NoZWNrQm94ZXNNb2RlPVwiYWx3YXlzXCJcclxuICAgICAgICAgIFthbGxvd1NlbGVjdEFsbF09XCJ0cnVlXCJcclxuICAgICAgICA+PC9keG8tc2VsZWN0aW9uPlxyXG5cclxuICAgICAgICA8ZHhpLWNvbHVtblxyXG4gICAgICAgICAgZGF0YUZpZWxkPVwiRG9jTnVtXCJcclxuICAgICAgICAgIGNhcHRpb249XCJ7eyAnU21hcnRXYXJlaG91c2U6Ok9yZGVyOkRvY051bScgfCBhYnBMb2NhbGl6YXRpb24gfX1cIlxyXG4gICAgICAgICAgW3dpZHRoXT1cIjExMFwiXHJcbiAgICAgICAgPjwvZHhpLWNvbHVtbj5cclxuICAgICAgICA8ZHhpLWNvbHVtblxyXG4gICAgICAgICAgZGF0YUZpZWxkPVwiQ2FyZENvZGVcIlxyXG4gICAgICAgICAgY2FwdGlvbj1cInt7ICdTbWFydFdhcmVob3VzZTo6T3JkZXI6Q2FyZENvZGUnIHwgYWJwTG9jYWxpemF0aW9uIH19XCJcclxuICAgICAgICAgIFt3aWR0aF09XCIxNDBcIlxyXG4gICAgICAgID48L2R4aS1jb2x1bW4+XHJcbiAgICAgICAgPGR4aS1jb2x1bW5cclxuICAgICAgICAgIGRhdGFGaWVsZD1cIkNhcmROYW1lXCJcclxuICAgICAgICAgIGNhcHRpb249XCJ7eyAnU21hcnRXYXJlaG91c2U6Ok9yZGVyOkNhcmROYW1lJyB8IGFicExvY2FsaXphdGlvbiB9fVwiXHJcbiAgICAgICAgICBbd2lkdGhdPVwiMjIwXCJcclxuICAgICAgICA+PC9keGktY29sdW1uPlxyXG4gICAgICAgIDxkeGktY29sdW1uXHJcbiAgICAgICAgICBkYXRhRmllbGQ9XCJEb2NEYXRlXCJcclxuICAgICAgICAgIGNhcHRpb249XCJ7eyAnU21hcnRXYXJlaG91c2U6Ok9yZGVyOkRvY0RhdGUnIHwgYWJwTG9jYWxpemF0aW9uIH19XCJcclxuICAgICAgICAgIGRhdGFUeXBlPVwiZGF0ZVwiXHJcbiAgICAgICAgICBmb3JtYXQ9XCJkZC5NTS55eXl5XCJcclxuICAgICAgICAgIFt3aWR0aF09XCIxMjBcIlxyXG4gICAgICAgID48L2R4aS1jb2x1bW4+XHJcbiAgICAgICAgPGR4aS1jb2x1bW5cclxuICAgICAgICAgIGRhdGFGaWVsZD1cIkRvY0R1ZURhdGVcIlxyXG4gICAgICAgICAgY2FwdGlvbj1cInt7ICdTbWFydFdhcmVob3VzZTo6T3JkZXI6RG9jRHVlRGF0ZScgfCBhYnBMb2NhbGl6YXRpb24gfX1cIlxyXG4gICAgICAgICAgZGF0YVR5cGU9XCJkYXRlXCJcclxuICAgICAgICAgIGZvcm1hdD1cImRkLk1NLnl5eXlcIlxyXG4gICAgICAgICAgW3dpZHRoXT1cIjEyMFwiXHJcbiAgICAgICAgPjwvZHhpLWNvbHVtbj5cclxuICAgICAgICA8ZHhpLWNvbHVtblxyXG4gICAgICAgICAgZGF0YUZpZWxkPVwiVV9TV1RhbGVwVGFyaWhpXCJcclxuICAgICAgICAgIGNhcHRpb249XCJ7eyAnU21hcnRXYXJlaG91c2U6Ok9yZGVyOlVfU1dUYWxlcFRhcmloaScgfCBhYnBMb2NhbGl6YXRpb24gfX1cIlxyXG4gICAgICAgICAgZGF0YVR5cGU9XCJkYXRlXCJcclxuICAgICAgICAgIGZvcm1hdD1cImRkLk1NLnl5eXlcIlxyXG4gICAgICAgICAgW3dpZHRoXT1cIjEzMFwiXHJcbiAgICAgICAgPjwvZHhpLWNvbHVtbj5cclxuICAgICAgICA8ZHhpLWNvbHVtblxyXG4gICAgICAgICAgZGF0YUZpZWxkPVwiVV9TV0R1cnVtXCJcclxuICAgICAgICAgIGNhcHRpb249XCJ7eyAnU21hcnRXYXJlaG91c2U6Ok9yZGVyOlVfU1dEdXJ1bScgfCBhYnBMb2NhbGl6YXRpb24gfX1cIlxyXG4gICAgICAgICAgW3dpZHRoXT1cIjExMFwiXHJcbiAgICAgICAgICBjZWxsVGVtcGxhdGU9XCJzd0R1cnVtVGVtcGxhdGVcIlxyXG4gICAgICAgID48L2R4aS1jb2x1bW4+XHJcbiAgICAgICAgPGR4aS1jb2x1bW5cclxuICAgICAgICAgIGRhdGFGaWVsZD1cIlVfU1dJc0Vycm9yXCJcclxuICAgICAgICAgIGNhcHRpb249XCJ7eyAnU21hcnRXYXJlaG91c2U6Ok9yZGVyOlVfU1dJc0Vycm9yJyB8IGFicExvY2FsaXphdGlvbiB9fVwiXHJcbiAgICAgICAgICBbd2lkdGhdPVwiNTBcIlxyXG4gICAgICAgICAgY2VsbFRlbXBsYXRlPVwiZXJyb3JUZW1wbGF0ZVwiXHJcbiAgICAgICAgPjwvZHhpLWNvbHVtbj5cclxuICAgICAgICA8ZHhpLWNvbHVtblxyXG4gICAgICAgICAgZGF0YUZpZWxkPVwiVV9TV0Vycm9yTWVzc2FnZVwiXHJcbiAgICAgICAgICBjYXB0aW9uPVwie3sgJ1NtYXJ0V2FyZWhvdXNlOjpPcmRlcjpVX1NXRXJyb3JNZXNzYWdlJyB8IGFicExvY2FsaXphdGlvbiB9fVwiXHJcbiAgICAgICAgICBbd2lkdGhdPVwiMjYwXCJcclxuICAgICAgICAgIGNlbGxUZW1wbGF0ZT1cImVycm9yTWVzc2FnZVRlbXBsYXRlXCJcclxuICAgICAgICA+PC9keGktY29sdW1uPlxyXG4gICAgICAgIDxkeGktY29sdW1uXHJcbiAgICAgICAgICBkYXRhRmllbGQ9XCJPd25lckNvZGVcIlxyXG4gICAgICAgICAgY2FwdGlvbj1cInt7ICdTbWFydFdhcmVob3VzZTo6T3JkZXI6T3duZXJDb2RlJyB8IGFicExvY2FsaXphdGlvbiB9fVwiXHJcbiAgICAgICAgICBbd2lkdGhdPVwiMTIwXCJcclxuICAgICAgICA+PC9keGktY29sdW1uPlxyXG4gICAgICAgIDxkeGktY29sdW1uXHJcbiAgICAgICAgICBkYXRhRmllbGQ9XCJDb21tZW50c1wiXHJcbiAgICAgICAgICBjYXB0aW9uPVwie3sgJ1NtYXJ0V2FyZWhvdXNlOjpPcmRlcjpDb21tZW50cycgfCBhYnBMb2NhbGl6YXRpb24gfX1cIlxyXG4gICAgICAgICAgW3dpZHRoXT1cIjIwMFwiXHJcbiAgICAgICAgPjwvZHhpLWNvbHVtbj5cclxuICAgICAgICA8ZHhpLWNvbHVtblxyXG4gICAgICAgICAgZGF0YUZpZWxkPVwiVV9TV0dvbmRlcmlsZGlcIlxyXG4gICAgICAgICAgY2FwdGlvbj1cInt7ICdTbWFydFdhcmVob3VzZTo6T3JkZXI6VV9TV0dvbmRlcmlsZGknIHwgYWJwTG9jYWxpemF0aW9uIH19XCJcclxuICAgICAgICAgIFt3aWR0aF09XCIxMTBcIlxyXG4gICAgICAgID48L2R4aS1jb2x1bW4+XHJcbiAgICAgICAgPGR4aS1jb2x1bW5cclxuICAgICAgICAgIGRhdGFGaWVsZD1cIlVfU1dTdGF0aW9uQ29kZVwiXHJcbiAgICAgICAgICBjYXB0aW9uPVwie3sgJ1NtYXJ0V2FyZWhvdXNlOjpPcmRlcjpVX1NXU3RhdGlvbkNvZGUnIHwgYWJwTG9jYWxpemF0aW9uIH19XCJcclxuICAgICAgICAgIFt3aWR0aF09XCIxMjBcIlxyXG4gICAgICAgID48L2R4aS1jb2x1bW4+XHJcbiAgICAgICAgPGR4aS1jb2x1bW5cclxuICAgICAgICAgIGRhdGFGaWVsZD1cIlVfU1dFeWVDb2RlXCJcclxuICAgICAgICAgIGNhcHRpb249XCJ7eyAnU21hcnRXYXJlaG91c2U6Ok9yZGVyOlVfU1dFeWVDb2RlJyB8IGFicExvY2FsaXphdGlvbiB9fVwiXHJcbiAgICAgICAgICBbd2lkdGhdPVwiMTQwXCJcclxuICAgICAgICA+PC9keGktY29sdW1uPlxyXG4gICAgICAgIDxkeGktY29sdW1uXHJcbiAgICAgICAgICBkYXRhRmllbGQ9XCJVX1NXT3JkZXJUeXBlXCJcclxuICAgICAgICAgIGNhcHRpb249XCJ7eyAnU21hcnRXYXJlaG91c2U6Ok9yZGVyOlVfU1dPcmRlclR5cGUnIHwgYWJwTG9jYWxpemF0aW9uIH19XCJcclxuICAgICAgICAgIFt3aWR0aF09XCIxNjBcIlxyXG4gICAgICAgICAgY2VsbFRlbXBsYXRlPVwib3JkZXJUeXBlVGVtcGxhdGVcIlxyXG4gICAgICAgID48L2R4aS1jb2x1bW4+XHJcbiAgICAgICAgPGR4aS1jb2x1bW5cclxuICAgICAgICAgIGRhdGFGaWVsZD1cIk51bUF0Q2FyZFwiXHJcbiAgICAgICAgICBjYXB0aW9uPVwie3sgJ1NtYXJ0V2FyZWhvdXNlOjpPcmRlcjpOdW1BdENhcmQnIHwgYWJwTG9jYWxpemF0aW9uIH19XCJcclxuICAgICAgICAgIFt3aWR0aF09XCIxNDBcIlxyXG4gICAgICAgID48L2R4aS1jb2x1bW4+XHJcbiAgICAgICAgPGR4aS1jb2x1bW5cclxuICAgICAgICAgIGRhdGFGaWVsZD1cIkRvY1RvdGFsXCJcclxuICAgICAgICAgIGNhcHRpb249XCJ7eyAnU21hcnRXYXJlaG91c2U6Ok9yZGVyOkRvY1RvdGFsJyB8IGFicExvY2FsaXphdGlvbiB9fVwiXHJcbiAgICAgICAgICBkYXRhVHlwZT1cIm51bWJlclwiXHJcbiAgICAgICAgICBmb3JtYXQ9XCIjLCMjMC4wMFwiXHJcbiAgICAgICAgICBbd2lkdGhdPVwiMTMwXCJcclxuICAgICAgICA+PC9keGktY29sdW1uPlxyXG4gICAgICAgIDxkeGktY29sdW1uXHJcbiAgICAgICAgICBkYXRhRmllbGQ9XCJEb2NDdXJcIlxyXG4gICAgICAgICAgY2FwdGlvbj1cInt7ICdTbWFydFdhcmVob3VzZTo6T3JkZXI6RG9jQ3VyJyB8IGFicExvY2FsaXphdGlvbiB9fVwiXHJcbiAgICAgICAgICBbd2lkdGhdPVwiOTBcIlxyXG4gICAgICAgID48L2R4aS1jb2x1bW4+XHJcbiAgICAgICAgPGR4aS1jb2x1bW5cclxuICAgICAgICAgIGRhdGFGaWVsZD1cIkRvY1N0YXR1c1wiXHJcbiAgICAgICAgICBjYXB0aW9uPVwie3sgJ1NtYXJ0V2FyZWhvdXNlOjpPcmRlcjpEb2NTdGF0dXMnIHwgYWJwTG9jYWxpemF0aW9uIH19XCJcclxuICAgICAgICAgIFt3aWR0aF09XCI5MFwiXHJcbiAgICAgICAgICBjZWxsVGVtcGxhdGU9XCJzdGF0dXNUZW1wbGF0ZVwiXHJcbiAgICAgICAgPjwvZHhpLWNvbHVtbj5cclxuICAgICAgICA8ZHhpLWNvbHVtblxyXG4gICAgICAgICAgZGF0YUZpZWxkPVwiRG9jRW50cnlcIlxyXG4gICAgICAgICAgY2FwdGlvbj1cInt7ICdTbWFydFdhcmVob3VzZTo6T3JkZXI6RG9jRW50cnknIHwgYWJwTG9jYWxpemF0aW9uIH19XCJcclxuICAgICAgICAgIFt3aWR0aF09XCIxMDBcIlxyXG4gICAgICAgID48L2R4aS1jb2x1bW4+XHJcblxyXG4gICAgICAgIDxkaXYgKmR4VGVtcGxhdGU9XCJsZXQgY2VsbCBvZiAnc3RhdHVzVGVtcGxhdGUnXCI+XHJcbiAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICBjbGFzcz1cImJhZGdlXCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICdiZy1zdWNjZXNzJzogY2VsbC52YWx1ZSA9PT0gJ08nLFxyXG4gICAgICAgICAgICAgICdiZy1zZWNvbmRhcnknOiBjZWxsLnZhbHVlID09PSAnQydcclxuICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIHt7IGNlbGwudmFsdWUgPT09ICdPJyA/ICdBw6fEsWsnIDogJ0thcGFsxLEnIH19XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgKmR4VGVtcGxhdGU9XCJsZXQgY2VsbCBvZiAnc3dEdXJ1bVRlbXBsYXRlJ1wiPlxyXG4gICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgY2xhc3M9XCJiYWRnZVwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAnYmctd2FybmluZyc6IGNlbGwudmFsdWUgPT09ICcwJyB8fCAhY2VsbC52YWx1ZSxcclxuICAgICAgICAgICAgICAnYmctaW5mbyc6IGNlbGwudmFsdWUgPT09ICcxJyxcclxuICAgICAgICAgICAgICAnYmctcHJpbWFyeSc6IGNlbGwudmFsdWUgPT09ICcyJyxcclxuICAgICAgICAgICAgICAnYmctc3VjY2Vzcyc6IGNlbGwudmFsdWUgPT09ICczJ1xyXG4gICAgICAgICAgICB9XCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAge3tcclxuICAgICAgICAgICAgICBjZWxsLnZhbHVlID09PSAnMScgPyAnT25heSBCZWtsaXlvcicgOlxyXG4gICAgICAgICAgICAgIGNlbGwudmFsdWUgPT09ICcyJyA/ICfEsMWfbGVuaXlvcicgOlxyXG4gICAgICAgICAgICAgIGNlbGwudmFsdWUgPT09ICczJyA/ICdUYW1hbWxhbmTEsScgOiAnQmVrbGVtZWRlJ1xyXG4gICAgICAgICAgICB9fVxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2ICpkeFRlbXBsYXRlPVwibGV0IGNlbGwgb2YgJ2Vycm9yVGVtcGxhdGUnXCI+XHJcbiAgICAgICAgICA8aVxyXG4gICAgICAgICAgICAqbmdJZj1cImNlbGwudmFsdWUgPT09ICdZJ1wiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiZmEgZmEtZXhjbGFtYXRpb24tdHJpYW5nbGUgdGV4dC1kYW5nZXJcIlxyXG4gICAgICAgICAgICBbdGl0bGVdPVwiY2VsbC5kYXRhLlVfU1dFcnJvck1lc3NhZ2VcIlxyXG4gICAgICAgICAgPjwvaT5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiAqZHhUZW1wbGF0ZT1cImxldCBjZWxsIG9mICdlcnJvck1lc3NhZ2VUZW1wbGF0ZSdcIj5cclxuICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICpuZ0lmPVwiY2VsbC5kYXRhLlVfU1dJc0Vycm9yID09PSAnWSdcIlxyXG4gICAgICAgICAgICBjbGFzcz1cImVycm9yLW1lc3NhZ2UtY2VsbFwiXHJcbiAgICAgICAgICAgIFt0aXRsZV09XCJjZWxsLnZhbHVlXCJcclxuICAgICAgICAgID57eyBjZWxsLnZhbHVlIH19PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2ICpkeFRlbXBsYXRlPVwibGV0IGNlbGwgb2YgJ29yZGVyVHlwZVRlbXBsYXRlJ1wiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSBiZy1zZWNvbmRhcnlcIj5cclxuICAgICAgICAgICAge3tcclxuICAgICAgICAgICAgICBjZWxsLnZhbHVlID09PSAnMScgPyAnU2FuYXlpIFNpcGFyacWfbGVyaScgOlxyXG4gICAgICAgICAgICAgIGNlbGwudmFsdWUgPT09ICcyJyA/ICdEYcSfxLF0xLFtIFNpcGFyacWfbGVyaScgOlxyXG4gICAgICAgICAgICAgIGNlbGwudmFsdWUgPT09ICczJyA/ICdEZXBvIFRhbGVwbGVyaScgOiAnLSdcclxuICAgICAgICAgICAgfX1cclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBNYXN0ZXItRGV0YWlsOiBTaXBhcmnFnyBTYXTEsXJsYXLEsSAtLT5cclxuICAgICAgICA8ZHhvLW1hc3Rlci1kZXRhaWwgW2VuYWJsZWRdPVwidHJ1ZVwiIHRlbXBsYXRlPVwib3JkZXJMaW5lc1RlbXBsYXRlXCI+PC9keG8tbWFzdGVyLWRldGFpbD5cclxuXHJcbiAgICAgICAgPGRpdiAqZHhUZW1wbGF0ZT1cImxldCBkZXRhaWwgb2YgJ29yZGVyTGluZXNUZW1wbGF0ZSdcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLTNcIj5cclxuICAgICAgICAgICAgPGg2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtbGlzdCBtZS0xXCI+PC9pPlxyXG4gICAgICAgICAgICAgIHt7ICdTbWFydFdhcmVob3VzZTo6T3JkZXI6RG9jTnVtJyB8IGFicExvY2FsaXphdGlvbiB9fTpcclxuICAgICAgICAgICAgICB7eyBkZXRhaWwuZGF0YS5Eb2NOdW0gfX0gLSBTaXBhcmnFnyBTYXTEsXJsYXLEsVxyXG4gICAgICAgICAgICA8L2g2PlxyXG4gICAgICAgICAgICA8ZHgtZGF0YS1ncmlkXHJcbiAgICAgICAgICAgICAgW2RhdGFTb3VyY2VdPVwiZGV0YWlsLmRhdGEuRG9jdW1lbnRMaW5lc1wiXHJcbiAgICAgICAgICAgICAgW3Nob3dSb3dMaW5lc109XCJ0cnVlXCJcclxuICAgICAgICAgICAgICBbc2hvd0JvcmRlcnNdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgW2NvbHVtbkF1dG9XaWR0aF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICBbaG92ZXJTdGF0ZUVuYWJsZWRdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgW3Jvd0FsdGVybmF0aW9uRW5hYmxlZF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxkeGktY29sdW1uXHJcbiAgICAgICAgICAgICAgICBkYXRhRmllbGQ9XCJMaW5lTnVtXCJcclxuICAgICAgICAgICAgICAgIGNhcHRpb249XCJ7eyAnU21hcnRXYXJlaG91c2U6Ok9yZGVyOkxpbmVOdW0nIHwgYWJwTG9jYWxpemF0aW9uIH19XCJcclxuICAgICAgICAgICAgICAgIFt3aWR0aF09XCI3MFwiXHJcbiAgICAgICAgICAgICAgPjwvZHhpLWNvbHVtbj5cclxuICAgICAgICAgICAgICA8ZHhpLWNvbHVtblxyXG4gICAgICAgICAgICAgICAgZGF0YUZpZWxkPVwiSXRlbUNvZGVcIlxyXG4gICAgICAgICAgICAgICAgY2FwdGlvbj1cInt7ICdTbWFydFdhcmVob3VzZTo6T3JkZXI6SXRlbUNvZGUnIHwgYWJwTG9jYWxpemF0aW9uIH19XCJcclxuICAgICAgICAgICAgICAgIFt3aWR0aF09XCIxNDBcIlxyXG4gICAgICAgICAgICAgID48L2R4aS1jb2x1bW4+XHJcbiAgICAgICAgICAgICAgPGR4aS1jb2x1bW5cclxuICAgICAgICAgICAgICAgIGRhdGFGaWVsZD1cIkl0ZW1EZXNjcmlwdGlvblwiXHJcbiAgICAgICAgICAgICAgICBjYXB0aW9uPVwiS2FsZW0gQWTEsVwiXHJcbiAgICAgICAgICAgICAgPjwvZHhpLWNvbHVtbj5cclxuICAgICAgICAgICAgICA8ZHhpLWNvbHVtblxyXG4gICAgICAgICAgICAgICAgZGF0YUZpZWxkPVwiUXVhbnRpdHlcIlxyXG4gICAgICAgICAgICAgICAgY2FwdGlvbj1cInt7ICdTbWFydFdhcmVob3VzZTo6T3JkZXI6UXVhbnRpdHknIHwgYWJwTG9jYWxpemF0aW9uIH19XCJcclxuICAgICAgICAgICAgICAgIGRhdGFUeXBlPVwibnVtYmVyXCJcclxuICAgICAgICAgICAgICAgIGZvcm1hdD1cIiMsIyMwLiMjXCJcclxuICAgICAgICAgICAgICAgIFt3aWR0aF09XCIxMDBcIlxyXG4gICAgICAgICAgICAgID48L2R4aS1jb2x1bW4+XHJcbiAgICAgICAgICAgICAgPGR4aS1jb2x1bW5cclxuICAgICAgICAgICAgICAgIGRhdGFGaWVsZD1cIlVfU1dUZXNsaW1NaWt0YXJcIlxyXG4gICAgICAgICAgICAgICAgY2FwdGlvbj1cInt7ICdTbWFydFdhcmVob3VzZTo6T3JkZXI6VV9TV1Rlc2xpbU1pa3RhcicgfCBhYnBMb2NhbGl6YXRpb24gfX1cIlxyXG4gICAgICAgICAgICAgICAgZGF0YVR5cGU9XCJudW1iZXJcIlxyXG4gICAgICAgICAgICAgICAgZm9ybWF0PVwiIywjIzAuIyNcIlxyXG4gICAgICAgICAgICAgICAgW3dpZHRoXT1cIjEyMFwiXHJcbiAgICAgICAgICAgICAgPjwvZHhpLWNvbHVtbj5cclxuICAgICAgICAgICAgICA8ZHhpLWNvbHVtblxyXG4gICAgICAgICAgICAgICAgZGF0YUZpZWxkPVwiTGluZVRvdGFsXCJcclxuICAgICAgICAgICAgICAgIGNhcHRpb249XCJ7eyAnU21hcnRXYXJlaG91c2U6Ok9yZGVyOkxpbmVUb3RhbCcgfCBhYnBMb2NhbGl6YXRpb24gfX1cIlxyXG4gICAgICAgICAgICAgICAgZGF0YVR5cGU9XCJudW1iZXJcIlxyXG4gICAgICAgICAgICAgICAgZm9ybWF0PVwiIywjIzAuMDBcIlxyXG4gICAgICAgICAgICAgICAgW3dpZHRoXT1cIjEyMFwiXHJcbiAgICAgICAgICAgICAgPjwvZHhpLWNvbHVtbj5cclxuICAgICAgICAgICAgICA8ZHhpLWNvbHVtblxyXG4gICAgICAgICAgICAgICAgZGF0YUZpZWxkPVwiV2FyZWhvdXNlQ29kZVwiXHJcbiAgICAgICAgICAgICAgICBjYXB0aW9uPVwie3sgJ1NtYXJ0V2FyZWhvdXNlOjpPcmRlcjpXaHNDb2RlJyB8IGFicExvY2FsaXphdGlvbiB9fVwiXHJcbiAgICAgICAgICAgICAgICBbd2lkdGhdPVwiMTAwXCJcclxuICAgICAgICAgICAgICA+PC9keGktY29sdW1uPlxyXG4gICAgICAgICAgICAgIDxkeGktY29sdW1uXHJcbiAgICAgICAgICAgICAgICBkYXRhRmllbGQ9XCJTaGlwRGF0ZVwiXHJcbiAgICAgICAgICAgICAgICBjYXB0aW9uPVwie3sgJ1NtYXJ0V2FyZWhvdXNlOjpPcmRlcjpTaGlwRGF0ZScgfCBhYnBMb2NhbGl6YXRpb24gfX1cIlxyXG4gICAgICAgICAgICAgICAgZGF0YVR5cGU9XCJkYXRlXCJcclxuICAgICAgICAgICAgICAgIGZvcm1hdD1cImRkLk1NLnl5eXlcIlxyXG4gICAgICAgICAgICAgICAgW3dpZHRoXT1cIjExMFwiXHJcbiAgICAgICAgICAgICAgPjwvZHhpLWNvbHVtbj5cclxuICAgICAgICAgICAgICA8ZHhpLWNvbHVtblxyXG4gICAgICAgICAgICAgICAgZGF0YUZpZWxkPVwiVV9Tb25Hb3JldklkXCJcclxuICAgICAgICAgICAgICAgIGNhcHRpb249XCJ7eyAnU21hcnRXYXJlaG91c2U6Ok9yZGVyOlVfU29uR29yZXZJZCcgfCBhYnBMb2NhbGl6YXRpb24gfX1cIlxyXG4gICAgICAgICAgICAgICAgW3dpZHRoXT1cIjEyMFwiXHJcbiAgICAgICAgICAgICAgPjwvZHhpLWNvbHVtbj5cclxuXHJcbiAgICAgICAgICAgICAgPGR4by1zdW1tYXJ5PlxyXG4gICAgICAgICAgICAgICAgPGR4aS10b3RhbC1pdGVtXHJcbiAgICAgICAgICAgICAgICAgIGNvbHVtbj1cImxpbmVUb3RhbFwiXHJcbiAgICAgICAgICAgICAgICAgIHN1bW1hcnlUeXBlPVwic3VtXCJcclxuICAgICAgICAgICAgICAgICAgZGlzcGxheUZvcm1hdD1cIlRvcGxhbTogezB9XCJcclxuICAgICAgICAgICAgICAgICAgdmFsdWVGb3JtYXQ9XCIjLCMjMC4wMFwiXHJcbiAgICAgICAgICAgICAgICA+PC9keGktdG90YWwtaXRlbT5cclxuICAgICAgICAgICAgICAgIDxkeGktdG90YWwtaXRlbVxyXG4gICAgICAgICAgICAgICAgICBjb2x1bW49XCJxdWFudGl0eVwiXHJcbiAgICAgICAgICAgICAgICAgIHN1bW1hcnlUeXBlPVwic3VtXCJcclxuICAgICAgICAgICAgICAgICAgZGlzcGxheUZvcm1hdD1cIlRvcGxhbTogezB9XCJcclxuICAgICAgICAgICAgICAgICAgdmFsdWVGb3JtYXQ9XCIjLCMjMC4jI1wiXHJcbiAgICAgICAgICAgICAgICA+PC9keGktdG90YWwtaXRlbT5cclxuICAgICAgICAgICAgICA8L2R4by1zdW1tYXJ5PlxyXG4gICAgICAgICAgICA8L2R4LWRhdGEtZ3JpZD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2R4LWRhdGEtZ3JpZD5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8IS0tIEJvxZ8gLyBZYXLEsW0gS2FzYSBQb3B1cCAtLT5cclxuICA8ZHgtcG9wdXBcclxuICAgIFt2aXNpYmxlXT1cImJvc0thc2FQb3B1cFZpc2libGVcIlxyXG4gICAgKG9uSGlkZGVuKT1cImJvc0thc2FQb3B1cFZpc2libGUgPSBmYWxzZVwiXHJcbiAgICBbd2lkdGhdPVwiMzgwXCJcclxuICAgIFtoZWlnaHRdPVwiJ2F1dG8nXCJcclxuICAgIFtzaG93VGl0bGVdPVwidHJ1ZVwiXHJcbiAgICBbdGl0bGVdPVwiYm9zS2FzYU1vZGUgPT09ICdlbXB0eScgPyAnQm/FnyBLYXNhIEdldGlyJyA6ICdZYXLEsW0gS2FzYSBHZXRpcidcIlxyXG4gICAgW2RyYWdFbmFibGVkXT1cInRydWVcIlxyXG4gICAgW3Jlc2l6ZUVuYWJsZWRdPVwiZmFsc2VcIlxyXG4gICAgW3Nob3dDbG9zZUJ1dHRvbl09XCJ0cnVlXCJcclxuICAgIFtjbG9zZU9uT3V0c2lkZUNsaWNrXT1cImZhbHNlXCJcclxuICA+XHJcbiAgICA8ZGl2ICpkeFRlbXBsYXRlPVwibGV0IGRhdGEgb2YgJ2NvbnRlbnQnXCIgY2xhc3M9XCJwLTNcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+xLBzdGFzeW9uIE5vPC9sYWJlbD5cclxuICAgICAgICA8ZHgtbnVtYmVyLWJveCBbKHZhbHVlKV09XCJib3NLYXNhU3RhdGlvbklkXCIgW21pbl09XCIxXCIgW3Nob3dTcGluQnV0dG9uc109XCJ0cnVlXCI+PC9keC1udW1iZXItYm94PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+UmFmIE5vIChTaGVsZiBJRCk8L2xhYmVsPlxyXG4gICAgICAgIDxkeC1udW1iZXItYm94IFsodmFsdWUpXT1cImJvc0thc2FTaGVsZklkXCIgW21pbl09XCIxXCIgW3Nob3dTcGluQnV0dG9uc109XCJ0cnVlXCI+PC9keC1udW1iZXItYm94PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+S2FzYSBBZGVkaTwvbGFiZWw+XHJcbiAgICAgICAgPGR4LW51bWJlci1ib3ggWyh2YWx1ZSldPVwiYm9zS2FzYUJveENvdW50XCIgW21pbl09XCIxXCIgW21heF09XCI1MFwiIFtzaG93U3BpbkJ1dHRvbnNdPVwidHJ1ZVwiPjwvZHgtbnVtYmVyLWJveD5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZCBnYXAtMiBtdC0zXCI+XHJcbiAgICAgICAgPGR4LWJ1dHRvbiB0ZXh0PVwixLBwdGFsXCIgKG9uQ2xpY2spPVwiYm9zS2FzYVBvcHVwVmlzaWJsZSA9IGZhbHNlXCIgdHlwZT1cIm5vcm1hbFwiPjwvZHgtYnV0dG9uPlxyXG4gICAgICAgIDxkeC1idXR0b25cclxuICAgICAgICAgIFt0ZXh0XT1cImJvc0thc2FNb2RlID09PSAnZW1wdHknID8gJ0JvxZ8gS2FzYSBHw7ZuZGVyJyA6ICdZYXLEsW0gS2FzYSBHw7ZuZGVyJ1wiXHJcbiAgICAgICAgICB0eXBlPVwiZGVmYXVsdFwiXHJcbiAgICAgICAgICAob25DbGljayk9XCJvbkJvc0thc2FHb25kZXIoKVwiXHJcbiAgICAgICAgPjwvZHgtYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZHgtcG9wdXA+XHJcblxyXG48L2FicC1wYWdlPlxyXG4iXX0=
|