tango-app-ui-manage-billing 3.3.13 → 3.3.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components/bank-transactions/bank-transactions.component.mjs +45 -7
- package/esm2022/lib/components/bank-transactions/resolve-transaction/resolve-transaction.component.mjs +41 -23
- package/esm2022/lib/components/billing-groups/billing-group-form/billing-group-form.component.mjs +27 -6
- package/esm2022/lib/components/billing-groups/billing-groups.component.mjs +3 -3
- package/esm2022/lib/components/billing-summary/billing-summary.component.mjs +3 -3
- package/esm2022/lib/components/brand-invoices/brand-invoices.component.mjs +2 -2
- package/esm2022/lib/components/brands-billing/brands-billing.component.mjs +5 -9
- package/esm2022/lib/components/daily-pricing/daily-pricing.component.mjs +12 -12
- package/esm2022/lib/components/estimates/estimates.component.mjs +2 -2
- package/esm2022/lib/components/plans-subscription/invoice-credits/invoice-credits.component.mjs +2 -2
- package/esm2022/lib/components/services/billing.service.mjs +1 -1
- package/esm2022/lib/components/setup-billing/setup-billing.component.mjs +3 -2
- package/esm2022/lib/components/tango-manage-billing/edit-invoice/edit-invoice.component.mjs +15 -3
- package/esm2022/lib/components/tango-manage-billing/tango-manage-billing.component.mjs +13 -3
- package/fesm2022/tango-app-ui-manage-billing.mjs +201 -105
- package/fesm2022/tango-app-ui-manage-billing.mjs.map +1 -1
- package/lib/components/bank-transactions/bank-transactions.component.d.ts +5 -0
- package/lib/components/bank-transactions/resolve-transaction/resolve-transaction.component.d.ts +10 -6
- package/lib/components/billing-groups/billing-group-form/billing-group-form.component.d.ts +7 -1
- package/lib/components/brands-billing/brands-billing.component.d.ts +0 -1
- package/lib/components/daily-pricing/daily-pricing.component.d.ts +1 -1
- package/lib/components/services/billing.service.d.ts +1 -0
- package/lib/components/tango-manage-billing/edit-invoice/edit-invoice.component.d.ts +4 -0
- package/package.json +1 -1
|
@@ -17,7 +17,10 @@ export class ResolveTransactionComponent {
|
|
|
17
17
|
// [{ clientId, brandName, invoices: [{ _id, invoice, outstanding, dueDate, ... }] }]
|
|
18
18
|
options = [];
|
|
19
19
|
selectedClientId = '';
|
|
20
|
-
|
|
20
|
+
// Multiple invoices can be settled by one payment. Order matters — the
|
|
21
|
+
// incoming amount auto-fills the selected invoices in pick order (each
|
|
22
|
+
// settled fully until the money runs out; the last may end up partial).
|
|
23
|
+
selectedInvoiceIds = [];
|
|
21
24
|
saving = false;
|
|
22
25
|
// Searchable customer combobox state.
|
|
23
26
|
clientSearch = '';
|
|
@@ -51,14 +54,14 @@ export class ResolveTransactionComponent {
|
|
|
51
54
|
// Typing past the selected name deselects until a new pick is made.
|
|
52
55
|
if (this.selectedClient && this.clientSearch !== this.selectedClient.brandName) {
|
|
53
56
|
this.selectedClientId = '';
|
|
54
|
-
this.
|
|
57
|
+
this.selectedInvoiceIds = [];
|
|
55
58
|
}
|
|
56
59
|
}
|
|
57
60
|
selectClient(o) {
|
|
58
61
|
this.selectedClientId = o.clientId;
|
|
59
62
|
this.clientSearch = o.brandName;
|
|
60
63
|
this.clientDropdownOpen = false;
|
|
61
|
-
this.
|
|
64
|
+
this.selectedInvoiceIds = [];
|
|
62
65
|
}
|
|
63
66
|
closeOnOutsideClick(event) {
|
|
64
67
|
const box = this.elementRef.nativeElement.querySelector('.searchable-select');
|
|
@@ -77,30 +80,45 @@ export class ResolveTransactionComponent {
|
|
|
77
80
|
get clientInvoices() {
|
|
78
81
|
return this.selectedClient?.invoices || [];
|
|
79
82
|
}
|
|
80
|
-
|
|
81
|
-
return this.
|
|
82
|
-
}
|
|
83
|
-
//
|
|
84
|
-
//
|
|
85
|
-
|
|
86
|
-
const
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
if (Math.abs(diff) <= 1) {
|
|
91
|
-
return { kind: 'exact', text: `Exact match — invoice ${inv.invoice} will be marked Paid.` };
|
|
83
|
+
isInvoiceSelected(inv) {
|
|
84
|
+
return this.selectedInvoiceIds.includes(String(inv._id));
|
|
85
|
+
}
|
|
86
|
+
// Toggle an invoice in/out of the selection. Order is preserved (push on
|
|
87
|
+
// select) so the auto-fill allocation follows pick order.
|
|
88
|
+
toggleInvoice(inv) {
|
|
89
|
+
const id = String(inv._id);
|
|
90
|
+
const i = this.selectedInvoiceIds.indexOf(id);
|
|
91
|
+
if (i >= 0) {
|
|
92
|
+
this.selectedInvoiceIds.splice(i, 1);
|
|
92
93
|
}
|
|
93
|
-
|
|
94
|
-
|
|
94
|
+
else {
|
|
95
|
+
this.selectedInvoiceIds.push(id);
|
|
95
96
|
}
|
|
96
|
-
|
|
97
|
+
}
|
|
98
|
+
// Auto-fill allocation: walk the selected invoices in pick order, settling
|
|
99
|
+
// each fully from the incoming amount until the money runs out. Returns a
|
|
100
|
+
// per-invoice breakdown plus the leftover (excess) — mirrors the backend.
|
|
101
|
+
get allocation() {
|
|
102
|
+
let remaining = Number(this.txn?.amount) || 0;
|
|
103
|
+
return this.selectedInvoiceIds.map((id) => {
|
|
104
|
+
const inv = this.clientInvoices.find((x) => String(x._id) === id) || {};
|
|
105
|
+
const outstanding = Math.round((Number(inv.outstanding) || 0) * 100) / 100;
|
|
106
|
+
const applied = Math.round(Math.max(0, Math.min(remaining, outstanding)) * 100) / 100;
|
|
107
|
+
remaining = Math.round((remaining - applied) * 100) / 100;
|
|
108
|
+
return { invoice: inv.invoice, outstanding, applied, settles: applied >= outstanding - 1 && outstanding > 0 };
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
// Money left over after every selected invoice is settled.
|
|
112
|
+
get pendingAmount() {
|
|
113
|
+
const totalOutstanding = this.allocation.reduce((a, x) => a + x.outstanding, 0);
|
|
114
|
+
return Math.round(Math.max(0, (Number(this.txn?.amount) || 0) - totalOutstanding) * 100) / 100;
|
|
97
115
|
}
|
|
98
116
|
confirmReconcile() {
|
|
99
|
-
if (!this.
|
|
117
|
+
if (!this.selectedInvoiceIds.length || this.saving)
|
|
100
118
|
return;
|
|
101
119
|
this.saving = true;
|
|
102
120
|
this.billingService.bankResolveTransaction({
|
|
103
|
-
txnId: this.txn._id, action: 'reconcile',
|
|
121
|
+
txnId: this.txn._id, action: 'reconcile', invoiceIds: this.selectedInvoiceIds,
|
|
104
122
|
}).subscribe({
|
|
105
123
|
next: (res) => this.activeModal.close(res?.data?.note || 'Reconciled'),
|
|
106
124
|
error: (err) => {
|
|
@@ -140,11 +158,11 @@ export class ResolveTransactionComponent {
|
|
|
140
158
|
});
|
|
141
159
|
}
|
|
142
160
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ResolveTransactionComponent, deps: [{ token: i1.NgbActiveModal }, { token: i2.BillingService }, { token: i3.ToastService }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
143
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ResolveTransactionComponent, selector: "lib-resolve-transaction", inputs: { txn: "txn", options: "options" }, host: { listeners: { "document:click": "closeOnOutsideClick($event)" } }, ngImport: i0, template: "<div class=\"modal-header border-0 pb-0\">\n <div>\n <h4 class=\"modal-title fw-bold\">Resolve & reconcile</h4>\n <div class=\"text-muted small mt-1\">{{ subtitle }}</div>\n </div>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"activeModal.dismiss()\"></button>\n</div>\n\n<div class=\"modal-body pt-3\">\n <!-- Transaction summary -->\n <div class=\"txn-sum\">\n <div>\n <div class=\"k\">Date</div>\n <div class=\"v\">{{ txn?.valueDate | date: 'dd MMM, yyyy' }}</div>\n </div>\n <div>\n <div class=\"k\">Amount</div>\n <div class=\"v fw-bold\">\u20B9{{ txn?.amount | number:'1.2-2':'en-IN' }}</div>\n </div>\n <div>\n <div class=\"k\">Reference / UTR</div>\n <div class=\"v mono\">{{ txn?.refNo || '\u2014' }}</div>\n </div>\n </div>\n\n <!-- Narration + current result -->\n <div class=\"advnote mt-3\">\n <span *ngIf=\"txn?.payer\"><strong>Payer:</strong> {{ txn?.payer }}<br></span>\n <span class=\"text-muted\">{{ txn?.narration }}</span>\n </div>\n <div class=\"advnote mt-2\">\n <strong>Current result:</strong> {{ txn?.resultNote || '\u2014' }}\n </div>\n\n <!-- Customer (searchable) + invoice selects -->\n <div class=\"mt-4\">\n <label class=\"form-label fw-semibold\">Customer</label>\n <div class=\"searchable-select position-relative\">\n <input type=\"text\" class=\"form-select\" placeholder=\"Search customer\u2026\" autocomplete=\"off\"\n [(ngModel)]=\"clientSearch\" (input)=\"onClientSearch()\" (focus)=\"clientDropdownOpen = true\">\n <div *ngIf=\"clientDropdownOpen\" class=\"ss-list card\">\n <div *ngFor=\"let o of filteredOptions\" class=\"ss-item\" [class.active]=\"o.clientId === selectedClientId\"\n (click)=\"selectClient(o)\">\n {{ o.brandName }}\n <span class=\"ss-count\">{{ o.invoices.length }} open</span>\n </div>\n <div *ngIf=\"!filteredOptions.length\" class=\"ss-item ss-empty\">No customers match \"{{ clientSearch }}\"</div>\n </div>\n </div>\n </div>\n <div class=\"mt-3\">\n <label class=\"form-label fw-semibold\">Apply to invoice</label>\n <
|
|
161
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ResolveTransactionComponent, selector: "lib-resolve-transaction", inputs: { txn: "txn", options: "options" }, host: { listeners: { "document:click": "closeOnOutsideClick($event)" } }, ngImport: i0, template: "<div class=\"modal-header border-0 pb-0\">\n <div>\n <h4 class=\"modal-title fw-bold\">Resolve & reconcile</h4>\n <div class=\"text-muted small mt-1\">{{ subtitle }}</div>\n </div>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"activeModal.dismiss()\"></button>\n</div>\n\n<div class=\"modal-body pt-3\">\n <!-- Transaction summary -->\n <div class=\"txn-sum\">\n <div>\n <div class=\"k\">Date</div>\n <div class=\"v\">{{ txn?.valueDate | date: 'dd MMM, yyyy' }}</div>\n </div>\n <div>\n <div class=\"k\">Amount</div>\n <div class=\"v fw-bold\">\u20B9{{ txn?.amount | number:'1.2-2':'en-IN' }}</div>\n </div>\n <div>\n <div class=\"k\">Reference / UTR</div>\n <div class=\"v mono\">{{ txn?.refNo || '\u2014' }}</div>\n </div>\n </div>\n\n <!-- Narration + current result -->\n <div class=\"advnote mt-3\">\n <span *ngIf=\"txn?.payer\"><strong>Payer:</strong> {{ txn?.payer }}<br></span>\n <span class=\"text-muted\">{{ txn?.narration }}</span>\n </div>\n <div class=\"advnote mt-2\">\n <strong>Current result:</strong> {{ txn?.resultNote || '\u2014' }}\n </div>\n\n <!-- Customer (searchable) + invoice selects -->\n <div class=\"mt-4\">\n <label class=\"form-label fw-semibold\">Customer</label>\n <div class=\"searchable-select position-relative\">\n <input type=\"text\" class=\"form-select\" placeholder=\"Search customer\u2026\" autocomplete=\"off\"\n [(ngModel)]=\"clientSearch\" (input)=\"onClientSearch()\" (focus)=\"clientDropdownOpen = true\">\n <div *ngIf=\"clientDropdownOpen\" class=\"ss-list card\">\n <div *ngFor=\"let o of filteredOptions\" class=\"ss-item\" [class.active]=\"o.clientId === selectedClientId\"\n (click)=\"selectClient(o)\">\n {{ o.brandName }}\n <span class=\"ss-count\">{{ o.invoices.length }} open</span>\n </div>\n <div *ngIf=\"!filteredOptions.length\" class=\"ss-item ss-empty\">No customers match \"{{ clientSearch }}\"</div>\n </div>\n </div>\n </div>\n <div class=\"mt-3\">\n <label class=\"form-label fw-semibold\">Apply to invoice\n <span class=\"text-muted small fw-normal\">\u2014 select one or more</span>\n </label>\n <div class=\"invoice-multiselect\">\n <div *ngIf=\"!selectedClientId\" class=\"text-muted small px-2 py-2\">Select a customer first</div>\n <div *ngIf=\"selectedClientId && !clientInvoices.length\" class=\"text-muted small px-2 py-2\">No open invoice for this customer</div>\n <label *ngFor=\"let inv of clientInvoices\" class=\"invoice-option\"\n [class.selected]=\"isInvoiceSelected(inv)\">\n <input type=\"checkbox\" [checked]=\"isInvoiceSelected(inv)\" (change)=\"toggleInvoice(inv)\">\n <span class=\"inv-no\">{{ inv.invoice }}</span>\n <span class=\"inv-out\">\u20B9{{ inv.outstanding | number:'1.2-2':'en-IN' }}</span>\n <span class=\"inv-due\" *ngIf=\"inv.dueDate\">due {{ inv.dueDate | date: 'dd MMM yyyy' }}</span>\n </label>\n </div>\n </div>\n\n <!-- Allocation breakdown \u2014 how the incoming amount fills the selected\n invoices in order, with any leftover shown as a pending balance. -->\n <div *ngIf=\"selectedInvoiceIds.length\" class=\"alloc mt-3\">\n <div class=\"alloc-row alloc-head\">\n <span>Invoice</span><span>Outstanding</span><span>Applied</span>\n </div>\n <div *ngFor=\"let a of allocation\" class=\"alloc-row\">\n <span class=\"mono\">{{ a.invoice }}</span>\n <span>\u20B9{{ a.outstanding | number:'1.2-2':'en-IN' }}</span>\n <span [class.text-success]=\"a.settles\" [class.text-warning]=\"!a.settles && a.applied > 0\">\n \u20B9{{ a.applied | number:'1.2-2':'en-IN' }}{{ a.applied > 0 && !a.settles ? ' (partial)' : '' }}\n </span>\n </div>\n <div class=\"alloc-row alloc-pending\" [class.text-danger]=\"pendingAmount > 0\">\n <span class=\"fw-semibold\">Pending amount</span>\n <span></span>\n <span class=\"fw-bold\">\u20B9{{ pendingAmount | number:'1.2-2':'en-IN' }}</span>\n </div>\n <div *ngIf=\"pendingAmount > 0\" class=\"advnote mt-2\">\n Excess of \u20B9{{ pendingAmount | number:'1.2-2':'en-IN' }} remains after settling the selected invoice(s) \u2014 follow up with the customer.\n </div>\n </div>\n\n <!-- Actions -->\n <div class=\"d-flex flex-column gap-2 mt-4\">\n <div class=\"text-muted small fw-semibold\">Choose an action</div>\n <button class=\"btn btn-primary\" [disabled]=\"!selectedInvoiceIds.length || saving\" (click)=\"confirmReconcile()\">\n {{ saving ? 'Saving\u2026' : 'Confirm & reconcile' + (selectedInvoiceIds.length ? '' : ' \u2014 select an invoice') }}\n </button>\n <button class=\"btn btn-outline-secondary\" [disabled]=\"!selectedClientId || saving\" (click)=\"reachOut()\">\n Reach out to customer{{ selectedClientId ? '' : ' \u2014 select a customer' }}\n </button>\n <button class=\"btn btn-outline-secondary\" [disabled]=\"saving\" (click)=\"exclude()\">\n Mark as not to be considered\n </button>\n <button class=\"btn btn-link text-muted\" (click)=\"activeModal.dismiss()\">Cancel</button>\n </div>\n</div>", styles: [".txn-sum{display:grid;grid-template-columns:1fr 1fr 1fr;gap:12px;background:#f7f8fa;border:1px solid #eceef1;border-radius:12px;padding:14px 16px}.txn-sum .k{color:#8a93a2;font-size:12px}.txn-sum .v{margin-top:3px;color:#101828}.advnote{font-size:12.5px;color:#475467;background:#f5faff;border:1px solid #d7e9fb;border-radius:9px;padding:9px 12px}.advnote.advnote-ok{background:#eafaf1;border-color:#bfe8cf;color:#1c7a43}.mono{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;word-break:break-all}.searchable-select .ss-list{position:absolute;top:calc(100% + 4px);left:0;right:0;z-index:20;max-height:240px;overflow:auto;border:1px solid #E4E7EC;border-radius:10px;box-shadow:0 8px 24px #1018281f;padding:4px}.searchable-select .ss-item{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:9px 12px;border-radius:8px;cursor:pointer;font-weight:500;color:#344054}.searchable-select .ss-item:hover{background:#f4f6f9}.searchable-select .ss-item.active{background:#e8f3fe;color:#1493f5}.searchable-select .ss-item.ss-empty{color:#98a2b3;cursor:default;justify-content:flex-start}.searchable-select .ss-item.ss-empty:hover{background:transparent}.searchable-select .ss-count{font-size:11px;font-weight:600;color:#667085;background:#f1f3f6;border-radius:999px;padding:1px 8px;white-space:nowrap}.invoice-multiselect{border:1px solid #e4e6ea;border-radius:8px;max-height:180px;overflow-y:auto}.invoice-option{display:flex;align-items:center;gap:8px;padding:8px 12px;border-bottom:1px solid #f1f3f6;cursor:pointer;font-size:13px;margin:0}.invoice-option:last-child{border-bottom:0}.invoice-option.selected{background:#eef5ff}.invoice-option .inv-no{font-weight:600;color:#101828}.invoice-option .inv-out{margin-left:auto;font-weight:600}.invoice-option .inv-due{color:#98a2b3;font-size:11px}.alloc{border:1px solid #e4e6ea;border-radius:8px;padding:8px 12px;font-size:13px}.alloc-row{display:grid;grid-template-columns:1fr auto auto;gap:12px;padding:5px 0;align-items:center}.alloc-head{color:#98a2b3;font-size:11px;text-transform:uppercase;border-bottom:1px solid #f1f3f6}.alloc-pending{border-top:1px solid #e4e6ea;margin-top:4px;padding-top:8px}\n"], dependencies: [{ 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.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: 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: "pipe", type: i4.DecimalPipe, name: "number" }, { kind: "pipe", type: i4.DatePipe, name: "date" }] });
|
|
144
162
|
}
|
|
145
163
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ResolveTransactionComponent, decorators: [{
|
|
146
164
|
type: Component,
|
|
147
|
-
args: [{ selector: 'lib-resolve-transaction', template: "<div class=\"modal-header border-0 pb-0\">\n <div>\n <h4 class=\"modal-title fw-bold\">Resolve & reconcile</h4>\n <div class=\"text-muted small mt-1\">{{ subtitle }}</div>\n </div>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"activeModal.dismiss()\"></button>\n</div>\n\n<div class=\"modal-body pt-3\">\n <!-- Transaction summary -->\n <div class=\"txn-sum\">\n <div>\n <div class=\"k\">Date</div>\n <div class=\"v\">{{ txn?.valueDate | date: 'dd MMM, yyyy' }}</div>\n </div>\n <div>\n <div class=\"k\">Amount</div>\n <div class=\"v fw-bold\">\u20B9{{ txn?.amount | number:'1.2-2':'en-IN' }}</div>\n </div>\n <div>\n <div class=\"k\">Reference / UTR</div>\n <div class=\"v mono\">{{ txn?.refNo || '\u2014' }}</div>\n </div>\n </div>\n\n <!-- Narration + current result -->\n <div class=\"advnote mt-3\">\n <span *ngIf=\"txn?.payer\"><strong>Payer:</strong> {{ txn?.payer }}<br></span>\n <span class=\"text-muted\">{{ txn?.narration }}</span>\n </div>\n <div class=\"advnote mt-2\">\n <strong>Current result:</strong> {{ txn?.resultNote || '\u2014' }}\n </div>\n\n <!-- Customer (searchable) + invoice selects -->\n <div class=\"mt-4\">\n <label class=\"form-label fw-semibold\">Customer</label>\n <div class=\"searchable-select position-relative\">\n <input type=\"text\" class=\"form-select\" placeholder=\"Search customer\u2026\" autocomplete=\"off\"\n [(ngModel)]=\"clientSearch\" (input)=\"onClientSearch()\" (focus)=\"clientDropdownOpen = true\">\n <div *ngIf=\"clientDropdownOpen\" class=\"ss-list card\">\n <div *ngFor=\"let o of filteredOptions\" class=\"ss-item\" [class.active]=\"o.clientId === selectedClientId\"\n (click)=\"selectClient(o)\">\n {{ o.brandName }}\n <span class=\"ss-count\">{{ o.invoices.length }} open</span>\n </div>\n <div *ngIf=\"!filteredOptions.length\" class=\"ss-item ss-empty\">No customers match \"{{ clientSearch }}\"</div>\n </div>\n </div>\n </div>\n <div class=\"mt-3\">\n <label class=\"form-label fw-semibold\">Apply to invoice</label>\n <
|
|
165
|
+
args: [{ selector: 'lib-resolve-transaction', template: "<div class=\"modal-header border-0 pb-0\">\n <div>\n <h4 class=\"modal-title fw-bold\">Resolve & reconcile</h4>\n <div class=\"text-muted small mt-1\">{{ subtitle }}</div>\n </div>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"activeModal.dismiss()\"></button>\n</div>\n\n<div class=\"modal-body pt-3\">\n <!-- Transaction summary -->\n <div class=\"txn-sum\">\n <div>\n <div class=\"k\">Date</div>\n <div class=\"v\">{{ txn?.valueDate | date: 'dd MMM, yyyy' }}</div>\n </div>\n <div>\n <div class=\"k\">Amount</div>\n <div class=\"v fw-bold\">\u20B9{{ txn?.amount | number:'1.2-2':'en-IN' }}</div>\n </div>\n <div>\n <div class=\"k\">Reference / UTR</div>\n <div class=\"v mono\">{{ txn?.refNo || '\u2014' }}</div>\n </div>\n </div>\n\n <!-- Narration + current result -->\n <div class=\"advnote mt-3\">\n <span *ngIf=\"txn?.payer\"><strong>Payer:</strong> {{ txn?.payer }}<br></span>\n <span class=\"text-muted\">{{ txn?.narration }}</span>\n </div>\n <div class=\"advnote mt-2\">\n <strong>Current result:</strong> {{ txn?.resultNote || '\u2014' }}\n </div>\n\n <!-- Customer (searchable) + invoice selects -->\n <div class=\"mt-4\">\n <label class=\"form-label fw-semibold\">Customer</label>\n <div class=\"searchable-select position-relative\">\n <input type=\"text\" class=\"form-select\" placeholder=\"Search customer\u2026\" autocomplete=\"off\"\n [(ngModel)]=\"clientSearch\" (input)=\"onClientSearch()\" (focus)=\"clientDropdownOpen = true\">\n <div *ngIf=\"clientDropdownOpen\" class=\"ss-list card\">\n <div *ngFor=\"let o of filteredOptions\" class=\"ss-item\" [class.active]=\"o.clientId === selectedClientId\"\n (click)=\"selectClient(o)\">\n {{ o.brandName }}\n <span class=\"ss-count\">{{ o.invoices.length }} open</span>\n </div>\n <div *ngIf=\"!filteredOptions.length\" class=\"ss-item ss-empty\">No customers match \"{{ clientSearch }}\"</div>\n </div>\n </div>\n </div>\n <div class=\"mt-3\">\n <label class=\"form-label fw-semibold\">Apply to invoice\n <span class=\"text-muted small fw-normal\">\u2014 select one or more</span>\n </label>\n <div class=\"invoice-multiselect\">\n <div *ngIf=\"!selectedClientId\" class=\"text-muted small px-2 py-2\">Select a customer first</div>\n <div *ngIf=\"selectedClientId && !clientInvoices.length\" class=\"text-muted small px-2 py-2\">No open invoice for this customer</div>\n <label *ngFor=\"let inv of clientInvoices\" class=\"invoice-option\"\n [class.selected]=\"isInvoiceSelected(inv)\">\n <input type=\"checkbox\" [checked]=\"isInvoiceSelected(inv)\" (change)=\"toggleInvoice(inv)\">\n <span class=\"inv-no\">{{ inv.invoice }}</span>\n <span class=\"inv-out\">\u20B9{{ inv.outstanding | number:'1.2-2':'en-IN' }}</span>\n <span class=\"inv-due\" *ngIf=\"inv.dueDate\">due {{ inv.dueDate | date: 'dd MMM yyyy' }}</span>\n </label>\n </div>\n </div>\n\n <!-- Allocation breakdown \u2014 how the incoming amount fills the selected\n invoices in order, with any leftover shown as a pending balance. -->\n <div *ngIf=\"selectedInvoiceIds.length\" class=\"alloc mt-3\">\n <div class=\"alloc-row alloc-head\">\n <span>Invoice</span><span>Outstanding</span><span>Applied</span>\n </div>\n <div *ngFor=\"let a of allocation\" class=\"alloc-row\">\n <span class=\"mono\">{{ a.invoice }}</span>\n <span>\u20B9{{ a.outstanding | number:'1.2-2':'en-IN' }}</span>\n <span [class.text-success]=\"a.settles\" [class.text-warning]=\"!a.settles && a.applied > 0\">\n \u20B9{{ a.applied | number:'1.2-2':'en-IN' }}{{ a.applied > 0 && !a.settles ? ' (partial)' : '' }}\n </span>\n </div>\n <div class=\"alloc-row alloc-pending\" [class.text-danger]=\"pendingAmount > 0\">\n <span class=\"fw-semibold\">Pending amount</span>\n <span></span>\n <span class=\"fw-bold\">\u20B9{{ pendingAmount | number:'1.2-2':'en-IN' }}</span>\n </div>\n <div *ngIf=\"pendingAmount > 0\" class=\"advnote mt-2\">\n Excess of \u20B9{{ pendingAmount | number:'1.2-2':'en-IN' }} remains after settling the selected invoice(s) \u2014 follow up with the customer.\n </div>\n </div>\n\n <!-- Actions -->\n <div class=\"d-flex flex-column gap-2 mt-4\">\n <div class=\"text-muted small fw-semibold\">Choose an action</div>\n <button class=\"btn btn-primary\" [disabled]=\"!selectedInvoiceIds.length || saving\" (click)=\"confirmReconcile()\">\n {{ saving ? 'Saving\u2026' : 'Confirm & reconcile' + (selectedInvoiceIds.length ? '' : ' \u2014 select an invoice') }}\n </button>\n <button class=\"btn btn-outline-secondary\" [disabled]=\"!selectedClientId || saving\" (click)=\"reachOut()\">\n Reach out to customer{{ selectedClientId ? '' : ' \u2014 select a customer' }}\n </button>\n <button class=\"btn btn-outline-secondary\" [disabled]=\"saving\" (click)=\"exclude()\">\n Mark as not to be considered\n </button>\n <button class=\"btn btn-link text-muted\" (click)=\"activeModal.dismiss()\">Cancel</button>\n </div>\n</div>", styles: [".txn-sum{display:grid;grid-template-columns:1fr 1fr 1fr;gap:12px;background:#f7f8fa;border:1px solid #eceef1;border-radius:12px;padding:14px 16px}.txn-sum .k{color:#8a93a2;font-size:12px}.txn-sum .v{margin-top:3px;color:#101828}.advnote{font-size:12.5px;color:#475467;background:#f5faff;border:1px solid #d7e9fb;border-radius:9px;padding:9px 12px}.advnote.advnote-ok{background:#eafaf1;border-color:#bfe8cf;color:#1c7a43}.mono{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;word-break:break-all}.searchable-select .ss-list{position:absolute;top:calc(100% + 4px);left:0;right:0;z-index:20;max-height:240px;overflow:auto;border:1px solid #E4E7EC;border-radius:10px;box-shadow:0 8px 24px #1018281f;padding:4px}.searchable-select .ss-item{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:9px 12px;border-radius:8px;cursor:pointer;font-weight:500;color:#344054}.searchable-select .ss-item:hover{background:#f4f6f9}.searchable-select .ss-item.active{background:#e8f3fe;color:#1493f5}.searchable-select .ss-item.ss-empty{color:#98a2b3;cursor:default;justify-content:flex-start}.searchable-select .ss-item.ss-empty:hover{background:transparent}.searchable-select .ss-count{font-size:11px;font-weight:600;color:#667085;background:#f1f3f6;border-radius:999px;padding:1px 8px;white-space:nowrap}.invoice-multiselect{border:1px solid #e4e6ea;border-radius:8px;max-height:180px;overflow-y:auto}.invoice-option{display:flex;align-items:center;gap:8px;padding:8px 12px;border-bottom:1px solid #f1f3f6;cursor:pointer;font-size:13px;margin:0}.invoice-option:last-child{border-bottom:0}.invoice-option.selected{background:#eef5ff}.invoice-option .inv-no{font-weight:600;color:#101828}.invoice-option .inv-out{margin-left:auto;font-weight:600}.invoice-option .inv-due{color:#98a2b3;font-size:11px}.alloc{border:1px solid #e4e6ea;border-radius:8px;padding:8px 12px;font-size:13px}.alloc-row{display:grid;grid-template-columns:1fr auto auto;gap:12px;padding:5px 0;align-items:center}.alloc-head{color:#98a2b3;font-size:11px;text-transform:uppercase;border-bottom:1px solid #f1f3f6}.alloc-pending{border-top:1px solid #e4e6ea;margin-top:4px;padding-top:8px}\n"] }]
|
|
148
166
|
}], ctorParameters: () => [{ type: i1.NgbActiveModal }, { type: i2.BillingService }, { type: i3.ToastService }, { type: i0.ElementRef }], propDecorators: { txn: [{
|
|
149
167
|
type: Input
|
|
150
168
|
}], options: [{
|
|
@@ -153,4 +171,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
153
171
|
type: HostListener,
|
|
154
172
|
args: ['document:click', ['$event']]
|
|
155
173
|
}] } });
|
|
156
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZS10cmFuc2FjdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1tYW5hZ2UtYmlsbGluZy9zcmMvbGliL2NvbXBvbmVudHMvYmFuay10cmFuc2FjdGlvbnMvcmVzb2x2ZS10cmFuc2FjdGlvbi9yZXNvbHZlLXRyYW5zYWN0aW9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS1iaWxsaW5nL3NyYy9saWIvY29tcG9uZW50cy9iYW5rLXRyYW5zYWN0aW9ucy9yZXNvbHZlLXRyYW5zYWN0aW9uL3Jlc29sdmUtdHJhbnNhY3Rpb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDOzs7Ozs7O0FBS25GLDhFQUE4RTtBQUM5RSw0RUFBNEU7QUFDNUUsMEVBQTBFO0FBTTFFLE1BQU0sT0FBTywyQkFBMkI7SUFjN0I7SUFDQztJQUNBO0lBQ0E7SUFoQkQsR0FBRyxDQUFNO0lBQ2xCLHFGQUFxRjtJQUM1RSxPQUFPLEdBQVUsRUFBRSxDQUFDO0lBRTdCLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztJQUN0QixpQkFBaUIsR0FBRyxFQUFFLENBQUM7SUFDdkIsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUVmLHNDQUFzQztJQUN0QyxZQUFZLEdBQUcsRUFBRSxDQUFDO0lBQ2xCLGtCQUFrQixHQUFHLEtBQUssQ0FBQztJQUUzQixZQUNTLFdBQTJCLEVBQzFCLGNBQThCLEVBQzlCLEtBQW1CLEVBQ25CLFVBQXNCO1FBSHZCLGdCQUFXLEdBQVgsV0FBVyxDQUFnQjtRQUMxQixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsVUFBSyxHQUFMLEtBQUssQ0FBYztRQUNuQixlQUFVLEdBQVYsVUFB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cEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxPQUFPLElBQUksa0JBQWtCLENBQUMsQ0FBQztZQUN0RSxDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE9BQU87UUFDTCxJQUFJLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTztRQUN4QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNuQixJQUFJLENBQUMsY0FBYyxDQUFDLHNCQUFzQixDQUFDO1lBQ3pDLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsU0FBUztTQUN2QyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ1gsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLGdDQUFnQyxDQUFDO1lBQ3BFLEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNiLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO2dCQUNwQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLE9BQU8sSUFBSSxrQkFBa0IsQ0FBQyxDQUFDO1lBQ3RFLENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO3dHQTNJVSwyQkFBMkI7NEZBQTNCLDJCQUEyQixxTENieEMseStIQStFTTs7NEZEbEVPLDJCQUEyQjtrQkFMdkMsU0FBUzsrQkFDRSx5QkFBeUI7b0tBSzFCLEdBQUc7c0JBQVgsS0FBSztnQkFFRyxPQUFPO3NCQUFmLEtBQUs7Z0JBc0ROLG1CQUFtQjtzQkFEbEIsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgSG9zdExpc3RlbmVyLCBJbnB1dCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZ2JBY3RpdmVNb2RhbCB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1zaGFyZWQnO1xuaW1wb3J0IHsgQmlsbGluZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9iaWxsaW5nLnNlcnZpY2UnO1xuXG4vLyBcIlJlc29sdmUgJiByZWNvbmNpbGVcIiBwb3B1cCAocHJvdG90eXBlIHBhcml0eSkgZm9yIG5lZWRzLXJldmlldyAvIHVubWF0Y2hlZFxuLy8gYmFuayB0cmFuc2FjdGlvbnMuIFBpY2sgYSBjdXN0b21lciArIGludm9pY2UsIHByZXZpZXcgdGhlIGVmZmVjdCAoZXhhY3QgL1xuLy8gcGFydGlhbCAvIG92ZXJwYXltZW50KSwgdGhlbiBjb25maXJtLCBtYXJrIGFzIHJlYWNoaW5nLW91dCwgb3IgZXhjbHVkZS5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1yZXNvbHZlLXRyYW5zYWN0aW9uJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3Jlc29sdmUtdHJhbnNhY3Rpb24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vcmVzb2x2ZS10cmFuc2FjdGlvbi5jb21wb25lbnQuc2Nzcydcbn0pXG5leHBvcnQgY2xhc3MgUmVzb2x2ZVRyYW5zYWN0aW9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgdHhuOiBhbnk7XG4gIC8vIFt7IGNsaWVudElkLCBicmFuZE5hbWUsIGludm9pY2VzOiBbeyBfaWQsIGludm9pY2UsIG91dHN0YW5kaW5nLCBkdWVEYXRlLCAuLi4gfV0gfV1cbiAgQElucHV0KCkgb3B0aW9uczogYW55W10gPSBbXTtcblxuICBzZWxlY3RlZENsaWVudElkID0gJyc7XG4gIHNlbGVjdGVkSW52b2ljZUlkID0gJyc7XG4gIHNhdmluZyA9IGZhbHNlO1xuXG4gIC8vIFNlYXJjaGFibGUgY3VzdG9tZXIgY29tYm9ib3ggc3RhdGUuXG4gIGNsaWVudFNlYXJjaCA9ICcnO1xuICBjbGllbnREcm9wZG93bk9wZW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgYWN0aXZlTW9kYWw6IE5nYkFjdGl2ZU1vZGFsLFxuICAgIHByaXZhdGUgYmlsbGluZ1NlcnZpY2U6IEJpbGxpbmdTZXJ2aWNlLFxuICAgIHByaXZhdGUgdG9hc3Q6IFRvYXN0U2VydmljZSxcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyBQcmUtc2VsZWN0IHRoZSBjdXN0b21lciB0aGUgY2xhc3NpZmllciBhbHJlYWR5IGlkZW50aWZpZWQgKG5lZWRzX3JldmlldykuXG4gICAgaWYgKHRoaXMudHhuPy5pZGVudGlmaWVkQ2xpZW50SWQgJiZcbiAgICAgICAgdGhpcy5vcHRpb25zLnNvbWUobyA9PiBvLmNsaWVudElkID09PSB0aGlzLnR4bi5pZGVudGlmaWVkQ2xpZW50SWQpKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkQ2xpZW50SWQgPSB0aGlzLnR4bi5pZGVudGlmaWVkQ2xpZW50SWQ7XG4gICAgICB0aGlzLmNsaWVudFNlYXJjaCA9IHRoaXMuc2VsZWN0ZWRDbGllbnQ/LmJyYW5kTmFtZSB8fCAnJztcbiAgICB9XG4gIH1cblxuICAvLyA9PT09PSBTZWFyY2hhYmxlIGN1c3RvbWVyIGRyb3Bkb3duID09PT09XG4gIGdldCBmaWx0ZXJlZE9wdGlvbnMoKTogYW55W10ge1xuICAgIGNvbnN0IHEgPSB0aGlzLmNsaWVudFNlYXJjaC50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgICAvLyBXaGVuIHRoZSBpbnB1dCBzdGlsbCBzaG93cyB0aGUgc2VsZWN0ZWQgYnJhbmQsIGRvbid0IGZpbHRlciDigJQgdGhlIHVzZXJcbiAgICAvLyBvcGVuZWQgdGhlIGxpc3QgdG8gc3dpdGNoLCBzbyBzaG93IGV2ZXJ5dGhpbmcuXG4gICAgaWYgKCFxIHx8IHEgPT09ICh0aGlzLnNlbGVjdGVkQ2xpZW50Py5icmFuZE5hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLm9wdGlvbnM7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZmlsdGVyKG8gPT4gKG8uYnJhbmROYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpKTtcbiAgfVxuXG4gIG9uQ2xpZW50U2VhcmNoKCkge1xuICAgIHRoaXMuY2xpZW50RHJvcGRvd25PcGVuID0gdHJ1ZTtcbiAgICAvLyBUeXBpbmcgcGFzdCB0aGUgc2VsZWN0ZWQgbmFtZSBkZXNlbGVjdHMgdW50aWwgYSBuZXcgcGljayBpcyBtYWRlLlxuICAgIGlmICh0aGlzLnNlbGVjdGVkQ2xpZW50ICYmIHRoaXMuY2xpZW50U2VhcmNoICE9PSB0aGlzLnNlbGVjdGVkQ2xpZW50LmJyYW5kTmFtZSkge1xuICAgICAgdGhpcy5zZWxlY3RlZENsaWVudElkID0gJyc7XG4gICAgICB0aGlzLnNlbGVjdGVkSW52b2ljZUlkID0gJyc7XG4gICAgfVxuICB9XG5cbiAgc2VsZWN0Q2xpZW50KG86IGFueSkge1xuICAgIHRoaXMuc2VsZWN0ZWRDbGllbnRJZCA9IG8uY2xpZW50SWQ7XG4gICAgdGhpcy5jbGllbnRTZWFyY2ggPSBvLmJyYW5kTmFtZTtcbiAgICB0aGlzLmNsaWVudERyb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgIHRoaXMuc2VsZWN0ZWRJbnZvaWNlSWQgPSAnJztcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcbiAgY2xvc2VPbk91dHNpZGVDbGljayhldmVudDogTW91c2VFdmVudCkge1xuICAgIGNvbnN0IGJveCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zZWFyY2hhYmxlLXNlbGVjdCcpO1xuICAgIGlmIChib3ggJiYgIWJveC5jb250YWlucyhldmVudC50YXJnZXQgYXMgTm9kZSkpIHtcbiAgICAgIHRoaXMuY2xpZW50RHJvcGRvd25PcGVuID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHN1YnRpdGxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudHhuPy5zdGF0dXMgPT09ICd1bm1hdGNoZWQnXG4gICAgICA/ICdJZGVudGlmeSB0aGUgY3VzdG9tZXIgYW5kIG1hcCB0aGlzIHBheW1lbnQnXG4gICAgICA6ICdDb25maXJtIGhvdyB0aGlzIHBheW1lbnQgaXMgYXBwbGllZCc7XG4gIH1cblxuICBnZXQgc2VsZWN0ZWRDbGllbnQoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmZpbmQobyA9PiBvLmNsaWVudElkID09PSB0aGlzLnNlbGVjdGVkQ2xpZW50SWQpO1xuICB9XG5cbiAgZ2V0IGNsaWVudEludm9pY2VzKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZENsaWVudD8uaW52b2ljZXMgfHwgW107XG4gIH1cblxuICBnZXQgc2VsZWN0ZWRJbnZvaWNlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50SW52b2ljZXMuZmluZCgoaTogYW55KSA9PiBTdHJpbmcoaS5faWQpID09PSB0aGlzLnNlbGVjdGVkSW52b2ljZUlkKTtcbiAgfVxuXG4gIC8vIExpdmUgcHJldmlldyDigJQgbWlycm9ycyB0aGUgYmFja2VuZCdzIHJlY29uY2lsZSBzZW1hbnRpY3Mgc28gd2hhdCB0aGVcbiAgLy8gdXNlciByZWFkcyBoZXJlIGlzIGV4YWN0bHkgd2hhdCB3aWxsIGJlIHJlY29yZGVkLlxuICBnZXQgcHJldmlldygpOiB7IGtpbmQ6ICdleGFjdCcgfCAncGFydGlhbCcgfCAnb3Zlcic7IHRleHQ6IHN0cmluZyB9IHwgbnVsbCB7XG4gICAgY29uc3QgaW52ID0gdGhpcy5zZWxlY3RlZEludm9pY2U7XG4gICAgaWYgKCFpbnYgfHwgIXRoaXMudHhuKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBkaWZmID0gTWF0aC5yb3VuZCgodGhpcy50eG4uYW1vdW50IC0gaW52Lm91dHN0YW5kaW5nKSAqIDEwMCkgLyAxMDA7XG4gICAgaWYgKE1hdGguYWJzKGRpZmYpIDw9IDEpIHtcbiAgICAgIHJldHVybiB7IGtpbmQ6ICdleGFjdCcsIHRleHQ6IGBFeGFjdCBtYXRjaCDigJQgaW52b2ljZSAke2ludi5pbnZvaWNlfSB3aWxsIGJlIG1hcmtlZCBQYWlkLmAgfTtcbiAgICB9XG4gICAgaWYgKGRpZmYgPCAwKSB7XG4gICAgICByZXR1cm4geyBraW5kOiAncGFydGlhbCcsIHRleHQ6IGBQYXJ0aWFsIOKAlCBhbGxvY2F0ZSB0aGlzIHBheW1lbnQgdG8gJHtpbnYuaW52b2ljZX07IGJhbGFuY2UgcmVtYWlucyBhbmQgdGhlIGludm9pY2Ugc3RheXMgUGFydGlhbGx5IFBhaWQuYCB9O1xuICAgIH1cbiAgICByZXR1cm4geyBraW5kOiAnb3ZlcicsIHRleHQ6IGBPdmVycGF5bWVudCDigJQgJHtpbnYuaW52b2ljZX0gd2lsbCBiZSBzZXR0bGVkOyB0aGUgZXhjZXNzIHdpbGwgbmVlZCBmb2xsb3ctdXAgd2l0aCB0aGUgY3VzdG9tZXIuYCB9O1xuICB9XG5cbiAgY29uZmlybVJlY29uY2lsZSgpIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRJbnZvaWNlSWQgfHwgdGhpcy5zYXZpbmcpIHJldHVybjtcbiAgICB0aGlzLnNhdmluZyA9IHRydWU7XG4gICAgdGhpcy5iaWxsaW5nU2VydmljZS5iYW5rUmVzb2x2ZVRyYW5zYWN0aW9uKHtcbiAgICAgIHR4bklkOiB0aGlzLnR4bi5faWQsIGFjdGlvbjogJ3JlY29uY2lsZScsIGludm9pY2VJZDogdGhpcy5zZWxlY3RlZEludm9pY2VJZCxcbiAgICB9KS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlcykgPT4gdGhpcy5hY3RpdmVNb2RhbC5jbG9zZShyZXM/LmRhdGE/Lm5vdGUgfHwgJ1JlY29uY2lsZWQnKSxcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgIHRoaXMuc2F2aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChlcnI/LmVycm9yPy5tZXNzYWdlIHx8ICdGYWlsZWQgdG8gcmVjb25jaWxlJyk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcmVhY2hPdXQoKSB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkQ2xpZW50SWQgfHwgdGhpcy5zYXZpbmcpIHJldHVybjtcbiAgICB0aGlzLnNhdmluZyA9IHRydWU7XG4gICAgdGhpcy5iaWxsaW5nU2VydmljZS5iYW5rUmVzb2x2ZVRyYW5zYWN0aW9uKHtcbiAgICAgIHR4bklkOiB0aGlzLnR4bi5faWQsIGFjdGlvbjogJ2NvbnRhY3QnLFxuICAgICAgY2xpZW50SWQ6IHRoaXMuc2VsZWN0ZWRDbGllbnRJZCxcbiAgICAgIGNsaWVudE5hbWU6IHRoaXMuc2VsZWN0ZWRDbGllbnQ/LmJyYW5kTmFtZSxcbiAgICB9KS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKCkgPT4gdGhpcy5hY3RpdmVNb2RhbC5jbG9zZShgTWFya2VkOiByZWFjaGluZyBvdXQgdG8gJHt0aGlzLnNlbGVjdGVkQ2xpZW50Py5icmFuZE5hbWUgfHwgJ2N1c3RvbWVyJ30gKGluIHByb2dyZXNzKWApLFxuICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgdGhpcy5zYXZpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KGVycj8uZXJyb3I/Lm1lc3NhZ2UgfHwgJ0ZhaWxlZCB0byB1cGRhdGUnKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBleGNsdWRlKCkge1xuICAgIGlmICh0aGlzLnNhdmluZykgcmV0dXJuO1xuICAgIHRoaXMuc2F2aW5nID0gdHJ1ZTtcbiAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmJhbmtSZXNvbHZlVHJhbnNhY3Rpb24oe1xuICAgICAgdHhuSWQ6IHRoaXMudHhuLl9pZCwgYWN0aW9uOiAnZXhjbHVkZScsXG4gICAgfSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6ICgpID0+IHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoJ01hcmtlZCBhcyBub3QgdG8gYmUgY29uc2lkZXJlZCcpLFxuICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgdGhpcy5zYXZpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KGVycj8uZXJyb3I/Lm1lc3NhZ2UgfHwgJ0ZhaWxlZCB0byB1cGRhdGUnKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn0iLCI8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyIGJvcmRlci0wIHBiLTBcIj5cbiAgICA8ZGl2PlxuICAgICAgICA8aDQgY2xhc3M9XCJtb2RhbC10aXRsZSBmdy1ib2xkXCI+UmVzb2x2ZSAmYW1wOyByZWNvbmNpbGU8L2g0PlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbCBtdC0xXCI+e3sgc3VidGl0bGUgfX08L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1jbG9zZVwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiIChjbGljayk9XCJhY3RpdmVNb2RhbC5kaXNtaXNzKClcIj48L2J1dHRvbj5cbjwvZGl2PlxuXG48ZGl2IGNsYXNzPVwibW9kYWwtYm9keSBwdC0zXCI+XG4gICAgPCEtLSBUcmFuc2FjdGlvbiBzdW1tYXJ5IC0tPlxuICAgIDxkaXYgY2xhc3M9XCJ0eG4tc3VtXCI+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwia1wiPkRhdGU8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2XCI+e3sgdHhuPy52YWx1ZURhdGUgfCBkYXRlOiAnZGQgTU1NLCB5eXl5JyB9fTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJrXCI+QW1vdW50PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidiBmdy1ib2xkXCI+4oK5e3sgdHhuPy5hbW91bnQgfCBudW1iZXI6JzEuMi0yJzonZW4tSU4nIH19PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImtcIj5SZWZlcmVuY2UgLyBVVFI8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2IG1vbm9cIj57eyB0eG4/LnJlZk5vIHx8ICfigJQnIH19PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBOYXJyYXRpb24gKyBjdXJyZW50IHJlc3VsdCAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiYWR2bm90ZSBtdC0zXCI+XG4gICAgICAgIDxzcGFuICpuZ0lmPVwidHhuPy5wYXllclwiPjxzdHJvbmc+UGF5ZXI6PC9zdHJvbmc+IHt7IHR4bj8ucGF5ZXIgfX08YnI+PC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbXV0ZWRcIj57eyB0eG4/Lm5hcnJhdGlvbiB9fTwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiYWR2bm90ZSBtdC0yXCI+XG4gICAgICAgIDxzdHJvbmc+Q3VycmVudCByZXN1bHQ6PC9zdHJvbmc+IHt7IHR4bj8ucmVzdWx0Tm90ZSB8fCAn4oCUJyB9fVxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBDdXN0b21lciAoc2VhcmNoYWJsZSkgKyBpbnZvaWNlIHNlbGVjdHMgLS0+XG4gICAgPGRpdiBjbGFzcz1cIm10LTRcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBmdy1zZW1pYm9sZFwiPkN1c3RvbWVyPC9sYWJlbD5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaGFibGUtc2VsZWN0IHBvc2l0aW9uLXJlbGF0aXZlXCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tc2VsZWN0XCIgcGxhY2Vob2xkZXI9XCJTZWFyY2ggY3VzdG9tZXLigKZcIiBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY2xpZW50U2VhcmNoXCIgKGlucHV0KT1cIm9uQ2xpZW50U2VhcmNoKClcIiAoZm9jdXMpPVwiY2xpZW50RHJvcGRvd25PcGVuID0gdHJ1ZVwiPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNsaWVudERyb3Bkb3duT3BlblwiIGNsYXNzPVwic3MtbGlzdCBjYXJkXCI+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgbyBvZiBmaWx0ZXJlZE9wdGlvbnNcIiBjbGFzcz1cInNzLWl0ZW1cIiBbY2xhc3MuYWN0aXZlXT1cIm8uY2xpZW50SWQgPT09IHNlbGVjdGVkQ2xpZW50SWRcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0Q2xpZW50KG8pXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IG8uYnJhbmROYW1lIH19XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3MtY291bnRcIj57eyBvLmludm9pY2VzLmxlbmd0aCB9fSBvcGVuPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhZmlsdGVyZWRPcHRpb25zLmxlbmd0aFwiIGNsYXNzPVwic3MtaXRlbSBzcy1lbXB0eVwiPk5vIGN1c3RvbWVycyBtYXRjaCBcInt7IGNsaWVudFNlYXJjaCB9fVwiPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm10LTNcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBmdy1zZW1pYm9sZFwiPkFwcGx5IHRvIGludm9pY2U8L2xhYmVsPlxuICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkSW52b2ljZUlkXCIgW2Rpc2FibGVkXT1cIiFzZWxlY3RlZENsaWVudElkXCI+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+e3sgc2VsZWN0ZWRDbGllbnRJZCA/IChjbGllbnRJbnZvaWNlcy5sZW5ndGggPyAnU2VsZWN0IGludm9pY2XigKYnIDogJ05vIG9wZW4gaW52b2ljZSBmb3IgdGhpcyBjdXN0b21lcicpIDogJ1NlbGVjdCBhIGN1c3RvbWVyIGZpcnN0JyB9fTwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgaW52IG9mIGNsaWVudEludm9pY2VzXCIgW3ZhbHVlXT1cImludi5faWRcIj5cbiAgICAgICAgICAgICAgICB7eyBpbnYuaW52b2ljZSB9fSDCtyDigrl7eyBpbnYub3V0c3RhbmRpbmcgfCBudW1iZXI6JzEuMi0yJzonZW4tSU4nIH19e3sgaW52LmR1ZURhdGUgPyAoJyDCtyBkdWUgJyArIChpbnYuZHVlRGF0ZSB8IGRhdGU6ICdkZCBNTU0geXl5eScpKSA6ICcnIH19XG4gICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgPC9zZWxlY3Q+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEVmZmVjdCBwcmV2aWV3IC0tPlxuICAgIDxkaXYgKm5nSWY9XCJwcmV2aWV3XCIgY2xhc3M9XCJhZHZub3RlIG10LTNcIiBbY2xhc3MuYWR2bm90ZS1va109XCJwcmV2aWV3LmtpbmQgPT09ICdleGFjdCdcIj5cbiAgICAgICAge3sgcHJldmlldy50ZXh0IH19XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEFjdGlvbnMgLS0+XG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbiBnYXAtMiBtdC00XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW11dGVkIHNtYWxsIGZ3LXNlbWlib2xkXCI+Q2hvb3NlIGFuIGFjdGlvbjwvZGl2PlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgW2Rpc2FibGVkXT1cIiFzZWxlY3RlZEludm9pY2VJZCB8fCBzYXZpbmdcIiAoY2xpY2spPVwiY29uZmlybVJlY29uY2lsZSgpXCI+XG4gICAgICAgICAgICB7eyBzYXZpbmcgPyAnU2F2aW5n4oCmJyA6ICdDb25maXJtICYgcmVjb25jaWxlJyArIChzZWxlY3RlZEludm9pY2VJZCA/ICcnIDogJyDigJQgc2VsZWN0IGFuIGludm9pY2UnKSB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1zZWNvbmRhcnlcIiBbZGlzYWJsZWRdPVwiIXNlbGVjdGVkQ2xpZW50SWQgfHwgc2F2aW5nXCIgKGNsaWNrKT1cInJlYWNoT3V0KClcIj5cbiAgICAgICAgICAgIFJlYWNoIG91dCB0byBjdXN0b21lcnt7IHNlbGVjdGVkQ2xpZW50SWQgPyAnJyA6ICcg4oCUIHNlbGVjdCBhIGN1c3RvbWVyJyB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1zZWNvbmRhcnlcIiBbZGlzYWJsZWRdPVwic2F2aW5nXCIgKGNsaWNrKT1cImV4Y2x1ZGUoKVwiPlxuICAgICAgICAgICAgTWFyayBhcyBub3QgdG8gYmUgY29uc2lkZXJlZFxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tbGluayB0ZXh0LW11dGVkXCIgKGNsaWNrKT1cImFjdGl2ZU1vZGFsLmRpc21pc3MoKVwiPkNhbmNlbDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuPC9kaXY+Il19
|
|
174
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZS10cmFuc2FjdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1tYW5hZ2UtYmlsbGluZy9zcmMvbGliL2NvbXBvbmVudHMvYmFuay10cmFuc2FjdGlvbnMvcmVzb2x2ZS10cmFuc2FjdGlvbi9yZXNvbHZlLXRyYW5zYWN0aW9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS1iaWxsaW5nL3NyYy9saWIvY29tcG9uZW50cy9iYW5rLXRyYW5zYWN0aW9ucy9yZXNvbHZlLXRyYW5zYWN0aW9uL3Jlc29sdmUtdHJhbnNhY3Rpb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDOzs7Ozs7O0FBS25GLDhFQUE4RTtBQUM5RSw0RUFBNEU7QUFDNUUsMEVBQTBFO0FBTTFFLE1BQU0sT0FBTywyQkFBMkI7SUFpQjdCO0lBQ0M7SUFDQTtJQUNBO0lBbkJELEdBQUcsQ0FBTTtJQUNsQixxRkFBcUY7SUFDNUUsT0FBTyxHQUFVLEVBQUUsQ0FBQztJQUU3QixnQkFBZ0IsR0FBRyxFQUFFLENBQUM7SUFDdEIsdUVBQXVFO0lBQ3ZFLHVFQUF1RTtJQUN2RSx3RUFBd0U7SUFDeEUsa0JBQWtCLEdBQWEsRUFBRSxDQUFDO0lBQ2xDLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFFZixzQ0FBc0M7SUFDdEMsWUFBWSxHQUFHLEVBQUUsQ0FBQztJQUNsQixrQkFBa0IsR0FBRyxLQUFLLENBQUM7SUFFM0IsWUFDUyxXQUEyQixFQUMxQixjQUE4QixFQUM5QixLQUFtQixFQUNuQixVQUFzQjtRQUh2QixnQkFBVyxHQUFYLFdBQVcsQ0FBZ0I7UUFDMUIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlC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QztnQkFDcEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxPQUFPLElBQUksa0JBQWtCLENBQUMsQ0FBQztZQUN0RSxDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE9BQU87UUFDTCxJQUFJLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTztRQUN4QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNuQixJQUFJLENBQUMsY0FBYyxDQUFDLHNCQUFzQixDQUFDO1lBQ3pDLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsU0FBUztTQUN2QyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ1gsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLGdDQUFnQyxDQUFDO1lBQ3BFLEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNiLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO2dCQUNwQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLE9BQU8sSUFBSSxrQkFBa0IsQ0FBQyxDQUFDO1lBQ3RFLENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO3dHQS9KVSwyQkFBMkI7NEZBQTNCLDJCQUEyQixxTENieEMseWpMQXdHTTs7NEZEM0ZPLDJCQUEyQjtrQkFMdkMsU0FBUzsrQkFDRSx5QkFBeUI7b0tBSzFCLEdBQUc7c0JBQVgsS0FBSztnQkFFRyxPQUFPO3NCQUFmLEtBQUs7Z0JBeUROLG1CQUFtQjtzQkFEbEIsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgSG9zdExpc3RlbmVyLCBJbnB1dCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZ2JBY3RpdmVNb2RhbCB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1zaGFyZWQnO1xuaW1wb3J0IHsgQmlsbGluZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9iaWxsaW5nLnNlcnZpY2UnO1xuXG4vLyBcIlJlc29sdmUgJiByZWNvbmNpbGVcIiBwb3B1cCAocHJvdG90eXBlIHBhcml0eSkgZm9yIG5lZWRzLXJldmlldyAvIHVubWF0Y2hlZFxuLy8gYmFuayB0cmFuc2FjdGlvbnMuIFBpY2sgYSBjdXN0b21lciArIGludm9pY2UsIHByZXZpZXcgdGhlIGVmZmVjdCAoZXhhY3QgL1xuLy8gcGFydGlhbCAvIG92ZXJwYXltZW50KSwgdGhlbiBjb25maXJtLCBtYXJrIGFzIHJlYWNoaW5nLW91dCwgb3IgZXhjbHVkZS5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1yZXNvbHZlLXRyYW5zYWN0aW9uJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3Jlc29sdmUtdHJhbnNhY3Rpb24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vcmVzb2x2ZS10cmFuc2FjdGlvbi5jb21wb25lbnQuc2Nzcydcbn0pXG5leHBvcnQgY2xhc3MgUmVzb2x2ZVRyYW5zYWN0aW9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgdHhuOiBhbnk7XG4gIC8vIFt7IGNsaWVudElkLCBicmFuZE5hbWUsIGludm9pY2VzOiBbeyBfaWQsIGludm9pY2UsIG91dHN0YW5kaW5nLCBkdWVEYXRlLCAuLi4gfV0gfV1cbiAgQElucHV0KCkgb3B0aW9uczogYW55W10gPSBbXTtcblxuICBzZWxlY3RlZENsaWVudElkID0gJyc7XG4gIC8vIE11bHRpcGxlIGludm9pY2VzIGNhbiBiZSBzZXR0bGVkIGJ5IG9uZSBwYXltZW50LiBPcmRlciBtYXR0ZXJzIOKAlCB0aGVcbiAgLy8gaW5jb21pbmcgYW1vdW50IGF1dG8tZmlsbHMgdGhlIHNlbGVjdGVkIGludm9pY2VzIGluIHBpY2sgb3JkZXIgKGVhY2hcbiAgLy8gc2V0dGxlZCBmdWxseSB1bnRpbCB0aGUgbW9uZXkgcnVucyBvdXQ7IHRoZSBsYXN0IG1heSBlbmQgdXAgcGFydGlhbCkuXG4gIHNlbGVjdGVkSW52b2ljZUlkczogc3RyaW5nW10gPSBbXTtcbiAgc2F2aW5nID0gZmFsc2U7XG5cbiAgLy8gU2VhcmNoYWJsZSBjdXN0b21lciBjb21ib2JveCBzdGF0ZS5cbiAgY2xpZW50U2VhcmNoID0gJyc7XG4gIGNsaWVudERyb3Bkb3duT3BlbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBhY3RpdmVNb2RhbDogTmdiQWN0aXZlTW9kYWwsXG4gICAgcHJpdmF0ZSBiaWxsaW5nU2VydmljZTogQmlsbGluZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSB0b2FzdDogVG9hc3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8vIFByZS1zZWxlY3QgdGhlIGN1c3RvbWVyIHRoZSBjbGFzc2lmaWVyIGFscmVhZHkgaWRlbnRpZmllZCAobmVlZHNfcmV2aWV3KS5cbiAgICBpZiAodGhpcy50eG4/LmlkZW50aWZpZWRDbGllbnRJZCAmJlxuICAgICAgICB0aGlzLm9wdGlvbnMuc29tZShvID0+IG8uY2xpZW50SWQgPT09IHRoaXMudHhuLmlkZW50aWZpZWRDbGllbnRJZCkpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRDbGllbnRJZCA9IHRoaXMudHhuLmlkZW50aWZpZWRDbGllbnRJZDtcbiAgICAgIHRoaXMuY2xpZW50U2VhcmNoID0gdGhpcy5zZWxlY3RlZENsaWVudD8uYnJhbmROYW1lIHx8ICcnO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09IFNlYXJjaGFibGUgY3VzdG9tZXIgZHJvcGRvd24gPT09PT1cbiAgZ2V0IGZpbHRlcmVkT3B0aW9ucygpOiBhbnlbXSB7XG4gICAgY29uc3QgcSA9IHRoaXMuY2xpZW50U2VhcmNoLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgIC8vIFdoZW4gdGhlIGlucHV0IHN0aWxsIHNob3dzIHRoZSBzZWxlY3RlZCBicmFuZCwgZG9uJ3QgZmlsdGVyIOKAlCB0aGUgdXNlclxuICAgIC8vIG9wZW5lZCB0aGUgbGlzdCB0byBzd2l0Y2gsIHNvIHNob3cgZXZlcnl0aGluZy5cbiAgICBpZiAoIXEgfHwgcSA9PT0gKHRoaXMuc2VsZWN0ZWRDbGllbnQ/LmJyYW5kTmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKSkge1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5maWx0ZXIobyA9PiAoby5icmFuZE5hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSkpO1xuICB9XG5cbiAgb25DbGllbnRTZWFyY2goKSB7XG4gICAgdGhpcy5jbGllbnREcm9wZG93bk9wZW4gPSB0cnVlO1xuICAgIC8vIFR5cGluZyBwYXN0IHRoZSBzZWxlY3RlZCBuYW1lIGRlc2VsZWN0cyB1bnRpbCBhIG5ldyBwaWNrIGlzIG1hZGUuXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRDbGllbnQgJiYgdGhpcy5jbGllbnRTZWFyY2ggIT09IHRoaXMuc2VsZWN0ZWRDbGllbnQuYnJhbmROYW1lKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkQ2xpZW50SWQgPSAnJztcbiAgICAgIHRoaXMuc2VsZWN0ZWRJbnZvaWNlSWRzID0gW107XG4gICAgfVxuICB9XG5cbiAgc2VsZWN0Q2xpZW50KG86IGFueSkge1xuICAgIHRoaXMuc2VsZWN0ZWRDbGllbnRJZCA9IG8uY2xpZW50SWQ7XG4gICAgdGhpcy5jbGllbnRTZWFyY2ggPSBvLmJyYW5kTmFtZTtcbiAgICB0aGlzLmNsaWVudERyb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgIHRoaXMuc2VsZWN0ZWRJbnZvaWNlSWRzID0gW107XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXG4gIGNsb3NlT25PdXRzaWRlQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBjb25zdCBib3ggPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuc2VhcmNoYWJsZS1zZWxlY3QnKTtcbiAgICBpZiAoYm94ICYmICFib3guY29udGFpbnMoZXZlbnQudGFyZ2V0IGFzIE5vZGUpKSB7XG4gICAgICB0aGlzLmNsaWVudERyb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGdldCBzdWJ0aXRsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnR4bj8uc3RhdHVzID09PSAndW5tYXRjaGVkJ1xuICAgICAgPyAnSWRlbnRpZnkgdGhlIGN1c3RvbWVyIGFuZCBtYXAgdGhpcyBwYXltZW50J1xuICAgICAgOiAnQ29uZmlybSBob3cgdGhpcyBwYXltZW50IGlzIGFwcGxpZWQnO1xuICB9XG5cbiAgZ2V0IHNlbGVjdGVkQ2xpZW50KCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5maW5kKG8gPT4gby5jbGllbnRJZCA9PT0gdGhpcy5zZWxlY3RlZENsaWVudElkKTtcbiAgfVxuXG4gIGdldCBjbGllbnRJbnZvaWNlcygpOiBhbnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRDbGllbnQ/Lmludm9pY2VzIHx8IFtdO1xuICB9XG5cbiAgaXNJbnZvaWNlU2VsZWN0ZWQoaW52OiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEludm9pY2VJZHMuaW5jbHVkZXMoU3RyaW5nKGludi5faWQpKTtcbiAgfVxuXG4gIC8vIFRvZ2dsZSBhbiBpbnZvaWNlIGluL291dCBvZiB0aGUgc2VsZWN0aW9uLiBPcmRlciBpcyBwcmVzZXJ2ZWQgKHB1c2ggb25cbiAgLy8gc2VsZWN0KSBzbyB0aGUgYXV0by1maWxsIGFsbG9jYXRpb24gZm9sbG93cyBwaWNrIG9yZGVyLlxuICB0b2dnbGVJbnZvaWNlKGludjogYW55KSB7XG4gICAgY29uc3QgaWQgPSBTdHJpbmcoaW52Ll9pZCk7XG4gICAgY29uc3QgaSA9IHRoaXMuc2VsZWN0ZWRJbnZvaWNlSWRzLmluZGV4T2YoaWQpO1xuICAgIGlmIChpID49IDApIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRJbnZvaWNlSWRzLnNwbGljZShpLCAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZEludm9pY2VJZHMucHVzaChpZCk7XG4gICAgfVxuICB9XG5cbiAgLy8gQXV0by1maWxsIGFsbG9jYXRpb246IHdhbGsgdGhlIHNlbGVjdGVkIGludm9pY2VzIGluIHBpY2sgb3JkZXIsIHNldHRsaW5nXG4gIC8vIGVhY2ggZnVsbHkgZnJvbSB0aGUgaW5jb21pbmcgYW1vdW50IHVudGlsIHRoZSBtb25leSBydW5zIG91dC4gUmV0dXJucyBhXG4gIC8vIHBlci1pbnZvaWNlIGJyZWFrZG93biBwbHVzIHRoZSBsZWZ0b3ZlciAoZXhjZXNzKSDigJQgbWlycm9ycyB0aGUgYmFja2VuZC5cbiAgZ2V0IGFsbG9jYXRpb24oKTogeyBpbnZvaWNlOiBzdHJpbmc7IG91dHN0YW5kaW5nOiBudW1iZXI7IGFwcGxpZWQ6IG51bWJlcjsgc2V0dGxlczogYm9vbGVhbiB9W10ge1xuICAgIGxldCByZW1haW5pbmcgPSBOdW1iZXIodGhpcy50eG4/LmFtb3VudCkgfHwgMDtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEludm9pY2VJZHMubWFwKChpZCkgPT4ge1xuICAgICAgY29uc3QgaW52ID0gdGhpcy5jbGllbnRJbnZvaWNlcy5maW5kKCh4OiBhbnkpID0+IFN0cmluZyh4Ll9pZCkgPT09IGlkKSB8fCB7fTtcbiAgICAgIGNvbnN0IG91dHN0YW5kaW5nID0gTWF0aC5yb3VuZCgoTnVtYmVyKGludi5vdXRzdGFuZGluZykgfHwgMCkgKiAxMDApIC8gMTAwO1xuICAgICAgY29uc3QgYXBwbGllZCA9IE1hdGgucm91bmQoTWF0aC5tYXgoMCwgTWF0aC5taW4ocmVtYWluaW5nLCBvdXRzdGFuZGluZykpICogMTAwKSAvIDEwMDtcbiAgICAgIHJlbWFpbmluZyA9IE1hdGgucm91bmQoKHJlbWFpbmluZyAtIGFwcGxpZWQpICogMTAwKSAvIDEwMDtcbiAgICAgIHJldHVybiB7IGludm9pY2U6IGludi5pbnZvaWNlLCBvdXRzdGFuZGluZywgYXBwbGllZCwgc2V0dGxlczogYXBwbGllZCA+PSBvdXRzdGFuZGluZyAtIDEgJiYgb3V0c3RhbmRpbmcgPiAwIH07XG4gICAgfSk7XG4gIH1cblxuICAvLyBNb25leSBsZWZ0IG92ZXIgYWZ0ZXIgZXZlcnkgc2VsZWN0ZWQgaW52b2ljZSBpcyBzZXR0bGVkLlxuICBnZXQgcGVuZGluZ0Ftb3VudCgpOiBudW1iZXIge1xuICAgIGNvbnN0IHRvdGFsT3V0c3RhbmRpbmcgPSB0aGlzLmFsbG9jYXRpb24ucmVkdWNlKChhLCB4KSA9PiBhICsgeC5vdXRzdGFuZGluZywgMCk7XG4gICAgcmV0dXJuIE1hdGgucm91bmQoTWF0aC5tYXgoMCwgKE51bWJlcih0aGlzLnR4bj8uYW1vdW50KSB8fCAwKSAtIHRvdGFsT3V0c3RhbmRpbmcpICogMTAwKSAvIDEwMDtcbiAgfVxuXG4gIGNvbmZpcm1SZWNvbmNpbGUoKSB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkSW52b2ljZUlkcy5sZW5ndGggfHwgdGhpcy5zYXZpbmcpIHJldHVybjtcbiAgICB0aGlzLnNhdmluZyA9IHRydWU7XG4gICAgdGhpcy5iaWxsaW5nU2VydmljZS5iYW5rUmVzb2x2ZVRyYW5zYWN0aW9uKHtcbiAgICAgIHR4bklkOiB0aGlzLnR4bi5faWQsIGFjdGlvbjogJ3JlY29uY2lsZScsIGludm9pY2VJZHM6IHRoaXMuc2VsZWN0ZWRJbnZvaWNlSWRzLFxuICAgIH0pLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzKSA9PiB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKHJlcz8uZGF0YT8ubm90ZSB8fCAnUmVjb25jaWxlZCcpLFxuICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgdGhpcy5zYXZpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KGVycj8uZXJyb3I/Lm1lc3NhZ2UgfHwgJ0ZhaWxlZCB0byByZWNvbmNpbGUnKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICByZWFjaE91dCgpIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRDbGllbnRJZCB8fCB0aGlzLnNhdmluZykgcmV0dXJuO1xuICAgIHRoaXMuc2F2aW5nID0gdHJ1ZTtcbiAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmJhbmtSZXNvbHZlVHJhbnNhY3Rpb24oe1xuICAgICAgdHhuSWQ6IHRoaXMudHhuLl9pZCwgYWN0aW9uOiAnY29udGFjdCcsXG4gICAgICBjbGllbnRJZDogdGhpcy5zZWxlY3RlZENsaWVudElkLFxuICAgICAgY2xpZW50TmFtZTogdGhpcy5zZWxlY3RlZENsaWVudD8uYnJhbmROYW1lLFxuICAgIH0pLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoKSA9PiB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKGBNYXJrZWQ6IHJlYWNoaW5nIG91dCB0byAke3RoaXMuc2VsZWN0ZWRDbGllbnQ/LmJyYW5kTmFtZSB8fCAnY3VzdG9tZXInfSAoaW4gcHJvZ3Jlc3MpYCksXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xuICAgICAgICB0aGlzLnNhdmluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoZXJyPy5lcnJvcj8ubWVzc2FnZSB8fCAnRmFpbGVkIHRvIHVwZGF0ZScpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIGV4Y2x1ZGUoKSB7XG4gICAgaWYgKHRoaXMuc2F2aW5nKSByZXR1cm47XG4gICAgdGhpcy5zYXZpbmcgPSB0cnVlO1xuICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UuYmFua1Jlc29sdmVUcmFuc2FjdGlvbih7XG4gICAgICB0eG5JZDogdGhpcy50eG4uX2lkLCBhY3Rpb246ICdleGNsdWRlJyxcbiAgICB9KS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKCkgPT4gdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSgnTWFya2VkIGFzIG5vdCB0byBiZSBjb25zaWRlcmVkJyksXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xuICAgICAgICB0aGlzLnNhdmluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoZXJyPy5lcnJvcj8ubWVzc2FnZSB8fCAnRmFpbGVkIHRvIHVwZGF0ZScpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxufSIsIjxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXIgYm9yZGVyLTAgcGItMFwiPlxuICAgIDxkaXY+XG4gICAgICAgIDxoNCBjbGFzcz1cIm1vZGFsLXRpdGxlIGZ3LWJvbGRcIj5SZXNvbHZlICZhbXA7IHJlY29uY2lsZTwvaDQ+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW11dGVkIHNtYWxsIG10LTFcIj57eyBzdWJ0aXRsZSB9fTwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWNsb3NlXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCIgKGNsaWNrKT1cImFjdGl2ZU1vZGFsLmRpc21pc3MoKVwiPjwvYnV0dG9uPlxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5IHB0LTNcIj5cbiAgICA8IS0tIFRyYW5zYWN0aW9uIHN1bW1hcnkgLS0+XG4gICAgPGRpdiBjbGFzcz1cInR4bi1zdW1cIj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJrXCI+RGF0ZTwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZcIj57eyB0eG4/LnZhbHVlRGF0ZSB8IGRhdGU6ICdkZCBNTU0sIHl5eXknIH19PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImtcIj5BbW91bnQ8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2IGZ3LWJvbGRcIj7igrl7eyB0eG4/LmFtb3VudCB8IG51bWJlcjonMS4yLTInOidlbi1JTicgfX08L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwia1wiPlJlZmVyZW5jZSAvIFVUUjwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInYgbW9ub1wiPnt7IHR4bj8ucmVmTm8gfHwgJ+KAlCcgfX08L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIE5hcnJhdGlvbiArIGN1cnJlbnQgcmVzdWx0IC0tPlxuICAgIDxkaXYgY2xhc3M9XCJhZHZub3RlIG10LTNcIj5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCJ0eG4/LnBheWVyXCI+PHN0cm9uZz5QYXllcjo8L3N0cm9uZz4ge3sgdHhuPy5wYXllciB9fTxicj48L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1tdXRlZFwiPnt7IHR4bj8ubmFycmF0aW9uIH19PC9zcGFuPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJhZHZub3RlIG10LTJcIj5cbiAgICAgICAgPHN0cm9uZz5DdXJyZW50IHJlc3VsdDo8L3N0cm9uZz4ge3sgdHhuPy5yZXN1bHROb3RlIHx8ICfigJQnIH19XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEN1c3RvbWVyIChzZWFyY2hhYmxlKSArIGludm9pY2Ugc2VsZWN0cyAtLT5cbiAgICA8ZGl2IGNsYXNzPVwibXQtNFwiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIGZ3LXNlbWlib2xkXCI+Q3VzdG9tZXI8L2xhYmVsPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoYWJsZS1zZWxlY3QgcG9zaXRpb24tcmVsYXRpdmVcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBwbGFjZWhvbGRlcj1cIlNlYXJjaCBjdXN0b21lcuKAplwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjbGllbnRTZWFyY2hcIiAoaW5wdXQpPVwib25DbGllbnRTZWFyY2goKVwiIChmb2N1cyk9XCJjbGllbnREcm9wZG93bk9wZW4gPSB0cnVlXCI+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY2xpZW50RHJvcGRvd25PcGVuXCIgY2xhc3M9XCJzcy1saXN0IGNhcmRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBvIG9mIGZpbHRlcmVkT3B0aW9uc1wiIGNsYXNzPVwic3MtaXRlbVwiIFtjbGFzcy5hY3RpdmVdPVwiby5jbGllbnRJZCA9PT0gc2VsZWN0ZWRDbGllbnRJZFwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RDbGllbnQobylcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgby5icmFuZE5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzcy1jb3VudFwiPnt7IG8uaW52b2ljZXMubGVuZ3RoIH19IG9wZW48L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFmaWx0ZXJlZE9wdGlvbnMubGVuZ3RoXCIgY2xhc3M9XCJzcy1pdGVtIHNzLWVtcHR5XCI+Tm8gY3VzdG9tZXJzIG1hdGNoIFwie3sgY2xpZW50U2VhcmNoIH19XCI8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibXQtM1wiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIGZ3LXNlbWlib2xkXCI+QXBwbHkgdG8gaW52b2ljZVxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LW11dGVkIHNtYWxsIGZ3LW5vcm1hbFwiPuKAlCBzZWxlY3Qgb25lIG9yIG1vcmU8L3NwYW4+XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbnZvaWNlLW11bHRpc2VsZWN0XCI+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIXNlbGVjdGVkQ2xpZW50SWRcIiBjbGFzcz1cInRleHQtbXV0ZWQgc21hbGwgcHgtMiBweS0yXCI+U2VsZWN0IGEgY3VzdG9tZXIgZmlyc3Q8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzZWxlY3RlZENsaWVudElkICYmICFjbGllbnRJbnZvaWNlcy5sZW5ndGhcIiBjbGFzcz1cInRleHQtbXV0ZWQgc21hbGwgcHgtMiBweS0yXCI+Tm8gb3BlbiBpbnZvaWNlIGZvciB0aGlzIGN1c3RvbWVyPC9kaXY+XG4gICAgICAgICAgICA8bGFiZWwgKm5nRm9yPVwibGV0IGludiBvZiBjbGllbnRJbnZvaWNlc1wiIGNsYXNzPVwiaW52b2ljZS1vcHRpb25cIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJpc0ludm9pY2VTZWxlY3RlZChpbnYpXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFtjaGVja2VkXT1cImlzSW52b2ljZVNlbGVjdGVkKGludilcIiAoY2hhbmdlKT1cInRvZ2dsZUludm9pY2UoaW52KVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW52LW5vXCI+e3sgaW52Lmludm9pY2UgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnYtb3V0XCI+4oK5e3sgaW52Lm91dHN0YW5kaW5nIHwgbnVtYmVyOicxLjItMic6J2VuLUlOJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImludi1kdWVcIiAqbmdJZj1cImludi5kdWVEYXRlXCI+ZHVlIHt7IGludi5kdWVEYXRlIHwgZGF0ZTogJ2RkIE1NTSB5eXl5JyB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBBbGxvY2F0aW9uIGJyZWFrZG93biDigJQgaG93IHRoZSBpbmNvbWluZyBhbW91bnQgZmlsbHMgdGhlIHNlbGVjdGVkXG4gICAgICAgICBpbnZvaWNlcyBpbiBvcmRlciwgd2l0aCBhbnkgbGVmdG92ZXIgc2hvd24gYXMgYSBwZW5kaW5nIGJhbGFuY2UuIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJzZWxlY3RlZEludm9pY2VJZHMubGVuZ3RoXCIgY2xhc3M9XCJhbGxvYyBtdC0zXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbGxvYy1yb3cgYWxsb2MtaGVhZFwiPlxuICAgICAgICAgICAgPHNwYW4+SW52b2ljZTwvc3Bhbj48c3Bhbj5PdXRzdGFuZGluZzwvc3Bhbj48c3Bhbj5BcHBsaWVkPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgYSBvZiBhbGxvY2F0aW9uXCIgY2xhc3M9XCJhbGxvYy1yb3dcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibW9ub1wiPnt7IGEuaW52b2ljZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuPuKCuXt7IGEub3V0c3RhbmRpbmcgfCBudW1iZXI6JzEuMi0yJzonZW4tSU4nIH19PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gW2NsYXNzLnRleHQtc3VjY2Vzc109XCJhLnNldHRsZXNcIiBbY2xhc3MudGV4dC13YXJuaW5nXT1cIiFhLnNldHRsZXMgJiYgYS5hcHBsaWVkID4gMFwiPlxuICAgICAgICAgICAgICAgIOKCuXt7IGEuYXBwbGllZCB8IG51bWJlcjonMS4yLTInOidlbi1JTicgfX17eyBhLmFwcGxpZWQgPiAwICYmICFhLnNldHRsZXMgPyAnIChwYXJ0aWFsKScgOiAnJyB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFsbG9jLXJvdyBhbGxvYy1wZW5kaW5nXCIgW2NsYXNzLnRleHQtZGFuZ2VyXT1cInBlbmRpbmdBbW91bnQgPiAwXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZ3LXNlbWlib2xkXCI+UGVuZGluZyBhbW91bnQ8L3NwYW4+XG4gICAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZ3LWJvbGRcIj7igrl7eyBwZW5kaW5nQW1vdW50IHwgbnVtYmVyOicxLjItMic6J2VuLUlOJyB9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJwZW5kaW5nQW1vdW50ID4gMFwiIGNsYXNzPVwiYWR2bm90ZSBtdC0yXCI+XG4gICAgICAgICAgICBFeGNlc3Mgb2Yg4oK5e3sgcGVuZGluZ0Ftb3VudCB8IG51bWJlcjonMS4yLTInOidlbi1JTicgfX0gcmVtYWlucyBhZnRlciBzZXR0bGluZyB0aGUgc2VsZWN0ZWQgaW52b2ljZShzKSDigJQgZm9sbG93IHVwIHdpdGggdGhlIGN1c3RvbWVyLlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gQWN0aW9ucyAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGdhcC0yIG10LTRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbXV0ZWQgc21hbGwgZnctc2VtaWJvbGRcIj5DaG9vc2UgYW4gYWN0aW9uPC9kaXY+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiBbZGlzYWJsZWRdPVwiIXNlbGVjdGVkSW52b2ljZUlkcy5sZW5ndGggfHwgc2F2aW5nXCIgKGNsaWNrKT1cImNvbmZpcm1SZWNvbmNpbGUoKVwiPlxuICAgICAgICAgICAge3sgc2F2aW5nID8gJ1NhdmluZ+KApicgOiAnQ29uZmlybSAmIHJlY29uY2lsZScgKyAoc2VsZWN0ZWRJbnZvaWNlSWRzLmxlbmd0aCA/ICcnIDogJyDigJQgc2VsZWN0IGFuIGludm9pY2UnKSB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1zZWNvbmRhcnlcIiBbZGlzYWJsZWRdPVwiIXNlbGVjdGVkQ2xpZW50SWQgfHwgc2F2aW5nXCIgKGNsaWNrKT1cInJlYWNoT3V0KClcIj5cbiAgICAgICAgICAgIFJlYWNoIG91dCB0byBjdXN0b21lcnt7IHNlbGVjdGVkQ2xpZW50SWQgPyAnJyA6ICcg4oCUIHNlbGVjdCBhIGN1c3RvbWVyJyB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1zZWNvbmRhcnlcIiBbZGlzYWJsZWRdPVwic2F2aW5nXCIgKGNsaWNrKT1cImV4Y2x1ZGUoKVwiPlxuICAgICAgICAgICAgTWFyayBhcyBub3QgdG8gYmUgY29uc2lkZXJlZFxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tbGluayB0ZXh0LW11dGVkXCIgKGNsaWNrKT1cImFjdGl2ZU1vZGFsLmRpc21pc3MoKVwiPkNhbmNlbDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuPC9kaXY+Il19
|