tango-app-ui-manage-billing 3.3.24 → 3.3.26

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.
Files changed (26) hide show
  1. package/esm2022/lib/components/billing-summary/billing-summary.component.mjs +9 -3
  2. package/esm2022/lib/components/brand-invoices/brand-invoices.component.mjs +8 -4
  3. package/esm2022/lib/components/daily-pricing/daily-pricing.component.mjs +10 -3
  4. package/esm2022/lib/components/invoice-preview/invoice-preview.component.mjs +41 -5
  5. package/esm2022/lib/components/plans-subscription/payments-subscription.component.mjs +37 -3
  6. package/esm2022/lib/components/plans-subscription/subscription-popups/upload-document/upload-document.component.mjs +38 -10
  7. package/esm2022/lib/components/purchase-order/purchase-order-form/purchase-order-form.component.mjs +27 -6
  8. package/esm2022/lib/components/purchase-order/purchase-order.component.mjs +43 -3
  9. package/esm2022/lib/components/services/billing.service.mjs +8 -1
  10. package/esm2022/lib/components/tango-manage-billing/edit-invoice/edit-invoice.component.mjs +19 -14
  11. package/esm2022/lib/components/tango-manage-billing/tango-manage-billing.component.mjs +28 -10
  12. package/esm2022/lib/services/payment-subscription.service.mjs +9 -1
  13. package/fesm2022/tango-app-ui-manage-billing.mjs +263 -51
  14. package/fesm2022/tango-app-ui-manage-billing.mjs.map +1 -1
  15. package/lib/components/billing-summary/billing-summary.component.d.ts +1 -0
  16. package/lib/components/daily-pricing/daily-pricing.component.d.ts +1 -0
  17. package/lib/components/invoice-preview/invoice-preview.component.d.ts +2 -0
  18. package/lib/components/plans-subscription/payments-subscription.component.d.ts +2 -0
  19. package/lib/components/plans-subscription/subscription-popups/upload-document/upload-document.component.d.ts +6 -2
  20. package/lib/components/purchase-order/purchase-order-form/purchase-order-form.component.d.ts +6 -2
  21. package/lib/components/purchase-order/purchase-order.component.d.ts +3 -0
  22. package/lib/components/services/billing.service.d.ts +2 -0
  23. package/lib/components/tango-manage-billing/edit-invoice/edit-invoice.component.d.ts +1 -0
  24. package/lib/components/tango-manage-billing/tango-manage-billing.component.d.ts +1 -0
  25. package/lib/services/payment-subscription.service.d.ts +2 -0
  26. package/package.json +1 -1
@@ -92,6 +92,12 @@ export class BillingSummaryComponent {
92
92
  productApiOptions = [];
93
93
  get csmOptions() { return this.csmApiOptions; }
94
94
  get productOptions() { return this.productApiOptions; }
95
+ // Show the Installation Fee column only when at least one client in the
96
+ // current result set actually has an installation fee this month; otherwise
97
+ // the whole column (header, cells, footer) is hidden.
98
+ get showInstallation() {
99
+ return this.rows.some((r) => r?.installationFee != null && Number(r.installationFee) > 0);
100
+ }
95
101
  // Stable filter-popover data for lib-filters. MUST be a held property, not a
96
102
  // getter: lib-filters mutates this object (sets isOpen on a section when its
97
103
  // inner dropdown is clicked). A getter would hand back a fresh array each
@@ -295,10 +301,10 @@ export class BillingSummaryComponent {
295
301
  this.toast.getPrimaryToast(`Exported ${list.length} clients`);
296
302
  }
297
303
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BillingSummaryComponent, deps: [{ token: i1.BillingService }, { token: i2.ToastService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
298
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: BillingSummaryComponent, selector: "lib-billing-summary", ngImport: i0, template: "<div class=\"px-4 pb-4\">\n <!-- Header: search + filter + export -->\n <div class=\"d-flex justify-content-between align-items-center mt-4 flex-wrap gap-2\">\n <div class=\"billingheader\">Billing Summary</div>\n <div class=\"d-flex align-items-center gap-2\">\n <div class=\"position-relative\">\n <span class=\"svg-icon invoicesearch svg-icon-1 position-absolute mt-6 ms-3\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <rect opacity=\"0.5\" x=\"17.0365\" y=\"15.1223\" width=\"8.15546\" height=\"2\" rx=\"1\"\n transform=\"rotate(45 17.0365 15.1223)\" fill=\"currentColor\"></rect>\n <path d=\"M11 19C6.55556 19 3 15.4444 3 11C3 6.55556 6.55556 3 11 3C15.4444 3 19 6.55556 19 11C19 15.4444 15.4444 19 11 19ZM11 5C7.53333 5 5 7.53333 5 11C5 14.4667 7.53333 17 11 17C14.4667 17 17 14.4667 17 11C17 7.53333 14.4667 5 11 5Z\"\n fill=\"currentColor\"></path>\n </svg>\n </span>\n <input [(ngModel)]=\"query\" type=\"text\" class=\"form-control ps-14 invoicesearch\"\n placeholder=\"Search client / entity / ID...\" autocomplete=\"off\"\n (change)=\"onSearch()\" />\n </div>\n <!-- Render only once options are built \u2014 lib-filters snapshots its\n dataObject in ngOnInit and never re-reads it, so it must\n initialize against the populated array. -->\n <lib-filters *ngIf=\"summaryFilterObject.length\"\n [dataObject]=\"summaryFilterObject\" (appliedFilters)=\"applySummaryFilters($event)\"></lib-filters>\n <!-- Show/hide AR-aging columns in table + export. -->\n <div class=\"form-check form-switch d-flex align-items-center gap-2 me-3\">\n <input class=\"form-check-input\" type=\"checkbox\" id=\"agingToggle\" [(ngModel)]=\"showAging\">\n <label class=\"form-check-label text-nowrap\" for=\"agingToggle\">Outstanding Aging</label>\n </div>\n <button type=\"button\" class=\"btn-outline btn align-items-end text-nowrap invheader\"\n [disabled]=\"!filtered.length\" (click)=\"onExport()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <span class=\"ms-2\">Export</span>\n </button>\n </div>\n </div>\n\n <!-- Loading shimmer -->\n <ng-container *ngIf=\"loading\">\n <div class=\"row loader d-flex justify-content-center align-items-center mt-4\">\n <div class=\"shimmer\">\n <div class=\"wrapper\">\n <div class=\"stroke animate title\"></div>\n <div class=\"stroke animate link\"></div>\n <div class=\"stroke animate description\"></div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- Empty -->\n <ng-container *ngIf=\"!loading && noData\">\n <div class=\"row\">\n <div class=\"col-lg-12 mb-3\">\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column\">\n <img class=\"img-src w-25\" src=\"./assets/tango/Icons/Nodata.svg\" alt=\"\">\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- Summary table \u2014 sticky two-row header + sticky totals footer -->\n <div *ngIf=\"!loading && !noData\" class=\"sum-scroll mt-3\">\n <table class=\"table sum-table text-nowrap mb-0\">\n <thead>\n <tr>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('clientId')\">Client ID\n <span class=\"arr\" [class.on]=\"sortKey === 'clientId'\">{{ sortKey === 'clientId' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('clientName')\">Client Name\n <span class=\"arr\" [class.on]=\"sortKey === 'clientName'\">{{ sortKey === 'clientName' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th rowspan=\"2\">Registered Entity</th>\n <ng-container *ngIf=\"showAging\">\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('outstanding')\">Total Outstanding\n <span class=\"arr\" [class.on]=\"sortKey === 'outstanding'\">{{ sortKey === 'outstanding' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('aging0to30')\">&lt; 30 days\n <span class=\"arr\" [class.on]=\"sortKey === 'aging0to30'\">{{ sortKey === 'aging0to30' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('aging30to60')\">30 to 60 days\n <span class=\"arr\" [class.on]=\"sortKey === 'aging30to60'\">{{ sortKey === 'aging30to60' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('agingOver60')\">&gt; 60 days\n <span class=\"arr\" [class.on]=\"sortKey === 'agingOver60'\">{{ sortKey === 'agingOver60' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n </ng-container>\n <th rowspan=\"2\">Status</th>\n <th rowspan=\"2\">Product</th>\n <th rowspan=\"2\">CSM</th>\n <th [attr.colspan]=\"months.length\" class=\"group-head\">Store Count</th>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('pricePerStore')\">Price / Store\n <span class=\"arr\" [class.on]=\"sortKey === 'pricePerStore'\">{{ sortKey === 'pricePerStore' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th colspan=\"2\" class=\"group-head\">Revenue</th>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('variance')\">Variance\n <span class=\"arr\" [class.on]=\"sortKey === 'variance'\">{{ sortKey === 'variance' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('installationFee')\">Installation Fee\n <span class=\"arr\" [class.on]=\"sortKey === 'installationFee'\">{{ sortKey === 'installationFee' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n </tr>\n <tr>\n <th *ngFor=\"let m of months; let i = index\" class=\"sub-head\"\n [class.sortable]=\"i === months.length - 1\"\n (click)=\"i === months.length - 1 ? sortBy('storesCur') : null\">\n {{ m.label }}<span *ngIf=\"i === months.length - 1\" class=\"arr\" [class.on]=\"sortKey === 'storesCur'\">{{ sortKey === 'storesCur' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th class=\"sub-head sortable\" (click)=\"sortBy('revPrev')\">{{ months[3].label }}<span class=\"arr\" [class.on]=\"sortKey === 'revPrev'\">{{ sortKey === 'revPrev' && sortDir === 1 ? '\u2191' : '\u2193' }}</span></th>\n <th class=\"sub-head sortable\" (click)=\"sortBy('revCur')\">{{ months[4].label }}<span class=\"arr\" [class.on]=\"sortKey === 'revCur'\">{{ sortKey === 'revCur' && sortDir === 1 ? '\u2191' : '\u2193' }}</span></th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let r of filtered\">\n <td>{{ r.clientId || '\u2014' }}</td>\n <td><strong>{{ r.clientName | uppercase }}</strong></td>\n <td>\n <span class=\"entity\" [title]=\"(r.registeredEntities && r.registeredEntities.length ? r.registeredEntities.join('\\n') : r.registeredEntity) || ''\">\n {{ r.registeredEntity || '\u2014' }}\n </span>\n <span *ngIf=\"r.registeredEntities?.length > 1\" class=\"entity-more\"\n [title]=\"r.registeredEntities.join('\\n')\">+{{ r.registeredEntities.length - 1 }}</span>\n </td>\n <ng-container *ngIf=\"showAging\">\n <td class=\"text-end\"><strong>{{ r.outstanding ? ('\u20B9' + (r.outstanding | number:'1.0-0':'en-IN')) : '\u2014' }}</strong></td>\n <td class=\"text-end\">{{ r.aging0to30 ? ('\u20B9' + (r.aging0to30 | number:'1.0-0':'en-IN')) : '\u2014' }}</td>\n <td class=\"text-end\">{{ r.aging30to60 ? ('\u20B9' + (r.aging30to60 | number:'1.0-0':'en-IN')) : '\u2014' }}</td>\n <td class=\"text-end\">{{ r.agingOver60 ? ('\u20B9' + (r.agingOver60 | number:'1.0-0':'en-IN')) : '\u2014' }}</td>\n </ng-container>\n <td><span class=\"pill\" [ngClass]=\"r.status === 'Paid' ? 'pill-green' : 'pill-amber'\">{{ r.status }}</span></td>\n <td>\n <span *ngFor=\"let p of r.products\" [ngClass]=\"productPillClass(p)\" class=\"me-1\">{{ p }}</span>\n <span *ngIf=\"!r.products?.length\" class=\"text-muted\">\u2014</span>\n </td>\n <td>{{ r.csm || '\u2014' }}</td>\n <td *ngFor=\"let s of r.stores; let i = index\" [class.fw-bold]=\"i === r.stores.length - 1\">\n {{ s == null ? '\u2014' : (s | number:'1.0-0':'en-IN') }}\n </td>\n <td [title]=\"r.currency === 'dollar' ? ('USD pricing \u2014 revenue converted to \u20B9 at today\\'s rate (' + (usdRate | number:'1.2-2') + ')') : ''\">\n {{ r.pricePerStore == null ? '\u2014' : (r.currency === 'dollar' ? '$' : '\u20B9') + (r.pricePerStore | number:'1.0-0':'en-IN') }}\n </td>\n <td class=\"text-muted\">{{ r.revPrev == null ? '\u2014' : '\u20B9' + (r.revPrev | number:'1.0-0':'en-IN') }}</td>\n <td>\n <strong>{{ r.revCur == null ? '\u2014' : '\u20B9' + (r.revCur | number:'1.0-0':'en-IN') }}</strong>\n <span *ngIf=\"r.revCurEstimated\" class=\"est-chip ms-1\"\n title=\"Estimated: current store count \u00D7 base price \u2014 replaced by the invoice amount once generated\">est.</span>\n </td>\n <td>\n <span *ngIf=\"r.variance != null\" class=\"fw-semibold\"\n [class.text-success]=\"r.variance > 0\" [class.text-danger]=\"r.variance < 0\"\n [title]=\"(months[3].label + ' ' + (r.revPrev == null ? '\u2014' : '\u20B9' + (r.revPrev | number:'1.0-0':'en-IN')) + ' \u2192 ' + months[4].label + ' ' + (r.revCur == null ? '\u2014' : '\u20B9' + (r.revCur | number:'1.0-0':'en-IN')))\">\n {{ r.variance > 0 ? '+' : '' }}{{ r.variance }}%\n </span>\n <span *ngIf=\"r.variance == null\" class=\"text-muted\">\u2014</span>\n </td>\n <td>{{ r.installationFee == null ? '\u2014' : '\u20B9' + (r.installationFee | number:'1.0-0':'en-IN') }}</td>\n </tr>\n <tr *ngIf=\"!filtered.length\">\n <td [attr.colspan]=\"(showAging ? 15 : 11) + months.length\" class=\"text-center text-muted py-5\">No clients match.</td>\n </tr>\n </tbody>\n <tfoot>\n <tr>\n <td colspan=\"3\">Total \u00B7 {{ totals.count }} clients</td>\n <ng-container *ngIf=\"showAging\">\n <td class=\"text-end\"><strong>\u20B9{{ totals.outstanding | number:'1.0-0':'en-IN' }}</strong></td>\n <td class=\"text-end\"><strong>\u20B9{{ totals.aging0to30 | number:'1.0-0':'en-IN' }}</strong></td>\n <td class=\"text-end\"><strong>\u20B9{{ totals.aging30to60 | number:'1.0-0':'en-IN' }}</strong></td>\n <td class=\"text-end\"><strong>\u20B9{{ totals.agingOver60 | number:'1.0-0':'en-IN' }}</strong></td>\n </ng-container>\n <td colspan=\"3\"></td>\n <td *ngFor=\"let t of totals.storeTotals\"><strong>{{ t | number:'1.0-0':'en-IN' }}</strong></td>\n <td></td>\n <td><strong>\u20B9{{ totals.revPrev | number:'1.0-0':'en-IN' }}</strong></td>\n <td><strong>\u20B9{{ totals.revCur | number:'1.0-0':'en-IN' }}</strong></td>\n <td></td>\n <td><strong>\u20B9{{ totals.installation | number:'1.0-0':'en-IN' }}</strong></td>\n </tr>\n </tfoot>\n </table>\n </div>\n</div>", styles: [":host ::ng-deep lib-filters .dropdown1{z-index:30!important}.sum-scroll{overflow:auto;max-height:64vh;border:1px solid #E4E7EC;border-radius:12px}.sum-table{min-width:1480px}.sum-table thead th{position:sticky;top:0;background:#f4f6f9;font-size:11.5px;letter-spacing:.04em;text-transform:uppercase;color:#8a93a2;font-weight:600;padding:11px 14px;border-bottom:1px solid #E4E7EC;white-space:nowrap;vertical-align:middle}.sum-table thead tr:nth-child(2) th{top:39px}.sum-table .group-head{text-align:center;border-bottom:1px solid #E4E7EC}.sum-table .sub-head{font-size:11px}.sum-table .sortable{cursor:pointer}.sum-table .sortable:hover{color:#1493f5}.sum-table .arr{color:#c2c7d0;margin-left:3px}.sum-table .arr.on{color:#1493f5}.sum-table tbody td{padding:13px 14px;border-bottom:1px solid #eceef1;vertical-align:middle;font-size:13.5px;color:#344054}.sum-table tbody tr:hover{background:#fbfcfe}.sum-table tfoot td{position:sticky;bottom:0;background:#eaf0f6;border-top:2px solid #E4E7EC;font-weight:700;padding:11px 14px;font-size:13px;color:#101828}.entity{display:inline-block;max-width:210px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;vertical-align:bottom}.pill{display:inline-flex;align-items:center;padding:2px 9px;border-radius:999px;font-size:11px;font-weight:600;white-space:nowrap}.pill-green{background:#e7f7ee;color:#138a52}.pill-amber{background:#fdf0dc;color:#b9740a}.pill-blue{background:#e8f3fe;color:#1573c4}.pill-gray{background:#f1f3f6;color:#667085}.est-chip{font-size:10px;font-weight:700;color:#b9740a;background:#fdf0dc;border-radius:999px;padding:1px 7px;vertical-align:middle;cursor:help}.countchip{background:#f1f3f6;color:#667085;font-weight:600;font-size:11px;border-radius:999px;padding:1px 8px}.status-tab{border:0;border-radius:8px;padding:7px 12px;font-weight:600;color:#5b6472;background:transparent}.status-tab:hover{background:#f4f6f9}.status-tab.active{background:#e8f3fe;color:#1493f5}.filter-panel{border:1px solid #E4E7EC;border-radius:14px;padding:16px 18px;background:#fbfdff}.entity-more{display:inline-block;margin-left:6px;background:#eef1f5;color:#475467;font-size:11px;font-weight:700;border-radius:999px;padding:1px 7px;cursor:help}.svg-icon.invoicesearch.position-absolute{top:50%;transform:translateY(-50%);margin-top:0!important}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i2.FiltersComponent, selector: "lib-filters", inputs: ["dataObject"], outputs: ["appliedFilters"] }, { kind: "pipe", type: i3.UpperCasePipe, name: "uppercase" }, { kind: "pipe", type: i3.DecimalPipe, name: "number" }] });
304
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: BillingSummaryComponent, selector: "lib-billing-summary", ngImport: i0, template: "<div class=\"px-4 pb-4\">\n <!-- Header: search + filter + export -->\n <div class=\"d-flex justify-content-between align-items-center mt-4 flex-wrap gap-2\">\n <div class=\"billingheader\">Billing Summary</div>\n <div class=\"d-flex align-items-center gap-2\">\n <div class=\"position-relative\">\n <span class=\"svg-icon invoicesearch svg-icon-1 position-absolute mt-6 ms-3\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <rect opacity=\"0.5\" x=\"17.0365\" y=\"15.1223\" width=\"8.15546\" height=\"2\" rx=\"1\"\n transform=\"rotate(45 17.0365 15.1223)\" fill=\"currentColor\"></rect>\n <path d=\"M11 19C6.55556 19 3 15.4444 3 11C3 6.55556 6.55556 3 11 3C15.4444 3 19 6.55556 19 11C19 15.4444 15.4444 19 11 19ZM11 5C7.53333 5 5 7.53333 5 11C5 14.4667 7.53333 17 11 17C14.4667 17 17 14.4667 17 11C17 7.53333 14.4667 5 11 5Z\"\n fill=\"currentColor\"></path>\n </svg>\n </span>\n <input [(ngModel)]=\"query\" type=\"text\" class=\"form-control ps-14 invoicesearch\"\n placeholder=\"Search client / entity / ID...\" autocomplete=\"off\"\n (change)=\"onSearch()\" />\n </div>\n <!-- Render only once options are built \u2014 lib-filters snapshots its\n dataObject in ngOnInit and never re-reads it, so it must\n initialize against the populated array. -->\n <lib-filters *ngIf=\"summaryFilterObject.length\"\n [dataObject]=\"summaryFilterObject\" (appliedFilters)=\"applySummaryFilters($event)\"></lib-filters>\n <!-- Show/hide AR-aging columns in table + export. -->\n <div class=\"form-check form-switch d-flex align-items-center gap-2 me-3\">\n <input class=\"form-check-input\" type=\"checkbox\" id=\"agingToggle\" [(ngModel)]=\"showAging\">\n <label class=\"form-check-label text-nowrap\" for=\"agingToggle\">Outstanding Aging</label>\n </div>\n <button type=\"button\" class=\"btn-outline btn align-items-end text-nowrap invheader\"\n [disabled]=\"!filtered.length\" (click)=\"onExport()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <span class=\"ms-2\">Export</span>\n </button>\n </div>\n </div>\n\n <!-- Loading shimmer -->\n <ng-container *ngIf=\"loading\">\n <div class=\"row loader d-flex justify-content-center align-items-center mt-4\">\n <div class=\"shimmer\">\n <div class=\"wrapper\">\n <div class=\"stroke animate title\"></div>\n <div class=\"stroke animate link\"></div>\n <div class=\"stroke animate description\"></div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- Empty -->\n <ng-container *ngIf=\"!loading && noData\">\n <div class=\"row\">\n <div class=\"col-lg-12 mb-3\">\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column\">\n <img class=\"img-src w-25\" src=\"./assets/tango/Icons/Nodata.svg\" alt=\"\">\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- Summary table \u2014 sticky two-row header + sticky totals footer -->\n <div *ngIf=\"!loading && !noData\" class=\"sum-scroll mt-3\">\n <table class=\"table sum-table text-nowrap mb-0\">\n <thead>\n <tr>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('clientId')\">Client ID\n <span class=\"arr\" [class.on]=\"sortKey === 'clientId'\">{{ sortKey === 'clientId' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('clientName')\">Client Name\n <span class=\"arr\" [class.on]=\"sortKey === 'clientName'\">{{ sortKey === 'clientName' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th rowspan=\"2\">Registered Entity</th>\n <ng-container *ngIf=\"showAging\">\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('outstanding')\">Total Outstanding\n <span class=\"arr\" [class.on]=\"sortKey === 'outstanding'\">{{ sortKey === 'outstanding' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('aging0to30')\">&lt; 30 days\n <span class=\"arr\" [class.on]=\"sortKey === 'aging0to30'\">{{ sortKey === 'aging0to30' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('aging30to60')\">30 to 60 days\n <span class=\"arr\" [class.on]=\"sortKey === 'aging30to60'\">{{ sortKey === 'aging30to60' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('agingOver60')\">&gt; 60 days\n <span class=\"arr\" [class.on]=\"sortKey === 'agingOver60'\">{{ sortKey === 'agingOver60' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n </ng-container>\n <th rowspan=\"2\">Status</th>\n <th rowspan=\"2\">Product</th>\n <th rowspan=\"2\">CSM</th>\n <th [attr.colspan]=\"months.length\" class=\"group-head\">Store Count</th>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('pricePerStore')\">Price / Store\n <span class=\"arr\" [class.on]=\"sortKey === 'pricePerStore'\">{{ sortKey === 'pricePerStore' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th colspan=\"2\" class=\"group-head\">Revenue</th>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('variance')\">Variance\n <span class=\"arr\" [class.on]=\"sortKey === 'variance'\">{{ sortKey === 'variance' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th *ngIf=\"showInstallation\" rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('installationFee')\">Installation Fee\n <span class=\"arr\" [class.on]=\"sortKey === 'installationFee'\">{{ sortKey === 'installationFee' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n </tr>\n <tr>\n <th *ngFor=\"let m of months; let i = index\" class=\"sub-head\"\n [class.sortable]=\"i === months.length - 1\"\n (click)=\"i === months.length - 1 ? sortBy('storesCur') : null\">\n {{ m.label }}<span *ngIf=\"i === months.length - 1\" class=\"arr\" [class.on]=\"sortKey === 'storesCur'\">{{ sortKey === 'storesCur' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th class=\"sub-head sortable\" (click)=\"sortBy('revPrev')\">{{ months[3].label }}<span class=\"arr\" [class.on]=\"sortKey === 'revPrev'\">{{ sortKey === 'revPrev' && sortDir === 1 ? '\u2191' : '\u2193' }}</span></th>\n <th class=\"sub-head sortable\" (click)=\"sortBy('revCur')\">{{ months[4].label }}<span class=\"arr\" [class.on]=\"sortKey === 'revCur'\">{{ sortKey === 'revCur' && sortDir === 1 ? '\u2191' : '\u2193' }}</span></th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let r of filtered\">\n <td>{{ r.clientId || '\u2014' }}</td>\n <td><strong>{{ r.clientName | uppercase }}</strong></td>\n <td>\n <span class=\"entity\" [title]=\"(r.registeredEntities && r.registeredEntities.length ? r.registeredEntities.join('\\n') : r.registeredEntity) || ''\">\n {{ r.registeredEntity || '\u2014' }}\n </span>\n <span *ngIf=\"r.registeredEntities?.length > 1\" class=\"entity-more\"\n [title]=\"r.registeredEntities.join('\\n')\">+{{ r.registeredEntities.length - 1 }}</span>\n </td>\n <ng-container *ngIf=\"showAging\">\n <td class=\"text-end\"><strong>{{ r.outstanding ? ('\u20B9' + (r.outstanding | number:'1.0-0':'en-IN')) : '\u2014' }}</strong></td>\n <td class=\"text-end\">{{ r.aging0to30 ? ('\u20B9' + (r.aging0to30 | number:'1.0-0':'en-IN')) : '\u2014' }}</td>\n <td class=\"text-end\">{{ r.aging30to60 ? ('\u20B9' + (r.aging30to60 | number:'1.0-0':'en-IN')) : '\u2014' }}</td>\n <td class=\"text-end\">{{ r.agingOver60 ? ('\u20B9' + (r.agingOver60 | number:'1.0-0':'en-IN')) : '\u2014' }}</td>\n </ng-container>\n <td><span class=\"pill\" [ngClass]=\"r.status === 'Paid' ? 'pill-green' : 'pill-amber'\">{{ r.status }}</span></td>\n <td>\n <span *ngFor=\"let p of r.products\" [ngClass]=\"productPillClass(p)\" class=\"me-1\">{{ p }}</span>\n <span *ngIf=\"!r.products?.length\" class=\"text-muted\">\u2014</span>\n </td>\n <td>{{ r.csm || '\u2014' }}</td>\n <td *ngFor=\"let s of r.stores; let i = index\" [class.fw-bold]=\"i === r.stores.length - 1\">\n {{ s == null ? '\u2014' : (s | number:'1.0-0':'en-IN') }}\n </td>\n <td [title]=\"r.currency === 'dollar' ? ('USD pricing \u2014 revenue converted to \u20B9 at today\\'s rate (' + (usdRate | number:'1.2-2') + ')') : ''\">\n {{ r.pricePerStore == null ? '\u2014' : (r.currency === 'dollar' ? '$' : '\u20B9') + (r.pricePerStore | number:'1.0-0':'en-IN') }}\n </td>\n <td class=\"text-muted\">{{ r.revPrev == null ? '\u2014' : '\u20B9' + (r.revPrev | number:'1.0-0':'en-IN') }}</td>\n <td>\n <strong>{{ r.revCur == null ? '\u2014' : '\u20B9' + (r.revCur | number:'1.0-0':'en-IN') }}</strong>\n <span *ngIf=\"r.revCurEstimated\" class=\"est-chip ms-1\"\n title=\"Estimated: current store count \u00D7 base price \u2014 replaced by the invoice amount once generated\">est.</span>\n </td>\n <td>\n <span *ngIf=\"r.variance != null\" class=\"fw-semibold\"\n [class.text-success]=\"r.variance > 0\" [class.text-danger]=\"r.variance < 0\"\n [title]=\"(months[3].label + ' ' + (r.revPrev == null ? '\u2014' : '\u20B9' + (r.revPrev | number:'1.0-0':'en-IN')) + ' \u2192 ' + months[4].label + ' ' + (r.revCur == null ? '\u2014' : '\u20B9' + (r.revCur | number:'1.0-0':'en-IN')))\">\n {{ r.variance > 0 ? '+' : '' }}{{ r.variance }}%\n </span>\n <span *ngIf=\"r.variance == null\" class=\"text-muted\">\u2014</span>\n </td>\n <td *ngIf=\"showInstallation\">{{ r.installationFee == null ? '\u2014' : '\u20B9' + (r.installationFee | number:'1.0-0':'en-IN') }}</td>\n </tr>\n <tr *ngIf=\"!filtered.length\">\n <td [attr.colspan]=\"(showAging ? 15 : 11) + months.length\" class=\"text-center text-muted py-5\">No clients match.</td>\n </tr>\n </tbody>\n <tfoot>\n <tr>\n <td colspan=\"3\">Total \u00B7 {{ totals.count }} clients</td>\n <ng-container *ngIf=\"showAging\">\n <td class=\"text-end\"><strong>\u20B9{{ totals.outstanding | number:'1.0-0':'en-IN' }}</strong></td>\n <td class=\"text-end\"><strong>\u20B9{{ totals.aging0to30 | number:'1.0-0':'en-IN' }}</strong></td>\n <td class=\"text-end\"><strong>\u20B9{{ totals.aging30to60 | number:'1.0-0':'en-IN' }}</strong></td>\n <td class=\"text-end\"><strong>\u20B9{{ totals.agingOver60 | number:'1.0-0':'en-IN' }}</strong></td>\n </ng-container>\n <td colspan=\"3\"></td>\n <td *ngFor=\"let t of totals.storeTotals\"><strong>{{ t | number:'1.0-0':'en-IN' }}</strong></td>\n <td></td>\n <td><strong>\u20B9{{ totals.revPrev | number:'1.0-0':'en-IN' }}</strong></td>\n <td><strong>\u20B9{{ totals.revCur | number:'1.0-0':'en-IN' }}</strong></td>\n <td></td>\n <td *ngIf=\"showInstallation\"><strong>\u20B9{{ totals.installation | number:'1.0-0':'en-IN' }}</strong></td>\n </tr>\n </tfoot>\n </table>\n </div>\n</div>", styles: [":host ::ng-deep lib-filters .dropdown1{z-index:30!important}.sum-scroll{overflow:auto;max-height:64vh;border:1px solid #E4E7EC;border-radius:12px}.sum-table{min-width:1480px}.sum-table thead th{position:sticky;top:0;z-index:4;background:#f4f6f9;font-size:11.5px;letter-spacing:.04em;text-transform:uppercase;color:#8a93a2;font-weight:600;padding:11px 14px;border-bottom:1px solid #E4E7EC;white-space:nowrap;vertical-align:middle}.sum-table thead tr:nth-child(2) th{top:39px}.sum-table .group-head{text-align:center;border-bottom:1px solid #E4E7EC}.sum-table .sub-head{font-size:11px}.sum-table .sortable{cursor:pointer}.sum-table .sortable:hover{color:#1493f5}.sum-table .arr{color:#c2c7d0;margin-left:3px}.sum-table .arr.on{color:#1493f5}.sum-table tbody td{padding:13px 14px;border-bottom:1px solid #eceef1;vertical-align:middle;font-size:13.5px;color:#344054}.sum-table tbody tr:hover{background:#fbfcfe}.sum-table tfoot td{position:sticky;bottom:0;background:#eaf0f6;border-top:2px solid #E4E7EC;font-weight:700;padding:11px 14px;font-size:13px;color:#101828}.sum-table thead th:nth-child(1),.sum-table tbody td:nth-child(1){position:sticky;left:0;width:120px;min-width:120px}.sum-table thead th:nth-child(2),.sum-table tbody td:nth-child(2){position:sticky;left:120px;width:200px;min-width:200px}.sum-table tbody td:nth-child(1),.sum-table tbody td:nth-child(2){background:#fff;z-index:1}.sum-table tbody tr:hover td:nth-child(1),.sum-table tbody tr:hover td:nth-child(2){background:#fbfcfe}.sum-table thead th:nth-child(1),.sum-table thead th:nth-child(2){z-index:6}.sum-table tfoot td:nth-child(1){left:0;z-index:3}.entity{display:inline-block;max-width:210px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;vertical-align:bottom}.pill{display:inline-flex;align-items:center;padding:2px 9px;border-radius:999px;font-size:11px;font-weight:600;white-space:nowrap}.pill-green{background:#e7f7ee;color:#138a52}.pill-amber{background:#fdf0dc;color:#b9740a}.pill-blue{background:#e8f3fe;color:#1573c4}.pill-gray{background:#f1f3f6;color:#667085}.est-chip{font-size:10px;font-weight:700;color:#b9740a;background:#fdf0dc;border-radius:999px;padding:1px 7px;vertical-align:middle;cursor:help}.countchip{background:#f1f3f6;color:#667085;font-weight:600;font-size:11px;border-radius:999px;padding:1px 8px}.status-tab{border:0;border-radius:8px;padding:7px 12px;font-weight:600;color:#5b6472;background:transparent}.status-tab:hover{background:#f4f6f9}.status-tab.active{background:#e8f3fe;color:#1493f5}.filter-panel{border:1px solid #E4E7EC;border-radius:14px;padding:16px 18px;background:#fbfdff}.entity-more{display:inline-block;margin-left:6px;background:#eef1f5;color:#475467;font-size:11px;font-weight:700;border-radius:999px;padding:1px 7px;cursor:help}.svg-icon.invoicesearch.position-absolute{top:50%;transform:translateY(-50%);margin-top:0!important}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i2.FiltersComponent, selector: "lib-filters", inputs: ["dataObject"], outputs: ["appliedFilters"] }, { kind: "pipe", type: i3.UpperCasePipe, name: "uppercase" }, { kind: "pipe", type: i3.DecimalPipe, name: "number" }] });
299
305
  }
300
306
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BillingSummaryComponent, decorators: [{
301
307
  type: Component,
302
- args: [{ selector: 'lib-billing-summary', template: "<div class=\"px-4 pb-4\">\n <!-- Header: search + filter + export -->\n <div class=\"d-flex justify-content-between align-items-center mt-4 flex-wrap gap-2\">\n <div class=\"billingheader\">Billing Summary</div>\n <div class=\"d-flex align-items-center gap-2\">\n <div class=\"position-relative\">\n <span class=\"svg-icon invoicesearch svg-icon-1 position-absolute mt-6 ms-3\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <rect opacity=\"0.5\" x=\"17.0365\" y=\"15.1223\" width=\"8.15546\" height=\"2\" rx=\"1\"\n transform=\"rotate(45 17.0365 15.1223)\" fill=\"currentColor\"></rect>\n <path d=\"M11 19C6.55556 19 3 15.4444 3 11C3 6.55556 6.55556 3 11 3C15.4444 3 19 6.55556 19 11C19 15.4444 15.4444 19 11 19ZM11 5C7.53333 5 5 7.53333 5 11C5 14.4667 7.53333 17 11 17C14.4667 17 17 14.4667 17 11C17 7.53333 14.4667 5 11 5Z\"\n fill=\"currentColor\"></path>\n </svg>\n </span>\n <input [(ngModel)]=\"query\" type=\"text\" class=\"form-control ps-14 invoicesearch\"\n placeholder=\"Search client / entity / ID...\" autocomplete=\"off\"\n (change)=\"onSearch()\" />\n </div>\n <!-- Render only once options are built \u2014 lib-filters snapshots its\n dataObject in ngOnInit and never re-reads it, so it must\n initialize against the populated array. -->\n <lib-filters *ngIf=\"summaryFilterObject.length\"\n [dataObject]=\"summaryFilterObject\" (appliedFilters)=\"applySummaryFilters($event)\"></lib-filters>\n <!-- Show/hide AR-aging columns in table + export. -->\n <div class=\"form-check form-switch d-flex align-items-center gap-2 me-3\">\n <input class=\"form-check-input\" type=\"checkbox\" id=\"agingToggle\" [(ngModel)]=\"showAging\">\n <label class=\"form-check-label text-nowrap\" for=\"agingToggle\">Outstanding Aging</label>\n </div>\n <button type=\"button\" class=\"btn-outline btn align-items-end text-nowrap invheader\"\n [disabled]=\"!filtered.length\" (click)=\"onExport()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <span class=\"ms-2\">Export</span>\n </button>\n </div>\n </div>\n\n <!-- Loading shimmer -->\n <ng-container *ngIf=\"loading\">\n <div class=\"row loader d-flex justify-content-center align-items-center mt-4\">\n <div class=\"shimmer\">\n <div class=\"wrapper\">\n <div class=\"stroke animate title\"></div>\n <div class=\"stroke animate link\"></div>\n <div class=\"stroke animate description\"></div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- Empty -->\n <ng-container *ngIf=\"!loading && noData\">\n <div class=\"row\">\n <div class=\"col-lg-12 mb-3\">\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column\">\n <img class=\"img-src w-25\" src=\"./assets/tango/Icons/Nodata.svg\" alt=\"\">\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- Summary table \u2014 sticky two-row header + sticky totals footer -->\n <div *ngIf=\"!loading && !noData\" class=\"sum-scroll mt-3\">\n <table class=\"table sum-table text-nowrap mb-0\">\n <thead>\n <tr>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('clientId')\">Client ID\n <span class=\"arr\" [class.on]=\"sortKey === 'clientId'\">{{ sortKey === 'clientId' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('clientName')\">Client Name\n <span class=\"arr\" [class.on]=\"sortKey === 'clientName'\">{{ sortKey === 'clientName' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th rowspan=\"2\">Registered Entity</th>\n <ng-container *ngIf=\"showAging\">\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('outstanding')\">Total Outstanding\n <span class=\"arr\" [class.on]=\"sortKey === 'outstanding'\">{{ sortKey === 'outstanding' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('aging0to30')\">&lt; 30 days\n <span class=\"arr\" [class.on]=\"sortKey === 'aging0to30'\">{{ sortKey === 'aging0to30' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('aging30to60')\">30 to 60 days\n <span class=\"arr\" [class.on]=\"sortKey === 'aging30to60'\">{{ sortKey === 'aging30to60' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('agingOver60')\">&gt; 60 days\n <span class=\"arr\" [class.on]=\"sortKey === 'agingOver60'\">{{ sortKey === 'agingOver60' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n </ng-container>\n <th rowspan=\"2\">Status</th>\n <th rowspan=\"2\">Product</th>\n <th rowspan=\"2\">CSM</th>\n <th [attr.colspan]=\"months.length\" class=\"group-head\">Store Count</th>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('pricePerStore')\">Price / Store\n <span class=\"arr\" [class.on]=\"sortKey === 'pricePerStore'\">{{ sortKey === 'pricePerStore' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th colspan=\"2\" class=\"group-head\">Revenue</th>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('variance')\">Variance\n <span class=\"arr\" [class.on]=\"sortKey === 'variance'\">{{ sortKey === 'variance' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('installationFee')\">Installation Fee\n <span class=\"arr\" [class.on]=\"sortKey === 'installationFee'\">{{ sortKey === 'installationFee' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n </tr>\n <tr>\n <th *ngFor=\"let m of months; let i = index\" class=\"sub-head\"\n [class.sortable]=\"i === months.length - 1\"\n (click)=\"i === months.length - 1 ? sortBy('storesCur') : null\">\n {{ m.label }}<span *ngIf=\"i === months.length - 1\" class=\"arr\" [class.on]=\"sortKey === 'storesCur'\">{{ sortKey === 'storesCur' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th class=\"sub-head sortable\" (click)=\"sortBy('revPrev')\">{{ months[3].label }}<span class=\"arr\" [class.on]=\"sortKey === 'revPrev'\">{{ sortKey === 'revPrev' && sortDir === 1 ? '\u2191' : '\u2193' }}</span></th>\n <th class=\"sub-head sortable\" (click)=\"sortBy('revCur')\">{{ months[4].label }}<span class=\"arr\" [class.on]=\"sortKey === 'revCur'\">{{ sortKey === 'revCur' && sortDir === 1 ? '\u2191' : '\u2193' }}</span></th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let r of filtered\">\n <td>{{ r.clientId || '\u2014' }}</td>\n <td><strong>{{ r.clientName | uppercase }}</strong></td>\n <td>\n <span class=\"entity\" [title]=\"(r.registeredEntities && r.registeredEntities.length ? r.registeredEntities.join('\\n') : r.registeredEntity) || ''\">\n {{ r.registeredEntity || '\u2014' }}\n </span>\n <span *ngIf=\"r.registeredEntities?.length > 1\" class=\"entity-more\"\n [title]=\"r.registeredEntities.join('\\n')\">+{{ r.registeredEntities.length - 1 }}</span>\n </td>\n <ng-container *ngIf=\"showAging\">\n <td class=\"text-end\"><strong>{{ r.outstanding ? ('\u20B9' + (r.outstanding | number:'1.0-0':'en-IN')) : '\u2014' }}</strong></td>\n <td class=\"text-end\">{{ r.aging0to30 ? ('\u20B9' + (r.aging0to30 | number:'1.0-0':'en-IN')) : '\u2014' }}</td>\n <td class=\"text-end\">{{ r.aging30to60 ? ('\u20B9' + (r.aging30to60 | number:'1.0-0':'en-IN')) : '\u2014' }}</td>\n <td class=\"text-end\">{{ r.agingOver60 ? ('\u20B9' + (r.agingOver60 | number:'1.0-0':'en-IN')) : '\u2014' }}</td>\n </ng-container>\n <td><span class=\"pill\" [ngClass]=\"r.status === 'Paid' ? 'pill-green' : 'pill-amber'\">{{ r.status }}</span></td>\n <td>\n <span *ngFor=\"let p of r.products\" [ngClass]=\"productPillClass(p)\" class=\"me-1\">{{ p }}</span>\n <span *ngIf=\"!r.products?.length\" class=\"text-muted\">\u2014</span>\n </td>\n <td>{{ r.csm || '\u2014' }}</td>\n <td *ngFor=\"let s of r.stores; let i = index\" [class.fw-bold]=\"i === r.stores.length - 1\">\n {{ s == null ? '\u2014' : (s | number:'1.0-0':'en-IN') }}\n </td>\n <td [title]=\"r.currency === 'dollar' ? ('USD pricing \u2014 revenue converted to \u20B9 at today\\'s rate (' + (usdRate | number:'1.2-2') + ')') : ''\">\n {{ r.pricePerStore == null ? '\u2014' : (r.currency === 'dollar' ? '$' : '\u20B9') + (r.pricePerStore | number:'1.0-0':'en-IN') }}\n </td>\n <td class=\"text-muted\">{{ r.revPrev == null ? '\u2014' : '\u20B9' + (r.revPrev | number:'1.0-0':'en-IN') }}</td>\n <td>\n <strong>{{ r.revCur == null ? '\u2014' : '\u20B9' + (r.revCur | number:'1.0-0':'en-IN') }}</strong>\n <span *ngIf=\"r.revCurEstimated\" class=\"est-chip ms-1\"\n title=\"Estimated: current store count \u00D7 base price \u2014 replaced by the invoice amount once generated\">est.</span>\n </td>\n <td>\n <span *ngIf=\"r.variance != null\" class=\"fw-semibold\"\n [class.text-success]=\"r.variance > 0\" [class.text-danger]=\"r.variance < 0\"\n [title]=\"(months[3].label + ' ' + (r.revPrev == null ? '\u2014' : '\u20B9' + (r.revPrev | number:'1.0-0':'en-IN')) + ' \u2192 ' + months[4].label + ' ' + (r.revCur == null ? '\u2014' : '\u20B9' + (r.revCur | number:'1.0-0':'en-IN')))\">\n {{ r.variance > 0 ? '+' : '' }}{{ r.variance }}%\n </span>\n <span *ngIf=\"r.variance == null\" class=\"text-muted\">\u2014</span>\n </td>\n <td>{{ r.installationFee == null ? '\u2014' : '\u20B9' + (r.installationFee | number:'1.0-0':'en-IN') }}</td>\n </tr>\n <tr *ngIf=\"!filtered.length\">\n <td [attr.colspan]=\"(showAging ? 15 : 11) + months.length\" class=\"text-center text-muted py-5\">No clients match.</td>\n </tr>\n </tbody>\n <tfoot>\n <tr>\n <td colspan=\"3\">Total \u00B7 {{ totals.count }} clients</td>\n <ng-container *ngIf=\"showAging\">\n <td class=\"text-end\"><strong>\u20B9{{ totals.outstanding | number:'1.0-0':'en-IN' }}</strong></td>\n <td class=\"text-end\"><strong>\u20B9{{ totals.aging0to30 | number:'1.0-0':'en-IN' }}</strong></td>\n <td class=\"text-end\"><strong>\u20B9{{ totals.aging30to60 | number:'1.0-0':'en-IN' }}</strong></td>\n <td class=\"text-end\"><strong>\u20B9{{ totals.agingOver60 | number:'1.0-0':'en-IN' }}</strong></td>\n </ng-container>\n <td colspan=\"3\"></td>\n <td *ngFor=\"let t of totals.storeTotals\"><strong>{{ t | number:'1.0-0':'en-IN' }}</strong></td>\n <td></td>\n <td><strong>\u20B9{{ totals.revPrev | number:'1.0-0':'en-IN' }}</strong></td>\n <td><strong>\u20B9{{ totals.revCur | number:'1.0-0':'en-IN' }}</strong></td>\n <td></td>\n <td><strong>\u20B9{{ totals.installation | number:'1.0-0':'en-IN' }}</strong></td>\n </tr>\n </tfoot>\n </table>\n </div>\n</div>", styles: [":host ::ng-deep lib-filters .dropdown1{z-index:30!important}.sum-scroll{overflow:auto;max-height:64vh;border:1px solid #E4E7EC;border-radius:12px}.sum-table{min-width:1480px}.sum-table thead th{position:sticky;top:0;background:#f4f6f9;font-size:11.5px;letter-spacing:.04em;text-transform:uppercase;color:#8a93a2;font-weight:600;padding:11px 14px;border-bottom:1px solid #E4E7EC;white-space:nowrap;vertical-align:middle}.sum-table thead tr:nth-child(2) th{top:39px}.sum-table .group-head{text-align:center;border-bottom:1px solid #E4E7EC}.sum-table .sub-head{font-size:11px}.sum-table .sortable{cursor:pointer}.sum-table .sortable:hover{color:#1493f5}.sum-table .arr{color:#c2c7d0;margin-left:3px}.sum-table .arr.on{color:#1493f5}.sum-table tbody td{padding:13px 14px;border-bottom:1px solid #eceef1;vertical-align:middle;font-size:13.5px;color:#344054}.sum-table tbody tr:hover{background:#fbfcfe}.sum-table tfoot td{position:sticky;bottom:0;background:#eaf0f6;border-top:2px solid #E4E7EC;font-weight:700;padding:11px 14px;font-size:13px;color:#101828}.entity{display:inline-block;max-width:210px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;vertical-align:bottom}.pill{display:inline-flex;align-items:center;padding:2px 9px;border-radius:999px;font-size:11px;font-weight:600;white-space:nowrap}.pill-green{background:#e7f7ee;color:#138a52}.pill-amber{background:#fdf0dc;color:#b9740a}.pill-blue{background:#e8f3fe;color:#1573c4}.pill-gray{background:#f1f3f6;color:#667085}.est-chip{font-size:10px;font-weight:700;color:#b9740a;background:#fdf0dc;border-radius:999px;padding:1px 7px;vertical-align:middle;cursor:help}.countchip{background:#f1f3f6;color:#667085;font-weight:600;font-size:11px;border-radius:999px;padding:1px 8px}.status-tab{border:0;border-radius:8px;padding:7px 12px;font-weight:600;color:#5b6472;background:transparent}.status-tab:hover{background:#f4f6f9}.status-tab.active{background:#e8f3fe;color:#1493f5}.filter-panel{border:1px solid #E4E7EC;border-radius:14px;padding:16px 18px;background:#fbfdff}.entity-more{display:inline-block;margin-left:6px;background:#eef1f5;color:#475467;font-size:11px;font-weight:700;border-radius:999px;padding:1px 7px;cursor:help}.svg-icon.invoicesearch.position-absolute{top:50%;transform:translateY(-50%);margin-top:0!important}\n"] }]
308
+ args: [{ selector: 'lib-billing-summary', template: "<div class=\"px-4 pb-4\">\n <!-- Header: search + filter + export -->\n <div class=\"d-flex justify-content-between align-items-center mt-4 flex-wrap gap-2\">\n <div class=\"billingheader\">Billing Summary</div>\n <div class=\"d-flex align-items-center gap-2\">\n <div class=\"position-relative\">\n <span class=\"svg-icon invoicesearch svg-icon-1 position-absolute mt-6 ms-3\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <rect opacity=\"0.5\" x=\"17.0365\" y=\"15.1223\" width=\"8.15546\" height=\"2\" rx=\"1\"\n transform=\"rotate(45 17.0365 15.1223)\" fill=\"currentColor\"></rect>\n <path d=\"M11 19C6.55556 19 3 15.4444 3 11C3 6.55556 6.55556 3 11 3C15.4444 3 19 6.55556 19 11C19 15.4444 15.4444 19 11 19ZM11 5C7.53333 5 5 7.53333 5 11C5 14.4667 7.53333 17 11 17C14.4667 17 17 14.4667 17 11C17 7.53333 14.4667 5 11 5Z\"\n fill=\"currentColor\"></path>\n </svg>\n </span>\n <input [(ngModel)]=\"query\" type=\"text\" class=\"form-control ps-14 invoicesearch\"\n placeholder=\"Search client / entity / ID...\" autocomplete=\"off\"\n (change)=\"onSearch()\" />\n </div>\n <!-- Render only once options are built \u2014 lib-filters snapshots its\n dataObject in ngOnInit and never re-reads it, so it must\n initialize against the populated array. -->\n <lib-filters *ngIf=\"summaryFilterObject.length\"\n [dataObject]=\"summaryFilterObject\" (appliedFilters)=\"applySummaryFilters($event)\"></lib-filters>\n <!-- Show/hide AR-aging columns in table + export. -->\n <div class=\"form-check form-switch d-flex align-items-center gap-2 me-3\">\n <input class=\"form-check-input\" type=\"checkbox\" id=\"agingToggle\" [(ngModel)]=\"showAging\">\n <label class=\"form-check-label text-nowrap\" for=\"agingToggle\">Outstanding Aging</label>\n </div>\n <button type=\"button\" class=\"btn-outline btn align-items-end text-nowrap invheader\"\n [disabled]=\"!filtered.length\" (click)=\"onExport()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <span class=\"ms-2\">Export</span>\n </button>\n </div>\n </div>\n\n <!-- Loading shimmer -->\n <ng-container *ngIf=\"loading\">\n <div class=\"row loader d-flex justify-content-center align-items-center mt-4\">\n <div class=\"shimmer\">\n <div class=\"wrapper\">\n <div class=\"stroke animate title\"></div>\n <div class=\"stroke animate link\"></div>\n <div class=\"stroke animate description\"></div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- Empty -->\n <ng-container *ngIf=\"!loading && noData\">\n <div class=\"row\">\n <div class=\"col-lg-12 mb-3\">\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column\">\n <img class=\"img-src w-25\" src=\"./assets/tango/Icons/Nodata.svg\" alt=\"\">\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- Summary table \u2014 sticky two-row header + sticky totals footer -->\n <div *ngIf=\"!loading && !noData\" class=\"sum-scroll mt-3\">\n <table class=\"table sum-table text-nowrap mb-0\">\n <thead>\n <tr>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('clientId')\">Client ID\n <span class=\"arr\" [class.on]=\"sortKey === 'clientId'\">{{ sortKey === 'clientId' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('clientName')\">Client Name\n <span class=\"arr\" [class.on]=\"sortKey === 'clientName'\">{{ sortKey === 'clientName' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th rowspan=\"2\">Registered Entity</th>\n <ng-container *ngIf=\"showAging\">\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('outstanding')\">Total Outstanding\n <span class=\"arr\" [class.on]=\"sortKey === 'outstanding'\">{{ sortKey === 'outstanding' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('aging0to30')\">&lt; 30 days\n <span class=\"arr\" [class.on]=\"sortKey === 'aging0to30'\">{{ sortKey === 'aging0to30' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('aging30to60')\">30 to 60 days\n <span class=\"arr\" [class.on]=\"sortKey === 'aging30to60'\">{{ sortKey === 'aging30to60' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('agingOver60')\">&gt; 60 days\n <span class=\"arr\" [class.on]=\"sortKey === 'agingOver60'\">{{ sortKey === 'agingOver60' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n </ng-container>\n <th rowspan=\"2\">Status</th>\n <th rowspan=\"2\">Product</th>\n <th rowspan=\"2\">CSM</th>\n <th [attr.colspan]=\"months.length\" class=\"group-head\">Store Count</th>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('pricePerStore')\">Price / Store\n <span class=\"arr\" [class.on]=\"sortKey === 'pricePerStore'\">{{ sortKey === 'pricePerStore' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th colspan=\"2\" class=\"group-head\">Revenue</th>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('variance')\">Variance\n <span class=\"arr\" [class.on]=\"sortKey === 'variance'\">{{ sortKey === 'variance' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th *ngIf=\"showInstallation\" rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('installationFee')\">Installation Fee\n <span class=\"arr\" [class.on]=\"sortKey === 'installationFee'\">{{ sortKey === 'installationFee' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n </tr>\n <tr>\n <th *ngFor=\"let m of months; let i = index\" class=\"sub-head\"\n [class.sortable]=\"i === months.length - 1\"\n (click)=\"i === months.length - 1 ? sortBy('storesCur') : null\">\n {{ m.label }}<span *ngIf=\"i === months.length - 1\" class=\"arr\" [class.on]=\"sortKey === 'storesCur'\">{{ sortKey === 'storesCur' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th class=\"sub-head sortable\" (click)=\"sortBy('revPrev')\">{{ months[3].label }}<span class=\"arr\" [class.on]=\"sortKey === 'revPrev'\">{{ sortKey === 'revPrev' && sortDir === 1 ? '\u2191' : '\u2193' }}</span></th>\n <th class=\"sub-head sortable\" (click)=\"sortBy('revCur')\">{{ months[4].label }}<span class=\"arr\" [class.on]=\"sortKey === 'revCur'\">{{ sortKey === 'revCur' && sortDir === 1 ? '\u2191' : '\u2193' }}</span></th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let r of filtered\">\n <td>{{ r.clientId || '\u2014' }}</td>\n <td><strong>{{ r.clientName | uppercase }}</strong></td>\n <td>\n <span class=\"entity\" [title]=\"(r.registeredEntities && r.registeredEntities.length ? r.registeredEntities.join('\\n') : r.registeredEntity) || ''\">\n {{ r.registeredEntity || '\u2014' }}\n </span>\n <span *ngIf=\"r.registeredEntities?.length > 1\" class=\"entity-more\"\n [title]=\"r.registeredEntities.join('\\n')\">+{{ r.registeredEntities.length - 1 }}</span>\n </td>\n <ng-container *ngIf=\"showAging\">\n <td class=\"text-end\"><strong>{{ r.outstanding ? ('\u20B9' + (r.outstanding | number:'1.0-0':'en-IN')) : '\u2014' }}</strong></td>\n <td class=\"text-end\">{{ r.aging0to30 ? ('\u20B9' + (r.aging0to30 | number:'1.0-0':'en-IN')) : '\u2014' }}</td>\n <td class=\"text-end\">{{ r.aging30to60 ? ('\u20B9' + (r.aging30to60 | number:'1.0-0':'en-IN')) : '\u2014' }}</td>\n <td class=\"text-end\">{{ r.agingOver60 ? ('\u20B9' + (r.agingOver60 | number:'1.0-0':'en-IN')) : '\u2014' }}</td>\n </ng-container>\n <td><span class=\"pill\" [ngClass]=\"r.status === 'Paid' ? 'pill-green' : 'pill-amber'\">{{ r.status }}</span></td>\n <td>\n <span *ngFor=\"let p of r.products\" [ngClass]=\"productPillClass(p)\" class=\"me-1\">{{ p }}</span>\n <span *ngIf=\"!r.products?.length\" class=\"text-muted\">\u2014</span>\n </td>\n <td>{{ r.csm || '\u2014' }}</td>\n <td *ngFor=\"let s of r.stores; let i = index\" [class.fw-bold]=\"i === r.stores.length - 1\">\n {{ s == null ? '\u2014' : (s | number:'1.0-0':'en-IN') }}\n </td>\n <td [title]=\"r.currency === 'dollar' ? ('USD pricing \u2014 revenue converted to \u20B9 at today\\'s rate (' + (usdRate | number:'1.2-2') + ')') : ''\">\n {{ r.pricePerStore == null ? '\u2014' : (r.currency === 'dollar' ? '$' : '\u20B9') + (r.pricePerStore | number:'1.0-0':'en-IN') }}\n </td>\n <td class=\"text-muted\">{{ r.revPrev == null ? '\u2014' : '\u20B9' + (r.revPrev | number:'1.0-0':'en-IN') }}</td>\n <td>\n <strong>{{ r.revCur == null ? '\u2014' : '\u20B9' + (r.revCur | number:'1.0-0':'en-IN') }}</strong>\n <span *ngIf=\"r.revCurEstimated\" class=\"est-chip ms-1\"\n title=\"Estimated: current store count \u00D7 base price \u2014 replaced by the invoice amount once generated\">est.</span>\n </td>\n <td>\n <span *ngIf=\"r.variance != null\" class=\"fw-semibold\"\n [class.text-success]=\"r.variance > 0\" [class.text-danger]=\"r.variance < 0\"\n [title]=\"(months[3].label + ' ' + (r.revPrev == null ? '\u2014' : '\u20B9' + (r.revPrev | number:'1.0-0':'en-IN')) + ' \u2192 ' + months[4].label + ' ' + (r.revCur == null ? '\u2014' : '\u20B9' + (r.revCur | number:'1.0-0':'en-IN')))\">\n {{ r.variance > 0 ? '+' : '' }}{{ r.variance }}%\n </span>\n <span *ngIf=\"r.variance == null\" class=\"text-muted\">\u2014</span>\n </td>\n <td *ngIf=\"showInstallation\">{{ r.installationFee == null ? '\u2014' : '\u20B9' + (r.installationFee | number:'1.0-0':'en-IN') }}</td>\n </tr>\n <tr *ngIf=\"!filtered.length\">\n <td [attr.colspan]=\"(showAging ? 15 : 11) + months.length\" class=\"text-center text-muted py-5\">No clients match.</td>\n </tr>\n </tbody>\n <tfoot>\n <tr>\n <td colspan=\"3\">Total \u00B7 {{ totals.count }} clients</td>\n <ng-container *ngIf=\"showAging\">\n <td class=\"text-end\"><strong>\u20B9{{ totals.outstanding | number:'1.0-0':'en-IN' }}</strong></td>\n <td class=\"text-end\"><strong>\u20B9{{ totals.aging0to30 | number:'1.0-0':'en-IN' }}</strong></td>\n <td class=\"text-end\"><strong>\u20B9{{ totals.aging30to60 | number:'1.0-0':'en-IN' }}</strong></td>\n <td class=\"text-end\"><strong>\u20B9{{ totals.agingOver60 | number:'1.0-0':'en-IN' }}</strong></td>\n </ng-container>\n <td colspan=\"3\"></td>\n <td *ngFor=\"let t of totals.storeTotals\"><strong>{{ t | number:'1.0-0':'en-IN' }}</strong></td>\n <td></td>\n <td><strong>\u20B9{{ totals.revPrev | number:'1.0-0':'en-IN' }}</strong></td>\n <td><strong>\u20B9{{ totals.revCur | number:'1.0-0':'en-IN' }}</strong></td>\n <td></td>\n <td *ngIf=\"showInstallation\"><strong>\u20B9{{ totals.installation | number:'1.0-0':'en-IN' }}</strong></td>\n </tr>\n </tfoot>\n </table>\n </div>\n</div>", styles: [":host ::ng-deep lib-filters .dropdown1{z-index:30!important}.sum-scroll{overflow:auto;max-height:64vh;border:1px solid #E4E7EC;border-radius:12px}.sum-table{min-width:1480px}.sum-table thead th{position:sticky;top:0;z-index:4;background:#f4f6f9;font-size:11.5px;letter-spacing:.04em;text-transform:uppercase;color:#8a93a2;font-weight:600;padding:11px 14px;border-bottom:1px solid #E4E7EC;white-space:nowrap;vertical-align:middle}.sum-table thead tr:nth-child(2) th{top:39px}.sum-table .group-head{text-align:center;border-bottom:1px solid #E4E7EC}.sum-table .sub-head{font-size:11px}.sum-table .sortable{cursor:pointer}.sum-table .sortable:hover{color:#1493f5}.sum-table .arr{color:#c2c7d0;margin-left:3px}.sum-table .arr.on{color:#1493f5}.sum-table tbody td{padding:13px 14px;border-bottom:1px solid #eceef1;vertical-align:middle;font-size:13.5px;color:#344054}.sum-table tbody tr:hover{background:#fbfcfe}.sum-table tfoot td{position:sticky;bottom:0;background:#eaf0f6;border-top:2px solid #E4E7EC;font-weight:700;padding:11px 14px;font-size:13px;color:#101828}.sum-table thead th:nth-child(1),.sum-table tbody td:nth-child(1){position:sticky;left:0;width:120px;min-width:120px}.sum-table thead th:nth-child(2),.sum-table tbody td:nth-child(2){position:sticky;left:120px;width:200px;min-width:200px}.sum-table tbody td:nth-child(1),.sum-table tbody td:nth-child(2){background:#fff;z-index:1}.sum-table tbody tr:hover td:nth-child(1),.sum-table tbody tr:hover td:nth-child(2){background:#fbfcfe}.sum-table thead th:nth-child(1),.sum-table thead th:nth-child(2){z-index:6}.sum-table tfoot td:nth-child(1){left:0;z-index:3}.entity{display:inline-block;max-width:210px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;vertical-align:bottom}.pill{display:inline-flex;align-items:center;padding:2px 9px;border-radius:999px;font-size:11px;font-weight:600;white-space:nowrap}.pill-green{background:#e7f7ee;color:#138a52}.pill-amber{background:#fdf0dc;color:#b9740a}.pill-blue{background:#e8f3fe;color:#1573c4}.pill-gray{background:#f1f3f6;color:#667085}.est-chip{font-size:10px;font-weight:700;color:#b9740a;background:#fdf0dc;border-radius:999px;padding:1px 7px;vertical-align:middle;cursor:help}.countchip{background:#f1f3f6;color:#667085;font-weight:600;font-size:11px;border-radius:999px;padding:1px 8px}.status-tab{border:0;border-radius:8px;padding:7px 12px;font-weight:600;color:#5b6472;background:transparent}.status-tab:hover{background:#f4f6f9}.status-tab.active{background:#e8f3fe;color:#1493f5}.filter-panel{border:1px solid #E4E7EC;border-radius:14px;padding:16px 18px;background:#fbfdff}.entity-more{display:inline-block;margin-left:6px;background:#eef1f5;color:#475467;font-size:11px;font-weight:700;border-radius:999px;padding:1px 7px;cursor:help}.svg-icon.invoicesearch.position-absolute{top:50%;transform:translateY(-50%);margin-top:0!important}\n"] }]
303
309
  }], ctorParameters: () => [{ type: i1.BillingService }, { type: i2.ToastService }, { type: i0.ChangeDetectorRef }] });
304
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmlsbGluZy1zdW1tYXJ5LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS1iaWxsaW5nL3NyYy9saWIvY29tcG9uZW50cy9iaWxsaW5nLXN1bW1hcnkvYmlsbGluZy1zdW1tYXJ5LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS1iaWxsaW5nL3NyYy9saWIvY29tcG9uZW50cy9iaWxsaW5nLXN1bW1hcnkvYmlsbGluZy1zdW1tYXJ5LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBcUIsU0FBUyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUNoRixPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7Ozs7O0FBSTFDLDZFQUE2RTtBQUM3RSw4RUFBOEU7QUFDOUUsdUVBQXVFO0FBQ3ZFLDhDQUE4QztBQU05QyxNQUFNLE9BQU8sdUJBQXVCO0lBMkJ4QjtJQUNBO0lBQ0E7SUE1QlYsT0FBTyxHQUFHLElBQUksQ0FBQztJQUNmLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFFZixNQUFNLEdBQXFDLEVBQUUsQ0FBQztJQUM5QyxJQUFJLEdBQVUsRUFBRSxDQUFDO0lBQ2pCLHVFQUF1RTtJQUN2RSxPQUFPLEdBQWtCLElBQUksQ0FBQztJQUU5QixXQUFXO0lBQ1gsS0FBSyxHQUFHLEVBQUUsQ0FBQztJQUNYLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDbkIsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUNsQixhQUFhLEdBQUcsS0FBSyxDQUFDO0lBQ3RCLGNBQWMsR0FBMEMsS0FBSyxDQUFDO0lBRTlELDZEQUE2RDtJQUM3RCxPQUFPLEdBQWtCLFdBQVcsQ0FBQztJQUNyQyxPQUFPLEdBQVcsQ0FBQyxDQUFDLENBQUM7SUFFckIsNEVBQTRFO0lBQzVFLG9EQUFv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LENBQUM7SUFDOUIsQ0FBQztJQUVELHVDQUF1QztJQUN2QyxJQUFJLE1BQU07UUFDUixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQzNCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQzNDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEQsT0FBTztZQUNMLFdBQVc7WUFDWCxXQUFXLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQy9ELFVBQVUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDN0QsV0FBVyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsV0FBVyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMvRCxXQUFXLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQy9ELE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FB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QUFDO1FBQ3ZGLFFBQVEsQ0FBQyxXQUFXLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsV0FBVyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDdkYsUUFBUSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUM1QixRQUFRLENBQUMsa0JBQWtCLENBQUMsR0FBRyxHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRXBCLElBQUksQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFDL0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsWUFBWSxJQUFJLENBQUMsTUFBTSxVQUFVLENBQUMsQ0FBQztJQUNoRSxDQUFDO3dHQXZTVSx1QkFBdUI7NEZBQXZCLHVCQUF1QiwyRENkcEMsaW5iQXVMTTs7NEZEektPLHVCQUF1QjtrQkFMbkMsU0FBUzsrQkFDRSxxQkFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktc2hhcmVkJztcbmltcG9ydCB7IEJpbGxpbmdTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvYmlsbGluZy5zZXJ2aWNlJztcblxuLy8gQmlsbGluZyBTdW1tYXJ5IHRhYiAocHJvdG90eXBlIHBhcml0eSk6IG9uZSByb3cgcGVyIGNsaWVudCDigJQgbW9udGhseSBzdG9yZVxuLy8gY291bnRzIChkYWlseVByaWNpbmcpLCByZXZlbnVlIGZvciB0aGUgbGFzdCB0d28gbW9udGhzIHdpdGggdmFyaWFuY2UsIHByaWNlXG4vLyBwZXIgc3RvcmUgYW5kIGluc3RhbGxhdGlvbiBmZWUgKGludm9pY2VzKS4gRGF0YSBhcnJpdmVzIGluIG9uZSBjYWxsO1xuLy8gc2VhcmNoIC8gZmlsdGVyIC8gc29ydCBhbGwgcnVuIGNsaWVudC1zaWRlLlxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLWJpbGxpbmctc3VtbWFyeScsXG4gIHRlbXBsYXRlVXJsOiAnLi9iaWxsaW5nLXN1bW1hcnkuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vYmlsbGluZy1zdW1tYXJ5LmNvbXBvbmVudC5zY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBCaWxsaW5nU3VtbWFyeUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgbG9hZGluZyA9IHRydWU7XG4gIG5vRGF0YSA9IGZhbHNlO1xuXG4gIG1vbnRoczogeyBrZXk6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W10gPSBbXTtcbiAgcm93czogYW55W10gPSBbXTtcbiAgLy8gVG9kYXkncyBVU0QtPklOUiByYXRlIHVzZWQgYnkgdGhlIGJhY2tlbmQgZm9yIGRvbGxhci1wcmljZWQgY2xpZW50cy5cbiAgdXNkUmF0ZTogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgLy8gRmlsdGVycy5cbiAgcXVlcnkgPSAnJztcbiAgZmlsdGVyT3BlbiA9IGZhbHNlO1xuICBjc21GaWx0ZXIgPSAnQWxsJztcbiAgcHJvZHVjdEZpbHRlciA9ICdBbGwnO1xuICB2YXJpYW5jZUZpbHRlcjogJ0FsbCcgfCAnZ3Jvd3RoJyB8ICdkZWNsaW5lJyB8ICdmbGF0JyA9ICdBbGwnO1xuXG4gIC8vIFNvcnRpbmcuIERlZmF1bHQ6IGhpZ2hlc3QgY3VycmVudC1tb250aCBzdG9yZSBjb3VudCBmaXJzdC5cbiAgc29ydEtleTogc3RyaW5nIHwgbnVsbCA9ICdzdG9yZXNDdXInO1xuICBzb3J0RGlyOiAxIHwgLTEgPSAtMTtcblxuICAvLyBTaG93L2hpZGUgdGhlIEFSLWFnaW5nIGNvbHVtbnMgKFRvdGFsIE91dHN0YW5kaW5nIC8gPDMwIC8gMzAtNjAgLyA+NjApIGluXG4gIC8vIGJvdGggdGhlIHRhYmxlIGFuZCB0aGUgZXhwb3J0LiBIaWRkZW4gYnkgZGVmYXVsdC5cbiAgc2hvd0FnaW5nID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBiaWxsaW5nU2VydmljZTogQmlsbGluZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSB0b2FzdDogVG9hc3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxuICApIHt9XG5cbiAgLy8gRnVsbCByZXN1bHQtc2V0IHNpemUgKGJlZm9yZSBmaWx0ZXJzKSDigJQgZm9yIHRoZSBcIk4gb2YgTVwiIGhpbnQgYW5kIHRvIGtub3dcbiAgLy8gd2hlbiBmaWx0ZXJzIGFjdHVhbGx5IG5hcnJvd2VkIGFueXRoaW5nLlxuICB0b3RhbENvdW50ID0gMDtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRMaXN0KCk7XG4gIH1cblxuICAvLyBTZXJ2ZXItc2lkZSBsb2FkOiBmaWx0ZXJzIGFyZSBzZW50IHRvIHRoZSBBUEkgYW5kIGl0IHJldHVybnMgb25seSBtYXRjaGluZ1xuICAvLyByb3dzLiBDYWxsZWQgb24gZmlyc3QgbG9hZCBhbmQgd2hlbmV2ZXIgYSBmaWx0ZXIgb3Igc2VhcmNoIGNoYW5nZXMuXG4gIGxvYWRMaXN0KCk6IHZvaWQge1xuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgY29uc3QgZmlsdGVycyA9IHtcbiAgICAgIGNzbTogdGhpcy5jc21GaWx0ZXIsXG4gICAgICBwcm9kdWN0OiB0aGlzLnByb2R1Y3RGaWx0ZXIsXG4gICAgICB2YXJpYW5jZTogdGhpcy52YXJpYW5jZUZpbHRlcixcbiAgICAgIHNlYXJjaDogdGhpcy5xdWVyeSxcbiAgICB9O1xuICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UuYmlsbGluZ1N1bW1hcnkoZmlsdGVycykucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLm1vbnRocyA9IHJlcz8uZGF0YT8ubW9udGhzIHx8IFtdO1xuICAgICAgICB0aGlzLnJvd3MgPSByZXM/LmRhdGE/LmRhdGEgfHwgW107XG4gICAgICAgIHRoaXMudXNkUmF0ZSA9IHJlcz8uZGF0YT8udXNkUmF0ZSB8fCBudWxsO1xuICAgICAgICB0aGlzLnRvdGFsQ291bnQgPSByZXM/LmRhdGE/LnRvdGFsID8/IHRoaXMucm93cy5sZW5ndGg7XG4gICAgICAgIC8vIE9wdGlvbiBsaXN0cyBmb3IgdGhlIHBvcG92ZXIgY29tZSBmcm9tIHRoZSBBUEkncyBmdWxsIHJlc3VsdCBzZXQgc29cbiAgICAgICAgLy8gdGhleSBkb24ndCBzaHJpbmsgYXMgZmlsdGVycyBuYXJyb3cgdGhlIHRhYmxlLlxuICAgICAgICB0aGlzLmNzbUFwaU9wdGlvbnMgPSByZXM/LmRhdGE/LmNzbU9wdGlvbnMgfHwgdGhpcy5jc21BcGlPcHRpb25zO1xuICAgICAgICB0aGlzLnByb2R1Y3RBcGlPcHRpb25zID0gcmVzPy5kYXRhPy5wcm9kdWN0T3B0aW9ucyB8fCB0aGlzLnByb2R1Y3RBcGlPcHRpb25zO1xuICAgICAgICB0aGlzLm5vRGF0YSA9IHRoaXMucm93cy5sZW5ndGggPT09IDA7XG4gICAgICAgIC8vIEJ1aWxkIHRoZSBwb3BvdmVyIG9wdGlvbnMgT05DRSAod2hlbiBvcHRpb24gbGlzdHMgZmlyc3QgYXJyaXZlKS5cbiAgICAgICAgLy8gUmVidWlsZGluZyB0aGUgYXJyYXkgcmVmZXJlbmNlIG9uIGV2ZXJ5IGxvYWQgZGVzeW5jcyBsaWItZmlsdGVycydcbiAgICAgICAgLy8gaW50ZXJuYWwgc25hcHNob3QgKHRha2VuIGluIGl0cyBuZ09uSW5pdCksIHdoaWNoIHNpbGVudGx5IGRyb3BzIHRoZVxuICAgICAgICAvLyBzZWxlY3Rpb24gb24gQXBwbHkuXG4gICAgICAgIGlmICghdGhpcy5zdW1tYXJ5RmlsdGVyT2JqZWN0Lmxlbmd0aCAmJiAodGhpcy5jc21BcGlPcHRpb25zLmxlbmd0aCB8fCB0aGlzLnByb2R1Y3RBcGlPcHRpb25zLmxlbmd0aCkpIHtcbiAgICAgICAgICB0aGlzLmJ1aWxkRmlsdGVyT2JqZWN0KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMucm93cyA9IFtdO1xuICAgICAgICB0aGlzLm5vRGF0YSA9IHRydWU7XG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIC8vIERpc3RpbmN0IGZpbHRlciBvcHRpb25zIOKAlCBzdXBwbGllZCBieSB0aGUgQVBJIG92ZXIgaXRzIGZ1bGwgcmVzdWx0IHNldCBzb1xuICAvLyB0aGV5IGRvbid0IHNocmluayBhcyBmaWx0ZXJzIG5hcnJvdyB0aGUgdGFibGUuXG4gIGNzbUFwaU9wdGlvbnM6IHN0cmluZ1tdID0gW107XG4gIHByb2R1Y3RBcGlPcHRpb25zOiBzdHJpbmdbXSA9IFtdO1xuICBnZXQgY3NtT3B0aW9ucygpOiBzdHJpbmdbXSB7IHJldHVybiB0aGlzLmNzbUFwaU9wdGlvbnM7IH1cbiAgZ2V0IHByb2R1Y3RPcHRpb25zKCk6IHN0cmluZ1tdIHsgcmV0dXJuIHRoaXMucHJvZHVjdEFwaU9wdGlvbnM7IH1cblxuICAvLyBTdGFibGUgZmlsdGVyLXBvcG92ZXIgZGF0YSBmb3IgbGliLWZpbHRlcnMuIE1VU1QgYmUgYSBoZWxkIHByb3BlcnR5LCBub3QgYVxuICAvLyBnZXR0ZXI6IGxpYi1maWx0ZXJzIG11dGF0ZXMgdGhpcyBvYmplY3QgKHNldHMgaXNPcGVuIG9uIGEgc2VjdGlvbiB3aGVuIGl0c1xuICAvLyBpbm5lciBkcm9wZG93biBpcyBjbGlja2VkKS4gQSBnZXR0ZXIgd291bGQgaGFuZCBiYWNrIGEgZnJlc2ggYXJyYXkgZWFjaFxuICAvLyBjaGFuZ2UtZGV0ZWN0aW9uIGN5Y2xlLCB3aXBpbmcgaXNPcGVuIHNvIHRoZSBkcm9wZG93biBuZXZlciBzdGF5cyBvcGVuLlxuICAvLyBSZWJ1aWx0IG9ubHkgd2hlbiB0aGUgZGF0YSBzZXQgY2hhbmdlcyAobG9hZExpc3QpIOKAlCBzZWUgYnVpbGRGaWx0ZXJPYmplY3QuXG4gIHN1bW1hcnlGaWx0ZXJPYmplY3Q6IGFueVtdID0gW107XG5cbiAgcHJpdmF0ZSBidWlsZEZpbHRlck9iamVjdCgpOiB2b2lkIHtcbiAgICB0aGlzLnN1bW1hcnlGaWx0ZXJPYmplY3QgPSBbXG4gICAgICB7XG4gICAgICAgIERlc2NyaXB0aW9uOiAnQ1NNJywgdHlwZTogJ3NpbmdsZScsIGlzT3BlbjogZmFsc2UsXG4gICAgICAgIElzc3VlczogW3sgaWQ6ICdBbGwnLCB0ZXh0OiAnQWxsJywgY2hlY2tlZDogdGhpcy5jc21GaWx0ZXIgPT09ICdBbGwnIH1dXG4gICAgICAgICAgLmNvbmNhdCh0aGlzLmNzbU9wdGlvbnMubWFwKGMgPT4gKHsgaWQ6IGMsIHRleHQ6IGMsIGNoZWNrZWQ6IHRoaXMuY3NtRmlsdGVyID09PSBjIH0pKSksXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBEZXNjcmlwdGlvbjogJ1Byb2R1Y3QnLCB0eXBlOiAnc2luZ2xlJywgaXNPcGVuOiBmYWxzZSxcbiAgICAgICAgSXNzdWVzOiBbeyBpZDogJ0FsbCcsIHRleHQ6ICdBbGwnLCBjaGVja2VkOiB0aGlzLnByb2R1Y3RGaWx0ZXIgPT09ICdBbGwnIH1dXG4gICAgICAgICAgLmNvbmNhdCh0aGlzLnByb2R1Y3RPcHRpb25zLm1hcChwID0+ICh7IGlkOiBwLCB0ZXh0OiBwLCBjaGVja2VkOiB0aGlzLnByb2R1Y3RGaWx0ZXIgPT09IHAgfSkpKSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIERlc2NyaXB0aW9uOiAnVmFyaWFuY2UnLCB0eXBlOiAnc2luZ2xlJywgaXNPcGVuOiBmYWxzZSxcbiAgICAgICAgSXNzdWVzOiBbXG4gICAgICAgICAgeyBpZDogJ0FsbCcsIHRleHQ6ICdBbGwnLCBjaGVja2VkOiB0aGlzLnZhcmlhbmNlRmlsdGVyID09PSAnQWxsJyB9LFxuICAgICAgICAgIHsgaWQ6ICdncm93dGgnLCB0ZXh0OiAnR3Jvd3RoJywgY2hlY2tlZDogdGhpcy52YXJpYW5jZUZpbHRlciA9PT0gJ2dyb3d0aCcgfSxcbiAgICAgICAgICB7IGlkOiAnZGVjbGluZScsIHRleHQ6ICdEZWNsaW5lJywgY2hlY2tlZDogdGhpcy52YXJpYW5jZUZpbHRlciA9PT0gJ2RlY2xpbmUnIH0sXG4gICAgICAgICAgeyBpZDogJ2ZsYXQnLCB0ZXh0OiAnRmxhdCcsIGNoZWNrZWQ6IHRoaXMudmFyaWFuY2VGaWx0ZXIgPT09ICdmbGF0JyB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICBdO1xuICB9XG5cbiAgYXBwbHlTdW1tYXJ5RmlsdGVycyhldmVudDogYW55KSB7XG4gICAgLy8gbGliLWZpbHRlcnMgZW1pdHMgdGhlIGZ1bGwgc2VjdGlvbnMgYXJyYXkuIEZvciBhIHNpbmdsZS1zZWxlY3Qgc2VjdGlvblxuICAgIC8vIHRoZSBwaWNrZWQgb3B0aW9uIGlzIHN0b3JlZCBpbiBJc3N1ZXMg4oCUIGJ1dCBkZXBlbmRpbmcgb24gdGhlIGxpYidzIHBhdGhcbiAgICAvLyBpdCBtYXkgYmUgYSBzaW5nbGUgb2JqZWN0IE9SIGEgb25lLWVsZW1lbnQgYXJyYXksIGFuZCBhIG5vdC15ZXQtcGlja2VkXG4gICAgLy8gc2VjdGlvbiBpcyBhbiBlbXB0eSBhcnJheS4gTm9ybWFsaXplIGFsbCBvZiB0aG9zZSB0byB0aGUgY2hvc2VuIGlkLlxuICAgIGNvbnN0IHBpY2tJZCA9IChzZWN0aW9uOiBhbnkpOiBzdHJpbmcgPT4ge1xuICAgICAgY29uc3QgaXNzID0gc2VjdGlvbj8uSXNzdWVzO1xuICAgICAgY29uc3QgcGlja2VkID0gQXJyYXkuaXNBcnJheShpc3MpID8gaXNzWzBdIDogaXNzO1xuICAgICAgcmV0dXJuIHBpY2tlZD8uaWQgfHwgJyc7XG4gICAgfTtcbiAgICB0aGlzLmNzbUZpbHRlciA9ICdBbGwnO1xuICAgIHRoaXMucHJvZHVjdEZpbHRlciA9ICdBbGwnO1xuICAgIHRoaXMudmFyaWFuY2VGaWx0ZXIgPSAnQWxsJztcbiAgICAoZXZlbnQgfHwgW10pLmZvckVhY2goKHNlY3Rpb246IGFueSkgPT4ge1xuICAgICAgY29uc3QgaWQgPSBwaWNrSWQoc2VjdGlvbik7XG4gICAgICBpZiAoIWlkKSByZXR1cm47XG4gICAgICBpZiAoc2VjdGlvbi5EZXNjcmlwdGlvbiA9PT0gJ0NTTScpIHRoaXMuY3NtRmlsdGVyID0gaWQ7XG4gICAgICBlbHNlIGlmIChzZWN0aW9uLkRlc2NyaXB0aW9uID09PSAnUHJvZHVjdCcpIHRoaXMucHJvZHVjdEZpbHRlciA9IGlkO1xuICAgICAgZWxzZSBpZiAoc2VjdGlvbi5EZXNjcmlwdGlvbiA9PT0gJ1ZhcmlhbmNlJykgdGhpcy52YXJpYW5jZUZpbHRlciA9IGlkIGFzIGFueTtcbiAgICB9KTtcbiAgICAvLyBSZS1xdWVyeSB0aGUgQVBJIHdpdGggdGhlIG5ldyBmaWx0ZXJzLiBEbyBOT1QgcmVidWlsZCBzdW1tYXJ5RmlsdGVyT2JqZWN0XG4gICAgLy8gaGVyZSDigJQgcmVhc3NpZ25pbmcgdGhlIGFycmF5IHJlZmVyZW5jZSBkZXN5bmNzIGxpYi1maWx0ZXJzJyBpbnRlcm5hbFxuICAgIC8vIHNuYXBzaG90IGFuZCB3b3VsZCBicmVhayB0aGUgbmV4dCBBcHBseS5cbiAgICB0aGlzLmxvYWRMaXN0KCk7XG4gIH1cblxuICAvLyBTZWFyY2ggYm94IGNoYW5nZSDihpIgcmUtcXVlcnkuXG4gIG9uU2VhcmNoKCkge1xuICAgIHRoaXMubG9hZExpc3QoKTtcbiAgfVxuXG4gIC8vIENsZWFyIGFsbCBmaWx0ZXJzIGFuZCByZWxvYWQuXG4gIGNsZWFyQWxsRmlsdGVycygpIHtcbiAgICB0aGlzLmNzbUZpbHRlciA9ICdBbGwnO1xuICAgIHRoaXMucHJvZHVjdEZpbHRlciA9ICdBbGwnO1xuICAgIHRoaXMudmFyaWFuY2VGaWx0ZXIgPSAnQWxsJztcbiAgICB0aGlzLnF1ZXJ5ID0gJyc7XG4gICAgdGhpcy5idWlsZEZpbHRlck9iamVjdCgpO1xuICAgIHRoaXMubG9hZExpc3QoKTtcbiAgfVxuXG4gIC8vIFJvd3MgY29tZSBiYWNrIGFscmVhZHkgZmlsdGVyZWQgYnkgdGhlIEFQSTsgdGhpcyBnZXR0ZXIgb25seSBhcHBsaWVzIHRoZVxuICAvLyBjbGllbnQtc2lkZSBjb2x1bW4gc29ydC5cbiAgZ2V0IGZpbHRlcmVkKCk6IGFueVtdIHtcbiAgICBsZXQgbGlzdCA9IHRoaXMucm93cztcbiAgICBpZiAodGhpcy5zb3J0S2V5KSB7XG4gICAgICBjb25zdCBrID0gdGhpcy5zb3J0S2V5O1xuICAgICAgY29uc3QgZ2V0ID0gKHI6IGFueSkgPT5cbiAgICAgICAgayA9PT0gJ3N0b3Jlc0N1cicgPyByLnN0b3Jlc1tyLnN0b3Jlcy5sZW5ndGggLSAxXSA6IHJba107XG4gICAgICBsaXN0ID0gWy4uLmxpc3RdLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgY29uc3QgeCA9IGdldChhKSwgeSA9IGdldChiKTtcbiAgICAgICAgaWYgKHggPT0gbnVsbCAmJiB5ID09IG51bGwpIHJldHVybiAwO1xuICAgICAgICBpZiAoeCA9PSBudWxsKSByZXR1cm4gMTtcbiAgICAgICAgaWYgKHkgPT0gbnVsbCkgcmV0dXJuIC0xO1xuICAgICAgICAvLyBjbGllbnRJZCBpcyBhIHN0cmluZyBidXQgbXVzdCBzb3J0IG51bWVyaWNhbGx5ICgnMjAnIGJlZm9yZSAnMTAwJykuXG4gICAgICAgIGlmIChrID09PSAnY2xpZW50SWQnKSByZXR1cm4gdGhpcy5zb3J0RGlyICogKE51bWJlcih4KSAtIE51bWJlcih5KSk7XG4gICAgICAgIGlmICh0eXBlb2YgeCA9PT0gJ3N0cmluZycpIHJldHVybiB0aGlzLnNvcnREaXIgKiB4LmxvY2FsZUNvbXBhcmUoeSk7XG4gICAgICAgIHJldHVybiB0aGlzLnNvcnREaXIgKiAoeCAtIHkpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBsaXN0O1xuICB9XG5cbiAgc29ydEJ5KGtleTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuc29ydEtleSA9PT0ga2V5KSB7XG4gICAgICB0aGlzLnNvcnREaXIgPSB0aGlzLnNvcnREaXIgPT09IDEgPyAtMSA6IDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc29ydEtleSA9IGtleTtcbiAgICAgIHRoaXMuc29ydERpciA9IChrZXkgPT09ICdjbGllbnROYW1lJyB8fCBrZXkgPT09ICdjbGllbnRJZCcpID8gMSA6IC0xO1xuICAgIH1cbiAgfVxuXG4gIGdldCBhY3RpdmVGaWx0ZXJDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiAodGhpcy5jc21GaWx0ZXIgIT09ICdBbGwnID8gMSA6IDApICtcbiAgICAgICAgICAgKHRoaXMucHJvZHVjdEZpbHRlciAhPT0gJ0FsbCcgPyAxIDogMCkgK1xuICAgICAgICAgICAodGhpcy52YXJpYW5jZUZpbHRlciAhPT0gJ0FsbCcgPyAxIDogMCk7XG4gIH1cblxuICBjbGVhckZpbHRlcnMoKSB7XG4gICAgdGhpcy5jc21GaWx0ZXIgPSAnQWxsJztcbiAgICB0aGlzLnByb2R1Y3RGaWx0ZXIgPSAnQWxsJztcbiAgICB0aGlzLnZhcmlhbmNlRmlsdGVyID0gJ0FsbCc7XG4gIH1cblxuICAvLyBGb290ZXIgdG90YWxzIG92ZXIgdGhlIGZpbHRlcmVkIHNldC5cbiAgZ2V0IHRvdGFscygpIHtcbiAgICBjb25zdCBsaXN0ID0gdGhpcy5maWx0ZXJlZDtcbiAgICBjb25zdCBzdG9yZVRvdGFscyA9IHRoaXMubW9udGhzLm1hcCgoXywgaSkgPT5cbiAgICAgIGxpc3QucmVkdWNlKChhLCByKSA9PiBhICsgKHIuc3RvcmVzW2ldIHx8IDApLCAwKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0b3JlVG90YWxzLFxuICAgICAgb3V0c3RhbmRpbmc6IGxpc3QucmVkdWNlKChhLCByKSA9PiBhICsgKHIub3V0c3RhbmRpbmcgfHwgMCksIDApLFxuICAgICAgYWdpbmcwdG8zMDogbGlzdC5yZWR1Y2UoKGEsIHIpID0+IGEgKyAoci5hZ2luZzB0bzMwIHx8IDApLCAwKSxcbiAgICAgIGFnaW5nMzB0bzYwOiBsaXN0LnJlZHVjZSgoYSwgcikgPT4gYSArIChyLmFnaW5nMzB0bzYwIHx8IDApLCAwKSxcbiAgICAgIGFnaW5nT3ZlcjYwOiBsaXN0LnJlZHVjZSgoYSwgcikgPT4gYSArIChyLmFnaW5nT3ZlcjYwIHx8IDApLCAwKSxcbiAgICAgIHJldlByZXY6IGxpc3QucmVkdWNlKChhLCByKSA9PiBhICsgKHIucmV2UHJldiB8fCAwKSwgMCksXG4gICAgICByZXZDdXI6IGxpc3QucmVkdWNlKChhLCByKSA9PiBhICsgKHIucmV2Q3VyIHx8IDApLCAwKSxcbiAgICAgIGluc3RhbGxhdGlvbjogbGlzdC5yZWR1Y2UoKGEsIHIpID0+IGEgKyAoci5pbnN0YWxsYXRpb25GZWUgfHwgMCksIDApLFxuICAgICAgY291bnQ6IGxpc3QubGVuZ3RoLFxuICAgIH07XG4gIH1cblxuICBwcm9kdWN0UGlsbENsYXNzKHA6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgbG8gPSAocCB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAobG8uaW5jbHVkZXMoJ3RyYWZmaWMnKSkgcmV0dXJuICdwaWxsIHBpbGwtYmx1ZSc7XG4gICAgaWYgKGxvLmluY2x1ZGVzKCd6b25lJykpIHJldHVybiAncGlsbCBwaWxsLWdyZWVuJztcbiAgICBpZiAobG8uaW5jbHVkZXMoJ3RyYXgnKSkgcmV0dXJuICdwaWxsIHBpbGwtYW1iZXInO1xuICAgIHJldHVybiAncGlsbCBwaWxsLWdyYXknO1xuICB9XG5cbiAgb25FeHBvcnQoKSB7XG4gICAgY29uc3QgbGlzdCA9IHRoaXMuZmlsdGVyZWQ7XG4gICAgaWYgKCFsaXN0Lmxlbmd0aCkge1xuICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdOb3RoaW5nIHRvIGV4cG9ydCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBDb2VyY2UgYmxhbmsvdW5kZWZpbmVkIG51bWVyaWMgY2VsbHMgdG8gMCBzbyB0aGUgZXhwb3J0IG5ldmVyIGhhcyBnYXBzLlxuICAgIGNvbnN0IG51bSA9ICh2OiBhbnkpID0+ICh2ID09IG51bGwgfHwgdiA9PT0gJycgfHwgTnVtYmVyLmlzTmFOKE51bWJlcih2KSkgPyAwIDogTnVtYmVyKHYpKTtcbiAgICBjb25zdCByb3dzID0gbGlzdC5tYXAociA9PiB7XG4gICAgICBjb25zdCBvdXQ6IGFueSA9IHtcbiAgICAgICAgJ0NsaWVudCBJRCc6IHIuY2xpZW50SWQsXG4gICAgICAgICdDbGllbnQgTmFtZSc6IHIuY2xpZW50TmFtZSxcbiAgICAgICAgJ1JlZ2lzdGVyZWQgRW50aXR5Jzogci5yZWdpc3RlcmVkRW50aXR5LFxuICAgICAgfTtcbiAgICAgIC8vIEFnaW5nIGNvbHVtbnMgb25seSB3aGVuIHRoZSB0b2dnbGUgaXMgb24uXG4gICAgICBpZiAodGhpcy5zaG93QWdpbmcpIHtcbiAgICAgICAgb3V0WydUb3RhbCBPdXRzdGFuZGluZyddID0gbnVtKHIub3V0c3RhbmRpbmcpO1xuICAgICAgICBvdXRbJzwgMzAgZGF5cyddID0gbnVtKHIuYWdpbmcwdG8zMCk7XG4gICAgICAgIG91dFsnMzAgdG8gNjAgZGF5cyddID0gbnVtKHIuYWdpbmczMHRvNjApO1xuICAgICAgICBvdXRbJz4gNjAgZGF5cyddID0gbnVtKHIuYWdpbmdPdmVyNjApO1xuICAgICAgfVxuICAgICAgb3V0WydTdGF0dXMnXSA9IHIuc3RhdHVzO1xuICAgICAgb3V0WydQcm9kdWN0J10gPSAoci5wcm9kdWN0cyB8fCBbXSkuam9pbignICsgJyk7XG4gICAgICBvdXRbJ0NTTSddID0gci5jc207XG4gICAgICB0aGlzLm1vbnRocy5mb3JFYWNoKChtLCBpKSA9PiBvdXRbYFN0b3JlcyAke20ubGFiZWx9YF0gPSBudW0oci5zdG9yZXM/LltpXSkpO1xuICAgICAgb3V0WydQcmljaW5nIEN1cnJlbmN5J10gPSByLmN1cnJlbmN5ID09PSAnZG9sbGFyJyA/ICdVU0QnIDogJ0lOUic7XG4gICAgICBvdXRbYFByaWNlL1N0b3JlYF0gPSBudW0oci5wcmljZVBlclN0b3JlKTtcbiAgICAgIG91dFtgUmV2ZW51ZSAke3RoaXMubW9udGhzWzNdPy5sYWJlbH1gXSA9IG51bShyLnJldlByZXYpO1xuICAgICAgb3V0W2BSZXZlbnVlICR7dGhpcy5tb250aHNbNF0/LmxhYmVsfWBdID0gbnVtKHIucmV2Q3VyKTtcbiAgICAgIG91dFsnVmFyaWFuY2UgJSddID0gbnVtKHIudmFyaWFuY2UpO1xuICAgICAgb3V0WydJbnN0YWxsYXRpb24gRmVlJ10gPSBudW0oci5pbnN0YWxsYXRpb25GZWUpO1xuICAgICAgcmV0dXJuIG91dDtcbiAgICB9KTtcblxuICAgIC8vIEFwcGVuZCBhIFRvdGFsIHJvdyBzdW1taW5nIGV2ZXJ5IG51bWVyaWMgY29sdW1uLiBQZXItcm93IHJhdGVzXG4gICAgLy8gKFByaWNlL1N0b3JlLCBWYXJpYW5jZSAlKSBhcmVuJ3QgYWRkaXRpdmUsIHNvIHRoZXkncmUgbGVmdCBibGFuay5cbiAgICBjb25zdCBzdW0gPSAoa2V5OiBzdHJpbmcpID0+IHJvd3MucmVkdWNlKChhLCByKSA9PiBhICsgKE51bWJlcihyW2tleV0pIHx8IDApLCAwKTtcbiAgICBjb25zdCB0b3RhbFJvdzogYW55ID0ge1xuICAgICAgJ0NsaWVudCBJRCc6ICcnLFxuICAgICAgJ0NsaWVudCBOYW1lJzogJ1RvdGFsJyxcbiAgICAgICdSZWdpc3RlcmVkIEVudGl0eSc6ICcnLFxuICAgIH07XG4gICAgaWYgKHRoaXMuc2hvd0FnaW5nKSB7XG4gICAgICB0b3RhbFJvd1snVG90YWwgT3V0c3RhbmRpbmcnXSA9IHN1bSgnVG90YWwgT3V0c3RhbmRpbmcnKTtcbiAgICAgIHRvdGFsUm93Wyc8IDMwIGRheXMnXSA9IHN1bSgnPCAzMCBkYXlzJyk7XG4gICAgICB0b3RhbFJvd1snMzAgdG8gNjAgZGF5cyddID0gc3VtKCczMCB0byA2MCBkYXlzJyk7XG4gICAgICB0b3RhbFJvd1snPiA2MCBkYXlzJ10gPSBzdW0oJz4gNjAgZGF5cycpO1xuICAgIH1cbiAgICB0b3RhbFJvd1snU3RhdHVzJ10gPSAnJztcbiAgICB0b3RhbFJvd1snUHJvZHVjdCddID0gJyc7XG4gICAgdG90YWxSb3dbJ0NTTSddID0gJyc7XG4gICAgdGhpcy5tb250aHMuZm9yRWFjaCgobSkgPT4gdG90YWxSb3dbYFN0b3JlcyAke20ubGFiZWx9YF0gPSBzdW0oYFN0b3JlcyAke20ubGFiZWx9YCkpO1xuICAgIHRvdGFsUm93WydQcmljaW5nIEN1cnJlbmN5J10gPSAnJztcbiAgICB0b3RhbFJvd1tgUHJpY2UvU3RvcmVgXSA9ICcnO1xuICAgIHRvdGFsUm93W2BSZXZlbnVlICR7dGhpcy5tb250aHNbM10/LmxhYmVsfWBdID0gc3VtKGBSZXZlbnVlICR7dGhpcy5tb250aHNbM10/LmxhYmVsfWApO1xuICAgIHRvdGFsUm93W2BSZXZlbnVlICR7dGhpcy5tb250aHNbNF0/LmxhYmVsfWBdID0gc3VtKGBSZXZlbnVlICR7dGhpcy5tb250aHNbNF0/LmxhYmVsfWApO1xuICAgIHRvdGFsUm93WydWYXJpYW5jZSAlJ10gPSAnJztcbiAgICB0b3RhbFJvd1snSW5zdGFsbGF0aW9uIEZlZSddID0gc3VtKCdJbnN0YWxsYXRpb24gRmVlJyk7XG4gICAgcm93cy5wdXNoKHRvdGFsUm93KTtcblxuICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UuZXhwb3J0QXNFeGNlbEZpbGUocm93cywgJ2JpbGxpbmctc3VtbWFyeScpO1xuICAgIHRoaXMudG9hc3QuZ2V0UHJpbWFyeVRvYXN0KGBFeHBvcnRlZCAke2xpc3QubGVuZ3RofSBjbGllbnRzYCk7XG4gIH1cbn0iLCI8ZGl2IGNsYXNzPVwicHgtNCBwYi00XCI+XG4gICAgPCEtLSBIZWFkZXI6IHNlYXJjaCArIGZpbHRlciArIGV4cG9ydCAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC00IGZsZXgtd3JhcCBnYXAtMlwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYmlsbGluZ2hlYWRlclwiPkJpbGxpbmcgU3VtbWFyeTwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvc2l0aW9uLXJlbGF0aXZlXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdmctaWNvbiBpbnZvaWNlc2VhcmNoIHN2Zy1pY29uLTEgcG9zaXRpb24tYWJzb2x1dGUgbXQtNiBtcy0zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgb3BhY2l0eT1cIjAuNVwiIHg9XCIxNy4wMzY1XCIgeT1cIjE1LjEyMjNcIiB3aWR0aD1cIjguMTU1NDZcIiBoZWlnaHQ9XCIyXCIgcng9XCIxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm09XCJyb3RhdGUoNDUgMTcuMDM2NSAxNS4xMjIzKVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIj48L3JlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTExIDE5QzYuNTU1NTYgMTkgMyAxNS40NDQ0IDMgMTFDMyA2LjU1NTU2IDYuNTU1NTYgMyAxMSAzQzE1LjQ0NDQgMyAxOSA2LjU1NTU2IDE5IDExQzE5IDE1LjQ0NDQgMTUuNDQ0NCAxOSAxMSAxOVpNMTEgNUM3LjUzMzMzIDUgNSA3LjUzMzMzIDUgMTFDNSAxNC40NjY3IDcuNTMzMzMgMTcgMTEgMTdDMTQuNDY2NyAxNyAxNyAxNC40NjY3IDE3IDExQzE3IDcuNTMzMzMgMTQuNDY2NyA1IDExIDVaXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCI+PC9wYXRoPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPGlucHV0IFsobmdNb2RlbCldPVwicXVlcnlcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIHBzLTE0IGludm9pY2VzZWFyY2hcIlxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBjbGllbnQgLyBlbnRpdHkgLyBJRC4uLlwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25TZWFyY2goKVwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwhLS0gUmVuZGVyIG9ubHkgb25jZSBvcHRpb25zIGFyZSBidWlsdCDigJQgbGliLWZpbHRlcnMgc25hcHNob3RzIGl0c1xuICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0IGluIG5nT25Jbml0IGFuZCBuZXZlciByZS1yZWFkcyBpdCwgc28gaXQgbXVzdFxuICAgICAgICAgICAgICAgICBpbml0aWFsaXplIGFnYWluc3QgdGhlIHBvcHVsYXRlZCBhcnJheS4gLS0+XG4gICAgICAgICAgICA8bGliLWZpbHRlcnMgKm5nSWY9XCJzdW1tYXJ5RmlsdGVyT2JqZWN0Lmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgW2RhdGFPYmplY3RdPVwic3VtbWFyeUZpbHRlck9iamVjdFwiIChhcHBsaWVkRmlsdGVycyk9XCJhcHBseVN1bW1hcnlGaWx0ZXJzKCRldmVudClcIj48L2xpYi1maWx0ZXJzPlxuICAgICAgICAgICAgPCEtLSBTaG93L2hpZGUgQVItYWdpbmcgY29sdW1ucyBpbiB0YWJsZSArIGV4cG9ydC4gLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBmb3JtLXN3aXRjaCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yIG1lLTNcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJhZ2luZ1RvZ2dsZVwiIFsobmdNb2RlbCldPVwic2hvd0FnaW5nXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbCB0ZXh0LW5vd3JhcFwiIGZvcj1cImFnaW5nVG9nZ2xlXCI+T3V0c3RhbmRpbmcgQWdpbmc8L2xhYmVsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1vdXRsaW5lIGJ0biBhbGlnbi1pdGVtcy1lbmQgdGV4dC1ub3dyYXAgaW52aGVhZGVyXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWZpbHRlcmVkLmxlbmd0aFwiIChjbGljayk9XCJvbkV4cG9ydCgpXCI+XG4gICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTcuNSAxMi41VjE1LjgzMzNDMTcuNSAxNi4yNzU0IDE3LjMyNDQgMTYuNjk5MyAxNy4wMTE4IDE3LjAxMThDMTYuNjk5MyAxNy4zMjQ0IDE2LjI3NTQgMTcuNSAxNS44MzMzIDE3LjVINC4xNjY2N0MzLjcyNDY0IDE3LjUgMy4zMDA3MiAxNy4zMjQ0IDIuOTg4MTYgMTcuMDExOEMyLjY3NTU5IDE2LjY5OTMgMi41IDE2LjI3NTQgMi41IDE1LjgzMzNWMTIuNU0xNC4xNjY3IDYuNjY2NjdMMTAgMi41TTEwIDIuNUw1LjgzMzMzIDYuNjY2NjdNMTAgMi41VjEyLjVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXMtMlwiPkV4cG9ydDwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gTG9hZGluZyBzaGltbWVyIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsb2FkaW5nXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbG9hZGVyIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBtdC00XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gRW1wdHkgLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsb2FkaW5nICYmIG5vRGF0YVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWxnLTEyIG1iLTNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LWNvbHVtblwiPlxuICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiaW1nLXNyYyB3LTI1XCIgc3JjPVwiLi9hc3NldHMvdGFuZ28vSWNvbnMvTm9kYXRhLnN2Z1wiIGFsdD1cIlwiPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSBTdW1tYXJ5IHRhYmxlIOKAlCBzdGlja3kgdHdvLXJvdyBoZWFkZXIgKyBzdGlja3kgdG90YWxzIGZvb3RlciAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiIWxvYWRpbmcgJiYgIW5vRGF0YVwiIGNsYXNzPVwic3VtLXNjcm9sbCBtdC0zXCI+XG4gICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIHN1bS10YWJsZSB0ZXh0LW5vd3JhcCBtYi0wXCI+XG4gICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICA8dGggcm93c3Bhbj1cIjJcIiBjbGFzcz1cInNvcnRhYmxlXCIgKGNsaWNrKT1cInNvcnRCeSgnY2xpZW50SWQnKVwiPkNsaWVudCBJRFxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhcnJcIiBbY2xhc3Mub25dPVwic29ydEtleSA9PT0gJ2NsaWVudElkJ1wiPnt7IHNvcnRLZXkgPT09ICdjbGllbnRJZCcgJiYgc29ydERpciA9PT0gMSA/ICfihpEnIDogJ+KGkycgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aCByb3dzcGFuPVwiMlwiIGNsYXNzPVwic29ydGFibGVcIiAoY2xpY2spPVwic29ydEJ5KCdjbGllbnROYW1lJylcIj5DbGllbnQgTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhcnJcIiBbY2xhc3Mub25dPVwic29ydEtleSA9PT0gJ2NsaWVudE5hbWUnXCI+e3sgc29ydEtleSA9PT0gJ2NsaWVudE5hbWUnICYmIHNvcnREaXIgPT09IDEgPyAn4oaRJyA6ICfihpMnIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICA8dGggcm93c3Bhbj1cIjJcIj5SZWdpc3RlcmVkIEVudGl0eTwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93QWdpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCByb3dzcGFuPVwiMlwiIGNsYXNzPVwic29ydGFibGVcIiAoY2xpY2spPVwic29ydEJ5KCdvdXRzdGFuZGluZycpXCI+VG90YWwgT3V0c3RhbmRpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFyclwiIFtjbGFzcy5vbl09XCJzb3J0S2V5ID09PSAnb3V0c3RhbmRpbmcnXCI+e3sgc29ydEtleSA9PT0gJ291dHN0YW5kaW5nJyAmJiBzb3J0RGlyID09PSAxID8gJ+KGkScgOiAn4oaTJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggcm93c3Bhbj1cIjJcIiBjbGFzcz1cInNvcnRhYmxlXCIgKGNsaWNrKT1cInNvcnRCeSgnYWdpbmcwdG8zMCcpXCI+Jmx0OyAzMCBkYXlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhcnJcIiBbY2xhc3Mub25dPVwic29ydEtleSA9PT0gJ2FnaW5nMHRvMzAnXCI+e3sgc29ydEtleSA9PT0gJ2FnaW5nMHRvMzAnICYmIHNvcnREaXIgPT09IDEgPyAn4oaRJyA6ICfihpMnIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCByb3dzcGFuPVwiMlwiIGNsYXNzPVwic29ydGFibGVcIiAoY2xpY2spPVwic29ydEJ5KCdhZ2luZzMwdG82MCcpXCI+MzAgdG8gNjAgZGF5c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXJyXCIgW2NsYXNzLm9uXT1cInNvcnRLZXkgPT09ICdhZ2luZzMwdG82MCdcIj57eyBzb3J0S2V5ID09PSAnYWdpbmczMHRvNjAnICYmIHNvcnREaXIgPT09IDEgPyAn4oaRJyA6ICfihpMnIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCByb3dzcGFuPVwiMlwiIGNsYXNzPVwic29ydGFibGVcIiAoY2xpY2spPVwic29ydEJ5KCdhZ2luZ092ZXI2MCcpXCI+Jmd0OyA2MCBkYXlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhcnJcIiBbY2xhc3Mub25dPVwic29ydEtleSA9PT0gJ2FnaW5nT3ZlcjYwJ1wiPnt7IHNvcnRLZXkgPT09ICdhZ2luZ092ZXI2MCcgJiYgc29ydERpciA9PT0gMSA/ICfihpEnIDogJ+KGkycgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPHRoIHJvd3NwYW49XCIyXCI+U3RhdHVzPC90aD5cbiAgICAgICAgICAgICAgICAgICAgPHRoIHJvd3NwYW49XCIyXCI+UHJvZHVjdDwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aCByb3dzcGFuPVwiMlwiPkNTTTwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBbYXR0ci5jb2xzcGFuXT1cIm1vbnRocy5sZW5ndGhcIiBjbGFzcz1cImdyb3VwLWhlYWRcIj5TdG9yZSBDb3VudDwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aCByb3dzcGFuPVwiMlwiIGNsYXNzPVwic29ydGFibGVcIiAoY2xpY2spPVwic29ydEJ5KCdwcmljZVBlclN0b3JlJylcIj5QcmljZSAvIFN0b3JlXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFyclwiIFtjbGFzcy5vbl09XCJzb3J0S2V5ID09PSAncHJpY2VQZXJTdG9yZSdcIj57eyBzb3J0S2V5ID09PSAncHJpY2VQZXJTdG9yZScgJiYgc29ydERpciA9PT0gMSA/ICfihpEnIDogJ+KGkycgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPVwiMlwiIGNsYXNzPVwiZ3JvdXAtaGVhZFwiPlJldmVudWU8L3RoPlxuICAgICAgICAgICAgICAgICAgICA8dGggcm93c3Bhbj1cIjJcIiBjbGFzcz1cInNvcnRhYmxlXCIgKGNsaWNrKT1cInNvcnRCeSgndmFyaWFuY2UnKVwiPlZhcmlhbmNlXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFyclwiIFtjbGFzcy5vbl09XCJzb3J0S2V5ID09PSAndmFyaWFuY2UnXCI+e3sgc29ydEtleSA9PT0gJ3ZhcmlhbmNlJyAmJiBzb3J0RGlyID09PSAxID8gJ+KGkScgOiAn4oaTJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgPHRoIHJvd3NwYW49XCIyXCIgY2xhc3M9XCJzb3J0YWJsZVwiIChjbGljayk9XCJzb3J0QnkoJ2luc3RhbGxhdGlvbkZlZScpXCI+SW5zdGFsbGF0aW9uIEZlZVxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhcnJcIiBbY2xhc3Mub25dPVwic29ydEtleSA9PT0gJ2luc3RhbGxhdGlvbkZlZSdcIj57eyBzb3J0S2V5ID09PSAnaW5zdGFsbGF0aW9uRmVlJyAmJiBzb3J0RGlyID09PSAxID8gJ+KGkScgOiAn4oaTJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgPHRoICpuZ0Zvcj1cImxldCBtIG9mIG1vbnRoczsgbGV0IGkgPSBpbmRleFwiIGNsYXNzPVwic3ViLWhlYWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNvcnRhYmxlXT1cImkgPT09IG1vbnRocy5sZW5ndGggLSAxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJpID09PSBtb250aHMubGVuZ3RoIC0gMSA/IHNvcnRCeSgnc3RvcmVzQ3VyJykgOiBudWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBtLmxhYmVsIH19PHNwYW4gKm5nSWY9XCJpID09PSBtb250aHMubGVuZ3RoIC0gMVwiIGNsYXNzPVwiYXJyXCIgW2NsYXNzLm9uXT1cInNvcnRLZXkgPT09ICdzdG9yZXNDdXInXCI+e3sgc29ydEtleSA9PT0gJ3N0b3Jlc0N1cicgJiYgc29ydERpciA9PT0gMSA/ICfihpEnIDogJ+KGkycgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cInN1Yi1oZWFkIHNvcnRhYmxlXCIgKGNsaWNrKT1cInNvcnRCeSgncmV2UHJldicpXCI+e3sgbW9udGhzWzNdLmxhYmVsIH19PHNwYW4gY2xhc3M9XCJhcnJcIiBbY2xhc3Mub25dPVwic29ydEtleSA9PT0gJ3JldlByZXYnXCI+e3sgc29ydEtleSA9PT0gJ3JldlByZXYnICYmIHNvcnREaXIgPT09IDEgPyAn4oaRJyA6ICfihpMnIH19PC9zcGFuPjwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cInN1Yi1oZWFkIHNvcnRhYmxlXCIgKGNsaWNrKT1cInNvcnRCeSgncmV2Q3VyJylcIj57eyBtb250aHNbNF0ubGFiZWwgfX08c3BhbiBjbGFzcz1cImFyclwiIFtjbGFzcy5vbl09XCJzb3J0S2V5ID09PSAncmV2Q3VyJ1wiPnt7IHNvcnRLZXkgPT09ICdyZXZDdXInICYmIHNvcnREaXIgPT09IDEgPyAn4oaRJyA6ICfihpMnIH19PC9zcGFuPjwvdGg+XG4gICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCByIG9mIGZpbHRlcmVkXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZD57eyByLmNsaWVudElkIHx8ICfigJQnIH19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkPjxzdHJvbmc+e3sgci5jbGllbnROYW1lIHwgdXBwZXJjYXNlIH19PC9zdHJvbmc+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJlbnRpdHlcIiBbdGl0bGVdPVwiKHIucmVnaXN0ZXJlZEVudGl0aWVzICYmIHIucmVnaXN0ZXJlZEVudGl0aWVzLmxlbmd0aCA/IHIucmVnaXN0ZXJlZEVudGl0aWVzLmpvaW4oJ1xcbicpIDogci5yZWdpc3RlcmVkRW50aXR5KSB8fCAnJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHIucmVnaXN0ZXJlZEVudGl0eSB8fCAn4oCUJyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJyLnJlZ2lzdGVyZWRFbnRpdGllcz8ubGVuZ3RoID4gMVwiIGNsYXNzPVwiZW50aXR5LW1vcmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJyLnJlZ2lzdGVyZWRFbnRpdGllcy5qb2luKCdcXG4nKVwiPit7eyByLnJlZ2lzdGVyZWRFbnRpdGllcy5sZW5ndGggLSAxIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd0FnaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ0ZXh0LWVuZFwiPjxzdHJvbmc+e3sgci5vdXRzdGFuZGluZyA/ICgn4oK5JyArIChyLm91dHN0YW5kaW5nIHwgbnVtYmVyOicxLjAtMCc6J2VuLUlOJykpIDogJ+KAlCcgfX08L3N0cm9uZz48L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwidGV4dC1lbmRcIj57eyByLmFnaW5nMHRvMzAgPyAoJ+KCuScgKyAoci5hZ2luZzB0bzMwIHwgbnVtYmVyOicxLjAtMCc6J2VuLUlOJykpIDogJ+KAlCcgfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwidGV4dC1lbmRcIj57eyByLmFnaW5nMzB0bzYwID8gKCfigrknICsgKHIuYWdpbmczMHRvNjAgfCBudW1iZXI6JzEuMC0wJzonZW4tSU4nKSkgOiAn4oCUJyB9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ0ZXh0LWVuZFwiPnt7IHIuYWdpbmdPdmVyNjAgPyAoJ+KCuScgKyAoci5hZ2luZ092ZXI2MCB8IG51bWJlcjonMS4wLTAnOidlbi1JTicpKSA6ICfigJQnIH19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZD48c3BhbiBjbGFzcz1cInBpbGxcIiBbbmdDbGFzc109XCJyLnN0YXR1cyA9PT0gJ1BhaWQnID8gJ3BpbGwtZ3JlZW4nIDogJ3BpbGwtYW1iZXInXCI+e3sgci5zdGF0dXMgfX08L3NwYW4+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nRm9yPVwibGV0IHAgb2Ygci5wcm9kdWN0c1wiIFtuZ0NsYXNzXT1cInByb2R1Y3RQaWxsQ2xhc3MocClcIiBjbGFzcz1cIm1lLTFcIj57eyBwIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhci5wcm9kdWN0cz8ubGVuZ3RoXCIgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+4oCUPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQ+e3sgci5jc20gfHwgJ+KAlCcgfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQgKm5nRm9yPVwibGV0IHMgb2Ygci5zdG9yZXM7IGxldCBpID0gaW5kZXhcIiBbY2xhc3MuZnctYm9sZF09XCJpID09PSByLnN0b3Jlcy5sZW5ndGggLSAxXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBzID09IG51bGwgPyAn4oCUJyA6IChzIHwgbnVtYmVyOicxLjAtMCc6J2VuLUlOJykgfX1cbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkIFt0aXRsZV09XCJyLmN1cnJlbmN5ID09PSAnZG9sbGFyJyA/ICgnVVNEIHByaWNpbmcg4oCUIHJldmVudWUgY29udmVydGVkIHRvIOKCuSBhdCB0b2RheVxcJ3MgcmF0ZSAoJyArICh1c2RSYXRlIHwgbnVtYmVyOicxLjItMicpICsgJyknKSA6ICcnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyByLnByaWNlUGVyU3RvcmUgPT0gbnVsbCA/ICfigJQnIDogKHIuY3VycmVuY3kgPT09ICdkb2xsYXInID8gJyQnIDogJ+KCuScpICsgKHIucHJpY2VQZXJTdG9yZSB8IG51bWJlcjonMS4wLTAnOidlbi1JTicpIH19XG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInRleHQtbXV0ZWRcIj57eyByLnJldlByZXYgPT0gbnVsbCA/ICfigJQnIDogJ+KCuScgKyAoci5yZXZQcmV2IHwgbnVtYmVyOicxLjAtMCc6J2VuLUlOJykgfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPnt7IHIucmV2Q3VyID09IG51bGwgPyAn4oCUJyA6ICfigrknICsgKHIucmV2Q3VyIHwgbnVtYmVyOicxLjAtMCc6J2VuLUlOJykgfX08L3N0cm9uZz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwici5yZXZDdXJFc3RpbWF0ZWRcIiBjbGFzcz1cImVzdC1jaGlwIG1zLTFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiRXN0aW1hdGVkOiBjdXJyZW50IHN0b3JlIGNvdW50IMOXIGJhc2UgcHJpY2Ug4oCUIHJlcGxhY2VkIGJ5IHRoZSBpbnZvaWNlIGFtb3VudCBvbmNlIGdlbmVyYXRlZFwiPmVzdC48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwici52YXJpYW5jZSAhPSBudWxsXCIgY2xhc3M9XCJmdy1zZW1pYm9sZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnRleHQtc3VjY2Vzc109XCJyLnZhcmlhbmNlID4gMFwiIFtjbGFzcy50ZXh0LWRhbmdlcl09XCJyLnZhcmlhbmNlIDwgMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIihtb250aHNbM10ubGFiZWwgKyAnICcgKyAoci5yZXZQcmV2ID09IG51bGwgPyAn4oCUJyA6ICfigrknICsgKHIucmV2UHJldiB8IG51bWJlcjonMS4wLTAnOidlbi1JTicpKSArICcg4oaSICcgKyBtb250aHNbNF0ubGFiZWwgKyAnICcgKyAoci5yZXZDdXIgPT0gbnVsbCA/ICfigJQnIDogJ+KCuScgKyAoci5yZXZDdXIgfCBudW1iZXI6JzEuMC0wJzonZW4tSU4nKSkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgci52YXJpYW5jZSA+IDAgPyAnKycgOiAnJyB9fXt7IHIudmFyaWFuY2UgfX0lXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInIudmFyaWFuY2UgPT0gbnVsbFwiIGNsYXNzPVwidGV4dC1tdXRlZFwiPuKAlDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkPnt7IHIuaW5zdGFsbGF0aW9uRmVlID09IG51bGwgPyAn4oCUJyA6ICfigrknICsgKHIuaW5zdGFsbGF0aW9uRmVlIHwgbnVtYmVyOicxLjAtMCc6J2VuLUlOJykgfX08L3RkPlxuICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgPHRyICpuZ0lmPVwiIWZpbHRlcmVkLmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgICAgICA8dGQgW2F0dHIuY29sc3Bhbl09XCIoc2hvd0FnaW5nID8gMTUgOiAxMSkgKyBtb250aHMubGVuZ3RoXCIgY2xhc3M9XCJ0ZXh0LWNlbnRlciB0ZXh0LW11dGVkIHB5LTVcIj5ObyBjbGllbnRzIG1hdGNoLjwvdGQ+XG4gICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgICA8dGZvb3Q+XG4gICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjNcIj5Ub3RhbCDCtyB7eyB0b3RhbHMuY291bnQgfX0gY2xpZW50czwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93QWdpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInRleHQtZW5kXCI+PHN0cm9uZz7igrl7eyB0b3RhbHMub3V0c3RhbmRpbmcgfCBudW1iZXI6JzEuMC0wJzonZW4tSU4nIH19PC9zdHJvbmc+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInRleHQtZW5kXCI+PHN0cm9uZz7igrl7eyB0b3RhbHMuYWdpbmcwdG8zMCB8IG51bWJlcjonMS4wLTAnOidlbi1JTicgfX08L3N0cm9uZz48L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwidGV4dC1lbmRcIj48c3Ryb25nPuKCuXt7IHRvdGFscy5hZ2luZzMwdG82MCB8IG51bWJlcjonMS4wLTAnOidlbi1JTicgfX08L3N0cm9uZz48L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwidGV4dC1lbmRcIj48c3Ryb25nPuKCuXt7IHRvdGFscy5hZ2luZ092ZXI2MCB8IG51bWJlcjonMS4wLTAnOidlbi1JTicgfX08L3N0cm9uZz48L3RkPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49XCIzXCI+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0Zvcj1cImxldCB0IG9mIHRvdGFscy5zdG9yZVRvdGFsc1wiPjxzdHJvbmc+e3sgdCB8IG51bWJlcjonMS4wLTAnOidlbi1JTicgfX08L3N0cm9uZz48L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQ+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkPjxzdHJvbmc+4oK5e3sgdG90YWxzLnJldlByZXYgfCBudW1iZXI6JzEuMC0wJzonZW4tSU4nIH19PC9zdHJvbmc+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkPjxzdHJvbmc+4oK5e3sgdG90YWxzLnJldkN1ciB8IG51bWJlcjonMS4wLTAnOidlbi1JTicgfX08L3N0cm9uZz48L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQ+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkPjxzdHJvbmc+4oK5e3sgdG90YWxzLmluc3RhbGxhdGlvbiB8IG51bWJlcjonMS4wLTAnOidlbi1JTicgfX08L3N0cm9uZz48L3RkPlxuICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICA8L3Rmb290PlxuICAgICAgICA8L3RhYmxlPlxuICAgIDwvZGl2PlxuPC9kaXY+Il19
310
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmlsbGluZy1zdW1tYXJ5LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS1iaWxsaW5nL3NyYy9saWIvY29tcG9uZW50cy9iaWxsaW5nLXN1bW1hcnkvYmlsbGluZy1zdW1tYXJ5LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS1iaWxsaW5nL3NyYy9saWIvY29tcG9uZW50cy9iaWxsaW5nLXN1bW1hcnkvYmlsbGluZy1zdW1tYXJ5LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBcUIsU0FBUyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUNoRixPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7Ozs7O0FBSTFDLDZFQUE2RTtBQUM3RSw4RUFBOEU7QUFDOUUsdUVBQXVFO0FBQ3ZFLDhDQUE4QztBQU05QyxNQUFNLE9BQU8sdUJBQXVCO0lBMkJ4QjtJQUNBO0lBQ0E7SUE1QlYsT0FBTyxHQUFHLElBQUksQ0FBQztJQUNmLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFFZixNQUFNLEdBQXFDLEVBQUUsQ0FBQztJQUM5QyxJQUFJLEdBQVUsRUFBRSxDQUFDO0lBQ2pCLHVFQUF1RTtJQUN2RSxPQUFPLEdBQWtCLElBQUksQ0FBQztJQUU5QixXQUFXO0lBQ1gsS0FBSyxHQUFHLEVBQUUsQ0FBQztJQUNYLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDbkIsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUNsQixhQUFhLEdBQUcsS0FBSyxDQUFDO0lBQ3RCLGNBQWMsR0FBMEMsS0FBSyxDQUFDO0lBRTlELDZEQUE2RDtJQUM3RCxPQUFPLEdBQWtCLFdBQVcsQ0FBQztJQUNyQyxPQUFPLEdBQVcsQ0FBQyxDQUFDLENBQUM7SUFFckIsNEVBQTRFO0lBQzVFLG9EQUFvRDtJQUNwRCxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBRUQsUUFBUSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFFaEQsWUFDVSxjQUE4QixFQUM5QixLQUFtQixFQUNuQixjQUFpQztRQUZqQyxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsVUFBSyxHQUFMLEtBQUssQ0FBYztRQUNuQixtQkFBYyxHQUFkLGNBQWMsQ0FBbUI7SUFDeEMsQ0FBQztJQUVKLDRFQUE0RTtJQUM1RSwyQ0FBMkM7SUFDM0MsVUFBVSxHQUFHLENBQUMsQ0FBQztJQUVmLFFBQVE7UUFDTixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbEIsQ0FBQztJQUVELDZFQUE2RTtJQUM3RSxzRUFBc0U7SUFDdEUsUUFBUTtRQUNOLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLE1BQU0sT0FBTyxHQUFHO1lBQ2QsR0FBRyxFQUFFLElBQUksQ0FBQyxTQUFTO1lBQ25CLE9BQU8sRUFBRSxJQUFJLENBQUMsYUFBYTtZQUMzQixRQUFRLEVBQUUsSUFBSSxDQUFDLGNBQWM7WUFDN0IsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLO1NBQ25CLENBQUM7UUFDRixJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUNuRixJQUFJLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDWixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztnQkFDckIsSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sSUFBSSxFQUFFLENBQUM7Z0JBQ3RDLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNsQyxJQUFJLENBQUMsT0FBTyxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsT0FBTyxJQUFJLElBQUksQ0FBQztnQkFDMUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztnQkFDdkQsc0VBQXNFO2dCQUN0RSxpREFBaUQ7Z0JBQ2pELElBQUksQ0FBQyxhQUFhLEdBQUcsR0FBRyxFQUFFLElBQUksRUFBRSxVQUFVLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQztnQkFDakUsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsY0FBYyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztnQkFDN0UsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7Z0JBQ3JDLG1FQUFtRTtnQkFDbkUsb0VBQW9FO2dCQUNwRSxzRUFBc0U7Z0JBQ3RFLHNCQUFzQjtnQkFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLEVBQUU7b0JBQ3BHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2lCQUMxQjtnQkFDRCxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3RDLENBQUM7WUFDRCxLQUFLLEVBQUUsR0FBRyxFQUFFO2dCQUNWLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO2dCQUNyQixJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDZixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztnQkFDbkIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN0QyxDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELDRFQUE0RTtJQUM1RSxpREFBaUQ7SUFDakQsYUFBYSxHQUFhLEVBQUUsQ0FBQztJQUM3QixpQkFBaUIsR0FBYSxFQUFFLENBQUM7SUFDakMsSUFBSSxVQUFVLEtBQWUsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUN6RCxJQUFJLGNBQWMsS0FBZSxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7SUFFakUsd0VBQXdFO0lBQ3hFLDRFQUE0RTtJQUM1RSxzREFBc0Q7SUFDdEQsSUFBSSxnQkFBZ0I7UUFDbEIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLGVBQWUsSUFBSSxJQUFJLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUM1RixDQUFDO0lBRUQsNkVBQTZFO0lBQzdFLDZFQUE2RTtJQUM3RSwwRUFBMEU7SUFDMUUsMEVBQTBFO0lBQzFFLDZFQUE2RTtJQUM3RSxtQkFBbUIsR0FBVSxFQUFFLENBQUM7SUFFeEIsaUJBQWlCO1FBQ3ZCLElBQUksQ0FBQyxtQkFBbUIsR0FBRztZQUN6QjtnQkFDRSxXQUFXLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUs7Z0JBQ2pELE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsU0FBUyxLQUFLLEtBQUssRUFBRSxDQUFDO3FCQUNwRSxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsU0FBUyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzthQUN6RjtZQUNEO2dCQUNFLFdBQVcsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSztnQkFDckQsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxhQUFhLEtBQUssS0FBSyxFQUFFLENBQUM7cUJBQ3hFLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxhQUFhLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQ2pHO1lBQ0Q7Z0JBQ0UsV0FBVyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLO2dCQUN0RCxNQUFNLEVBQUU7b0JBQ04sRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxjQUFjLEtBQUssS0FBSyxFQUFFO29CQUNsRSxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWMsS0FBSyxRQUFRLEVBQUU7b0JBQzNFLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsY0FBYyxLQUFLLFNBQVMsRUFBRTtvQkFDOUUsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxjQUFjLEtBQUssTUFBTSxFQUFFO2lCQUN0RTthQUNGO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxLQUFVO1FBQzVCLHlFQUF5RTtRQUN6RSwwRUFBMEU7UUFDMUUseUVBQXlFO1FBQ3pFLHNFQUFzRTtRQUN0RSxNQUFNLE1BQU0sR0FBRyxDQUFDLE9BQVksRUFBVSxFQUFFO1lBQ3RDLE1BQU0sR0FBRyxHQUFHLE9BQU8sRUFBRSxNQUFNLENBQUM7WUFDNUIsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7WUFDakQsT0FBTyxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUMxQixDQUFDLENBQUM7UUFDRixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztRQUMzQixJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztRQUM1QixDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFZLEVBQUUsRUFBRTtZQUNyQyxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDM0IsSUFBSSxDQUFDLEVBQUU7Z0JBQUUsT0FBTztZQUNoQixJQUFJLE9BQU8sQ0FBQyxXQUFXLEtBQUssS0FBSztnQkFBRSxJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztpQkFDbEQsSUFBSSxPQUFPLENBQUMsV0FBVyxLQUFLLFNBQVM7Z0JBQUUsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7aUJBQy9ELElBQUksT0FBTyxDQUFDLFdBQVcsS0FBSyxVQUFVO2dCQUFFLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBUyxDQUFDO1FBQy9FLENBQUMsQ0FBQyxDQUFDO1FBQ0gsNEVBQTRFO1FBQzVFLHVFQUF1RTtRQUN2RSwyQ0FBMkM7UUFDM0MsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxnQ0FBZ0M7SUFDaEMsUUFBUTtRQUNOLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBRUQsZ0NBQWdDO0lBQ2hDLGVBQWU7UUFDYixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztRQUMzQixJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztRQUM1QixJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNoQixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbEIsQ0FBQztJQUVELDJFQUEyRTtJQUMzRSwyQkFBMkI7SUFDM0IsSUFBSSxRQUFRO1FBQ1YsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUNyQixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDaEIsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUN2QixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQ3JCLENBQUMsS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzRCxJQUFJLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDN0IsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksSUFBSTtvQkFBRSxPQUFPLENBQUMsQ0FBQztnQkFDckMsSUFBSSxDQUFDLElBQUksSUFBSTtvQkFBRSxPQUFPLENBQUMsQ0FBQztnQkFDeEIsSUFBSSxDQUFDLElBQUksSUFBSTtvQkFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUN6QixzRUFBc0U7Z0JBQ3RFLElBQUksQ0FBQyxLQUFLLFVBQVU7b0JBQUUsT0FBTyxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNwRSxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVE7b0JBQUUsT0FBTyxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3BFLE9BQU8sSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNoQyxDQUFDLENBQUMsQ0FBQztTQUNKO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsTUFBTSxDQUFDLEdBQVc7UUFDaEIsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLEdBQUcsRUFBRTtZQUN4QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzVDO2FBQU07WUFDTCxJQUFJLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQztZQUNuQixJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsR0FBRyxLQUFLLFlBQVksSUFBSSxHQUFHLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDdEU7SUFDSCxDQUFDO0lBRUQsSUFBSSxpQkFBaUI7UUFDbkIsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsQyxDQUFDLElBQUksQ0FBQyxhQUFhLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0QyxDQUFDLElBQUksQ0FBQyxjQUFjLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRCxZQUFZO1FBQ1YsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7UUFDM0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7SUFDOUIsQ0FBQztJQUVELHVDQUF1QztJQUN2QyxJQUFJLE1BQU07UUFDUixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQzNCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQzNDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEQsT0FBTztZQUNMLFdBQVc7WUFDWCxXQUFXLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQy9ELFVBQVUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDN0QsV0FBVyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsV0FBVyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMvRCxXQUFXLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQy9ELE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDdkQsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNyRCxZQUFZLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxlQUFlLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3BFLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTTtTQUNuQixDQUFDO0lBQ0osQ0FBQztJQUVELGdCQUFnQixDQUFDLENBQVM7UUFDeEIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkMsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztZQUFFLE9BQU8sZ0JBQWdCLENBQUM7UUFDcEQsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUFFLE9BQU8saUJBQWlCLENBQUM7UUFDbEQsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUFFLE9BQU8saUJBQWlCLENBQUM7UUFDbEQsT0FBTyxnQkFBZ0IsQ0FBQztJQUMxQixDQUFDO0lBRUQsUUFBUTtRQUNOLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDaEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUM5QyxPQUFPO1NBQ1I7UUFDRCwwRUFBMEU7UUFDMUUsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0YsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUN4QixNQUFNLEdBQUcsR0FBUTtnQkFDZixXQUFXLEVBQUUsQ0FBQyxDQUFDLFFBQVE7Z0JBQ3ZCLGFBQWEsRUFBRSxDQUFDLENBQUMsVUFBVTtnQkFDM0IsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDLGdCQUFnQjthQUN4QyxDQUFDO1lBQ0YsNENBQTRDO1lBQzVDLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtnQkFDbEIsR0FBRyxDQUFDLG1CQUFtQixDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDOUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3JDLEdBQUcsQ0FBQyxlQUFlLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUMxQyxHQUFHLENBQUMsV0FBVyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQzthQUN2QztZQUNELEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO1lBQ3pCLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2hELEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQ25CLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDN0UsR0FBRyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1lBQ2xFLEdBQUcsQ0FBQyxhQUFhLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQzFDLEdBQUcsQ0FBQyxXQUFXLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3pELEdBQUcsQ0FBQyxXQUFXLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3hELEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3BDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDakQsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDLENBQUMsQ0FBQztRQUVILGlFQUFpRTtRQUNqRSxvRUFBb0U7UUFDcEUsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFXLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDakYsTUFBTSxRQUFRLEdBQVE7WUFDcEIsV0FBVyxFQUFFLEVBQUU7WUFDZixhQUFhLEVBQUUsT0FBTztZQUN0QixtQkFBbUIsRUFBRSxFQUFFO1NBQ3hCLENBQUM7UUFDRixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbEIsUUFBUSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsR0FBRyxDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDekQsUUFBUSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN6QyxRQUFRLENBQUMsZUFBZSxDQUFDLEdBQUcsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ2pELFFBQVEsQ0FBQyxXQUFXLENBQUMsR0FBRyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDMUM7UUFDRCxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDekIsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNyRixRQUFRLENBQUMsa0JBQWtCLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDbEMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUM3QixRQUFRLENBQUMsV0FBVyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLFdBQVcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZGLFFBQVEsQ0FBQyxXQUFXLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsV0FBVyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDdkYsUUFBUSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUM1QixRQUFRLENBQUMsa0JBQWtCLENBQUMsR0FBRyxHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRXBCLElBQUksQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFDL0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsWUFBWSxJQUFJLENBQUMsTUFBTSxVQUFVLENBQUMsQ0FBQztJQUNoRSxDQUFDO3dHQTlTVSx1QkFBdUI7NEZBQXZCLHVCQUF1QiwyRENkcEMsa3NiQXVMTTs7NEZEektPLHVCQUF1QjtrQkFMbkMsU0FBUzsrQkFDRSxxQkFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktc2hhcmVkJztcbmltcG9ydCB7IEJpbGxpbmdTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvYmlsbGluZy5zZXJ2aWNlJztcblxuLy8gQmlsbGluZyBTdW1tYXJ5IHRhYiAocHJvdG90eXBlIHBhcml0eSk6IG9uZSByb3cgcGVyIGNsaWVudCDigJQgbW9udGhseSBzdG9yZVxuLy8gY291bnRzIChkYWlseVByaWNpbmcpLCByZXZlbnVlIGZvciB0aGUgbGFzdCB0d28gbW9udGhzIHdpdGggdmFyaWFuY2UsIHByaWNlXG4vLyBwZXIgc3RvcmUgYW5kIGluc3RhbGxhdGlvbiBmZWUgKGludm9pY2VzKS4gRGF0YSBhcnJpdmVzIGluIG9uZSBjYWxsO1xuLy8gc2VhcmNoIC8gZmlsdGVyIC8gc29ydCBhbGwgcnVuIGNsaWVudC1zaWRlLlxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLWJpbGxpbmctc3VtbWFyeScsXG4gIHRlbXBsYXRlVXJsOiAnLi9iaWxsaW5nLXN1bW1hcnkuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vYmlsbGluZy1zdW1tYXJ5LmNvbXBvbmVudC5zY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBCaWxsaW5nU3VtbWFyeUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgbG9hZGluZyA9IHRydWU7XG4gIG5vRGF0YSA9IGZhbHNlO1xuXG4gIG1vbnRoczogeyBrZXk6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W10gPSBbXTtcbiAgcm93czogYW55W10gPSBbXTtcbiAgLy8gVG9kYXkncyBVU0QtPklOUiByYXRlIHVzZWQgYnkgdGhlIGJhY2tlbmQgZm9yIGRvbGxhci1wcmljZWQgY2xpZW50cy5cbiAgdXNkUmF0ZTogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgLy8gRmlsdGVycy5cbiAgcXVlcnkgPSAnJztcbiAgZmlsdGVyT3BlbiA9IGZhbHNlO1xuICBjc21GaWx0ZXIgPSAnQWxsJztcbiAgcHJvZHVjdEZpbHRlciA9ICdBbGwnO1xuICB2YXJpYW5jZUZpbHRlcjogJ0FsbCcgfCAnZ3Jvd3RoJyB8ICdkZWNsaW5lJyB8ICdmbGF0JyA9ICdBbGwnO1xuXG4gIC8vIFNvcnRpbmcuIERlZmF1bHQ6IGhpZ2hlc3QgY3VycmVudC1tb250aCBzdG9yZSBjb3VudCBmaXJzdC5cbiAgc29ydEtleTogc3RyaW5nIHwgbnVsbCA9ICdzdG9yZXNDdXInO1xuICBzb3J0RGlyOiAxIHwgLTEgPSAtMTtcblxuICAvLyBTaG93L2hpZGUgdGhlIEFSLWFnaW5nIGNvbHVtbnMgKFRvdGFsIE91dHN0YW5kaW5nIC8gPDMwIC8gMzAtNjAgLyA+NjApIGluXG4gIC8vIGJvdGggdGhlIHRhYmxlIGFuZCB0aGUgZXhwb3J0LiBIaWRkZW4gYnkgZGVmYXVsdC5cbiAgc2hvd0FnaW5nID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBiaWxsaW5nU2VydmljZTogQmlsbGluZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSB0b2FzdDogVG9hc3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxuICApIHt9XG5cbiAgLy8gRnVsbCByZXN1bHQtc2V0IHNpemUgKGJlZm9yZSBmaWx0ZXJzKSDigJQgZm9yIHRoZSBcIk4gb2YgTVwiIGhpbnQgYW5kIHRvIGtub3dcbiAgLy8gd2hlbiBmaWx0ZXJzIGFjdHVhbGx5IG5hcnJvd2VkIGFueXRoaW5nLlxuICB0b3RhbENvdW50ID0gMDtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRMaXN0KCk7XG4gIH1cblxuICAvLyBTZXJ2ZXItc2lkZSBsb2FkOiBmaWx0ZXJzIGFyZSBzZW50IHRvIHRoZSBBUEkgYW5kIGl0IHJldHVybnMgb25seSBtYXRjaGluZ1xuICAvLyByb3dzLiBDYWxsZWQgb24gZmlyc3QgbG9hZCBhbmQgd2hlbmV2ZXIgYSBmaWx0ZXIgb3Igc2VhcmNoIGNoYW5nZXMuXG4gIGxvYWRMaXN0KCk6IHZvaWQge1xuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgY29uc3QgZmlsdGVycyA9IHtcbiAgICAgIGNzbTogdGhpcy5jc21GaWx0ZXIsXG4gICAgICBwcm9kdWN0OiB0aGlzLnByb2R1Y3RGaWx0ZXIsXG4gICAgICB2YXJpYW5jZTogdGhpcy52YXJpYW5jZUZpbHRlcixcbiAgICAgIHNlYXJjaDogdGhpcy5xdWVyeSxcbiAgICB9O1xuICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UuYmlsbGluZ1N1bW1hcnkoZmlsdGVycykucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLm1vbnRocyA9IHJlcz8uZGF0YT8ubW9udGhzIHx8IFtdO1xuICAgICAgICB0aGlzLnJvd3MgPSByZXM/LmRhdGE/LmRhdGEgfHwgW107XG4gICAgICAgIHRoaXMudXNkUmF0ZSA9IHJlcz8uZGF0YT8udXNkUmF0ZSB8fCBudWxsO1xuICAgICAgICB0aGlzLnRvdGFsQ291bnQgPSByZXM/LmRhdGE/LnRvdGFsID8/IHRoaXMucm93cy5sZW5ndGg7XG4gICAgICAgIC8vIE9wdGlvbiBsaXN0cyBmb3IgdGhlIHBvcG92ZXIgY29tZSBmcm9tIHRoZSBBUEkncyBmdWxsIHJlc3VsdCBzZXQgc29cbiAgICAgICAgLy8gdGhleSBkb24ndCBzaHJpbmsgYXMgZmlsdGVycyBuYXJyb3cgdGhlIHRhYmxlLlxuICAgICAgICB0aGlzLmNzbUFwaU9wdGlvbnMgPSByZXM/LmRhdGE/LmNzbU9wdGlvbnMgfHwgdGhpcy5jc21BcGlPcHRpb25zO1xuICAgICAgICB0aGlzLnByb2R1Y3RBcGlPcHRpb25zID0gcmVzPy5kYXRhPy5wcm9kdWN0T3B0aW9ucyB8fCB0aGlzLnByb2R1Y3RBcGlPcHRpb25zO1xuICAgICAgICB0aGlzLm5vRGF0YSA9IHRoaXMucm93cy5sZW5ndGggPT09IDA7XG4gICAgICAgIC8vIEJ1aWxkIHRoZSBwb3BvdmVyIG9wdGlvbnMgT05DRSAod2hlbiBvcHRpb24gbGlzdHMgZmlyc3QgYXJyaXZlKS5cbiAgICAgICAgLy8gUmVidWlsZGluZyB0aGUgYXJyYXkgcmVmZXJlbmNlIG9uIGV2ZXJ5IGxvYWQgZGVzeW5jcyBsaWItZmlsdGVycydcbiAgICAgICAgLy8gaW50ZXJuYWwgc25hcHNob3QgKHRha2VuIGluIGl0cyBuZ09uSW5pdCksIHdoaWNoIHNpbGVudGx5IGRyb3BzIHRoZVxuICAgICAgICAvLyBzZWxlY3Rpb24gb24gQXBwbHkuXG4gICAgICAgIGlmICghdGhpcy5zdW1tYXJ5RmlsdGVyT2JqZWN0Lmxlbmd0aCAmJiAodGhpcy5jc21BcGlPcHRpb25zLmxlbmd0aCB8fCB0aGlzLnByb2R1Y3RBcGlPcHRpb25zLmxlbmd0aCkpIHtcbiAgICAgICAgICB0aGlzLmJ1aWxkRmlsdGVyT2JqZWN0KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMucm93cyA9IFtdO1xuICAgICAgICB0aGlzLm5vRGF0YSA9IHRydWU7XG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIC8vIERpc3RpbmN0IGZpbHRlciBvcHRpb25zIOKAlCBzdXBwbGllZCBieSB0aGUgQVBJIG92ZXIgaXRzIGZ1bGwgcmVzdWx0IHNldCBzb1xuICAvLyB0aGV5IGRvbid0IHNocmluayBhcyBmaWx0ZXJzIG5hcnJvdyB0aGUgdGFibGUuXG4gIGNzbUFwaU9wdGlvbnM6IHN0cmluZ1tdID0gW107XG4gIHByb2R1Y3RBcGlPcHRpb25zOiBzdHJpbmdbXSA9IFtdO1xuICBnZXQgY3NtT3B0aW9ucygpOiBzdHJpbmdbXSB7IHJldHVybiB0aGlzLmNzbUFwaU9wdGlvbnM7IH1cbiAgZ2V0IHByb2R1Y3RPcHRpb25zKCk6IHN0cmluZ1tdIHsgcmV0dXJuIHRoaXMucHJvZHVjdEFwaU9wdGlvbnM7IH1cblxuICAvLyBTaG93IHRoZSBJbnN0YWxsYXRpb24gRmVlIGNvbHVtbiBvbmx5IHdoZW4gYXQgbGVhc3Qgb25lIGNsaWVudCBpbiB0aGVcbiAgLy8gY3VycmVudCByZXN1bHQgc2V0IGFjdHVhbGx5IGhhcyBhbiBpbnN0YWxsYXRpb24gZmVlIHRoaXMgbW9udGg7IG90aGVyd2lzZVxuICAvLyB0aGUgd2hvbGUgY29sdW1uIChoZWFkZXIsIGNlbGxzLCBmb290ZXIpIGlzIGhpZGRlbi5cbiAgZ2V0IHNob3dJbnN0YWxsYXRpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucm93cy5zb21lKChyKSA9PiByPy5pbnN0YWxsYXRpb25GZWUgIT0gbnVsbCAmJiBOdW1iZXIoci5pbnN0YWxsYXRpb25GZWUpID4gMCk7XG4gIH1cblxuICAvLyBTdGFibGUgZmlsdGVyLXBvcG92ZXIgZGF0YSBmb3IgbGliLWZpbHRlcnMuIE1VU1QgYmUgYSBoZWxkIHByb3BlcnR5LCBub3QgYVxuICAvLyBnZXR0ZXI6IGxpYi1maWx0ZXJzIG11dGF0ZXMgdGhpcyBvYmplY3QgKHNldHMgaXNPcGVuIG9uIGEgc2VjdGlvbiB3aGVuIGl0c1xuICAvLyBpbm5lciBkcm9wZG93biBpcyBjbGlja2VkKS4gQSBnZXR0ZXIgd291bGQgaGFuZCBiYWNrIGEgZnJlc2ggYXJyYXkgZWFjaFxuICAvLyBjaGFuZ2UtZGV0ZWN0aW9uIGN5Y2xlLCB3aXBpbmcgaXNPcGVuIHNvIHRoZSBkcm9wZG93biBuZXZlciBzdGF5cyBvcGVuLlxuICAvLyBSZWJ1aWx0IG9ubHkgd2hlbiB0aGUgZGF0YSBzZXQgY2hhbmdlcyAobG9hZExpc3QpIOKAlCBzZWUgYnVpbGRGaWx0ZXJPYmplY3QuXG4gIHN1bW1hcnlGaWx0ZXJPYmplY3Q6IGFueVtdID0gW107XG5cbiAgcHJpdmF0ZSBidWlsZEZpbHRlck9iamVjdCgpOiB2b2lkIHtcbiAgICB0aGlzLnN1bW1hcnlGaWx0ZXJPYmplY3QgPSBbXG4gICAgICB7XG4gICAgICAgIERlc2NyaXB0aW9uOiAnQ1NNJywgdHlwZTogJ3NpbmdsZScsIGlzT3BlbjogZmFsc2UsXG4gICAgICAgIElzc3VlczogW3sgaWQ6ICdBbGwnLCB0ZXh0OiAnQWxsJywgY2hlY2tlZDogdGhpcy5jc21GaWx0ZXIgPT09ICdBbGwnIH1dXG4gICAgICAgICAgLmNvbmNhdCh0aGlzLmNzbU9wdGlvbnMubWFwKGMgPT4gKHsgaWQ6IGMsIHRleHQ6IGMsIGNoZWNrZWQ6IHRoaXMuY3NtRmlsdGVyID09PSBjIH0pKSksXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBEZXNjcmlwdGlvbjogJ1Byb2R1Y3QnLCB0eXBlOiAnc2luZ2xlJywgaXNPcGVuOiBmYWxzZSxcbiAgICAgICAgSXNzdWVzOiBbeyBpZDogJ0FsbCcsIHRleHQ6ICdBbGwnLCBjaGVja2VkOiB0aGlzLnByb2R1Y3RGaWx0ZXIgPT09ICdBbGwnIH1dXG4gICAgICAgICAgLmNvbmNhdCh0aGlzLnByb2R1Y3RPcHRpb25zLm1hcChwID0+ICh7IGlkOiBwLCB0ZXh0OiBwLCBjaGVja2VkOiB0aGlzLnByb2R1Y3RGaWx0ZXIgPT09IHAgfSkpKSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIERlc2NyaXB0aW9uOiAnVmFyaWFuY2UnLCB0eXBlOiAnc2luZ2xlJywgaXNPcGVuOiBmYWxzZSxcbiAgICAgICAgSXNzdWVzOiBbXG4gICAgICAgICAgeyBpZDogJ0FsbCcsIHRleHQ6ICdBbGwnLCBjaGVja2VkOiB0aGlzLnZhcmlhbmNlRmlsdGVyID09PSAnQWxsJyB9LFxuICAgICAgICAgIHsgaWQ6ICdncm93dGgnLCB0ZXh0OiAnR3Jvd3RoJywgY2hlY2tlZDogdGhpcy52YXJpYW5jZUZpbHRlciA9PT0gJ2dyb3d0aCcgfSxcbiAgICAgICAgICB7IGlkOiAnZGVjbGluZScsIHRleHQ6ICdEZWNsaW5lJywgY2hlY2tlZDogdGhpcy52YXJpYW5jZUZpbHRlciA9PT0gJ2RlY2xpbmUnIH0sXG4gICAgICAgICAgeyBpZDogJ2ZsYXQnLCB0ZXh0OiAnRmxhdCcsIGNoZWNrZWQ6IHRoaXMudmFyaWFuY2VGaWx0ZXIgPT09ICdmbGF0JyB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICBdO1xuICB9XG5cbiAgYXBwbHlTdW1tYXJ5RmlsdGVycyhldmVudDogYW55KSB7XG4gICAgLy8gbGliLWZpbHRlcnMgZW1pdHMgdGhlIGZ1bGwgc2VjdGlvbnMgYXJyYXkuIEZvciBhIHNpbmdsZS1zZWxlY3Qgc2VjdGlvblxuICAgIC8vIHRoZSBwaWNrZWQgb3B0aW9uIGlzIHN0b3JlZCBpbiBJc3N1ZXMg4oCUIGJ1dCBkZXBlbmRpbmcgb24gdGhlIGxpYidzIHBhdGhcbiAgICAvLyBpdCBtYXkgYmUgYSBzaW5nbGUgb2JqZWN0IE9SIGEgb25lLWVsZW1lbnQgYXJyYXksIGFuZCBhIG5vdC15ZXQtcGlja2VkXG4gICAgLy8gc2VjdGlvbiBpcyBhbiBlbXB0eSBhcnJheS4gTm9ybWFsaXplIGFsbCBvZiB0aG9zZSB0byB0aGUgY2hvc2VuIGlkLlxuICAgIGNvbnN0IHBpY2tJZCA9IChzZWN0aW9uOiBhbnkpOiBzdHJpbmcgPT4ge1xuICAgICAgY29uc3QgaXNzID0gc2VjdGlvbj8uSXNzdWVzO1xuICAgICAgY29uc3QgcGlja2VkID0gQXJyYXkuaXNBcnJheShpc3MpID8gaXNzWzBdIDogaXNzO1xuICAgICAgcmV0dXJuIHBpY2tlZD8uaWQgfHwgJyc7XG4gICAgfTtcbiAgICB0aGlzLmNzbUZpbHRlciA9ICdBbGwnO1xuICAgIHRoaXMucHJvZHVjdEZpbHRlciA9ICdBbGwnO1xuICAgIHRoaXMudmFyaWFuY2VGaWx0ZXIgPSAnQWxsJztcbiAgICAoZXZlbnQgfHwgW10pLmZvckVhY2goKHNlY3Rpb246IGFueSkgPT4ge1xuICAgICAgY29uc3QgaWQgPSBwaWNrSWQoc2VjdGlvbik7XG4gICAgICBpZiAoIWlkKSByZXR1cm47XG4gICAgICBpZiAoc2VjdGlvbi5EZXNjcmlwdGlvbiA9PT0gJ0NTTScpIHRoaXMuY3NtRmlsdGVyID0gaWQ7XG4gICAgICBlbHNlIGlmIChzZWN0aW9uLkRlc2NyaXB0aW9uID09PSAnUHJvZHVjdCcpIHRoaXMucHJvZHVjdEZpbHRlciA9IGlkO1xuICAgICAgZWxzZSBpZiAoc2VjdGlvbi5EZXNjcmlwdGlvbiA9PT0gJ1ZhcmlhbmNlJykgdGhpcy52YXJpYW5jZUZpbHRlciA9IGlkIGFzIGFueTtcbiAgICB9KTtcbiAgICAvLyBSZS1xdWVyeSB0aGUgQVBJIHdpdGggdGhlIG5ldyBmaWx0ZXJzLiBEbyBOT1QgcmVidWlsZCBzdW1tYXJ5RmlsdGVyT2JqZWN0XG4gICAgLy8gaGVyZSDigJQgcmVhc3NpZ25pbmcgdGhlIGFycmF5IHJlZmVyZW5jZSBkZXN5bmNzIGxpYi1maWx0ZXJzJyBpbnRlcm5hbFxuICAgIC8vIHNuYXBzaG90IGFuZCB3b3VsZCBicmVhayB0aGUgbmV4dCBBcHBseS5cbiAgICB0aGlzLmxvYWRMaXN0KCk7XG4gIH1cblxuICAvLyBTZWFyY2ggYm94IGNoYW5nZSDihpIgcmUtcXVlcnkuXG4gIG9uU2VhcmNoKCkge1xuICAgIHRoaXMubG9hZExpc3QoKTtcbiAgfVxuXG4gIC8vIENsZWFyIGFsbCBmaWx0ZXJzIGFuZCByZWxvYWQuXG4gIGNsZWFyQWxsRmlsdGVycygpIHtcbiAgICB0aGlzLmNzbUZpbHRlciA9ICdBbGwnO1xuICAgIHRoaXMucHJvZHVjdEZpbHRlciA9ICdBbGwnO1xuICAgIHRoaXMudmFyaWFuY2VGaWx0ZXIgPSAnQWxsJztcbiAgICB0aGlzLnF1ZXJ5ID0gJyc7XG4gICAgdGhpcy5idWlsZEZpbHRlck9iamVjdCgpO1xuICAgIHRoaXMubG9hZExpc3QoKTtcbiAgfVxuXG4gIC8vIFJvd3MgY29tZSBiYWNrIGFscmVhZHkgZmlsdGVyZWQgYnkgdGhlIEFQSTsgdGhpcyBnZXR0ZXIgb25seSBhcHBsaWVzIHRoZVxuICAvLyBjbGllbnQtc2lkZSBjb2x1bW4gc29ydC5cbiAgZ2V0IGZpbHRlcmVkKCk6IGFueVtdIHtcbiAgICBsZXQgbGlzdCA9IHRoaXMucm93cztcbiAgICBpZiAodGhpcy5zb3J0S2V5KSB7XG4gICAgICBjb25zdCBrID0gdGhpcy5zb3J0S2V5O1xuICAgICAgY29uc3QgZ2V0ID0gKHI6IGFueSkgPT5cbiAgICAgICAgayA9PT0gJ3N0b3Jlc0N1cicgPyByLnN0b3Jlc1tyLnN0b3Jlcy5sZW5ndGggLSAxXSA6IHJba107XG4gICAgICBsaXN0ID0gWy4uLmxpc3RdLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgY29uc3QgeCA9IGdldChhKSwgeSA9IGdldChiKTtcbiAgICAgICAgaWYgKHggPT0gbnVsbCAmJiB5ID09IG51bGwpIHJldHVybiAwO1xuICAgICAgICBpZiAoeCA9PSBudWxsKSByZXR1cm4gMTtcbiAgICAgICAgaWYgKHkgPT0gbnVsbCkgcmV0dXJuIC0xO1xuICAgICAgICAvLyBjbGllbnRJZCBpcyBhIHN0cmluZyBidXQgbXVzdCBzb3J0IG51bWVyaWNhbGx5ICgnMjAnIGJlZm9yZSAnMTAwJykuXG4gICAgICAgIGlmIChrID09PSAnY2xpZW50SWQnKSByZXR1cm4gdGhpcy5zb3J0RGlyICogKE51bWJlcih4KSAtIE51bWJlcih5KSk7XG4gICAgICAgIGlmICh0eXBlb2YgeCA9PT0gJ3N0cmluZycpIHJldHVybiB0aGlzLnNvcnREaXIgKiB4LmxvY2FsZUNvbXBhcmUoeSk7XG4gICAgICAgIHJldHVybiB0aGlzLnNvcnREaXIgKiAoeCAtIHkpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBsaXN0O1xuICB9XG5cbiAgc29ydEJ5KGtleTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuc29ydEtleSA9PT0ga2V5KSB7XG4gICAgICB0aGlzLnNvcnREaXIgPSB0aGlzLnNvcnREaXIgPT09IDEgPyAtMSA6IDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc29ydEtleSA9IGtleTtcbiAgICAgIHRoaXMuc29ydERpciA9IChrZXkgPT09ICdjbGllbnROYW1lJyB8fCBrZXkgPT09ICdjbGllbnRJZCcpID8gMSA6IC0xO1xuICAgIH1cbiAgfVxuXG4gIGdldCBhY3RpdmVGaWx0ZXJDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiAodGhpcy5jc21GaWx0ZXIgIT09ICdBbGwnID8gMSA6IDApICtcbiAgICAgICAgICAgKHRoaXMucHJvZHVjdEZpbHRlciAhPT0gJ0FsbCcgPyAxIDogMCkgK1xuICAgICAgICAgICAodGhpcy52YXJpYW5jZUZpbHRlciAhPT0gJ0FsbCcgPyAxIDogMCk7XG4gIH1cblxuICBjbGVhckZpbHRlcnMoKSB7XG4gICAgdGhpcy5jc21GaWx0ZXIgPSAnQWxsJztcbiAgICB0aGlzLnByb2R1Y3RGaWx0ZXIgPSAnQWxsJztcbiAgICB0aGlzLnZhcmlhbmNlRmlsdGVyID0gJ0FsbCc7XG4gIH1cblxuICAvLyBGb290ZXIgdG90YWxzIG92ZXIgdGhlIGZpbHRlcmVkIHNldC5cbiAgZ2V0IHRvdGFscygpIHtcbiAgICBjb25zdCBsaXN0ID0gdGhpcy5maWx0ZXJlZDtcbiAgICBjb25zdCBzdG9yZVRvdGFscyA9IHRoaXMubW9udGhzLm1hcCgoXywgaSkgPT5cbiAgICAgIGxpc3QucmVkdWNlKChhLCByKSA9PiBhICsgKHIuc3RvcmVzW2ldIHx8IDApLCAwKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0b3JlVG90YWxzLFxuICAgICAgb3V0c3RhbmRpbmc6IGxpc3QucmVkdWNlKChhLCByKSA9PiBhICsgKHIub3V0c3RhbmRpbmcgfHwgMCksIDApLFxuICAgICAgYWdpbmcwdG8zMDogbGlzdC5yZWR1Y2UoKGEsIHIpID0+IGEgKyAoci5hZ2luZzB0bzMwIHx8IDApLCAwKSxcbiAgICAgIGFnaW5nMzB0bzYwOiBsaXN0LnJlZHVjZSgoYSwgcikgPT4gYSArIChyLmFnaW5nMzB0bzYwIHx8IDApLCAwKSxcbiAgICAgIGFnaW5nT3ZlcjYwOiBsaXN0LnJlZHVjZSgoYSwgcikgPT4gYSArIChyLmFnaW5nT3ZlcjYwIHx8IDApLCAwKSxcbiAgICAgIHJldlByZXY6IGxpc3QucmVkdWNlKChhLCByKSA9PiBhICsgKHIucmV2UHJldiB8fCAwKSwgMCksXG4gICAgICByZXZDdXI6IGxpc3QucmVkdWNlKChhLCByKSA9PiBhICsgKHIucmV2Q3VyIHx8IDApLCAwKSxcbiAgICAgIGluc3RhbGxhdGlvbjogbGlzdC5yZWR1Y2UoKGEsIHIpID0+IGEgKyAoci5pbnN0YWxsYXRpb25GZWUgfHwgMCksIDApLFxuICAgICAgY291bnQ6IGxpc3QubGVuZ3RoLFxuICAgIH07XG4gIH1cblxuICBwcm9kdWN0UGlsbENsYXNzKHA6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgbG8gPSAocCB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAobG8uaW5jbHVkZXMoJ3RyYWZmaWMnKSkgcmV0dXJuICdwaWxsIHBpbGwtYmx1ZSc7XG4gICAgaWYgKGxvLmluY2x1ZGVzKCd6b25lJykpIHJldHVybiAncGlsbCBwaWxsLWdyZWVuJztcbiAgICBpZiAobG8uaW5jbHVkZXMoJ3RyYXgnKSkgcmV0dXJuICdwaWxsIHBpbGwtYW1iZXInO1xuICAgIHJldHVybiAncGlsbCBwaWxsLWdyYXknO1xuICB9XG5cbiAgb25FeHBvcnQoKSB7XG4gICAgY29uc3QgbGlzdCA9IHRoaXMuZmlsdGVyZWQ7XG4gICAgaWYgKCFsaXN0Lmxlbmd0aCkge1xuICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdOb3RoaW5nIHRvIGV4cG9ydCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBDb2VyY2UgYmxhbmsvdW5kZWZpbmVkIG51bWVyaWMgY2VsbHMgdG8gMCBzbyB0aGUgZXhwb3J0IG5ldmVyIGhhcyBnYXBzLlxuICAgIGNvbnN0IG51bSA9ICh2OiBhbnkpID0+ICh2ID09IG51bGwgfHwgdiA9PT0gJycgfHwgTnVtYmVyLmlzTmFOKE51bWJlcih2KSkgPyAwIDogTnVtYmVyKHYpKTtcbiAgICBjb25zdCByb3dzID0gbGlzdC5tYXAociA9PiB7XG4gICAgICBjb25zdCBvdXQ6IGFueSA9IHtcbiAgICAgICAgJ0NsaWVudCBJRCc6IHIuY2xpZW50SWQsXG4gICAgICAgICdDbGllbnQgTmFtZSc6IHIuY2xpZW50TmFtZSxcbiAgICAgICAgJ1JlZ2lzdGVyZWQgRW50aXR5Jzogci5yZWdpc3RlcmVkRW50aXR5LFxuICAgICAgfTtcbiAgICAgIC8vIEFnaW5nIGNvbHVtbnMgb25seSB3aGVuIHRoZSB0b2dnbGUgaXMgb24uXG4gICAgICBpZiAodGhpcy5zaG93QWdpbmcpIHtcbiAgICAgICAgb3V0WydUb3RhbCBPdXRzdGFuZGluZyddID0gbnVtKHIub3V0c3RhbmRpbmcpO1xuICAgICAgICBvdXRbJzwgMzAgZGF5cyddID0gbnVtKHIuYWdpbmcwdG8zMCk7XG4gICAgICAgIG91dFsnMzAgdG8gNjAgZGF5cyddID0gbnVtKHIuYWdpbmczMHRvNjApO1xuICAgICAgICBvdXRbJz4gNjAgZGF5cyddID0gbnVtKHIuYWdpbmdPdmVyNjApO1xuICAgICAgfVxuICAgICAgb3V0WydTdGF0dXMnXSA9IHIuc3RhdHVzO1xuICAgICAgb3V0WydQcm9kdWN0J10gPSAoci5wcm9kdWN0cyB8fCBbXSkuam9pbignICsgJyk7XG4gICAgICBvdXRbJ0NTTSddID0gci5jc207XG4gICAgICB0aGlzLm1vbnRocy5mb3JFYWNoKChtLCBpKSA9PiBvdXRbYFN0b3JlcyAke20ubGFiZWx9YF0gPSBudW0oci5zdG9yZXM/LltpXSkpO1xuICAgICAgb3V0WydQcmljaW5nIEN1cnJlbmN5J10gPSByLmN1cnJlbmN5ID09PSAnZG9sbGFyJyA/ICdVU0QnIDogJ0lOUic7XG4gICAgICBvdXRbYFByaWNlL1N0b3JlYF0gPSBudW0oci5wcmljZVBlclN0b3JlKTtcbiAgICAgIG91dFtgUmV2ZW51ZSAke3RoaXMubW9udGhzWzNdPy5sYWJlbH1gXSA9IG51bShyLnJldlByZXYpO1xuICAgICAgb3V0W2BSZXZlbnVlICR7dGhpcy5tb250aHNbNF0/LmxhYmVsfWBdID0gbnVtKHIucmV2Q3VyKTtcbiAgICAgIG91dFsnVmFyaWFuY2UgJSddID0gbnVtKHIudmFyaWFuY2UpO1xuICAgICAgb3V0WydJbnN0YWxsYXRpb24gRmVlJ10gPSBudW0oci5pbnN0YWxsYXRpb25GZWUpO1xuICAgICAgcmV0dXJuIG91dDtcbiAgICB9KTtcblxuICAgIC8vIEFwcGVuZCBhIFRvdGFsIHJvdyBzdW1taW5nIGV2ZXJ5IG51bWVyaWMgY29sdW1uLiBQZXItcm93IHJhdGVzXG4gICAgLy8gKFByaWNlL1N0b3JlLCBWYXJpYW5jZSAlKSBhcmVuJ3QgYWRkaXRpdmUsIHNvIHRoZXkncmUgbGVmdCBibGFuay5cbiAgICBjb25zdCBzdW0gPSAoa2V5OiBzdHJpbmcpID0+IHJvd3MucmVkdWNlKChhLCByKSA9PiBhICsgKE51bWJlcihyW2tleV0pIHx8IDApLCAwKTtcbiAgICBjb25zdCB0b3RhbFJvdzogYW55ID0ge1xuICAgICAgJ0NsaWVudCBJRCc6ICcnLFxuICAgICAgJ0NsaWVudCBOYW1lJzogJ1RvdGFsJyxcbiAgICAgICdSZWdpc3RlcmVkIEVudGl0eSc6ICcnLFxuICAgIH07XG4gICAgaWYgKHRoaXMuc2hvd0FnaW5nKSB7XG4gICAgICB0b3RhbFJvd1snVG90YWwgT3V0c3RhbmRpbmcnXSA9IHN1bSgnVG90YWwgT3V0c3RhbmRpbmcnKTtcbiAgICAgIHRvdGFsUm93Wyc8IDMwIGRheXMnXSA9IHN1bSgnPCAzMCBkYXlzJyk7XG4gICAgICB0b3RhbFJvd1snMzAgdG8gNjAgZGF5cyddID0gc3VtKCczMCB0byA2MCBkYXlzJyk7XG4gICAgICB0b3RhbFJvd1snPiA2MCBkYXlzJ10gPSBzdW0oJz4gNjAgZGF5cycpO1xuICAgIH1cbiAgICB0b3RhbFJvd1snU3RhdHVzJ10gPSAnJztcbiAgICB0b3RhbFJvd1snUHJvZHVjdCddID0gJyc7XG4gICAgdG90YWxSb3dbJ0NTTSddID0gJyc7XG4gICAgdGhpcy5tb250aHMuZm9yRWFjaCgobSkgPT4gdG90YWxSb3dbYFN0b3JlcyAke20ubGFiZWx9YF0gPSBzdW0oYFN0b3JlcyAke20ubGFiZWx9YCkpO1xuICAgIHRvdGFsUm93WydQcmljaW5nIEN1cnJlbmN5J10gPSAnJztcbiAgICB0b3RhbFJvd1tgUHJpY2UvU3RvcmVgXSA9ICcnO1xuICAgIHRvdGFsUm93W2BSZXZlbnVlICR7dGhpcy5tb250aHNbM10/LmxhYmVsfWBdID0gc3VtKGBSZXZlbnVlICR7dGhpcy5tb250aHNbM10/LmxhYmVsfWApO1xuICAgIHRvdGFsUm93W2BSZXZlbnVlICR7dGhpcy5tb250aHNbNF0/LmxhYmVsfWBdID0gc3VtKGBSZXZlbnVlICR7dGhpcy5tb250aHNbNF0/LmxhYmVsfWApO1xuICAgIHRvdGFsUm93WydWYXJpYW5jZSAlJ10gPSAnJztcbiAgICB0b3RhbFJvd1snSW5zdGFsbGF0aW9uIEZlZSddID0gc3VtKCdJbnN0YWxsYXRpb24gRmVlJyk7XG4gICAgcm93cy5wdXNoKHRvdGFsUm93KTtcblxuICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UuZXhwb3J0QXNFeGNlbEZpbGUocm93cywgJ2JpbGxpbmctc3VtbWFyeScpO1xuICAgIHRoaXMudG9hc3QuZ2V0UHJpbWFyeVRvYXN0KGBFeHBvcnRlZCAke2xpc3QubGVuZ3RofSBjbGllbnRzYCk7XG4gIH1cbn0iLCI8ZGl2IGNsYXNzPVwicHgtNCBwYi00XCI+XG4gICAgPCEtLSBIZWFkZXI6IHNlYXJjaCArIGZpbHRlciArIGV4cG9ydCAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC00IGZsZXgtd3JhcCBnYXAtMlwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYmlsbGluZ2hlYWRlclwiPkJpbGxpbmcgU3VtbWFyeTwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvc2l0aW9uLXJlbGF0aXZlXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdmctaWNvbiBpbnZvaWNlc2VhcmNoIHN2Zy1pY29uLTEgcG9zaXRpb24tYWJzb2x1dGUgbXQtNiBtcy0zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgb3BhY2l0eT1cIjAuNVwiIHg9XCIxNy4wMzY1XCIgeT1cIjE1LjEyMjNcIiB3aWR0aD1cIjguMTU1NDZcIiBoZWlnaHQ9XCIyXCIgcng9XCIxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm09XCJyb3RhdGUoNDUgMTcuMDM2NSAxNS4xMjIzKVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIj48L3JlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTExIDE5QzYuNTU1NTYgMTkgMyAxNS40NDQ0IDMgMTFDMyA2LjU1NTU2IDYuNTU1NTYgMyAxMSAzQzE1LjQ0NDQgMyAxOSA2LjU1NTU2IDE5IDExQzE5IDE1LjQ0NDQgMTUuNDQ0NCAxOSAxMSAxOVpNMTEgNUM3LjUzMzMzIDUgNSA3LjUzMzMzIDUgMTFDNSAxNC40NjY3IDcuNTMzMzMgMTcgMTEgMTdDMTQuNDY2NyAxNyAxNyAxNC40NjY3IDE3IDExQzE3IDcuNTMzMzMgMTQuNDY2NyA1IDExIDVaXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCI+PC9wYXRoPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPGlucHV0IFsobmdNb2RlbCldPVwicXVlcnlcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIHBzLTE0IGludm9pY2VzZWFyY2hcIlxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBjbGllbnQgLyBlbnRpdHkgLyBJRC4uLlwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25TZWFyY2goKVwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwhLS0gUmVuZGVyIG9ubHkgb25jZSBvcHRpb25zIGFyZSBidWlsdCDigJQgbGliLWZpbHRlcnMgc25hcHNob3RzIGl0c1xuICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0IGluIG5nT25Jbml0IGFuZCBuZXZlciByZS1yZWFkcyBpdCwgc28gaXQgbXVzdFxuICAgICAgICAgICAgICAgICBpbml0aWFsaXplIGFnYWluc3QgdGhlIHBvcHVsYXRlZCBhcnJheS4gLS0+XG4gICAgICAgICAgICA8bGliLWZpbHRlcnMgKm5nSWY9XCJzdW1tYXJ5RmlsdGVyT2JqZWN0Lmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgW2RhdGFPYmplY3RdPVwic3VtbWFyeUZpbHRlck9iamVjdFwiIChhcHBsaWVkRmlsdGVycyk9XCJhcHBseVN1bW1hcnlGaWx0ZXJzKCRldmVudClcIj48L2xpYi1maWx0ZXJzPlxuICAgICAgICAgICAgPCEtLSBTaG93L2hpZGUgQVItYWdpbmcgY29sdW1ucyBpbiB0YWJsZSArIGV4cG9ydC4gLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBmb3JtLXN3aXRjaCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yIG1lLTNcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJhZ2luZ1RvZ2dsZVwiIFsobmdNb2RlbCldPVwic2hvd0FnaW5nXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbCB0ZXh0LW5vd3JhcFwiIGZvcj1cImFnaW5nVG9nZ2xlXCI+T3V0c3RhbmRpbmcgQWdpbmc8L2xhYmVsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1vdXRsaW5lIGJ0biBhbGlnbi1pdGVtcy1lbmQgdGV4dC1ub3dyYXAgaW52aGVhZGVyXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWZpbHRlcmVkLmxlbmd0aFwiIChjbGljayk9XCJvbkV4cG9ydCgpXCI+XG4gICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTcuNSAxMi41VjE1LjgzMzNDMTcuNSAxNi4yNzU0IDE3LjMyNDQgMTYuNjk5MyAxNy4wMTE4IDE3LjAxMThDMTYuNjk5MyAxNy4zMjQ0IDE2LjI3NTQgMTcuNSAxNS44MzMzIDE3LjVINC4xNjY2N0MzLjcyNDY0IDE3LjUgMy4zMDA3MiAxNy4zMjQ0IDIuOTg4MTYgMTcuMDExOEMyLjY3NTU5IDE2LjY5OTMgMi41IDE2LjI3NTQgMi41IDE1LjgzMzNWMTIuNU0xNC4xNjY3IDYuNjY2NjdMMTAgMi41TTEwIDIuNUw1LjgzMzMzIDYuNjY2NjdNMTAgMi41VjEyLjVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXMtMlwiPkV4cG9ydDwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gTG9hZGluZyBzaGltbWVyIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsb2FkaW5nXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbG9hZGVyIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBtdC00XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gRW1wdHkgLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsb2FkaW5nICYmIG5vRGF0YVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWxnLTEyIG1iLTNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LWNvbHVtblwiPlxuICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiaW1nLXNyYyB3LTI1XCIgc3JjPVwiLi9hc3NldHMvdGFuZ28vSWNvbnMvTm9kYXRhLnN2Z1wiIGFsdD1cIlwiPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSBTdW1tYXJ5IHRhYmxlIOKAlCBzdGlja3kgdHdvLXJvdyBoZWFkZXIgKyBzdGlja3kgdG90YWxzIGZvb3RlciAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiIWxvYWRpbmcgJiYgIW5vRGF0YVwiIGNsYXNzPVwic3VtLXNjcm9sbCBtdC0zXCI+XG4gICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIHN1bS10YWJsZSB0ZXh0LW5vd3JhcCBtYi0wXCI+XG4gICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICA8dGggcm93c3Bhbj1cIjJcIiBjbGFzcz1cInNvcnRhYmxlXCIgKGNsaWNrKT1cInNvcnRCeSgnY2xpZW50SWQnKVwiPkNsaWVudCBJRFxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhcnJcIiBbY2xhc3Mub25dPVwic29ydEtleSA9PT0gJ2NsaWVudElkJ1wiPnt7IHNvcnRLZXkgPT09ICdjbGllbnRJZCcgJiYgc29ydERpciA9PT0gMSA/ICfihpEnIDogJ+KGkycgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aCByb3dzcGFuPVwiMlwiIGNsYXNzPVwic29ydGFibGVcIiAoY2xpY2spPVwic29ydEJ5KCdjbGllbnROYW1lJylcIj5DbGllbnQgTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhcnJcIiBbY2xhc3Mub25dPVwic29ydEtleSA9PT0gJ2NsaWVudE5hbWUnXCI+e3sgc29ydEtleSA9PT0gJ2NsaWVudE5hbWUnICYmIHNvcnREaXIgPT09IDEgPyAn4oaRJyA6ICfihpMnIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICA8dGggcm93c3Bhbj1cIjJcIj5SZWdpc3RlcmVkIEVudGl0eTwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93QWdpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCByb3dzcGFuPVwiMlwiIGNsYXNzPVwic29ydGFibGVcIiAoY2xpY2spPVwic29ydEJ5KCdvdXRzdGFuZGluZycpXCI+VG90YWwgT3V0c3RhbmRpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFyclwiIFtjbGFzcy5vbl09XCJzb3J0S2V5ID09PSAnb3V0c3RhbmRpbmcnXCI+e3sgc29ydEtleSA9PT0gJ291dHN0YW5kaW5nJyAmJiBzb3J0RGlyID09PSAxID8gJ+KGkScgOiAn4oaTJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggcm93c3Bhbj1cIjJcIiBjbGFzcz1cInNvcnRhYmxlXCIgKGNsaWNrKT1cInNvcnRCeSgnYWdpbmcwdG8zMCcpXCI+Jmx0OyAzMCBkYXlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhcnJcIiBbY2xhc3Mub25dPVwic29ydEtleSA9PT0gJ2FnaW5nMHRvMzAnXCI+e3sgc29ydEtleSA9PT0gJ2FnaW5nMHRvMzAnICYmIHNvcnREaXIgPT09IDEgPyAn4oaRJyA6ICfihpMnIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCByb3dzcGFuPVwiMlwiIGNsYXNzPVwic29ydGFibGVcIiAoY2xpY2spPVwic29ydEJ5KCdhZ2luZzMwdG82MCcpXCI+MzAgdG8gNjAgZGF5c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXJyXCIgW2NsYXNzLm9uXT1cInNvcnRLZXkgPT09ICdhZ2luZzMwdG82MCdcIj57eyBzb3J0S2V5ID09PSAnYWdpbmczMHRvNjAnICYmIHNvcnREaXIgPT09IDEgPyAn4oaRJyA6ICfihpMnIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCByb3dzcGFuPVwiMlwiIGNsYXNzPVwic29ydGFibGVcIiAoY2xpY2spPVwic29ydEJ5KCdhZ2luZ092ZXI2MCcpXCI+Jmd0OyA2MCBkYXlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhcnJcIiBbY2xhc3Mub25dPVwic29ydEtleSA9PT0gJ2FnaW5nT3ZlcjYwJ1wiPnt7IHNvcnRLZXkgPT09ICdhZ2luZ092ZXI2MCcgJiYgc29ydERpciA9PT0gMSA/ICfihpEnIDogJ+KGkycgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPHRoIHJvd3NwYW49XCIyXCI+U3RhdHVzPC90aD5cbiAgICAgICAgICAgICAgICAgICAgPHRoIHJvd3NwYW49XCIyXCI+UHJvZHVjdDwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aCByb3dzcGFuPVwiMlwiPkNTTTwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBbYXR0ci5jb2xzcGFuXT1cIm1vbnRocy5sZW5ndGhcIiBjbGFzcz1cImdyb3VwLWhlYWRcIj5TdG9yZSBDb3VudDwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aCByb3dzcGFuPVwiMlwiIGNsYXNzPVwic29ydGFibGVcIiAoY2xpY2spPVwic29ydEJ5KCdwcmljZVBlclN0b3JlJylcIj5QcmljZSAvIFN0b3JlXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFyclwiIFtjbGFzcy5vbl09XCJzb3J0S2V5ID09PSAncHJpY2VQZXJTdG9yZSdcIj57eyBzb3J0S2V5ID09PSAncHJpY2VQZXJTdG9yZScgJiYgc29ydERpciA9PT0gMSA/ICfihpEnIDogJ+KGkycgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPVwiMlwiIGNsYXNzPVwiZ3JvdXAtaGVhZFwiPlJldmVudWU8L3RoPlxuICAgICAgICAgICAgICAgICAgICA8dGggcm93c3Bhbj1cIjJcIiBjbGFzcz1cInNvcnRhYmxlXCIgKGNsaWNrKT1cInNvcnRCeSgndmFyaWFuY2UnKVwiPlZhcmlhbmNlXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFyclwiIFtjbGFzcy5vbl09XCJzb3J0S2V5ID09PSAndmFyaWFuY2UnXCI+e3sgc29ydEtleSA9PT0gJ3ZhcmlhbmNlJyAmJiBzb3J0RGlyID09PSAxID8gJ+KGkScgOiAn4oaTJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgPHRoICpuZ0lmPVwic2hvd0luc3RhbGxhdGlvblwiIHJvd3NwYW49XCIyXCIgY2xhc3M9XCJzb3J0YWJsZVwiIChjbGljayk9XCJzb3J0QnkoJ2luc3RhbGxhdGlvbkZlZScpXCI+SW5zdGFsbGF0aW9uIEZlZVxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhcnJcIiBbY2xhc3Mub25dPVwic29ydEtleSA9PT0gJ2luc3RhbGxhdGlvbkZlZSdcIj57eyBzb3J0S2V5ID09PSAnaW5zdGFsbGF0aW9uRmVlJyAmJiBzb3J0RGlyID09PSAxID8gJ+KGkScgOiAn4oaTJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgPHRoICpuZ0Zvcj1cImxldCBtIG9mIG1vbnRoczsgbGV0IGkgPSBpbmRleFwiIGNsYXNzPVwic3ViLWhlYWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNvcnRhYmxlXT1cImkgPT09IG1vbnRocy5sZW5ndGggLSAxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJpID09PSBtb250aHMubGVuZ3RoIC0gMSA/IHNvcnRCeSgnc3RvcmVzQ3VyJykgOiBudWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBtLmxhYmVsIH19PHNwYW4gKm5nSWY9XCJpID09PSBtb250aHMubGVuZ3RoIC0gMVwiIGNsYXNzPVwiYXJyXCIgW2NsYXNzLm9uXT1cInNvcnRLZXkgPT09ICdzdG9yZXNDdXInXCI+e3sgc29ydEtleSA9PT0gJ3N0b3Jlc0N1cicgJiYgc29ydERpciA9PT0gMSA/ICfihpEnIDogJ+KGkycgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cInN1Yi1oZWFkIHNvcnRhYmxlXCIgKGNsaWNrKT1cInNvcnRCeSgncmV2UHJldicpXCI+e3sgbW9udGhzWzNdLmxhYmVsIH19PHNwYW4gY2xhc3M9XCJhcnJcIiBbY2xhc3Mub25dPVwic29ydEtleSA9PT0gJ3JldlByZXYnXCI+e3sgc29ydEtleSA9PT0gJ3JldlByZXYnICYmIHNvcnREaXIgPT09IDEgPyAn4oaRJyA6ICfihpMnIH19PC9zcGFuPjwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cInN1Yi1oZWFkIHNvcnRhYmxlXCIgKGNsaWNrKT1cInNvcnRCeSgncmV2Q3VyJylcIj57eyBtb250aHNbNF0ubGFiZWwgfX08c3BhbiBjbGFzcz1cImFyclwiIFtjbGFzcy5vbl09XCJzb3J0S2V5ID09PSAncmV2Q3VyJ1wiPnt7IHNvcnRLZXkgPT09ICdyZXZDdXInICYmIHNvcnREaXIgPT09IDEgPyAn4oaRJyA6ICfihpMnIH19PC9zcGFuPjwvdGg+XG4gICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCByIG9mIGZpbHRlcmVkXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZD57eyByLmNsaWVudElkIHx8ICfigJQnIH19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkPjxzdHJvbmc+e3sgci5jbGllbnROYW1lIHwgdXBwZXJjYXNlIH19PC9zdHJvbmc+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJlbnRpdHlcIiBbdGl0bGVdPVwiKHIucmVnaXN0ZXJlZEVudGl0aWVzICYmIHIucmVnaXN0ZXJlZEVudGl0aWVzLmxlbmd0aCA/IHIucmVnaXN0ZXJlZEVudGl0aWVzLmpvaW4oJ1xcbicpIDogci5yZWdpc3RlcmVkRW50aXR5KSB8fCAnJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHIucmVnaXN0ZXJlZEVudGl0eSB8fCAn4oCUJyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJyLnJlZ2lzdGVyZWRFbnRpdGllcz8ubGVuZ3RoID4gMVwiIGNsYXNzPVwiZW50aXR5LW1vcmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJyLnJlZ2lzdGVyZWRFbnRpdGllcy5qb2luKCdcXG4nKVwiPit7eyByLnJlZ2lzdGVyZWRFbnRpdGllcy5sZW5ndGggLSAxIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd0FnaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ0ZXh0LWVuZFwiPjxzdHJvbmc+e3sgci5vdXRzdGFuZGluZyA/ICgn4oK5JyArIChyLm91dHN0YW5kaW5nIHwgbnVtYmVyOicxLjAtMCc6J2VuLUlOJykpIDogJ+KAlCcgfX08L3N0cm9uZz48L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwidGV4dC1lbmRcIj57eyByLmFnaW5nMHRvMzAgPyAoJ+KCuScgKyAoci5hZ2luZzB0bzMwIHwgbnVtYmVyOicxLjAtMCc6J2VuLUlOJykpIDogJ+KAlCcgfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwidGV4dC1lbmRcIj57eyByLmFnaW5nMzB0bzYwID8gKCfigrknICsgKHIuYWdpbmczMHRvNjAgfCBudW1iZXI6JzEuMC0wJzonZW4tSU4nKSkgOiAn4oCUJyB9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ0ZXh0LWVuZFwiPnt7IHIuYWdpbmdPdmVyNjAgPyAoJ+KCuScgKyAoci5hZ2luZ092ZXI2MCB8IG51bWJlcjonMS4wLTAnOidlbi1JTicpKSA6ICfigJQnIH19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZD48c3BhbiBjbGFzcz1cInBpbGxcIiBbbmdDbGFzc109XCJyLnN0YXR1cyA9PT0gJ1BhaWQnID8gJ3BpbGwtZ3JlZW4nIDogJ3BpbGwtYW1iZXInXCI+e3sgci5zdGF0dXMgfX08L3NwYW4+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nRm9yPVwibGV0IHAgb2Ygci5wcm9kdWN0c1wiIFtuZ0NsYXNzXT1cInByb2R1Y3RQaWxsQ2xhc3MocClcIiBjbGFzcz1cIm1lLTFcIj57eyBwIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhci5wcm9kdWN0cz8ubGVuZ3RoXCIgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+4oCUPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQ+e3sgci5jc20gfHwgJ+KAlCcgfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQgKm5nRm9yPVwibGV0IHMgb2Ygci5zdG9yZXM7IGxldCBpID0gaW5kZXhcIiBbY2xhc3MuZnctYm9sZF09XCJpID09PSByLnN0b3Jlcy5sZW5ndGggLSAxXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBzID09IG51bGwgPyAn4oCUJyA6IChzIHwgbnVtYmVyOicxLjAtMCc6J2VuLUlOJykgfX1cbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkIFt0aXRsZV09XCJyLmN1cnJlbmN5ID09PSAnZG9sbGFyJyA/ICgnVVNEIHByaWNpbmcg4oCUIHJldmVudWUgY29udmVydGVkIHRvIOKCuSBhdCB0b2RheVxcJ3MgcmF0ZSAoJyArICh1c2RSYXRlIHwgbnVtYmVyOicxLjItMicpICsgJyknKSA6ICcnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyByLnByaWNlUGVyU3RvcmUgPT0gbnVsbCA/ICfigJQnIDogKHIuY3VycmVuY3kgPT09ICdkb2xsYXInID8gJyQnIDogJ+KCuScpICsgKHIucHJpY2VQZXJTdG9yZSB8IG51bWJlcjonMS4wLTAnOidlbi1JTicpIH19XG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInRleHQtbXV0ZWRcIj57eyByLnJldlByZXYgPT0gbnVsbCA/ICfigJQnIDogJ+KCuScgKyAoci5yZXZQcmV2IHwgbnVtYmVyOicxLjAtMCc6J2VuLUlOJykgfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPnt7IHIucmV2Q3VyID09IG51bGwgPyAn4oCUJyA6ICfigrknICsgKHIucmV2Q3VyIHwgbnVtYmVyOicxLjAtMCc6J2VuLUlOJykgfX08L3N0cm9uZz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwici5yZXZDdXJFc3RpbWF0ZWRcIiBjbGFzcz1cImVzdC1jaGlwIG1zLTFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiRXN0aW1hdGVkOiBjdXJyZW50IHN0b3JlIGNvdW50IMOXIGJhc2UgcHJpY2Ug4oCUIHJlcGxhY2VkIGJ5IHRoZSBpbnZvaWNlIGFtb3VudCBvbmNlIGdlbmVyYXRlZFwiPmVzdC48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwici52YXJpYW5jZSAhPSBudWxsXCIgY2xhc3M9XCJmdy1zZW1pYm9sZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnRleHQtc3VjY2Vzc109XCJyLnZhcmlhbmNlID4gMFwiIFtjbGFzcy50ZXh0LWRhbmdlcl09XCJyLnZhcmlhbmNlIDwgMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIihtb250aHNbM10ubGFiZWwgKyAnICcgKyAoci5yZXZQcmV2ID09IG51bGwgPyAn4oCUJyA6ICfigrknICsgKHIucmV2UHJldiB8IG51bWJlcjonMS4wLTAnOidlbi1JTicpKSArICcg4oaSICcgKyBtb250aHNbNF0ubGFiZWwgKyAnICcgKyAoci5yZXZDdXIgPT0gbnVsbCA/ICfigJQnIDogJ+KCuScgKyAoci5yZXZDdXIgfCBudW1iZXI6JzEuMC0wJzonZW4tSU4nKSkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgci52YXJpYW5jZSA+IDAgPyAnKycgOiAnJyB9fXt7IHIudmFyaWFuY2UgfX0lXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInIudmFyaWFuY2UgPT0gbnVsbFwiIGNsYXNzPVwidGV4dC1tdXRlZFwiPuKAlDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwic2hvd0luc3RhbGxhdGlvblwiPnt7IHIuaW5zdGFsbGF0aW9uRmVlID09IG51bGwgPyAn4oCUJyA6ICfigrknICsgKHIuaW5zdGFsbGF0aW9uRmVlIHwgbnVtYmVyOicxLjAtMCc6J2VuLUlOJykgfX08L3RkPlxuICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgPHRyICpuZ0lmPVwiIWZpbHRlcmVkLmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgICAgICA8dGQgW2F0dHIuY29sc3Bhbl09XCIoc2hvd0FnaW5nID8gMTUgOiAxMSkgKyBtb250aHMubGVuZ3RoXCIgY2xhc3M9XCJ0ZXh0LWNlbnRlciB0ZXh0LW11dGVkIHB5LTVcIj5ObyBjbGllbnRzIG1hdGNoLjwvdGQ+XG4gICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgICA8dGZvb3Q+XG4gICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjNcIj5Ub3RhbCDCtyB7eyB0b3RhbHMuY291bnQgfX0gY2xpZW50czwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93QWdpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInRleHQtZW5kXCI+PHN0cm9uZz7igrl7eyB0b3RhbHMub3V0c3RhbmRpbmcgfCBudW1iZXI6JzEuMC0wJzonZW4tSU4nIH19PC9zdHJvbmc+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInRleHQtZW5kXCI+PHN0cm9uZz7igrl7eyB0b3RhbHMuYWdpbmcwdG8zMCB8IG51bWJlcjonMS4wLTAnOidlbi1JTicgfX08L3N0cm9uZz48L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwidGV4dC1lbmRcIj48c3Ryb25nPuKCuXt7IHRvdGFscy5hZ2luZzMwdG82MCB8IG51bWJlcjonMS4wLTAnOidlbi1JTicgfX08L3N0cm9uZz48L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwidGV4dC1lbmRcIj48c3Ryb25nPuKCuXt7IHRvdGFscy5hZ2luZ092ZXI2MCB8IG51bWJlcjonMS4wLTAnOidlbi1JTicgfX08L3N0cm9uZz48L3RkPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49XCIzXCI+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0Zvcj1cImxldCB0IG9mIHRvdGFscy5zdG9yZVRvdGFsc1wiPjxzdHJvbmc+e3sgdCB8IG51bWJlcjonMS4wLTAnOidlbi1JTicgfX08L3N0cm9uZz48L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQ+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkPjxzdHJvbmc+4oK5e3sgdG90YWxzLnJldlByZXYgfCBudW1iZXI6JzEuMC0wJzonZW4tSU4nIH19PC9zdHJvbmc+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkPjxzdHJvbmc+4oK5e3sgdG90YWxzLnJldkN1ciB8IG51bWJlcjonMS4wLTAnOidlbi1JTicgfX08L3N0cm9uZz48L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQ+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwic2hvd0luc3RhbGxhdGlvblwiPjxzdHJvbmc+4oK5e3sgdG90YWxzLmluc3RhbGxhdGlvbiB8IG51bWJlcjonMS4wLTAnOidlbi1JTicgfX08L3N0cm9uZz48L3RkPlxuICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICA8L3Rmb290PlxuICAgICAgICA8L3RhYmxlPlxuICAgIDwvZGl2PlxuPC9kaXY+Il19