ngx-techlify-core 18.30.0 → 18.31.0

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 (39) hide show
  1. package/esm2022/lib/subscription/subscription-form/subscription-form-routing.module.mjs +18 -0
  2. package/esm2022/lib/subscription/subscription-form/subscription-form.component.mjs +149 -0
  3. package/esm2022/lib/subscription/subscription-form/subscription-form.module.mjs +42 -0
  4. package/esm2022/lib/subscription/subscription-listing/subscription-listing-routing.module.mjs +26 -0
  5. package/esm2022/lib/subscription/subscription-listing/subscription-listing.component.mjs +136 -0
  6. package/esm2022/lib/subscription/subscription-listing/subscription-listing.module.mjs +53 -0
  7. package/esm2022/lib/subscription/subscription-package-listing/subscription-package-listing-routing.module.mjs +26 -0
  8. package/esm2022/lib/subscription/subscription-package-listing/subscription-package-listing.component.mjs +97 -0
  9. package/esm2022/lib/subscription/subscription-package-listing/subscription-package-listing.module.mjs +45 -0
  10. package/esm2022/lib/subscription/subscription-package-view/subscription-package-view-routing.module.mjs +26 -0
  11. package/esm2022/lib/subscription/subscription-package-view/subscription-package-view.component.mjs +39 -0
  12. package/esm2022/lib/subscription/subscription-package-view/subscription-package-view.module.mjs +37 -0
  13. package/esm2022/lib/subscription/subscription-package.service.mjs +21 -0
  14. package/esm2022/lib/subscription/subscription-status.enum.mjs +6 -0
  15. package/esm2022/lib/subscription/subscription.service.mjs +36 -0
  16. package/esm2022/lib/subscription/techlify-subscription-directive.module.mjs +20 -0
  17. package/esm2022/lib/subscription/techlify-subscription.directive.mjs +32 -0
  18. package/esm2022/public-api.mjs +13 -1
  19. package/fesm2022/ngx-techlify-core.mjs +867 -214
  20. package/fesm2022/ngx-techlify-core.mjs.map +1 -1
  21. package/lib/subscription/subscription-form/subscription-form-routing.module.d.ts +7 -0
  22. package/lib/subscription/subscription-form/subscription-form.component.d.ts +31 -0
  23. package/lib/subscription/subscription-form/subscription-form.module.d.ts +13 -0
  24. package/lib/subscription/subscription-listing/subscription-listing-routing.module.d.ts +7 -0
  25. package/lib/subscription/subscription-listing/subscription-listing.component.d.ts +29 -0
  26. package/lib/subscription/subscription-listing/subscription-listing.module.d.ts +15 -0
  27. package/lib/subscription/subscription-package-listing/subscription-package-listing-routing.module.d.ts +7 -0
  28. package/lib/subscription/subscription-package-listing/subscription-package-listing.component.d.ts +27 -0
  29. package/lib/subscription/subscription-package-listing/subscription-package-listing.module.d.ts +14 -0
  30. package/lib/subscription/subscription-package-view/subscription-package-view-routing.module.d.ts +7 -0
  31. package/lib/subscription/subscription-package-view/subscription-package-view.component.d.ts +15 -0
  32. package/lib/subscription/subscription-package-view/subscription-package-view.module.d.ts +12 -0
  33. package/lib/subscription/subscription-package.service.d.ts +9 -0
  34. package/lib/subscription/subscription-status.enum.d.ts +4 -0
  35. package/lib/subscription/subscription.service.d.ts +12 -0
  36. package/lib/subscription/techlify-subscription-directive.module.d.ts +8 -0
  37. package/lib/subscription/techlify-subscription.directive.d.ts +13 -0
  38. package/package.json +1 -1
  39. package/public-api.d.ts +11 -0
@@ -0,0 +1,18 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { RouterModule } from '@angular/router';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/router";
5
+ const routes = [];
6
+ export class SubscriptionFormRoutingModule {
7
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SubscriptionFormRoutingModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
8
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: SubscriptionFormRoutingModule, imports: [i1.RouterModule], exports: [RouterModule] }); }
9
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SubscriptionFormRoutingModule, imports: [RouterModule.forChild(routes), RouterModule] }); }
10
+ }
11
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SubscriptionFormRoutingModule, decorators: [{
12
+ type: NgModule,
13
+ args: [{
14
+ imports: [RouterModule.forChild(routes)],
15
+ exports: [RouterModule]
16
+ }]
17
+ }] });
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Vic2NyaXB0aW9uLWZvcm0tcm91dGluZy5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdGVjaGxpZnktY29yZS9zcmMvbGliL3N1YnNjcmlwdGlvbi9zdWJzY3JpcHRpb24tZm9ybS9zdWJzY3JpcHRpb24tZm9ybS1yb3V0aW5nLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxZQUFZLEVBQVUsTUFBTSxpQkFBaUIsQ0FBQzs7O0FBRXZELE1BQU0sTUFBTSxHQUFXLEVBQUUsQ0FBQztBQU0xQixNQUFNLE9BQU8sNkJBQTZCOytHQUE3Qiw2QkFBNkI7Z0hBQTdCLDZCQUE2Qix3Q0FGOUIsWUFBWTtnSEFFWCw2QkFBNkIsWUFIOUIsWUFBWSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFDN0IsWUFBWTs7NEZBRVgsNkJBQTZCO2tCQUp6QyxRQUFRO21CQUFDO29CQUNSLE9BQU8sRUFBRSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQ3hDLE9BQU8sRUFBRSxDQUFDLFlBQVksQ0FBQztpQkFDeEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUm91dGVyTW9kdWxlLCBSb3V0ZXMgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5jb25zdCByb3V0ZXM6IFJvdXRlcyA9IFtdO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbUm91dGVyTW9kdWxlLmZvckNoaWxkKHJvdXRlcyldLFxuICBleHBvcnRzOiBbUm91dGVyTW9kdWxlXVxufSlcbmV4cG9ydCBjbGFzcyBTdWJzY3JpcHRpb25Gb3JtUm91dGluZ01vZHVsZSB7IH1cbiJdfQ==
@@ -0,0 +1,149 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import { Validators } from '@angular/forms';
3
+ import { finalize } from 'rxjs';
4
+ import { SubscriptionStatus } from '../subscription-status.enum';
5
+ import { TechlifyFormComponentInterface } from '../../base-model/techlify-form-component.class';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "../../core/form-validator.service";
8
+ import * as i2 from "@angular/material/dialog";
9
+ import * as i3 from "@angular/forms";
10
+ import * as i4 from "../subscription.service";
11
+ import * as i5 from "@angular/common";
12
+ import * as i6 from "@angular/material/button";
13
+ import * as i7 from "@angular/material/form-field";
14
+ import * as i8 from "@angular/material/icon";
15
+ import * as i9 from "@angular/material/input";
16
+ import * as i10 from "@angular/material/datepicker";
17
+ import * as i11 from "@angular/material/tooltip";
18
+ import * as i12 from "@angular/material/button-toggle";
19
+ import * as i13 from "@angular/material/progress-bar";
20
+ import * as i14 from "@angular/material/slide-toggle";
21
+ import * as i15 from "../../searchable-selector/searchable-selector.component";
22
+ import * as i16 from "@angular/flex-layout/flex";
23
+ export class SubscriptionFormComponent extends TechlifyFormComponentInterface {
24
+ get tenantSubscriptionInfo() {
25
+ return this._tenantSubscriptionInfo;
26
+ }
27
+ set tenantSubscriptionInfo(value) {
28
+ this.isUpdate = true;
29
+ this._tenantSubscriptionInfo = value;
30
+ this.selectedTenant = value?.tenant;
31
+ this.selectedPackage = value?.package;
32
+ }
33
+ constructor(formValidatorService, dialog, fb, subscriptionService) {
34
+ super(formValidatorService);
35
+ this.dialog = dialog;
36
+ this.fb = fb;
37
+ this.subscriptionService = subscriptionService;
38
+ this.isUpdate = false;
39
+ this.success = new EventEmitter();
40
+ this.errorMessages = {
41
+ tenant_id: {
42
+ required: 'Tenant is required',
43
+ },
44
+ package_id: {
45
+ required: 'Package is required',
46
+ },
47
+ trail_started_at: {
48
+ required: "Trail Started At is required"
49
+ },
50
+ trail_ended_at: {
51
+ required: "Trail Ended At is required"
52
+ },
53
+ started_at: {
54
+ required: "Started At is required"
55
+ }
56
+ };
57
+ this.isWorking = false;
58
+ }
59
+ ngOnInit() {
60
+ }
61
+ initialize() {
62
+ this.form = this.fb.group({
63
+ id: [''],
64
+ tenant_id: ['', Validators.required],
65
+ package_id: ['', Validators.required],
66
+ cost_per_unit: [''],
67
+ units: [''],
68
+ status_id: [SubscriptionStatus.ACTIVE],
69
+ is_unit_limitation_enforced: [false],
70
+ is_trail: [false],
71
+ details: [''],
72
+ trail_started_at: [''],
73
+ trail_ended_at: [''],
74
+ started_at: ['', Validators.required],
75
+ ended_at: [''],
76
+ });
77
+ if (this.subscriptionPackage) {
78
+ this.selectedPackage = this.selectedPackage;
79
+ this.form.patchValue({ 'package_id': this.subscriptionPackage.id });
80
+ }
81
+ }
82
+ formDialog(templateRef) {
83
+ this.initialize();
84
+ if (this.isUpdate) {
85
+ this.form.patchValue(this.tenantSubscriptionInfo);
86
+ }
87
+ this.dialogRef = this.dialog.open(templateRef, {
88
+ width: '700px',
89
+ autoFocus: false,
90
+ });
91
+ }
92
+ submit() {
93
+ this.form.markAllAsTouched();
94
+ this.form.markAsDirty();
95
+ if (this.form.valid) {
96
+ const model = this.form.value;
97
+ this.isWorking = true;
98
+ (this.isUpdate ?
99
+ this.subscriptionService.update(model) :
100
+ this.subscriptionService.store(model))
101
+ .pipe(finalize(() => this.isWorking = false))
102
+ .subscribe((res) => {
103
+ this.success.emit(res?.item);
104
+ this.dialogRef.close();
105
+ });
106
+ }
107
+ }
108
+ validateDates() {
109
+ const startedAt = this.form.get('started_at');
110
+ const endedAt = this.form.get('ended_at');
111
+ const trailStartedAt = this.form.get('trail_started_at');
112
+ const trailEndedAt = this.form.get('trail_ended_at');
113
+ if (this.form.get('is_trail').value) {
114
+ endedAt.reset();
115
+ startedAt.reset();
116
+ startedAt.clearValidators();
117
+ startedAt.updateValueAndValidity();
118
+ trailStartedAt.addValidators([Validators.required]);
119
+ trailStartedAt.updateValueAndValidity();
120
+ trailEndedAt.addValidators([Validators.required]);
121
+ trailEndedAt.updateValueAndValidity();
122
+ }
123
+ else {
124
+ trailStartedAt.reset();
125
+ trailStartedAt.clearValidators();
126
+ trailStartedAt.updateValueAndValidity();
127
+ trailEndedAt.reset();
128
+ trailEndedAt.clearValidators();
129
+ trailEndedAt.updateValueAndValidity();
130
+ startedAt.addValidators([Validators.required]);
131
+ startedAt.updateValueAndValidity();
132
+ }
133
+ }
134
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SubscriptionFormComponent, deps: [{ token: i1.FormValidatorService }, { token: i2.MatDialog }, { token: i3.UntypedFormBuilder }, { token: i4.SubscriptionService }], target: i0.ɵɵFactoryTarget.Component }); }
135
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: SubscriptionFormComponent, selector: "app-subscription-form", inputs: { isUpdate: "isUpdate", subscriptionPackage: "subscriptionPackage", tenantSubscriptionInfo: "tenantSubscriptionInfo" }, outputs: { success: "success" }, usesInheritance: true, ngImport: i0, template: "<button *ngIf=\"!isUpdate\" matTooltip=\"Add Subscription\" type=\"button\" mat-icon-button\n (click)=\"formDialog(formTemplate)\">\n <mat-icon>add</mat-icon>\n</button>\n<button *ngIf=\"isUpdate\" matTooltip=\"Edit Subscription\" type=\"button\" mat-icon-button\n (click)=\"formDialog(formTemplate)\">\n <mat-icon>edit</mat-icon>\n</button>\n\n\n<ng-template #formTemplate>\n <mat-progress-bar mode=\"indeterminate\" *ngIf=\"isWorking\"></mat-progress-bar>\n <form [formGroup]=\"form\" (ngSubmit)=\"submit()\">\n <div fxLayout=\"column\" class=\"mat-typography\">\n <div mat-dialog-title class=\"text-center\">\n <div>{{subscriptionPackage?'Package':'Tenant'}} Subscription Form</div>\n </div>\n\n <div mat-dialog-content fxLayout=\"row wrap\" fxLayoutGap=\"0.5rem\">\n\n <mat-form-field appearance=\"outline\" fxFlex=\"0 1 calc(50%-0.5rem)\">\n <mat-label>Tenant</mat-label>\n <app-searchable-selector appearance=\"outline\" formControlName=\"tenant_id\" titleField=\"name\"\n apiUrl=\"api/clients\" sortBy=\"name|ASC\"\n [selectedValue]=\"selectedTenant\"></app-searchable-selector>\n <mat-error *ngIf=\"isFieldValid('tenant_id')\">{{getErrorMessage('tenant_id')}}\n </mat-error>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" fxFlex=\"0 1 calc(50%-0.5rem)\">\n <mat-label>Package</mat-label>\n <app-searchable-selector appearance=\"outline\" formControlName=\"package_id\"\n apiUrl=\"api/subscription-packages\" sortBy=\"title|ASC\"\n [selectedValue]=\"selectedPackage\"></app-searchable-selector>\n <mat-error *ngIf=\"isFieldValid('package_id')\">{{getErrorMessage('package_id')}}\n </mat-error>\n </mat-form-field>\n\n\n <div fxLayoutAlign=\"start center\" fxFlex=\"100\" class=\"mb-2\">\n <mat-button-toggle-group [hideSingleSelectionIndicator]=\"true\"\n [hideMultipleSelectionIndicator]=\"true\" formControlName=\"is_trail\" (change)=\"validateDates()\">\n <mat-button-toggle [value]=\"true\">Trail</mat-button-toggle>\n <mat-button-toggle [value]=\"false\">Paid</mat-button-toggle>\n </mat-button-toggle-group>\n </div>\n\n <ng-container *ngIf=\"!form.get('is_trail').value\">\n <mat-form-field fxFlex=\"0 1 calc(50%-0.5rem)\">\n <input matInput [matDatepicker]=\"started_at\" formControlName=\"started_at\"\n placeholder=\"Started At\" [required]=\"!form.get('is_trail').value\" />\n <mat-datepicker-toggle matSuffix [for]=\"started_at\"></mat-datepicker-toggle>\n <mat-datepicker #started_at></mat-datepicker>\n <mat-error *ngIf=\"isFieldValid('started_at')\">{{getErrorMessage('started_at')}}</mat-error>\n </mat-form-field>\n\n <mat-form-field fxFlex=\"0 1 calc(50%-0.5rem)\">\n <input matInput [matDatepicker]=\"ended_at\" formControlName=\"ended_at\" placeholder=\"Ended At\" />\n <mat-datepicker-toggle matSuffix [for]=\"ended_at\"></mat-datepicker-toggle>\n <mat-datepicker #ended_at></mat-datepicker>\n </mat-form-field>\n </ng-container>\n\n <ng-container *ngIf=\"form.get('is_trail').value\">\n <mat-form-field fxFlex=\"0 1 calc(50%-0.5rem)\">\n <input matInput [matDatepicker]=\"trail_started_at\" formControlName=\"trail_started_at\"\n placeholder=\"Trail Started At\" [required]=\"form.get('is_trail').value\" />\n <mat-datepicker-toggle matSuffix [for]=\"trail_started_at\"></mat-datepicker-toggle>\n <mat-datepicker #trail_started_at></mat-datepicker>\n <mat-error\n *ngIf=\"isFieldValid('trail_started_at')\">{{getErrorMessage('trail_started_at')}}</mat-error>\n </mat-form-field>\n\n <mat-form-field fxFlex=\"0 1 calc(50%-0.5rem)\">\n <input matInput [matDatepicker]=\"trail_ended_at\" formControlName=\"trail_ended_at\"\n placeholder=\"Trail Ended At\" [required]=\"form.get('is_trail').value\" />\n <mat-datepicker-toggle matSuffix [for]=\"trail_ended_at\"></mat-datepicker-toggle>\n <mat-datepicker #trail_ended_at></mat-datepicker>\n <mat-error\n *ngIf=\"isFieldValid('trail_ended_at')\">{{getErrorMessage('trail_ended_at')}}</mat-error>\n </mat-form-field>\n </ng-container>\n\n <mat-form-field appearance=\"outline\" fxFlex=\"0 1 calc(50%-0.5rem)\">\n <mat-label>Cost/Unit</mat-label>\n <input type=\"number\" matInput formControlName=\"cost_per_unit\" placeholder=\"Cost/Unit\" />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" fxFlex=\"0 1 calc(50%-0.5rem)\">\n <mat-label>Units</mat-label>\n <input type=\"number\" matInput formControlName=\"units\" placeholder=\"Units\" />\n </mat-form-field>\n\n <div fxLayoutAlign=\"start center\" fxFlex=\"100\">\n <mat-slide-toggle class=\"switch\" formControlName=\"is_unit_limitation_enforced\">Is\n Unit Enforced\n </mat-slide-toggle>\n </div>\n\n <div class=\"my-2\" fxLayout=\"row\" fxLayoutGap=\"30px\" fxLayoutAlign=\"end\" fxFlex=\"100%\">\n <button fxFlex mat-raised-button type=\"button\" matDialogClose class=\"white-bg-button\">\n Cancel\n </button>\n <button fxFlex mat-raised-button color=\"primary\" type=\"submit\">\n Save\n </button>\n </div>\n </div>\n </div>\n </form>\n</ng-template>", styles: [""], dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i6.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i6.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: i2.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i2.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i2.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "component", type: i7.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i7.MatLabel, selector: "mat-label" }, { kind: "directive", type: i7.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i7.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i9.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i10.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i10.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i10.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "directive", type: i11.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: i12.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled", "disabledInteractive", "hideSingleSelectionIndicator", "hideMultipleSelectionIndicator"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }, { kind: "component", type: i12.MatButtonToggle, selector: "mat-button-toggle", inputs: ["aria-label", "aria-labelledby", "id", "name", "value", "tabIndex", "disableRipple", "appearance", "checked", "disabled", "disabledInteractive"], outputs: ["change"], exportAs: ["matButtonToggle"] }, { kind: "component", type: i13.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: i14.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "component", type: i15.SearchableSelectorComponent, selector: "app-searchable-selector", inputs: ["valueField", "titleField", "subtitleField", "apiUrl", "multiple", "selectedValue", "enableSearch", "add", "addConfig", "edit", "editConfig", "sort", "sortBy", "searchField", "itemComponent", "items", "apiDataProperty", "cache", "perPage", "inDataSearch", "panelWidth", "focusSearchOnOpen", "required", "disabled", "value"], outputs: ["selectedValueChange", "selectionChange", "itemsChange"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.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: i3.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i16.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i16.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { kind: "directive", type: i16.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i16.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }] }); }
136
+ }
137
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SubscriptionFormComponent, decorators: [{
138
+ type: Component,
139
+ args: [{ selector: 'app-subscription-form', template: "<button *ngIf=\"!isUpdate\" matTooltip=\"Add Subscription\" type=\"button\" mat-icon-button\n (click)=\"formDialog(formTemplate)\">\n <mat-icon>add</mat-icon>\n</button>\n<button *ngIf=\"isUpdate\" matTooltip=\"Edit Subscription\" type=\"button\" mat-icon-button\n (click)=\"formDialog(formTemplate)\">\n <mat-icon>edit</mat-icon>\n</button>\n\n\n<ng-template #formTemplate>\n <mat-progress-bar mode=\"indeterminate\" *ngIf=\"isWorking\"></mat-progress-bar>\n <form [formGroup]=\"form\" (ngSubmit)=\"submit()\">\n <div fxLayout=\"column\" class=\"mat-typography\">\n <div mat-dialog-title class=\"text-center\">\n <div>{{subscriptionPackage?'Package':'Tenant'}} Subscription Form</div>\n </div>\n\n <div mat-dialog-content fxLayout=\"row wrap\" fxLayoutGap=\"0.5rem\">\n\n <mat-form-field appearance=\"outline\" fxFlex=\"0 1 calc(50%-0.5rem)\">\n <mat-label>Tenant</mat-label>\n <app-searchable-selector appearance=\"outline\" formControlName=\"tenant_id\" titleField=\"name\"\n apiUrl=\"api/clients\" sortBy=\"name|ASC\"\n [selectedValue]=\"selectedTenant\"></app-searchable-selector>\n <mat-error *ngIf=\"isFieldValid('tenant_id')\">{{getErrorMessage('tenant_id')}}\n </mat-error>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" fxFlex=\"0 1 calc(50%-0.5rem)\">\n <mat-label>Package</mat-label>\n <app-searchable-selector appearance=\"outline\" formControlName=\"package_id\"\n apiUrl=\"api/subscription-packages\" sortBy=\"title|ASC\"\n [selectedValue]=\"selectedPackage\"></app-searchable-selector>\n <mat-error *ngIf=\"isFieldValid('package_id')\">{{getErrorMessage('package_id')}}\n </mat-error>\n </mat-form-field>\n\n\n <div fxLayoutAlign=\"start center\" fxFlex=\"100\" class=\"mb-2\">\n <mat-button-toggle-group [hideSingleSelectionIndicator]=\"true\"\n [hideMultipleSelectionIndicator]=\"true\" formControlName=\"is_trail\" (change)=\"validateDates()\">\n <mat-button-toggle [value]=\"true\">Trail</mat-button-toggle>\n <mat-button-toggle [value]=\"false\">Paid</mat-button-toggle>\n </mat-button-toggle-group>\n </div>\n\n <ng-container *ngIf=\"!form.get('is_trail').value\">\n <mat-form-field fxFlex=\"0 1 calc(50%-0.5rem)\">\n <input matInput [matDatepicker]=\"started_at\" formControlName=\"started_at\"\n placeholder=\"Started At\" [required]=\"!form.get('is_trail').value\" />\n <mat-datepicker-toggle matSuffix [for]=\"started_at\"></mat-datepicker-toggle>\n <mat-datepicker #started_at></mat-datepicker>\n <mat-error *ngIf=\"isFieldValid('started_at')\">{{getErrorMessage('started_at')}}</mat-error>\n </mat-form-field>\n\n <mat-form-field fxFlex=\"0 1 calc(50%-0.5rem)\">\n <input matInput [matDatepicker]=\"ended_at\" formControlName=\"ended_at\" placeholder=\"Ended At\" />\n <mat-datepicker-toggle matSuffix [for]=\"ended_at\"></mat-datepicker-toggle>\n <mat-datepicker #ended_at></mat-datepicker>\n </mat-form-field>\n </ng-container>\n\n <ng-container *ngIf=\"form.get('is_trail').value\">\n <mat-form-field fxFlex=\"0 1 calc(50%-0.5rem)\">\n <input matInput [matDatepicker]=\"trail_started_at\" formControlName=\"trail_started_at\"\n placeholder=\"Trail Started At\" [required]=\"form.get('is_trail').value\" />\n <mat-datepicker-toggle matSuffix [for]=\"trail_started_at\"></mat-datepicker-toggle>\n <mat-datepicker #trail_started_at></mat-datepicker>\n <mat-error\n *ngIf=\"isFieldValid('trail_started_at')\">{{getErrorMessage('trail_started_at')}}</mat-error>\n </mat-form-field>\n\n <mat-form-field fxFlex=\"0 1 calc(50%-0.5rem)\">\n <input matInput [matDatepicker]=\"trail_ended_at\" formControlName=\"trail_ended_at\"\n placeholder=\"Trail Ended At\" [required]=\"form.get('is_trail').value\" />\n <mat-datepicker-toggle matSuffix [for]=\"trail_ended_at\"></mat-datepicker-toggle>\n <mat-datepicker #trail_ended_at></mat-datepicker>\n <mat-error\n *ngIf=\"isFieldValid('trail_ended_at')\">{{getErrorMessage('trail_ended_at')}}</mat-error>\n </mat-form-field>\n </ng-container>\n\n <mat-form-field appearance=\"outline\" fxFlex=\"0 1 calc(50%-0.5rem)\">\n <mat-label>Cost/Unit</mat-label>\n <input type=\"number\" matInput formControlName=\"cost_per_unit\" placeholder=\"Cost/Unit\" />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" fxFlex=\"0 1 calc(50%-0.5rem)\">\n <mat-label>Units</mat-label>\n <input type=\"number\" matInput formControlName=\"units\" placeholder=\"Units\" />\n </mat-form-field>\n\n <div fxLayoutAlign=\"start center\" fxFlex=\"100\">\n <mat-slide-toggle class=\"switch\" formControlName=\"is_unit_limitation_enforced\">Is\n Unit Enforced\n </mat-slide-toggle>\n </div>\n\n <div class=\"my-2\" fxLayout=\"row\" fxLayoutGap=\"30px\" fxLayoutAlign=\"end\" fxFlex=\"100%\">\n <button fxFlex mat-raised-button type=\"button\" matDialogClose class=\"white-bg-button\">\n Cancel\n </button>\n <button fxFlex mat-raised-button color=\"primary\" type=\"submit\">\n Save\n </button>\n </div>\n </div>\n </div>\n </form>\n</ng-template>" }]
140
+ }], ctorParameters: () => [{ type: i1.FormValidatorService }, { type: i2.MatDialog }, { type: i3.UntypedFormBuilder }, { type: i4.SubscriptionService }], propDecorators: { isUpdate: [{
141
+ type: Input
142
+ }], subscriptionPackage: [{
143
+ type: Input
144
+ }], success: [{
145
+ type: Output
146
+ }], tenantSubscriptionInfo: [{
147
+ type: Input
148
+ }] } });
149
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Vic2NyaXB0aW9uLWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXRlY2hsaWZ5LWNvcmUvc3JjL2xpYi9zdWJzY3JpcHRpb24vc3Vic2NyaXB0aW9uLWZvcm0vc3Vic2NyaXB0aW9uLWZvcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXRlY2hsaWZ5LWNvcmUvc3JjL2xpYi9zdWJzY3JpcHRpb24vc3Vic2NyaXB0aW9uLWZvcm0vc3Vic2NyaXB0aW9uLWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBZSxNQUFNLGVBQWUsQ0FBQztBQUU1RixPQUFPLEVBQXNCLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFaEMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDakUsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sZ0RBQWdELENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVFoRyxNQUFNLE9BQU8seUJBQTBCLFNBQVEsOEJBQThCO0lBOEIzRSxJQUFJLHNCQUFzQjtRQUN4QixPQUFPLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztJQUN0QyxDQUFDO0lBRUQsSUFBYSxzQkFBc0IsQ0FBQyxLQUFVO1FBQzVDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUM7UUFDckMsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLEVBQUUsTUFBTSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxFQUFFLE9BQU8sQ0FBQztJQUN4QyxDQUFDO0lBRUQsWUFDRSxvQkFBMEMsRUFDbEMsTUFBaUIsRUFDakIsRUFBc0IsRUFDdEIsbUJBQXdDO1FBRWhELEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBSnBCLFdBQU0sR0FBTixNQUFNLENBQVc7UUFDakIsT0FBRSxHQUFGLEVBQUUsQ0FBb0I7UUFDdEIsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQTNDekMsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUV6QixZQUFPLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUk1QyxrQkFBYSxHQUFRO1lBQ25CLFNBQVMsRUFBRTtnQkFDVCxRQUFRLEVBQUUsb0JBQW9CO2FBQy9CO1lBQ0QsVUFBVSxFQUFFO2dCQUNWLFFBQVEsRUFBRSxxQkFBcUI7YUFDaEM7WUFDRCxnQkFBZ0IsRUFBRTtnQkFDaEIsUUFBUSxFQUFFLDhCQUE4QjthQUN6QztZQUNELGNBQWMsRUFBRTtnQkFDZCxRQUFRLEVBQUUsNEJBQTRCO2FBQ3ZDO1lBQ0QsVUFBVSxFQUFFO2dCQUNWLFFBQVEsRUFBRSx3QkFBd0I7YUFDbkM7U0FDRixDQUFDO1FBR0YsY0FBUyxHQUFZLEtBQUssQ0FBQztJQXFCM0IsQ0FBQztJQUdELFFBQVE7SUFDUixDQUFDO0lBRUQsVUFBVTtRQUNSLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDeEIsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ1IsU0FBUyxFQUFFLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDcEMsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDckMsYUFBYSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ25CLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUNYLFNBQVMsRUFBRSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQztZQUN0QywyQkFBMkIsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNwQyxRQUFRLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDakIsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ2IsZ0JBQWdCLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDdEIsY0FBYyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ3BCLFVBQVUsRUFBRSxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDO1lBQ3JDLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQztTQUNmLENBQUMsQ0FBQztRQUVILElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1lBQzVDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3RFLENBQUM7SUFDSCxDQUFDO0lBRUQsVUFBVSxDQUFDLFdBQTZCO1FBQ3RDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNsQixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUNwRCxDQUFDO1FBQ0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDN0MsS0FBSyxFQUFFLE9BQU87WUFDZCxTQUFTLEVBQUUsS0FBSztTQUNqQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsTUFBTTtRQUNKLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNwQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUM5QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztZQUN0QixDQUNFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDYixJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ3hDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQ3hDO2lCQUNFLElBQUksQ0FDSCxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsQ0FDdkM7aUJBQ0EsU0FBUyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUU7Z0JBQ3RCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDN0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN6QixDQUFDLENBQUMsQ0FBQztRQUNQLENBQUM7SUFDSCxDQUFDO0lBRUQsYUFBYTtRQUNYLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzlDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzFDLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDekQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUVyRCxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3BDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNoQixTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbEIsU0FBUyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQzVCLFNBQVMsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBRW5DLGNBQWMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUNwRCxjQUFjLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUN4QyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDbEQsWUFBWSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDeEMsQ0FBQzthQUFNLENBQUM7WUFDTixjQUFjLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDdkIsY0FBYyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ2pDLGNBQWMsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBQ3hDLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNyQixZQUFZLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDL0IsWUFBWSxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFFdEMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQy9DLFNBQVMsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQ3JDLENBQUM7SUFFSCxDQUFDOytHQXpJVSx5QkFBeUI7bUdBQXpCLHlCQUF5QixxUENkdEMsdTNNQThHYzs7NEZEaEdELHlCQUF5QjtrQkFMckMsU0FBUzsrQkFDRSx1QkFBdUI7b0xBTXhCLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNJLE9BQU87c0JBQWhCLE1BQU07Z0JBOEJNLHNCQUFzQjtzQkFBbEMsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFRlbXBsYXRlUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXREaWFsb2csIE1hdERpYWxvZ1JlZiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBVbnR5cGVkRm9ybUJ1aWxkZXIsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBmaW5hbGl6ZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uU2VydmljZSB9IGZyb20gJy4uL3N1YnNjcmlwdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvblN0YXR1cyB9IGZyb20gJy4uL3N1YnNjcmlwdGlvbi1zdGF0dXMuZW51bSc7XG5pbXBvcnQgeyBUZWNobGlmeUZvcm1Db21wb25lbnRJbnRlcmZhY2UgfSBmcm9tICcuLi8uLi9iYXNlLW1vZGVsL3RlY2hsaWZ5LWZvcm0tY29tcG9uZW50LmNsYXNzJztcbmltcG9ydCB7IEZvcm1WYWxpZGF0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9mb3JtLXZhbGlkYXRvci5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXN1YnNjcmlwdGlvbi1mb3JtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3N1YnNjcmlwdGlvbi1mb3JtLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc3Vic2NyaXB0aW9uLWZvcm0uY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBTdWJzY3JpcHRpb25Gb3JtQ29tcG9uZW50IGV4dGVuZHMgVGVjaGxpZnlGb3JtQ29tcG9uZW50SW50ZXJmYWNlIGltcGxlbWVudHMgT25Jbml0IHtcblxuICBASW5wdXQoKSBpc1VwZGF0ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBzdWJzY3JpcHRpb25QYWNrYWdlOiBhbnk7XG4gIEBPdXRwdXQoKSBzdWNjZXNzID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIHNlbGVjdGVkVGVuYW50OiBhbnk7XG4gIHNlbGVjdGVkUGFja2FnZTogYW55O1xuXG4gIGVycm9yTWVzc2FnZXM6IGFueSA9IHtcbiAgICB0ZW5hbnRfaWQ6IHtcbiAgICAgIHJlcXVpcmVkOiAnVGVuYW50IGlzIHJlcXVpcmVkJyxcbiAgICB9LFxuICAgIHBhY2thZ2VfaWQ6IHtcbiAgICAgIHJlcXVpcmVkOiAnUGFja2FnZSBpcyByZXF1aXJlZCcsXG4gICAgfSxcbiAgICB0cmFpbF9zdGFydGVkX2F0OiB7XG4gICAgICByZXF1aXJlZDogXCJUcmFpbCBTdGFydGVkIEF0IGlzIHJlcXVpcmVkXCJcbiAgICB9LFxuICAgIHRyYWlsX2VuZGVkX2F0OiB7XG4gICAgICByZXF1aXJlZDogXCJUcmFpbCBFbmRlZCBBdCBpcyByZXF1aXJlZFwiXG4gICAgfSxcbiAgICBzdGFydGVkX2F0OiB7XG4gICAgICByZXF1aXJlZDogXCJTdGFydGVkIEF0IGlzIHJlcXVpcmVkXCJcbiAgICB9XG4gIH07XG5cbiAgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8YW55LCBhbnk+O1xuICBpc1dvcmtpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBfdGVuYW50U3Vic2NyaXB0aW9uSW5mbzogYW55O1xuICBnZXQgdGVuYW50U3Vic2NyaXB0aW9uSW5mbygpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl90ZW5hbnRTdWJzY3JpcHRpb25JbmZvO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IHRlbmFudFN1YnNjcmlwdGlvbkluZm8odmFsdWU6IGFueSkge1xuICAgIHRoaXMuaXNVcGRhdGUgPSB0cnVlO1xuICAgIHRoaXMuX3RlbmFudFN1YnNjcmlwdGlvbkluZm8gPSB2YWx1ZTtcbiAgICB0aGlzLnNlbGVjdGVkVGVuYW50ID0gdmFsdWU/LnRlbmFudDtcbiAgICB0aGlzLnNlbGVjdGVkUGFja2FnZSA9IHZhbHVlPy5wYWNrYWdlO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZm9ybVZhbGlkYXRvclNlcnZpY2U6IEZvcm1WYWxpZGF0b3JTZXJ2aWNlLFxuICAgIHByaXZhdGUgZGlhbG9nOiBNYXREaWFsb2csXG4gICAgcHJpdmF0ZSBmYjogVW50eXBlZEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgc3Vic2NyaXB0aW9uU2VydmljZTogU3Vic2NyaXB0aW9uU2VydmljZVxuICApIHtcbiAgICBzdXBlcihmb3JtVmFsaWRhdG9yU2VydmljZSk7XG4gIH1cblxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICB9XG5cbiAgaW5pdGlhbGl6ZSgpIHtcbiAgICB0aGlzLmZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGlkOiBbJyddLFxuICAgICAgdGVuYW50X2lkOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgcGFja2FnZV9pZDogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgIGNvc3RfcGVyX3VuaXQ6IFsnJ10sXG4gICAgICB1bml0czogWycnXSxcbiAgICAgIHN0YXR1c19pZDogW1N1YnNjcmlwdGlvblN0YXR1cy5BQ1RJVkVdLFxuICAgICAgaXNfdW5pdF9saW1pdGF0aW9uX2VuZm9yY2VkOiBbZmFsc2VdLFxuICAgICAgaXNfdHJhaWw6IFtmYWxzZV0sXG4gICAgICBkZXRhaWxzOiBbJyddLFxuICAgICAgdHJhaWxfc3RhcnRlZF9hdDogWycnXSxcbiAgICAgIHRyYWlsX2VuZGVkX2F0OiBbJyddLFxuICAgICAgc3RhcnRlZF9hdDogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgIGVuZGVkX2F0OiBbJyddLFxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uUGFja2FnZSkge1xuICAgICAgdGhpcy5zZWxlY3RlZFBhY2thZ2UgPSB0aGlzLnNlbGVjdGVkUGFja2FnZTtcbiAgICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHsgJ3BhY2thZ2VfaWQnOiB0aGlzLnN1YnNjcmlwdGlvblBhY2thZ2UuaWQgfSk7XG4gICAgfVxuICB9XG5cbiAgZm9ybURpYWxvZyh0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8YW55Pikge1xuICAgIHRoaXMuaW5pdGlhbGl6ZSgpO1xuICAgIGlmICh0aGlzLmlzVXBkYXRlKSB7XG4gICAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZSh0aGlzLnRlbmFudFN1YnNjcmlwdGlvbkluZm8pO1xuICAgIH1cbiAgICB0aGlzLmRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4odGVtcGxhdGVSZWYsIHtcbiAgICAgIHdpZHRoOiAnNzAwcHgnLFxuICAgICAgYXV0b0ZvY3VzOiBmYWxzZSxcbiAgICB9KTtcbiAgfVxuXG4gIHN1Ym1pdCgpIHtcbiAgICB0aGlzLmZvcm0ubWFya0FsbEFzVG91Y2hlZCgpO1xuICAgIHRoaXMuZm9ybS5tYXJrQXNEaXJ0eSgpO1xuICAgIGlmICh0aGlzLmZvcm0udmFsaWQpIHtcbiAgICAgIGNvbnN0IG1vZGVsID0gdGhpcy5mb3JtLnZhbHVlO1xuICAgICAgdGhpcy5pc1dvcmtpbmcgPSB0cnVlO1xuICAgICAgKFxuICAgICAgICB0aGlzLmlzVXBkYXRlID9cbiAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvblNlcnZpY2UudXBkYXRlKG1vZGVsKSA6XG4gICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25TZXJ2aWNlLnN0b3JlKG1vZGVsKVxuICAgICAgKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBmaW5hbGl6ZSgoKSA9PiB0aGlzLmlzV29ya2luZyA9IGZhbHNlKSxcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMuc3VjY2Vzcy5lbWl0KHJlcz8uaXRlbSk7XG4gICAgICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGVEYXRlcygpIHtcbiAgICBjb25zdCBzdGFydGVkQXQgPSB0aGlzLmZvcm0uZ2V0KCdzdGFydGVkX2F0Jyk7XG4gICAgY29uc3QgZW5kZWRBdCA9IHRoaXMuZm9ybS5nZXQoJ2VuZGVkX2F0Jyk7XG4gICAgY29uc3QgdHJhaWxTdGFydGVkQXQgPSB0aGlzLmZvcm0uZ2V0KCd0cmFpbF9zdGFydGVkX2F0Jyk7XG4gICAgY29uc3QgdHJhaWxFbmRlZEF0ID0gdGhpcy5mb3JtLmdldCgndHJhaWxfZW5kZWRfYXQnKTtcblxuICAgIGlmICh0aGlzLmZvcm0uZ2V0KCdpc190cmFpbCcpLnZhbHVlKSB7XG4gICAgICBlbmRlZEF0LnJlc2V0KCk7XG4gICAgICBzdGFydGVkQXQucmVzZXQoKTtcbiAgICAgIHN0YXJ0ZWRBdC5jbGVhclZhbGlkYXRvcnMoKTtcbiAgICAgIHN0YXJ0ZWRBdC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG5cbiAgICAgIHRyYWlsU3RhcnRlZEF0LmFkZFZhbGlkYXRvcnMoW1ZhbGlkYXRvcnMucmVxdWlyZWRdKTtcbiAgICAgIHRyYWlsU3RhcnRlZEF0LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgIHRyYWlsRW5kZWRBdC5hZGRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLnJlcXVpcmVkXSk7XG4gICAgICB0cmFpbEVuZGVkQXQudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0cmFpbFN0YXJ0ZWRBdC5yZXNldCgpO1xuICAgICAgdHJhaWxTdGFydGVkQXQuY2xlYXJWYWxpZGF0b3JzKCk7XG4gICAgICB0cmFpbFN0YXJ0ZWRBdC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICB0cmFpbEVuZGVkQXQucmVzZXQoKTtcbiAgICAgIHRyYWlsRW5kZWRBdC5jbGVhclZhbGlkYXRvcnMoKTtcbiAgICAgIHRyYWlsRW5kZWRBdC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG5cbiAgICAgIHN0YXJ0ZWRBdC5hZGRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLnJlcXVpcmVkXSk7XG4gICAgICBzdGFydGVkQXQudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgIH1cblxuICB9XG5cbn1cbiIsIjxidXR0b24gKm5nSWY9XCIhaXNVcGRhdGVcIiBtYXRUb29sdGlwPVwiQWRkIFN1YnNjcmlwdGlvblwiIHR5cGU9XCJidXR0b25cIiBtYXQtaWNvbi1idXR0b25cbiAgICAoY2xpY2spPVwiZm9ybURpYWxvZyhmb3JtVGVtcGxhdGUpXCI+XG4gICAgPG1hdC1pY29uPmFkZDwvbWF0LWljb24+XG48L2J1dHRvbj5cbjxidXR0b24gKm5nSWY9XCJpc1VwZGF0ZVwiIG1hdFRvb2x0aXA9XCJFZGl0IFN1YnNjcmlwdGlvblwiIHR5cGU9XCJidXR0b25cIiBtYXQtaWNvbi1idXR0b25cbiAgICAoY2xpY2spPVwiZm9ybURpYWxvZyhmb3JtVGVtcGxhdGUpXCI+XG4gICAgPG1hdC1pY29uPmVkaXQ8L21hdC1pY29uPlxuPC9idXR0b24+XG5cblxuPG5nLXRlbXBsYXRlICNmb3JtVGVtcGxhdGU+XG4gICAgPG1hdC1wcm9ncmVzcy1iYXIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIiAqbmdJZj1cImlzV29ya2luZ1wiPjwvbWF0LXByb2dyZXNzLWJhcj5cbiAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIiAobmdTdWJtaXQpPVwic3VibWl0KClcIj5cbiAgICAgICAgPGRpdiBmeExheW91dD1cImNvbHVtblwiIGNsYXNzPVwibWF0LXR5cG9ncmFwaHlcIj5cbiAgICAgICAgICAgIDxkaXYgbWF0LWRpYWxvZy10aXRsZSBjbGFzcz1cInRleHQtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdj57e3N1YnNjcmlwdGlvblBhY2thZ2U/J1BhY2thZ2UnOidUZW5hbnQnfX0gU3Vic2NyaXB0aW9uIEZvcm08L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IG1hdC1kaWFsb2ctY29udGVudCBmeExheW91dD1cInJvdyB3cmFwXCIgZnhMYXlvdXRHYXA9XCIwLjVyZW1cIj5cblxuICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGZ4RmxleD1cIjAgMSBjYWxjKDUwJS0wLjVyZW0pXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+VGVuYW50PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxhcHAtc2VhcmNoYWJsZS1zZWxlY3RvciBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGZvcm1Db250cm9sTmFtZT1cInRlbmFudF9pZFwiIHRpdGxlRmllbGQ9XCJuYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwaVVybD1cImFwaS9jbGllbnRzXCIgc29ydEJ5PVwibmFtZXxBU0NcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkVmFsdWVdPVwic2VsZWN0ZWRUZW5hbnRcIj48L2FwcC1zZWFyY2hhYmxlLXNlbGVjdG9yPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiaXNGaWVsZFZhbGlkKCd0ZW5hbnRfaWQnKVwiPnt7Z2V0RXJyb3JNZXNzYWdlKCd0ZW5hbnRfaWQnKX19XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBmeEZsZXg9XCIwIDEgY2FsYyg1MCUtMC41cmVtKVwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlBhY2thZ2U8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGFwcC1zZWFyY2hhYmxlLXNlbGVjdG9yIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgZm9ybUNvbnRyb2xOYW1lPVwicGFja2FnZV9pZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhcGlVcmw9XCJhcGkvc3Vic2NyaXB0aW9uLXBhY2thZ2VzXCIgc29ydEJ5PVwidGl0bGV8QVNDXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZFZhbHVlXT1cInNlbGVjdGVkUGFja2FnZVwiPjwvYXBwLXNlYXJjaGFibGUtc2VsZWN0b3I+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJpc0ZpZWxkVmFsaWQoJ3BhY2thZ2VfaWQnKVwiPnt7Z2V0RXJyb3JNZXNzYWdlKCdwYWNrYWdlX2lkJyl9fVxuICAgICAgICAgICAgICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG5cbiAgICAgICAgICAgICAgICA8ZGl2IGZ4TGF5b3V0QWxpZ249XCJzdGFydCBjZW50ZXJcIiBmeEZsZXg9XCIxMDBcIiBjbGFzcz1cIm1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlLWdyb3VwIFtoaWRlU2luZ2xlU2VsZWN0aW9uSW5kaWNhdG9yXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2hpZGVNdWx0aXBsZVNlbGVjdGlvbkluZGljYXRvcl09XCJ0cnVlXCIgZm9ybUNvbnRyb2xOYW1lPVwiaXNfdHJhaWxcIiAoY2hhbmdlKT1cInZhbGlkYXRlRGF0ZXMoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIFt2YWx1ZV09XCJ0cnVlXCI+VHJhaWw8L21hdC1idXR0b24tdG9nZ2xlPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIFt2YWx1ZV09XCJmYWxzZVwiPlBhaWQ8L21hdC1idXR0b24tdG9nZ2xlPlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1idXR0b24tdG9nZ2xlLWdyb3VwPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFmb3JtLmdldCgnaXNfdHJhaWwnKS52YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgZnhGbGV4PVwiMCAxIGNhbGMoNTAlLTAuNXJlbSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBbbWF0RGF0ZXBpY2tlcl09XCJzdGFydGVkX2F0XCIgZm9ybUNvbnRyb2xOYW1lPVwic3RhcnRlZF9hdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTdGFydGVkIEF0XCIgW3JlcXVpcmVkXT1cIiFmb3JtLmdldCgnaXNfdHJhaWwnKS52YWx1ZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWRhdGVwaWNrZXItdG9nZ2xlIG1hdFN1ZmZpeCBbZm9yXT1cInN0YXJ0ZWRfYXRcIj48L21hdC1kYXRlcGlja2VyLXRvZ2dsZT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZGF0ZXBpY2tlciAjc3RhcnRlZF9hdD48L21hdC1kYXRlcGlja2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImlzRmllbGRWYWxpZCgnc3RhcnRlZF9hdCcpXCI+e3tnZXRFcnJvck1lc3NhZ2UoJ3N0YXJ0ZWRfYXQnKX19PC9tYXQtZXJyb3I+XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGZ4RmxleD1cIjAgMSBjYWxjKDUwJS0wLjVyZW0pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgW21hdERhdGVwaWNrZXJdPVwiZW5kZWRfYXRcIiBmb3JtQ29udHJvbE5hbWU9XCJlbmRlZF9hdFwiIHBsYWNlaG9sZGVyPVwiRW5kZWQgQXRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1kYXRlcGlja2VyLXRvZ2dsZSBtYXRTdWZmaXggW2Zvcl09XCJlbmRlZF9hdFwiPjwvbWF0LWRhdGVwaWNrZXItdG9nZ2xlPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1kYXRlcGlja2VyICNlbmRlZF9hdD48L21hdC1kYXRlcGlja2VyPlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZvcm0uZ2V0KCdpc190cmFpbCcpLnZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBmeEZsZXg9XCIwIDEgY2FsYyg1MCUtMC41cmVtKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IFttYXREYXRlcGlja2VyXT1cInRyYWlsX3N0YXJ0ZWRfYXRcIiBmb3JtQ29udHJvbE5hbWU9XCJ0cmFpbF9zdGFydGVkX2F0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlRyYWlsIFN0YXJ0ZWQgQXRcIiBbcmVxdWlyZWRdPVwiZm9ybS5nZXQoJ2lzX3RyYWlsJykudmFsdWVcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1kYXRlcGlja2VyLXRvZ2dsZSBtYXRTdWZmaXggW2Zvcl09XCJ0cmFpbF9zdGFydGVkX2F0XCI+PC9tYXQtZGF0ZXBpY2tlci10b2dnbGU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWRhdGVwaWNrZXIgI3RyYWlsX3N0YXJ0ZWRfYXQ+PC9tYXQtZGF0ZXBpY2tlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImlzRmllbGRWYWxpZCgndHJhaWxfc3RhcnRlZF9hdCcpXCI+e3tnZXRFcnJvck1lc3NhZ2UoJ3RyYWlsX3N0YXJ0ZWRfYXQnKX19PC9tYXQtZXJyb3I+XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGZ4RmxleD1cIjAgMSBjYWxjKDUwJS0wLjVyZW0pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgW21hdERhdGVwaWNrZXJdPVwidHJhaWxfZW5kZWRfYXRcIiBmb3JtQ29udHJvbE5hbWU9XCJ0cmFpbF9lbmRlZF9hdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJUcmFpbCBFbmRlZCBBdFwiIFtyZXF1aXJlZF09XCJmb3JtLmdldCgnaXNfdHJhaWwnKS52YWx1ZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWRhdGVwaWNrZXItdG9nZ2xlIG1hdFN1ZmZpeCBbZm9yXT1cInRyYWlsX2VuZGVkX2F0XCI+PC9tYXQtZGF0ZXBpY2tlci10b2dnbGU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWRhdGVwaWNrZXIgI3RyYWlsX2VuZGVkX2F0PjwvbWF0LWRhdGVwaWNrZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpc0ZpZWxkVmFsaWQoJ3RyYWlsX2VuZGVkX2F0JylcIj57e2dldEVycm9yTWVzc2FnZSgndHJhaWxfZW5kZWRfYXQnKX19PC9tYXQtZXJyb3I+XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBmeEZsZXg9XCIwIDEgY2FsYyg1MCUtMC41cmVtKVwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPkNvc3QvVW5pdDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cImNvc3RfcGVyX3VuaXRcIiBwbGFjZWhvbGRlcj1cIkNvc3QvVW5pdFwiIC8+XG4gICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGZ4RmxleD1cIjAgMSBjYWxjKDUwJS0wLjVyZW0pXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+VW5pdHM8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJ1bml0c1wiIHBsYWNlaG9sZGVyPVwiVW5pdHNcIiAvPlxuICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGZ4TGF5b3V0QWxpZ249XCJzdGFydCBjZW50ZXJcIiBmeEZsZXg9XCIxMDBcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1zbGlkZS10b2dnbGUgY2xhc3M9XCJzd2l0Y2hcIiBmb3JtQ29udHJvbE5hbWU9XCJpc191bml0X2xpbWl0YXRpb25fZW5mb3JjZWRcIj5Jc1xuICAgICAgICAgICAgICAgICAgICAgICAgVW5pdCBFbmZvcmNlZFxuICAgICAgICAgICAgICAgICAgICA8L21hdC1zbGlkZS10b2dnbGU+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXktMlwiIGZ4TGF5b3V0PVwicm93XCIgZnhMYXlvdXRHYXA9XCIzMHB4XCIgZnhMYXlvdXRBbGlnbj1cImVuZFwiIGZ4RmxleD1cIjEwMCVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBmeEZsZXggbWF0LXJhaXNlZC1idXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdERpYWxvZ0Nsb3NlIGNsYXNzPVwid2hpdGUtYmctYnV0dG9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBDYW5jZWxcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gZnhGbGV4IG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIHR5cGU9XCJzdWJtaXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIFNhdmVcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9mb3JtPlxuPC9uZy10ZW1wbGF0ZT4iXX0=
@@ -0,0 +1,42 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { SubscriptionFormRoutingModule } from './subscription-form-routing.module';
4
+ import { SubscriptionFormComponent } from './subscription-form.component';
5
+ import { MaterialModule } from '../../material.module';
6
+ import { SearchableSelectorModule } from '../../searchable-selector/searchable-selector.module';
7
+ import { ReactiveFormsModule } from '@angular/forms';
8
+ import { FlexLayoutModule } from '@angular/flex-layout';
9
+ import * as i0 from "@angular/core";
10
+ export class SubscriptionFormModule {
11
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SubscriptionFormModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
12
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: SubscriptionFormModule, declarations: [SubscriptionFormComponent], imports: [CommonModule,
13
+ SubscriptionFormRoutingModule,
14
+ MaterialModule,
15
+ SearchableSelectorModule,
16
+ ReactiveFormsModule,
17
+ FlexLayoutModule], exports: [SubscriptionFormComponent] }); }
18
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SubscriptionFormModule, imports: [CommonModule,
19
+ SubscriptionFormRoutingModule,
20
+ MaterialModule,
21
+ SearchableSelectorModule,
22
+ ReactiveFormsModule,
23
+ FlexLayoutModule] }); }
24
+ }
25
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SubscriptionFormModule, decorators: [{
26
+ type: NgModule,
27
+ args: [{
28
+ declarations: [
29
+ SubscriptionFormComponent
30
+ ],
31
+ imports: [
32
+ CommonModule,
33
+ SubscriptionFormRoutingModule,
34
+ MaterialModule,
35
+ SearchableSelectorModule,
36
+ ReactiveFormsModule,
37
+ FlexLayoutModule
38
+ ],
39
+ exports: [SubscriptionFormComponent]
40
+ }]
41
+ }] });
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Vic2NyaXB0aW9uLWZvcm0ubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXRlY2hsaWZ5LWNvcmUvc3JjL2xpYi9zdWJzY3JpcHRpb24vc3Vic2NyaXB0aW9uLWZvcm0vc3Vic2NyaXB0aW9uLWZvcm0ubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRS9DLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ25GLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUNoRyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7QUFnQnhELE1BQU0sT0FBTyxzQkFBc0I7K0dBQXRCLHNCQUFzQjtnSEFBdEIsc0JBQXNCLGlCQVovQix5QkFBeUIsYUFHekIsWUFBWTtZQUNaLDZCQUE2QjtZQUM3QixjQUFjO1lBQ2Qsd0JBQXdCO1lBQ3hCLG1CQUFtQjtZQUNuQixnQkFBZ0IsYUFFUix5QkFBeUI7Z0hBRXhCLHNCQUFzQixZQVQvQixZQUFZO1lBQ1osNkJBQTZCO1lBQzdCLGNBQWM7WUFDZCx3QkFBd0I7WUFDeEIsbUJBQW1CO1lBQ25CLGdCQUFnQjs7NEZBSVAsc0JBQXNCO2tCQWRsQyxRQUFRO21CQUFDO29CQUNSLFlBQVksRUFBRTt3QkFDWix5QkFBeUI7cUJBQzFCO29CQUNELE9BQU8sRUFBRTt3QkFDUCxZQUFZO3dCQUNaLDZCQUE2Qjt3QkFDN0IsY0FBYzt3QkFDZCx3QkFBd0I7d0JBQ3hCLG1CQUFtQjt3QkFDbkIsZ0JBQWdCO3FCQUNqQjtvQkFDRCxPQUFPLEVBQUUsQ0FBQyx5QkFBeUIsQ0FBQztpQkFDckMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uRm9ybVJvdXRpbmdNb2R1bGUgfSBmcm9tICcuL3N1YnNjcmlwdGlvbi1mb3JtLXJvdXRpbmcubW9kdWxlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbkZvcm1Db21wb25lbnQgfSBmcm9tICcuL3N1YnNjcmlwdGlvbi1mb3JtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBNYXRlcmlhbE1vZHVsZSB9IGZyb20gJy4uLy4uL21hdGVyaWFsLm1vZHVsZSc7XG5pbXBvcnQgeyBTZWFyY2hhYmxlU2VsZWN0b3JNb2R1bGUgfSBmcm9tICcuLi8uLi9zZWFyY2hhYmxlLXNlbGVjdG9yL3NlYXJjaGFibGUtc2VsZWN0b3IubW9kdWxlJztcbmltcG9ydCB7IFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBGbGV4TGF5b3V0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZmxleC1sYXlvdXQnO1xuXG5ATmdNb2R1bGUoe1xuICBkZWNsYXJhdGlvbnM6IFtcbiAgICBTdWJzY3JpcHRpb25Gb3JtQ29tcG9uZW50XG4gIF0sXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgU3Vic2NyaXB0aW9uRm9ybVJvdXRpbmdNb2R1bGUsXG4gICAgTWF0ZXJpYWxNb2R1bGUsXG4gICAgU2VhcmNoYWJsZVNlbGVjdG9yTW9kdWxlLFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgRmxleExheW91dE1vZHVsZVxuICBdLFxuICBleHBvcnRzOiBbU3Vic2NyaXB0aW9uRm9ybUNvbXBvbmVudF1cbn0pXG5leHBvcnQgY2xhc3MgU3Vic2NyaXB0aW9uRm9ybU1vZHVsZSB7IH1cbiJdfQ==
@@ -0,0 +1,26 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { RouterModule } from '@angular/router';
3
+ import { SubscriptionListingComponent } from './subscription-listing.component';
4
+ import { AuthenticationGuard } from '../../core/authentication.guard';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/router";
7
+ const routes = [
8
+ {
9
+ path: '**',
10
+ component: SubscriptionListingComponent,
11
+ canActivate: [AuthenticationGuard],
12
+ },
13
+ ];
14
+ export class SubscriptionListingRoutingModule {
15
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SubscriptionListingRoutingModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
16
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: SubscriptionListingRoutingModule, imports: [i1.RouterModule], exports: [RouterModule] }); }
17
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SubscriptionListingRoutingModule, imports: [RouterModule.forChild(routes), RouterModule] }); }
18
+ }
19
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SubscriptionListingRoutingModule, decorators: [{
20
+ type: NgModule,
21
+ args: [{
22
+ imports: [RouterModule.forChild(routes)],
23
+ exports: [RouterModule]
24
+ }]
25
+ }] });
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Vic2NyaXB0aW9uLWxpc3Rpbmctcm91dGluZy5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdGVjaGxpZnktY29yZS9zcmMvbGliL3N1YnNjcmlwdGlvbi9zdWJzY3JpcHRpb24tbGlzdGluZy9zdWJzY3JpcHRpb24tbGlzdGluZy1yb3V0aW5nLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxZQUFZLEVBQVUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNoRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQzs7O0FBRXRFLE1BQU0sTUFBTSxHQUFXO0lBQ3JCO1FBQ0UsSUFBSSxFQUFFLElBQUk7UUFDVixTQUFTLEVBQUUsNEJBQTRCO1FBQ3ZDLFdBQVcsRUFBRSxDQUFDLG1CQUFtQixDQUFDO0tBQ25DO0NBQ0YsQ0FBQztBQU1GLE1BQU0sT0FBTyxnQ0FBZ0M7K0dBQWhDLGdDQUFnQztnSEFBaEMsZ0NBQWdDLHdDQUZqQyxZQUFZO2dIQUVYLGdDQUFnQyxZQUhqQyxZQUFZLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUM3QixZQUFZOzs0RkFFWCxnQ0FBZ0M7a0JBSjVDLFFBQVE7bUJBQUM7b0JBQ1IsT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDeEMsT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDO2lCQUN4QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSb3V0ZXJNb2R1bGUsIFJvdXRlcyB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb25MaXN0aW5nQ29tcG9uZW50IH0gZnJvbSAnLi9zdWJzY3JpcHRpb24tbGlzdGluZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgQXV0aGVudGljYXRpb25HdWFyZCB9IGZyb20gJy4uLy4uL2NvcmUvYXV0aGVudGljYXRpb24uZ3VhcmQnO1xuXG5jb25zdCByb3V0ZXM6IFJvdXRlcyA9IFtcbiAge1xuICAgIHBhdGg6ICcqKicsXG4gICAgY29tcG9uZW50OiBTdWJzY3JpcHRpb25MaXN0aW5nQ29tcG9uZW50LFxuICAgIGNhbkFjdGl2YXRlOiBbQXV0aGVudGljYXRpb25HdWFyZF0sXG4gIH0sXG5dO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbUm91dGVyTW9kdWxlLmZvckNoaWxkKHJvdXRlcyldLFxuICBleHBvcnRzOiBbUm91dGVyTW9kdWxlXVxufSlcbmV4cG9ydCBjbGFzcyBTdWJzY3JpcHRpb25MaXN0aW5nUm91dGluZ01vZHVsZSB7IH1cbiJdfQ==
@@ -0,0 +1,136 @@
1
+ import { __decorate } from "tslib";
2
+ import { Component, Input } from '@angular/core';
3
+ import { debounceTime, finalize } from 'rxjs';
4
+ import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';
5
+ import { SubscriptionStatus } from '../subscription-status.enum';
6
+ import { TechlifyListingControllerInterface } from '../../base-model/techlify-listing-component.class';
7
+ import { ActionPopupComponent } from '../../action-popup';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "../subscription.service";
10
+ import * as i2 from "@angular/forms";
11
+ import * as i3 from "@angular/material/dialog";
12
+ import * as i4 from "../../core/filter.service";
13
+ import * as i5 from "@angular/router";
14
+ import * as i6 from "@angular/common";
15
+ import * as i7 from "@angular/material/button";
16
+ import * as i8 from "@angular/material/icon";
17
+ import * as i9 from "@angular/material/sort";
18
+ import * as i10 from "@angular/material/table";
19
+ import * as i11 from "@angular/material/card";
20
+ import * as i12 from "@angular/material/tooltip";
21
+ import * as i13 from "@angular/material/progress-bar";
22
+ import * as i14 from "../subscription-form/subscription-form.component";
23
+ import * as i15 from "@angular/flex-layout/flex";
24
+ import * as i16 from "ngx-infinite-scroll";
25
+ let SubscriptionListingComponent = class SubscriptionListingComponent extends TechlifyListingControllerInterface {
26
+ constructor(subscriptionService, fb, dialog, filterService, activatedRoute) {
27
+ super();
28
+ this.subscriptionService = subscriptionService;
29
+ this.fb = fb;
30
+ this.dialog = dialog;
31
+ this.filterService = filterService;
32
+ this.activatedRoute = activatedRoute;
33
+ this.subscriptionStatus = SubscriptionStatus;
34
+ this.displayedColumns = [
35
+ 'index',
36
+ 'tenant',
37
+ 'package',
38
+ 'period',
39
+ 'cost_per_unit',
40
+ 'units',
41
+ 'is_unit_limitation_enforced',
42
+ 'total',
43
+ 'is_trail',
44
+ 'status',
45
+ 'actions',
46
+ ];
47
+ }
48
+ ngOnInit() {
49
+ if (this.subscriptionPackage) {
50
+ this.displayedColumns = this.displayedColumns.filter((col) => col !== 'package');
51
+ }
52
+ this.filterFormGroup = this.fb.group({
53
+ search: [''],
54
+ sort_by: [''],
55
+ package_ids: [],
56
+ date_from: [''],
57
+ date_to: [''],
58
+ status_ids: ['']
59
+ });
60
+ this.patchFilters();
61
+ this.loadData();
62
+ this.listenForChanges();
63
+ }
64
+ listenForChanges() {
65
+ this.filterFormGroup.valueChanges
66
+ .pipe(debounceTime(500), untilDestroyed(this))
67
+ .subscribe((_) => {
68
+ this.filterService.applyFilterToRoute(this.activatedRoute, this.filterFormGroup.value);
69
+ this.reload();
70
+ });
71
+ }
72
+ patchFilters() {
73
+ let routeFilters = this.filterService.getFiltersFromRoute(this.activatedRoute, this.filterFormGroup.value);
74
+ routeFilters = {
75
+ ...routeFilters,
76
+ package_ids: routeFilters?.package_ids ? routeFilters.package_ids.split(',').map(Number) : '',
77
+ status_ids: routeFilters?.status_ids ? routeFilters.status_ids.split(',').map(Number) : '',
78
+ };
79
+ this.filterFormGroup.setValue(routeFilters);
80
+ }
81
+ loadData() {
82
+ this.isWorking = true;
83
+ const filters = JSON.parse(JSON.stringify(this.filterFormGroup.value));
84
+ filters.page = this.page;
85
+ filters.perPage = this.perPage;
86
+ filters.package_ids = this.subscriptionPackage?.id ?? filters.package_ids.toString();
87
+ filters.status_ids = filters.status_ids.toString();
88
+ this.subscriptionService.index(filters)
89
+ .pipe(finalize(() => this.isWorking = false)).subscribe((res) => {
90
+ this.lastPage = res?.last_page || this.page;
91
+ if (res?.data.length > 0) {
92
+ this.models = this.models.concat(res.data);
93
+ }
94
+ });
95
+ }
96
+ sortColumn(event) {
97
+ const direction = event.direction.toString().toUpperCase();
98
+ this.models = [];
99
+ this.filterFormGroup.get('sort_by').setValue(`${event?.active}|${direction}`);
100
+ }
101
+ cancel(model) {
102
+ const dialogRef = this.dialog.open(ActionPopupComponent, {
103
+ width: "400px",
104
+ data: {
105
+ title: "Cancel Subscription",
106
+ message: `Cancelling this subscription means this tenant would no longer have access to the specified features, are you sure you want to continue?`
107
+ },
108
+ autoFocus: false
109
+ });
110
+ dialogRef.afterClosed().subscribe(async (result) => {
111
+ if (result) {
112
+ //Action confirmed
113
+ this.isWorking = true;
114
+ this.subscriptionService
115
+ .updateStatus(model.id, SubscriptionStatus.INACTIVE)
116
+ .pipe(finalize(() => this.isWorking = false)).subscribe((res) => {
117
+ model.status_id = res?.item?.status_id;
118
+ model.status = res?.item?.status;
119
+ });
120
+ }
121
+ });
122
+ }
123
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SubscriptionListingComponent, deps: [{ token: i1.SubscriptionService }, { token: i2.UntypedFormBuilder }, { token: i3.MatDialog }, { token: i4.FilterService }, { token: i5.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component }); }
124
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: SubscriptionListingComponent, selector: "app-subscription-listing", inputs: { subscriptionPackage: "subscriptionPackage" }, usesInheritance: true, ngImport: i0, template: "<div fxLayout=\"column\" class=\"mat-typography\" fxLayoutGap=\"1rem\">\n <mat-card appearance=\"outlined\" fxLayout fxLayoutGap=\"0.5rem\" fxLayoutAlign=\"start center\">\n <div fxLayout fxLayoutAlign=\"start center\">\n <h1 class=\"m-0\">{{subscriptionPackage?'Package':'Tenant'}} Subscriptions</h1>\n <app-subscription-form (success)=\"reload()\"\n [subscriptionPackage]=\"subscriptionPackage\"></app-subscription-form>\n </div>\n <div fxFlex>\n </div>\n </mat-card>\n <mat-card appearance=\"outlined\" class=\"p-0\">\n <table mat-table matSort [dataSource]=\"models\" class=\"w-100\" infiniteScroll [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"50\" (scrolled)=\"onScroll()\" (matSortChange)=\"sortColumn($event)\">\n\n <ng-container matColumnDef=\"index\">\n <th mat-header-cell *matHeaderCellDef> # </th>\n <td mat-cell *matCellDef=\"let tenantSubscription; let i = index\"> {{ i+1 }} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"tenant\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header disableClear> Tenant </th>\n <td mat-cell *matCellDef=\"let tenantSubscription\">\n <div>\n <div>{{tenantSubscription?.tenant?.name }}</div>\n <div><span>{{tenantSubscription?.tenant?.phone }}</span> <span> |\n {{tenantSubscription?.tenant?.email }}</span></div>\n </div>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"period\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header disableClear> Period </th>\n <td mat-cell *matCellDef=\"let tenantSubscription\">\n <span *ngIf=\"tenantSubscription?.started_at\">{{tenantSubscription?.started_at | date:'mediumDate' }}\n -> {{(tenantSubscription?.ended_at | date:'mediumDate') ?? 'NA' }}</span>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"package\">\n <th mat-header-cell *matHeaderCellDef> Package </th>\n <td mat-cell *matCellDef=\"let tenantSubscription\">\n <div>{{tenantSubscription?.package?.title }}</div>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"status\">\n <th mat-header-cell *matHeaderCellDef> Status </th>\n <td mat-cell *matCellDef=\"let tenantSubscription\">\n <div>{{tenantSubscription?.status?.title }}</div>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"cost_per_unit\">\n <th mat-header-cell *matHeaderCellDef> Cost/Units </th>\n <td mat-cell *matCellDef=\"let tenantSubscription\">\n <div>{{tenantSubscription?.cost_per_unit | currency:'USD':'symbol':'1.0-2' }}</div>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"units\">\n <th mat-header-cell *matHeaderCellDef> Units </th>\n <td mat-cell *matCellDef=\"let tenantSubscription\">\n <div>{{tenantSubscription?.units | number}}</div>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"is_unit_limitation_enforced\">\n <th mat-header-cell *matHeaderCellDef> Is Units Limited </th>\n <td mat-cell *matCellDef=\"let tenantSubscription\">\n <div>{{tenantSubscription?.is_unit_limitation_enforced ? 'Yes' : 'No' }}</div>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"total\">\n <th mat-header-cell *matHeaderCellDef> Total Cost </th>\n <td mat-cell *matCellDef=\"let tenantSubscription\">\n <div>{{tenantSubscription?.total | currency:'USD':'symbol':'1.0-2' }}</div>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"is_trail\">\n <th mat-header-cell *matHeaderCellDef> Is Trail</th>\n <td mat-cell *matCellDef=\"let tenantSubscription\">\n <div>\n <div>{{tenantSubscription?.is_trail ? 'Yes' : 'No' }}</div>\n <div *ngIf=\"tenantSubscription?.is_trail\"><span>{{tenantSubscription?.trail_started_at |\n date:'mediumDate' }} -> {{tenantSubscription?.trail_ended_at | date:'mediumDate'\n }}</span></div>\n </div>\n </td>\n </ng-container>\n\n\n <ng-container matColumnDef=\"actions\">\n <th mat-header-cell *matHeaderCellDef> Actions </th>\n <td mat-cell *matCellDef=\"let tenantSubscription\">\n <div class=\"text-secondary\" fxLayout>\n <div *ngIf=\"tenantSubscription?.creator_id\">\n <app-subscription-form *ngIf=\"tenantSubscription.status_id == subscriptionStatus.ACTIVE\"\n (success)=\"reload()\" [tenantSubscriptionInfo]=\"tenantSubscription\"\n [subscriptionPackage]=\"subscriptionPackage\"></app-subscription-form>\n <button *ngIf=\"tenantSubscription.status_id == subscriptionStatus.ACTIVE\"\n matTooltip=\"Cancel Subscription\" type=\"button\" mat-icon-button\n (click)=\"cancel(tenantSubscription)\">\n <mat-icon>cancel</mat-icon>\n </button>\n </div>\n </div>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n <mat-progress-bar mode=\"indeterminate\" *ngIf=\"isWorking\"></mat-progress-bar>\n </mat-card>\n</div>", styles: [".add-icon{position:relative;top:5px}.add-icon:hover{cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i7.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i9.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i9.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: i10.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i10.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i10.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i10.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i10.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i10.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i10.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i10.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i10.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i10.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i11.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i12.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i13.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: i14.SubscriptionFormComponent, selector: "app-subscription-form", inputs: ["isUpdate", "subscriptionPackage", "tenantSubscriptionInfo"], outputs: ["success"] }, { kind: "directive", type: i15.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i15.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { kind: "directive", type: i15.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i15.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "directive", type: i16.InfiniteScrollDirective, selector: "[infiniteScroll], [infinite-scroll], [data-infinite-scroll]", inputs: ["infiniteScrollDistance", "infiniteScrollUpDistance", "infiniteScrollThrottle", "infiniteScrollDisabled", "infiniteScrollContainer", "scrollWindow", "immediateCheck", "horizontal", "alwaysCallback", "fromRoot"], outputs: ["scrolled", "scrolledUp"] }, { kind: "pipe", type: i6.DecimalPipe, name: "number" }, { kind: "pipe", type: i6.CurrencyPipe, name: "currency" }, { kind: "pipe", type: i6.DatePipe, name: "date" }] }); }
125
+ };
126
+ SubscriptionListingComponent = __decorate([
127
+ UntilDestroy()
128
+ ], SubscriptionListingComponent);
129
+ export { SubscriptionListingComponent };
130
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SubscriptionListingComponent, decorators: [{
131
+ type: Component,
132
+ args: [{ selector: 'app-subscription-listing', template: "<div fxLayout=\"column\" class=\"mat-typography\" fxLayoutGap=\"1rem\">\n <mat-card appearance=\"outlined\" fxLayout fxLayoutGap=\"0.5rem\" fxLayoutAlign=\"start center\">\n <div fxLayout fxLayoutAlign=\"start center\">\n <h1 class=\"m-0\">{{subscriptionPackage?'Package':'Tenant'}} Subscriptions</h1>\n <app-subscription-form (success)=\"reload()\"\n [subscriptionPackage]=\"subscriptionPackage\"></app-subscription-form>\n </div>\n <div fxFlex>\n </div>\n </mat-card>\n <mat-card appearance=\"outlined\" class=\"p-0\">\n <table mat-table matSort [dataSource]=\"models\" class=\"w-100\" infiniteScroll [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"50\" (scrolled)=\"onScroll()\" (matSortChange)=\"sortColumn($event)\">\n\n <ng-container matColumnDef=\"index\">\n <th mat-header-cell *matHeaderCellDef> # </th>\n <td mat-cell *matCellDef=\"let tenantSubscription; let i = index\"> {{ i+1 }} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"tenant\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header disableClear> Tenant </th>\n <td mat-cell *matCellDef=\"let tenantSubscription\">\n <div>\n <div>{{tenantSubscription?.tenant?.name }}</div>\n <div><span>{{tenantSubscription?.tenant?.phone }}</span> <span> |\n {{tenantSubscription?.tenant?.email }}</span></div>\n </div>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"period\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header disableClear> Period </th>\n <td mat-cell *matCellDef=\"let tenantSubscription\">\n <span *ngIf=\"tenantSubscription?.started_at\">{{tenantSubscription?.started_at | date:'mediumDate' }}\n -> {{(tenantSubscription?.ended_at | date:'mediumDate') ?? 'NA' }}</span>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"package\">\n <th mat-header-cell *matHeaderCellDef> Package </th>\n <td mat-cell *matCellDef=\"let tenantSubscription\">\n <div>{{tenantSubscription?.package?.title }}</div>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"status\">\n <th mat-header-cell *matHeaderCellDef> Status </th>\n <td mat-cell *matCellDef=\"let tenantSubscription\">\n <div>{{tenantSubscription?.status?.title }}</div>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"cost_per_unit\">\n <th mat-header-cell *matHeaderCellDef> Cost/Units </th>\n <td mat-cell *matCellDef=\"let tenantSubscription\">\n <div>{{tenantSubscription?.cost_per_unit | currency:'USD':'symbol':'1.0-2' }}</div>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"units\">\n <th mat-header-cell *matHeaderCellDef> Units </th>\n <td mat-cell *matCellDef=\"let tenantSubscription\">\n <div>{{tenantSubscription?.units | number}}</div>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"is_unit_limitation_enforced\">\n <th mat-header-cell *matHeaderCellDef> Is Units Limited </th>\n <td mat-cell *matCellDef=\"let tenantSubscription\">\n <div>{{tenantSubscription?.is_unit_limitation_enforced ? 'Yes' : 'No' }}</div>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"total\">\n <th mat-header-cell *matHeaderCellDef> Total Cost </th>\n <td mat-cell *matCellDef=\"let tenantSubscription\">\n <div>{{tenantSubscription?.total | currency:'USD':'symbol':'1.0-2' }}</div>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"is_trail\">\n <th mat-header-cell *matHeaderCellDef> Is Trail</th>\n <td mat-cell *matCellDef=\"let tenantSubscription\">\n <div>\n <div>{{tenantSubscription?.is_trail ? 'Yes' : 'No' }}</div>\n <div *ngIf=\"tenantSubscription?.is_trail\"><span>{{tenantSubscription?.trail_started_at |\n date:'mediumDate' }} -> {{tenantSubscription?.trail_ended_at | date:'mediumDate'\n }}</span></div>\n </div>\n </td>\n </ng-container>\n\n\n <ng-container matColumnDef=\"actions\">\n <th mat-header-cell *matHeaderCellDef> Actions </th>\n <td mat-cell *matCellDef=\"let tenantSubscription\">\n <div class=\"text-secondary\" fxLayout>\n <div *ngIf=\"tenantSubscription?.creator_id\">\n <app-subscription-form *ngIf=\"tenantSubscription.status_id == subscriptionStatus.ACTIVE\"\n (success)=\"reload()\" [tenantSubscriptionInfo]=\"tenantSubscription\"\n [subscriptionPackage]=\"subscriptionPackage\"></app-subscription-form>\n <button *ngIf=\"tenantSubscription.status_id == subscriptionStatus.ACTIVE\"\n matTooltip=\"Cancel Subscription\" type=\"button\" mat-icon-button\n (click)=\"cancel(tenantSubscription)\">\n <mat-icon>cancel</mat-icon>\n </button>\n </div>\n </div>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n <mat-progress-bar mode=\"indeterminate\" *ngIf=\"isWorking\"></mat-progress-bar>\n </mat-card>\n</div>", styles: [".add-icon{position:relative;top:5px}.add-icon:hover{cursor:pointer}\n"] }]
133
+ }], ctorParameters: () => [{ type: i1.SubscriptionService }, { type: i2.UntypedFormBuilder }, { type: i3.MatDialog }, { type: i4.FilterService }, { type: i5.ActivatedRoute }], propDecorators: { subscriptionPackage: [{
134
+ type: Input
135
+ }] } });
136
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Vic2NyaXB0aW9uLWxpc3RpbmcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXRlY2hsaWZ5LWNvcmUvc3JjL2xpYi9zdWJzY3JpcHRpb24vc3Vic2NyaXB0aW9uLWxpc3Rpbmcvc3Vic2NyaXB0aW9uLWxpc3RpbmcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXRlY2hsaWZ5LWNvcmUvc3JjL2xpYi9zdWJzY3JpcHRpb24vc3Vic2NyaXB0aW9uLWxpc3Rpbmcvc3Vic2NyaXB0aW9uLWxpc3RpbmcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBR3pELE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFHckUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDakUsT0FBTyxFQUFFLGtDQUFrQyxFQUFFLE1BQU0sbURBQW1ELENBQUM7QUFFdkcsT0FBTyxFQUFlLG9CQUFvQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVFoRSxJQUFNLDRCQUE0QixHQUFsQyxNQUFNLDRCQUE2QixTQUFRLGtDQUFrQztJQXFCbEYsWUFDVSxtQkFBd0MsRUFDeEMsRUFBc0IsRUFDdEIsTUFBaUIsRUFDakIsYUFBNEIsRUFDNUIsY0FBOEI7UUFFdEMsS0FBSyxFQUFFLENBQUM7UUFOQSx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBQ3hDLE9BQUUsR0FBRixFQUFFLENBQW9CO1FBQ3RCLFdBQU0sR0FBTixNQUFNLENBQVc7UUFDakIsa0JBQWEsR0FBYixh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O2dCQUM1QixPQUFPLEVBQUUsMElBQTBJO2FBQ3BKO1lBQ0QsU0FBUyxFQUFFLEtBQUs7U0FDakIsQ0FBQyxDQUFDO1FBRUgsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUMsTUFBTSxFQUFDLEVBQUU7WUFDL0MsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDWCxrQkFBa0I7Z0JBQ2xCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO2dCQUN0QixJQUFJLENBQUMsbUJBQW1CO3FCQUNyQixZQUFZLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxrQkFBa0IsQ0FBQyxRQUFRLENBQUM7cUJBQ25ELElBQUksQ0FDSCxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsQ0FDdkMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtvQkFDdkIsS0FBSyxDQUFDLFNBQVMsR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQztvQkFDdkMsS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQztnQkFDbkMsQ0FBQyxDQUFDLENBQUM7WUFDUCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOytHQTFIVSw0QkFBNEI7bUdBQTVCLDRCQUE0QiwrSUNsQnpDLGlwTUFvSE07O0FEbEdPLDRCQUE0QjtJQU54QyxZQUFZLEVBQUU7R0FNRiw0QkFBNEIsQ0E0SHhDOzs0RkE1SFksNEJBQTRCO2tCQUx4QyxTQUFTOytCQUNFLDBCQUEwQjswTUFNM0IsbUJBQW1CO3NCQUEzQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBVbnR5cGVkRm9ybUJ1aWxkZXIsIFVudHlwZWRGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBmaW5hbGl6ZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVW50aWxEZXN0cm95LCB1bnRpbERlc3Ryb3llZCB9IGZyb20gJ0BuZ25lYXQvdW50aWwtZGVzdHJveSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vc3Vic2NyaXB0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uU3RhdHVzIH0gZnJvbSAnLi4vc3Vic2NyaXB0aW9uLXN0YXR1cy5lbnVtJztcbmltcG9ydCB7IFRlY2hsaWZ5TGlzdGluZ0NvbnRyb2xsZXJJbnRlcmZhY2UgfSBmcm9tICcuLi8uLi9iYXNlLW1vZGVsL3RlY2hsaWZ5LWxpc3RpbmctY29tcG9uZW50LmNsYXNzJztcbmltcG9ydCB7IEZpbHRlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL2ZpbHRlci5zZXJ2aWNlJztcbmltcG9ydCB7IEFjdGlvblBvcHVwLCBBY3Rpb25Qb3B1cENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2FjdGlvbi1wb3B1cCc7XG5cbkBVbnRpbERlc3Ryb3koKVxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXN1YnNjcmlwdGlvbi1saXN0aW5nJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3N1YnNjcmlwdGlvbi1saXN0aW5nLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc3Vic2NyaXB0aW9uLWxpc3RpbmcuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBTdWJzY3JpcHRpb25MaXN0aW5nQ29tcG9uZW50IGV4dGVuZHMgVGVjaGxpZnlMaXN0aW5nQ29udHJvbGxlckludGVyZmFjZSBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgQElucHV0KCkgc3Vic2NyaXB0aW9uUGFja2FnZTogYW55O1xuXG4gIHN1YnNjcmlwdGlvblN0YXR1cyA9IFN1YnNjcmlwdGlvblN0YXR1cztcblxuICBmaWx0ZXJGb3JtR3JvdXA6IFVudHlwZWRGb3JtR3JvdXA7XG4gIGRpc3BsYXllZENvbHVtbnM6IHN0cmluZ1tdID0gW1xuICAgICdpbmRleCcsXG4gICAgJ3RlbmFudCcsXG4gICAgJ3BhY2thZ2UnLFxuICAgICdwZXJpb2QnLFxuICAgICdjb3N0X3Blcl91bml0JyxcbiAgICAndW5pdHMnLFxuICAgICdpc191bml0X2xpbWl0YXRpb25fZW5mb3JjZWQnLFxuICAgICd0b3RhbCcsXG4gICAgJ2lzX3RyYWlsJyxcbiAgICAnc3RhdHVzJyxcbiAgICAnYWN0aW9ucycsXG4gIF07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBzdWJzY3JpcHRpb25TZXJ2aWNlOiBTdWJzY3JpcHRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgZmI6IFVudHlwZWRGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIGRpYWxvZzogTWF0RGlhbG9nLFxuICAgIHByaXZhdGUgZmlsdGVyU2VydmljZTogRmlsdGVyU2VydmljZSxcbiAgICBwcml2YXRlIGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uUGFja2FnZSkge1xuICAgICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zID0gdGhpcy5kaXNwbGF5ZWRDb2x1bW5zLmZpbHRlcigoY29sOiBhbnkpID0+IGNvbCAhPT0gJ3BhY2thZ2UnKTtcbiAgICB9XG4gICAgdGhpcy5maWx0ZXJGb3JtR3JvdXAgPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIHNlYXJjaDogWycnXSxcbiAgICAgIHNvcnRfYnk6IFsnJ10sXG4gICAgICBwYWNrYWdlX2lkczogW10sXG4gICAgICBkYXRlX2Zyb206IFsnJ10sXG4gICAgICBkYXRlX3RvOiBbJyddLFxuICAgICAgc3RhdHVzX2lkczogWycnXVxuICAgIH0pO1xuICAgIHRoaXMucGF0Y2hGaWx0ZXJzKCk7XG4gICAgdGhpcy5sb2FkRGF0YSgpO1xuICAgIHRoaXMubGlzdGVuRm9yQ2hhbmdlcygpO1xuICB9XG5cbiAgbGlzdGVuRm9yQ2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLmZpbHRlckZvcm1Hcm91cC52YWx1ZUNoYW5nZXNcbiAgICAgIC5waXBlKGRlYm91bmNlVGltZSg1MDApLCB1bnRpbERlc3Ryb3llZCh0aGlzKSlcbiAgICAgIC5zdWJzY3JpYmUoKF8pID0+IHtcbiAgICAgICAgdGhpcy5maWx0ZXJTZXJ2aWNlLmFwcGx5RmlsdGVyVG9Sb3V0ZShcbiAgICAgICAgICB0aGlzLmFjdGl2YXRlZFJvdXRlLFxuICAgICAgICAgIHRoaXMuZmlsdGVyRm9ybUdyb3VwLnZhbHVlXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMucmVsb2FkKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHBhdGNoRmlsdGVycygpIHtcbiAgICBsZXQgcm91dGVGaWx0ZXJzID0gdGhpcy5maWx0ZXJTZXJ2aWNlLmdldEZpbHRlcnNGcm9tUm91dGUoXG4gICAgICB0aGlzLmFjdGl2YXRlZFJvdXRlLFxuICAgICAgdGhpcy5maWx0ZXJGb3JtR3JvdXAudmFsdWVcbiAgICApO1xuICAgIHJvdXRlRmlsdGVycyA9IHtcbiAgICAgIC4uLnJvdXRlRmlsdGVycyxcbiAgICAgIHBhY2thZ2VfaWRzOiByb3V0ZUZpbHRlcnM/LnBhY2thZ2VfaWRzID8gcm91dGVGaWx0ZXJzLnBhY2thZ2VfaWRzLnNwbGl0KCcsJykubWFwKE51bWJlcikgOiAnJyxcbiAgICAgIHN0YXR1c19pZHM6IHJvdXRlRmlsdGVycz8uc3RhdHVzX2lkcyA/IHJvdXRlRmlsdGVycy5zdGF0dXNfaWRzLnNwbGl0KCcsJykubWFwKE51bWJlcikgOiAnJyxcbiAgICB9XG4gICAgdGhpcy5maWx0ZXJGb3JtR3JvdXAuc2V0VmFsdWUocm91dGVGaWx0ZXJzKTtcbiAgfVxuXG4gIGxvYWREYXRhKCk6IHZvaWQge1xuICAgIHRoaXMuaXNXb3JraW5nID0gdHJ1ZTtcbiAgICBjb25zdCBmaWx0ZXJzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmZpbHRlckZvcm1Hcm91cC52YWx1ZSkpO1xuICAgIGZpbHRlcnMucGFnZSA9IHRoaXMucGFnZTtcbiAgICBmaWx0ZXJzLnBlclBhZ2UgPSB0aGlzLnBlclBhZ2U7XG4gICAgZmlsdGVycy5wYWNrYWdlX2lkcyA9IHRoaXMuc3Vic2NyaXB0aW9uUGFja2FnZT8uaWQgPz8gZmlsdGVycy5wYWNrYWdlX2lkcy50b1N0cmluZygpO1xuICAgIGZpbHRlcnMuc3RhdHVzX2lkcyA9IGZpbHRlcnMuc3RhdHVzX2lkcy50b1N0cmluZygpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uU2VydmljZS5pbmRleChmaWx0ZXJzKVxuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbmFsaXplKCgpID0+IHRoaXMuaXNXb3JraW5nID0gZmFsc2UpXG4gICAgICApLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5sYXN0UGFnZSA9IHJlcz8ubGFzdF9wYWdlIHx8IHRoaXMucGFnZTtcbiAgICAgICAgaWYgKHJlcz8uZGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5tb2RlbHMgPSB0aGlzLm1vZGVscy5jb25jYXQocmVzLmRhdGEpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHNvcnRDb2x1bW4oZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IGRpcmVjdGlvbiA9IGV2ZW50LmRpcmVjdGlvbi50b1N0cmluZygpLnRvVXBwZXJDYXNlKCk7XG4gICAgdGhpcy5tb2RlbHMgPSBbXTtcbiAgICB0aGlzLmZpbHRlckZvcm1Hcm91cC5nZXQoJ3NvcnRfYnknKS5zZXRWYWx1ZShgJHtldmVudD8uYWN0aXZlfXwke2RpcmVjdGlvbn1gKTtcbiAgfVxuXG4gIGNhbmNlbChtb2RlbDogYW55KTogdm9pZCB7XG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihBY3Rpb25Qb3B1cENvbXBvbmVudCwge1xuICAgICAgd2lkdGg6IFwiNDAwcHhcIixcbiAgICAgIGRhdGE6IDxBY3Rpb25Qb3B1cD57XG4gICAgICAgIHRpdGxlOiBcIkNhbmNlbCBTdWJzY3JpcHRpb25cIixcbiAgICAgICAgbWVzc2FnZTogYENhbmNlbGxpbmcgdGhpcyBzdWJzY3JpcHRpb24gbWVhbnMgdGhpcyB0ZW5hbnQgd291bGQgbm8gbG9uZ2VyIGhhdmUgYWNjZXNzIHRvIHRoZSBzcGVjaWZpZWQgZmVhdHVyZXMsIGFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBjb250aW51ZT9gXG4gICAgICB9LFxuICAgICAgYXV0b0ZvY3VzOiBmYWxzZVxuICAgIH0pO1xuXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKGFzeW5jIHJlc3VsdCA9PiB7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIC8vQWN0aW9uIGNvbmZpcm1lZFxuICAgICAgICB0aGlzLmlzV29ya2luZyA9IHRydWU7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uU2VydmljZVxuICAgICAgICAgIC51cGRhdGVTdGF0dXMobW9kZWwuaWQsIFN1YnNjcmlwdGlvblN0YXR1cy5JTkFDVElWRSlcbiAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgIGZpbmFsaXplKCgpID0+IHRoaXMuaXNXb3JraW5nID0gZmFsc2UpXG4gICAgICAgICAgKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgICBtb2RlbC5zdGF0dXNfaWQgPSByZXM/Lml0ZW0/LnN0YXR1c19pZDtcbiAgICAgICAgICAgIG1vZGVsLnN0YXR1cyA9IHJlcz8uaXRlbT8uc3RhdHVzO1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbn1cbiIsIjxkaXYgZnhMYXlvdXQ9XCJjb2x1bW5cIiBjbGFzcz1cIm1hdC10eXBvZ3JhcGh5XCIgZnhMYXlvdXRHYXA9XCIxcmVtXCI+XG4gICAgPG1hdC1jYXJkIGFwcGVhcmFuY2U9XCJvdXRsaW5lZFwiIGZ4TGF5b3V0IGZ4TGF5b3V0R2FwPVwiMC41cmVtXCIgZnhMYXlvdXRBbGlnbj1cInN0YXJ0IGNlbnRlclwiPlxuICAgICAgICA8ZGl2IGZ4TGF5b3V0IGZ4TGF5b3V0QWxpZ249XCJzdGFydCBjZW50ZXJcIj5cbiAgICAgICAgICAgIDxoMSBjbGFzcz1cIm0tMFwiPnt7c3Vic2NyaXB0aW9uUGFja2FnZT8nUGFja2FnZSc6J1RlbmFudCd9fSBTdWJzY3JpcHRpb25zPC9oMT5cbiAgICAgICAgICAgIDxhcHAtc3Vic2NyaXB0aW9uLWZvcm0gKHN1Y2Nlc3MpPVwicmVsb2FkKClcIlxuICAgICAgICAgICAgICAgIFtzdWJzY3JpcHRpb25QYWNrYWdlXT1cInN1YnNjcmlwdGlvblBhY2thZ2VcIj48L2FwcC1zdWJzY3JpcHRpb24tZm9ybT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgZnhGbGV4PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L21hdC1jYXJkPlxuICAgIDxtYXQtY2FyZCBhcHBlYXJhbmNlPVwib3V0bGluZWRcIiBjbGFzcz1cInAtMFwiPlxuICAgICAgICA8dGFibGUgbWF0LXRhYmxlIG1hdFNvcnQgW2RhdGFTb3VyY2VdPVwibW9kZWxzXCIgY2xhc3M9XCJ3LTEwMFwiIGluZmluaXRlU2Nyb2xsIFtpbmZpbml0ZVNjcm9sbERpc3RhbmNlXT1cIjJcIlxuICAgICAgICAgICAgW2luZmluaXRlU2Nyb2xsVGhyb3R0bGVdPVwiNTBcIiAoc2Nyb2xsZWQpPVwib25TY3JvbGwoKVwiIChtYXRTb3J0Q2hhbmdlKT1cInNvcnRDb2x1bW4oJGV2ZW50KVwiPlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImluZGV4XCI+XG4gICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4gIyA8L3RoPlxuICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCB0ZW5hbnRTdWJzY3JpcHRpb247IGxldCBpID0gaW5kZXhcIj4ge3sgaSsxIH19IDwvdGQ+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJ0ZW5hbnRcIj5cbiAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIG1hdC1zb3J0LWhlYWRlciBkaXNhYmxlQ2xlYXI+IFRlbmFudCA8L3RoPlxuICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCB0ZW5hbnRTdWJzY3JpcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+e3t0ZW5hbnRTdWJzY3JpcHRpb24/LnRlbmFudD8ubmFtZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj48c3Bhbj57e3RlbmFudFN1YnNjcmlwdGlvbj8udGVuYW50Py5waG9uZSB9fTwvc3Bhbj4gPHNwYW4+IHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3t0ZW5hbnRTdWJzY3JpcHRpb24/LnRlbmFudD8uZW1haWwgfX08L3NwYW4+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJwZXJpb2RcIj5cbiAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIG1hdC1zb3J0LWhlYWRlciBkaXNhYmxlQ2xlYXI+IFBlcmlvZCA8L3RoPlxuICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCB0ZW5hbnRTdWJzY3JpcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJ0ZW5hbnRTdWJzY3JpcHRpb24/LnN0YXJ0ZWRfYXRcIj57e3RlbmFudFN1YnNjcmlwdGlvbj8uc3RhcnRlZF9hdCB8IGRhdGU6J21lZGl1bURhdGUnIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAtPiB7eyh0ZW5hbnRTdWJzY3JpcHRpb24/LmVuZGVkX2F0IHwgZGF0ZTonbWVkaXVtRGF0ZScpID8/ICdOQScgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInBhY2thZ2VcIj5cbiAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPiBQYWNrYWdlIDwvdGg+XG4gICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHRlbmFudFN1YnNjcmlwdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2Pnt7dGVuYW50U3Vic2NyaXB0aW9uPy5wYWNrYWdlPy50aXRsZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJzdGF0dXNcIj5cbiAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPiBTdGF0dXMgPC90aD5cbiAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgdGVuYW50U3Vic2NyaXB0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+e3t0ZW5hbnRTdWJzY3JpcHRpb24/LnN0YXR1cz8udGl0bGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiY29zdF9wZXJfdW5pdFwiPlxuICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+IENvc3QvVW5pdHMgPC90aD5cbiAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgdGVuYW50U3Vic2NyaXB0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+e3t0ZW5hbnRTdWJzY3JpcHRpb24/LmNvc3RfcGVyX3VuaXQgfCBjdXJyZW5jeTonVVNEJzonc3ltYm9sJzonMS4wLTInIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInVuaXRzXCI+XG4gICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4gVW5pdHMgPC90aD5cbiAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgdGVuYW50U3Vic2NyaXB0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+e3t0ZW5hbnRTdWJzY3JpcHRpb24/LnVuaXRzIHwgbnVtYmVyfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiaXNfdW5pdF9saW1pdGF0aW9uX2VuZm9yY2VkXCI+XG4gICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4gSXMgVW5pdHMgTGltaXRlZCA8L3RoPlxuICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCB0ZW5hbnRTdWJzY3JpcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj57e3RlbmFudFN1YnNjcmlwdGlvbj8uaXNfdW5pdF9saW1pdGF0aW9uX2VuZm9yY2VkID8gJ1llcycgOiAnTm8nIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInRvdGFsXCI+XG4gICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4gVG90YWwgQ29zdCA8L3RoPlxuICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCB0ZW5hbnRTdWJzY3JpcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj57e3RlbmFudFN1YnNjcmlwdGlvbj8udG90YWwgfCBjdXJyZW5jeTonVVNEJzonc3ltYm9sJzonMS4wLTInIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImlzX3RyYWlsXCI+XG4gICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4gSXMgVHJhaWw8L3RoPlxuICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCB0ZW5hbnRTdWJzY3JpcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+e3t0ZW5hbnRTdWJzY3JpcHRpb24/LmlzX3RyYWlsID8gJ1llcycgOiAnTm8nIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidGVuYW50U3Vic2NyaXB0aW9uPy5pc190cmFpbFwiPjxzcGFuPnt7dGVuYW50U3Vic2NyaXB0aW9uPy50cmFpbF9zdGFydGVkX2F0IHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZTonbWVkaXVtRGF0ZScgfX0gLT4ge3t0ZW5hbnRTdWJzY3JpcHRpb24/LnRyYWlsX2VuZGVkX2F0IHwgZGF0ZTonbWVkaXVtRGF0ZSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPiBBY3Rpb25zIDwvdGg+XG4gICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHRlbmFudFN1YnNjcmlwdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1zZWNvbmRhcnlcIiBmeExheW91dD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ0ZW5hbnRTdWJzY3JpcHRpb24/LmNyZWF0b3JfaWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwLXN1YnNjcmlwdGlvbi1mb3JtICpuZ0lmPVwidGVuYW50U3Vic2NyaXB0aW9uLnN0YXR1c19pZCA9PSBzdWJzY3JpcHRpb25TdGF0dXMuQUNUSVZFXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN1Y2Nlc3MpPVwicmVsb2FkKClcIiBbdGVuYW50U3Vic2NyaXB0aW9uSW5mb109XCJ0ZW5hbnRTdWJzY3JpcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3Vic2NyaXB0aW9uUGFja2FnZV09XCJzdWJzY3JpcHRpb25QYWNrYWdlXCI+PC9hcHAtc3Vic2NyaXB0aW9uLWZvcm0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInRlbmFudFN1YnNjcmlwdGlvbi5zdGF0dXNfaWQgPT0gc3Vic2NyaXB0aW9uU3RhdHVzLkFDVElWRVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJDYW5jZWwgU3Vic2NyaXB0aW9uXCIgdHlwZT1cImJ1dHRvblwiIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2FuY2VsKHRlbmFudFN1YnNjcmlwdGlvbilcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmNhbmNlbDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImRpc3BsYXllZENvbHVtbnNcIj48L3RyPlxuICAgICAgICAgICAgPHRyIG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IGRpc3BsYXllZENvbHVtbnM7XCI+PC90cj5cbiAgICAgICAgPC90YWJsZT5cbiAgICAgICAgPG1hdC1wcm9ncmVzcy1iYXIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIiAqbmdJZj1cImlzV29ya2luZ1wiPjwvbWF0LXByb2dyZXNzLWJhcj5cbiAgICA8L21hdC1jYXJkPlxuPC9kaXY+Il19