tango-app-ui-manage-billing 3.3.12 → 3.3.13
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/brands-billing/brands-billing.component.mjs +3 -3
- package/esm2022/lib/components/estimates/estimates.component.mjs +29 -7
- package/esm2022/lib/components/invoice-preview/invoice-preview.component.mjs +16 -3
- package/esm2022/lib/components/services/billing.service.mjs +7 -1
- package/esm2022/lib/components/tango-manage-billing/request-confirmation/request-confirmation.component.mjs +12 -3
- package/fesm2022/tango-app-ui-manage-billing.mjs +61 -12
- package/fesm2022/tango-app-ui-manage-billing.mjs.map +1 -1
- package/lib/components/estimates/estimates.component.d.ts +2 -1
- package/lib/components/invoice-preview/invoice-preview.component.d.ts +4 -2
- package/lib/components/services/billing.service.d.ts +2 -0
- package/lib/components/tango-manage-billing/request-confirmation/request-confirmation.component.d.ts +3 -1
- package/package.json +1 -1
|
@@ -22,11 +22,24 @@ export class InvoicePreviewComponent {
|
|
|
22
22
|
annexureLoading = false;
|
|
23
23
|
annexureError = false;
|
|
24
24
|
downloading = false;
|
|
25
|
+
// Fixed beneficiary account — hardcoded to match the PDF exactly (NOT from
|
|
26
|
+
// the DB), so the preview and the downloaded PDF always show the same thing.
|
|
27
|
+
bankDetails = {
|
|
28
|
+
beneficiaryName: 'Tango IT Solutions India Private Limited',
|
|
29
|
+
accountNumber: '50200027441433',
|
|
30
|
+
ifsc: 'HDFC0000386',
|
|
31
|
+
swift: 'HDFCINBBCHE',
|
|
32
|
+
branch: 'Santhome, Chennai',
|
|
33
|
+
paymentType: 'Online',
|
|
34
|
+
};
|
|
25
35
|
constructor(activeModal, billingService, toast) {
|
|
26
36
|
this.activeModal = activeModal;
|
|
27
37
|
this.billingService = billingService;
|
|
28
38
|
this.toast = toast;
|
|
29
39
|
}
|
|
40
|
+
ngOnInit() {
|
|
41
|
+
// Bank details are fixed (see bankDetails above) — nothing to fetch.
|
|
42
|
+
}
|
|
30
43
|
ngOnDestroy() {
|
|
31
44
|
this.destroy$.next();
|
|
32
45
|
this.destroy$.complete();
|
|
@@ -196,12 +209,12 @@ export class InvoicePreviewComponent {
|
|
|
196
209
|
return index;
|
|
197
210
|
}
|
|
198
211
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: InvoicePreviewComponent, deps: [{ token: i1.NgbActiveModal }, { token: i2.BillingService }, { token: i3.ToastService }], target: i0.ɵɵFactoryTarget.Component });
|
|
199
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: InvoicePreviewComponent, selector: "lib-invoice-preview", inputs: { invoiceData: "invoiceData" }, ngImport: i0, template: "<div class=\"invoice-preview-modal\">\n <div class=\"modal-header\">\n <ul class=\"nav nav-tabs preview-tabs\" role=\"tablist\">\n <li class=\"nav-item\">\n <button class=\"nav-link\" [class.active]=\"activeTab === 'invoice'\"\n (click)=\"selectTab('invoice')\" type=\"button\">Invoice</button>\n </li>\n <li class=\"nav-item\">\n <button class=\"nav-link\" [class.active]=\"activeTab === 'annexure'\"\n (click)=\"selectTab('annexure')\" type=\"button\">Annexure</button>\n </li>\n </ul>\n <button type=\"button\" class=\"btn-close\" (click)=\"activeModal.dismiss()\" aria-label=\"Close\"></button>\n </div>\n\n <div class=\"modal-body p-0\">\n <!-- INVOICE TAB -->\n <div *ngIf=\"activeTab === 'invoice'\" class=\"invoice-page\">\n <!-- Header row -->\n <div class=\"row align-items-start\">\n <div class=\"col-7\">\n <div class=\"brand\">\n <img src=\"./assets/tango/Images/tangoeye-logo.svg\" alt=\"TangoEye\" class=\"brand-logo\" onerror=\"this.style.display='none'\">\n </div>\n <div class=\"company-block mt-3\">\n <div class=\"company-name\">TANGO IT SOLUTIONS INDIA PRIVATE LTD</div>\n <div>2nd Floor, Apeejay Business Centre, No.12/39,</div>\n <div>Haddows Road, Nungambakkam</div>\n <div>Chennai Tamil Nadu 600006, India</div>\n <div class=\"mt-1\"><strong>GSTIN 33AAGCT3124R1Z2</strong></div>\n <div class=\"mt-1\">MSME / Udyam type : Micro</div>\n <div>MSME / Udyam No. : UDYAM-TN-03-0212399</div>\n </div>\n </div>\n <div class=\"col-5 text-end\">\n <div class=\"tax-invoice-label\">TAX INVOICE</div>\n <div class=\"invoice-number\"># {{ invoiceData?.invoice }}</div>\n </div>\n </div>\n\n <!-- Bill-to + totals row -->\n <div class=\"row mt-4\">\n <div class=\"col-7\">\n <div class=\"bill-to-label\">BILL TO :</div>\n <div class=\"client-name mt-1\">{{ (invoiceData?.clientName || invoiceData?.companyName) | uppercase }}</div>\n <div class=\"mt-1\" *ngIf=\"invoiceData?.billingAddressLineOne || invoiceData?.companyAddress\">\n {{ invoiceData?.billingAddressLineOne || invoiceData?.companyAddress }}\n </div>\n <div *ngIf=\"invoiceData?.billingAddressLineTwo\">{{ invoiceData?.billingAddressLineTwo }}</div>\n <div *ngIf=\"invoiceData?.billingCity || invoiceData?.billingPinCode || invoiceData?.billingState\">\n {{ invoiceData?.billingCity }}<span *ngIf=\"invoiceData?.billingPinCode\">, {{ invoiceData?.billingPinCode }}</span><span *ngIf=\"invoiceData?.billingState\">, {{ invoiceData?.billingState }}</span><span *ngIf=\"invoiceData?.billingCountry\">, {{ invoiceData?.billingCountry }}</span>\n </div>\n <div class=\"mt-2\" *ngIf=\"invoiceData?.GSTNumber\"><strong>GSTIN {{ invoiceData?.GSTNumber }}</strong></div>\n <div *ngIf=\"invoiceData?.PlaceOfSupply\">Place Of Supply: {{ invoiceData?.PlaceOfSupply }}</div>\n </div>\n <div class=\"col-5 text-end\">\n <div class=\"invoice-total-label\">Invoice Total <span class=\"invoice-total-amount\">{{ currencySymbol() }} {{ formatINR(invoiceData?.totalAmount) }}</span></div>\n <table class=\"meta-table ms-auto mt-3\">\n <tr><td class=\"meta-label\">Invoice date :</td><td class=\"meta-value\">{{ invoiceData?.billingDate | date:'dd/MM/yyyy' }}</td></tr>\n <tr><td class=\"meta-label\">Terms :</td><td class=\"meta-value\">Term {{ invoiceData?.paymentTerm || '30' }}</td></tr>\n <tr><td class=\"meta-label\">Due Date :</td><td class=\"meta-value\">{{ invoiceData?.dueDate | date:'dd/MM/yyyy' }}</td></tr>\n <tr *ngIf=\"invoiceData?.PoNum || invoiceData?.poNumber\"><td class=\"meta-label\">P.O.# :</td><td class=\"meta-value\">{{ invoiceData?.PoNum || invoiceData?.poNumber }}</td></tr>\n </table>\n </div>\n </div>\n\n <!-- Line items -->\n <table class=\"items-table mt-4\">\n <thead>\n <tr>\n <th class=\"col-index\">#</th>\n <th class=\"col-product\">Product & Description</th>\n <th class=\"col-month\">Month</th>\n <th class=\"col-hsn\">HSN/SAC</th>\n <th class=\"col-count text-center\">Quantity</th>\n <th class=\"col-rate text-end\">Rate</th>\n <th class=\"col-amount text-end\">Amount</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let item of invoiceData?.products; let i = index; trackBy: trackByIndex\">\n <td>{{ i + 1 }}</td>\n <td>\n <div class=\"product-name\">{{ formatProductName(item?.productName) }}</div>\n <div class=\"product-desc\">{{ item?.description }}</div>\n </td>\n <td class=\"nowrap\">{{ invoiceData?.billingDate | date:'MMM yyyy' }}</td>\n <td>{{ item?.hsn || item?.hsnCode || '998314' }}</td>\n <td class=\"text-center\"><strong>{{ item?.storeCount || invoiceData?.stores?.length || '' }}</strong></td>\n <td class=\"text-end nowrap\">{{ currencySymbol() }} {{ formatINR(item?.price) }}</td>\n <td class=\"text-end nowrap\">{{ currencySymbol() }} {{ formatINR(item?.amount) }}</td>\n </tr>\n </tbody>\n </table>\n\n <!-- Totals -->\n <div class=\"row mt-3\">\n <div class=\"col-7\"></div>\n <div class=\"col-5\">\n <table class=\"totals-table ms-auto\">\n <tr><td class=\"totals-label\">Sub Total</td><td class=\"totals-value\">{{ currencySymbol() }} {{ formatINR(invoiceData?.amount) }}</td></tr>\n <tr *ngFor=\"let t of invoiceData?.tax\">\n <td class=\"totals-label\">{{ t?.type || t?.taxName || t?.name }} ({{ t?.value ?? t?.taxPercentage ?? t?.percentage }}%)</td>\n <td class=\"totals-value nowrap\">{{ currencySymbol() }} {{ formatINR(t?.taxAmount) }}</td>\n </tr>\n <tr class=\"totals-total-row\">\n <td class=\"totals-label\">Total Amount</td>\n <td class=\"totals-value\">{{ currencySymbol() }} {{ formatINR(invoiceData?.totalAmount) }}</td>\n </tr>\n <tr class=\"totals-words-row\">\n <td class=\"totals-label\">Total In Words</td>\n <td class=\"totals-value words\">{{ totalInWords }}</td>\n </tr>\n </table>\n </div>\n </div>\n\n <!-- Payment details -->\n <div class=\"thanks mt-4\">Thanks for your business!</div>\n <table class=\"payment-table mt-2\">\n <tr><td class=\"payment-label\">Beneficiary Name</td><td class=\"payment-value\"><strong>Tango IT Solutions India Private Limited</strong></td></tr>\n <tr><td class=\"payment-label\">Account Number</td><td class=\"payment-value\"><strong>50200027441433</strong></td></tr>\n <tr><td class=\"payment-label\">IFSC Code</td><td class=\"payment-value\"><strong>HDFC0000269</strong></td></tr>\n <tr><td class=\"payment-label\">Payment Type</td><td class=\"payment-value\"><strong>Online</strong></td></tr>\n <tr><td class=\"payment-label\">SWIFT Code</td><td class=\"payment-value\"><strong>HDFCINBBCHE</strong></td></tr>\n <tr><td class=\"payment-label\">Branch</td><td class=\"payment-value\"><strong>RS Puram, Coimbatore</strong></td></tr>\n </table>\n\n <div class=\"system-note mt-4\">This is a system generated invoice. No signature required</div>\n </div>\n\n <!-- ANNEXURE TAB -->\n <div *ngIf=\"activeTab === 'annexure'\" class=\"annexure-page\">\n <div *ngIf=\"annexureLoading\" class=\"loading-state\">\n <div class=\"spinner-border text-primary\" role=\"status\"><span class=\"visually-hidden\">Loading...</span></div>\n </div>\n <div *ngIf=\"!annexureLoading && annexureError\" class=\"error-state\">\n <p>Failed to load annexure.</p>\n <button class=\"btn btn-sm btn-outline-primary\" (click)=\"retryAnnexure()\">Retry</button>\n </div>\n <div *ngIf=\"!annexureLoading && !annexureError && annexureData !== null && annexureData.length === 0\" class=\"empty-state\">\n No annexure data for this invoice.\n </div>\n <div *ngIf=\"!annexureLoading && !annexureError && annexureData && annexureData.length > 0\"\n class=\"annexure-toolbar\">\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary\" (click)=\"downloadAnnexureXlsx()\">\n Export as XLSX\n </button>\n </div>\n <table *ngIf=\"!annexureLoading && !annexureError && annexureData && annexureData.length > 0\" class=\"annexure-table\">\n <thead>\n <tr>\n <th>Store Name</th>\n <th>Products</th>\n <th>Store ID</th>\n <th>Deployment Date</th>\n <th>Period</th>\n <th>Pricing Method</th>\n <th class=\"text-center\">Billing Days</th>\n <th class=\"text-center\">Qty</th>\n <th class=\"text-end\">Unit Price</th>\n <th class=\"text-end\">Price Per Month</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let row of annexureData; trackBy: trackByIndex\">\n <td>{{ row?.storeName }}</td>\n <td>{{ row?.productName }}</td>\n <td>{{ row?.storeId }}</td>\n <td>{{ row?.edgefirstFileDate }}</td>\n <td>{{ row?.period === 'prorate' ? 'Pro-rate' : 'Full month' }}</td>\n <td>{{ row?.unitBasis || 'Per Store' }}</td>\n <td class=\"text-center\"><strong>{{ row?.workingdays }}</strong></td>\n <td class=\"text-center\">{{ row?.units ?? 1 }}</td>\n <td class=\"text-end\">\n {{ row?.currencyType }} {{ formatINR(row?.standardPrice) }}\n <div class=\"unit-basis\">{{ row?.unitBasis || 'Per Store' }}</div>\n </td>\n <td class=\"text-end\"><strong>{{ row?.currencyType }} {{ formatINR(row?.runningCost) }}</strong></td>\n </tr>\n </tbody>\n <tfoot *ngIf=\"annexureTotal != null\">\n <tr>\n <td colspan=\"9\" class=\"text-end\"><strong>Total</strong></td>\n <td class=\"text-end\"><strong>{{ annexureData[0]?.currencyType }} {{ formatINR(annexureTotal) }}</strong></td>\n </tr>\n </tfoot>\n </table>\n </div>\n </div>\n\n <div class=\"modal-footer\">\n <button class=\"btn btn-link\" (click)=\"activeModal.dismiss()\">Close</button>\n <button class=\"btn btn-outline-primary\" (click)=\"downloadPdf()\" [disabled]=\"downloading\">\n <span *ngIf=\"!downloading\">Download PDF</span>\n <span *ngIf=\"downloading\">Downloading...</span>\n </button>\n </div>\n</div>", styles: [".invoice-preview-modal{font-family:inherit;font-size:13px;color:#344054;display:flex;flex-direction:column;max-height:calc(100vh - 3.5rem)}.invoice-preview-modal .modal-header{flex:0 0 auto;padding:0 1rem;border-bottom:1px solid #EAECF0;display:flex;align-items:stretch;justify-content:space-between}.invoice-preview-modal .modal-header .preview-tabs{border-bottom:none}.invoice-preview-modal .modal-header .preview-tabs .nav-link{border:none;border-radius:0;color:#667085;padding:12px 16px;background:transparent}.invoice-preview-modal .modal-header .preview-tabs .nav-link.active{color:#00a3ff;border-bottom:2px solid #00A3FF;background:transparent}.invoice-preview-modal .modal-header .btn-close{align-self:center}.invoice-preview-modal .modal-body{background:#fff;flex:1 1 auto;overflow-y:auto;min-height:0}.invoice-preview-modal .invoice-page,.invoice-preview-modal .annexure-page{padding:32px 40px}.invoice-preview-modal .tax-invoice-label{font-size:22px;font-weight:600;color:#00a3ff}.invoice-preview-modal .invoice-number{font-size:18px;font-weight:600;color:#00a3ff}.invoice-preview-modal .company-name{font-weight:700;color:#101828}.invoice-preview-modal .bill-to-label{font-weight:600;color:#667085}.invoice-preview-modal .client-name{font-weight:700;color:#101828;font-size:15px}.invoice-preview-modal .invoice-total-label{font-weight:600;font-size:15px}.invoice-preview-modal .invoice-total-label .invoice-total-amount{color:#101828;font-weight:700;margin-left:8px}.invoice-preview-modal .meta-table td{padding:2px 8px}.invoice-preview-modal .meta-table .meta-label{color:#667085;text-align:right}.invoice-preview-modal .meta-table .meta-value{color:#101828;font-weight:600}.invoice-preview-modal .items-table{width:100%;border-collapse:collapse}.invoice-preview-modal .items-table th{background:#f2f4f7;padding:12px;font-weight:600;color:#344054;text-align:left}.invoice-preview-modal .items-table td{padding:14px 12px;border-bottom:1px solid #EAECF0;vertical-align:top}.invoice-preview-modal .items-table .product-name{font-weight:600;color:#101828}.invoice-preview-modal .items-table .product-desc{color:#667085;font-size:12px}.invoice-preview-modal .items-table .col-index{width:40px}.invoice-preview-modal .items-table .col-month,.invoice-preview-modal .items-table .col-hsn,.invoice-preview-modal .items-table .col-count{width:100px}.invoice-preview-modal .items-table .col-rate{width:110px}.invoice-preview-modal .items-table .col-amount{width:140px}.invoice-preview-modal .items-table .nowrap{white-space:nowrap}.invoice-preview-modal .totals-table{width:100%}.invoice-preview-modal .totals-table td{padding:6px 12px}.invoice-preview-modal .totals-table .totals-label{color:#667085;text-align:right}.invoice-preview-modal .totals-table .totals-value{color:#101828;font-weight:600;text-align:right}.invoice-preview-modal .totals-table .totals-total-row td{padding-top:12px}.invoice-preview-modal .totals-table .totals-total-row .totals-value{font-size:15px;font-weight:700}.invoice-preview-modal .totals-table .totals-words-row .words{font-weight:600;max-width:280px;white-space:normal;word-wrap:break-word}.invoice-preview-modal .totals-table .nowrap{white-space:nowrap}.invoice-preview-modal .thanks{font-weight:600;color:#101828}.invoice-preview-modal .payment-table{border-collapse:collapse}.invoice-preview-modal .payment-table td{padding:6px 12px}.invoice-preview-modal .payment-table .payment-label{color:#667085}.invoice-preview-modal .system-note{color:#667085;font-size:12px;font-weight:600}.invoice-preview-modal .annexure-table{width:100%;border-collapse:collapse}.invoice-preview-modal .annexure-table th{background:#f2f4f7;padding:12px;font-weight:600;color:#344054;text-align:left}.invoice-preview-modal .annexure-table td{padding:14px 12px;border-bottom:1px solid #EAECF0}.invoice-preview-modal .annexure-table .unit-basis{font-size:11px;color:#98a2b3;margin-top:2px}.invoice-preview-modal .annexure-table tfoot td{background:#f9fafb;border-top:2px solid #EAECF0;font-size:15px}.invoice-preview-modal .loading-state,.invoice-preview-modal .empty-state,.invoice-preview-modal .error-state{padding:40px;text-align:center;color:#667085}.invoice-preview-modal .modal-footer{flex:0 0 auto}.invoice-preview-modal .annexure-toolbar{display:flex;justify-content:flex-end;padding:8px 0 12px}\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: "pipe", type: i4.UpperCasePipe, name: "uppercase" }, { kind: "pipe", type: i4.DatePipe, name: "date" }] });
|
|
212
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: InvoicePreviewComponent, selector: "lib-invoice-preview", inputs: { invoiceData: "invoiceData" }, ngImport: i0, template: "<div class=\"invoice-preview-modal\">\n <div class=\"modal-header\">\n <ul class=\"nav nav-tabs preview-tabs\" role=\"tablist\">\n <li class=\"nav-item\">\n <button class=\"nav-link\" [class.active]=\"activeTab === 'invoice'\"\n (click)=\"selectTab('invoice')\" type=\"button\">Invoice</button>\n </li>\n <li class=\"nav-item\">\n <button class=\"nav-link\" [class.active]=\"activeTab === 'annexure'\"\n (click)=\"selectTab('annexure')\" type=\"button\">Annexure</button>\n </li>\n </ul>\n <button type=\"button\" class=\"btn-close\" (click)=\"activeModal.dismiss()\" aria-label=\"Close\"></button>\n </div>\n\n <div class=\"modal-body p-0\">\n <!-- INVOICE TAB -->\n <div *ngIf=\"activeTab === 'invoice'\" class=\"invoice-page\">\n <!-- Header row -->\n <div class=\"row align-items-start\">\n <div class=\"col-7\">\n <div class=\"brand\">\n <img src=\"./assets/tango/Images/tangoeye-logo.svg\" alt=\"TangoEye\" class=\"brand-logo\" onerror=\"this.style.display='none'\">\n </div>\n <div class=\"company-block mt-3\">\n <div class=\"company-name\">TANGO IT SOLUTIONS INDIA PRIVATE LTD</div>\n <div>2nd Floor, Apeejay Business Centre, No.12/39,</div>\n <div>Haddows Road, Nungambakkam</div>\n <div>Chennai Tamil Nadu 600006, India</div>\n <div class=\"mt-1\"><strong>GSTIN 33AAGCT3124R1Z2</strong></div>\n <div class=\"mt-1\">MSME / Udyam type : Micro</div>\n <div>MSME / Udyam No. : UDYAM-TN-03-0212399</div>\n </div>\n </div>\n <div class=\"col-5 text-end\">\n <div class=\"tax-invoice-label\">TAX INVOICE</div>\n <div class=\"invoice-number\"># {{ invoiceData?.invoice }}</div>\n </div>\n </div>\n\n <!-- Bill-to + totals row -->\n <div class=\"row mt-4\">\n <div class=\"col-7\">\n <div class=\"bill-to-label\">BILL TO :</div>\n <div class=\"client-name mt-1\">{{ (invoiceData?.clientName || invoiceData?.companyName) | uppercase }}</div>\n <div class=\"mt-1\" *ngIf=\"invoiceData?.billingAddressLineOne || invoiceData?.companyAddress\">\n {{ invoiceData?.billingAddressLineOne || invoiceData?.companyAddress }}\n </div>\n <div *ngIf=\"invoiceData?.billingAddressLineTwo\">{{ invoiceData?.billingAddressLineTwo }}</div>\n <div *ngIf=\"invoiceData?.billingCity || invoiceData?.billingPinCode || invoiceData?.billingState\">\n {{ invoiceData?.billingCity }}<span *ngIf=\"invoiceData?.billingPinCode\">, {{ invoiceData?.billingPinCode }}</span><span *ngIf=\"invoiceData?.billingState\">, {{ invoiceData?.billingState }}</span><span *ngIf=\"invoiceData?.billingCountry\">, {{ invoiceData?.billingCountry }}</span>\n </div>\n <div class=\"mt-2\" *ngIf=\"invoiceData?.GSTNumber\"><strong>GSTIN {{ invoiceData?.GSTNumber }}</strong></div>\n <div *ngIf=\"invoiceData?.PlaceOfSupply\">Place Of Supply: {{ invoiceData?.PlaceOfSupply }}</div>\n </div>\n <div class=\"col-5 text-end\">\n <div class=\"invoice-total-label\">Invoice Total <span class=\"invoice-total-amount\">{{ currencySymbol() }} {{ formatINR(invoiceData?.totalAmount) }}</span></div>\n <table class=\"meta-table ms-auto mt-3\">\n <tr><td class=\"meta-label\">Invoice date :</td><td class=\"meta-value\">{{ invoiceData?.billingDate | date:'dd/MM/yyyy' }}</td></tr>\n <tr><td class=\"meta-label\">Terms :</td><td class=\"meta-value\">Term {{ invoiceData?.paymentTerm || '30' }}</td></tr>\n <tr><td class=\"meta-label\">Due Date :</td><td class=\"meta-value\">{{ invoiceData?.dueDate | date:'dd/MM/yyyy' }}</td></tr>\n <tr *ngIf=\"invoiceData?.PoNum || invoiceData?.poNumber\"><td class=\"meta-label\">P.O.# :</td><td class=\"meta-value\">{{ invoiceData?.PoNum || invoiceData?.poNumber }}</td></tr>\n </table>\n </div>\n </div>\n\n <!-- Line items -->\n <table class=\"items-table mt-4\">\n <thead>\n <tr>\n <th class=\"col-index\">#</th>\n <th class=\"col-product\">Product & Description</th>\n <th class=\"col-month\">Month</th>\n <th class=\"col-hsn\">HSN/SAC</th>\n <th class=\"col-count text-center\">Quantity</th>\n <th class=\"col-rate text-end\">Rate</th>\n <th class=\"col-amount text-end\">Amount</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let item of invoiceData?.products; let i = index; trackBy: trackByIndex\">\n <td>{{ i + 1 }}</td>\n <td>\n <div class=\"product-name\">{{ formatProductName(item?.productName) }}</div>\n <div class=\"product-desc\">{{ item?.description }}</div>\n </td>\n <!-- Month is the product's billing month stored on the line item\n (advance invoices bill a future month while billingDate is the\n creation date). Fall back to billingDate for legacy rows. -->\n <td class=\"nowrap\">{{ item?.month || (invoiceData?.billingDate | date:'MMM yyyy') }}</td>\n <td>{{ item?.hsn || item?.hsnCode || '998314' }}</td>\n <td class=\"text-center\"><strong>{{ item?.storeCount || invoiceData?.stores?.length || '' }}</strong></td>\n <td class=\"text-end nowrap\">{{ currencySymbol() }} {{ formatINR(item?.price) }}</td>\n <td class=\"text-end nowrap\">{{ currencySymbol() }} {{ formatINR(item?.amount) }}</td>\n </tr>\n </tbody>\n </table>\n\n <!-- Totals -->\n <div class=\"row mt-3\">\n <div class=\"col-7\"></div>\n <div class=\"col-5\">\n <table class=\"totals-table ms-auto\">\n <tr><td class=\"totals-label\">Sub Total</td><td class=\"totals-value\">{{ currencySymbol() }} {{ formatINR(invoiceData?.amount) }}</td></tr>\n <tr *ngFor=\"let t of invoiceData?.tax\">\n <td class=\"totals-label\">{{ t?.type || t?.taxName || t?.name }} ({{ t?.value ?? t?.taxPercentage ?? t?.percentage }}%)</td>\n <td class=\"totals-value nowrap\">{{ currencySymbol() }} {{ formatINR(t?.taxAmount) }}</td>\n </tr>\n <tr class=\"totals-total-row\">\n <td class=\"totals-label\">Total Amount</td>\n <td class=\"totals-value\">{{ currencySymbol() }} {{ formatINR(invoiceData?.totalAmount) }}</td>\n </tr>\n <tr class=\"totals-words-row\">\n <td class=\"totals-label\">Total In Words</td>\n <td class=\"totals-value words\">{{ totalInWords }}</td>\n </tr>\n </table>\n </div>\n </div>\n\n <!-- Payment details -->\n <div class=\"thanks mt-4\">Thanks for your business!</div>\n <table class=\"payment-table mt-2\">\n <tr><td class=\"payment-label\">Beneficiary Name</td><td class=\"payment-value\"><strong>{{ bankDetails?.beneficiaryName }}</strong></td></tr>\n <tr><td class=\"payment-label\">Account Number</td><td class=\"payment-value\"><strong>{{ bankDetails?.accountNumber }}</strong></td></tr>\n <tr><td class=\"payment-label\">IFSC Code</td><td class=\"payment-value\"><strong>{{ bankDetails?.ifsc }}</strong></td></tr>\n <tr><td class=\"payment-label\">Payment Type</td><td class=\"payment-value\"><strong>{{ bankDetails?.paymentType }}</strong></td></tr>\n <tr><td class=\"payment-label\">SWIFT Code</td><td class=\"payment-value\"><strong>{{ bankDetails?.swift }}</strong></td></tr>\n <tr><td class=\"payment-label\">Branch</td><td class=\"payment-value\"><strong>{{ bankDetails?.branch }}</strong></td></tr>\n </table>\n\n <div class=\"system-note mt-4\">This is a system generated invoice. No signature required</div>\n </div>\n\n <!-- ANNEXURE TAB -->\n <div *ngIf=\"activeTab === 'annexure'\" class=\"annexure-page\">\n <div *ngIf=\"annexureLoading\" class=\"loading-state\">\n <div class=\"spinner-border text-primary\" role=\"status\"><span class=\"visually-hidden\">Loading...</span></div>\n </div>\n <div *ngIf=\"!annexureLoading && annexureError\" class=\"error-state\">\n <p>Failed to load annexure.</p>\n <button class=\"btn btn-sm btn-outline-primary\" (click)=\"retryAnnexure()\">Retry</button>\n </div>\n <div *ngIf=\"!annexureLoading && !annexureError && annexureData !== null && annexureData.length === 0\" class=\"empty-state\">\n No annexure data for this invoice.\n </div>\n <div *ngIf=\"!annexureLoading && !annexureError && annexureData && annexureData.length > 0\"\n class=\"annexure-toolbar\">\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary\" (click)=\"downloadAnnexureXlsx()\">\n Export as XLSX\n </button>\n </div>\n <table *ngIf=\"!annexureLoading && !annexureError && annexureData && annexureData.length > 0\" class=\"annexure-table\">\n <thead>\n <tr>\n <th>Store Name</th>\n <th>Products</th>\n <th>Store ID</th>\n <th>Deployment Date</th>\n <th>Period</th>\n <th>Pricing Method</th>\n <th class=\"text-center\">Billing Days</th>\n <th class=\"text-center\">Qty</th>\n <th class=\"text-end\">Unit Price</th>\n <th class=\"text-end\">Price Per Month</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let row of annexureData; trackBy: trackByIndex\">\n <td>{{ row?.storeName }}</td>\n <td>{{ row?.productName }}</td>\n <td>{{ row?.storeId }}</td>\n <td>{{ row?.edgefirstFileDate }}</td>\n <td>{{ row?.period === 'prorate' ? 'Pro-rate' : 'Full month' }}</td>\n <td>{{ row?.unitBasis || 'Per Store' }}</td>\n <td class=\"text-center\"><strong>{{ row?.workingdays }}</strong></td>\n <td class=\"text-center\">{{ row?.units ?? 1 }}</td>\n <td class=\"text-end\">\n {{ row?.currencyType }} {{ formatINR(row?.standardPrice) }}\n <div class=\"unit-basis\">{{ row?.unitBasis || 'Per Store' }}</div>\n </td>\n <td class=\"text-end\"><strong>{{ row?.currencyType }} {{ formatINR(row?.runningCost) }}</strong></td>\n </tr>\n </tbody>\n <tfoot *ngIf=\"annexureTotal != null\">\n <tr>\n <td colspan=\"9\" class=\"text-end\"><strong>Total</strong></td>\n <td class=\"text-end\"><strong>{{ annexureData[0]?.currencyType }} {{ formatINR(annexureTotal) }}</strong></td>\n </tr>\n </tfoot>\n </table>\n </div>\n </div>\n\n <div class=\"modal-footer\">\n <button class=\"btn btn-link\" (click)=\"activeModal.dismiss()\">Close</button>\n <button class=\"btn btn-outline-primary\" (click)=\"downloadPdf()\" [disabled]=\"downloading\">\n <span *ngIf=\"!downloading\">Download PDF</span>\n <span *ngIf=\"downloading\">Downloading...</span>\n </button>\n </div>\n</div>", styles: [".invoice-preview-modal{font-family:inherit;font-size:13px;color:#344054;display:flex;flex-direction:column;max-height:calc(100vh - 3.5rem)}.invoice-preview-modal .modal-header{flex:0 0 auto;padding:0 1rem;border-bottom:1px solid #EAECF0;display:flex;align-items:stretch;justify-content:space-between}.invoice-preview-modal .modal-header .preview-tabs{border-bottom:none}.invoice-preview-modal .modal-header .preview-tabs .nav-link{border:none;border-radius:0;color:#667085;padding:12px 16px;background:transparent}.invoice-preview-modal .modal-header .preview-tabs .nav-link.active{color:#00a3ff;border-bottom:2px solid #00A3FF;background:transparent}.invoice-preview-modal .modal-header .btn-close{align-self:center}.invoice-preview-modal .modal-body{background:#fff;flex:1 1 auto;overflow-y:auto;min-height:0}.invoice-preview-modal .invoice-page,.invoice-preview-modal .annexure-page{padding:32px 40px}.invoice-preview-modal .tax-invoice-label{font-size:22px;font-weight:600;color:#00a3ff}.invoice-preview-modal .invoice-number{font-size:18px;font-weight:600;color:#00a3ff}.invoice-preview-modal .company-name{font-weight:700;color:#101828}.invoice-preview-modal .bill-to-label{font-weight:600;color:#667085}.invoice-preview-modal .client-name{font-weight:700;color:#101828;font-size:15px}.invoice-preview-modal .invoice-total-label{font-weight:600;font-size:15px}.invoice-preview-modal .invoice-total-label .invoice-total-amount{color:#101828;font-weight:700;margin-left:8px}.invoice-preview-modal .meta-table td{padding:2px 8px}.invoice-preview-modal .meta-table .meta-label{color:#667085;text-align:right}.invoice-preview-modal .meta-table .meta-value{color:#101828;font-weight:600}.invoice-preview-modal .items-table{width:100%;border-collapse:collapse}.invoice-preview-modal .items-table th{background:#f2f4f7;padding:12px;font-weight:600;color:#344054;text-align:left}.invoice-preview-modal .items-table td{padding:14px 12px;border-bottom:1px solid #EAECF0;vertical-align:top}.invoice-preview-modal .items-table .product-name{font-weight:600;color:#101828}.invoice-preview-modal .items-table .product-desc{color:#667085;font-size:12px}.invoice-preview-modal .items-table .col-index{width:40px}.invoice-preview-modal .items-table .col-month,.invoice-preview-modal .items-table .col-hsn,.invoice-preview-modal .items-table .col-count{width:100px}.invoice-preview-modal .items-table .col-rate{width:110px}.invoice-preview-modal .items-table .col-amount{width:140px}.invoice-preview-modal .items-table .nowrap{white-space:nowrap}.invoice-preview-modal .totals-table{width:100%}.invoice-preview-modal .totals-table td{padding:6px 12px}.invoice-preview-modal .totals-table .totals-label{color:#667085;text-align:right}.invoice-preview-modal .totals-table .totals-value{color:#101828;font-weight:600;text-align:right}.invoice-preview-modal .totals-table .totals-total-row td{padding-top:12px}.invoice-preview-modal .totals-table .totals-total-row .totals-value{font-size:15px;font-weight:700}.invoice-preview-modal .totals-table .totals-words-row .words{font-weight:600;max-width:280px;white-space:normal;word-wrap:break-word}.invoice-preview-modal .totals-table .nowrap{white-space:nowrap}.invoice-preview-modal .thanks{font-weight:600;color:#101828}.invoice-preview-modal .payment-table{border-collapse:collapse}.invoice-preview-modal .payment-table td{padding:6px 12px}.invoice-preview-modal .payment-table .payment-label{color:#667085}.invoice-preview-modal .system-note{color:#667085;font-size:12px;font-weight:600}.invoice-preview-modal .annexure-table{width:100%;border-collapse:collapse}.invoice-preview-modal .annexure-table th{background:#f2f4f7;padding:12px;font-weight:600;color:#344054;text-align:left}.invoice-preview-modal .annexure-table td{padding:14px 12px;border-bottom:1px solid #EAECF0}.invoice-preview-modal .annexure-table .unit-basis{font-size:11px;color:#98a2b3;margin-top:2px}.invoice-preview-modal .annexure-table tfoot td{background:#f9fafb;border-top:2px solid #EAECF0;font-size:15px}.invoice-preview-modal .loading-state,.invoice-preview-modal .empty-state,.invoice-preview-modal .error-state{padding:40px;text-align:center;color:#667085}.invoice-preview-modal .modal-footer{flex:0 0 auto}.invoice-preview-modal .annexure-toolbar{display:flex;justify-content:flex-end;padding:8px 0 12px}\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: "pipe", type: i4.UpperCasePipe, name: "uppercase" }, { kind: "pipe", type: i4.DatePipe, name: "date" }] });
|
|
200
213
|
}
|
|
201
214
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: InvoicePreviewComponent, decorators: [{
|
|
202
215
|
type: Component,
|
|
203
|
-
args: [{ selector: 'lib-invoice-preview', template: "<div class=\"invoice-preview-modal\">\n <div class=\"modal-header\">\n <ul class=\"nav nav-tabs preview-tabs\" role=\"tablist\">\n <li class=\"nav-item\">\n <button class=\"nav-link\" [class.active]=\"activeTab === 'invoice'\"\n (click)=\"selectTab('invoice')\" type=\"button\">Invoice</button>\n </li>\n <li class=\"nav-item\">\n <button class=\"nav-link\" [class.active]=\"activeTab === 'annexure'\"\n (click)=\"selectTab('annexure')\" type=\"button\">Annexure</button>\n </li>\n </ul>\n <button type=\"button\" class=\"btn-close\" (click)=\"activeModal.dismiss()\" aria-label=\"Close\"></button>\n </div>\n\n <div class=\"modal-body p-0\">\n <!-- INVOICE TAB -->\n <div *ngIf=\"activeTab === 'invoice'\" class=\"invoice-page\">\n <!-- Header row -->\n <div class=\"row align-items-start\">\n <div class=\"col-7\">\n <div class=\"brand\">\n <img src=\"./assets/tango/Images/tangoeye-logo.svg\" alt=\"TangoEye\" class=\"brand-logo\" onerror=\"this.style.display='none'\">\n </div>\n <div class=\"company-block mt-3\">\n <div class=\"company-name\">TANGO IT SOLUTIONS INDIA PRIVATE LTD</div>\n <div>2nd Floor, Apeejay Business Centre, No.12/39,</div>\n <div>Haddows Road, Nungambakkam</div>\n <div>Chennai Tamil Nadu 600006, India</div>\n <div class=\"mt-1\"><strong>GSTIN 33AAGCT3124R1Z2</strong></div>\n <div class=\"mt-1\">MSME / Udyam type : Micro</div>\n <div>MSME / Udyam No. : UDYAM-TN-03-0212399</div>\n </div>\n </div>\n <div class=\"col-5 text-end\">\n <div class=\"tax-invoice-label\">TAX INVOICE</div>\n <div class=\"invoice-number\"># {{ invoiceData?.invoice }}</div>\n </div>\n </div>\n\n <!-- Bill-to + totals row -->\n <div class=\"row mt-4\">\n <div class=\"col-7\">\n <div class=\"bill-to-label\">BILL TO :</div>\n <div class=\"client-name mt-1\">{{ (invoiceData?.clientName || invoiceData?.companyName) | uppercase }}</div>\n <div class=\"mt-1\" *ngIf=\"invoiceData?.billingAddressLineOne || invoiceData?.companyAddress\">\n {{ invoiceData?.billingAddressLineOne || invoiceData?.companyAddress }}\n </div>\n <div *ngIf=\"invoiceData?.billingAddressLineTwo\">{{ invoiceData?.billingAddressLineTwo }}</div>\n <div *ngIf=\"invoiceData?.billingCity || invoiceData?.billingPinCode || invoiceData?.billingState\">\n {{ invoiceData?.billingCity }}<span *ngIf=\"invoiceData?.billingPinCode\">, {{ invoiceData?.billingPinCode }}</span><span *ngIf=\"invoiceData?.billingState\">, {{ invoiceData?.billingState }}</span><span *ngIf=\"invoiceData?.billingCountry\">, {{ invoiceData?.billingCountry }}</span>\n </div>\n <div class=\"mt-2\" *ngIf=\"invoiceData?.GSTNumber\"><strong>GSTIN {{ invoiceData?.GSTNumber }}</strong></div>\n <div *ngIf=\"invoiceData?.PlaceOfSupply\">Place Of Supply: {{ invoiceData?.PlaceOfSupply }}</div>\n </div>\n <div class=\"col-5 text-end\">\n <div class=\"invoice-total-label\">Invoice Total <span class=\"invoice-total-amount\">{{ currencySymbol() }} {{ formatINR(invoiceData?.totalAmount) }}</span></div>\n <table class=\"meta-table ms-auto mt-3\">\n <tr><td class=\"meta-label\">Invoice date :</td><td class=\"meta-value\">{{ invoiceData?.billingDate | date:'dd/MM/yyyy' }}</td></tr>\n <tr><td class=\"meta-label\">Terms :</td><td class=\"meta-value\">Term {{ invoiceData?.paymentTerm || '30' }}</td></tr>\n <tr><td class=\"meta-label\">Due Date :</td><td class=\"meta-value\">{{ invoiceData?.dueDate | date:'dd/MM/yyyy' }}</td></tr>\n <tr *ngIf=\"invoiceData?.PoNum || invoiceData?.poNumber\"><td class=\"meta-label\">P.O.# :</td><td class=\"meta-value\">{{ invoiceData?.PoNum || invoiceData?.poNumber }}</td></tr>\n </table>\n </div>\n </div>\n\n <!-- Line items -->\n <table class=\"items-table mt-4\">\n <thead>\n <tr>\n <th class=\"col-index\">#</th>\n <th class=\"col-product\">Product & Description</th>\n <th class=\"col-month\">Month</th>\n <th class=\"col-hsn\">HSN/SAC</th>\n <th class=\"col-count text-center\">Quantity</th>\n <th class=\"col-rate text-end\">Rate</th>\n <th class=\"col-amount text-end\">Amount</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let item of invoiceData?.products; let i = index; trackBy: trackByIndex\">\n <td>{{ i + 1 }}</td>\n <td>\n <div class=\"product-name\">{{ formatProductName(item?.productName) }}</div>\n <div class=\"product-desc\">{{ item?.description }}</div>\n </td>\n <td class=\"nowrap\">{{ invoiceData?.billingDate | date:'MMM yyyy' }}</td>\n <td>{{ item?.hsn || item?.hsnCode || '998314' }}</td>\n <td class=\"text-center\"><strong>{{ item?.storeCount || invoiceData?.stores?.length || '' }}</strong></td>\n <td class=\"text-end nowrap\">{{ currencySymbol() }} {{ formatINR(item?.price) }}</td>\n <td class=\"text-end nowrap\">{{ currencySymbol() }} {{ formatINR(item?.amount) }}</td>\n </tr>\n </tbody>\n </table>\n\n <!-- Totals -->\n <div class=\"row mt-3\">\n <div class=\"col-7\"></div>\n <div class=\"col-5\">\n <table class=\"totals-table ms-auto\">\n <tr><td class=\"totals-label\">Sub Total</td><td class=\"totals-value\">{{ currencySymbol() }} {{ formatINR(invoiceData?.amount) }}</td></tr>\n <tr *ngFor=\"let t of invoiceData?.tax\">\n <td class=\"totals-label\">{{ t?.type || t?.taxName || t?.name }} ({{ t?.value ?? t?.taxPercentage ?? t?.percentage }}%)</td>\n <td class=\"totals-value nowrap\">{{ currencySymbol() }} {{ formatINR(t?.taxAmount) }}</td>\n </tr>\n <tr class=\"totals-total-row\">\n <td class=\"totals-label\">Total Amount</td>\n <td class=\"totals-value\">{{ currencySymbol() }} {{ formatINR(invoiceData?.totalAmount) }}</td>\n </tr>\n <tr class=\"totals-words-row\">\n <td class=\"totals-label\">Total In Words</td>\n <td class=\"totals-value words\">{{ totalInWords }}</td>\n </tr>\n </table>\n </div>\n </div>\n\n <!-- Payment details -->\n <div class=\"thanks mt-4\">Thanks for your business!</div>\n <table class=\"payment-table mt-2\">\n <tr><td class=\"payment-label\">Beneficiary Name</td><td class=\"payment-value\"><strong>Tango IT Solutions India Private Limited</strong></td></tr>\n <tr><td class=\"payment-label\">Account Number</td><td class=\"payment-value\"><strong>50200027441433</strong></td></tr>\n <tr><td class=\"payment-label\">IFSC Code</td><td class=\"payment-value\"><strong>HDFC0000269</strong></td></tr>\n <tr><td class=\"payment-label\">Payment Type</td><td class=\"payment-value\"><strong>Online</strong></td></tr>\n <tr><td class=\"payment-label\">SWIFT Code</td><td class=\"payment-value\"><strong>HDFCINBBCHE</strong></td></tr>\n <tr><td class=\"payment-label\">Branch</td><td class=\"payment-value\"><strong>RS Puram, Coimbatore</strong></td></tr>\n </table>\n\n <div class=\"system-note mt-4\">This is a system generated invoice. No signature required</div>\n </div>\n\n <!-- ANNEXURE TAB -->\n <div *ngIf=\"activeTab === 'annexure'\" class=\"annexure-page\">\n <div *ngIf=\"annexureLoading\" class=\"loading-state\">\n <div class=\"spinner-border text-primary\" role=\"status\"><span class=\"visually-hidden\">Loading...</span></div>\n </div>\n <div *ngIf=\"!annexureLoading && annexureError\" class=\"error-state\">\n <p>Failed to load annexure.</p>\n <button class=\"btn btn-sm btn-outline-primary\" (click)=\"retryAnnexure()\">Retry</button>\n </div>\n <div *ngIf=\"!annexureLoading && !annexureError && annexureData !== null && annexureData.length === 0\" class=\"empty-state\">\n No annexure data for this invoice.\n </div>\n <div *ngIf=\"!annexureLoading && !annexureError && annexureData && annexureData.length > 0\"\n class=\"annexure-toolbar\">\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary\" (click)=\"downloadAnnexureXlsx()\">\n Export as XLSX\n </button>\n </div>\n <table *ngIf=\"!annexureLoading && !annexureError && annexureData && annexureData.length > 0\" class=\"annexure-table\">\n <thead>\n <tr>\n <th>Store Name</th>\n <th>Products</th>\n <th>Store ID</th>\n <th>Deployment Date</th>\n <th>Period</th>\n <th>Pricing Method</th>\n <th class=\"text-center\">Billing Days</th>\n <th class=\"text-center\">Qty</th>\n <th class=\"text-end\">Unit Price</th>\n <th class=\"text-end\">Price Per Month</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let row of annexureData; trackBy: trackByIndex\">\n <td>{{ row?.storeName }}</td>\n <td>{{ row?.productName }}</td>\n <td>{{ row?.storeId }}</td>\n <td>{{ row?.edgefirstFileDate }}</td>\n <td>{{ row?.period === 'prorate' ? 'Pro-rate' : 'Full month' }}</td>\n <td>{{ row?.unitBasis || 'Per Store' }}</td>\n <td class=\"text-center\"><strong>{{ row?.workingdays }}</strong></td>\n <td class=\"text-center\">{{ row?.units ?? 1 }}</td>\n <td class=\"text-end\">\n {{ row?.currencyType }} {{ formatINR(row?.standardPrice) }}\n <div class=\"unit-basis\">{{ row?.unitBasis || 'Per Store' }}</div>\n </td>\n <td class=\"text-end\"><strong>{{ row?.currencyType }} {{ formatINR(row?.runningCost) }}</strong></td>\n </tr>\n </tbody>\n <tfoot *ngIf=\"annexureTotal != null\">\n <tr>\n <td colspan=\"9\" class=\"text-end\"><strong>Total</strong></td>\n <td class=\"text-end\"><strong>{{ annexureData[0]?.currencyType }} {{ formatINR(annexureTotal) }}</strong></td>\n </tr>\n </tfoot>\n </table>\n </div>\n </div>\n\n <div class=\"modal-footer\">\n <button class=\"btn btn-link\" (click)=\"activeModal.dismiss()\">Close</button>\n <button class=\"btn btn-outline-primary\" (click)=\"downloadPdf()\" [disabled]=\"downloading\">\n <span *ngIf=\"!downloading\">Download PDF</span>\n <span *ngIf=\"downloading\">Downloading...</span>\n </button>\n </div>\n</div>", styles: [".invoice-preview-modal{font-family:inherit;font-size:13px;color:#344054;display:flex;flex-direction:column;max-height:calc(100vh - 3.5rem)}.invoice-preview-modal .modal-header{flex:0 0 auto;padding:0 1rem;border-bottom:1px solid #EAECF0;display:flex;align-items:stretch;justify-content:space-between}.invoice-preview-modal .modal-header .preview-tabs{border-bottom:none}.invoice-preview-modal .modal-header .preview-tabs .nav-link{border:none;border-radius:0;color:#667085;padding:12px 16px;background:transparent}.invoice-preview-modal .modal-header .preview-tabs .nav-link.active{color:#00a3ff;border-bottom:2px solid #00A3FF;background:transparent}.invoice-preview-modal .modal-header .btn-close{align-self:center}.invoice-preview-modal .modal-body{background:#fff;flex:1 1 auto;overflow-y:auto;min-height:0}.invoice-preview-modal .invoice-page,.invoice-preview-modal .annexure-page{padding:32px 40px}.invoice-preview-modal .tax-invoice-label{font-size:22px;font-weight:600;color:#00a3ff}.invoice-preview-modal .invoice-number{font-size:18px;font-weight:600;color:#00a3ff}.invoice-preview-modal .company-name{font-weight:700;color:#101828}.invoice-preview-modal .bill-to-label{font-weight:600;color:#667085}.invoice-preview-modal .client-name{font-weight:700;color:#101828;font-size:15px}.invoice-preview-modal .invoice-total-label{font-weight:600;font-size:15px}.invoice-preview-modal .invoice-total-label .invoice-total-amount{color:#101828;font-weight:700;margin-left:8px}.invoice-preview-modal .meta-table td{padding:2px 8px}.invoice-preview-modal .meta-table .meta-label{color:#667085;text-align:right}.invoice-preview-modal .meta-table .meta-value{color:#101828;font-weight:600}.invoice-preview-modal .items-table{width:100%;border-collapse:collapse}.invoice-preview-modal .items-table th{background:#f2f4f7;padding:12px;font-weight:600;color:#344054;text-align:left}.invoice-preview-modal .items-table td{padding:14px 12px;border-bottom:1px solid #EAECF0;vertical-align:top}.invoice-preview-modal .items-table .product-name{font-weight:600;color:#101828}.invoice-preview-modal .items-table .product-desc{color:#667085;font-size:12px}.invoice-preview-modal .items-table .col-index{width:40px}.invoice-preview-modal .items-table .col-month,.invoice-preview-modal .items-table .col-hsn,.invoice-preview-modal .items-table .col-count{width:100px}.invoice-preview-modal .items-table .col-rate{width:110px}.invoice-preview-modal .items-table .col-amount{width:140px}.invoice-preview-modal .items-table .nowrap{white-space:nowrap}.invoice-preview-modal .totals-table{width:100%}.invoice-preview-modal .totals-table td{padding:6px 12px}.invoice-preview-modal .totals-table .totals-label{color:#667085;text-align:right}.invoice-preview-modal .totals-table .totals-value{color:#101828;font-weight:600;text-align:right}.invoice-preview-modal .totals-table .totals-total-row td{padding-top:12px}.invoice-preview-modal .totals-table .totals-total-row .totals-value{font-size:15px;font-weight:700}.invoice-preview-modal .totals-table .totals-words-row .words{font-weight:600;max-width:280px;white-space:normal;word-wrap:break-word}.invoice-preview-modal .totals-table .nowrap{white-space:nowrap}.invoice-preview-modal .thanks{font-weight:600;color:#101828}.invoice-preview-modal .payment-table{border-collapse:collapse}.invoice-preview-modal .payment-table td{padding:6px 12px}.invoice-preview-modal .payment-table .payment-label{color:#667085}.invoice-preview-modal .system-note{color:#667085;font-size:12px;font-weight:600}.invoice-preview-modal .annexure-table{width:100%;border-collapse:collapse}.invoice-preview-modal .annexure-table th{background:#f2f4f7;padding:12px;font-weight:600;color:#344054;text-align:left}.invoice-preview-modal .annexure-table td{padding:14px 12px;border-bottom:1px solid #EAECF0}.invoice-preview-modal .annexure-table .unit-basis{font-size:11px;color:#98a2b3;margin-top:2px}.invoice-preview-modal .annexure-table tfoot td{background:#f9fafb;border-top:2px solid #EAECF0;font-size:15px}.invoice-preview-modal .loading-state,.invoice-preview-modal .empty-state,.invoice-preview-modal .error-state{padding:40px;text-align:center;color:#667085}.invoice-preview-modal .modal-footer{flex:0 0 auto}.invoice-preview-modal .annexure-toolbar{display:flex;justify-content:flex-end;padding:8px 0 12px}\n"] }]
|
|
216
|
+
args: [{ selector: 'lib-invoice-preview', template: "<div class=\"invoice-preview-modal\">\n <div class=\"modal-header\">\n <ul class=\"nav nav-tabs preview-tabs\" role=\"tablist\">\n <li class=\"nav-item\">\n <button class=\"nav-link\" [class.active]=\"activeTab === 'invoice'\"\n (click)=\"selectTab('invoice')\" type=\"button\">Invoice</button>\n </li>\n <li class=\"nav-item\">\n <button class=\"nav-link\" [class.active]=\"activeTab === 'annexure'\"\n (click)=\"selectTab('annexure')\" type=\"button\">Annexure</button>\n </li>\n </ul>\n <button type=\"button\" class=\"btn-close\" (click)=\"activeModal.dismiss()\" aria-label=\"Close\"></button>\n </div>\n\n <div class=\"modal-body p-0\">\n <!-- INVOICE TAB -->\n <div *ngIf=\"activeTab === 'invoice'\" class=\"invoice-page\">\n <!-- Header row -->\n <div class=\"row align-items-start\">\n <div class=\"col-7\">\n <div class=\"brand\">\n <img src=\"./assets/tango/Images/tangoeye-logo.svg\" alt=\"TangoEye\" class=\"brand-logo\" onerror=\"this.style.display='none'\">\n </div>\n <div class=\"company-block mt-3\">\n <div class=\"company-name\">TANGO IT SOLUTIONS INDIA PRIVATE LTD</div>\n <div>2nd Floor, Apeejay Business Centre, No.12/39,</div>\n <div>Haddows Road, Nungambakkam</div>\n <div>Chennai Tamil Nadu 600006, India</div>\n <div class=\"mt-1\"><strong>GSTIN 33AAGCT3124R1Z2</strong></div>\n <div class=\"mt-1\">MSME / Udyam type : Micro</div>\n <div>MSME / Udyam No. : UDYAM-TN-03-0212399</div>\n </div>\n </div>\n <div class=\"col-5 text-end\">\n <div class=\"tax-invoice-label\">TAX INVOICE</div>\n <div class=\"invoice-number\"># {{ invoiceData?.invoice }}</div>\n </div>\n </div>\n\n <!-- Bill-to + totals row -->\n <div class=\"row mt-4\">\n <div class=\"col-7\">\n <div class=\"bill-to-label\">BILL TO :</div>\n <div class=\"client-name mt-1\">{{ (invoiceData?.clientName || invoiceData?.companyName) | uppercase }}</div>\n <div class=\"mt-1\" *ngIf=\"invoiceData?.billingAddressLineOne || invoiceData?.companyAddress\">\n {{ invoiceData?.billingAddressLineOne || invoiceData?.companyAddress }}\n </div>\n <div *ngIf=\"invoiceData?.billingAddressLineTwo\">{{ invoiceData?.billingAddressLineTwo }}</div>\n <div *ngIf=\"invoiceData?.billingCity || invoiceData?.billingPinCode || invoiceData?.billingState\">\n {{ invoiceData?.billingCity }}<span *ngIf=\"invoiceData?.billingPinCode\">, {{ invoiceData?.billingPinCode }}</span><span *ngIf=\"invoiceData?.billingState\">, {{ invoiceData?.billingState }}</span><span *ngIf=\"invoiceData?.billingCountry\">, {{ invoiceData?.billingCountry }}</span>\n </div>\n <div class=\"mt-2\" *ngIf=\"invoiceData?.GSTNumber\"><strong>GSTIN {{ invoiceData?.GSTNumber }}</strong></div>\n <div *ngIf=\"invoiceData?.PlaceOfSupply\">Place Of Supply: {{ invoiceData?.PlaceOfSupply }}</div>\n </div>\n <div class=\"col-5 text-end\">\n <div class=\"invoice-total-label\">Invoice Total <span class=\"invoice-total-amount\">{{ currencySymbol() }} {{ formatINR(invoiceData?.totalAmount) }}</span></div>\n <table class=\"meta-table ms-auto mt-3\">\n <tr><td class=\"meta-label\">Invoice date :</td><td class=\"meta-value\">{{ invoiceData?.billingDate | date:'dd/MM/yyyy' }}</td></tr>\n <tr><td class=\"meta-label\">Terms :</td><td class=\"meta-value\">Term {{ invoiceData?.paymentTerm || '30' }}</td></tr>\n <tr><td class=\"meta-label\">Due Date :</td><td class=\"meta-value\">{{ invoiceData?.dueDate | date:'dd/MM/yyyy' }}</td></tr>\n <tr *ngIf=\"invoiceData?.PoNum || invoiceData?.poNumber\"><td class=\"meta-label\">P.O.# :</td><td class=\"meta-value\">{{ invoiceData?.PoNum || invoiceData?.poNumber }}</td></tr>\n </table>\n </div>\n </div>\n\n <!-- Line items -->\n <table class=\"items-table mt-4\">\n <thead>\n <tr>\n <th class=\"col-index\">#</th>\n <th class=\"col-product\">Product & Description</th>\n <th class=\"col-month\">Month</th>\n <th class=\"col-hsn\">HSN/SAC</th>\n <th class=\"col-count text-center\">Quantity</th>\n <th class=\"col-rate text-end\">Rate</th>\n <th class=\"col-amount text-end\">Amount</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let item of invoiceData?.products; let i = index; trackBy: trackByIndex\">\n <td>{{ i + 1 }}</td>\n <td>\n <div class=\"product-name\">{{ formatProductName(item?.productName) }}</div>\n <div class=\"product-desc\">{{ item?.description }}</div>\n </td>\n <!-- Month is the product's billing month stored on the line item\n (advance invoices bill a future month while billingDate is the\n creation date). Fall back to billingDate for legacy rows. -->\n <td class=\"nowrap\">{{ item?.month || (invoiceData?.billingDate | date:'MMM yyyy') }}</td>\n <td>{{ item?.hsn || item?.hsnCode || '998314' }}</td>\n <td class=\"text-center\"><strong>{{ item?.storeCount || invoiceData?.stores?.length || '' }}</strong></td>\n <td class=\"text-end nowrap\">{{ currencySymbol() }} {{ formatINR(item?.price) }}</td>\n <td class=\"text-end nowrap\">{{ currencySymbol() }} {{ formatINR(item?.amount) }}</td>\n </tr>\n </tbody>\n </table>\n\n <!-- Totals -->\n <div class=\"row mt-3\">\n <div class=\"col-7\"></div>\n <div class=\"col-5\">\n <table class=\"totals-table ms-auto\">\n <tr><td class=\"totals-label\">Sub Total</td><td class=\"totals-value\">{{ currencySymbol() }} {{ formatINR(invoiceData?.amount) }}</td></tr>\n <tr *ngFor=\"let t of invoiceData?.tax\">\n <td class=\"totals-label\">{{ t?.type || t?.taxName || t?.name }} ({{ t?.value ?? t?.taxPercentage ?? t?.percentage }}%)</td>\n <td class=\"totals-value nowrap\">{{ currencySymbol() }} {{ formatINR(t?.taxAmount) }}</td>\n </tr>\n <tr class=\"totals-total-row\">\n <td class=\"totals-label\">Total Amount</td>\n <td class=\"totals-value\">{{ currencySymbol() }} {{ formatINR(invoiceData?.totalAmount) }}</td>\n </tr>\n <tr class=\"totals-words-row\">\n <td class=\"totals-label\">Total In Words</td>\n <td class=\"totals-value words\">{{ totalInWords }}</td>\n </tr>\n </table>\n </div>\n </div>\n\n <!-- Payment details -->\n <div class=\"thanks mt-4\">Thanks for your business!</div>\n <table class=\"payment-table mt-2\">\n <tr><td class=\"payment-label\">Beneficiary Name</td><td class=\"payment-value\"><strong>{{ bankDetails?.beneficiaryName }}</strong></td></tr>\n <tr><td class=\"payment-label\">Account Number</td><td class=\"payment-value\"><strong>{{ bankDetails?.accountNumber }}</strong></td></tr>\n <tr><td class=\"payment-label\">IFSC Code</td><td class=\"payment-value\"><strong>{{ bankDetails?.ifsc }}</strong></td></tr>\n <tr><td class=\"payment-label\">Payment Type</td><td class=\"payment-value\"><strong>{{ bankDetails?.paymentType }}</strong></td></tr>\n <tr><td class=\"payment-label\">SWIFT Code</td><td class=\"payment-value\"><strong>{{ bankDetails?.swift }}</strong></td></tr>\n <tr><td class=\"payment-label\">Branch</td><td class=\"payment-value\"><strong>{{ bankDetails?.branch }}</strong></td></tr>\n </table>\n\n <div class=\"system-note mt-4\">This is a system generated invoice. No signature required</div>\n </div>\n\n <!-- ANNEXURE TAB -->\n <div *ngIf=\"activeTab === 'annexure'\" class=\"annexure-page\">\n <div *ngIf=\"annexureLoading\" class=\"loading-state\">\n <div class=\"spinner-border text-primary\" role=\"status\"><span class=\"visually-hidden\">Loading...</span></div>\n </div>\n <div *ngIf=\"!annexureLoading && annexureError\" class=\"error-state\">\n <p>Failed to load annexure.</p>\n <button class=\"btn btn-sm btn-outline-primary\" (click)=\"retryAnnexure()\">Retry</button>\n </div>\n <div *ngIf=\"!annexureLoading && !annexureError && annexureData !== null && annexureData.length === 0\" class=\"empty-state\">\n No annexure data for this invoice.\n </div>\n <div *ngIf=\"!annexureLoading && !annexureError && annexureData && annexureData.length > 0\"\n class=\"annexure-toolbar\">\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary\" (click)=\"downloadAnnexureXlsx()\">\n Export as XLSX\n </button>\n </div>\n <table *ngIf=\"!annexureLoading && !annexureError && annexureData && annexureData.length > 0\" class=\"annexure-table\">\n <thead>\n <tr>\n <th>Store Name</th>\n <th>Products</th>\n <th>Store ID</th>\n <th>Deployment Date</th>\n <th>Period</th>\n <th>Pricing Method</th>\n <th class=\"text-center\">Billing Days</th>\n <th class=\"text-center\">Qty</th>\n <th class=\"text-end\">Unit Price</th>\n <th class=\"text-end\">Price Per Month</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let row of annexureData; trackBy: trackByIndex\">\n <td>{{ row?.storeName }}</td>\n <td>{{ row?.productName }}</td>\n <td>{{ row?.storeId }}</td>\n <td>{{ row?.edgefirstFileDate }}</td>\n <td>{{ row?.period === 'prorate' ? 'Pro-rate' : 'Full month' }}</td>\n <td>{{ row?.unitBasis || 'Per Store' }}</td>\n <td class=\"text-center\"><strong>{{ row?.workingdays }}</strong></td>\n <td class=\"text-center\">{{ row?.units ?? 1 }}</td>\n <td class=\"text-end\">\n {{ row?.currencyType }} {{ formatINR(row?.standardPrice) }}\n <div class=\"unit-basis\">{{ row?.unitBasis || 'Per Store' }}</div>\n </td>\n <td class=\"text-end\"><strong>{{ row?.currencyType }} {{ formatINR(row?.runningCost) }}</strong></td>\n </tr>\n </tbody>\n <tfoot *ngIf=\"annexureTotal != null\">\n <tr>\n <td colspan=\"9\" class=\"text-end\"><strong>Total</strong></td>\n <td class=\"text-end\"><strong>{{ annexureData[0]?.currencyType }} {{ formatINR(annexureTotal) }}</strong></td>\n </tr>\n </tfoot>\n </table>\n </div>\n </div>\n\n <div class=\"modal-footer\">\n <button class=\"btn btn-link\" (click)=\"activeModal.dismiss()\">Close</button>\n <button class=\"btn btn-outline-primary\" (click)=\"downloadPdf()\" [disabled]=\"downloading\">\n <span *ngIf=\"!downloading\">Download PDF</span>\n <span *ngIf=\"downloading\">Downloading...</span>\n </button>\n </div>\n</div>", styles: [".invoice-preview-modal{font-family:inherit;font-size:13px;color:#344054;display:flex;flex-direction:column;max-height:calc(100vh - 3.5rem)}.invoice-preview-modal .modal-header{flex:0 0 auto;padding:0 1rem;border-bottom:1px solid #EAECF0;display:flex;align-items:stretch;justify-content:space-between}.invoice-preview-modal .modal-header .preview-tabs{border-bottom:none}.invoice-preview-modal .modal-header .preview-tabs .nav-link{border:none;border-radius:0;color:#667085;padding:12px 16px;background:transparent}.invoice-preview-modal .modal-header .preview-tabs .nav-link.active{color:#00a3ff;border-bottom:2px solid #00A3FF;background:transparent}.invoice-preview-modal .modal-header .btn-close{align-self:center}.invoice-preview-modal .modal-body{background:#fff;flex:1 1 auto;overflow-y:auto;min-height:0}.invoice-preview-modal .invoice-page,.invoice-preview-modal .annexure-page{padding:32px 40px}.invoice-preview-modal .tax-invoice-label{font-size:22px;font-weight:600;color:#00a3ff}.invoice-preview-modal .invoice-number{font-size:18px;font-weight:600;color:#00a3ff}.invoice-preview-modal .company-name{font-weight:700;color:#101828}.invoice-preview-modal .bill-to-label{font-weight:600;color:#667085}.invoice-preview-modal .client-name{font-weight:700;color:#101828;font-size:15px}.invoice-preview-modal .invoice-total-label{font-weight:600;font-size:15px}.invoice-preview-modal .invoice-total-label .invoice-total-amount{color:#101828;font-weight:700;margin-left:8px}.invoice-preview-modal .meta-table td{padding:2px 8px}.invoice-preview-modal .meta-table .meta-label{color:#667085;text-align:right}.invoice-preview-modal .meta-table .meta-value{color:#101828;font-weight:600}.invoice-preview-modal .items-table{width:100%;border-collapse:collapse}.invoice-preview-modal .items-table th{background:#f2f4f7;padding:12px;font-weight:600;color:#344054;text-align:left}.invoice-preview-modal .items-table td{padding:14px 12px;border-bottom:1px solid #EAECF0;vertical-align:top}.invoice-preview-modal .items-table .product-name{font-weight:600;color:#101828}.invoice-preview-modal .items-table .product-desc{color:#667085;font-size:12px}.invoice-preview-modal .items-table .col-index{width:40px}.invoice-preview-modal .items-table .col-month,.invoice-preview-modal .items-table .col-hsn,.invoice-preview-modal .items-table .col-count{width:100px}.invoice-preview-modal .items-table .col-rate{width:110px}.invoice-preview-modal .items-table .col-amount{width:140px}.invoice-preview-modal .items-table .nowrap{white-space:nowrap}.invoice-preview-modal .totals-table{width:100%}.invoice-preview-modal .totals-table td{padding:6px 12px}.invoice-preview-modal .totals-table .totals-label{color:#667085;text-align:right}.invoice-preview-modal .totals-table .totals-value{color:#101828;font-weight:600;text-align:right}.invoice-preview-modal .totals-table .totals-total-row td{padding-top:12px}.invoice-preview-modal .totals-table .totals-total-row .totals-value{font-size:15px;font-weight:700}.invoice-preview-modal .totals-table .totals-words-row .words{font-weight:600;max-width:280px;white-space:normal;word-wrap:break-word}.invoice-preview-modal .totals-table .nowrap{white-space:nowrap}.invoice-preview-modal .thanks{font-weight:600;color:#101828}.invoice-preview-modal .payment-table{border-collapse:collapse}.invoice-preview-modal .payment-table td{padding:6px 12px}.invoice-preview-modal .payment-table .payment-label{color:#667085}.invoice-preview-modal .system-note{color:#667085;font-size:12px;font-weight:600}.invoice-preview-modal .annexure-table{width:100%;border-collapse:collapse}.invoice-preview-modal .annexure-table th{background:#f2f4f7;padding:12px;font-weight:600;color:#344054;text-align:left}.invoice-preview-modal .annexure-table td{padding:14px 12px;border-bottom:1px solid #EAECF0}.invoice-preview-modal .annexure-table .unit-basis{font-size:11px;color:#98a2b3;margin-top:2px}.invoice-preview-modal .annexure-table tfoot td{background:#f9fafb;border-top:2px solid #EAECF0;font-size:15px}.invoice-preview-modal .loading-state,.invoice-preview-modal .empty-state,.invoice-preview-modal .error-state{padding:40px;text-align:center;color:#667085}.invoice-preview-modal .modal-footer{flex:0 0 auto}.invoice-preview-modal .annexure-toolbar{display:flex;justify-content:flex-end;padding:8px 0 12px}\n"] }]
|
|
204
217
|
}], ctorParameters: () => [{ type: i1.NgbActiveModal }, { type: i2.BillingService }, { type: i3.ToastService }], propDecorators: { invoiceData: [{
|
|
205
218
|
type: Input
|
|
206
219
|
}] } });
|
|
207
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW52b2ljZS1wcmV2aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS1iaWxsaW5nL3NyYy9saWIvY29tcG9uZW50cy9pbnZvaWNlLXByZXZpZXcvaW52b2ljZS1wcmV2aWV3LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS1iaWxsaW5nL3NyYy9saWIvY29tcG9uZW50cy9pbnZvaWNlLXByZXZpZXcvaW52b2ljZS1wcmV2aWV3LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBRTVELE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzFDLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sS0FBSyxTQUFTLE1BQU0sWUFBWSxDQUFDO0FBR3hDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7O0FBT3ZELE1BQU0sT0FBTyx1QkFBdUI7SUFpQnpCO0lBQ0M7SUFDQTtJQWxCTyxRQUFRLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztJQUV2QyxXQUFXLENBQU07SUFFMUIsU0FBUyxHQUEyQixTQUFTLENBQUM7SUFFOUMsWUFBWSxHQUFpQixJQUFJLENBQUM7SUFDbEMsMEVBQTBFO0lBQzFFLGlEQUFpRDtJQUNqRCxhQUFhLEdBQWtCLElBQUksQ0FBQztJQUNwQyxlQUFlLEdBQUcsS0FBSyxDQUFDO0lBQ3hCLGFBQWEsR0FBRyxLQUFLLENBQUM7SUFFdEIsV0FBVyxHQUFHLEtBQUssQ0FBQztJQUVwQixZQUNTLFdBQTJCLEVBQzFCLGNBQThCLEVBQzlCLEtBQW1CO1FBRnBCLGdCQUFXLEdBQVgsV0FBVyxDQUFnQjtR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Tyx1QkFBdUI7a0JBTG5DLFNBQVM7K0JBQ0UscUJBQXFCOzJJQU90QixXQUFXO3NCQUFuQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZ2JBY3RpdmVNb2RhbCB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcbmltcG9ydCB7IFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0ICogYXMgWExTWCBmcm9tICd4bHN4JztcbmltcG9ydCAqIGFzIEZpbGVTYXZlciBmcm9tICdmaWxlLXNhdmVyJztcbmltcG9ydCB7IEJpbGxpbmdTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvYmlsbGluZy5zZXJ2aWNlJztcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1zaGFyZWQnO1xuaW1wb3J0IHsgYW1vdW50SW5Xb3JkcyB9IGZyb20gJy4vYW1vdW50LWluLXdvcmRzLnV0aWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItaW52b2ljZS1wcmV2aWV3JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2ludm9pY2UtcHJldmlldy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9pbnZvaWNlLXByZXZpZXcuY29tcG9uZW50LnNjc3MnXG59KVxuZXhwb3J0IGNsYXNzIEludm9pY2VQcmV2aWV3Q29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgQElucHV0KCkgaW52b2ljZURhdGE6IGFueTtcblxuICBhY3RpdmVUYWI6ICdpbnZvaWNlJyB8ICdhbm5leHVyZScgPSAnaW52b2ljZSc7XG5cbiAgYW5uZXh1cmVEYXRhOiBhbnlbXSB8IG51bGwgPSBudWxsO1xuICAvLyBHcmFuZCB0b3RhbCBvZiBhbGwgYW5uZXh1cmUgcm93cyAoY29tcHV0ZWQgYnkgdGhlIGJhY2tlbmQgd2l0aCB0aGUgc2FtZVxuICAvLyBwZXItY2FtZXJhIC8gcGVyLXpvbmUgcnVsZXMgdGhlIGludm9pY2UgdXNlcykuXG4gIGFubmV4dXJlVG90YWw6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBhbm5leHVyZUxvYWRpbmcgPSBmYWxzZTtcbiAgYW5uZXh1cmVFcnJvciA9IGZhbHNlO1xuXG4gIGRvd25sb2FkaW5nID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGFjdGl2ZU1vZGFsOiBOZ2JBY3RpdmVNb2RhbCxcbiAgICBwcml2YXRlIGJpbGxpbmdTZXJ2aWNlOiBCaWxsaW5nU2VydmljZSxcbiAgICBwcml2YXRlIHRvYXN0OiBUb2FzdFNlcnZpY2UsXG4gICkge31cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBzZWxlY3RUYWIodGFiOiAnaW52b2ljZScgfCAnYW5uZXh1cmUnKSB7XG4gICAgdGhpcy5hY3RpdmVUYWIgPSB0YWI7XG4gICAgaWYgKHRhYiA9PT0gJ2FubmV4dXJlJyAmJiB0aGlzLmFubmV4dXJlRGF0YSA9PT0gbnVsbCAmJiAhdGhpcy5hbm5leHVyZUxvYWRpbmcpIHtcbiAgICAgIHRoaXMubG9hZEFubmV4dXJlKCk7XG4gICAgfVxuICB9XG5cbiAgbG9hZEFubmV4dXJlKCkge1xuICAgIGlmICghdGhpcy5pbnZvaWNlRGF0YT8uX2lkKSByZXR1cm47XG4gICAgdGhpcy5hbm5leHVyZUxvYWRpbmcgPSB0cnVlO1xuICAgIHRoaXMuYW5uZXh1cmVFcnJvciA9IGZhbHNlO1xuICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UuZ2V0SW52b2ljZUFubmV4dXJlKHRoaXMuaW52b2ljZURhdGEuX2lkKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgIC8vIEJhY2tlbmQgZW52ZWxvcGUgaXMgeyBjb2RlLCBzdGF0dXMsIGRhdGE6IHsgZGF0YTogWy4uLl0gfSB9IOKAlFxuICAgICAgICAgIC8vIHRoZSBjb250cm9sbGVyIGNhbGxzIHNlbmRTdWNjZXNzKHsgZGF0YTogYW5uZXh1cmVEYXRhIH0pIGFuZCB0aGVcbiAgICAgICAgICAvLyByZXNwb25zZSBtaWRkbGV3YXJlIHdyYXBzIHRoYXQgdW5kZXIgaXRzIG93biBgZGF0YWAga2V5LiBSZWFkXG4gICAgICAgICAgLy8gdGhyb3VnaCBib3RoIGxheWVycyB0byBnZXQgdGhlIHJvdyBhcnJheS5cbiAgICAgICAgICB0aGlzLmFubmV4dXJlRGF0YSA9IHJlcz8uZGF0YT8uZGF0YSB8fCBbXTtcbiAgICAgICAgICB0aGlzLmFubmV4dXJlVG90YWwgPSByZXM/LmRhdGE/LnRvdGFsQW1vdW50ID8/IG51bGw7XG4gICAgICAgICAgdGhpcy5hbm5leHVyZUxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLmFubmV4dXJlRXJyb3IgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuYW5uZXh1cmVMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgLy8gRXhwb3J0IHRoZSBsb2FkZWQgYW5uZXh1cmUgcm93cyBhcyBhbiAueGxzeCBmaWxlLiBNaXJyb3JzIHRoZSBjb2x1bW5zXG4gIC8vIHNob3duIGluIHRoZSBBbm5leHVyZSB0YWIgc28gdGhlIHNwcmVhZHNoZWV0IG1hdGNoZXMgd2hhdCB0aGUgdXNlclxuICAvLyBzYXcgb24gc2NyZWVuLiBGaWxlbmFtZSBpcyBgJHtpbnZvaWNlTnVtYmVyfS1hbm5leHVyZS54bHN4YC5cbiAgZG93bmxvYWRBbm5leHVyZVhsc3goKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmFubmV4dXJlRGF0YSB8fCB0aGlzLmFubmV4dXJlRGF0YS5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3ltYm9sID0gdGhpcy5jdXJyZW5jeVN5bWJvbCgpO1xuICAgICAgY29uc3Qgcm93czogYW55W10gPSB0aGlzLmFubmV4dXJlRGF0YS5tYXAoKHJvdzogYW55KSA9PiAoe1xuICAgICAgICAnU3RvcmUgTmFtZSc6IHJvdz8uc3RvcmVOYW1lIHx8ICcnLFxuICAgICAgICAnUHJvZHVjdCc6IHRoaXMuZm9ybWF0UHJvZHVjdE5hbWUocm93Py5wcm9kdWN0TmFtZSksXG4gICAgICAgICdTdG9yZSBJRCc6IHJvdz8uc3RvcmVJZCB8fCAnJyxcbiAgICAgICAgJ0RlcGxveW1lbnQgRGF0ZSc6IHJvdz8uZWRnZWZpcnN0RmlsZURhdGUgfHwgJycsXG4gICAgICAgICdQZXJpb2QnOiByb3c/LnBlcmlvZCA9PT0gJ3Byb3JhdGUnID8gJ1Byby1yYXRlJyA6ICdGdWxsIG1vbnRoJyxcbiAgICAgICAgJ1ByaWNpbmcgTWV0aG9kJzogcm93Py51bml0QmFzaXMgfHwgJ1BlciBTdG9yZScsXG4gICAgICAgICdCaWxsaW5nIERheXMnOiByb3c/LndvcmtpbmdkYXlzID8/IDAsXG4gICAgICAgICdRdHknOiByb3c/LnVuaXRzID8/IDEsXG4gICAgICAgICdVbml0IFByaWNlJzogcm93Py5zdGFuZGFyZFByaWNlICE9IG51bGxcbiAgICAgICAgICA/IGAke3N5bWJvbH0gJHt0aGlzLmZvcm1hdElOUihyb3cuc3RhbmRhcmRQcmljZSl9ICgke3Jvdz8udW5pdEJhc2lzIHx8ICdQZXIgU3RvcmUnfSlgXG4gICAgICAgICAgOiAnJyxcbiAgICAgICAgJ1ByaWNlIFBlciBNb250aCc6IHJvdz8ucnVubmluZ0Nvc3QgIT0gbnVsbFxuICAgICAgICAgID8gYCR7c3ltYm9sfSAke3RoaXMuZm9ybWF0SU5SKHJvdy5ydW5uaW5nQ29zdCl9YFxuICAgICAgICAgIDogJycsXG4gICAgICB9KSk7XG4gICAgICBpZiAodGhpcy5hbm5leHVyZVRvdGFsICE9IG51bGwpIHtcbiAgICAgICAgcm93cy5wdXNoKHtcbiAgICAgICAgICAnU3RvcmUgTmFtZSc6ICcnLCAnUHJvZHVjdCc6ICcnLCAnU3RvcmUgSUQnOiAnJywgJ0RlcGxveW1lbnQgRGF0ZSc6ICcnLFxuICAgICAgICAgICdQZXJpb2QnOiAnJywgJ1ByaWNpbmcgTWV0aG9kJzogJycsXG4gICAgICAgICAgJ0JpbGxpbmcgRGF5cyc6ICcnLCAnUXR5JzogJycsICdVbml0IFByaWNlJzogJ1RvdGFsJyxcbiAgICAgICAgICAnUHJpY2UgUGVyIE1vbnRoJzogYCR7c3ltYm9sfSAke3RoaXMuZm9ybWF0SU5SKHRoaXMuYW5uZXh1cmVUb3RhbCl9YCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCB3b3Jrc2hlZXQgPSBYTFNYLnV0aWxzLmpzb25fdG9fc2hlZXQocm93cyk7XG4gICAgICBjb25zdCB3b3JrYm9vayA9IHsgU2hlZXRzOiB7IEFubmV4dXJlOiB3b3Jrc2hlZXQgfSwgU2hlZXROYW1lczogWydBbm5leHVyZSddIH07XG4gICAgICBjb25zdCBidWZmZXI6IEFycmF5QnVmZmVyID0gWExTWC53cml0ZSh3b3JrYm9vaywgeyBib29rVHlwZTogJ3hsc3gnLCB0eXBlOiAnYXJyYXknIH0pO1xuICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtidWZmZXJdLCB7XG4gICAgICAgIHR5cGU6ICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldDtjaGFyc2V0PVVURi04JyxcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgc2FmZUludm9pY2VObyA9ICh0aGlzLmludm9pY2VEYXRhPy5pbnZvaWNlIHx8ICdpbnZvaWNlJykucmVwbGFjZSgvW1xcXFwvOio/XCI8PnxcXHJcXG5dL2csICcnKTtcbiAgICAgIEZpbGVTYXZlci5zYXZlQXMoYmxvYiwgYCR7c2FmZUludm9pY2VOb30tYW5uZXh1cmUueGxzeGApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnRmFpbGVkIHRvIGV4cG9ydCBhbm5leHVyZScpO1xuICAgIH1cbiAgfVxuXG4gIHJldHJ5QW5uZXh1cmUoKSB7XG4gICAgdGhpcy5hbm5leHVyZURhdGEgPSBudWxsO1xuICAgIHRoaXMubG9hZEFubmV4dXJlKCk7XG4gIH1cblxuICBkb3dubG9hZFBkZigpIHtcbiAgICBpZiAoIXRoaXMuaW52b2ljZURhdGE/Ll9pZCB8fCB0aGlzLmRvd25sb2FkaW5nKSByZXR1cm47XG4gICAgdGhpcy5kb3dubG9hZGluZyA9IHRydWU7XG4gICAgY29uc3QgcmVxID0geyAuLi50aGlzLmludm9pY2VEYXRhIH07XG4gICAgcmVxLmNsaWVudElkID0gW3RoaXMuaW52b2ljZURhdGEuY2xpZW50SWRdO1xuICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UuaW52b2ljZURvd25sb2FkKHJlcSlcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW3Jlc10sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL3BkZicgfSk7XG4gICAgICAgICAgY29uc3QgdXJsID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgICAgICAgY29uc3QgbW9udGggPSB0aGlzLmludm9pY2VEYXRhPy5iaWxsaW5nRGF0ZVxuICAgICAgICAgICAgPyBuZXcgRGF0ZSh0aGlzLmludm9pY2VEYXRhLmJpbGxpbmdEYXRlKS50b0xvY2FsZVN0cmluZygnZW4tVVMnLCB7IG1vbnRoOiAnbG9uZycgfSlcbiAgICAgICAgICAgIDogJyc7XG4gICAgICAgICAgY29uc3QgYnJhbmROYW1lID0gdGhpcy5pbnZvaWNlRGF0YT8ucmVnaXN0ZXJlZENvbXBhbnlOYW1lIHx8IHRoaXMuaW52b2ljZURhdGE/LmNvbXBhbnlOYW1lIHx8ICcnO1xuICAgICAgICAgIGNvbnN0IGZpbGVuYW1lID0gYCR7dGhpcy5pbnZvaWNlRGF0YT8uaW52b2ljZSB8fCAnaW52b2ljZSd9LSR7bW9udGh9LSR7YnJhbmROYW1lfS5wZGZgXG4gICAgICAgICAgICAucmVwbGFjZSgvW1xcXFwvOio/XCI8PnxcXHJcXG5dL2csICcnKS50cmltKCk7XG4gICAgICAgICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgICBsaW5rLmhyZWYgPSB1cmw7XG4gICAgICAgICAgbGluay5kb3dubG9hZCA9IGZpbGVuYW1lO1xuICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobGluayk7XG4gICAgICAgICAgbGluay5jbGljaygpO1xuICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQobGluayk7XG4gICAgICAgICAgd2luZG93LlVSTC5yZXZva2VPYmplY3RVUkwodXJsKTtcbiAgICAgICAgICB0aGlzLmRvd25sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5kb3dubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnRmFpbGVkIHRvIGRvd25sb2FkIGludm9pY2UnKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICAvLyBNaXJyb3JzIHRoZSBiYWNrZW5kIENVUlJFTkNZX1NZTUJPTFMgbWFwICh1dGlscy9jdXJyZW5jeS5qcykgc28gdGhlXG4gIC8vIHByZXZpZXcgc2hvd3MgdGhlIHNhbWUgc3ltYm9sIHRoZSBQREYgd2lsbCByZW5kZXIuIEZhbGxiYWNrIGlzICckJyBmb3JcbiAgLy8gdW5rbm93biBjb2RlcyB0byBtYXRjaCB0aGUgYmFja2VuZC5cbiAgcHJpdmF0ZSByZWFkb25seSBjdXJyZW5jeVN5bWJvbHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgaW5yOiAn4oK5JyxcbiAgICBkb2xsYXI6ICckJyxcbiAgICBzaW5nYXBvcmVkb2xsYXI6ICdTJCcsXG4gICAgZXVybzogJ+KCrCcsXG4gICAgYWVkOiAnQUVEJyxcbiAgfTtcblxuICAvLyBXb3JkcyBmb3JtIG9mIGVhY2ggY3VycmVuY3kgZm9yIHRoZSBcIkFtb3VudCBpbiB3b3Jkc1wiIGxpbmUuXG4gIHByaXZhdGUgcmVhZG9ubHkgY3VycmVuY3lXb3JkczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICBpbnI6ICdJbmRpYW4gUnVwZWUnLFxuICAgIGRvbGxhcjogJ1VTIERvbGxhcicsXG4gICAgc2luZ2Fwb3JlZG9sbGFyOiAnU2luZ2Fwb3JlIERvbGxhcicsXG4gICAgZXVybzogJ0V1cm8nLFxuICB9O1xuXG4gIC8vIExvY2FsZSB1c2VkIGZvciBncm91cGluZyBudW1iZXJzLiBlbi1JTiBpcyBsYWtocy9jcm9yZXM7IGV2ZXJ5dGhpbmcgZWxzZVxuICAvLyBnZXRzIHdlc3Rlcm4gdGhvdXNhbmRzIGdyb3VwaW5nLlxuICBwcml2YXRlIHJlYWRvbmx5IGN1cnJlbmN5TG9jYWxlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICBpbnI6ICdlbi1JTicsXG4gICAgZG9sbGFyOiAnZW4tVVMnLFxuICAgIHNpbmdhcG9yZWRvbGxhcjogJ2VuLVNHJyxcbiAgICBldXJvOiAnZW4tSUUnLFxuICB9O1xuXG4gIGN1cnJlbmN5U3ltYm9sKCk6IHN0cmluZyB7XG4gICAgY29uc3QgY29kZSA9IHRoaXMuaW52b2ljZURhdGE/LmN1cnJlbmN5O1xuICAgIHJldHVybiB0aGlzLmN1cnJlbmN5U3ltYm9sc1tjb2RlIHx8ICcnXSB8fCAnJCc7XG4gIH1cblxuICBnZXQgdG90YWxJbldvcmRzKCk6IHN0cmluZyB7XG4gICAgY29uc3QgY29kZSA9IHRoaXMuaW52b2ljZURhdGE/LmN1cnJlbmN5O1xuICAgIGNvbnN0IHdvcmRzID0gdGhpcy5jdXJyZW5jeVdvcmRzW2NvZGUgfHwgJyddIHx8ICdVUyBEb2xsYXInO1xuICAgIGNvbnN0IHRvdGFsID0gTWF0aC5yb3VuZChOdW1iZXIodGhpcy5pbnZvaWNlRGF0YT8udG90YWxBbW91bnQgfHwgMCkpO1xuICAgIHJldHVybiBgJHt3b3Jkc30gJHthbW91bnRJbldvcmRzKHRvdGFsKX0gT25seWA7XG4gIH1cblxuICBmb3JtYXRJTlIodmFsdWU6IGFueSk6IHN0cmluZyB7XG4gICAgY29uc3QgbiA9IE51bWJlcih2YWx1ZSk7XG4gICAgaWYgKCFpc0Zpbml0ZShuKSkgcmV0dXJuICcwLjAwJztcbiAgICBjb25zdCBjb2RlID0gdGhpcy5pbnZvaWNlRGF0YT8uY3VycmVuY3k7XG4gICAgY29uc3QgbG9jYWxlID0gdGhpcy5jdXJyZW5jeUxvY2FsZXNbY29kZSB8fCAnJ10gfHwgJ2VuLVVTJztcbiAgICByZXR1cm4gbi50b0xvY2FsZVN0cmluZyhsb2NhbGUsIHsgbWluaW11bUZyYWN0aW9uRGlnaXRzOiAyLCBtYXhpbXVtRnJhY3Rpb25EaWdpdHM6IDIgfSk7XG4gIH1cblxuICAvLyBNaXJyb3JzIHRoZSBiYWNrZW5kIHRyYW5zZm9ybTogYHRhbmdvVHJhZmZpY2AgLT4gYFRhbmdvIFRyYWZmaWNgLlxuICBmb3JtYXRQcm9kdWN0TmFtZShuYW1lOiBhbnkpOiBzdHJpbmcge1xuICAgIGlmICghbmFtZSkgcmV0dXJuICcnO1xuICAgIGNvbnN0IHBhcnRzID0gU3RyaW5nKG5hbWUpLnJlcGxhY2UoLyhbYS16XSkoW0EtWl0pL2csICckMSAkMicpLnNwbGl0KCcgJyk7XG4gICAgcmV0dXJuIHBhcnRzLm1hcCgodykgPT4gdy5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHcuc2xpY2UoMSkpLmpvaW4oJyAnKTtcbiAgfVxuXG4gIHRyYWNrQnlJbmRleChpbmRleDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG59IiwiPGRpdiBjbGFzcz1cImludm9pY2UtcHJldmlldy1tb2RhbFwiPlxuICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XG4gICAgPHVsIGNsYXNzPVwibmF2IG5hdi10YWJzIHByZXZpZXctdGFic1wiIHJvbGU9XCJ0YWJsaXN0XCI+XG4gICAgICA8bGkgY2xhc3M9XCJuYXYtaXRlbVwiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwibmF2LWxpbmtcIiBbY2xhc3MuYWN0aXZlXT1cImFjdGl2ZVRhYiA9PT0gJ2ludm9pY2UnXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0VGFiKCdpbnZvaWNlJylcIiB0eXBlPVwiYnV0dG9uXCI+SW52b2ljZTwvYnV0dG9uPlxuICAgICAgPC9saT5cbiAgICAgIDxsaSBjbGFzcz1cIm5hdi1pdGVtXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJuYXYtbGlua1wiIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlVGFiID09PSAnYW5uZXh1cmUnXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0VGFiKCdhbm5leHVyZScpXCIgdHlwZT1cImJ1dHRvblwiPkFubmV4dXJlPC9idXR0b24+XG4gICAgICA8L2xpPlxuICAgIDwvdWw+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xvc2VcIiAoY2xpY2spPVwiYWN0aXZlTW9kYWwuZGlzbWlzcygpXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCI+PC9idXR0b24+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5IHAtMFwiPlxuICAgIDwhLS0gSU5WT0lDRSBUQUIgLS0+XG4gICAgPGRpdiAqbmdJZj1cImFjdGl2ZVRhYiA9PT0gJ2ludm9pY2UnXCIgY2xhc3M9XCJpbnZvaWNlLXBhZ2VcIj5cbiAgICAgIDwhLS0gSGVhZGVyIHJvdyAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJyb3cgYWxpZ24taXRlbXMtc3RhcnRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC03XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImJyYW5kXCI+XG4gICAgICAgICAgICA8aW1nIHNyYz1cIi4vYXNzZXRzL3RhbmdvL0ltYWdlcy90YW5nb2V5ZS1sb2dvLnN2Z1wiIGFsdD1cIlRhbmdvRXllXCIgY2xhc3M9XCJicmFuZC1sb2dvXCIgb25lcnJvcj1cInRoaXMuc3R5bGUuZGlzcGxheT0nbm9uZSdcIj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcGFueS1ibG9jayBtdC0zXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcGFueS1uYW1lXCI+VEFOR08gSVQgU09MVVRJT05TIElORElBIFBSSVZBVEUgTFREPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PjJuZCBGbG9vciwgQXBlZWpheSBCdXNpbmVzcyBDZW50cmUsIE5vLjEyLzM5LDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5IYWRkb3dzIFJvYWQsIE51bmdhbWJha2thbTwvZGl2PlxuICAgICAgICAgICAgPGRpdj5DaGVubmFpIFRhbWlsIE5hZHUgNjAwMDA2LCBJbmRpYTwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTFcIj48c3Ryb25nPkdTVElOIDMzQUFHQ1QzMTI0UjFaMjwvc3Ryb25nPjwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTFcIj5NU01FIC8gVWR5YW0gdHlwZSA6IE1pY3JvPC9kaXY+XG4gICAgICAgICAgICA8ZGl2Pk1TTUUgLyBVZHlhbSBOby4gOiBVRFlBTS1UTi0wMy0wMjEyMzk5PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTUgdGV4dC1lbmRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGF4LWludm9pY2UtbGFiZWxcIj5UQVggSU5WT0lDRTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZvaWNlLW51bWJlclwiPiMge3sgaW52b2ljZURhdGE/Lmludm9pY2UgfX08L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBCaWxsLXRvICsgdG90YWxzIHJvdyAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbXQtNFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTdcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmlsbC10by1sYWJlbFwiPkJJTEwgVE8gOjwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjbGllbnQtbmFtZSBtdC0xXCI+e3sgKGludm9pY2VEYXRhPy5jbGllbnROYW1lIHx8IGludm9pY2VEYXRhPy5jb21wYW55TmFtZSkgfCB1cHBlcmNhc2UgfX08L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMVwiICpuZ0lmPVwiaW52b2ljZURhdGE/LmJpbGxpbmdBZGRyZXNzTGluZU9uZSB8fCBpbnZvaWNlRGF0YT8uY29tcGFueUFkZHJlc3NcIj5cbiAgICAgICAgICAgIHt7IGludm9pY2VEYXRhPy5iaWxsaW5nQWRkcmVzc0xpbmVPbmUgfHwgaW52b2ljZURhdGE/LmNvbXBhbnlBZGRyZXNzIH19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImludm9pY2VEYXRhPy5iaWxsaW5nQWRkcmVzc0xpbmVUd29cIj57eyBpbnZvaWNlRGF0YT8uYmlsbGluZ0FkZHJlc3NMaW5lVHdvIH19PC9kaXY+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImludm9pY2VEYXRhPy5iaWxsaW5nQ2l0eSB8fCBpbnZvaWNlRGF0YT8uYmlsbGluZ1BpbkNvZGUgfHwgaW52b2ljZURhdGE/LmJpbGxpbmdTdGF0ZVwiPlxuICAgICAgICAgICAge3sgaW52b2ljZURhdGE/LmJpbGxpbmdDaXR5IH19PHNwYW4gKm5nSWY9XCJpbnZvaWNlRGF0YT8uYmlsbGluZ1BpbkNvZGVcIj4sIHt7IGludm9pY2VEYXRhPy5iaWxsaW5nUGluQ29kZSB9fTwvc3Bhbj48c3BhbiAqbmdJZj1cImludm9pY2VEYXRhPy5iaWxsaW5nU3RhdGVcIj4sIHt7IGludm9pY2VEYXRhPy5iaWxsaW5nU3RhdGUgfX08L3NwYW4+PHNwYW4gKm5nSWY9XCJpbnZvaWNlRGF0YT8uYmlsbGluZ0NvdW50cnlcIj4sIHt7IGludm9pY2VEYXRhPy5iaWxsaW5nQ291bnRyeSB9fTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMlwiICpuZ0lmPVwiaW52b2ljZURhdGE/LkdTVE51bWJlclwiPjxzdHJvbmc+R1NUSU4ge3sgaW52b2ljZURhdGE/LkdTVE51bWJlciB9fTwvc3Ryb25nPjwvZGl2PlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJpbnZvaWNlRGF0YT8uUGxhY2VPZlN1cHBseVwiPlBsYWNlIE9mIFN1cHBseToge3sgaW52b2ljZURhdGE/LlBsYWNlT2ZTdXBwbHkgfX08L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNSB0ZXh0LWVuZFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZvaWNlLXRvdGFsLWxhYmVsXCI+SW52b2ljZSBUb3RhbCA8c3BhbiBjbGFzcz1cImludm9pY2UtdG90YWwtYW1vdW50XCI+e3sgY3VycmVuY3lTeW1ib2woKSB9fSB7eyBmb3JtYXRJTlIoaW52b2ljZURhdGE/LnRvdGFsQW1vdW50KSB9fTwvc3Bhbj48L2Rpdj5cbiAgICAgICAgICA8dGFibGUgY2xhc3M9XCJtZXRhLXRhYmxlIG1zLWF1dG8gbXQtM1wiPlxuICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz1cIm1ldGEtbGFiZWxcIj5JbnZvaWNlIGRhdGUgOjwvdGQ+PHRkIGNsYXNzPVwibWV0YS12YWx1ZVwiPnt7IGludm9pY2VEYXRhPy5iaWxsaW5nRGF0ZSB8IGRhdGU6J2RkL01NL3l5eXknIH19PC90ZD48L3RyPlxuICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz1cIm1ldGEtbGFiZWxcIj5UZXJtcyA6PC90ZD48dGQgY2xhc3M9XCJtZXRhLXZhbHVlXCI+VGVybSB7eyBpbnZvaWNlRGF0YT8ucGF5bWVudFRlcm0gfHwgJzMwJyB9fTwvdGQ+PC90cj5cbiAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9XCJtZXRhLWxhYmVsXCI+RHVlIERhdGUgOjwvdGQ+PHRkIGNsYXNzPVwibWV0YS12YWx1ZVwiPnt7IGludm9pY2VEYXRhPy5kdWVEYXRlIHwgZGF0ZTonZGQvTU0veXl5eScgfX08L3RkPjwvdHI+XG4gICAgICAgICAgICA8dHIgKm5nSWY9XCJpbnZvaWNlRGF0YT8uUG9OdW0gfHwgaW52b2ljZURhdGE/LnBvTnVtYmVyXCI+PHRkIGNsYXNzPVwibWV0YS1sYWJlbFwiPlAuTy4jIDo8L3RkPjx0ZCBjbGFzcz1cIm1ldGEtdmFsdWVcIj57eyBpbnZvaWNlRGF0YT8uUG9OdW0gfHwgaW52b2ljZURhdGE/LnBvTnVtYmVyIH19PC90ZD48L3RyPlxuICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gTGluZSBpdGVtcyAtLT5cbiAgICAgIDx0YWJsZSBjbGFzcz1cIml0ZW1zLXRhYmxlIG10LTRcIj5cbiAgICAgICAgPHRoZWFkPlxuICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgIDx0aCBjbGFzcz1cImNvbC1pbmRleFwiPiM8L3RoPlxuICAgICAgICAgICAgPHRoIGNsYXNzPVwiY29sLXByb2R1Y3RcIj5Qcm9kdWN0ICZhbXA7IERlc2NyaXB0aW9uPC90aD5cbiAgICAgICAgICAgIDx0aCBjbGFzcz1cImNvbC1tb250aFwiPk1vbnRoPC90aD5cbiAgICAgICAgICAgIDx0aCBjbGFzcz1cImNvbC1oc25cIj5IU04vU0FDPC90aD5cbiAgICAgICAgICAgIDx0aCBjbGFzcz1cImNvbC1jb3VudCB0ZXh0LWNlbnRlclwiPlF1YW50aXR5PC90aD5cbiAgICAgICAgICAgIDx0aCBjbGFzcz1cImNvbC1yYXRlIHRleHQtZW5kXCI+UmF0ZTwvdGg+XG4gICAgICAgICAgICA8dGggY2xhc3M9XCJjb2wtYW1vdW50IHRleHQtZW5kXCI+QW1vdW50PC90aD5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICA8L3RoZWFkPlxuICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGludm9pY2VEYXRhPy5wcm9kdWN0czsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeUluZGV4XCI+XG4gICAgICAgICAgICA8dGQ+e3sgaSArIDEgfX08L3RkPlxuICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZHVjdC1uYW1lXCI+e3sgZm9ybWF0UHJvZHVjdE5hbWUoaXRlbT8ucHJvZHVjdE5hbWUpIH19PC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9kdWN0LWRlc2NcIj57eyBpdGVtPy5kZXNjcmlwdGlvbiB9fTwvZGl2PlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cIm5vd3JhcFwiPnt7IGludm9pY2VEYXRhPy5iaWxsaW5nRGF0ZSB8IGRhdGU6J01NTSB5eXl5JyB9fTwvdGQ+XG4gICAgICAgICAgICA8dGQ+e3sgaXRlbT8uaHNuIHx8IGl0ZW0/LmhzbkNvZGUgfHwgJzk5ODMxNCcgfX08L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwidGV4dC1jZW50ZXJcIj48c3Ryb25nPnt7IGl0ZW0/LnN0b3JlQ291bnQgfHwgaW52b2ljZURhdGE/LnN0b3Jlcz8ubGVuZ3RoIHx8ICcnIH19PC9zdHJvbmc+PC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cInRleHQtZW5kIG5vd3JhcFwiPnt7IGN1cnJlbmN5U3ltYm9sKCkgfX0ge3sgZm9ybWF0SU5SKGl0ZW0/LnByaWNlKSB9fTwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJ0ZXh0LWVuZCBub3dyYXBcIj57eyBjdXJyZW5jeVN5bWJvbCgpIH19IHt7IGZvcm1hdElOUihpdGVtPy5hbW91bnQpIH19PC90ZD5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICA8L3Rib2R5PlxuICAgICAgPC90YWJsZT5cblxuICAgICAgPCEtLSBUb3RhbHMgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwicm93IG10LTNcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC03XCI+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNVwiPlxuICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRvdGFscy10YWJsZSBtcy1hdXRvXCI+XG4gICAgICAgICAgICA8dHI+PHRkIGNsYXNzPVwidG90YWxzLWxhYmVsXCI+U3ViIFRvdGFsPC90ZD48dGQgY2xhc3M9XCJ0b3RhbHMtdmFsdWVcIj57eyBjdXJyZW5jeVN5bWJvbCgpIH19IHt7IGZvcm1hdElOUihpbnZvaWNlRGF0YT8uYW1vdW50KSB9fTwvdGQ+PC90cj5cbiAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgdCBvZiBpbnZvaWNlRGF0YT8udGF4XCI+XG4gICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInRvdGFscy1sYWJlbFwiPnt7IHQ/LnR5cGUgfHwgdD8udGF4TmFtZSB8fCB0Py5uYW1lIH19ICh7eyB0Py52YWx1ZSA/PyB0Py50YXhQZXJjZW50YWdlID8/IHQ/LnBlcmNlbnRhZ2UgfX0lKTwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInRvdGFscy12YWx1ZSBub3dyYXBcIj57eyBjdXJyZW5jeVN5bWJvbCgpIH19IHt7IGZvcm1hdElOUih0Py50YXhBbW91bnQpIH19PC90ZD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICA8dHIgY2xhc3M9XCJ0b3RhbHMtdG90YWwtcm93XCI+XG4gICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInRvdGFscy1sYWJlbFwiPlRvdGFsIEFtb3VudDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInRvdGFscy12YWx1ZVwiPnt7IGN1cnJlbmN5U3ltYm9sKCkgfX0ge3sgZm9ybWF0SU5SKGludm9pY2VEYXRhPy50b3RhbEFtb3VudCkgfX08L3RkPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIDx0ciBjbGFzcz1cInRvdGFscy13b3Jkcy1yb3dcIj5cbiAgICAgICAgICAgICAgPHRkIGNsYXNzPVwidG90YWxzLWxhYmVsXCI+VG90YWwgSW4gV29yZHM8L3RkPlxuICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ0b3RhbHMtdmFsdWUgd29yZHNcIj57eyB0b3RhbEluV29yZHMgfX08L3RkPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFBheW1lbnQgZGV0YWlscyAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0aGFua3MgbXQtNFwiPlRoYW5rcyBmb3IgeW91ciBidXNpbmVzcyE8L2Rpdj5cbiAgICAgIDx0YWJsZSBjbGFzcz1cInBheW1lbnQtdGFibGUgbXQtMlwiPlxuICAgICAgICA8dHI+PHRkIGNsYXNzPVwicGF5bWVudC1sYWJlbFwiPkJlbmVmaWNpYXJ5IE5hbWU8L3RkPjx0ZCBjbGFzcz1cInBheW1lbnQtdmFsdWVcIj48c3Ryb25nPlRhbmdvIElUIFNvbHV0aW9ucyBJbmRpYSBQcml2YXRlIExpbWl0ZWQ8L3N0cm9uZz48L3RkPjwvdHI+XG4gICAgICAgIDx0cj48dGQgY2xhc3M9XCJwYXltZW50LWxhYmVsXCI+QWNjb3VudCBOdW1iZXI8L3RkPjx0ZCBjbGFzcz1cInBheW1lbnQtdmFsdWVcIj48c3Ryb25nPjUwMjAwMDI3NDQxNDMzPC9zdHJvbmc+PC90ZD48L3RyPlxuICAgICAgICA8dHI+PHRkIGNsYXNzPVwicGF5bWVudC1sYWJlbFwiPklGU0MgQ29kZTwvdGQ+PHRkIGNsYXNzPVwicGF5bWVudC12YWx1ZVwiPjxzdHJvbmc+SERGQzAwMDAyNjk8L3N0cm9uZz48L3RkPjwvdHI+XG4gICAgICAgIDx0cj48dGQgY2xhc3M9XCJwYXltZW50LWxhYmVsXCI+UGF5bWVudCBUeXBlPC90ZD48dGQgY2xhc3M9XCJwYXltZW50LXZhbHVlXCI+PHN0cm9uZz5PbmxpbmU8L3N0cm9uZz48L3RkPjwvdHI+XG4gICAgICAgIDx0cj48dGQgY2xhc3M9XCJwYXltZW50LWxhYmVsXCI+U1dJRlQgQ29kZTwvdGQ+PHRkIGNsYXNzPVwicGF5bWVudC12YWx1ZVwiPjxzdHJvbmc+SERGQ0lOQkJDSEU8L3N0cm9uZz48L3RkPjwvdHI+XG4gICAgICAgIDx0cj48dGQgY2xhc3M9XCJwYXltZW50LWxhYmVsXCI+QnJhbmNoPC90ZD48dGQgY2xhc3M9XCJwYXltZW50LXZhbHVlXCI+PHN0cm9uZz5SUyBQdXJhbSwgQ29pbWJhdG9yZTwvc3Ryb25nPjwvdGQ+PC90cj5cbiAgICAgIDwvdGFibGU+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJzeXN0ZW0tbm90ZSBtdC00XCI+VGhpcyBpcyBhIHN5c3RlbSBnZW5lcmF0ZWQgaW52b2ljZS4gTm8gc2lnbmF0dXJlIHJlcXVpcmVkPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEFOTkVYVVJFIFRBQiAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiYWN0aXZlVGFiID09PSAnYW5uZXh1cmUnXCIgY2xhc3M9XCJhbm5leHVyZS1wYWdlXCI+XG4gICAgICA8ZGl2ICpuZ0lmPVwiYW5uZXh1cmVMb2FkaW5nXCIgY2xhc3M9XCJsb2FkaW5nLXN0YXRlXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzcGlubmVyLWJvcmRlciB0ZXh0LXByaW1hcnlcIiByb2xlPVwic3RhdHVzXCI+PHNwYW4gY2xhc3M9XCJ2aXN1YWxseS1oaWRkZW5cIj5Mb2FkaW5nLi4uPC9zcGFuPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0lmPVwiIWFubmV4dXJlTG9hZGluZyAmJiBhbm5leHVyZUVycm9yXCIgY2xhc3M9XCJlcnJvci1zdGF0ZVwiPlxuICAgICAgICA8cD5GYWlsZWQgdG8gbG9hZCBhbm5leHVyZS48L3A+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLXByaW1hcnlcIiAoY2xpY2spPVwicmV0cnlBbm5leHVyZSgpXCI+UmV0cnk8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cIiFhbm5leHVyZUxvYWRpbmcgJiYgIWFubmV4dXJlRXJyb3IgJiYgYW5uZXh1cmVEYXRhICE9PSBudWxsICYmIGFubmV4dXJlRGF0YS5sZW5ndGggPT09IDBcIiBjbGFzcz1cImVtcHR5LXN0YXRlXCI+XG4gICAgICAgIE5vIGFubmV4dXJlIGRhdGEgZm9yIHRoaXMgaW52b2ljZS5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cIiFhbm5leHVyZUxvYWRpbmcgJiYgIWFubmV4dXJlRXJyb3IgJiYgYW5uZXh1cmVEYXRhICYmIGFubmV4dXJlRGF0YS5sZW5ndGggPiAwXCJcbiAgICAgICAgICAgY2xhc3M9XCJhbm5leHVyZS10b29sYmFyXCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tb3V0bGluZS1wcmltYXJ5XCIgKGNsaWNrKT1cImRvd25sb2FkQW5uZXh1cmVYbHN4KClcIj5cbiAgICAgICAgICBFeHBvcnQgYXMgWExTWFxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPHRhYmxlICpuZ0lmPVwiIWFubmV4dXJlTG9hZGluZyAmJiAhYW5uZXh1cmVFcnJvciAmJiBhbm5leHVyZURhdGEgJiYgYW5uZXh1cmVEYXRhLmxlbmd0aCA+IDBcIiBjbGFzcz1cImFubmV4dXJlLXRhYmxlXCI+XG4gICAgICAgIDx0aGVhZD5cbiAgICAgICAgICA8dHI+XG4gICAgICAgICAgICA8dGg+U3RvcmUgTmFtZTwvdGg+XG4gICAgICAgICAgICA8dGg+UHJvZHVjdHM8L3RoPlxuICAgICAgICAgICAgPHRoPlN0b3JlIElEPC90aD5cbiAgICAgICAgICAgIDx0aD5EZXBsb3ltZW50IERhdGU8L3RoPlxuICAgICAgICAgICAgPHRoPlBlcmlvZDwvdGg+XG4gICAgICAgICAgICA8dGg+UHJpY2luZyBNZXRob2Q8L3RoPlxuICAgICAgICAgICAgPHRoIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5CaWxsaW5nIERheXM8L3RoPlxuICAgICAgICAgICAgPHRoIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5RdHk8L3RoPlxuICAgICAgICAgICAgPHRoIGNsYXNzPVwidGV4dC1lbmRcIj5Vbml0IFByaWNlPC90aD5cbiAgICAgICAgICAgIDx0aCBjbGFzcz1cInRleHQtZW5kXCI+UHJpY2UgUGVyIE1vbnRoPC90aD5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICA8L3RoZWFkPlxuICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCByb3cgb2YgYW5uZXh1cmVEYXRhOyB0cmFja0J5OiB0cmFja0J5SW5kZXhcIj5cbiAgICAgICAgICAgIDx0ZD57eyByb3c/LnN0b3JlTmFtZSB9fTwvdGQ+XG4gICAgICAgICAgICA8dGQ+e3sgcm93Py5wcm9kdWN0TmFtZSB9fTwvdGQ+XG4gICAgICAgICAgICA8dGQ+e3sgcm93Py5zdG9yZUlkIH19PC90ZD5cbiAgICAgICAgICAgIDx0ZD57eyByb3c/LmVkZ2VmaXJzdEZpbGVEYXRlIH19PC90ZD5cbiAgICAgICAgICAgIDx0ZD57eyByb3c/LnBlcmlvZCA9PT0gJ3Byb3JhdGUnID8gJ1Byby1yYXRlJyA6ICdGdWxsIG1vbnRoJyB9fTwvdGQ+XG4gICAgICAgICAgICA8dGQ+e3sgcm93Py51bml0QmFzaXMgfHwgJ1BlciBTdG9yZScgfX08L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwidGV4dC1jZW50ZXJcIj48c3Ryb25nPnt7IHJvdz8ud29ya2luZ2RheXMgfX08L3N0cm9uZz48L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwidGV4dC1jZW50ZXJcIj57eyByb3c/LnVuaXRzID8/IDEgfX08L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwidGV4dC1lbmRcIj5cbiAgICAgICAgICAgICAge3sgcm93Py5jdXJyZW5jeVR5cGUgfX0ge3sgZm9ybWF0SU5SKHJvdz8uc3RhbmRhcmRQcmljZSkgfX1cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVuaXQtYmFzaXNcIj57eyByb3c/LnVuaXRCYXNpcyB8fCAnUGVyIFN0b3JlJyB9fTwvZGl2PlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cInRleHQtZW5kXCI+PHN0cm9uZz57eyByb3c/LmN1cnJlbmN5VHlwZSB9fSB7eyBmb3JtYXRJTlIocm93Py5ydW5uaW5nQ29zdCkgfX08L3N0cm9uZz48L3RkPlxuICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvdGJvZHk+XG4gICAgICAgIDx0Zm9vdCAqbmdJZj1cImFubmV4dXJlVG90YWwgIT0gbnVsbFwiPlxuICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiOVwiIGNsYXNzPVwidGV4dC1lbmRcIj48c3Ryb25nPlRvdGFsPC9zdHJvbmc+PC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cInRleHQtZW5kXCI+PHN0cm9uZz57eyBhbm5leHVyZURhdGFbMF0/LmN1cnJlbmN5VHlwZSB9fSB7eyBmb3JtYXRJTlIoYW5uZXh1cmVUb3RhbCkgfX08L3N0cm9uZz48L3RkPlxuICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvdGZvb3Q+XG4gICAgICA8L3RhYmxlPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tbGlua1wiIChjbGljayk9XCJhY3RpdmVNb2RhbC5kaXNtaXNzKClcIj5DbG9zZTwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeVwiIChjbGljayk9XCJkb3dubG9hZFBkZigpXCIgW2Rpc2FibGVkXT1cImRvd25sb2FkaW5nXCI+XG4gICAgICA8c3BhbiAqbmdJZj1cIiFkb3dubG9hZGluZ1wiPkRvd25sb2FkIFBERjwvc3Bhbj5cbiAgICAgIDxzcGFuICpuZ0lmPVwiZG93bmxvYWRpbmdcIj5Eb3dubG9hZGluZy4uLjwvc3Bhbj5cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG48L2Rpdj4iXX0=
|
|
220
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW52b2ljZS1wcmV2aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS1iaWxsaW5nL3NyYy9saWIvY29tcG9uZW50cy9pbnZvaWNlLXByZXZpZXcvaW52b2ljZS1wcmV2aWV3LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS1iaWxsaW5nL3NyYy9saWIvY29tcG9uZW50cy9pbnZvaWNlLXByZXZpZXcvaW52b2ljZS1wcmV2aWV3LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUVwRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxQyxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEtBQUssU0FBUyxNQUFNLFlBQVksQ0FBQztBQUd4QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7Ozs7OztBQU92RCxNQUFNLE9BQU8sdUJBQXVCO0lBNEJ6QjtJQUNDO0lBQ0E7SUE3Qk8sUUFBUSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFFdkMsV0FBVyxDQUFNO0lBRTFCLFNBQVMsR0FBMkIsU0FBUyxDQUFDO0lBRTlDLFlBQVksR0FBaUIsSUFBSSxDQUFDO0lBQ2xDLDBFQUEwRTtJQUMxRSxpREFBaUQ7SUFDakQsYUFBYSxHQUFrQixJQUFJLENBQUM7SUFDcEMsZUFBZSxHQUFHLEtBQUssQ0FBQztJQUN4QixhQUFhLEdBQUcsS0FBSyxDQUFDO0lBRXRCLFdBQVcsR0FBRyxLQUFLLENBQUM7SUFFcEIsMkVBQTJFO0lBQzNFLDZFQUE2RTtJQUM3RSxXQUFXLEdBQVE7UUFDakIsZUFBZSxFQUFFLDBDQUEwQztRQUMz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QyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBRUQsWUFBWSxDQUFDLEtBQWE7UUFDeEIsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO3dHQW5OVSx1QkFBdUI7NEZBQXZCLHVCQUF1QixtR0NkcEMsdWdXQXlNTTs7NEZEM0xPLHVCQUF1QjtrQkFMbkMsU0FBUzsrQkFDRSxxQkFBcUI7MklBT3RCLFdBQVc7c0JBQW5CLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmdiQWN0aXZlTW9kYWwgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XG5pbXBvcnQgeyBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCAqIGFzIFhMU1ggZnJvbSAneGxzeCc7XG5pbXBvcnQgKiBhcyBGaWxlU2F2ZXIgZnJvbSAnZmlsZS1zYXZlcic7XG5pbXBvcnQgeyBCaWxsaW5nU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2JpbGxpbmcuc2VydmljZSc7XG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktc2hhcmVkJztcbmltcG9ydCB7IGFtb3VudEluV29yZHMgfSBmcm9tICcuL2Ftb3VudC1pbi13b3Jkcy51dGlsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLWludm9pY2UtcHJldmlldycsXG4gIHRlbXBsYXRlVXJsOiAnLi9pbnZvaWNlLXByZXZpZXcuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vaW52b2ljZS1wcmV2aWV3LmNvbXBvbmVudC5zY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBJbnZvaWNlUHJldmlld0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgQElucHV0KCkgaW52b2ljZURhdGE6IGFueTtcblxuICBhY3RpdmVUYWI6ICdpbnZvaWNlJyB8ICdhbm5leHVyZScgPSAnaW52b2ljZSc7XG5cbiAgYW5uZXh1cmVEYXRhOiBhbnlbXSB8IG51bGwgPSBudWxsO1xuICAvLyBHcmFuZCB0b3RhbCBvZiBhbGwgYW5uZXh1cmUgcm93cyAoY29tcHV0ZWQgYnkgdGhlIGJhY2tlbmQgd2l0aCB0aGUgc2FtZVxuICAvLyBwZXItY2FtZXJhIC8gcGVyLXpvbmUgcnVsZXMgdGhlIGludm9pY2UgdXNlcykuXG4gIGFubmV4dXJlVG90YWw6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBhbm5leHVyZUxvYWRpbmcgPSBmYWxzZTtcbiAgYW5uZXh1cmVFcnJvciA9IGZhbHNlO1xuXG4gIGRvd25sb2FkaW5nID0gZmFsc2U7XG5cbiAgLy8gRml4ZWQgYmVuZWZpY2lhcnkgYWNjb3VudCDigJQgaGFyZGNvZGVkIHRvIG1hdGNoIHRoZSBQREYgZXhhY3RseSAoTk9UIGZyb21cbiAgLy8gdGhlIERCKSwgc28gdGhlIHByZXZpZXcgYW5kIHRoZSBkb3dubG9hZGVkIFBERiBhbHdheXMgc2hvdyB0aGUgc2FtZSB0aGluZy5cbiAgYmFua0RldGFpbHM6IGFueSA9IHtcbiAgICBiZW5lZmljaWFyeU5hbWU6ICdUYW5nbyBJVCBTb2x1dGlvbnMgSW5kaWEgUHJpdmF0ZSBMaW1pdGVkJyxcbiAgICBhY2NvdW50TnVtYmVyOiAnNTAyMDAwMjc0NDE0MzMnLFxuICAgIGlmc2M6ICdIREZDMDAwMDM4NicsXG4gICAgc3dpZnQ6ICdIREZDSU5CQkNIRScsXG4gICAgYnJhbmNoOiAnU2FudGhvbWUsIENoZW5uYWknLFxuICAgIHBheW1lbnRUeXBlOiAnT25saW5lJyxcbiAgfTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgYWN0aXZlTW9kYWw6IE5nYkFjdGl2ZU1vZGFsLFxuICAgIHByaXZhdGUgYmlsbGluZ1NlcnZpY2U6IEJpbGxpbmdTZXJ2aWNlLFxuICAgIHByaXZhdGUgdG9hc3Q6IFRvYXN0U2VydmljZSxcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8vIEJhbmsgZGV0YWlscyBhcmUgZml4ZWQgKHNlZSBiYW5rRGV0YWlscyBhYm92ZSkg4oCUIG5vdGhpbmcgdG8gZmV0Y2guXG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBzZWxlY3RUYWIodGFiOiAnaW52b2ljZScgfCAnYW5uZXh1cmUnKSB7XG4gICAgdGhpcy5hY3RpdmVUYWIgPSB0YWI7XG4gICAgaWYgKHRhYiA9PT0gJ2FubmV4dXJlJyAmJiB0aGlzLmFubmV4dXJlRGF0YSA9PT0gbnVsbCAmJiAhdGhpcy5hbm5leHVyZUxvYWRpbmcpIHtcbiAgICAgIHRoaXMubG9hZEFubmV4dXJlKCk7XG4gICAgfVxuICB9XG5cbiAgbG9hZEFubmV4dXJlKCkge1xuICAgIGlmICghdGhpcy5pbnZvaWNlRGF0YT8uX2lkKSByZXR1cm47XG4gICAgdGhpcy5hbm5leHVyZUxvYWRpbmcgPSB0cnVlO1xuICAgIHRoaXMuYW5uZXh1cmVFcnJvciA9IGZhbHNlO1xuICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UuZ2V0SW52b2ljZUFubmV4dXJlKHRoaXMuaW52b2ljZURhdGEuX2lkKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgIC8vIEJhY2tlbmQgZW52ZWxvcGUgaXMgeyBjb2RlLCBzdGF0dXMsIGRhdGE6IHsgZGF0YTogWy4uLl0gfSB9IOKAlFxuICAgICAgICAgIC8vIHRoZSBjb250cm9sbGVyIGNhbGxzIHNlbmRTdWNjZXNzKHsgZGF0YTogYW5uZXh1cmVEYXRhIH0pIGFuZCB0aGVcbiAgICAgICAgICAvLyByZXNwb25zZSBtaWRkbGV3YXJlIHdyYXBzIHRoYXQgdW5kZXIgaXRzIG93biBgZGF0YWAga2V5LiBSZWFkXG4gICAgICAgICAgLy8gdGhyb3VnaCBib3RoIGxheWVycyB0byBnZXQgdGhlIHJvdyBhcnJheS5cbiAgICAgICAgICB0aGlzLmFubmV4dXJlRGF0YSA9IHJlcz8uZGF0YT8uZGF0YSB8fCBbXTtcbiAgICAgICAgICB0aGlzLmFubmV4dXJlVG90YWwgPSByZXM/LmRhdGE/LnRvdGFsQW1vdW50ID8/IG51bGw7XG4gICAgICAgICAgdGhpcy5hbm5leHVyZUxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLmFubmV4dXJlRXJyb3IgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuYW5uZXh1cmVMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgLy8gRXhwb3J0IHRoZSBsb2FkZWQgYW5uZXh1cmUgcm93cyBhcyBhbiAueGxzeCBmaWxlLiBNaXJyb3JzIHRoZSBjb2x1bW5zXG4gIC8vIHNob3duIGluIHRoZSBBbm5leHVyZSB0YWIgc28gdGhlIHNwcmVhZHNoZWV0IG1hdGNoZXMgd2hhdCB0aGUgdXNlclxuICAvLyBzYXcgb24gc2NyZWVuLiBGaWxlbmFtZSBpcyBgJHtpbnZvaWNlTnVtYmVyfS1hbm5leHVyZS54bHN4YC5cbiAgZG93bmxvYWRBbm5leHVyZVhsc3goKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmFubmV4dXJlRGF0YSB8fCB0aGlzLmFubmV4dXJlRGF0YS5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3ltYm9sID0gdGhpcy5jdXJyZW5jeVN5bWJvbCgpO1xuICAgICAgY29uc3Qgcm93czogYW55W10gPSB0aGlzLmFubmV4dXJlRGF0YS5tYXAoKHJvdzogYW55KSA9PiAoe1xuICAgICAgICAnU3RvcmUgTmFtZSc6IHJvdz8uc3RvcmVOYW1lIHx8ICcnLFxuICAgICAgICAnUHJvZHVjdCc6IHRoaXMuZm9ybWF0UHJvZHVjdE5hbWUocm93Py5wcm9kdWN0TmFtZSksXG4gICAgICAgICdTdG9yZSBJRCc6IHJvdz8uc3RvcmVJZCB8fCAnJyxcbiAgICAgICAgJ0RlcGxveW1lbnQgRGF0ZSc6IHJvdz8uZWRnZWZpcnN0RmlsZURhdGUgfHwgJycsXG4gICAgICAgICdQZXJpb2QnOiByb3c/LnBlcmlvZCA9PT0gJ3Byb3JhdGUnID8gJ1Byby1yYXRlJyA6ICdGdWxsIG1vbnRoJyxcbiAgICAgICAgJ1ByaWNpbmcgTWV0aG9kJzogcm93Py51bml0QmFzaXMgfHwgJ1BlciBTdG9yZScsXG4gICAgICAgICdCaWxsaW5nIERheXMnOiByb3c/LndvcmtpbmdkYXlzID8/IDAsXG4gICAgICAgICdRdHknOiByb3c/LnVuaXRzID8/IDEsXG4gICAgICAgICdVbml0IFByaWNlJzogcm93Py5zdGFuZGFyZFByaWNlICE9IG51bGxcbiAgICAgICAgICA/IGAke3N5bWJvbH0gJHt0aGlzLmZvcm1hdElOUihyb3cuc3RhbmRhcmRQcmljZSl9ICgke3Jvdz8udW5pdEJhc2lzIHx8ICdQZXIgU3RvcmUnfSlgXG4gICAgICAgICAgOiAnJyxcbiAgICAgICAgJ1ByaWNlIFBlciBNb250aCc6IHJvdz8ucnVubmluZ0Nvc3QgIT0gbnVsbFxuICAgICAgICAgID8gYCR7c3ltYm9sfSAke3RoaXMuZm9ybWF0SU5SKHJvdy5ydW5uaW5nQ29zdCl9YFxuICAgICAgICAgIDogJycsXG4gICAgICB9KSk7XG4gICAgICBpZiAodGhpcy5hbm5leHVyZVRvdGFsICE9IG51bGwpIHtcbiAgICAgICAgcm93cy5wdXNoKHtcbiAgICAgICAgICAnU3RvcmUgTmFtZSc6ICcnLCAnUHJvZHVjdCc6ICcnLCAnU3RvcmUgSUQnOiAnJywgJ0RlcGxveW1lbnQgRGF0ZSc6ICcnLFxuICAgICAgICAgICdQZXJpb2QnOiAnJywgJ1ByaWNpbmcgTWV0aG9kJzogJycsXG4gICAgICAgICAgJ0JpbGxpbmcgRGF5cyc6ICcnLCAnUXR5JzogJycsICdVbml0IFByaWNlJzogJ1RvdGFsJyxcbiAgICAgICAgICAnUHJpY2UgUGVyIE1vbnRoJzogYCR7c3ltYm9sfSAke3RoaXMuZm9ybWF0SU5SKHRoaXMuYW5uZXh1cmVUb3RhbCl9YCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCB3b3Jrc2hlZXQgPSBYTFNYLnV0aWxzLmpzb25fdG9fc2hlZXQocm93cyk7XG4gICAgICBjb25zdCB3b3JrYm9vayA9IHsgU2hlZXRzOiB7IEFubmV4dXJlOiB3b3Jrc2hlZXQgfSwgU2hlZXROYW1lczogWydBbm5leHVyZSddIH07XG4gICAgICBjb25zdCBidWZmZXI6IEFycmF5QnVmZmVyID0gWExTWC53cml0ZSh3b3JrYm9vaywgeyBib29rVHlwZTogJ3hsc3gnLCB0eXBlOiAnYXJyYXknIH0pO1xuICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtidWZmZXJdLCB7XG4gICAgICAgIHR5cGU6ICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldDtjaGFyc2V0PVVURi04JyxcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgc2FmZUludm9pY2VObyA9ICh0aGlzLmludm9pY2VEYXRhPy5pbnZvaWNlIHx8ICdpbnZvaWNlJykucmVwbGFjZSgvW1xcXFwvOio/XCI8PnxcXHJcXG5dL2csICcnKTtcbiAgICAgIEZpbGVTYXZlci5zYXZlQXMoYmxvYiwgYCR7c2FmZUludm9pY2VOb30tYW5uZXh1cmUueGxzeGApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnRmFpbGVkIHRvIGV4cG9ydCBhbm5leHVyZScpO1xuICAgIH1cbiAgfVxuXG4gIHJldHJ5QW5uZXh1cmUoKSB7XG4gICAgdGhpcy5hbm5leHVyZURhdGEgPSBudWxsO1xuICAgIHRoaXMubG9hZEFubmV4dXJlKCk7XG4gIH1cblxuICBkb3dubG9hZFBkZigpIHtcbiAgICBpZiAoIXRoaXMuaW52b2ljZURhdGE/Ll9pZCB8fCB0aGlzLmRvd25sb2FkaW5nKSByZXR1cm47XG4gICAgdGhpcy5kb3dubG9hZGluZyA9IHRydWU7XG4gICAgY29uc3QgcmVxID0geyAuLi50aGlzLmludm9pY2VEYXRhIH07XG4gICAgcmVxLmNsaWVudElkID0gW3RoaXMuaW52b2ljZURhdGEuY2xpZW50SWRdO1xuICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UuaW52b2ljZURvd25sb2FkKHJlcSlcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW3Jlc10sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL3BkZicgfSk7XG4gICAgICAgICAgY29uc3QgdXJsID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgICAgICAgY29uc3QgbW9udGggPSB0aGlzLmludm9pY2VEYXRhPy5iaWxsaW5nRGF0ZVxuICAgICAgICAgICAgPyBuZXcgRGF0ZSh0aGlzLmludm9pY2VEYXRhLmJpbGxpbmdEYXRlKS50b0xvY2FsZVN0cmluZygnZW4tVVMnLCB7IG1vbnRoOiAnbG9uZycgfSlcbiAgICAgICAgICAgIDogJyc7XG4gICAgICAgICAgY29uc3QgYnJhbmROYW1lID0gdGhpcy5pbnZvaWNlRGF0YT8ucmVnaXN0ZXJlZENvbXBhbnlOYW1lIHx8IHRoaXMuaW52b2ljZURhdGE/LmNvbXBhbnlOYW1lIHx8ICcnO1xuICAgICAgICAgIGNvbnN0IGZpbGVuYW1lID0gYCR7dGhpcy5pbnZvaWNlRGF0YT8uaW52b2ljZSB8fCAnaW52b2ljZSd9LSR7bW9udGh9LSR7YnJhbmROYW1lfS5wZGZgXG4gICAgICAgICAgICAucmVwbGFjZSgvW1xcXFwvOio/XCI8PnxcXHJcXG5dL2csICcnKS50cmltKCk7XG4gICAgICAgICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgICBsaW5rLmhyZWYgPSB1cmw7XG4gICAgICAgICAgbGluay5kb3dubG9hZCA9IGZpbGVuYW1lO1xuICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobGluayk7XG4gICAgICAgICAgbGluay5jbGljaygpO1xuICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQobGluayk7XG4gICAgICAgICAgd2luZG93LlVSTC5yZXZva2VPYmplY3RVUkwodXJsKTtcbiAgICAgICAgICB0aGlzLmRvd25sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5kb3dubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnRmFpbGVkIHRvIGRvd25sb2FkIGludm9pY2UnKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICAvLyBNaXJyb3JzIHRoZSBiYWNrZW5kIENVUlJFTkNZX1NZTUJPTFMgbWFwICh1dGlscy9jdXJyZW5jeS5qcykgc28gdGhlXG4gIC8vIHByZXZpZXcgc2hvd3MgdGhlIHNhbWUgc3ltYm9sIHRoZSBQREYgd2lsbCByZW5kZXIuIEZhbGxiYWNrIGlzICckJyBmb3JcbiAgLy8gdW5rbm93biBjb2RlcyB0byBtYXRjaCB0aGUgYmFja2VuZC5cbiAgcHJpdmF0ZSByZWFkb25seSBjdXJyZW5jeVN5bWJvbHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgaW5yOiAn4oK5JyxcbiAgICBkb2xsYXI6ICckJyxcbiAgICBzaW5nYXBvcmVkb2xsYXI6ICdTJCcsXG4gICAgZXVybzogJ+KCrCcsXG4gICAgYWVkOiAnQUVEJyxcbiAgfTtcblxuICAvLyBXb3JkcyBmb3JtIG9mIGVhY2ggY3VycmVuY3kgZm9yIHRoZSBcIkFtb3VudCBpbiB3b3Jkc1wiIGxpbmUuXG4gIHByaXZhdGUgcmVhZG9ubHkgY3VycmVuY3lXb3JkczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICBpbnI6ICdJbmRpYW4gUnVwZWUnLFxuICAgIGRvbGxhcjogJ1VTIERvbGxhcicsXG4gICAgc2luZ2Fwb3JlZG9sbGFyOiAnU2luZ2Fwb3JlIERvbGxhcicsXG4gICAgZXVybzogJ0V1cm8nLFxuICB9O1xuXG4gIC8vIExvY2FsZSB1c2VkIGZvciBncm91cGluZyBudW1iZXJzLiBlbi1JTiBpcyBsYWtocy9jcm9yZXM7IGV2ZXJ5dGhpbmcgZWxzZVxuICAvLyBnZXRzIHdlc3Rlcm4gdGhvdXNhbmRzIGdyb3VwaW5nLlxuICBwcml2YXRlIHJlYWRvbmx5IGN1cnJlbmN5TG9jYWxlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICBpbnI6ICdlbi1JTicsXG4gICAgZG9sbGFyOiAnZW4tVVMnLFxuICAgIHNpbmdhcG9yZWRvbGxhcjogJ2VuLVNHJyxcbiAgICBldXJvOiAnZW4tSUUnLFxuICB9O1xuXG4gIGN1cnJlbmN5U3ltYm9sKCk6IHN0cmluZyB7XG4gICAgY29uc3QgY29kZSA9IHRoaXMuaW52b2ljZURhdGE/LmN1cnJlbmN5O1xuICAgIHJldHVybiB0aGlzLmN1cnJlbmN5U3ltYm9sc1tjb2RlIHx8ICcnXSB8fCAnJCc7XG4gIH1cblxuICBnZXQgdG90YWxJbldvcmRzKCk6IHN0cmluZyB7XG4gICAgY29uc3QgY29kZSA9IHRoaXMuaW52b2ljZURhdGE/LmN1cnJlbmN5O1xuICAgIGNvbnN0IHdvcmRzID0gdGhpcy5jdXJyZW5jeVdvcmRzW2NvZGUgfHwgJyddIHx8ICdVUyBEb2xsYXInO1xuICAgIGNvbnN0IHRvdGFsID0gTWF0aC5yb3VuZChOdW1iZXIodGhpcy5pbnZvaWNlRGF0YT8udG90YWxBbW91bnQgfHwgMCkpO1xuICAgIHJldHVybiBgJHt3b3Jkc30gJHthbW91bnRJbldvcmRzKHRvdGFsKX0gT25seWA7XG4gIH1cblxuICBmb3JtYXRJTlIodmFsdWU6IGFueSk6IHN0cmluZyB7XG4gICAgY29uc3QgbiA9IE51bWJlcih2YWx1ZSk7XG4gICAgaWYgKCFpc0Zpbml0ZShuKSkgcmV0dXJuICcwLjAwJztcbiAgICBjb25zdCBjb2RlID0gdGhpcy5pbnZvaWNlRGF0YT8uY3VycmVuY3k7XG4gICAgY29uc3QgbG9jYWxlID0gdGhpcy5jdXJyZW5jeUxvY2FsZXNbY29kZSB8fCAnJ10gfHwgJ2VuLVVTJztcbiAgICByZXR1cm4gbi50b0xvY2FsZVN0cmluZyhsb2NhbGUsIHsgbWluaW11bUZyYWN0aW9uRGlnaXRzOiAyLCBtYXhpbXVtRnJhY3Rpb25EaWdpdHM6IDIgfSk7XG4gIH1cblxuICAvLyBNaXJyb3JzIHRoZSBiYWNrZW5kIHRyYW5zZm9ybTogYHRhbmdvVHJhZmZpY2AgLT4gYFRhbmdvIFRyYWZmaWNgLlxuICBmb3JtYXRQcm9kdWN0TmFtZShuYW1lOiBhbnkpOiBzdHJpbmcge1xuICAgIGlmICghbmFtZSkgcmV0dXJuICcnO1xuICAgIGNvbnN0IHBhcnRzID0gU3RyaW5nKG5hbWUpLnJlcGxhY2UoLyhbYS16XSkoW0EtWl0pL2csICckMSAkMicpLnNwbGl0KCcgJyk7XG4gICAgcmV0dXJuIHBhcnRzLm1hcCgodykgPT4gdy5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHcuc2xpY2UoMSkpLmpvaW4oJyAnKTtcbiAgfVxuXG4gIHRyYWNrQnlJbmRleChpbmRleDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG59IiwiPGRpdiBjbGFzcz1cImludm9pY2UtcHJldmlldy1tb2RhbFwiPlxuICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XG4gICAgPHVsIGNsYXNzPVwibmF2IG5hdi10YWJzIHByZXZpZXctdGFic1wiIHJvbGU9XCJ0YWJsaXN0XCI+XG4gICAgICA8bGkgY2xhc3M9XCJuYXYtaXRlbVwiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwibmF2LWxpbmtcIiBbY2xhc3MuYWN0aXZlXT1cImFjdGl2ZVRhYiA9PT0gJ2ludm9pY2UnXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0VGFiKCdpbnZvaWNlJylcIiB0eXBlPVwiYnV0dG9uXCI+SW52b2ljZTwvYnV0dG9uPlxuICAgICAgPC9saT5cbiAgICAgIDxsaSBjbGFzcz1cIm5hdi1pdGVtXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJuYXYtbGlua1wiIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlVGFiID09PSAnYW5uZXh1cmUnXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0VGFiKCdhbm5leHVyZScpXCIgdHlwZT1cImJ1dHRvblwiPkFubmV4dXJlPC9idXR0b24+XG4gICAgICA8L2xpPlxuICAgIDwvdWw+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xvc2VcIiAoY2xpY2spPVwiYWN0aXZlTW9kYWwuZGlzbWlzcygpXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCI+PC9idXR0b24+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5IHAtMFwiPlxuICAgIDwhLS0gSU5WT0lDRSBUQUIgLS0+XG4gICAgPGRpdiAqbmdJZj1cImFjdGl2ZVRhYiA9PT0gJ2ludm9pY2UnXCIgY2xhc3M9XCJpbnZvaWNlLXBhZ2VcIj5cbiAgICAgIDwhLS0gSGVhZGVyIHJvdyAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJyb3cgYWxpZ24taXRlbXMtc3RhcnRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC03XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImJyYW5kXCI+XG4gICAgICAgICAgICA8aW1nIHNyYz1cIi4vYXNzZXRzL3RhbmdvL0ltYWdlcy90YW5nb2V5ZS1sb2dvLnN2Z1wiIGFsdD1cIlRhbmdvRXllXCIgY2xhc3M9XCJicmFuZC1sb2dvXCIgb25lcnJvcj1cInRoaXMuc3R5bGUuZGlzcGxheT0nbm9uZSdcIj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcGFueS1ibG9jayBtdC0zXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcGFueS1uYW1lXCI+VEFOR08gSVQgU09MVVRJT05TIElORElBIFBSSVZBVEUgTFREPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PjJuZCBGbG9vciwgQXBlZWpheSBCdXNpbmVzcyBDZW50cmUsIE5vLjEyLzM5LDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5IYWRkb3dzIFJvYWQsIE51bmdhbWJha2thbTwvZGl2PlxuICAgICAgICAgICAgPGRpdj5DaGVubmFpIFRhbWlsIE5hZHUgNjAwMDA2LCBJbmRpYTwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTFcIj48c3Ryb25nPkdTVElOIDMzQUFHQ1QzMTI0UjFaMjwvc3Ryb25nPjwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTFcIj5NU01FIC8gVWR5YW0gdHlwZSA6IE1pY3JvPC9kaXY+XG4gICAgICAgICAgICA8ZGl2Pk1TTUUgLyBVZHlhbSBOby4gOiBVRFlBTS1UTi0wMy0wMjEyMzk5PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTUgdGV4dC1lbmRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGF4LWludm9pY2UtbGFiZWxcIj5UQVggSU5WT0lDRTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZvaWNlLW51bWJlclwiPiMge3sgaW52b2ljZURhdGE/Lmludm9pY2UgfX08L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBCaWxsLXRvICsgdG90YWxzIHJvdyAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbXQtNFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTdcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmlsbC10by1sYWJlbFwiPkJJTEwgVE8gOjwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjbGllbnQtbmFtZSBtdC0xXCI+e3sgKGludm9pY2VEYXRhPy5jbGllbnROYW1lIHx8IGludm9pY2VEYXRhPy5jb21wYW55TmFtZSkgfCB1cHBlcmNhc2UgfX08L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMVwiICpuZ0lmPVwiaW52b2ljZURhdGE/LmJpbGxpbmdBZGRyZXNzTGluZU9uZSB8fCBpbnZvaWNlRGF0YT8uY29tcGFueUFkZHJlc3NcIj5cbiAgICAgICAgICAgIHt7IGludm9pY2VEYXRhPy5iaWxsaW5nQWRkcmVzc0xpbmVPbmUgfHwgaW52b2ljZURhdGE/LmNvbXBhbnlBZGRyZXNzIH19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImludm9pY2VEYXRhPy5iaWxsaW5nQWRkcmVzc0xpbmVUd29cIj57eyBpbnZvaWNlRGF0YT8uYmlsbGluZ0FkZHJlc3NMaW5lVHdvIH19PC9kaXY+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImludm9pY2VEYXRhPy5iaWxsaW5nQ2l0eSB8fCBpbnZvaWNlRGF0YT8uYmlsbGluZ1BpbkNvZGUgfHwgaW52b2ljZURhdGE/LmJpbGxpbmdTdGF0ZVwiPlxuICAgICAgICAgICAge3sgaW52b2ljZURhdGE/LmJpbGxpbmdDaXR5IH19PHNwYW4gKm5nSWY9XCJpbnZvaWNlRGF0YT8uYmlsbGluZ1BpbkNvZGVcIj4sIHt7IGludm9pY2VEYXRhPy5iaWxsaW5nUGluQ29kZSB9fTwvc3Bhbj48c3BhbiAqbmdJZj1cImludm9pY2VEYXRhPy5iaWxsaW5nU3RhdGVcIj4sIHt7IGludm9pY2VEYXRhPy5iaWxsaW5nU3RhdGUgfX08L3NwYW4+PHNwYW4gKm5nSWY9XCJpbnZvaWNlRGF0YT8uYmlsbGluZ0NvdW50cnlcIj4sIHt7IGludm9pY2VEYXRhPy5iaWxsaW5nQ291bnRyeSB9fTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMlwiICpuZ0lmPVwiaW52b2ljZURhdGE/LkdTVE51bWJlclwiPjxzdHJvbmc+R1NUSU4ge3sgaW52b2ljZURhdGE/LkdTVE51bWJlciB9fTwvc3Ryb25nPjwvZGl2PlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJpbnZvaWNlRGF0YT8uUGxhY2VPZlN1cHBseVwiPlBsYWNlIE9mIFN1cHBseToge3sgaW52b2ljZURhdGE/LlBsYWNlT2ZTdXBwbHkgfX08L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNSB0ZXh0LWVuZFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZvaWNlLXRvdGFsLWxhYmVsXCI+SW52b2ljZSBUb3RhbCA8c3BhbiBjbGFzcz1cImludm9pY2UtdG90YWwtYW1vdW50XCI+e3sgY3VycmVuY3lTeW1ib2woKSB9fSB7eyBmb3JtYXRJTlIoaW52b2ljZURhdGE/LnRvdGFsQW1vdW50KSB9fTwvc3Bhbj48L2Rpdj5cbiAgICAgICAgICA8dGFibGUgY2xhc3M9XCJtZXRhLXRhYmxlIG1zLWF1dG8gbXQtM1wiPlxuICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz1cIm1ldGEtbGFiZWxcIj5JbnZvaWNlIGRhdGUgOjwvdGQ+PHRkIGNsYXNzPVwibWV0YS12YWx1ZVwiPnt7IGludm9pY2VEYXRhPy5iaWxsaW5nRGF0ZSB8IGRhdGU6J2RkL01NL3l5eXknIH19PC90ZD48L3RyPlxuICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz1cIm1ldGEtbGFiZWxcIj5UZXJtcyA6PC90ZD48dGQgY2xhc3M9XCJtZXRhLXZhbHVlXCI+VGVybSB7eyBpbnZvaWNlRGF0YT8ucGF5bWVudFRlcm0gfHwgJzMwJyB9fTwvdGQ+PC90cj5cbiAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9XCJtZXRhLWxhYmVsXCI+RHVlIERhdGUgOjwvdGQ+PHRkIGNsYXNzPVwibWV0YS12YWx1ZVwiPnt7IGludm9pY2VEYXRhPy5kdWVEYXRlIHwgZGF0ZTonZGQvTU0veXl5eScgfX08L3RkPjwvdHI+XG4gICAgICAgICAgICA8dHIgKm5nSWY9XCJpbnZvaWNlRGF0YT8uUG9OdW0gfHwgaW52b2ljZURhdGE/LnBvTnVtYmVyXCI+PHRkIGNsYXNzPVwibWV0YS1sYWJlbFwiPlAuTy4jIDo8L3RkPjx0ZCBjbGFzcz1cIm1ldGEtdmFsdWVcIj57eyBpbnZvaWNlRGF0YT8uUG9OdW0gfHwgaW52b2ljZURhdGE/LnBvTnVtYmVyIH19PC90ZD48L3RyPlxuICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gTGluZSBpdGVtcyAtLT5cbiAgICAgIDx0YWJsZSBjbGFzcz1cIml0ZW1zLXRhYmxlIG10LTRcIj5cbiAgICAgICAgPHRoZWFkPlxuICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgIDx0aCBjbGFzcz1cImNvbC1pbmRleFwiPiM8L3RoPlxuICAgICAgICAgICAgPHRoIGNsYXNzPVwiY29sLXByb2R1Y3RcIj5Qcm9kdWN0ICZhbXA7IERlc2NyaXB0aW9uPC90aD5cbiAgICAgICAgICAgIDx0aCBjbGFzcz1cImNvbC1tb250aFwiPk1vbnRoPC90aD5cbiAgICAgICAgICAgIDx0aCBjbGFzcz1cImNvbC1oc25cIj5IU04vU0FDPC90aD5cbiAgICAgICAgICAgIDx0aCBjbGFzcz1cImNvbC1jb3VudCB0ZXh0LWNlbnRlclwiPlF1YW50aXR5PC90aD5cbiAgICAgICAgICAgIDx0aCBjbGFzcz1cImNvbC1yYXRlIHRleHQtZW5kXCI+UmF0ZTwvdGg+XG4gICAgICAgICAgICA8dGggY2xhc3M9XCJjb2wtYW1vdW50IHRleHQtZW5kXCI+QW1vdW50PC90aD5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICA8L3RoZWFkPlxuICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGludm9pY2VEYXRhPy5wcm9kdWN0czsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeUluZGV4XCI+XG4gICAgICAgICAgICA8dGQ+e3sgaSArIDEgfX08L3RkPlxuICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZHVjdC1uYW1lXCI+e3sgZm9ybWF0UHJvZHVjdE5hbWUoaXRlbT8ucHJvZHVjdE5hbWUpIH19PC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9kdWN0LWRlc2NcIj57eyBpdGVtPy5kZXNjcmlwdGlvbiB9fTwvZGl2PlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwhLS0gTW9udGggaXMgdGhlIHByb2R1Y3QncyBiaWxsaW5nIG1vbnRoIHN0b3JlZCBvbiB0aGUgbGluZSBpdGVtXG4gICAgICAgICAgICAgICAgIChhZHZhbmNlIGludm9pY2VzIGJpbGwgYSBmdXR1cmUgbW9udGggd2hpbGUgYmlsbGluZ0RhdGUgaXMgdGhlXG4gICAgICAgICAgICAgICAgIGNyZWF0aW9uIGRhdGUpLiBGYWxsIGJhY2sgdG8gYmlsbGluZ0RhdGUgZm9yIGxlZ2FjeSByb3dzLiAtLT5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cIm5vd3JhcFwiPnt7IGl0ZW0/Lm1vbnRoIHx8IChpbnZvaWNlRGF0YT8uYmlsbGluZ0RhdGUgfCBkYXRlOidNTU0geXl5eScpIH19PC90ZD5cbiAgICAgICAgICAgIDx0ZD57eyBpdGVtPy5oc24gfHwgaXRlbT8uaHNuQ29kZSB8fCAnOTk4MzE0JyB9fTwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPjxzdHJvbmc+e3sgaXRlbT8uc3RvcmVDb3VudCB8fCBpbnZvaWNlRGF0YT8uc3RvcmVzPy5sZW5ndGggfHwgJycgfX08L3N0cm9uZz48L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwidGV4dC1lbmQgbm93cmFwXCI+e3sgY3VycmVuY3lTeW1ib2woKSB9fSB7eyBmb3JtYXRJTlIoaXRlbT8ucHJpY2UpIH19PC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cInRleHQtZW5kIG5vd3JhcFwiPnt7IGN1cnJlbmN5U3ltYm9sKCkgfX0ge3sgZm9ybWF0SU5SKGl0ZW0/LmFtb3VudCkgfX08L3RkPlxuICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvdGJvZHk+XG4gICAgICA8L3RhYmxlPlxuXG4gICAgICA8IS0tIFRvdGFscyAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbXQtM1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTdcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC01XCI+XG4gICAgICAgICAgPHRhYmxlIGNsYXNzPVwidG90YWxzLXRhYmxlIG1zLWF1dG9cIj5cbiAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9XCJ0b3RhbHMtbGFiZWxcIj5TdWIgVG90YWw8L3RkPjx0ZCBjbGFzcz1cInRvdGFscy12YWx1ZVwiPnt7IGN1cnJlbmN5U3ltYm9sKCkgfX0ge3sgZm9ybWF0SU5SKGludm9pY2VEYXRhPy5hbW91bnQpIH19PC90ZD48L3RyPlxuICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCB0IG9mIGludm9pY2VEYXRhPy50YXhcIj5cbiAgICAgICAgICAgICAgPHRkIGNsYXNzPVwidG90YWxzLWxhYmVsXCI+e3sgdD8udHlwZSB8fCB0Py50YXhOYW1lIHx8IHQ/Lm5hbWUgfX0gKHt7IHQ/LnZhbHVlID8/IHQ/LnRheFBlcmNlbnRhZ2UgPz8gdD8ucGVyY2VudGFnZSB9fSUpPC90ZD5cbiAgICAgICAgICAgICAgPHRkIGNsYXNzPVwidG90YWxzLXZhbHVlIG5vd3JhcFwiPnt7IGN1cnJlbmN5U3ltYm9sKCkgfX0ge3sgZm9ybWF0SU5SKHQ/LnRheEFtb3VudCkgfX08L3RkPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIDx0ciBjbGFzcz1cInRvdGFscy10b3RhbC1yb3dcIj5cbiAgICAgICAgICAgICAgPHRkIGNsYXNzPVwidG90YWxzLWxhYmVsXCI+VG90YWwgQW1vdW50PC90ZD5cbiAgICAgICAgICAgICAgPHRkIGNsYXNzPVwidG90YWxzLXZhbHVlXCI+e3sgY3VycmVuY3lTeW1ib2woKSB9fSB7eyBmb3JtYXRJTlIoaW52b2ljZURhdGE/LnRvdGFsQW1vdW50KSB9fTwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPHRyIGNsYXNzPVwidG90YWxzLXdvcmRzLXJvd1wiPlxuICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ0b3RhbHMtbGFiZWxcIj5Ub3RhbCBJbiBXb3JkczwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInRvdGFscy12YWx1ZSB3b3Jkc1wiPnt7IHRvdGFsSW5Xb3JkcyB9fTwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gUGF5bWVudCBkZXRhaWxzIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInRoYW5rcyBtdC00XCI+VGhhbmtzIGZvciB5b3VyIGJ1c2luZXNzITwvZGl2PlxuICAgICAgPHRhYmxlIGNsYXNzPVwicGF5bWVudC10YWJsZSBtdC0yXCI+XG4gICAgICAgIDx0cj48dGQgY2xhc3M9XCJwYXltZW50LWxhYmVsXCI+QmVuZWZpY2lhcnkgTmFtZTwvdGQ+PHRkIGNsYXNzPVwicGF5bWVudC12YWx1ZVwiPjxzdHJvbmc+e3sgYmFua0RldGFpbHM/LmJlbmVmaWNpYXJ5TmFtZSB9fTwvc3Ryb25nPjwvdGQ+PC90cj5cbiAgICAgICAgPHRyPjx0ZCBjbGFzcz1cInBheW1lbnQtbGFiZWxcIj5BY2NvdW50IE51bWJlcjwvdGQ+PHRkIGNsYXNzPVwicGF5bWVudC12YWx1ZVwiPjxzdHJvbmc+e3sgYmFua0RldGFpbHM/LmFjY291bnROdW1iZXIgfX08L3N0cm9uZz48L3RkPjwvdHI+XG4gICAgICAgIDx0cj48dGQgY2xhc3M9XCJwYXltZW50LWxhYmVsXCI+SUZTQyBDb2RlPC90ZD48dGQgY2xhc3M9XCJwYXltZW50LXZhbHVlXCI+PHN0cm9uZz57eyBiYW5rRGV0YWlscz8uaWZzYyB9fTwvc3Ryb25nPjwvdGQ+PC90cj5cbiAgICAgICAgPHRyPjx0ZCBjbGFzcz1cInBheW1lbnQtbGFiZWxcIj5QYXltZW50IFR5cGU8L3RkPjx0ZCBjbGFzcz1cInBheW1lbnQtdmFsdWVcIj48c3Ryb25nPnt7IGJhbmtEZXRhaWxzPy5wYXltZW50VHlwZSB9fTwvc3Ryb25nPjwvdGQ+PC90cj5cbiAgICAgICAgPHRyPjx0ZCBjbGFzcz1cInBheW1lbnQtbGFiZWxcIj5TV0lGVCBDb2RlPC90ZD48dGQgY2xhc3M9XCJwYXltZW50LXZhbHVlXCI+PHN0cm9uZz57eyBiYW5rRGV0YWlscz8uc3dpZnQgfX08L3N0cm9uZz48L3RkPjwvdHI+XG4gICAgICAgIDx0cj48dGQgY2xhc3M9XCJwYXltZW50LWxhYmVsXCI+QnJhbmNoPC90ZD48dGQgY2xhc3M9XCJwYXltZW50LXZhbHVlXCI+PHN0cm9uZz57eyBiYW5rRGV0YWlscz8uYnJhbmNoIH19PC9zdHJvbmc+PC90ZD48L3RyPlxuICAgICAgPC90YWJsZT5cblxuICAgICAgPGRpdiBjbGFzcz1cInN5c3RlbS1ub3RlIG10LTRcIj5UaGlzIGlzIGEgc3lzdGVtIGdlbmVyYXRlZCBpbnZvaWNlLiBObyBzaWduYXR1cmUgcmVxdWlyZWQ8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gQU5ORVhVUkUgVEFCIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJhY3RpdmVUYWIgPT09ICdhbm5leHVyZSdcIiBjbGFzcz1cImFubmV4dXJlLXBhZ2VcIj5cbiAgICAgIDxkaXYgKm5nSWY9XCJhbm5leHVyZUxvYWRpbmdcIiBjbGFzcz1cImxvYWRpbmctc3RhdGVcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNwaW5uZXItYm9yZGVyIHRleHQtcHJpbWFyeVwiIHJvbGU9XCJzdGF0dXNcIj48c3BhbiBjbGFzcz1cInZpc3VhbGx5LWhpZGRlblwiPkxvYWRpbmcuLi48L3NwYW4+PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgKm5nSWY9XCIhYW5uZXh1cmVMb2FkaW5nICYmIGFubmV4dXJlRXJyb3JcIiBjbGFzcz1cImVycm9yLXN0YXRlXCI+XG4gICAgICAgIDxwPkZhaWxlZCB0byBsb2FkIGFubmV4dXJlLjwvcD5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtcHJpbWFyeVwiIChjbGljayk9XCJyZXRyeUFubmV4dXJlKClcIj5SZXRyeTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0lmPVwiIWFubmV4dXJlTG9hZGluZyAmJiAhYW5uZXh1cmVFcnJvciAmJiBhbm5leHVyZURhdGEgIT09IG51bGwgJiYgYW5uZXh1cmVEYXRhLmxlbmd0aCA9PT0gMFwiIGNsYXNzPVwiZW1wdHktc3RhdGVcIj5cbiAgICAgICAgTm8gYW5uZXh1cmUgZGF0YSBmb3IgdGhpcyBpbnZvaWNlLlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0lmPVwiIWFubmV4dXJlTG9hZGluZyAmJiAhYW5uZXh1cmVFcnJvciAmJiBhbm5leHVyZURhdGEgJiYgYW5uZXh1cmVEYXRhLmxlbmd0aCA+IDBcIlxuICAgICAgICAgICBjbGFzcz1cImFubmV4dXJlLXRvb2xiYXJcIj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLXByaW1hcnlcIiAoY2xpY2spPVwiZG93bmxvYWRBbm5leHVyZVhsc3goKVwiPlxuICAgICAgICAgIEV4cG9ydCBhcyBYTFNYXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8dGFibGUgKm5nSWY9XCIhYW5uZXh1cmVMb2FkaW5nICYmICFhbm5leHVyZUVycm9yICYmIGFubmV4dXJlRGF0YSAmJiBhbm5leHVyZURhdGEubGVuZ3RoID4gMFwiIGNsYXNzPVwiYW5uZXh1cmUtdGFibGVcIj5cbiAgICAgICAgPHRoZWFkPlxuICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgIDx0aD5TdG9yZSBOYW1lPC90aD5cbiAgICAgICAgICAgIDx0aD5Qcm9kdWN0czwvdGg+XG4gICAgICAgICAgICA8dGg+U3RvcmUgSUQ8L3RoPlxuICAgICAgICAgICAgPHRoPkRlcGxveW1lbnQgRGF0ZTwvdGg+XG4gICAgICAgICAgICA8dGg+UGVyaW9kPC90aD5cbiAgICAgICAgICAgIDx0aD5QcmljaW5nIE1ldGhvZDwvdGg+XG4gICAgICAgICAgICA8dGggY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPkJpbGxpbmcgRGF5czwvdGg+XG4gICAgICAgICAgICA8dGggY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlF0eTwvdGg+XG4gICAgICAgICAgICA8dGggY2xhc3M9XCJ0ZXh0LWVuZFwiPlVuaXQgUHJpY2U8L3RoPlxuICAgICAgICAgICAgPHRoIGNsYXNzPVwidGV4dC1lbmRcIj5QcmljZSBQZXIgTW9udGg8L3RoPlxuICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvdGhlYWQ+XG4gICAgICAgIDx0Ym9keT5cbiAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHJvdyBvZiBhbm5leHVyZURhdGE7IHRyYWNrQnk6IHRyYWNrQnlJbmRleFwiPlxuICAgICAgICAgICAgPHRkPnt7IHJvdz8uc3RvcmVOYW1lIH19PC90ZD5cbiAgICAgICAgICAgIDx0ZD57eyByb3c/LnByb2R1Y3ROYW1lIH19PC90ZD5cbiAgICAgICAgICAgIDx0ZD57eyByb3c/LnN0b3JlSWQgfX08L3RkPlxuICAgICAgICAgICAgPHRkPnt7IHJvdz8uZWRnZWZpcnN0RmlsZURhdGUgfX08L3RkPlxuICAgICAgICAgICAgPHRkPnt7IHJvdz8ucGVyaW9kID09PSAncHJvcmF0ZScgPyAnUHJvLXJhdGUnIDogJ0Z1bGwgbW9udGgnIH19PC90ZD5cbiAgICAgICAgICAgIDx0ZD57eyByb3c/LnVuaXRCYXNpcyB8fCAnUGVyIFN0b3JlJyB9fTwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPjxzdHJvbmc+e3sgcm93Py53b3JraW5nZGF5cyB9fTwvc3Ryb25nPjwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPnt7IHJvdz8udW5pdHMgPz8gMSB9fTwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJ0ZXh0LWVuZFwiPlxuICAgICAgICAgICAgICB7eyByb3c/LmN1cnJlbmN5VHlwZSB9fSB7eyBmb3JtYXRJTlIocm93Py5zdGFuZGFyZFByaWNlKSB9fVxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidW5pdC1iYXNpc1wiPnt7IHJvdz8udW5pdEJhc2lzIHx8ICdQZXIgU3RvcmUnIH19PC9kaXY+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwidGV4dC1lbmRcIj48c3Ryb25nPnt7IHJvdz8uY3VycmVuY3lUeXBlIH19IHt7IGZvcm1hdElOUihyb3c/LnJ1bm5pbmdDb3N0KSB9fTwvc3Ryb25nPjwvdGQ+XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgPC90Ym9keT5cbiAgICAgICAgPHRmb290ICpuZ0lmPVwiYW5uZXh1cmVUb3RhbCAhPSBudWxsXCI+XG4gICAgICAgICAgPHRyPlxuICAgICAgICAgICAgPHRkIGNvbHNwYW49XCI5XCIgY2xhc3M9XCJ0ZXh0LWVuZFwiPjxzdHJvbmc+VG90YWw8L3N0cm9uZz48L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwidGV4dC1lbmRcIj48c3Ryb25nPnt7IGFubmV4dXJlRGF0YVswXT8uY3VycmVuY3lUeXBlIH19IHt7IGZvcm1hdElOUihhbm5leHVyZVRvdGFsKSB9fTwvc3Ryb25nPjwvdGQ+XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgPC90Zm9vdD5cbiAgICAgIDwvdGFibGU+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1saW5rXCIgKGNsaWNrKT1cImFjdGl2ZU1vZGFsLmRpc21pc3MoKVwiPkNsb3NlPC9idXR0b24+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5XCIgKGNsaWNrKT1cImRvd25sb2FkUGRmKClcIiBbZGlzYWJsZWRdPVwiZG93bmxvYWRpbmdcIj5cbiAgICAgIDxzcGFuICpuZ0lmPVwiIWRvd25sb2FkaW5nXCI+RG93bmxvYWQgUERGPC9zcGFuPlxuICAgICAgPHNwYW4gKm5nSWY9XCJkb3dubG9hZGluZ1wiPkRvd25sb2FkaW5nLi4uPC9zcGFuPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvZGl2PiJdfQ==
|
|
@@ -81,6 +81,9 @@ export class BillingService {
|
|
|
81
81
|
estimateStatusUpdate(data) {
|
|
82
82
|
return this.http.post(`${this.invoiceApiUrl}/estimate/statusUpdate`, data);
|
|
83
83
|
}
|
|
84
|
+
sendEstimate(estimateId) {
|
|
85
|
+
return this.http.post(`${this.invoiceApiUrl}/estimate/send`, { estimateId });
|
|
86
|
+
}
|
|
84
87
|
deleteEstimate(id) {
|
|
85
88
|
return this.http.delete(`${this.invoiceApiUrl}/estimate/${id}`);
|
|
86
89
|
}
|
|
@@ -303,6 +306,9 @@ export class BillingService {
|
|
|
303
306
|
getInvoiceById(id) {
|
|
304
307
|
return this.http.get(`${this.invoiceApiUrl}/getInvoice/${id}`);
|
|
305
308
|
}
|
|
309
|
+
getInvoiceBankDetails(id) {
|
|
310
|
+
return this.http.get(`${this.invoiceApiUrl}/invoiceBankDetails/${id}`);
|
|
311
|
+
}
|
|
306
312
|
getInvoiceAnnexure(id) {
|
|
307
313
|
return this.http.get(`${this.invoiceApiUrl}/invoiceAnnexure/${id}`);
|
|
308
314
|
}
|
|
@@ -330,4 +336,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
330
336
|
providedIn: 'root'
|
|
331
337
|
}]
|
|
332
338
|
}], ctorParameters: () => [{ type: i1.HttpClient }, { type: i2.GlobalStateService }] });
|
|
333
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmlsbGluZy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tbWFuYWdlLWJpbGxpbmcvc3JjL2xpYi9jb21wb25lbnRzL3NlcnZpY2VzL2JpbGxpbmcuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsVUFBVSxFQUFZLE1BQU0sZUFBZSxDQUFDO0FBQ3JELE9BQU8sRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQThCLE1BQU0sTUFBTSxDQUFDO0FBQ25HLE9BQU8sS0FBSyxTQUFTLE1BQU0sWUFBWSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDOzs7O0FBRTdCLE1BQU0sVUFBVSxHQUFHLGlGQUFpRixDQUFDO0FBQ3JHLE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQztBQU1oQyxNQUFNLE9BQU8sY0FBYztJQVdMO0lBQTBCO0lBVjlDLGFBQWEsQ0FBUTtJQUNyQix5QkFBeUIsQ0FBSztJQUV0QixpQkFBaUIsR0FBRyxJQUFJLGVBQWUsQ0FBVSxLQUFLLENBQUMsQ0FBQztJQUNoRSxXQUFXLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksRUFBRSxDQUFDO0lBRXBELHNCQUFzQixHQUFHLElBQUksZUFBZSxDQUFNLEVBQUMsS0FBSyxFQUFDLElBQUksRUFBRSxJQUFJLEVBQUMsSUFBSSxFQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsQ0FBQyxDQUFBO0lBQ3JGLGVBQWUsR0FBRyxJQUFJLGVBQWUsQ0FBTSxJQUFJLENBQUMsQ0FBQTtJQUNoRCxhQUFhLENBQU07SUFDbkIsbUJBQW1CLENBQU07SUFDekIsWUFBb0IsSUFBZ0IsRUFBVSxFQUFzQjtRQUFoRCxTQUFJLEdBQUosSUFBSSxDQUFZO1FBQVUsT0FBRSxHQUFGLEVBQUUsQ0FBb0I7UUFDbEUsSUFBSSxDQUFDLEVBQUUsQ0FB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LElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEseUJBQXlCLFFBQVEsRUFBRSxDQUFDLENBQUE7SUFDaEYsQ0FBQztJQUNELGlCQUFpQixDQUFDLFFBQWdCO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxzQkFBc0IsUUFBUSxFQUFFLENBQUMsQ0FBQTtJQUM3RSxDQUFDO0lBQ0QsYUFBYSxDQUFDLFNBQWlCO1FBQzdCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxrQkFBa0IsU0FBUyxFQUFFLENBQUMsQ0FBQTtJQUM3RSxDQUFDO3dHQXRVWSxjQUFjOzRHQUFkLGNBQWMsY0FGYixNQUFNOzs0RkFFUCxjQUFjO2tCQUgxQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBFcnJvclJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSxPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCwgdGFrZVVudGlsLCBjYXRjaEVycm9yLCBtYXAsdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0ICogYXMgRmlsZVNhdmVyIGZyb20gJ2ZpbGUtc2F2ZXInO1xuaW1wb3J0ICogYXMgWExTWCBmcm9tICd4bHN4JztcblxuY29uc3QgRVhDRUxfVFlQRSA9ICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldDtjaGFyc2V0PVVURi04JztcbmNvbnN0IEVYQ0VMX0VYVEVOU0lPTiA9ICcueGxzeCc7XG5pbXBvcnQgeyBHbG9iYWxTdGF0ZVNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktZ2xvYmFsJztcbiBcbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEJpbGxpbmdTZXJ2aWNlIHtcbiAgaW52b2ljZUFwaVVybDpzdHJpbmc7XG4gIHBheW1lbnRTdWJzY3JpcHRpb25BcGlVcmw6YW55O1xuXG4gIHByaXZhdGUgcmVsb2FkRGF0YVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVsb2FkRGF0YSQgPSB0aGlzLnJlbG9hZERhdGFTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gIHBheW1lbnRpbnZvaWNlRm9ybURhdGEgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueT4oe3ZhbHVlOm51bGwsIHR5cGU6bnVsbCwgZm9ybTpudWxsfSlcbiAgZHJvcERvd25UcmlnZ2VyID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KG51bGwpXG4gIGJpbGxpbmdBcGlVcmw6IGFueTtcbiAgYnJhbmRzQmlsbGluZ0FwaVVybDogYW55O1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsIHByaXZhdGUgZ3M6IEdsb2JhbFN0YXRlU2VydmljZSkge1xuICAgIHRoaXMuZ3MuZW52aXJvbm1lbnQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoZW52KSA9PiB7XG4gICAgICBpZiAoZW52KSB7XG4gICAgICAgIHRoaXMucGF5bWVudFN1YnNjcmlwdGlvbkFwaVVybCA9IGVudi5wYXltZW50U3Vic2NyaXB0aW9uQXBpVXJsO1xuICAgICAgICB0aGlzLmludm9pY2VBcGlVcmwgPSBlbnYuaW52b2ljZUFwaVVybFxuICAgICAgICB0aGlzLmJpbGxpbmdBcGlVcmwgPSBlbnYuYmlsbGluZ0FwaVVybFxuICAgICAgICB0aGlzLmJyYW5kc0JpbGxpbmdBcGlVcmwgPSBlbnYuYnJhbmRzQmlsbGluZ0FwaVVybFxuXG4gICAgICAgIC8vIHRoaXMuY2xpZW50SWQubmV4dCgnMTEnKVxuICAgICAgfVxuICAgIH0pO1xuICAgIC8vIHRoaXMuZ3Muc2VsZWN0ZWRDbGllbnQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoZTphbnkpPT57XG4gICAgLy8gICBpZihlKXtcbiAgICAvLyAgICAgY29uc29sZS5sb2coZSwnZScpO1xuICAgIC8vICAgfVxuICAgIC8vIH0pXG4gIH1cbiAgdHJpZ2dlclJlbG9hZCgpIHtcbiAgICB0aGlzLnJlbG9hZERhdGFTdWJqZWN0Lm5leHQodHJ1ZSk7XG4gIH1cblxuICBcbiAgcHVibGljIGV4cG9ydEFzRXhjZWxGaWxlKGpzb246IGFueVtdLCBleGNlbEZpbGVOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCB3b3Jrc2hlZXQ6IFhMU1guV29ya1NoZWV0ID0gWExTWC51dGlscy5qc29uX3RvX3NoZWV0KGpzb24pO1xuICAgIGNvbnN0IHdvcmtib29rOiBYTFNYLldvcmtCb29rID0geyBTaGVldHM6IHsgJ2RhdGEnOiB3b3Jrc2hlZXQgfSwgU2hlZXROYW1lczogWydkYXRhJ10gfTtcbiAgICBjb25zdCBleGNlbEJ1ZmZlcjogYW55ID0gWExTWC53cml0ZSh3b3JrYm9vaywgeyBib29rVHlwZTogJ3hsc3gnLCB0eXBlOiAnYXJyYXknIH0pO1xuICAgIHRoaXMuc2F2ZUFzRXhjZWxGaWxlKGV4Y2VsQnVmZmVyLCBleGNlbEZpbGVOYW1lKTtcbiAgfVxuIFxuICBwdWJsaWMgc2F2ZUFzRXhjZWxGaWxlKGJ1ZmZlcjogYW55LCBmaWxlTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgZGF0YTogQmxvYiA9IG5ldyBCbG9iKFtidWZmZXJdLCB7XG4gICAgICB0eXBlOiBFWENFTF9UWVBFXG4gICAgfSk7XG4gICAgRmlsZVNhdmVyLnNhdmVBcyhkYXRhLCBmaWxlTmFtZSArICdsaXN0JysgRVhDRUxfRVhURU5TSU9OKTtcbiAgfVxuIFxuICBwdWJsaWMgc2F2ZUFzVGVtcGxhdGUoYnVmZmVyOiBhbnksIGZpbGVOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBkYXRhOiBCbG9iID0gbmV3IEJsb2IoW2J1ZmZlcl0sIHtcbiAgICAgIHR5cGU6IEVYQ0VMX1RZUEVcbiAgICB9KTtcbiAgICBGaWxlU2F2ZXIuc2F2ZUFzKGRhdGEsIGZpbGVOYW1lICsgRVhDRUxfRVhURU5TSU9OKTtcbiAgfVxuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcblxuLy8gbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4vLyAgIHRoaXMuZGVzdHJveSQubmV4dCh0cnVlKTtcbi8vICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuLy8gfVxuLy8gPT09PT0gRXN0aW1hdGVzIChFc3RpbWF0ZSB0YWIpID09PT09XG5lc3RpbWF0ZUxpc3QoZGF0YTogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGAke3RoaXMuaW52b2ljZUFwaVVybH0vZXN0aW1hdGUvbGlzdGAsIGRhdGEpXG59XG5lc3RpbWF0ZUxpc3RFeHBvcnQoZGF0YTogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGAke3RoaXMuaW52b2ljZUFwaVVybH0vZXN0aW1hdGUvbGlzdGAsIGRhdGEsIHsgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInIH0pXG59XG5jcmVhdGVFc3RpbWF0ZShkYXRhOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xuICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYCR7dGhpcy5pbnZvaWNlQXBpVXJsfS9lc3RpbWF0ZS9jcmVhdGVgLCBkYXRhKVxufVxudXBkYXRlRXN0aW1hdGUoZGF0YTogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGAke3RoaXMuaW52b2ljZUFwaVVybH0vZXN0aW1hdGUvdXBkYXRlYCwgZGF0YSlcbn1cbmdldEVzdGltYXRlKGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICByZXR1cm4gdGhpcy5odHRwLmdldChgJHt0aGlzLmludm9pY2VBcGlVcmx9L2VzdGltYXRlLyR7aWR9YClcbn1cbmVzdGltYXRlU3RhdHVzVXBkYXRlKGRhdGE6IHsgZXN0aW1hdGVJZDogc3RyaW5nOyBzdGF0dXM6IHN0cmluZyB9KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGAke3RoaXMuaW52b2ljZUFwaVVybH0vZXN0aW1hdGUvc3RhdHVzVXBkYXRlYCwgZGF0YSlcbn1cbmRlbGV0ZUVzdGltYXRlKGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICByZXR1cm4gdGhpcy5odHRwLmRlbGV0ZShgJHt0aGlzLmludm9pY2VBcGlVcmx9L2VzdGltYXRlLyR7aWR9YClcbn1cbmRvd25sb2FkRXN0aW1hdGUoaWQ6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XG4gIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLmludm9pY2VBcGlVcmx9L2VzdGltYXRlL2Rvd25sb2FkLyR7aWR9YCwge30sIHsgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInIH0pXG59XG5pbnZvaWNlVGFibGVEYXRhKCBkYXRhOmFueSk6T2JzZXJ2YWJsZTxhbnk+e1xuICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYCR7dGhpcy5pbnZvaWNlQXBpVXJsfS9jbGllbnRJbnZvaWNlTGlzdGAsIGRhdGEpXG59XG51cGRhdGVDbGllbnRGaWx0ZXJzKGZpbHRlcnM6YW55KXtcbiAgdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZS5uZXh0KGZpbHRlcnMpO1xufVxuaW52b2ljZVRhYmxlRGF0YUV4cG9ydCggZGF0YTphbnkpOk9ic2VydmFibGU8YW55PntcbiAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGAke3RoaXMuaW52b2ljZUFwaVVybH0vY2xpZW50SW52b2ljZUxpc3RgLCBkYXRhLCB7cmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInfSlcbn1cbmNsaWVudEJpbGxpbmdJbmZvKHBhcmFtcz86IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gIHJldHVybiB0aGlzLmh0dHBcbiAgICAuZ2V0KGAke3RoaXMucGF5bWVudFN1YnNjcmlwdGlvbkFwaVVybH0vY2xpZW50QmlsbGluZ1N1YnNjcmlwdGlvbkluZm8vJHtwYXJhbXN9YClcbn1cbmludm9pY2VEb3dubG9hZChkYXRhOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xuICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYCR7dGhpcy5pbnZvaWNlQXBpVXJsfS9pbnZvaWNlRG93bmxvYWQvJHtkYXRhLl9pZH1gLCBkYXRhLCB7cmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInfSlcbn1cbmJ1bGtJbnZvaWNlRG93bmxvYWQoZGF0YTogeyBpbnZvaWNlSWRzOiBzdHJpbmdbXSB9KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGAke3RoaXMuaW52b2ljZUFwaVVybH0vaW52b2ljZURvd25sb2FkL2J1bGtgLCBkYXRhLCB7cmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInfSlcbn1cbmFwcHJvdmVJbnZvaWNlQ3NtKGludm9pY2VJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGAke3RoaXMuaW52b2ljZUFwaVVybH0vYXBwcm92ZUludm9pY2VDc21gLCB7IGludm9pY2VJZCB9KVxufVxuYXBwcm92ZUludm9pY2VGaW5hbmNlKGludm9pY2VJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGAke3RoaXMuaW52b2ljZUFwaVVybH0vYXBwcm92ZUludm9pY2VGaW5hbmNlYCwgeyBpbnZvaWNlSWQgfSlcbn1cbmFwcHJvdmVJbnZvaWNlQXBwcm92YWwoaW52b2ljZUlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYCR7dGhpcy5pbnZvaWNlQXBpVXJsfS9hcHByb3ZlSW52b2ljZUFwcHJvdmFsYCwgeyBpbnZvaWNlSWQgfSlcbn1cbmdldEludm9pY2VIZWFkcygpOiBPYnNlcnZhYmxlPGFueT4ge1xuICByZXR1cm4gdGhpcy5odHRwLmdldChgJHt0aGlzLmludm9pY2VBcGlVcmx9L2dldEludm9pY2VIZWFkc2ApXG59XG51cGRhdGVJbnZvaWNlSGVhZHMoZGF0YTogeyByb2xlOiBzdHJpbmc7IGVtYWlsOiBzdHJpbmcgfCBzdHJpbmdbXSB9W10pOiBPYnNlcnZhYmxlPGFueT4ge1xuICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYCR7dGhpcy5pbnZvaWNlQXBpVXJsfS91cGRhdGVJbnZvaWNlSGVhZHNgLCB7IGRhdGEgfSlcbn1cbmludm9pY2VyZWdlcmF0ZShkYXRhOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xuICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYCR7dGhpcy5pbnZvaWNlQXBpVXJsfS9yZWdlcmF0ZUludm9pY2VgLCBkYXRhKVxufVxuXG5wYXltZW50U3RhdHVzQ2hhbmdlKGRhdGE6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLmludm9pY2VBcGlVcmx9L3BheW1lbnRTdGF0dXNDaGFuZ2VgLCBkYXRhKVxufVxuXG4vLyBSZWNvcmQgYSBmdWxsIG9yIHBhcnRpYWwgcGF5bWVudCBhZ2FpbnN0IGFuIGludm9pY2UuIFNlcnZlciBhcHBlbmRzIHRvXG4vLyBwYXltZW50SGlzdG9yeSwgaW5jcmVtZW50cyBwYWlkQW1vdW50LCBhbmQgcmVjb21wdXRlcyBwYXltZW50U3RhdHVzXG4vLyAodW5wYWlkL3BhcnRpYWwvcGFpZCkuIFJldHVybnMgeyBwYWlkQW1vdW50LCBwZW5kaW5nQW1vdW50LCBwYXltZW50U3RhdHVzIH0uXG5yZWNvcmRQYXltZW50KGRhdGE6IHtcbiAgaW52b2ljZUlkOiBzdHJpbmc7XG4gIGFtb3VudDogbnVtYmVyO1xuICBkYXRlPzogc3RyaW5nIHwgRGF0ZTtcbiAgbWV0aG9kPzogc3RyaW5nO1xuICByZWZlcmVuY2U/OiBzdHJpbmc7XG4gIG5vdGVzPzogc3RyaW5nO1xufSk6IE9ic2VydmFibGU8YW55PiB7XG4gIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLmludm9pY2VBcGlVcmx9L3JlY29yZFBheW1lbnRgLCBkYXRhKTtcbn1cbmludm9pY2VTZW50KGRhdGE6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLmludm9pY2VBcGlVcmx9L2ludm9pY2VEb3dubG9hZC8ke2RhdGEuX2lkfWAsIGRhdGEpXG59XG5nZXRpbnZvaWNlKGlkPzogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoYCR7dGhpcy5wYXltZW50U3Vic2NyaXB0aW9uQXBpVXJsfS9jcmVkaXROb3Rlcy9pbnZvaWNlTGlzdC8ke2lkfWApXG59XG50cmFuc2FjdGlvbkxpc3QoZGF0YT86IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLmludm9pY2VBcGlVcmx9L2NyZWRpdFRyYW5zYWN0aW9ubGlzdGAsZGF0YSlcbn1cbnRyYW5zYWN0aW9uVGFibGVFeHBvcnQoZGF0YT86IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLmludm9pY2VBcGlVcmx9L2NyZWRpdFRyYW5zYWN0aW9ubGlzdGAsZGF0YSx7cmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInfSlcbn1cbmNyZWRpdG5vdGV1cGRhdGUoIGRhdGE6YW55KTpPYnNlcnZhYmxlPGFueT57XG4gIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLnBheW1lbnRTdWJzY3JpcHRpb25BcGlVcmx9L2NyZWRpdE5vdGVzYCwgZGF0YSlcbn1cbmFwcGx5RGlzY291bnQoIGRhdGE6YW55KTpPYnNlcnZhYmxlPGFueT57XG4gIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLmludm9pY2VBcGlVcmx9L2FwcGx5RGlzY291bnRgLCBkYXRhKVxufVxub25lVGltZUZlZSggZGF0YTphbnksaW52b2ljZUlkOmFueSk6T2JzZXJ2YWJsZTxhbnk+e1xuICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYCR7dGhpcy5iaWxsaW5nQXBpVXJsfS9vbmV0aW1lLXBheW1lbnQvJHtpbnZvaWNlSWR9YCwgZGF0YSlcbn1cbnBlbmRpbmdJbnZvaWNlcyhkYXRhOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xuICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYCR7dGhpcy5pbnZvaWNlQXBpVXJsfS9wZW5kaW5nSW52b2ljZXNgLCBkYXRhKVxufVxuYnJhbmRzQmlsbGluZ0xpc3QoZGF0YTogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGAke3RoaXMuYnJhbmRzQmlsbGluZ0FwaVVybH0vYnJhbmRzQmlsbGluZ0xpc3RgLCBkYXRhKVxufVxuYnJhbmRzQmlsbGluZ0xpc3RFeHBvcnQoZGF0YTogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGAke3RoaXMuYnJhbmRzQmlsbGluZ0FwaVVybH0vYnJhbmRzQmlsbGluZ0xpc3RgLCBkYXRhLCB7cmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInfSlcbn1cbmJyYW5kSW52b2ljZUxpc3QoZGF0YTogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGAke3RoaXMuYnJhbmRzQmlsbGluZ0FwaVVybH0vYnJhbmRJbnZvaWNlTGlzdGAsIGRhdGEpXG59XG5icmFuZEludm9pY2VMaXN0RXhwb3J0KGRhdGE6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLmJyYW5kc0JpbGxpbmdBcGlVcmx9L2JyYW5kSW52b2ljZUxpc3RgLCBkYXRhLCB7cmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInfSlcbn1cbmxhdGVzdERhaWx5UHJpY2luZyhkYXRhOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xuICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYCR7dGhpcy5icmFuZHNCaWxsaW5nQXBpVXJsfS9sYXRlc3REYWlseVByaWNpbmdgLCBkYXRhKVxufVxubGF0ZXN0RGFpbHlQcmljaW5nRXhwb3J0KGRhdGE6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLmJyYW5kc0JpbGxpbmdBcGlVcmx9L2xhdGVzdERhaWx5UHJpY2luZ2AsIGRhdGEsIHtyZXNwb25zZVR5cGU6ICdhcnJheWJ1ZmZlcid9KVxufVxuYnJhbmRCaWxsaW5nR3JvdXBzKGRhdGE6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLmJyYW5kc0JpbGxpbmdBcGlVcmx9L2JyYW5kQmlsbGluZ0dyb3Vwc2AsIGRhdGEpXG59XG5icmFuZEJpbGxpbmdHcm91cHNFeHBvcnQoZGF0YTogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGAke3RoaXMuYnJhbmRzQmlsbGluZ0FwaVVybH0vYnJhbmRCaWxsaW5nR3JvdXBzYCwgZGF0YSwge3Jlc3BvbnNlVHlwZTogJ2FycmF5YnVmZmVyJ30pXG59XG5idWxrRG93bmxvYWRCaWxsaW5nR3JvdXBzKGNsaWVudElkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHsgY2xpZW50SWQgfSk7XG4gIHJldHVybiB0aGlzLmh0dHAuZ2V0KGAke3RoaXMuYnJhbmRzQmlsbGluZ0FwaVVybH0vYnVsay1kb3dubG9hZC1iaWxsaW5nLWdyb3Vwcz8ke3BhcmFtcy50b1N0cmluZygpfWAsIHtyZXNwb25zZVR5cGU6ICdhcnJheWJ1ZmZlcid9KVxufVxuYnVsa1VwZGF0ZUJpbGxpbmdHcm91cHMoZmlsZTogRmlsZSwgY2xpZW50SWQ6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XG4gIC8vIFJlYWQgdGhlIGZpbGUgYXMgYmFzZTY0IGFuZCBQT1NUIGFzIEpTT04uIE11bHRpcGFydC9mb3JtLWRhdGEgd2FzIGhpdHRpbmdcbiAgLy8gbXVsdGVyIFwiVW5leHBlY3RlZCBlbmQgb2YgZm9ybVwiIGVycm9yczsgc3dpdGNoaW5nIHRvIEpTT04gc2lkZXN0ZXBzIHRoZVxuICAvLyBtdWx0ZXIgcGlwZWxpbmUgZW50aXJlbHkuIEJvZHktcGFyc2VyIGlzIGFscmVhZHkgY29uZmlndXJlZCBhdCA1MDBNQi5cbiAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKChzdWJzY3JpYmVyKSA9PiB7XG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICByZWFkZXIub25lcnJvciA9ICgpID0+IHN1YnNjcmliZXIuZXJyb3IocmVhZGVyLmVycm9yKTtcbiAgICByZWFkZXIub25sb2FkID0gKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gcmVhZGVyLnJlc3VsdCBhcyBzdHJpbmc7XG4gICAgICAvLyBkYXRhVVJMIGlzIFwiZGF0YTo8bWltZT47YmFzZTY0LDxwYXlsb2FkPlwiIOKAlCBzdHJpcCB0aGUgcHJlZml4LlxuICAgICAgY29uc3QgYmFzZTY0ID0gcmVzdWx0LmluY2x1ZGVzKCcsJykgPyByZXN1bHQuc3BsaXQoJywnKVsxXSA6IHJlc3VsdDtcbiAgICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICAgIGNsaWVudElkLFxuICAgICAgICBmaWxlbmFtZTogZmlsZS5uYW1lLFxuICAgICAgICBmaWxlQmFzZTY0OiBiYXNlNjQsXG4gICAgICB9O1xuICAgICAgdGhpcy5odHRwLnBvc3QoYCR7dGhpcy5icmFuZHNCaWxsaW5nQXBpVXJsfS9idWxrLXVwZGF0ZS1iaWxsaW5nLWdyb3Vwc2AsIHBheWxvYWQpLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChyZXMpID0+IHsgc3Vic2NyaWJlci5uZXh0KHJlcyk7IHN1YnNjcmliZXIuY29tcGxldGUoKTsgfSxcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHN1YnNjcmliZXIuZXJyb3IoZXJyKSxcbiAgICAgIH0pO1xuICAgIH07XG4gICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XG4gIH0pO1xufVxuLy8gPT09PT0gQmFuay1zdGF0ZW1lbnQgcmVjb25jaWxpYXRpb24gKFRyYW5zYWN0aW9ucyB0YWIpID09PT09XG51cGxvYWRCYW5rU3RhdGVtZW50KGZpbGU6IEZpbGUpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAvLyBUaGUgc2hlZXQgaXMgcGFyc2VkIGhlcmUgd2l0aCBTaGVldEpTIGFuZCBQT1NUZWQgYXMgSlNPTiByb3dzIOKAlCB0aGUgQVBJXG4gIC8vIG5ldmVyIHJlY2VpdmVzIGZpbGUgYnl0ZXM7IGl0IHZhbGlkYXRlcyBhbmQgY2xhc3NpZmllcyB0aGUgcm93cy5cbiAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKChzdWJzY3JpYmVyKSA9PiB7XG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICByZWFkZXIub25lcnJvciA9ICgpID0+IHN1YnNjcmliZXIuZXJyb3IocmVhZGVyLmVycm9yKTtcbiAgICByZWFkZXIub25sb2FkID0gKCkgPT4ge1xuICAgICAgbGV0IHJvd3M6IGFueVtdO1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gcmF3OnRydWUga2VlcHMgQ1NWIGNlbGxzIGFzIHBsYWluIHRleHQ6IHdpdGhvdXQgaXQgJzAxLzA0LzI2J1xuICAgICAgICAvLyAoMSBBcHIsIEREL01NKSBpcyBjb2VyY2VkIHRvIGEgSmFuLTQgZGF0ZSBjZWxsIChVUyBNTS9ERCkgd2hpbGVcbiAgICAgICAgLy8gJzE4LzA0LzI2JyBzdGF5cyB0ZXh0IOKAlCBzaWxlbnRseSBjb3JydXB0aW5nIG1peGVkIGRhdGVzLlxuICAgICAgICAvLyBTaGVldEpTIHR5cGU6J2FycmF5JyBleHBlY3RzIGEgYnl0ZSBhcnJheSAoVWludDhBcnJheSksIG5vdCB0aGUgcmF3XG4gICAgICAgIC8vIEFycmF5QnVmZmVyIEZpbGVSZWFkZXIgcmV0dXJucyDigJQgcGFzc2luZyB0aGUgQXJyYXlCdWZmZXIgbWFrZXMgLnhsc3hcbiAgICAgICAgLy8gcGFyc2UgdG8gYW4gZW1wdHkgd29ya2Jvb2sgYW5kIHRoZSB1cGxvYWQgXCJmYWlsc1wiLlxuICAgICAgICBjb25zdCBkYXRhID0gbmV3IFVpbnQ4QXJyYXkocmVhZGVyLnJlc3VsdCBhcyBBcnJheUJ1ZmZlcik7XG4gICAgICAgIGNvbnN0IHdiID0gWExTWC5yZWFkKGRhdGEsIHsgdHlwZTogJ2FycmF5JywgcmF3OiB0cnVlIH0pO1xuICAgICAgICBjb25zdCBzaGVldCA9IHdiLlNoZWV0c1t3Yi5TaGVldE5hbWVzWzBdXTtcbiAgICAgICAgcm93cyA9IFhMU1gudXRpbHMuc2hlZXRfdG9fanNvbihzaGVldCwgeyBoZWFkZXI6IDEsIGRlZnZhbDogJycsIHJhdzogZmFsc2UgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHN1YnNjcmliZXIuZXJyb3IoeyBlcnJvcjogeyBtZXNzYWdlOiAnRmFpbGVkIHRvIHBhcnNlIHRoZSBzdGF0ZW1lbnQgZmlsZScgfSB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgcGF5bG9hZCA9IHsgZmlsZU5hbWU6IGZpbGUubmFtZSwgcm93cyB9O1xuICAgICAgdGhpcy5odHRwLnBvc3QoYCR7dGhpcy5pbnZvaWNlQXBpVXJsfS9iYW5rU3RhdGVtZW50L3VwbG9hZGAsIHBheWxvYWQpLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChyZXMpID0+IHsgc3Vic2NyaWJlci5uZXh0KHJlcyk7IHN1YnNjcmliZXIuY29tcGxldGUoKTsgfSxcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHN1YnNjcmliZXIuZXJyb3IoZXJyKSxcbiAgICAgIH0pO1xuICAgIH07XG4gICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGZpbGUpO1xuICB9KTtcbn1cbmJhbmtUcmFuc2FjdGlvbkxpc3QoZmlsdGVyczogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGAke3RoaXMuaW52b2ljZUFwaVVybH0vYmFua1N0YXRlbWVudC9saXN0YCwgZmlsdGVycylcbn1cbmJhbmtSZXNvbHZlT3B0aW9ucygpOiBPYnNlcnZhYmxlPGFueT4ge1xuICByZXR1cm4gdGhpcy5odHRwLmdldChgJHt0aGlzLmludm9pY2VBcGlVcmx9L2JhbmtTdGF0ZW1lbnQvcmVzb2x2ZU9wdGlvbnNgKVxufVxuYmlsbGluZ1N1bW1hcnkoZmlsdGVycz86IHsgY3NtPzogc3RyaW5nOyBwcm9kdWN0Pzogc3RyaW5nOyB2YXJpYW5jZT86IHN0cmluZzsgc2VhcmNoPzogc3RyaW5nIH0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAvLyBQT1NUIHNvIGZpbHRlcnMgdHJhdmVsIGluIHRoZSBib2R5IOKAlCBhdm9pZHMgYW55IHF1ZXJ5LXN0cmluZyBzdHJpcHBpbmcgL1xuICAvLyBjYWNoaW5nIGFuZCBtYXRjaGVzIGhvdyB0aGUgb3RoZXIgYmlsbGluZyBsaXN0IGVuZHBvaW50cyBzZW5kIGZpbHRlcnMuXG4gIGNvbnN0IGJvZHkgPSB7XG4gICAgY3NtOiBmaWx0ZXJzPy5jc20gJiYgZmlsdGVycy5jc20gIT09ICdBbGwnID8gZmlsdGVycy5jc20gOiAnJyxcbiAgICBwcm9kdWN0OiBmaWx0ZXJzPy5wcm9kdWN0ICYmIGZpbHRlcnMucHJvZHVjdCAhPT0gJ0FsbCcgPyBmaWx0ZXJzLnByb2R1Y3QgOiAnJyxcbiAgICB2YXJpYW5jZTogZmlsdGVycz8udmFyaWFuY2UgJiYgZmlsdGVycy52YXJpYW5jZSAhPT0gJ0FsbCcgPyBmaWx0ZXJzLnZhcmlhbmNlIDogJycsXG4gICAgc2VhcmNoOiBmaWx0ZXJzPy5zZWFyY2ggfHwgJycsXG4gIH07XG4gIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLmJyYW5kc0JpbGxpbmdBcGlVcmx9L2JpbGxpbmdTdW1tYXJ5YCwgYm9keSlcbn1cbmJhbmtSZXNvbHZlVHJhbnNhY3Rpb24oZGF0YTogeyB0eG5JZDogc3RyaW5nOyBhY3Rpb246IHN0cmluZzsgaW52b2ljZUlkPzogc3RyaW5nOyBjbGllbnRJZD86IHN0cmluZzsgY2xpZW50TmFtZT86IHN0cmluZyB9KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGAke3RoaXMuaW52b2ljZUFwaVVybH0vYmFua1N0YXRlbWVudC9yZXNvbHZlYCwgZGF0YSlcbn1cbmdldEFsbEJpbGxpbmdHcm91cHMoY2xpZW50SWQ6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XG4gIHJldHVybiB0aGlzLmh0dHAuZ2V0KGAke3RoaXMuYmlsbGluZ0FwaVVybH0vZ2V0LWFsbC1iaWxsaW5nLWdyb3Vwcz9jbGllbnRJZD0ke2NsaWVudElkfWApXG59XG4vLyA9PT09PSBQYXltZW50IFJlbWluZGVycyAoQmlsbGluZyBTZXR0aW5ncykgPT09PT1cbmdldFBheW1lbnRSZW1pbmRlcihjbGllbnRJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoYCR7dGhpcy5iaWxsaW5nQXBpVXJsfS9wYXltZW50LXJlbWluZGVyLyR7Y2xpZW50SWR9YClcbn1cbnNhdmVQYXltZW50UmVtaW5kZXIoZGF0YTogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGAke3RoaXMuYmlsbGluZ0FwaVVybH0vcGF5bWVudC1yZW1pbmRlcmAsIGRhdGEpXG59XG5nZXRTdWJzY3JpYmVkU3RvcmVzKGRhdGE6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLmJpbGxpbmdBcGlVcmx9L2dldC1zdWJzY3JpYmVkLXN0b3JlLWxpc3RgLCBkYXRhKVxufVxuY3JlYXRlQmlsbGluZ0dyb3VwKGRhdGE6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLmJpbGxpbmdBcGlVcmx9L2NyZWF0ZS1ncm91cGAsIGRhdGEpXG59XG51cGRhdGVCaWxsaW5nR3JvdXAoZGF0YTogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgcmV0dXJuIHRoaXMuaHR0cC5wdXQoYCR7dGhpcy5iaWxsaW5nQXBpVXJsfS91cGRhdGUtZ3JvdXBgLCBkYXRhKVxufVxuZGVsZXRlQmlsbGluZ0dyb3VwKGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICByZXR1cm4gdGhpcy5odHRwLmRlbGV0ZShgJHt0aGlzLmJpbGxpbmdBcGlVcmx9L2RlbGV0ZS1ncm91cD9faWQ9JHtpZH1gKVxufVxuXG4vLyBHU1RJTiBhZGRyZXNzIGxvb2t1cC4gQ3VycmVudGx5IHRoZSBiYWNrZW5kIHJldHVybnMgYSBkZXRlcm1pbmlzdGljIG1vY2tcbi8vIGJhc2VkIG9uIHRoZSBHU1RJTiBzdGF0ZS1jb2RlIHByZWZpeC4gV2hlbiB3aXJlZCB0byBhIHJlYWwgcHJvdmlkZXIsIHRoZVxuLy8gcmVzcG9uc2Ugc2hhcGUgc3RheXMgdGhlIHNhbWUgc28gY2FsbGVycyBkb24ndCBuZWVkIHRvIGNoYW5nZS5cbmxvb2t1cEdzdGluKGdzdGluOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICByZXR1cm4gdGhpcy5odHRwLmdldChgJHt0aGlzLmJpbGxpbmdBcGlVcmx9L2dzdC1sb29rdXAvJHtlbmNvZGVVUklDb21wb25lbnQoZ3N0aW4pfWApXG59XG51cGRhdGVEYWlseVByaWNpbmdXb3JraW5nRGF5cyhkYXRhOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xuICByZXR1cm4gdGhpcy5odHRwLnB1dChgJHt0aGlzLmJyYW5kc0JpbGxpbmdBcGlVcmx9L3VwZGF0ZURhaWx5UHJpY2luZ1dvcmtpbmdEYXlzYCwgZGF0YSlcbn1cbnVwZGF0ZURhaWx5UHJpY2luZ1N0b3JlRmllbGQoZGF0YTogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgcmV0dXJuIHRoaXMuaHR0cC5wdXQoYCR7dGhpcy5icmFuZHNCaWxsaW5nQXBpVXJsfS91cGRhdGVEYWlseVByaWNpbmdTdG9yZUZpZWxkYCwgZGF0YSlcbn1cbmdldENsaWVudEJpbGxpbmdJbmZvKGRhdGE6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLmJyYW5kc0JpbGxpbmdBcGlVcmx9L2dldENsaWVudEJpbGxpbmdJbmZvYCwgZGF0YSlcbn1cbmdldEludm9pY2VCeUlkKGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICByZXR1cm4gdGhpcy5odHRwLmdldChgJHt0aGlzLmludm9pY2VBcGlVcmx9L2dldEludm9pY2UvJHtpZH1gKVxufVxuZ2V0SW52b2ljZUFubmV4dXJlKGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICByZXR1cm4gdGhpcy5odHRwLmdldChgJHt0aGlzLmludm9pY2VBcGlVcmx9L2ludm9pY2VBbm5leHVyZS8ke2lkfWApXG59XG51cGRhdGVJbnZvaWNlKGRhdGE6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gIHJldHVybiB0aGlzLmh0dHAucHV0KGAke3RoaXMuaW52b2ljZUFwaVVybH0vdXBkYXRlSW52b2ljZWAsIGRhdGEpXG59XG5jcmVhdGVJbnZvaWNlKGRhdGE6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLmludm9pY2VBcGlVcmx9L2NyZWF0ZUludm9pY2VgLCBkYXRhKVxufVxuZ2V0Q2xpZW50QmFzZVByaWNpbmcoY2xpZW50SWQ6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XG4gIHJldHVybiB0aGlzLmh0dHAuZ2V0KGAke3RoaXMuaW52b2ljZUFwaVVybH0vZ2V0Q2xpZW50QmFzZVByaWNpbmcvJHtjbGllbnRJZH1gKVxufVxuZ2V0Q2xpZW50UHJvZHVjdHMoY2xpZW50SWQ6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XG4gIHJldHVybiB0aGlzLmh0dHAuZ2V0KGAke3RoaXMuYmlsbGluZ0FwaVVybH0vZ2V0Q2xpZW50UHJvZHVjdHMvJHtjbGllbnRJZH1gKVxufVxuZGVsZXRlSW52b2ljZShpbnZvaWNlSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XG4gIHJldHVybiB0aGlzLmh0dHAuZGVsZXRlKGAke3RoaXMuaW52b2ljZUFwaVVybH0vZGVsZXRlSW52b2ljZS8ke2ludm9pY2VJZH1gKVxufVxuXG59XG4iXX0=
|
|
339
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmlsbGluZy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tbWFuYWdlLWJpbGxpbmcvc3JjL2xpYi9jb21wb25lbnRzL3NlcnZpY2VzL2JpbGxpbmcuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsVUFBVSxFQUFZLE1BQU0sZUFBZSxDQUFDO0FBQ3JELE9BQU8sRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQThCLE1BQU0sTUFBTSxDQUFDO0FBQ25HLE9BQU8sS0FBSyxTQUFTLE1BQU0sWUFBWSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDOzs7O0FBRTdCLE1BQU0sVUFBVSxHQUFHLGlGQUFpRixDQUFDO0FBQ3JHLE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQztBQU1oQyxNQUFNLE9BQU8sY0FBYztJQVdMO0lBQTBCO0lBVjlDLGFBQWEsQ0FBUTtJQUNyQix5QkFBeUIsQ0FBSztJQUV0QixpQkFBaUIsR0FBRyxJQUFJLGVBQWUsQ0FBVSxLQUFLLENBQUMsQ0FBQztJQUNoRSxXQUFXLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksRUFBRSxDQUFDO0lBRXBELHNCQUFzQixHQUFHLElBQUksZUFBZSxDQUFNLEVBQUMsS0FBSyxFQUFDLElBQUksRUFBRSxJQUFJLEVBQUMsSUFBSSxFQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsQ0FBQyxDQUFBO0lBQ3JGLGVBQWUsR0FBRyxJQUFJLGVBQWUsQ0FBTSxJQUFJLENBQUMsQ0FBQTtJQUNoRCxhQUFhLENBQU07SUFDbkIsbUJBQW1CLENBQU07SUFDekIsWUFBb0IsSUFBZ0IsRUFBVSxFQUFzQjtRQUFoRCxTQUFJLEdBQUosSUFBSSxDQUFZO1FBQVUsT0FBRSxHQUFGLEVBQUUsQ0FBb0I7UUFDbEUsSUFBSSxDQUFDLEVBQUUsQ0FB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UUFDckIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLGdCQUFnQixFQUFFLElBQUksQ0FBQyxDQUFBO0lBQ25FLENBQUM7SUFDRCxhQUFhLENBQUMsSUFBUztRQUNyQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDcEUsQ0FBQztJQUNELG9CQUFvQixDQUFDLFFBQWdCO1FBQ25DLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSx5QkFBeUIsUUFBUSxFQUFFLENBQUMsQ0FBQTtJQUNoRixDQUFDO0lBQ0QsaUJBQWlCLENBQUMsUUFBZ0I7UUFDaEMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLHNCQUFzQixRQUFRLEVBQUUsQ0FBQyxDQUFBO0lBQzdFLENBQUM7SUFDRCxhQUFhLENBQUMsU0FBaUI7UUFDN0IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLGtCQUFrQixTQUFTLEVBQUUsQ0FBQyxDQUFBO0lBQzdFLENBQUM7d0dBNVVZLGNBQWM7NEdBQWQsY0FBYyxjQUZiLE1BQU07OzRGQUVQLGNBQWM7a0JBSDFCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEVycm9yUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBJbmplY3RhYmxlLE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBTdWJqZWN0LCB0YWtlVW50aWwsIGNhdGNoRXJyb3IsIG1hcCx0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgKiBhcyBGaWxlU2F2ZXIgZnJvbSAnZmlsZS1zYXZlcic7XG5pbXBvcnQgKiBhcyBYTFNYIGZyb20gJ3hsc3gnO1xuXG5jb25zdCBFWENFTF9UWVBFID0gJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0O2NoYXJzZXQ9VVRGLTgnO1xuY29uc3QgRVhDRUxfRVhURU5TSU9OID0gJy54bHN4JztcbmltcG9ydCB7IEdsb2JhbFN0YXRlU2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1nbG9iYWwnO1xuIFxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgQmlsbGluZ1NlcnZpY2Uge1xuICBpbnZvaWNlQXBpVXJsOnN0cmluZztcbiAgcGF5bWVudFN1YnNjcmlwdGlvbkFwaVVybDphbnk7XG5cbiAgcHJpdmF0ZSByZWxvYWREYXRhU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWxvYWREYXRhJCA9IHRoaXMucmVsb2FkRGF0YVN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgcGF5bWVudGludm9pY2VGb3JtRGF0YSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55Pih7dmFsdWU6bnVsbCwgdHlwZTpudWxsLCBmb3JtOm51bGx9KVxuICBkcm9wRG93blRyaWdnZXIgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueT4obnVsbClcbiAgYmlsbGluZ0FwaVVybDogYW55O1xuICBicmFuZHNCaWxsaW5nQXBpVXJsOiBhbnk7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cDogSHR0cENsaWVudCwgcHJpdmF0ZSBnczogR2xvYmFsU3RhdGVTZXJ2aWNlKSB7XG4gICAgdGhpcy5ncy5lbnZpcm9ubWVudC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKChlbnYpID0+IHtcbiAgICAgIGlmIChlbnYpIHtcbiAgICAgICAgdGhpcy5wYXltZW50U3Vic2NyaXB0aW9uQXBpVXJsID0gZW52LnBheW1lbnRTdWJzY3JpcHRpb25BcGlVcmw7XG4gICAgICAgIHRoaXMuaW52b2ljZUFwaVVybCA9IGVudi5pbnZvaWNlQXBpVXJsXG4gICAgICAgIHRoaXMuYmlsbGluZ0FwaVVybCA9IGVudi5iaWxsaW5nQXBpVXJsXG4gICAgICAgIHRoaXMuYnJhbmRzQmlsbGluZ0FwaVVybCA9IGVudi5icmFuZHNCaWxsaW5nQXBpVXJsXG5cbiAgICAgICAgLy8gdGhpcy5jbGllbnRJZC5uZXh0KCcxMScpXG4gICAgICB9XG4gICAgfSk7XG4gICAgLy8gdGhpcy5ncy5zZWxlY3RlZENsaWVudC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKChlOmFueSk9PntcbiAgICAvLyAgIGlmKGUpe1xuICAgIC8vICAgICBjb25zb2xlLmxvZyhlLCdlJyk7XG4gICAgLy8gICB9XG4gICAgLy8gfSlcbiAgfVxuICB0cmlnZ2VyUmVsb2FkKCkge1xuICAgIHRoaXMucmVsb2FkRGF0YVN1YmplY3QubmV4dCh0cnVlKTtcbiAgfVxuXG4gIFxuICBwdWJsaWMgZXhwb3J0QXNFeGNlbEZpbGUoanNvbjogYW55W10sIGV4Y2VsRmlsZU5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHdvcmtzaGVldDogWExTWC5Xb3JrU2hlZXQgPSBYTFNYLnV0aWxzLmpzb25fdG9fc2hlZXQoanNvbik7XG4gICAgY29uc3Qgd29ya2Jvb2s6IFhMU1guV29ya0Jvb2sgPSB7IFNoZWV0czogeyAnZGF0YSc6IHdvcmtzaGVldCB9LCBTaGVldE5hbWVzOiBbJ2RhdGEnXSB9O1xuICAgIGNvbnN0IGV4Y2VsQnVmZmVyOiBhbnkgPSBYTFNYLndyaXRlKHdvcmtib29rLCB7IGJvb2tUeXBlOiAneGxzeCcsIHR5cGU6ICdhcnJheScgfSk7XG4gICAgdGhpcy5zYXZlQXNFeGNlbEZpbGUoZXhjZWxCdWZmZXIsIGV4Y2VsRmlsZU5hbWUpO1xuICB9XG4gXG4gIHB1YmxpYyBzYXZlQXNFeGNlbEZpbGUoYnVmZmVyOiBhbnksIGZpbGVOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBkYXRhOiBCbG9iID0gbmV3IEJsb2IoW2J1ZmZlcl0sIHtcbiAgICAgIHR5cGU6IEVYQ0VMX1RZUEVcbiAgICB9KTtcbiAgICBGaWxlU2F2ZXIuc2F2ZUFzKGRhdGEsIGZpbGVOYW1lICsgJ2xpc3QnKyBFWENFTF9FWFRFTlNJT04pO1xuICB9XG4gXG4gIHB1YmxpYyBzYXZlQXNUZW1wbGF0ZShidWZmZXI6IGFueSwgZmlsZU5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGRhdGE6IEJsb2IgPSBuZXcgQmxvYihbYnVmZmVyXSwge1xuICAgICAgdHlwZTogRVhDRUxfVFlQRVxuICAgIH0pO1xuICAgIEZpbGVTYXZlci5zYXZlQXMoZGF0YSwgZmlsZU5hbWUgKyBFWENFTF9FWFRFTlNJT04pO1xuICB9XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQgPSBuZXcgU3ViamVjdCgpO1xuXG4vLyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbi8vICAgdGhpcy5kZXN0cm95JC5uZXh0KHRydWUpO1xuLy8gICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4vLyB9XG4vLyA9PT09PSBFc3RpbWF0ZXMgKEVzdGltYXRlIHRhYikgPT09PT1cbmVzdGltYXRlTGlzdChkYXRhOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xuICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYCR7dGhpcy5pbnZvaWNlQXBpVXJsfS9lc3RpbWF0ZS9saXN0YCwgZGF0YSlcbn1cbmVzdGltYXRlTGlzdEV4cG9ydChkYXRhOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xuICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYCR7dGhpcy5pbnZvaWNlQXBpVXJsfS9lc3RpbWF0ZS9saXN0YCwgZGF0YSwgeyByZXNwb25zZVR5cGU6ICdhcnJheWJ1ZmZlcicgfSlcbn1cbmNyZWF0ZUVzdGltYXRlKGRhdGE6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLmludm9pY2VBcGlVcmx9L2VzdGltYXRlL2NyZWF0ZWAsIGRhdGEpXG59XG51cGRhdGVFc3RpbWF0ZShkYXRhOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xuICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYCR7dGhpcy5pbnZvaWNlQXBpVXJsfS9lc3RpbWF0ZS91cGRhdGVgLCBkYXRhKVxufVxuZ2V0RXN0aW1hdGUoaWQ6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XG4gIHJldHVybiB0aGlzLmh0dHAuZ2V0KGAke3RoaXMuaW52b2ljZUFwaVVybH0vZXN0aW1hdGUvJHtpZH1gKVxufVxuZXN0aW1hdGVTdGF0dXNVcGRhdGUoZGF0YTogeyBlc3RpbWF0ZUlkOiBzdHJpbmc7IHN0YXR1czogc3RyaW5nIH0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYCR7dGhpcy5pbnZvaWNlQXBpVXJsfS9lc3RpbWF0ZS9zdGF0dXNVcGRhdGVgLCBkYXRhKVxufVxuc2VuZEVzdGltYXRlKGVzdGltYXRlSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XG4gIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLmludm9pY2VBcGlVcmx9L2VzdGltYXRlL3NlbmRgLCB7IGVzdGltYXRlSWQgfSlcbn1cbmRlbGV0ZUVzdGltYXRlKGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICByZXR1cm4gdGhpcy5odHRwLmRlbGV0ZShgJHt0aGlzLmludm9pY2VBcGlVcmx9L2VzdGltYXRlLyR7aWR9YClcbn1cbmRvd25sb2FkRXN0aW1hdGUoaWQ6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XG4gIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLmludm9pY2VBcGlVcmx9L2VzdGltYXRlL2Rvd25sb2FkLyR7aWR9YCwge30sIHsgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInIH0pXG59XG5pbnZvaWNlVGFibGVEYXRhKCBkYXRhOmFueSk6T2JzZXJ2YWJsZTxhbnk+e1xuICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYCR7dGhpcy5pbnZvaWNlQXBpVXJsfS9jbGllbnRJbnZvaWNlTGlzdGAsIGRhdGEpXG59XG51cGRhdGVDbGllbnRGaWx0ZXJzKGZpbHRlcnM6YW55KXtcbiAgdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZS5uZXh0KGZpbHRlcnMpO1xufVxuaW52b2ljZVRhYmxlRGF0YUV4cG9ydCggZGF0YTphbnkpOk9ic2VydmFibGU8YW55PntcbiAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGAke3RoaXMuaW52b2ljZUFwaVVybH0vY2xpZW50SW52b2ljZUxpc3RgLCBkYXRhLCB7cmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInfSlcbn1cbmNsaWVudEJpbGxpbmdJbmZvKHBhcmFtcz86IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gIHJldHVybiB0aGlzLmh0dHBcbiAgICAuZ2V0KGAke3RoaXMucGF5bWVudFN1YnNjcmlwdGlvbkFwaVVybH0vY2xpZW50QmlsbGluZ1N1YnNjcmlwdGlvbkluZm8vJHtwYXJhbXN9YClcbn1cbmludm9pY2VEb3dubG9hZChkYXRhOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xuICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYCR7dGhpcy5pbnZvaWNlQXBpVXJsfS9pbnZvaWNlRG93bmxvYWQvJHtkYXRhLl9pZH1gLCBkYXRhLCB7cmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInfSlcbn1cbmJ1bGtJbnZvaWNlRG93bmxvYWQoZGF0YTogeyBpbnZvaWNlSWRzOiBzdHJpbmdbXSB9KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGAke3RoaXMuaW52b2ljZUFwaVVybH0vaW52b2ljZURvd25sb2FkL2J1bGtgLCBkYXRhLCB7cmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInfSlcbn1cbmFwcHJvdmVJbnZvaWNlQ3NtKGludm9pY2VJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGAke3RoaXMuaW52b2ljZUFwaVVybH0vYXBwcm92ZUludm9pY2VDc21gLCB7IGludm9pY2VJZCB9KVxufVxuYXBwcm92ZUludm9pY2VGaW5hbmNlKGludm9pY2VJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGAke3RoaXMuaW52b2ljZUFwaVVybH0vYXBwcm92ZUludm9pY2VGaW5hbmNlYCwgeyBpbnZvaWNlSWQgfSlcbn1cbmFwcHJvdmVJbnZvaWNlQXBwcm92YWwoaW52b2ljZUlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYCR7dGhpcy5pbnZvaWNlQXBpVXJsfS9hcHByb3ZlSW52b2ljZUFwcHJvdmFsYCwgeyBpbnZvaWNlSWQgfSlcbn1cbmdldEludm9pY2VIZWFkcygpOiBPYnNlcnZhYmxlPGFueT4ge1xuICByZXR1cm4gdGhpcy5odHRwLmdldChgJHt0aGlzLmludm9pY2VBcGlVcmx9L2dldEludm9pY2VIZWFkc2ApXG59XG51cGRhdGVJbnZvaWNlSGVhZHMoZGF0YTogeyByb2xlOiBzdHJpbmc7IGVtYWlsOiBzdHJpbmcgfCBzdHJpbmdbXSB9W10pOiBPYnNlcnZhYmxlPGFueT4ge1xuICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYCR7dGhpcy5pbnZvaWNlQXBpVXJsfS91cGRhdGVJbnZvaWNlSGVhZHNgLCB7IGRhdGEgfSlcbn1cbmludm9pY2VyZWdlcmF0ZShkYXRhOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xuICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYCR7dGhpcy5pbnZvaWNlQXBpVXJsfS9yZWdlcmF0ZUludm9pY2VgLCBkYXRhKVxufVxuXG5wYXltZW50U3RhdHVzQ2hhbmdlKGRhdGE6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLmludm9pY2VBcGlVcmx9L3BheW1lbnRTdGF0dXNDaGFuZ2VgLCBkYXRhKVxufVxuXG4vLyBSZWNvcmQgYSBmdWxsIG9yIHBhcnRpYWwgcGF5bWVudCBhZ2FpbnN0IGFuIGludm9pY2UuIFNlcnZlciBhcHBlbmRzIHRvXG4vLyBwYXltZW50SGlzdG9yeSwgaW5jcmVtZW50cyBwYWlkQW1vdW50LCBhbmQgcmVjb21wdXRlcyBwYXltZW50U3RhdHVzXG4vLyAodW5wYWlkL3BhcnRpYWwvcGFpZCkuIFJldHVybnMgeyBwYWlkQW1vdW50LCBwZW5kaW5nQW1vdW50LCBwYXltZW50U3RhdHVzIH0uXG5yZWNvcmRQYXltZW50KGRhdGE6IHtcbiAgaW52b2ljZUlkOiBzdHJpbmc7XG4gIGFtb3VudDogbnVtYmVyO1xuICBkYXRlPzogc3RyaW5nIHwgRGF0ZTtcbiAgbWV0aG9kPzogc3RyaW5nO1xuICByZWZlcmVuY2U/OiBzdHJpbmc7XG4gIG5vdGVzPzogc3RyaW5nO1xufSk6IE9ic2VydmFibGU8YW55PiB7XG4gIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLmludm9pY2VBcGlVcmx9L3JlY29yZFBheW1lbnRgLCBkYXRhKTtcbn1cbmludm9pY2VTZW50KGRhdGE6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLmludm9pY2VBcGlVcmx9L2ludm9pY2VEb3dubG9hZC8ke2RhdGEuX2lkfWAsIGRhdGEpXG59XG5nZXRpbnZvaWNlKGlkPzogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoYCR7dGhpcy5wYXltZW50U3Vic2NyaXB0aW9uQXBpVXJsfS9jcmVkaXROb3Rlcy9pbnZvaWNlTGlzdC8ke2lkfWApXG59XG50cmFuc2FjdGlvbkxpc3QoZGF0YT86IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLmludm9pY2VBcGlVcmx9L2NyZWRpdFRyYW5zYWN0aW9ubGlzdGAsZGF0YSlcbn1cbnRyYW5zYWN0aW9uVGFibGVFeHBvcnQoZGF0YT86IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLmludm9pY2VBcGlVcmx9L2NyZWRpdFRyYW5zYWN0aW9ubGlzdGAsZGF0YSx7cmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInfSlcbn1cbmNyZWRpdG5vdGV1cGRhdGUoIGRhdGE6YW55KTpPYnNlcnZhYmxlPGFueT57XG4gIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLnBheW1lbnRTdWJzY3JpcHRpb25BcGlVcmx9L2NyZWRpdE5vdGVzYCwgZGF0YSlcbn1cbmFwcGx5RGlzY291bnQoIGRhdGE6YW55KTpPYnNlcnZhYmxlPGFueT57XG4gIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLmludm9pY2VBcGlVcmx9L2FwcGx5RGlzY291bnRgLCBkYXRhKVxufVxub25lVGltZUZlZSggZGF0YTphbnksaW52b2ljZUlkOmFueSk6T2JzZXJ2YWJsZTxhbnk+e1xuICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYCR7dGhpcy5iaWxsaW5nQXBpVXJsfS9vbmV0aW1lLXBheW1lbnQvJHtpbnZvaWNlSWR9YCwgZGF0YSlcbn1cbnBlbmRpbmdJbnZvaWNlcyhkYXRhOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xuICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYCR7dGhpcy5pbnZvaWNlQXBpVXJsfS9wZW5kaW5nSW52b2ljZXNgLCBkYXRhKVxufVxuYnJhbmRzQmlsbGluZ0xpc3QoZGF0YTogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGAke3RoaXMuYnJhbmRzQmlsbGluZ0FwaVVybH0vYnJhbmRzQmlsbGluZ0xpc3RgLCBkYXRhKVxufVxuYnJhbmRzQmlsbGluZ0xpc3RFeHBvcnQoZGF0YTogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGAke3RoaXMuYnJhbmRzQmlsbGluZ0FwaVVybH0vYnJhbmRzQmlsbGluZ0xpc3RgLCBkYXRhLCB7cmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInfSlcbn1cbmJyYW5kSW52b2ljZUxpc3QoZGF0YTogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGAke3RoaXMuYnJhbmRzQmlsbGluZ0FwaVVybH0vYnJhbmRJbnZvaWNlTGlzdGAsIGRhdGEpXG59XG5icmFuZEludm9pY2VMaXN0RXhwb3J0KGRhdGE6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLmJyYW5kc0JpbGxpbmdBcGlVcmx9L2JyYW5kSW52b2ljZUxpc3RgLCBkYXRhLCB7cmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInfSlcbn1cbmxhdGVzdERhaWx5UHJpY2luZyhkYXRhOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xuICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYCR7dGhpcy5icmFuZHNCaWxsaW5nQXBpVXJsfS9sYXRlc3REYWlseVByaWNpbmdgLCBkYXRhKVxufVxubGF0ZXN0RGFpbHlQcmljaW5nRXhwb3J0KGRhdGE6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLmJyYW5kc0JpbGxpbmdBcGlVcmx9L2xhdGVzdERhaWx5UHJpY2luZ2AsIGRhdGEsIHtyZXNwb25zZVR5cGU6ICdhcnJheWJ1ZmZlcid9KVxufVxuYnJhbmRCaWxsaW5nR3JvdXBzKGRhdGE6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLmJyYW5kc0JpbGxpbmdBcGlVcmx9L2JyYW5kQmlsbGluZ0dyb3Vwc2AsIGRhdGEpXG59XG5icmFuZEJpbGxpbmdHcm91cHNFeHBvcnQoZGF0YTogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGAke3RoaXMuYnJhbmRzQmlsbGluZ0FwaVVybH0vYnJhbmRCaWxsaW5nR3JvdXBzYCwgZGF0YSwge3Jlc3BvbnNlVHlwZTogJ2FycmF5YnVmZmVyJ30pXG59XG5idWxrRG93bmxvYWRCaWxsaW5nR3JvdXBzKGNsaWVudElkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHsgY2xpZW50SWQgfSk7XG4gIHJldHVybiB0aGlzLmh0dHAuZ2V0KGAke3RoaXMuYnJhbmRzQmlsbGluZ0FwaVVybH0vYnVsay1kb3dubG9hZC1iaWxsaW5nLWdyb3Vwcz8ke3BhcmFtcy50b1N0cmluZygpfWAsIHtyZXNwb25zZVR5cGU6ICdhcnJheWJ1ZmZlcid9KVxufVxuYnVsa1VwZGF0ZUJpbGxpbmdHcm91cHMoZmlsZTogRmlsZSwgY2xpZW50SWQ6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XG4gIC8vIFJlYWQgdGhlIGZpbGUgYXMgYmFzZTY0IGFuZCBQT1NUIGFzIEpTT04uIE11bHRpcGFydC9mb3JtLWRhdGEgd2FzIGhpdHRpbmdcbiAgLy8gbXVsdGVyIFwiVW5leHBlY3RlZCBlbmQgb2YgZm9ybVwiIGVycm9yczsgc3dpdGNoaW5nIHRvIEpTT04gc2lkZXN0ZXBzIHRoZVxuICAvLyBtdWx0ZXIgcGlwZWxpbmUgZW50aXJlbHkuIEJvZHktcGFyc2VyIGlzIGFscmVhZHkgY29uZmlndXJlZCBhdCA1MDBNQi5cbiAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKChzdWJzY3JpYmVyKSA9PiB7XG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICByZWFkZXIub25lcnJvciA9ICgpID0+IHN1YnNjcmliZXIuZXJyb3IocmVhZGVyLmVycm9yKTtcbiAgICByZWFkZXIub25sb2FkID0gKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gcmVhZGVyLnJlc3VsdCBhcyBzdHJpbmc7XG4gICAgICAvLyBkYXRhVVJMIGlzIFwiZGF0YTo8bWltZT47YmFzZTY0LDxwYXlsb2FkPlwiIOKAlCBzdHJpcCB0aGUgcHJlZml4LlxuICAgICAgY29uc3QgYmFzZTY0ID0gcmVzdWx0LmluY2x1ZGVzKCcsJykgPyByZXN1bHQuc3BsaXQoJywnKVsxXSA6IHJlc3VsdDtcbiAgICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICAgIGNsaWVudElkLFxuICAgICAgICBmaWxlbmFtZTogZmlsZS5uYW1lLFxuICAgICAgICBmaWxlQmFzZTY0OiBiYXNlNjQsXG4gICAgICB9O1xuICAgICAgdGhpcy5odHRwLnBvc3QoYCR7dGhpcy5icmFuZHNCaWxsaW5nQXBpVXJsfS9idWxrLXVwZGF0ZS1iaWxsaW5nLWdyb3Vwc2AsIHBheWxvYWQpLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChyZXMpID0+IHsgc3Vic2NyaWJlci5uZXh0KHJlcyk7IHN1YnNjcmliZXIuY29tcGxldGUoKTsgfSxcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHN1YnNjcmliZXIuZXJyb3IoZXJyKSxcbiAgICAgIH0pO1xuICAgIH07XG4gICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XG4gIH0pO1xufVxuLy8gPT09PT0gQmFuay1zdGF0ZW1lbnQgcmVjb25jaWxpYXRpb24gKFRyYW5zYWN0aW9ucyB0YWIpID09PT09XG51cGxvYWRCYW5rU3RhdGVtZW50KGZpbGU6IEZpbGUpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAvLyBUaGUgc2hlZXQgaXMgcGFyc2VkIGhlcmUgd2l0aCBTaGVldEpTIGFuZCBQT1NUZWQgYXMgSlNPTiByb3dzIOKAlCB0aGUgQVBJXG4gIC8vIG5ldmVyIHJlY2VpdmVzIGZpbGUgYnl0ZXM7IGl0IHZhbGlkYXRlcyBhbmQgY2xhc3NpZmllcyB0aGUgcm93cy5cbiAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKChzdWJzY3JpYmVyKSA9PiB7XG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICByZWFkZXIub25lcnJvciA9ICgpID0+IHN1YnNjcmliZXIuZXJyb3IocmVhZGVyLmVycm9yKTtcbiAgICByZWFkZXIub25sb2FkID0gKCkgPT4ge1xuICAgICAgbGV0IHJvd3M6IGFueVtdO1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gcmF3OnRydWUga2VlcHMgQ1NWIGNlbGxzIGFzIHBsYWluIHRleHQ6IHdpdGhvdXQgaXQgJzAxLzA0LzI2J1xuICAgICAgICAvLyAoMSBBcHIsIEREL01NKSBpcyBjb2VyY2VkIHRvIGEgSmFuLTQgZGF0ZSBjZWxsIChVUyBNTS9ERCkgd2hpbGVcbiAgICAgICAgLy8gJzE4LzA0LzI2JyBzdGF5cyB0ZXh0IOKAlCBzaWxlbnRseSBjb3JydXB0aW5nIG1peGVkIGRhdGVzLlxuICAgICAgICAvLyBTaGVldEpTIHR5cGU6J2FycmF5JyBleHBlY3RzIGEgYnl0ZSBhcnJheSAoVWludDhBcnJheSksIG5vdCB0aGUgcmF3XG4gICAgICAgIC8vIEFycmF5QnVmZmVyIEZpbGVSZWFkZXIgcmV0dXJucyDigJQgcGFzc2luZyB0aGUgQXJyYXlCdWZmZXIgbWFrZXMgLnhsc3hcbiAgICAgICAgLy8gcGFyc2UgdG8gYW4gZW1wdHkgd29ya2Jvb2sgYW5kIHRoZSB1cGxvYWQgXCJmYWlsc1wiLlxuICAgICAgICBjb25zdCBkYXRhID0gbmV3IFVpbnQ4QXJyYXkocmVhZGVyLnJlc3VsdCBhcyBBcnJheUJ1ZmZlcik7XG4gICAgICAgIGNvbnN0IHdiID0gWExTWC5yZWFkKGRhdGEsIHsgdHlwZTogJ2FycmF5JywgcmF3OiB0cnVlIH0pO1xuICAgICAgICBjb25zdCBzaGVldCA9IHdiLlNoZWV0c1t3Yi5TaGVldE5hbWVzWzBdXTtcbiAgICAgICAgcm93cyA9IFhMU1gudXRpbHMuc2hlZXRfdG9fanNvbihzaGVldCwgeyBoZWFkZXI6IDEsIGRlZnZhbDogJycsIHJhdzogZmFsc2UgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHN1YnNjcmliZXIuZXJyb3IoeyBlcnJvcjogeyBtZXNzYWdlOiAnRmFpbGVkIHRvIHBhcnNlIHRoZSBzdGF0ZW1lbnQgZmlsZScgfSB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgcGF5bG9hZCA9IHsgZmlsZU5hbWU6IGZpbGUubmFtZSwgcm93cyB9O1xuICAgICAgdGhpcy5odHRwLnBvc3QoYCR7dGhpcy5pbnZvaWNlQXBpVXJsfS9iYW5rU3RhdGVtZW50L3VwbG9hZGAsIHBheWxvYWQpLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChyZXMpID0+IHsgc3Vic2NyaWJlci5uZXh0KHJlcyk7IHN1YnNjcmliZXIuY29tcGxldGUoKTsgfSxcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHN1YnNjcmliZXIuZXJyb3IoZXJyKSxcbiAgICAgIH0pO1xuICAgIH07XG4gICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGZpbGUpO1xuICB9KTtcbn1cbmJhbmtUcmFuc2FjdGlvbkxpc3QoZmlsdGVyczogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGAke3RoaXMuaW52b2ljZUFwaVVybH0vYmFua1N0YXRlbWVudC9saXN0YCwgZmlsdGVycylcbn1cbmJhbmtSZXNvbHZlT3B0aW9ucygpOiBPYnNlcnZhYmxlPGFueT4ge1xuICByZXR1cm4gdGhpcy5odHRwLmdldChgJHt0aGlzLmludm9pY2VBcGlVcmx9L2JhbmtTdGF0ZW1lbnQvcmVzb2x2ZU9wdGlvbnNgKVxufVxuYmlsbGluZ1N1bW1hcnkoZmlsdGVycz86IHsgY3NtPzogc3RyaW5nOyBwcm9kdWN0Pzogc3RyaW5nOyB2YXJpYW5jZT86IHN0cmluZzsgc2VhcmNoPzogc3RyaW5nIH0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAvLyBQT1NUIHNvIGZpbHRlcnMgdHJhdmVsIGluIHRoZSBib2R5IOKAlCBhdm9pZHMgYW55IHF1ZXJ5LXN0cmluZyBzdHJpcHBpbmcgL1xuICAvLyBjYWNoaW5nIGFuZCBtYXRjaGVzIGhvdyB0aGUgb3RoZXIgYmlsbGluZyBsaXN0IGVuZHBvaW50cyBzZW5kIGZpbHRlcnMuXG4gIGNvbnN0IGJvZHkgPSB7XG4gICAgY3NtOiBmaWx0ZXJzPy5jc20gJiYgZmlsdGVycy5jc20gIT09ICdBbGwnID8gZmlsdGVycy5jc20gOiAnJyxcbiAgICBwcm9kdWN0OiBmaWx0ZXJzPy5wcm9kdWN0ICYmIGZpbHRlcnMucHJvZHVjdCAhPT0gJ0FsbCcgPyBmaWx0ZXJzLnByb2R1Y3QgOiAnJyxcbiAgICB2YXJpYW5jZTogZmlsdGVycz8udmFyaWFuY2UgJiYgZmlsdGVycy52YXJpYW5jZSAhPT0gJ0FsbCcgPyBmaWx0ZXJzLnZhcmlhbmNlIDogJycsXG4gICAgc2VhcmNoOiBmaWx0ZXJzPy5zZWFyY2ggfHwgJycsXG4gIH07XG4gIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLmJyYW5kc0JpbGxpbmdBcGlVcmx9L2JpbGxpbmdTdW1tYXJ5YCwgYm9keSlcbn1cbmJhbmtSZXNvbHZlVHJhbnNhY3Rpb24oZGF0YTogeyB0eG5JZDogc3RyaW5nOyBhY3Rpb246IHN0cmluZzsgaW52b2ljZUlkPzogc3RyaW5nOyBjbGllbnRJZD86IHN0cmluZzsgY2xpZW50TmFtZT86IHN0cmluZyB9KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGAke3RoaXMuaW52b2ljZUFwaVVybH0vYmFua1N0YXRlbWVudC9yZXNvbHZlYCwgZGF0YSlcbn1cbmdldEFsbEJpbGxpbmdHcm91cHMoY2xpZW50SWQ6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XG4gIHJldHVybiB0aGlzLmh0dHAuZ2V0KGAke3RoaXMuYmlsbGluZ0FwaVVybH0vZ2V0LWFsbC1iaWxsaW5nLWdyb3Vwcz9jbGllbnRJZD0ke2NsaWVudElkfWApXG59XG4vLyA9PT09PSBQYXltZW50IFJlbWluZGVycyAoQmlsbGluZyBTZXR0aW5ncykgPT09PT1cbmdldFBheW1lbnRSZW1pbmRlcihjbGllbnRJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoYCR7dGhpcy5iaWxsaW5nQXBpVXJsfS9wYXltZW50LXJlbWluZGVyLyR7Y2xpZW50SWR9YClcbn1cbnNhdmVQYXltZW50UmVtaW5kZXIoZGF0YTogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGAke3RoaXMuYmlsbGluZ0FwaVVybH0vcGF5bWVudC1yZW1pbmRlcmAsIGRhdGEpXG59XG5nZXRTdWJzY3JpYmVkU3RvcmVzKGRhdGE6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLmJpbGxpbmdBcGlVcmx9L2dldC1zdWJzY3JpYmVkLXN0b3JlLWxpc3RgLCBkYXRhKVxufVxuY3JlYXRlQmlsbGluZ0dyb3VwKGRhdGE6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLmJpbGxpbmdBcGlVcmx9L2NyZWF0ZS1ncm91cGAsIGRhdGEpXG59XG51cGRhdGVCaWxsaW5nR3JvdXAoZGF0YTogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgcmV0dXJuIHRoaXMuaHR0cC5wdXQoYCR7dGhpcy5iaWxsaW5nQXBpVXJsfS91cGRhdGUtZ3JvdXBgLCBkYXRhKVxufVxuZGVsZXRlQmlsbGluZ0dyb3VwKGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICByZXR1cm4gdGhpcy5odHRwLmRlbGV0ZShgJHt0aGlzLmJpbGxpbmdBcGlVcmx9L2RlbGV0ZS1ncm91cD9faWQ9JHtpZH1gKVxufVxuXG4vLyBHU1RJTiBhZGRyZXNzIGxvb2t1cC4gQ3VycmVudGx5IHRoZSBiYWNrZW5kIHJldHVybnMgYSBkZXRlcm1pbmlzdGljIG1vY2tcbi8vIGJhc2VkIG9uIHRoZSBHU1RJTiBzdGF0ZS1jb2RlIHByZWZpeC4gV2hlbiB3aXJlZCB0byBhIHJlYWwgcHJvdmlkZXIsIHRoZVxuLy8gcmVzcG9uc2Ugc2hhcGUgc3RheXMgdGhlIHNhbWUgc28gY2FsbGVycyBkb24ndCBuZWVkIHRvIGNoYW5nZS5cbmxvb2t1cEdzdGluKGdzdGluOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICByZXR1cm4gdGhpcy5odHRwLmdldChgJHt0aGlzLmJpbGxpbmdBcGlVcmx9L2dzdC1sb29rdXAvJHtlbmNvZGVVUklDb21wb25lbnQoZ3N0aW4pfWApXG59XG51cGRhdGVEYWlseVByaWNpbmdXb3JraW5nRGF5cyhkYXRhOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xuICByZXR1cm4gdGhpcy5odHRwLnB1dChgJHt0aGlzLmJyYW5kc0JpbGxpbmdBcGlVcmx9L3VwZGF0ZURhaWx5UHJpY2luZ1dvcmtpbmdEYXlzYCwgZGF0YSlcbn1cbnVwZGF0ZURhaWx5UHJpY2luZ1N0b3JlRmllbGQoZGF0YTogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgcmV0dXJuIHRoaXMuaHR0cC5wdXQoYCR7dGhpcy5icmFuZHNCaWxsaW5nQXBpVXJsfS91cGRhdGVEYWlseVByaWNpbmdTdG9yZUZpZWxkYCwgZGF0YSlcbn1cbmdldENsaWVudEJpbGxpbmdJbmZvKGRhdGE6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLmJyYW5kc0JpbGxpbmdBcGlVcmx9L2dldENsaWVudEJpbGxpbmdJbmZvYCwgZGF0YSlcbn1cbmdldEludm9pY2VCeUlkKGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICByZXR1cm4gdGhpcy5odHRwLmdldChgJHt0aGlzLmludm9pY2VBcGlVcmx9L2dldEludm9pY2UvJHtpZH1gKVxufVxuZ2V0SW52b2ljZUJhbmtEZXRhaWxzKGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICByZXR1cm4gdGhpcy5odHRwLmdldChgJHt0aGlzLmludm9pY2VBcGlVcmx9L2ludm9pY2VCYW5rRGV0YWlscy8ke2lkfWApXG59XG5nZXRJbnZvaWNlQW5uZXh1cmUoaWQ6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XG4gIHJldHVybiB0aGlzLmh0dHAuZ2V0KGAke3RoaXMuaW52b2ljZUFwaVVybH0vaW52b2ljZUFubmV4dXJlLyR7aWR9YClcbn1cbnVwZGF0ZUludm9pY2UoZGF0YTogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgcmV0dXJuIHRoaXMuaHR0cC5wdXQoYCR7dGhpcy5pbnZvaWNlQXBpVXJsfS91cGRhdGVJbnZvaWNlYCwgZGF0YSlcbn1cbmNyZWF0ZUludm9pY2UoZGF0YTogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGAke3RoaXMuaW52b2ljZUFwaVVybH0vY3JlYXRlSW52b2ljZWAsIGRhdGEpXG59XG5nZXRDbGllbnRCYXNlUHJpY2luZyhjbGllbnRJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoYCR7dGhpcy5pbnZvaWNlQXBpVXJsfS9nZXRDbGllbnRCYXNlUHJpY2luZy8ke2NsaWVudElkfWApXG59XG5nZXRDbGllbnRQcm9kdWN0cyhjbGllbnRJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoYCR7dGhpcy5iaWxsaW5nQXBpVXJsfS9nZXRDbGllbnRQcm9kdWN0cy8ke2NsaWVudElkfWApXG59XG5kZWxldGVJbnZvaWNlKGludm9pY2VJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgcmV0dXJuIHRoaXMuaHR0cC5kZWxldGUoYCR7dGhpcy5pbnZvaWNlQXBpVXJsfS9kZWxldGVJbnZvaWNlLyR7aW52b2ljZUlkfWApXG59XG5cbn1cbiJdfQ==
|