techlify-inventory-common 18.31.0 → 18.32.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.
- package/esm2022/lib/inventory-common/product/product-basic-info/product-basic-info.component.mjs +3 -3
- package/esm2022/lib/inventory-common/product/product-form/product-form.component.mjs +61 -9
- package/esm2022/lib/inventory-common/product/product.module.mjs +14 -5
- package/esm2022/lib/inventory-common/product/widgets/product-category-badges/product-category-badges.component.mjs +3 -3
- package/esm2022/lib/inventory-common/stock-issuances/stock-issue-list/stock-issue-list.component.mjs +39 -85
- package/esm2022/lib/inventory-common/stock-issuances/stock-issue-list/stock-issue-list.module.mjs +8 -4
- package/esm2022/lib/inventory-common/stock-receipts/stock-receipts-list-page/stock-receipts-list-page.component.mjs +3 -4
- package/fesm2022/{techlify-inventory-common-category.module-CMCZ_60M.mjs → techlify-inventory-common-category.module-DrbwYhSL.mjs} +4 -4
- package/fesm2022/{techlify-inventory-common-category.module-CMCZ_60M.mjs.map → techlify-inventory-common-category.module-DrbwYhSL.mjs.map} +1 -1
- package/fesm2022/{techlify-inventory-common-measure.module-6JtrzPaD.mjs → techlify-inventory-common-measure.module-Y1T3R-fR.mjs} +4 -4
- package/fesm2022/{techlify-inventory-common-measure.module-6JtrzPaD.mjs.map → techlify-inventory-common-measure.module-Y1T3R-fR.mjs.map} +1 -1
- package/fesm2022/{techlify-inventory-common-purchase-order-view.component-PylRUv5V.mjs → techlify-inventory-common-purchase-order-view.component-A-iJ1Gxn.mjs} +4 -4
- package/fesm2022/{techlify-inventory-common-purchase-order-view.component-PylRUv5V.mjs.map → techlify-inventory-common-purchase-order-view.component-A-iJ1Gxn.mjs.map} +1 -1
- package/fesm2022/{techlify-inventory-common-stock-issue-batch-form.component-B_KbA68z.mjs → techlify-inventory-common-stock-issue-batch-form.component-DdN2UuLR.mjs} +2 -2
- package/fesm2022/{techlify-inventory-common-stock-issue-batch-form.component-B_KbA68z.mjs.map → techlify-inventory-common-stock-issue-batch-form.component-DdN2UuLR.mjs.map} +1 -1
- package/fesm2022/{techlify-inventory-common-stock-issue-view.component-Ca_lo9Mo.mjs → techlify-inventory-common-stock-issue-view.component-DQGWuLj-.mjs} +2 -2
- package/fesm2022/{techlify-inventory-common-stock-issue-view.component-Ca_lo9Mo.mjs.map → techlify-inventory-common-stock-issue-view.component-DQGWuLj-.mjs.map} +1 -1
- package/fesm2022/{techlify-inventory-common-techlify-inventory-common-BRqmW8Lo.mjs → techlify-inventory-common-techlify-inventory-common-CJVKqbkG.mjs} +136 -119
- package/fesm2022/techlify-inventory-common-techlify-inventory-common-CJVKqbkG.mjs.map +1 -0
- package/fesm2022/techlify-inventory-common.mjs +1 -1
- package/lib/inventory-common/product/product-form/product-form.component.d.ts +8 -2
- package/lib/inventory-common/product/product.module.d.ts +1 -1
- package/lib/inventory-common/stock-issuances/stock-issue-list/stock-issue-list.component.d.ts +4 -10
- package/lib/inventory-common/stock-issuances/stock-issue-list/stock-issue-list.module.d.ts +2 -1
- package/package.json +1 -1
- package/fesm2022/techlify-inventory-common-techlify-inventory-common-BRqmW8Lo.mjs.map +0 -1
package/esm2022/lib/inventory-common/product/product-basic-info/product-basic-info.component.mjs
CHANGED
|
@@ -43,11 +43,11 @@ export class ProductBasicInfoComponent {
|
|
|
43
43
|
});
|
|
44
44
|
}
|
|
45
45
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ProductBasicInfoComponent, deps: [{ token: i1.StockSummaryService }, { token: i2.ProductService }], target: i0.ɵɵFactoryTarget.Component });
|
|
46
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ProductBasicInfoComponent, selector: "app-product-basic-info", inputs: { product: "product" }, outputs: { saved: "saved", deleted: "deleted" }, ngImport: i0, template: "<mat-card *ngIf=\"product\" class=\"w-100\">\n\n <!-- Header: Image + Product Info + Actions -->\n <mat-card-content class=\"d-flex gap-3 align-items-start\">\n <div class=\"product-image-container rounded overflow-hidden flex-shrink-0\">\n <img *ngIf=\"product?.
|
|
46
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ProductBasicInfoComponent, selector: "app-product-basic-info", inputs: { product: "product" }, outputs: { saved: "saved", deleted: "deleted" }, ngImport: i0, template: "<mat-card *ngIf=\"product\" class=\"w-100\">\n\n <!-- Header: Image + Product Info + Actions -->\n <mat-card-content class=\"d-flex gap-3 align-items-start\">\n <div class=\"product-image-container rounded overflow-hidden flex-shrink-0\">\n <img *ngIf=\"product?.image_file_url\" [src]=\"product.image_file_url\" alt=\"{{ product?.name }}\"\n class=\"w-100 h-100 object-fit-cover\" />\n <div *ngIf=\"!product?.image_file_url\"\n class=\"w-100 h-100 bg-secondary-subtle d-flex align-items-center justify-content-center rounded\">\n <span class=\"material-symbols-outlined text-secondary\" style=\"font-size: 40px;\">inventory_2</span>\n </div>\n </div>\n\n <div class=\"flex-grow-1\">\n <div class=\"d-flex justify-content-between align-items-start\">\n <div>\n <h5 class=\"fw-semibold mb-1\">{{ product?.name }}</h5>\n <div class=\"d-flex align-items-center gap-1 text-secondary small flex-wrap\">\n <span>{{ product?.sku }}</span>\n <span> \u2022 </span>\n <span>{{ product?.type?.title }}</span>\n <span> \u2022 </span>\n <span class=\"material-symbols-outlined\" style=\"font-size: 16px;\">view_in_ar</span>\n <span>{{ product?.measure?.title }}</span>\n </div>\n </div>\n <div class=\"d-flex gap-2 flex-shrink-0 align-middle text-secondary\">\n <app-product-form-button [product]=\"product\" (saved)=\"onProductSaved($event)\"></app-product-form-button>\n <app-techlify-delete-button [model]=\"product\" [data]=\"{type: 'Product', title: product?.name}\"\n [service]=\"service\"></app-techlify-delete-button>\n </div>\n </div>\n\n <!-- Categories -->\n <div *ngIf=\"product?.categories?.length\" class=\"d-flex flex-wrap gap-1 mt-2\">\n <span class=\"badge border bg-light text-dark fw-medium\" *ngFor=\"let category of product?.categories\">\n {{ category?.title }}\n </span>\n </div>\n </div>\n </mat-card-content>\n\n <!-- Stock Summary Row -->\n <mat-card-content class=\"d-flex flex-row justify-content-between py-3\">\n <!-- Stock Receipts -->\n <div *ngIf=\"stockSummary\" class=\"d-flex flex-column\">\n <small class=\"text-secondary\">Stock Receipts</small>\n <p class=\"mb-0 fw-semibold fs-2\">{{ stockSummary?.stock_receipts_quantity_sum | number }}</p>\n <small *ngIf=\"product?.last_stock_receipt\" class=\"text-secondary\">\n Last Added On {{ product?.last_stock_receipt?.date | date: 'MMM d, y' }}\n </small>\n </div>\n\n <!-- Stock Issues -->\n <div *ngIf=\"stockSummary\" class=\"d-flex flex-column\">\n <small class=\"text-secondary\">Stock Issues</small>\n <p class=\"mb-0 fw-semibold fs-2\">{{ stockSummary?.stock_issuances_quantity_sum | number }}</p>\n <small *ngIf=\"product?.last_stock_issue\" class=\"text-secondary\">\n Last Added On {{ product?.last_stock_issue?.date | date: 'MMM d, y' }}\n </small>\n </div>\n\n <!-- On Hand -->\n <div class=\"d-flex flex-column\">\n <small class=\"text-secondary\">On Hand</small>\n <p class=\"mb-0 fw-semibold fs-2 text-success\"\n [ngClass]=\"{ 'text-danger': product?.stock_on_hand < product?.reorder_point }\">{{ product?.stock_on_hand |\n number }}</p>\n <small *ngIf=\"product?.reorder_point\" class=\"text-secondary\">\n Reorder At {{ product?.reorder_point }}\n </small>\n </div>\n </mat-card-content>\n\n <!-- Description -->\n <mat-card-content *ngIf=\"product?.description\" class=\"pt-2\">\n <small class=\"text-secondary\">Description</small>\n <p class=\"mb-0 mt-1\">{{ product?.description }}</p>\n </mat-card-content>\n\n <div class=\"d-flex flex-row justify-content-around align-items-center w-100 mt-2\">\n <ngx-barcode6 [bc-value]=\"product?.sku\" [bc-display-value]=\"true\">\n </ngx-barcode6>\n\n <qrcode [qrdata]=\"product?.sku\" [width]=\"128\"></qrcode>\n </div>\n\n</mat-card>", styles: [".product-image-container{width:80px;height:80px}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i4.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i5.QRCodeComponent, selector: "qrcode", inputs: ["allowEmptyString", "colorDark", "colorLight", "cssClass", "elementType", "errorCorrectionLevel", "imageSrc", "imageHeight", "imageWidth", "margin", "qrdata", "scale", "version", "width", "alt", "ariaLabel", "title"], outputs: ["qrCodeURL"] }, { kind: "component", type: i6.NgxBarcode6, selector: "ngx-barcode6", inputs: ["bc-element-type", "bc-class", "bc-format", "bc-line-color", "bc-width", "bc-height", "bc-display-value", "bc-font-options", "bc-font", "bc-text-align", "bc-text-position", "bc-text-margin", "bc-font-size", "bc-background", "bc-margin", "bc-margin-top", "bc-margin-bottom", "bc-margin-left", "bc-margin-right", "bc-value", "bc-valid"] }, { kind: "component", type: i7.TechlifyDeleteButtonComponent, selector: "app-techlify-delete-button", inputs: ["data", "model", "message", "service"], outputs: ["deleted"] }, { kind: "component", type: i8.ProductFormButtonComponent, selector: "app-product-form-button", inputs: ["product"] }, { kind: "pipe", type: i3.DecimalPipe, name: "number" }, { kind: "pipe", type: i3.DatePipe, name: "date" }], preserveWhitespaces: true });
|
|
47
47
|
}
|
|
48
48
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ProductBasicInfoComponent, decorators: [{
|
|
49
49
|
type: Component,
|
|
50
|
-
args: [{ selector: 'app-product-basic-info', template: "<mat-card *ngIf=\"product\" class=\"w-100\">\n\n <!-- Header: Image + Product Info + Actions -->\n <mat-card-content class=\"d-flex gap-3 align-items-start\">\n <div class=\"product-image-container rounded overflow-hidden flex-shrink-0\">\n <img *ngIf=\"product?.
|
|
50
|
+
args: [{ selector: 'app-product-basic-info', template: "<mat-card *ngIf=\"product\" class=\"w-100\">\n\n <!-- Header: Image + Product Info + Actions -->\n <mat-card-content class=\"d-flex gap-3 align-items-start\">\n <div class=\"product-image-container rounded overflow-hidden flex-shrink-0\">\n <img *ngIf=\"product?.image_file_url\" [src]=\"product.image_file_url\" alt=\"{{ product?.name }}\"\n class=\"w-100 h-100 object-fit-cover\" />\n <div *ngIf=\"!product?.image_file_url\"\n class=\"w-100 h-100 bg-secondary-subtle d-flex align-items-center justify-content-center rounded\">\n <span class=\"material-symbols-outlined text-secondary\" style=\"font-size: 40px;\">inventory_2</span>\n </div>\n </div>\n\n <div class=\"flex-grow-1\">\n <div class=\"d-flex justify-content-between align-items-start\">\n <div>\n <h5 class=\"fw-semibold mb-1\">{{ product?.name }}</h5>\n <div class=\"d-flex align-items-center gap-1 text-secondary small flex-wrap\">\n <span>{{ product?.sku }}</span>\n <span> \u2022 </span>\n <span>{{ product?.type?.title }}</span>\n <span> \u2022 </span>\n <span class=\"material-symbols-outlined\" style=\"font-size: 16px;\">view_in_ar</span>\n <span>{{ product?.measure?.title }}</span>\n </div>\n </div>\n <div class=\"d-flex gap-2 flex-shrink-0 align-middle text-secondary\">\n <app-product-form-button [product]=\"product\" (saved)=\"onProductSaved($event)\"></app-product-form-button>\n <app-techlify-delete-button [model]=\"product\" [data]=\"{type: 'Product', title: product?.name}\"\n [service]=\"service\"></app-techlify-delete-button>\n </div>\n </div>\n\n <!-- Categories -->\n <div *ngIf=\"product?.categories?.length\" class=\"d-flex flex-wrap gap-1 mt-2\">\n <span class=\"badge border bg-light text-dark fw-medium\" *ngFor=\"let category of product?.categories\">\n {{ category?.title }}\n </span>\n </div>\n </div>\n </mat-card-content>\n\n <!-- Stock Summary Row -->\n <mat-card-content class=\"d-flex flex-row justify-content-between py-3\">\n <!-- Stock Receipts -->\n <div *ngIf=\"stockSummary\" class=\"d-flex flex-column\">\n <small class=\"text-secondary\">Stock Receipts</small>\n <p class=\"mb-0 fw-semibold fs-2\">{{ stockSummary?.stock_receipts_quantity_sum | number }}</p>\n <small *ngIf=\"product?.last_stock_receipt\" class=\"text-secondary\">\n Last Added On {{ product?.last_stock_receipt?.date | date: 'MMM d, y' }}\n </small>\n </div>\n\n <!-- Stock Issues -->\n <div *ngIf=\"stockSummary\" class=\"d-flex flex-column\">\n <small class=\"text-secondary\">Stock Issues</small>\n <p class=\"mb-0 fw-semibold fs-2\">{{ stockSummary?.stock_issuances_quantity_sum | number }}</p>\n <small *ngIf=\"product?.last_stock_issue\" class=\"text-secondary\">\n Last Added On {{ product?.last_stock_issue?.date | date: 'MMM d, y' }}\n </small>\n </div>\n\n <!-- On Hand -->\n <div class=\"d-flex flex-column\">\n <small class=\"text-secondary\">On Hand</small>\n <p class=\"mb-0 fw-semibold fs-2 text-success\"\n [ngClass]=\"{ 'text-danger': product?.stock_on_hand < product?.reorder_point }\">{{ product?.stock_on_hand |\n number }}</p>\n <small *ngIf=\"product?.reorder_point\" class=\"text-secondary\">\n Reorder At {{ product?.reorder_point }}\n </small>\n </div>\n </mat-card-content>\n\n <!-- Description -->\n <mat-card-content *ngIf=\"product?.description\" class=\"pt-2\">\n <small class=\"text-secondary\">Description</small>\n <p class=\"mb-0 mt-1\">{{ product?.description }}</p>\n </mat-card-content>\n\n <div class=\"d-flex flex-row justify-content-around align-items-center w-100 mt-2\">\n <ngx-barcode6 [bc-value]=\"product?.sku\" [bc-display-value]=\"true\">\n </ngx-barcode6>\n\n <qrcode [qrdata]=\"product?.sku\" [width]=\"128\"></qrcode>\n </div>\n\n</mat-card>", styles: [".product-image-container{width:80px;height:80px}\n"] }]
|
|
51
51
|
}], ctorParameters: () => [{ type: i1.StockSummaryService }, { type: i2.ProductService }], propDecorators: { product: [{
|
|
52
52
|
type: Input
|
|
53
53
|
}], saved: [{
|
|
@@ -55,4 +55,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
55
55
|
}], deleted: [{
|
|
56
56
|
type: Output
|
|
57
57
|
}] } });
|
|
58
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
58
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1iYXNpYy1pbmZvLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2ludmVudG9yeS1jb21tb24vc3JjL2xpYi9pbnZlbnRvcnktY29tbW9uL3Byb2R1Y3QvcHJvZHVjdC1iYXNpYy1pbmZvL3Byb2R1Y3QtYmFzaWMtaW5mby5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZlbnRvcnktY29tbW9uL3NyYy9saWIvaW52ZW50b3J5LWNvbW1vbi9wcm9kdWN0L3Byb2R1Y3QtYmFzaWMtaW5mby9wcm9kdWN0LWJhc2ljLWluZm8uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7OztBQVMvRSxNQUFNLE9BQU8seUJBQXlCO0lBTWhCO0lBQ1I7SUFOSCxPQUFPLENBQU07SUFDWixLQUFLLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7SUFDbkQsT0FBTyxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO0lBQy9ELFlBQVksQ0FBTztJQUVuQixZQUFvQixtQkFBd0MsRUFDaEQsT0FBdUI7UUFEZix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBQ2hELFlBQU8sR0FBUCxPQUFPLENBQWdCO0lBQ2hDLENBQUM7SUFFSixRQUFRO1FBQ04sSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFDbEMsQ0FBQztJQUNILENBQUM7SUFFRCxjQUFjLENBQUMsT0FBWTtRQUN6QixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsd0JBQXdCO1FBQ3RCLE1BQU0sTUFBTSxHQUFRO1lBQ2xCLFdBQVcsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDN0IsT0FBTyxFQUFFLG1GQUFtRjtTQUM3RixDQUFDO1FBQ0YsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDakQsSUFBSSxFQUFFLENBQUMsUUFBYSxFQUFFLEVBQUU7Z0JBQ3RCLElBQUksQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDO1lBQy9CLENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO3dHQWxDVSx5QkFBeUI7NEZBQXpCLHlCQUF5QiwrSUNUdEMsaStIQXVGVzs7NEZEOUVFLHlCQUF5QjtrQkFMckMsU0FBUzsrQkFDRSx3QkFBd0I7cUhBS3pCLE9BQU87c0JBQWYsS0FBSztnQkFDSSxLQUFLO3NCQUFkLE1BQU07Z0JBQ0csT0FBTztzQkFBaEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN0b2NrU3VtbWFyeVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zdG9jay1zdW1tYXJ5LnNlcnZpY2UnO1xuaW1wb3J0IHsgUHJvZHVjdFNlcnZpY2UgfSBmcm9tICcuLi9wcm9kdWN0LnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtcHJvZHVjdC1iYXNpYy1pbmZvJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3Byb2R1Y3QtYmFzaWMtaW5mby5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3Byb2R1Y3QtYmFzaWMtaW5mby5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBQcm9kdWN0QmFzaWNJbmZvQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgcHJvZHVjdDogYW55O1xuICBAT3V0cHV0KCkgc2F2ZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBkZWxldGVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBzdG9ja1N1bW1hcnkhOiBhbnk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzdG9ja1N1bW1hcnlTZXJ2aWNlOiBTdG9ja1N1bW1hcnlTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBzZXJ2aWNlOiBQcm9kdWN0U2VydmljZVxuICApIHt9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgaWYgKHRoaXMucHJvZHVjdCkge1xuICAgICAgdGhpcy5sb2FkUHJvZHVjdFN0b2Nrc1N1bW1hcnkoKTtcbiAgICB9XG4gIH1cblxuICBvblByb2R1Y3RTYXZlZChwcm9kdWN0OiBhbnkpIHtcbiAgICB0aGlzLnByb2R1Y3QgPSBwcm9kdWN0O1xuICAgIHRoaXMuc2F2ZWQuZW1pdCh0aGlzLnByb2R1Y3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgcHJvZHVjdCBzdG9ja3Mgc3VtbWFyeS5cbiAgICovXG4gIGxvYWRQcm9kdWN0U3RvY2tzU3VtbWFyeSgpIHtcbiAgICBjb25zdCBwYXJhbXM6IGFueSA9IHtcbiAgICAgIHByb2R1Y3RfaWRzOiB0aGlzLnByb2R1Y3Q/LmlkLFxuICAgICAgaW5jbHVkZTogJ3N0b2NrX3JlY2VpcHRzX3F1YW50aXR5X3N1bSxzdG9ja19pc3N1YW5jZXNfcXVhbnRpdHlfc3VtLHN0b2NrX3F1YW50aXR5X3JlbWFpbmluZycsXG4gICAgfTtcbiAgICB0aGlzLnN0b2NrU3VtbWFyeVNlcnZpY2Uuc3VtbWFyeShwYXJhbXMpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnN0b2NrU3VtbWFyeSA9IHJlc3BvbnNlO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxufVxuIiwiPG1hdC1jYXJkICpuZ0lmPVwicHJvZHVjdFwiIGNsYXNzPVwidy0xMDBcIj5cblxuICA8IS0tIEhlYWRlcjogSW1hZ2UgKyBQcm9kdWN0IEluZm8gKyBBY3Rpb25zIC0tPlxuICA8bWF0LWNhcmQtY29udGVudCBjbGFzcz1cImQtZmxleCBnYXAtMyBhbGlnbi1pdGVtcy1zdGFydFwiPlxuICAgIDxkaXYgY2xhc3M9XCJwcm9kdWN0LWltYWdlLWNvbnRhaW5lciByb3VuZGVkIG92ZXJmbG93LWhpZGRlbiBmbGV4LXNocmluay0wXCI+XG4gICAgICA8aW1nICpuZ0lmPVwicHJvZHVjdD8uaW1hZ2VfZmlsZV91cmxcIiBbc3JjXT1cInByb2R1Y3QuaW1hZ2VfZmlsZV91cmxcIiBhbHQ9XCJ7eyBwcm9kdWN0Py5uYW1lIH19XCJcbiAgICAgICAgY2xhc3M9XCJ3LTEwMCBoLTEwMCBvYmplY3QtZml0LWNvdmVyXCIgLz5cbiAgICAgIDxkaXYgKm5nSWY9XCIhcHJvZHVjdD8uaW1hZ2VfZmlsZV91cmxcIlxuICAgICAgICBjbGFzcz1cInctMTAwIGgtMTAwIGJnLXNlY29uZGFyeS1zdWJ0bGUgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIHJvdW5kZWRcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIHRleHQtc2Vjb25kYXJ5XCIgc3R5bGU9XCJmb250LXNpemU6IDQwcHg7XCI+aW52ZW50b3J5XzI8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJmbGV4LWdyb3ctMVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1zdGFydFwiPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxoNSBjbGFzcz1cImZ3LXNlbWlib2xkIG1iLTFcIj57eyBwcm9kdWN0Py5uYW1lIH19PC9oNT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMSB0ZXh0LXNlY29uZGFyeSBzbWFsbCBmbGV4LXdyYXBcIj5cbiAgICAgICAgICAgIDxzcGFuPnt7IHByb2R1Y3Q/LnNrdSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuPiDigKIgPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4+e3sgcHJvZHVjdD8udHlwZT8udGl0bGUgfX08L3NwYW4+XG4gICAgICAgICAgICA8c3Bhbj4g4oCiIDwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiIHN0eWxlPVwiZm9udC1zaXplOiAxNnB4O1wiPnZpZXdfaW5fYXI8L3NwYW4+XG4gICAgICAgICAgICA8c3Bhbj57eyBwcm9kdWN0Py5tZWFzdXJlPy50aXRsZSB9fTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTIgZmxleC1zaHJpbmstMCBhbGlnbi1taWRkbGUgdGV4dC1zZWNvbmRhcnlcIj5cbiAgICAgICAgICA8YXBwLXByb2R1Y3QtZm9ybS1idXR0b24gW3Byb2R1Y3RdPVwicHJvZHVjdFwiIChzYXZlZCk9XCJvblByb2R1Y3RTYXZlZCgkZXZlbnQpXCI+PC9hcHAtcHJvZHVjdC1mb3JtLWJ1dHRvbj5cbiAgICAgICAgICA8YXBwLXRlY2hsaWZ5LWRlbGV0ZS1idXR0b24gW21vZGVsXT1cInByb2R1Y3RcIiBbZGF0YV09XCJ7dHlwZTogJ1Byb2R1Y3QnLCB0aXRsZTogcHJvZHVjdD8ubmFtZX1cIlxuICAgICAgICAgICAgW3NlcnZpY2VdPVwic2VydmljZVwiPjwvYXBwLXRlY2hsaWZ5LWRlbGV0ZS1idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gQ2F0ZWdvcmllcyAtLT5cbiAgICAgIDxkaXYgKm5nSWY9XCJwcm9kdWN0Py5jYXRlZ29yaWVzPy5sZW5ndGhcIiBjbGFzcz1cImQtZmxleCBmbGV4LXdyYXAgZ2FwLTEgbXQtMlwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlIGJvcmRlciBiZy1saWdodCB0ZXh0LWRhcmsgZnctbWVkaXVtXCIgKm5nRm9yPVwibGV0IGNhdGVnb3J5IG9mIHByb2R1Y3Q/LmNhdGVnb3JpZXNcIj5cbiAgICAgICAgICB7eyBjYXRlZ29yeT8udGl0bGUgfX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvbWF0LWNhcmQtY29udGVudD5cblxuICA8IS0tIFN0b2NrIFN1bW1hcnkgUm93IC0tPlxuICA8bWF0LWNhcmQtY29udGVudCBjbGFzcz1cImQtZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBweS0zXCI+XG4gICAgPCEtLSBTdG9jayBSZWNlaXB0cyAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwic3RvY2tTdW1tYXJ5XCIgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW5cIj5cbiAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtc2Vjb25kYXJ5XCI+U3RvY2sgUmVjZWlwdHM8L3NtYWxsPlxuICAgICAgPHAgY2xhc3M9XCJtYi0wIGZ3LXNlbWlib2xkIGZzLTJcIj57eyBzdG9ja1N1bW1hcnk/LnN0b2NrX3JlY2VpcHRzX3F1YW50aXR5X3N1bSB8IG51bWJlciB9fTwvcD5cbiAgICAgIDxzbWFsbCAqbmdJZj1cInByb2R1Y3Q/Lmxhc3Rfc3RvY2tfcmVjZWlwdFwiIGNsYXNzPVwidGV4dC1zZWNvbmRhcnlcIj5cbiAgICAgICAgTGFzdCBBZGRlZCBPbiB7eyBwcm9kdWN0Py5sYXN0X3N0b2NrX3JlY2VpcHQ/LmRhdGUgfCBkYXRlOiAnTU1NIGQsIHknIH19XG4gICAgICA8L3NtYWxsPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBTdG9jayBJc3N1ZXMgLS0+XG4gICAgPGRpdiAqbmdJZj1cInN0b2NrU3VtbWFyeVwiIGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uXCI+XG4gICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LXNlY29uZGFyeVwiPlN0b2NrIElzc3Vlczwvc21hbGw+XG4gICAgICA8cCBjbGFzcz1cIm1iLTAgZnctc2VtaWJvbGQgZnMtMlwiPnt7IHN0b2NrU3VtbWFyeT8uc3RvY2tfaXNzdWFuY2VzX3F1YW50aXR5X3N1bSB8IG51bWJlciB9fTwvcD5cbiAgICAgIDxzbWFsbCAqbmdJZj1cInByb2R1Y3Q/Lmxhc3Rfc3RvY2tfaXNzdWVcIiBjbGFzcz1cInRleHQtc2Vjb25kYXJ5XCI+XG4gICAgICAgIExhc3QgQWRkZWQgT24ge3sgcHJvZHVjdD8ubGFzdF9zdG9ja19pc3N1ZT8uZGF0ZSB8IGRhdGU6ICdNTU0gZCwgeScgfX1cbiAgICAgIDwvc21hbGw+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIE9uIEhhbmQgLS0+XG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtblwiPlxuICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1zZWNvbmRhcnlcIj5PbiBIYW5kPC9zbWFsbD5cbiAgICAgIDxwIGNsYXNzPVwibWItMCBmdy1zZW1pYm9sZCBmcy0yIHRleHQtc3VjY2Vzc1wiXG4gICAgICAgIFtuZ0NsYXNzXT1cInsgJ3RleHQtZGFuZ2VyJzogcHJvZHVjdD8uc3RvY2tfb25faGFuZCA8IHByb2R1Y3Q/LnJlb3JkZXJfcG9pbnQgfVwiPnt7IHByb2R1Y3Q/LnN0b2NrX29uX2hhbmQgfFxuICAgICAgICBudW1iZXIgfX08L3A+XG4gICAgICA8c21hbGwgKm5nSWY9XCJwcm9kdWN0Py5yZW9yZGVyX3BvaW50XCIgY2xhc3M9XCJ0ZXh0LXNlY29uZGFyeVwiPlxuICAgICAgICBSZW9yZGVyIEF0IHt7IHByb2R1Y3Q/LnJlb3JkZXJfcG9pbnQgfX1cbiAgICAgIDwvc21hbGw+XG4gICAgPC9kaXY+XG4gIDwvbWF0LWNhcmQtY29udGVudD5cblxuICA8IS0tIERlc2NyaXB0aW9uIC0tPlxuICA8bWF0LWNhcmQtY29udGVudCAqbmdJZj1cInByb2R1Y3Q/LmRlc2NyaXB0aW9uXCIgY2xhc3M9XCJwdC0yXCI+XG4gICAgPHNtYWxsIGNsYXNzPVwidGV4dC1zZWNvbmRhcnlcIj5EZXNjcmlwdGlvbjwvc21hbGw+XG4gICAgPHAgY2xhc3M9XCJtYi0wIG10LTFcIj57eyBwcm9kdWN0Py5kZXNjcmlwdGlvbiB9fTwvcD5cbiAgPC9tYXQtY2FyZC1jb250ZW50PlxuXG4gIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1yb3cganVzdGlmeS1jb250ZW50LWFyb3VuZCBhbGlnbi1pdGVtcy1jZW50ZXIgdy0xMDAgbXQtMlwiPlxuICAgIDxuZ3gtYmFyY29kZTYgW2JjLXZhbHVlXT1cInByb2R1Y3Q/LnNrdVwiIFtiYy1kaXNwbGF5LXZhbHVlXT1cInRydWVcIj5cbiAgICA8L25neC1iYXJjb2RlNj5cblxuICAgIDxxcmNvZGUgW3FyZGF0YV09XCJwcm9kdWN0Py5za3VcIiBbd2lkdGhdPVwiMTI4XCI+PC9xcmNvZGU+XG4gIDwvZGl2PlxuXG48L21hdC1jYXJkPiJdfQ==
|
|
@@ -3,8 +3,8 @@ import { FormControl, Validators } from '@angular/forms';
|
|
|
3
3
|
import moment from 'moment';
|
|
4
4
|
import { TechlifyFormComponentInterface, FormConfigurationUtilityService } from 'ngx-techlify-core';
|
|
5
5
|
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "
|
|
7
|
-
import * as i2 from "
|
|
6
|
+
import * as i1 from "ngx-techlify-core";
|
|
7
|
+
import * as i2 from "@angular/forms";
|
|
8
8
|
import * as i3 from "../product.service";
|
|
9
9
|
import * as i4 from "@angular/router";
|
|
10
10
|
import * as i5 from "@angular/common";
|
|
@@ -16,6 +16,7 @@ import * as i10 from "@angular/material/progress-spinner";
|
|
|
16
16
|
import * as i11 from "@angular/material/card";
|
|
17
17
|
import * as i12 from "@angular/material/datepicker";
|
|
18
18
|
export class ProductFormComponent extends TechlifyFormComponentInterface {
|
|
19
|
+
fileService;
|
|
19
20
|
fb;
|
|
20
21
|
formValidatorService;
|
|
21
22
|
service;
|
|
@@ -64,12 +65,19 @@ export class ProductFormComponent extends TechlifyFormComponentInterface {
|
|
|
64
65
|
reorder_point: {
|
|
65
66
|
required: 'Please Enter Reorder Point',
|
|
66
67
|
},
|
|
68
|
+
color_id: {
|
|
69
|
+
required: 'Please Select Color',
|
|
70
|
+
},
|
|
67
71
|
};
|
|
68
72
|
isCreateAnother = new FormControl(false);
|
|
69
73
|
savedCount = 0;
|
|
70
74
|
formConfigurationUtilityService;
|
|
71
|
-
|
|
75
|
+
fileConfig;
|
|
76
|
+
viewerConfig;
|
|
77
|
+
fileList = [];
|
|
78
|
+
constructor(fileService, fb, formValidatorService, service, activatedRoute, errorHandler, location, router, formConfigService) {
|
|
72
79
|
super(formValidatorService);
|
|
80
|
+
this.fileService = fileService;
|
|
73
81
|
this.fb = fb;
|
|
74
82
|
this.formValidatorService = formValidatorService;
|
|
75
83
|
this.service = service;
|
|
@@ -81,6 +89,22 @@ export class ProductFormComponent extends TechlifyFormComponentInterface {
|
|
|
81
89
|
this.formConfigurationUtilityService = new FormConfigurationUtilityService();
|
|
82
90
|
}
|
|
83
91
|
ngOnInit() {
|
|
92
|
+
this.fileConfig = {
|
|
93
|
+
fileId: 'productImageFile',
|
|
94
|
+
containerId: 'productImageFileContainer',
|
|
95
|
+
styles: {
|
|
96
|
+
height: '200px'
|
|
97
|
+
},
|
|
98
|
+
multiple: false,
|
|
99
|
+
acceptFile: 'image/*',
|
|
100
|
+
maxSize: 10,
|
|
101
|
+
acceptFileText: 'PNG, JPEG, and JPG only'
|
|
102
|
+
};
|
|
103
|
+
this.viewerConfig = {
|
|
104
|
+
viewerStyle: {
|
|
105
|
+
height: '50px',
|
|
106
|
+
}
|
|
107
|
+
};
|
|
84
108
|
this.formConfigurationUtilityService
|
|
85
109
|
.initialize(this.formConfigService, 'product')
|
|
86
110
|
.subscribe({
|
|
@@ -88,7 +112,7 @@ export class ProductFormComponent extends TechlifyFormComponentInterface {
|
|
|
88
112
|
this.form = this.fb.group({
|
|
89
113
|
id: [''],
|
|
90
114
|
type_id: [1, Validators.compose([Validators.required])],
|
|
91
|
-
color_id: [''],
|
|
115
|
+
color_id: ['', this.formConfigurationUtilityService.getFieldRequired('color_id') ? Validators.required : null],
|
|
92
116
|
sku: [''],
|
|
93
117
|
name: ['', Validators.compose([Validators.required])],
|
|
94
118
|
initial_quantity: [0],
|
|
@@ -104,6 +128,8 @@ export class ProductFormComponent extends TechlifyFormComponentInterface {
|
|
|
104
128
|
condition_type_id: [1],
|
|
105
129
|
current_quantity: [],
|
|
106
130
|
category_ids: [''],
|
|
131
|
+
image_file: [null],
|
|
132
|
+
image_file_url: [null],
|
|
107
133
|
});
|
|
108
134
|
}, error: (error) => {
|
|
109
135
|
this.errorHandler.handleError(error);
|
|
@@ -192,15 +218,41 @@ export class ProductFormComponent extends TechlifyFormComponentInterface {
|
|
|
192
218
|
isFormSectionShown(sectionName) {
|
|
193
219
|
return this.displayedFormSections.length > 0 && this.displayedFormSections.includes(sectionName);
|
|
194
220
|
}
|
|
195
|
-
|
|
196
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ProductFormComponent, selector: "app-product-form", inputs: { displayedFormFields: "displayedFormFields", displayedFormSections: "displayedFormSections" }, usesInheritance: true, ngImport: i0, template: "<mat-card class='container'>\n @if (isFormSetup()) {\n <mat-card-content>\n <form [formGroup]=\"form\" (submit)=\"save()\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <span></span>\n <h3 class=\"text-center m-0\">Product Form</h3>\n <i role='button' class=\"fa-solid fa-gear\" routerLink=\"/form-configuration-field-form/product\"></i>\n </div>\n <div class=\"d-flex flex-column\">\n <div class=\"d-flex flex-column\" *ngIf=\"isFormSectionShown('basic information')\">\n <h3><strong>Basic Information</strong></h3>\n <div class=\"d-flex gap-2\">\n\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('name')\">\n <mat-label>Name</mat-label>\n <input matInput placeholder=\"Name\" formControlName=\"name\" required />\n <mat-error *ngIf=\"isFieldValid('name')\">{{ getErrorMessage('name') }} </mat-error>\n </mat-form-field>\n\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('product type')\">\n <mat-label>Product Type</mat-label>\n <app-searchable-selector apiUrl=\"api/product-types\" formControlName=\"type_id\"> </app-searchable-selector>\n <mat-error *ngIf=\"isFieldValid('type_id')\">{{ getErrorMessage('type_id') }} </mat-error>\n </mat-form-field>\n </div>\n\n <div class=\"d-flex gap-2\">\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('sku')\">\n <mat-label>SKU</mat-label>\n <input matInput placeholder=\"SKU\" formControlName=\"sku\" />\n <mat-error *ngIf=\"isFieldValid('sku')\">{{ getErrorMessage('sku') }} </mat-error>\n </mat-form-field>\n\n <mat-form-field class=\"w-50\">\n <mat-label>Category</mat-label>\n <app-searchable-selector apiUrl=\"api/product-categories\" formControlName=\"category_ids\" [multiple]=\"true\">\n </app-searchable-selector>\n <mat-error *ngIf=\"isFieldValid('category_ids')\">\n {{ getErrorMessage('category_ids') }}\n </mat-error>\n </mat-form-field>\n </div>\n\n <div class=\"d-flex gap-2\">\n <mat-form-field class=\"w-50 align-self-start\"\n *ngIf=\"isFormFieldShown('color') && formConfigurationUtilityService.getFieldEnabled('color_id')\">\n <mat-label>Color</mat-label>\n <app-searchable-selector apiUrl=\"api/attributes?type_code=color\"\n formControlName=\"color_id\"></app-searchable-selector>\n </mat-form-field>\n\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('description')\">\n <mat-label>Description</mat-label>\n <textarea matInput placeholder=\"Description\" formControlName=\"description\"></textarea>\n </mat-form-field>\n </div>\n </div>\n\n <div class=\"d-flex flex-column\" *ngIf=\"isFormSectionShown('inventory information')\">\n <h3><strong>Inventory Information</strong></h3>\n <div class=\"d-flex gap-2\">\n\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('product measure')\">\n <mat-label>Measure</mat-label>\n <app-searchable-selector apiUrl=\"api/product-measures\" formControlName=\"measure_id\">\n </app-searchable-selector>\n <mat-error *ngIf=\"isFieldValid('measure_id')\">{{ getErrorMessage('measure_id') }} </mat-error>\n </mat-form-field>\n\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('reorder point')\">\n <mat-label>Reorder Point</mat-label>\n <input matInput placeholder=\"Reorder Point\" formControlName=\"reorder_point\" type=\"number\" />\n <mat-error *ngIf=\"isFieldValid('reorder_point')\">{{ getErrorMessage('reorder_point') }} </mat-error>\n </mat-form-field>\n </div>\n <div class=\"d-flex gap-2\">\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('initial quantity')\">\n <mat-label>Initial Quantity</mat-label>\n <input matInput placeholder=\"Initial Quantity\" formControlName=\"initial_quantity\" />\n <mat-error *ngIf=\"isFieldValid('initial_quantity')\">{{ getErrorMessage('initial_quantity') }} </mat-error>\n </mat-form-field>\n\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('initial quantity date')\">\n <mat-label>Initial Quantity Date</mat-label>\n <input matInput [matDatepicker]=\"pickerInitialQuantityDate\" placeholder=\"Initial Quantity Date\"\n formControlName=\"initial_quantity_date\" />\n <mat-datepicker-toggle matSuffix [for]=\"pickerInitialQuantityDate\"></mat-datepicker-toggle>\n <mat-datepicker #pickerInitialQuantityDate></mat-datepicker>\n <mat-error *ngIf=\"isFieldValid('initial_quantity_date')\">{{ getErrorMessage('initial_quantity_date') }}\n </mat-error>\n </mat-form-field>\n </div>\n </div>\n <div class=\"d-flex flex-column\" *ngIf=\"isFormSectionShown('sales information')\">\n <h3><strong>Sale Information</strong></h3>\n <div class=\"d-flex gap-2\">\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('sales price')\">\n <mat-label>Selling Price</mat-label>\n <input matInput placeholder=\"Selling Price\" formControlName=\"sale_price\" required type=\"number\"\n step=\"any\" />\n <mat-error *ngIf=\"isFieldValid('sale_price')\">{{ getErrorMessage('sale_price') }} </mat-error>\n </mat-form-field>\n\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('condition types')\">\n <mat-label>Condition</mat-label>\n <app-searchable-selector apiUrl=\"api/condition-types\"\n formControlName=\"condition_type_id\"></app-searchable-selector>\n </mat-form-field>\n </div>\n <div class=\"d-flex gap-2\">\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('minimum price')\">\n <mat-label>Minimum Price</mat-label>\n <input matInput placeholder=\"Minimum Price\" formControlName=\"minimum_price\" required type=\"number\"\n step=\"any\" />\n <mat-error *ngIf=\"isFieldValid('minimum_price')\">{{ getErrorMessage('minimum_price') }} </mat-error>\n </mat-form-field>\n\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('maximum price')\">\n <mat-label>Maximum Price</mat-label>\n <input matInput placeholder=\"Maximum Price\" formControlName=\"maximum_price\" type=\"number\" step=\"any\" />\n </mat-form-field>\n </div>\n </div>\n\n <div class=\"w-100 d-flex justify-content-between\">\n @if (!isUpdate) {\n <mat-checkbox [formControl]=\"isCreateAnother\">Create Another\n <span *ngIf=\"savedCount > 0\">({{ savedCount }} items saved)</span>\n </mat-checkbox>\n } @else {\n <span class='d-flex flex-grow'></span>\n }\n\n <div class=\"d-flex flex-row gap-3 align-items-center justify-content-end\">\n <button [disabled]=\"isWorking\" mat-button class=\"mt-2\" type=\"button\" (click)=\"location.back()\">\n Cancel\n </button>\n <button [disabled]=\"isWorking\" mat-raised-button color=\"primary\" class=\"mt-2\" type=\"submit\">Save</button>\n </div>\n </div>\n </div>\n </form>\n </mat-card-content>\n } @else {\n <mat-card-content class=\"d-flex vh-100 justify-content-center align-items-center\">\n <mat-spinner></mat-spinner>\n </mat-card-content>\n }\n</mat-card>", dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i2.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: "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: i7.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: i8.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatLabel, selector: "mat-label" }, { kind: "directive", type: i8.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i8.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { 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.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i11.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i11.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i12.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i12.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i12.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.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: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }], preserveWhitespaces: true });
|
|
221
|
+
async fileChanged(event) {
|
|
222
|
+
this.fileList = event;
|
|
223
|
+
if (this.fileList.length > 0) {
|
|
224
|
+
const result = await this.fileService.uploadEntityFile(this.fileList[0], {
|
|
225
|
+
entity_id: this.product()?.id,
|
|
226
|
+
entity_type: 'product',
|
|
227
|
+
sub_path: `${this.product()?.id}`
|
|
228
|
+
});
|
|
229
|
+
this.form.get('image_file')?.setValue(result.item.file);
|
|
230
|
+
this.form.get('image_file_url')?.setValue(result.item.url);
|
|
231
|
+
this.fileList = [];
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
async removeFile() {
|
|
235
|
+
if (this.form.value.image_file) {
|
|
236
|
+
try {
|
|
237
|
+
this.form.patchValue({
|
|
238
|
+
image_file: '',
|
|
239
|
+
image_file_url: ''
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
catch (error) {
|
|
243
|
+
this.alertService.addAlert('Unable to remove file, try later', 'warn');
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ProductFormComponent, deps: [{ token: i1.EntityFileService }, { token: i2.FormBuilder }, { token: i1.FormValidatorService }, { token: i3.ProductService }, { token: i4.ActivatedRoute }, { token: i1.ErrorHandlerService }, { token: i5.Location }, { token: i4.Router }, { token: i1.FormConfigurationFormService }], target: i0.ɵɵFactoryTarget.Component });
|
|
248
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ProductFormComponent, selector: "app-product-form", inputs: { displayedFormFields: "displayedFormFields", displayedFormSections: "displayedFormSections" }, usesInheritance: true, ngImport: i0, template: "@if (isFormSetup()) {\n<div class=\"d-flex flex-column gap-2\">\n <mat-card class='container'>\n <mat-card-content>\n <div class=\"d-flex justify-content-between align-items-center\">\n <span></span>\n <h3 class=\"text-center m-0\">Product Form</h3>\n <app-form-configuration-for-form formCode='product'></app-form-configuration-for-form>\n </div>\n </mat-card-content>\n </mat-card>\n <mat-card class='container'>\n <mat-card-content>\n <form [formGroup]=\"form\" (submit)=\"save()\">\n <div class=\"d-flex flex-column\">\n\n <div class=\"d-flex flex-column justify-content-center align-items-center\">\n <ng-template #fileUpload>\n <div class=\"w-100\">\n <app-file-dropper (fileChanged)=\"fileChanged($event)\" [config]=\"fileConfig\" [fileArray]=\"fileList\">\n </app-file-dropper>\n </div>\n </ng-template>\n <div *ngIf=\"form.get('image_file')?.value; else fileUpload;\" style='width: 200px;'\n class='justify-content-center align-items-center'>\n <app-document-viewer (remove)=\"removeFile()\" [config]=\"viewerConfig\"\n [fileUrl]=\"form.get('image_file_url')?.value\" [file]=\"form.get('image_file')?.value\">\n </app-document-viewer>\n </div>\n </div>\n\n <div class=\"d-flex flex-column mt-2\" *ngIf=\"isFormSectionShown('basic information')\">\n <h6>Basic Information</h6>\n <div class=\"d-flex gap-2\">\n\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('name')\">\n <mat-label>Name</mat-label>\n <input matInput placeholder=\"Name\" formControlName=\"name\" required />\n <mat-error *ngIf=\"isFieldValid('name')\">{{ getErrorMessage('name') }} </mat-error>\n </mat-form-field>\n\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('product type')\">\n <mat-label>Product Type</mat-label>\n <app-searchable-selector apiUrl=\"api/product-types\" formControlName=\"type_id\">\n </app-searchable-selector>\n <mat-error *ngIf=\"isFieldValid('type_id')\">{{ getErrorMessage('type_id') }} </mat-error>\n </mat-form-field>\n </div>\n\n <div class=\"d-flex gap-2\">\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('sku')\">\n <mat-label>SKU</mat-label>\n <input matInput placeholder=\"SKU\" formControlName=\"sku\" />\n <mat-error *ngIf=\"isFieldValid('sku')\">{{ getErrorMessage('sku') }} </mat-error>\n </mat-form-field>\n\n <mat-form-field class=\"w-50\">\n <mat-label>Category</mat-label>\n <app-searchable-selector apiUrl=\"api/product-categories\" formControlName=\"category_ids\"\n [multiple]=\"true\">\n </app-searchable-selector>\n <mat-error *ngIf=\"isFieldValid('category_ids')\">\n {{ getErrorMessage('category_ids') }}\n </mat-error>\n </mat-form-field>\n </div>\n\n <div class=\"d-flex gap-2\">\n <mat-form-field class=\"w-50 align-self-start\"\n *ngIf=\"isFormFieldShown('color') && formConfigurationUtilityService.getFieldEnabled('color_id')\">\n <mat-label>\n Color <sup *ngIf=\"formConfigurationUtilityService.getFieldRequired('color_id')\">*</sup>\n </mat-label>\n <app-searchable-selector apiUrl=\"api/attributes?type_code=color\"\n formControlName=\"color_id\"></app-searchable-selector>\n <mat-error *ngIf=\"isFieldValid('color_id')\">{{getErrorMessage('color_id')}}</mat-error>\n </mat-form-field>\n\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('description')\">\n <mat-label>Description</mat-label>\n <textarea matInput placeholder=\"Description\" formControlName=\"description\"></textarea>\n </mat-form-field>\n </div>\n </div>\n\n <div class=\"d-flex flex-column\" *ngIf=\"isFormSectionShown('inventory information')\">\n <h6>Inventory Information</h6>\n <div class=\"d-flex gap-2\">\n\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('product measure')\">\n <mat-label>Measure</mat-label>\n <app-searchable-selector apiUrl=\"api/product-measures\" formControlName=\"measure_id\">\n </app-searchable-selector>\n <mat-error *ngIf=\"isFieldValid('measure_id')\">{{ getErrorMessage('measure_id') }} </mat-error>\n </mat-form-field>\n\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('reorder point')\">\n <mat-label>Reorder Point</mat-label>\n <input matInput placeholder=\"Reorder Point\" formControlName=\"reorder_point\" type=\"number\" />\n <mat-error *ngIf=\"isFieldValid('reorder_point')\">{{ getErrorMessage('reorder_point') }} </mat-error>\n </mat-form-field>\n </div>\n <div class=\"d-flex gap-2\">\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('initial quantity')\">\n <mat-label>Initial Quantity</mat-label>\n <input matInput placeholder=\"Initial Quantity\" formControlName=\"initial_quantity\" />\n <mat-error *ngIf=\"isFieldValid('initial_quantity')\">{{ getErrorMessage('initial_quantity') }}\n </mat-error>\n </mat-form-field>\n\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('initial quantity date')\">\n <mat-label>Initial Quantity Date</mat-label>\n <input matInput [matDatepicker]=\"pickerInitialQuantityDate\" placeholder=\"Initial Quantity Date\"\n formControlName=\"initial_quantity_date\" />\n <mat-datepicker-toggle matSuffix [for]=\"pickerInitialQuantityDate\"></mat-datepicker-toggle>\n <mat-datepicker #pickerInitialQuantityDate></mat-datepicker>\n <mat-error *ngIf=\"isFieldValid('initial_quantity_date')\">{{ getErrorMessage('initial_quantity_date') }}\n </mat-error>\n </mat-form-field>\n </div>\n </div>\n <div class=\"d-flex flex-column\" *ngIf=\"isFormSectionShown('sales information')\">\n <h6>Sale Information</h6>\n <div class=\"d-flex gap-2\">\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('sales price')\">\n <mat-label>Selling Price</mat-label>\n <input matInput placeholder=\"Selling Price\" formControlName=\"sale_price\" required type=\"number\"\n step=\"any\" />\n <mat-error *ngIf=\"isFieldValid('sale_price')\">{{ getErrorMessage('sale_price') }} </mat-error>\n </mat-form-field>\n\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('condition types')\">\n <mat-label>Condition</mat-label>\n <app-searchable-selector apiUrl=\"api/condition-types\"\n formControlName=\"condition_type_id\"></app-searchable-selector>\n </mat-form-field>\n </div>\n <div class=\"d-flex gap-2\">\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('minimum price')\">\n <mat-label>Minimum Price</mat-label>\n <input matInput placeholder=\"Minimum Price\" formControlName=\"minimum_price\" required type=\"number\"\n step=\"any\" />\n <mat-error *ngIf=\"isFieldValid('minimum_price')\">{{ getErrorMessage('minimum_price') }} </mat-error>\n </mat-form-field>\n\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('maximum price')\">\n <mat-label>Maximum Price</mat-label>\n <input matInput placeholder=\"Maximum Price\" formControlName=\"maximum_price\" type=\"number\" step=\"any\" />\n </mat-form-field>\n </div>\n </div>\n\n <div class=\"w-100 d-flex justify-content-between\">\n @if (!isUpdate) {\n <mat-checkbox [formControl]=\"isCreateAnother\">Create Another\n <span *ngIf=\"savedCount > 0\">({{ savedCount }} items saved)</span>\n </mat-checkbox>\n } @else {\n <span class='d-flex flex-grow'></span>\n }\n\n <div class=\"d-flex flex-row gap-3 align-items-center justify-content-end\">\n <button [disabled]=\"isWorking\" mat-button class=\"mt-2\" type=\"button\" (click)=\"location.back()\">\n Cancel\n </button>\n <button [disabled]=\"isWorking\" mat-raised-button color=\"primary\" class=\"mt-2\" type=\"submit\">Save</button>\n </div>\n </div>\n </div>\n </form>\n </mat-card-content>\n </mat-card>\n</div>\n} @else {\n<mat-card-content class=\"d-flex vh-100 justify-content-center align-items-center\">\n <mat-spinner></mat-spinner>\n</mat-card-content>\n}", dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i1.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: "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: i7.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: i8.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatLabel, selector: "mat-label" }, { kind: "directive", type: i8.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i8.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { 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.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i11.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i11.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i12.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i12.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i12.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.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: i2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i1.FormConfigurationForFormComponent, selector: "app-form-configuration-for-form", inputs: ["formCode"] }, { kind: "component", type: i1.FileDropperComponent, selector: "app-file-dropper", inputs: ["fileArray", "config", "styles"], outputs: ["fileChanged"] }, { kind: "component", type: i1.DocumentViewerComponent, selector: "app-document-viewer", inputs: ["config", "file", "fileUrl", "disableEdit"], outputs: ["remove"] }], preserveWhitespaces: true });
|
|
197
249
|
}
|
|
198
250
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ProductFormComponent, decorators: [{
|
|
199
251
|
type: Component,
|
|
200
|
-
args: [{ selector: 'app-product-form', template: "
|
|
201
|
-
}], ctorParameters: () => [{ type: i1.
|
|
252
|
+
args: [{ selector: 'app-product-form', template: "@if (isFormSetup()) {\n<div class=\"d-flex flex-column gap-2\">\n <mat-card class='container'>\n <mat-card-content>\n <div class=\"d-flex justify-content-between align-items-center\">\n <span></span>\n <h3 class=\"text-center m-0\">Product Form</h3>\n <app-form-configuration-for-form formCode='product'></app-form-configuration-for-form>\n </div>\n </mat-card-content>\n </mat-card>\n <mat-card class='container'>\n <mat-card-content>\n <form [formGroup]=\"form\" (submit)=\"save()\">\n <div class=\"d-flex flex-column\">\n\n <div class=\"d-flex flex-column justify-content-center align-items-center\">\n <ng-template #fileUpload>\n <div class=\"w-100\">\n <app-file-dropper (fileChanged)=\"fileChanged($event)\" [config]=\"fileConfig\" [fileArray]=\"fileList\">\n </app-file-dropper>\n </div>\n </ng-template>\n <div *ngIf=\"form.get('image_file')?.value; else fileUpload;\" style='width: 200px;'\n class='justify-content-center align-items-center'>\n <app-document-viewer (remove)=\"removeFile()\" [config]=\"viewerConfig\"\n [fileUrl]=\"form.get('image_file_url')?.value\" [file]=\"form.get('image_file')?.value\">\n </app-document-viewer>\n </div>\n </div>\n\n <div class=\"d-flex flex-column mt-2\" *ngIf=\"isFormSectionShown('basic information')\">\n <h6>Basic Information</h6>\n <div class=\"d-flex gap-2\">\n\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('name')\">\n <mat-label>Name</mat-label>\n <input matInput placeholder=\"Name\" formControlName=\"name\" required />\n <mat-error *ngIf=\"isFieldValid('name')\">{{ getErrorMessage('name') }} </mat-error>\n </mat-form-field>\n\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('product type')\">\n <mat-label>Product Type</mat-label>\n <app-searchable-selector apiUrl=\"api/product-types\" formControlName=\"type_id\">\n </app-searchable-selector>\n <mat-error *ngIf=\"isFieldValid('type_id')\">{{ getErrorMessage('type_id') }} </mat-error>\n </mat-form-field>\n </div>\n\n <div class=\"d-flex gap-2\">\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('sku')\">\n <mat-label>SKU</mat-label>\n <input matInput placeholder=\"SKU\" formControlName=\"sku\" />\n <mat-error *ngIf=\"isFieldValid('sku')\">{{ getErrorMessage('sku') }} </mat-error>\n </mat-form-field>\n\n <mat-form-field class=\"w-50\">\n <mat-label>Category</mat-label>\n <app-searchable-selector apiUrl=\"api/product-categories\" formControlName=\"category_ids\"\n [multiple]=\"true\">\n </app-searchable-selector>\n <mat-error *ngIf=\"isFieldValid('category_ids')\">\n {{ getErrorMessage('category_ids') }}\n </mat-error>\n </mat-form-field>\n </div>\n\n <div class=\"d-flex gap-2\">\n <mat-form-field class=\"w-50 align-self-start\"\n *ngIf=\"isFormFieldShown('color') && formConfigurationUtilityService.getFieldEnabled('color_id')\">\n <mat-label>\n Color <sup *ngIf=\"formConfigurationUtilityService.getFieldRequired('color_id')\">*</sup>\n </mat-label>\n <app-searchable-selector apiUrl=\"api/attributes?type_code=color\"\n formControlName=\"color_id\"></app-searchable-selector>\n <mat-error *ngIf=\"isFieldValid('color_id')\">{{getErrorMessage('color_id')}}</mat-error>\n </mat-form-field>\n\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('description')\">\n <mat-label>Description</mat-label>\n <textarea matInput placeholder=\"Description\" formControlName=\"description\"></textarea>\n </mat-form-field>\n </div>\n </div>\n\n <div class=\"d-flex flex-column\" *ngIf=\"isFormSectionShown('inventory information')\">\n <h6>Inventory Information</h6>\n <div class=\"d-flex gap-2\">\n\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('product measure')\">\n <mat-label>Measure</mat-label>\n <app-searchable-selector apiUrl=\"api/product-measures\" formControlName=\"measure_id\">\n </app-searchable-selector>\n <mat-error *ngIf=\"isFieldValid('measure_id')\">{{ getErrorMessage('measure_id') }} </mat-error>\n </mat-form-field>\n\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('reorder point')\">\n <mat-label>Reorder Point</mat-label>\n <input matInput placeholder=\"Reorder Point\" formControlName=\"reorder_point\" type=\"number\" />\n <mat-error *ngIf=\"isFieldValid('reorder_point')\">{{ getErrorMessage('reorder_point') }} </mat-error>\n </mat-form-field>\n </div>\n <div class=\"d-flex gap-2\">\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('initial quantity')\">\n <mat-label>Initial Quantity</mat-label>\n <input matInput placeholder=\"Initial Quantity\" formControlName=\"initial_quantity\" />\n <mat-error *ngIf=\"isFieldValid('initial_quantity')\">{{ getErrorMessage('initial_quantity') }}\n </mat-error>\n </mat-form-field>\n\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('initial quantity date')\">\n <mat-label>Initial Quantity Date</mat-label>\n <input matInput [matDatepicker]=\"pickerInitialQuantityDate\" placeholder=\"Initial Quantity Date\"\n formControlName=\"initial_quantity_date\" />\n <mat-datepicker-toggle matSuffix [for]=\"pickerInitialQuantityDate\"></mat-datepicker-toggle>\n <mat-datepicker #pickerInitialQuantityDate></mat-datepicker>\n <mat-error *ngIf=\"isFieldValid('initial_quantity_date')\">{{ getErrorMessage('initial_quantity_date') }}\n </mat-error>\n </mat-form-field>\n </div>\n </div>\n <div class=\"d-flex flex-column\" *ngIf=\"isFormSectionShown('sales information')\">\n <h6>Sale Information</h6>\n <div class=\"d-flex gap-2\">\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('sales price')\">\n <mat-label>Selling Price</mat-label>\n <input matInput placeholder=\"Selling Price\" formControlName=\"sale_price\" required type=\"number\"\n step=\"any\" />\n <mat-error *ngIf=\"isFieldValid('sale_price')\">{{ getErrorMessage('sale_price') }} </mat-error>\n </mat-form-field>\n\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('condition types')\">\n <mat-label>Condition</mat-label>\n <app-searchable-selector apiUrl=\"api/condition-types\"\n formControlName=\"condition_type_id\"></app-searchable-selector>\n </mat-form-field>\n </div>\n <div class=\"d-flex gap-2\">\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('minimum price')\">\n <mat-label>Minimum Price</mat-label>\n <input matInput placeholder=\"Minimum Price\" formControlName=\"minimum_price\" required type=\"number\"\n step=\"any\" />\n <mat-error *ngIf=\"isFieldValid('minimum_price')\">{{ getErrorMessage('minimum_price') }} </mat-error>\n </mat-form-field>\n\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('maximum price')\">\n <mat-label>Maximum Price</mat-label>\n <input matInput placeholder=\"Maximum Price\" formControlName=\"maximum_price\" type=\"number\" step=\"any\" />\n </mat-form-field>\n </div>\n </div>\n\n <div class=\"w-100 d-flex justify-content-between\">\n @if (!isUpdate) {\n <mat-checkbox [formControl]=\"isCreateAnother\">Create Another\n <span *ngIf=\"savedCount > 0\">({{ savedCount }} items saved)</span>\n </mat-checkbox>\n } @else {\n <span class='d-flex flex-grow'></span>\n }\n\n <div class=\"d-flex flex-row gap-3 align-items-center justify-content-end\">\n <button [disabled]=\"isWorking\" mat-button class=\"mt-2\" type=\"button\" (click)=\"location.back()\">\n Cancel\n </button>\n <button [disabled]=\"isWorking\" mat-raised-button color=\"primary\" class=\"mt-2\" type=\"submit\">Save</button>\n </div>\n </div>\n </div>\n </form>\n </mat-card-content>\n </mat-card>\n</div>\n} @else {\n<mat-card-content class=\"d-flex vh-100 justify-content-center align-items-center\">\n <mat-spinner></mat-spinner>\n</mat-card-content>\n}" }]
|
|
253
|
+
}], ctorParameters: () => [{ type: i1.EntityFileService }, { type: i2.FormBuilder }, { type: i1.FormValidatorService }, { type: i3.ProductService }, { type: i4.ActivatedRoute }, { type: i1.ErrorHandlerService }, { type: i5.Location }, { type: i4.Router }, { type: i1.FormConfigurationFormService }], propDecorators: { displayedFormFields: [{
|
|
202
254
|
type: Input
|
|
203
255
|
}], displayedFormSections: [{
|
|
204
256
|
type: Input
|
|
205
257
|
}] } });
|
|
206
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2ludmVudG9yeS1jb21tb24vc3JjL2xpYi9pbnZlbnRvcnktY29tbW9uL3Byb2R1Y3QvcHJvZHVjdC1mb3JtL3Byb2R1Y3QtZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZlbnRvcnktY29tbW9uL3NyYy9saWIvaW52ZW50b3J5LWNvbW1vbi9wcm9kdWN0L3Byb2R1Y3QtZm9ybS9wcm9kdWN0LWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pFLE9BQU8sRUFBZSxXQUFXLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEUsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFHTCw4QkFBOEIsRUFFOUIsK0JBQStCLEVBQ2hDLE1BQU0sbUJBQW1CLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FBUzNCLE1BQU0sT0FBTyxvQkFBcUIsU0FBUSw4QkFBOEI7SUFtRDVEO0lBQ1c7SUFDQTtJQUNYO0lBQ0E7SUFDRDtJQUNDO0lBQ0E7SUF6REQsbUJBQW1CLEdBQVU7UUFDcEMsTUFBTTtRQUNOLGNBQWM7UUFDZCxLQUFLO1FBQ0wsT0FBTztRQUNQLGFBQWE7UUFDYixpQkFBaUI7UUFDakIsZUFBZTtRQUNmLGtCQUFrQjtRQUNsQix1QkFBdUI7UUFDdkIsYUFBYTtRQUNiLGVBQWU7UUFDZixlQUFlO1FBQ2YsZ0JBQWdCO1FBQ2hCLGlCQUFpQjtLQUNsQixDQUFDO0lBRU8scUJBQXFCLEdBQVU7UUFDdEMsbUJBQW1CO1FBQ25CLHVCQUF1QjtRQUN2QixtQkFBbUI7UUFDbkIsc0JBQXNCO0tBQ3ZCLENBQUM7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U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxnQkFBZ0IsQ0FBQyxTQUFpQjtRQUNoQyxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDN0YsQ0FBQztJQUVEOztPQUVHO0lBQ0gsa0JBQWtCLENBQUMsV0FBbUI7UUFDcEMsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMscUJBQXFCLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ25HLENBQUM7d0dBM0xVLG9CQUFvQjs0RkFBcEIsb0JBQW9CLHVMQ2xCakMsdTBQQXFKVzs7NEZEbklFLG9CQUFvQjtrQkFKaEMsU0FBUzsrQkFDRSxrQkFBa0I7c1NBSW5CLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFpQkcscUJBQXFCO3NCQUE3QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtQ29udHJvbCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCB7XG4gIEVycm9ySGFuZGxlclNlcnZpY2UsXG4gIEZvcm1WYWxpZGF0b3JTZXJ2aWNlLFxuICBUZWNobGlmeUZvcm1Db21wb25lbnRJbnRlcmZhY2UsXG4gIEZvcm1Db25maWd1cmF0aW9uRm9ybVNlcnZpY2UsXG4gIEZvcm1Db25maWd1cmF0aW9uVXRpbGl0eVNlcnZpY2Vcbn0gZnJvbSAnbmd4LXRlY2hsaWZ5LWNvcmUnO1xuaW1wb3J0IHsgUHJvZHVjdFNlcnZpY2UgfSBmcm9tICcuLi9wcm9kdWN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBMb2NhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1wcm9kdWN0LWZvcm0nLFxuICB0ZW1wbGF0ZVVybDogJy4vcHJvZHVjdC1mb3JtLmNvbXBvbmVudC5odG1sJyxcbn0pXG5leHBvcnQgY2xhc3MgUHJvZHVjdEZvcm1Db21wb25lbnQgZXh0ZW5kcyBUZWNobGlmeUZvcm1Db21wb25lbnRJbnRlcmZhY2UgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSBkaXNwbGF5ZWRGb3JtRmllbGRzOiBhbnlbXSA9IFtcbiAgICAnbmFtZScsXG4gICAgJ3Byb2R1Y3QgdHlwZScsXG4gICAgJ3NrdScsXG4gICAgJ2NvbG9yJyxcbiAgICAnZGVzY3JpcHRpb24nLFxuICAgICdwcm9kdWN0IG1lYXN1cmUnLFxuICAgICdyZW9yZGVyIHBvaW50JyxcbiAgICAnaW5pdGlhbCBxdWFudGl0eScsXG4gICAgJ2luaXRpYWwgcXVhbnRpdHkgZGF0ZScsXG4gICAgJ3NhbGVzIHByaWNlJyxcbiAgICAnbWluaW11bSBwcmljZScsXG4gICAgJ21heGltdW0gcHJpY2UnLFxuICAgICdpbmNvbWUgYWNjb3VudCcsXG4gICAgJ2V4cGVuc2UgYWNjb3VudCcsXG4gIF07XG5cbiAgQElucHV0KCkgZGlzcGxheWVkRm9ybVNlY3Rpb25zOiBhbnlbXSA9IFtcbiAgICAnYmFzaWMgaW5mb3JtYXRpb24nLFxuICAgICdpbnZlbnRvcnkgaW5mb3JtYXRpb24nLFxuICAgICdzYWxlcyBpbmZvcm1hdGlvbicsXG4gICAgJ2FjY291bnRzIGluZm9ybWF0aW9uJyxcbiAgXTtcblxuICBwcm9kdWN0ID0gc2lnbmFsPGFueT4obnVsbCk7XG4gIGlzRm9ybVNldHVwID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcblxuICBvdmVycmlkZSBlcnJvck1lc3NhZ2VzOiBhbnkgPSB7XG4gICAgdHlwZV9pZDoge1xuICAgICAgcmVxdWlyZWQ6ICdQbGVhc2UgRW50ZXIgVHlwZScsXG4gICAgfSxcbiAgICBuYW1lOiB7XG4gICAgICByZXF1aXJlZDogJ1BsZWFzZSBFbnRlciBOYW1lJyxcbiAgICB9LFxuICAgIHNhbGVfcHJpY2U6IHtcbiAgICAgIHJlcXVpcmVkOiAnUGxlYXNlIEVudGVyIFNhbGVzIFByaWNlJyxcbiAgICB9LFxuICAgIG1pbmltdW1fcHJpY2U6IHtcbiAgICAgIHJlcXVpcmVkOiAnUGxlYXNlIEVudGVyIE1pbmltdW0gUHJpY2UnLFxuICAgIH0sXG4gICAgcmVvcmRlcl9wb2ludDoge1xuICAgICAgcmVxdWlyZWQ6ICdQbGVhc2UgRW50ZXIgUmVvcmRlciBQb2ludCcsXG4gICAgfSxcbiAgfTtcblxuICBpc0NyZWF0ZUFub3RoZXIgPSBuZXcgRm9ybUNvbnRyb2woZmFsc2UpO1xuICBzYXZlZENvdW50ID0gMDtcbiAgcHVibGljIGZvcm1Db25maWd1cmF0aW9uVXRpbGl0eVNlcnZpY2U6IEZvcm1Db25maWd1cmF0aW9uVXRpbGl0eVNlcnZpY2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIGZvcm1WYWxpZGF0b3JTZXJ2aWNlOiBGb3JtVmFsaWRhdG9yU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc2VydmljZTogUHJvZHVjdFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJpdmF0ZSBlcnJvckhhbmRsZXI6IEVycm9ySGFuZGxlclNlcnZpY2UsXG4gICAgcHVibGljIGxvY2F0aW9uOiBMb2NhdGlvbixcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgZm9ybUNvbmZpZ1NlcnZpY2U6IEZvcm1Db25maWd1cmF0aW9uRm9ybVNlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIoZm9ybVZhbGlkYXRvclNlcnZpY2UpO1xuXG4gICAgdGhpcy5mb3JtQ29uZmlndXJhdGlvblV0aWxpdHlTZXJ2aWNlID0gbmV3IEZvcm1Db25maWd1cmF0aW9uVXRpbGl0eVNlcnZpY2UoKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuZm9ybUNvbmZpZ3VyYXRpb25VdGlsaXR5U2VydmljZVxuICAgICAgLmluaXRpYWxpemUodGhpcy5mb3JtQ29uZmlnU2VydmljZSwgJ3Byb2R1Y3QnLClcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMuZm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICAgICAgaWQ6IFsnJ10sXG4gICAgICAgICAgICB0eXBlX2lkOiBbMSwgVmFsaWRhdG9ycy5jb21wb3NlKFtWYWxpZGF0b3JzLnJlcXVpcmVkXSldLFxuICAgICAgICAgICAgY29sb3JfaWQ6IFsnJ10sXG4gICAgICAgICAgICBza3U6IFsnJ10sXG4gICAgICAgICAgICBuYW1lOiBbJycsIFZhbGlkYXRvcnMuY29tcG9zZShbVmFsaWRhdG9ycy5yZXF1aXJlZF0pXSxcbiAgICAgICAgICAgIGluaXRpYWxfcXVhbnRpdHk6IFswXSxcbiAgICAgICAgICAgIGluaXRpYWxfcXVhbnRpdHlfZGF0ZTogW21vbWVudCgpLmZvcm1hdCgpXSxcbiAgICAgICAgICAgIHJlb3JkZXJfcG9pbnQ6IFsxMCwgVmFsaWRhdG9ycy5jb21wb3NlKFtWYWxpZGF0b3JzLnJlcXVpcmVkXSldLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IFsnJ10sXG4gICAgICAgICAgICBzYWxlX3ByaWNlOiBbMCwgVmFsaWRhdG9ycy5jb21wb3NlKFtWYWxpZGF0b3JzLnJlcXVpcmVkXSldLFxuICAgICAgICAgICAgaW5jb21lX2FjY291bnRfaWQ6IFsnJ10sXG4gICAgICAgICAgICBleHBlbnNlX2FjY291bnRfaWQ6IFsnJ10sXG4gICAgICAgICAgICBtZWFzdXJlX2lkOiBbMV0sXG4gICAgICAgICAgICBtaW5pbXVtX3ByaWNlOiBbJycsIFZhbGlkYXRvcnMuY29tcG9zZShbVmFsaWRhdG9ycy5yZXF1aXJlZF0pXSxcbiAgICAgICAgICAgIG1heGltdW1fcHJpY2U6IFsnJ10sXG4gICAgICAgICAgICBjb25kaXRpb25fdHlwZV9pZDogWzFdLFxuICAgICAgICAgICAgY3VycmVudF9xdWFudGl0eTogW10sXG4gICAgICAgICAgICBjYXRlZ29yeV9pZHM6IFsnJ10sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sIGVycm9yOiAoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMuZXJyb3JIYW5kbGVyLmhhbmRsZUVycm9yKGVycm9yKTtcbiAgICAgICAgfSwgY29tcGxldGU6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLmlzRm9ybVNldHVwLnNldCh0cnVlKTtcbiAgICAgICAgICB0aGlzLmxvYWRQcm9kdWN0KCk7XG4gICAgICAgIH1cbiAgICAgIH0pXG5cblxuICB9XG5cbiAgbG9hZFByb2R1Y3QoKSB7XG4gICAgbGV0IGlkID0gdGhpcy5hY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5wYXJhbXNbJ2lkJ107XG4gICAgaWYgKCFpZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmlzV29ya2luZyA9IHRydWU7XG5cbiAgICB0aGlzLnNlcnZpY2U/LnNob3coaWQsIHtcbiAgICAgIHdpdGg6ICdtZWFzdXJlLGNhdGVnb3JpZXMnLFxuICAgIH0pLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnByb2R1Y3Quc2V0KHJlc3BvbnNlPy5pdGVtKTtcbiAgICAgICAgdGhpcy5pc1dvcmtpbmcgPSBmYWxzZTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycm9yOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5pc1dvcmtpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5lcnJvckhhbmRsZXIuaGFuZGxlRXJyb3IoZXJyb3IpO1xuICAgICAgfSxcbiAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XG4gICAgICAgIHRoaXMucGF0Y2hQcm9kdWN0KCk7XG4gICAgICAgIHRoaXMuaXNXb3JraW5nID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHBhdGNoUHJvZHVjdCgpIHtcbiAgICB0aGlzLmlzVXBkYXRlID0gdHJ1ZTtcbiAgICBsZXQgZGF0YSA9IHsgLi4udGhpcy5wcm9kdWN0KCkgfTtcblxuICAgIGlmICh0aGlzLnByb2R1Y3QoKT8uY2F0ZWdvcmllcz8ubGVuZ3RoID4gMCkge1xuICAgICAgKGRhdGEpLmNhdGVnb3J5X2lkcyA9ICh0aGlzLnByb2R1Y3QoKS5jYXRlZ29yaWVzIGFzIFtdKS5tYXAoKGNhdGVnb3J5OiBhbnkpID0+IGNhdGVnb3J5Py5pZCk7XG4gICAgfVxuICAgIGlmIChkYXRhPy5pbml0aWFsX3F1YW50aXR5X2RhdGUpIHtcbiAgICAgIGRhdGEuaW5pdGlhbF9xdWFudGl0eV9kYXRlID0gbW9tZW50KGRhdGEuaW5pdGlhbF9xdWFudGl0eV9kYXRlKS50b0lTT1N0cmluZygpO1xuICAgIH1cbiAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZShkYXRhKTtcbiAgfVxuXG4gIGFzeW5jIHNhdmUoKSB7XG4gICAgdGhpcy5mb3JtLm1hcmtBbGxBc1RvdWNoZWQoKTtcbiAgICBpZiAodGhpcy5mb3JtLmludmFsaWQpIHtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmFkZEFsZXJ0KCdQbGVhc2UgRmlsbCBBbGwgUmVxdWlyZWQgRmllbGRzJywgJ3dhcm4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IHByb2R1Y3QgPSB0aGlzLmZvcm0udmFsdWU7XG4gICAgaWYgKHByb2R1Y3QubWF4aW11bV9wcmljZSA8PSAwIHx8ICFwcm9kdWN0Lm1heGltdW1fcHJpY2UpIHtcbiAgICAgIHByb2R1Y3QubWF4aW11bV9wcmljZSA9IHByb2R1Y3QubWluaW11bV9wcmljZTtcbiAgICB9XG5cbiAgICBpZiAocHJvZHVjdD8uaW5pdGlhbF9xdWFudGl0eV9kYXRlKSB7XG4gICAgICBwcm9kdWN0LmluaXRpYWxfcXVhbnRpdHlfZGF0ZSA9IG1vbWVudChwcm9kdWN0LmluaXRpYWxfcXVhbnRpdHlfZGF0ZSkuZm9ybWF0KCdZWVlZLU1NLUREJyk7XG4gICAgfVxuICAgIHRoaXMuaXNXb3JraW5nID0gdHJ1ZTtcblxuICAgIGxldCBwcm9taXNlID0gcHJvZHVjdC5pZFxuICAgICAgPyB0aGlzLnNlcnZpY2UudXBkYXRlKHByb2R1Y3QpXG4gICAgICA6IHRoaXMuc2VydmljZS5zdG9yZShwcm9kdWN0KTtcblxuICAgIHByb21pc2Uuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgdGhpcy5pc1dvcmtpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYWRkQWxlcnQoJ1Byb2R1Y3Qgc2F2ZWQgc3VjY2Vzc2Z1bGx5IScsICdzdWNjZXNzJyk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+ICh0aGlzLmlzV29ya2luZyA9IGZhbHNlKSxcbiAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmlzQ3JlYXRlQW5vdGhlci52YWx1ZSAmJiAhdGhpcy5pc1VwZGF0ZSkge1xuICAgICAgICAgIHRoaXMuc2F2ZWRDb3VudCsrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2ludmVudG9yeS9wcm9kdWN0cyddKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBkaXNwbGF5ZWQgRm9ybSBGaWVsZHMgYXJyYXkgZm9yIGZvcm0gZmllbGQgYW5kIHJldHVybnMgYm9vbGVhbiByZXN1bHRcbiAgICovXG4gIGlzRm9ybUZpZWxkU2hvd24oZmllbGROYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kaXNwbGF5ZWRGb3JtRmllbGRzLmxlbmd0aCA+IDAgJiYgdGhpcy5kaXNwbGF5ZWRGb3JtRmllbGRzLmluY2x1ZGVzKGZpZWxkTmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGRpc3BsYXllZCBGb3JtIFNlY3Rpb24gYXJyYXkgZm9yIGZvcm0gc2VjdGlvbiBhbmQgcmV0dXJucyBib29sZWFuIHJlc3VsdFxuICAgKi9cbiAgaXNGb3JtU2VjdGlvblNob3duKHNlY3Rpb25OYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kaXNwbGF5ZWRGb3JtU2VjdGlvbnMubGVuZ3RoID4gMCAmJiB0aGlzLmRpc3BsYXllZEZvcm1TZWN0aW9ucy5pbmNsdWRlcyhzZWN0aW9uTmFtZSk7XG4gIH1cbn1cbiIsIjxtYXQtY2FyZCBjbGFzcz0nY29udGFpbmVyJz5cbiAgQGlmIChpc0Zvcm1TZXR1cCgpKSB7XG4gIDxtYXQtY2FyZC1jb250ZW50PlxuICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVwiIChzdWJtaXQpPVwic2F2ZSgpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgIDxoMyBjbGFzcz1cInRleHQtY2VudGVyIG0tMFwiPlByb2R1Y3QgRm9ybTwvaDM+XG4gICAgICAgIDxpIHJvbGU9J2J1dHRvbicgY2xhc3M9XCJmYS1zb2xpZCBmYS1nZWFyXCIgcm91dGVyTGluaz1cIi9mb3JtLWNvbmZpZ3VyYXRpb24tZmllbGQtZm9ybS9wcm9kdWN0XCI+PC9pPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW5cIiAqbmdJZj1cImlzRm9ybVNlY3Rpb25TaG93bignYmFzaWMgaW5mb3JtYXRpb24nKVwiPlxuICAgICAgICAgIDxoMz48c3Ryb25nPkJhc2ljIEluZm9ybWF0aW9uPC9zdHJvbmc+PC9oMz5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0yXCI+XG5cbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cInctNTBcIiAqbmdJZj1cImlzRm9ybUZpZWxkU2hvd24oJ25hbWUnKVwiPlxuICAgICAgICAgICAgICA8bWF0LWxhYmVsPk5hbWU8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IHBsYWNlaG9sZGVyPVwiTmFtZVwiIGZvcm1Db250cm9sTmFtZT1cIm5hbWVcIiByZXF1aXJlZCAvPlxuICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiaXNGaWVsZFZhbGlkKCduYW1lJylcIj57eyBnZXRFcnJvck1lc3NhZ2UoJ25hbWUnKSB9fSA8L21hdC1lcnJvcj5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cInctNTBcIiAqbmdJZj1cImlzRm9ybUZpZWxkU2hvd24oJ3Byb2R1Y3QgdHlwZScpXCI+XG4gICAgICAgICAgICAgIDxtYXQtbGFiZWw+UHJvZHVjdCBUeXBlPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgIDxhcHAtc2VhcmNoYWJsZS1zZWxlY3RvciBhcGlVcmw9XCJhcGkvcHJvZHVjdC10eXBlc1wiIGZvcm1Db250cm9sTmFtZT1cInR5cGVfaWRcIj4gPC9hcHAtc2VhcmNoYWJsZS1zZWxlY3Rvcj5cbiAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImlzRmllbGRWYWxpZCgndHlwZV9pZCcpXCI+e3sgZ2V0RXJyb3JNZXNzYWdlKCd0eXBlX2lkJykgfX0gPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtMlwiPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwidy01MFwiICpuZ0lmPVwiaXNGb3JtRmllbGRTaG93bignc2t1JylcIj5cbiAgICAgICAgICAgICAgPG1hdC1sYWJlbD5TS1U8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IHBsYWNlaG9sZGVyPVwiU0tVXCIgZm9ybUNvbnRyb2xOYW1lPVwic2t1XCIgLz5cbiAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImlzRmllbGRWYWxpZCgnc2t1JylcIj57eyBnZXRFcnJvck1lc3NhZ2UoJ3NrdScpIH19IDwvbWF0LWVycm9yPlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwidy01MFwiPlxuICAgICAgICAgICAgICA8bWF0LWxhYmVsPkNhdGVnb3J5PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgIDxhcHAtc2VhcmNoYWJsZS1zZWxlY3RvciBhcGlVcmw9XCJhcGkvcHJvZHVjdC1jYXRlZ29yaWVzXCIgZm9ybUNvbnRyb2xOYW1lPVwiY2F0ZWdvcnlfaWRzXCIgW211bHRpcGxlXT1cInRydWVcIj5cbiAgICAgICAgICAgICAgPC9hcHAtc2VhcmNoYWJsZS1zZWxlY3Rvcj5cbiAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImlzRmllbGRWYWxpZCgnY2F0ZWdvcnlfaWRzJylcIj5cbiAgICAgICAgICAgICAgICB7eyBnZXRFcnJvck1lc3NhZ2UoJ2NhdGVnb3J5X2lkcycpIH19XG4gICAgICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTJcIj5cbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cInctNTAgYWxpZ24tc2VsZi1zdGFydFwiXG4gICAgICAgICAgICAgICpuZ0lmPVwiaXNGb3JtRmllbGRTaG93bignY29sb3InKSAmJiBmb3JtQ29uZmlndXJhdGlvblV0aWxpdHlTZXJ2aWNlLmdldEZpZWxkRW5hYmxlZCgnY29sb3JfaWQnKVwiPlxuICAgICAgICAgICAgICA8bWF0LWxhYmVsPkNvbG9yPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgIDxhcHAtc2VhcmNoYWJsZS1zZWxlY3RvciBhcGlVcmw9XCJhcGkvYXR0cmlidXRlcz90eXBlX2NvZGU9Y29sb3JcIlxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImNvbG9yX2lkXCI+PC9hcHAtc2VhcmNoYWJsZS1zZWxlY3Rvcj5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cInctNTBcIiAqbmdJZj1cImlzRm9ybUZpZWxkU2hvd24oJ2Rlc2NyaXB0aW9uJylcIj5cbiAgICAgICAgICAgICAgPG1hdC1sYWJlbD5EZXNjcmlwdGlvbjwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICA8dGV4dGFyZWEgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XCJEZXNjcmlwdGlvblwiIGZvcm1Db250cm9sTmFtZT1cImRlc2NyaXB0aW9uXCI+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW5cIiAqbmdJZj1cImlzRm9ybVNlY3Rpb25TaG93bignaW52ZW50b3J5IGluZm9ybWF0aW9uJylcIj5cbiAgICAgICAgICA8aDM+PHN0cm9uZz5JbnZlbnRvcnkgSW5mb3JtYXRpb248L3N0cm9uZz48L2gzPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTJcIj5cblxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwidy01MFwiICpuZ0lmPVwiaXNGb3JtRmllbGRTaG93bigncHJvZHVjdCBtZWFzdXJlJylcIj5cbiAgICAgICAgICAgICAgPG1hdC1sYWJlbD5NZWFzdXJlPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgIDxhcHAtc2VhcmNoYWJsZS1zZWxlY3RvciBhcGlVcmw9XCJhcGkvcHJvZHVjdC1tZWFzdXJlc1wiIGZvcm1Db250cm9sTmFtZT1cIm1lYXN1cmVfaWRcIj5cbiAgICAgICAgICAgICAgPC9hcHAtc2VhcmNoYWJsZS1zZWxlY3Rvcj5cbiAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImlzRmllbGRWYWxpZCgnbWVhc3VyZV9pZCcpXCI+e3sgZ2V0RXJyb3JNZXNzYWdlKCdtZWFzdXJlX2lkJykgfX0gPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJ3LTUwXCIgKm5nSWY9XCJpc0Zvcm1GaWVsZFNob3duKCdyZW9yZGVyIHBvaW50JylcIj5cbiAgICAgICAgICAgICAgPG1hdC1sYWJlbD5SZW9yZGVyIFBvaW50PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cIlJlb3JkZXIgUG9pbnRcIiBmb3JtQ29udHJvbE5hbWU9XCJyZW9yZGVyX3BvaW50XCIgdHlwZT1cIm51bWJlclwiIC8+XG4gICAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJpc0ZpZWxkVmFsaWQoJ3Jlb3JkZXJfcG9pbnQnKVwiPnt7IGdldEVycm9yTWVzc2FnZSgncmVvcmRlcl9wb2ludCcpIH19IDwvbWF0LWVycm9yPlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0yXCI+XG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJ3LTUwXCIgKm5nSWY9XCJpc0Zvcm1GaWVsZFNob3duKCdpbml0aWFsIHF1YW50aXR5JylcIj5cbiAgICAgICAgICAgICAgPG1hdC1sYWJlbD5Jbml0aWFsIFF1YW50aXR5PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cIkluaXRpYWwgUXVhbnRpdHlcIiBmb3JtQ29udHJvbE5hbWU9XCJpbml0aWFsX3F1YW50aXR5XCIgLz5cbiAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImlzRmllbGRWYWxpZCgnaW5pdGlhbF9xdWFudGl0eScpXCI+e3sgZ2V0RXJyb3JNZXNzYWdlKCdpbml0aWFsX3F1YW50aXR5JykgfX0gPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJ3LTUwXCIgKm5nSWY9XCJpc0Zvcm1GaWVsZFNob3duKCdpbml0aWFsIHF1YW50aXR5IGRhdGUnKVwiPlxuICAgICAgICAgICAgICA8bWF0LWxhYmVsPkluaXRpYWwgUXVhbnRpdHkgRGF0ZTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgW21hdERhdGVwaWNrZXJdPVwicGlja2VySW5pdGlhbFF1YW50aXR5RGF0ZVwiIHBsYWNlaG9sZGVyPVwiSW5pdGlhbCBRdWFudGl0eSBEYXRlXCJcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJpbml0aWFsX3F1YW50aXR5X2RhdGVcIiAvPlxuICAgICAgICAgICAgICA8bWF0LWRhdGVwaWNrZXItdG9nZ2xlIG1hdFN1ZmZpeCBbZm9yXT1cInBpY2tlckluaXRpYWxRdWFudGl0eURhdGVcIj48L21hdC1kYXRlcGlja2VyLXRvZ2dsZT5cbiAgICAgICAgICAgICAgPG1hdC1kYXRlcGlja2VyICNwaWNrZXJJbml0aWFsUXVhbnRpdHlEYXRlPjwvbWF0LWRhdGVwaWNrZXI+XG4gICAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJpc0ZpZWxkVmFsaWQoJ2luaXRpYWxfcXVhbnRpdHlfZGF0ZScpXCI+e3sgZ2V0RXJyb3JNZXNzYWdlKCdpbml0aWFsX3F1YW50aXR5X2RhdGUnKSB9fVxuICAgICAgICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uXCIgKm5nSWY9XCJpc0Zvcm1TZWN0aW9uU2hvd24oJ3NhbGVzIGluZm9ybWF0aW9uJylcIj5cbiAgICAgICAgICA8aDM+PHN0cm9uZz5TYWxlIEluZm9ybWF0aW9uPC9zdHJvbmc+PC9oMz5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0yXCI+XG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJ3LTUwXCIgKm5nSWY9XCJpc0Zvcm1GaWVsZFNob3duKCdzYWxlcyBwcmljZScpXCI+XG4gICAgICAgICAgICAgIDxtYXQtbGFiZWw+U2VsbGluZyBQcmljZTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XCJTZWxsaW5nIFByaWNlXCIgZm9ybUNvbnRyb2xOYW1lPVwic2FsZV9wcmljZVwiIHJlcXVpcmVkIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICAgIHN0ZXA9XCJhbnlcIiAvPlxuICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiaXNGaWVsZFZhbGlkKCdzYWxlX3ByaWNlJylcIj57eyBnZXRFcnJvck1lc3NhZ2UoJ3NhbGVfcHJpY2UnKSB9fSA8L21hdC1lcnJvcj5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cInctNTBcIiAqbmdJZj1cImlzRm9ybUZpZWxkU2hvd24oJ2NvbmRpdGlvbiB0eXBlcycpXCI+XG4gICAgICAgICAgICAgIDxtYXQtbGFiZWw+Q29uZGl0aW9uPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgIDxhcHAtc2VhcmNoYWJsZS1zZWxlY3RvciBhcGlVcmw9XCJhcGkvY29uZGl0aW9uLXR5cGVzXCJcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJjb25kaXRpb25fdHlwZV9pZFwiPjwvYXBwLXNlYXJjaGFibGUtc2VsZWN0b3I+XG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTJcIj5cbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cInctNTBcIiAqbmdJZj1cImlzRm9ybUZpZWxkU2hvd24oJ21pbmltdW0gcHJpY2UnKVwiPlxuICAgICAgICAgICAgICA8bWF0LWxhYmVsPk1pbmltdW0gUHJpY2U8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IHBsYWNlaG9sZGVyPVwiTWluaW11bSBQcmljZVwiIGZvcm1Db250cm9sTmFtZT1cIm1pbmltdW1fcHJpY2VcIiByZXF1aXJlZCB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgICBzdGVwPVwiYW55XCIgLz5cbiAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImlzRmllbGRWYWxpZCgnbWluaW11bV9wcmljZScpXCI+e3sgZ2V0RXJyb3JNZXNzYWdlKCdtaW5pbXVtX3ByaWNlJykgfX0gPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJ3LTUwXCIgKm5nSWY9XCJpc0Zvcm1GaWVsZFNob3duKCdtYXhpbXVtIHByaWNlJylcIj5cbiAgICAgICAgICAgICAgPG1hdC1sYWJlbD5NYXhpbXVtIFByaWNlPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cIk1heGltdW0gUHJpY2VcIiBmb3JtQ29udHJvbE5hbWU9XCJtYXhpbXVtX3ByaWNlXCIgdHlwZT1cIm51bWJlclwiIHN0ZXA9XCJhbnlcIiAvPlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cInctMTAwIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiPlxuICAgICAgICAgIEBpZiAoIWlzVXBkYXRlKSB7XG4gICAgICAgICAgPG1hdC1jaGVja2JveCBbZm9ybUNvbnRyb2xdPVwiaXNDcmVhdGVBbm90aGVyXCI+Q3JlYXRlIEFub3RoZXJcbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic2F2ZWRDb3VudCA+IDBcIj4oe3sgc2F2ZWRDb3VudCB9fSBpdGVtcyBzYXZlZCk8L3NwYW4+XG4gICAgICAgICAgPC9tYXQtY2hlY2tib3g+XG4gICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPHNwYW4gY2xhc3M9J2QtZmxleCBmbGV4LWdyb3cnPjwvc3Bhbj5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtcm93IGdhcC0zIGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XG4gICAgICAgICAgICA8YnV0dG9uIFtkaXNhYmxlZF09XCJpc1dvcmtpbmdcIiBtYXQtYnV0dG9uIGNsYXNzPVwibXQtMlwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwibG9jYXRpb24uYmFjaygpXCI+XG4gICAgICAgICAgICAgIENhbmNlbFxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIFtkaXNhYmxlZF09XCJpc1dvcmtpbmdcIiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiBjbGFzcz1cIm10LTJcIiB0eXBlPVwic3VibWl0XCI+U2F2ZTwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZm9ybT5cbiAgPC9tYXQtY2FyZC1jb250ZW50PlxuICB9IEBlbHNlIHtcbiAgPG1hdC1jYXJkLWNvbnRlbnQgY2xhc3M9XCJkLWZsZXggdmgtMTAwIGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgPG1hdC1zcGlubmVyPjwvbWF0LXNwaW5uZXI+XG4gIDwvbWF0LWNhcmQtY29udGVudD5cbiAgfVxuPC9tYXQtY2FyZD4iXX0=
|
|
258
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2ludmVudG9yeS1jb21tb24vc3JjL2xpYi9pbnZlbnRvcnktY29tbW9uL3Byb2R1Y3QvcHJvZHVjdC1mb3JtL3Byb2R1Y3QtZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZlbnRvcnktY29tbW9uL3NyYy9saWIvaW52ZW50b3J5LWNvbW1vbi9wcm9kdWN0L3Byb2R1Y3QtZm9ybS9wcm9kdWN0LWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pFLE9BQU8sRUFBZSxXQUFXLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEUsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFHTCw4QkFBOEIsRUFFOUIsK0JBQStCLEVBS2hDLE1BQU0sbUJBQW1CLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FBUzNCLE1BQU0sT0FBTyxvQkFBcUIsU0FBUSw4QkFBOEI7SUEwRDVEO0lBQ0E7SUFDVztJQUNBO0lBQ1g7SUFDQTtJQUNEO0lBQ0M7SUFDQTtJQWpFRCxtQkFBbUIsR0FBVTtRQUNwQyxNQUFNO1FBQ04sY0FBYztRQUNkLEtBQUs7UUFDTCxPQUFPO1FBQ1AsYUFBYTtRQUNiLGlCQUFpQjtRQUNqQixlQUFlO1FBQ2Ysa0JBQWtCO1FBQ2xCLHVCQUF1QjtRQUN2QixhQUFhO1FBQ2IsZUFBZTtRQUNmLGVBQWU7UUFDZixnQkFBZ0I7UUFDaEIsaUJBQWlCO0tBQ2xCLENBQUM7SUFFTyxxQkFBcUIsR0FBVTtRQUN0QyxtQkFBbUI7UUFDbkIsdUJBQXVCO1FBQ3ZCLG1CQUFtQjtRQUNuQixzQkFBc0I7S0FDdkIs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QUFDO1lBQ3pFLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQzt3R0FuUFUsb0JBQW9COzRGQUFwQixvQkFBb0IsdUxDdEJqQyw0clNBaUxDOzs0RkQzSlksb0JBQW9CO2tCQUpoQyxTQUFTOytCQUNFLGtCQUFrQjtzVUFJbkIsbUJBQW1CO3NCQUEzQixLQUFLO2dCQWlCRyxxQkFBcUI7c0JBQTdCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Db250cm9sLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHtcbiAgRXJyb3JIYW5kbGVyU2VydmljZSxcbiAgRm9ybVZhbGlkYXRvclNlcnZpY2UsXG4gIFRlY2hsaWZ5Rm9ybUNvbXBvbmVudEludGVyZmFjZSxcbiAgRm9ybUNvbmZpZ3VyYXRpb25Gb3JtU2VydmljZSxcbiAgRm9ybUNvbmZpZ3VyYXRpb25VdGlsaXR5U2VydmljZSxcbiAgRmlsZURyb3BwZXJDb25maWcsXG4gIFZpZXdlckNvbmZpZyxcbiAgSHR0cFNlcnZpY2UsXG4gIEVudGl0eUZpbGVTZXJ2aWNlXG59IGZyb20gJ25neC10ZWNobGlmeS1jb3JlJztcbmltcG9ydCB7IFByb2R1Y3RTZXJ2aWNlIH0gZnJvbSAnLi4vcHJvZHVjdC5zZXJ2aWNlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgTG9jYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtcHJvZHVjdC1mb3JtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3Byb2R1Y3QtZm9ybS5jb21wb25lbnQuaHRtbCcsXG59KVxuZXhwb3J0IGNsYXNzIFByb2R1Y3RGb3JtQ29tcG9uZW50IGV4dGVuZHMgVGVjaGxpZnlGb3JtQ29tcG9uZW50SW50ZXJmYWNlIGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgZGlzcGxheWVkRm9ybUZpZWxkczogYW55W10gPSBbXG4gICAgJ25hbWUnLFxuICAgICdwcm9kdWN0IHR5cGUnLFxuICAgICdza3UnLFxuICAgICdjb2xvcicsXG4gICAgJ2Rlc2NyaXB0aW9uJyxcbiAgICAncHJvZHVjdCBtZWFzdXJlJyxcbiAgICAncmVvcmRlciBwb2ludCcsXG4gICAgJ2luaXRpYWwgcXVhbnRpdHknLFxuICAgICdpbml0aWFsIHF1YW50aXR5IGRhdGUnLFxuICAgICdzYWxlcyBwcmljZScsXG4gICAgJ21pbmltdW0gcHJpY2UnLFxuICAgICdtYXhpbXVtIHByaWNlJyxcbiAgICAnaW5jb21lIGFjY291bnQnLFxuICAgICdleHBlbnNlIGFjY291bnQnLFxuICBdO1xuXG4gIEBJbnB1dCgpIGRpc3BsYXllZEZvcm1TZWN0aW9uczogYW55W10gPSBbXG4gICAgJ2Jhc2ljIGluZm9ybWF0aW9uJyxcbiAgICAnaW52ZW50b3J5IGluZm9ybWF0aW9uJyxcbiAgICAnc2FsZXMgaW5mb3JtYXRpb24nLFxuICAgICdhY2NvdW50cyBpbmZvcm1hdGlvbicsXG4gIF07XG5cbiAgcHJvZHVjdCA9IHNpZ25hbDxhbnk+KG51bGwpO1xuICBpc0Zvcm1TZXR1cCA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG5cbiAgb3ZlcnJpZGUgZXJyb3JNZXNzYWdlczogYW55ID0ge1xuICAgIHR5cGVfaWQ6IHtcbiAgICAgIHJlcXVpcmVkOiAnUGxlYXNlIEVudGVyIFR5cGUnLFxuICAgIH0sXG4gICAgbmFtZToge1xuICAgICAgcmVxdWlyZWQ6ICdQbGVhc2UgRW50ZXIgTmFtZScsXG4gICAgfSxcbiAgICBzYWxlX3ByaWNlOiB7XG4gICAgICByZXF1aXJlZDogJ1BsZWFzZSBFbnRlciBTYWxlcyBQcmljZScsXG4gICAgfSxcbiAgICBtaW5pbXVtX3ByaWNlOiB7XG4gICAgICByZXF1aXJlZDogJ1BsZWFzZSBFbnRlciBNaW5pbXVtIFByaWNlJyxcbiAgICB9LFxuICAgIHJlb3JkZXJfcG9pbnQ6IHtcbiAgICAgIHJlcXVpcmVkOiAnUGxlYXNlIEVudGVyIFJlb3JkZXIgUG9pbnQnLFxuICAgIH0sXG4gICAgY29sb3JfaWQ6IHtcbiAgICAgIHJlcXVpcmVkOiAnUGxlYXNlIFNlbGVjdCBDb2xvcicsXG4gICAgfSxcbiAgfTtcblxuICBpc0NyZWF0ZUFub3RoZXIgPSBuZXcgRm9ybUNvbnRyb2woZmFsc2UpO1xuICBzYXZlZENvdW50ID0gMDtcbiAgcHVibGljIGZvcm1Db25maWd1cmF0aW9uVXRpbGl0eVNlcnZpY2U6IEZvcm1Db25maWd1cmF0aW9uVXRpbGl0eVNlcnZpY2U7XG5cbiAgZmlsZUNvbmZpZyE6IEZpbGVEcm9wcGVyQ29uZmlnO1xuICB2aWV3ZXJDb25maWchOiBWaWV3ZXJDb25maWc7XG4gIGZpbGVMaXN0OiBhbnlbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZmlsZVNlcnZpY2U6IEVudGl0eUZpbGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBmb3JtVmFsaWRhdG9yU2VydmljZTogRm9ybVZhbGlkYXRvclNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIHNlcnZpY2U6IFByb2R1Y3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgZXJyb3JIYW5kbGVyOiBFcnJvckhhbmRsZXJTZXJ2aWNlLFxuICAgIHB1YmxpYyBsb2NhdGlvbjogTG9jYXRpb24sXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIGZvcm1Db25maWdTZXJ2aWNlOiBGb3JtQ29uZmlndXJhdGlvbkZvcm1TZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKGZvcm1WYWxpZGF0b3JTZXJ2aWNlKTtcblxuICAgIHRoaXMuZm9ybUNvbmZpZ3VyYXRpb25VdGlsaXR5U2VydmljZSA9IG5ldyBGb3JtQ29uZmlndXJhdGlvblV0aWxpdHlTZXJ2aWNlKCk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmZpbGVDb25maWcgPSB7XG4gICAgICBmaWxlSWQ6ICdwcm9kdWN0SW1hZ2VGaWxlJyxcbiAgICAgIGNvbnRhaW5lcklkOiAncHJvZHVjdEltYWdlRmlsZUNvbnRhaW5lcicsXG4gICAgICBzdHlsZXM6IHtcbiAgICAgICAgaGVpZ2h0OiAnMjAwcHgnXG4gICAgICB9LFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgYWNjZXB0RmlsZTogJ2ltYWdlLyonLFxuICAgICAgbWF4U2l6ZTogMTAsXG4gICAgICBhY2NlcHRGaWxlVGV4dDogJ1BORywgSlBFRywgYW5kIEpQRyBvbmx5J1xuICAgIH07XG5cbiAgICB0aGlzLnZpZXdlckNvbmZpZyA9IHtcbiAgICAgIHZpZXdlclN0eWxlOiB7XG4gICAgICAgIGhlaWdodDogJzUwcHgnLFxuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLmZvcm1Db25maWd1cmF0aW9uVXRpbGl0eVNlcnZpY2VcbiAgICAgIC5pbml0aWFsaXplKHRoaXMuZm9ybUNvbmZpZ1NlcnZpY2UsICdwcm9kdWN0JywpXG4gICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLmZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgICAgIGlkOiBbJyddLFxuICAgICAgICAgICAgdHlwZV9pZDogWzEsIFZhbGlkYXRvcnMuY29tcG9zZShbVmFsaWRhdG9ycy5yZXF1aXJlZF0pXSxcbiAgICAgICAgICAgIGNvbG9yX2lkOiBbJycsIHRoaXMuZm9ybUNvbmZpZ3VyYXRpb25VdGlsaXR5U2VydmljZS5nZXRGaWVsZFJlcXVpcmVkKCdjb2xvcl9pZCcpID8gVmFsaWRhdG9ycy5yZXF1aXJlZCA6IG51bGxdLFxuICAgICAgICAgICAgc2t1OiBbJyddLFxuICAgICAgICAgICAgbmFtZTogWycnLCBWYWxpZGF0b3JzLmNvbXBvc2UoW1ZhbGlkYXRvcnMucmVxdWlyZWRdKV0sXG4gICAgICAgICAgICBpbml0aWFsX3F1YW50aXR5OiBbMF0sXG4gICAgICAgICAgICBpbml0aWFsX3F1YW50aXR5X2RhdGU6IFttb21lbnQoKS5mb3JtYXQoKV0sXG4gICAgICAgICAgICByZW9yZGVyX3BvaW50OiBbMTAsIFZhbGlkYXRvcnMuY29tcG9zZShbVmFsaWRhdG9ycy5yZXF1aXJlZF0pXSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBbJyddLFxuICAgICAgICAgICAgc2FsZV9wcmljZTogWzAsIFZhbGlkYXRvcnMuY29tcG9zZShbVmFsaWRhdG9ycy5yZXF1aXJlZF0pXSxcbiAgICAgICAgICAgIGluY29tZV9hY2NvdW50X2lkOiBbJyddLFxuICAgICAgICAgICAgZXhwZW5zZV9hY2NvdW50X2lkOiBbJyddLFxuICAgICAgICAgICAgbWVhc3VyZV9pZDogWzFdLFxuICAgICAgICAgICAgbWluaW11bV9wcmljZTogWycnLCBWYWxpZGF0b3JzLmNvbXBvc2UoW1ZhbGlkYXRvcnMucmVxdWlyZWRdKV0sXG4gICAgICAgICAgICBtYXhpbXVtX3ByaWNlOiBbJyddLFxuICAgICAgICAgICAgY29uZGl0aW9uX3R5cGVfaWQ6IFsxXSxcbiAgICAgICAgICAgIGN1cnJlbnRfcXVhbnRpdHk6IFtdLFxuICAgICAgICAgICAgY2F0ZWdvcnlfaWRzOiBbJyddLFxuICAgICAgICAgICAgaW1hZ2VfZmlsZTogW251bGxdLFxuICAgICAgICAgICAgaW1hZ2VfZmlsZV91cmw6IFtudWxsXSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSwgZXJyb3I6IChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgICAgdGhpcy5lcnJvckhhbmRsZXIuaGFuZGxlRXJyb3IoZXJyb3IpO1xuICAgICAgICB9LCBjb21wbGV0ZTogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuaXNGb3JtU2V0dXAuc2V0KHRydWUpO1xuICAgICAgICAgIHRoaXMubG9hZFByb2R1Y3QoKTtcbiAgICAgICAgfVxuICAgICAgfSlcblxuXG4gIH1cblxuICBsb2FkUHJvZHVjdCgpIHtcbiAgICBsZXQgaWQgPSB0aGlzLmFjdGl2YXRlZFJvdXRlLnNuYXBzaG90LnBhcmFtc1snaWQnXTtcbiAgICBpZiAoIWlkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaXNXb3JraW5nID0gdHJ1ZTtcblxuICAgIHRoaXMuc2VydmljZT8uc2hvdyhpZCwge1xuICAgICAgd2l0aDogJ21lYXN1cmUsY2F0ZWdvcmllcycsXG4gICAgfSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXNwb25zZTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMucHJvZHVjdC5zZXQocmVzcG9uc2U/Lml0ZW0pO1xuICAgICAgICB0aGlzLmlzV29ya2luZyA9IGZhbHNlO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmlzV29ya2luZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmVycm9ySGFuZGxlci5oYW5kbGVFcnJvcihlcnJvcik7XG4gICAgICB9LFxuICAgICAgY29tcGxldGU6ICgpID0+IHtcbiAgICAgICAgdGhpcy5wYXRjaFByb2R1Y3QoKTtcbiAgICAgICAgdGhpcy5pc1dvcmtpbmcgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgcGF0Y2hQcm9kdWN0KCkge1xuICAgIHRoaXMuaXNVcGRhdGUgPSB0cnVlO1xuICAgIGxldCBkYXRhID0geyAuLi50aGlzLnByb2R1Y3QoKSB9O1xuXG4gICAgaWYgKHRoaXMucHJvZHVjdCgpPy5jYXRlZ29yaWVzPy5sZW5ndGggPiAwKSB7XG4gICAgICAoZGF0YSkuY2F0ZWdvcnlfaWRzID0gKHRoaXMucHJvZHVjdCgpLmNhdGVnb3JpZXMgYXMgW10pLm1hcCgoY2F0ZWdvcnk6IGFueSkgPT4gY2F0ZWdvcnk/LmlkKTtcbiAgICB9XG4gICAgaWYgKGRhdGE/LmluaXRpYWxfcXVhbnRpdHlfZGF0ZSkge1xuICAgICAgZGF0YS5pbml0aWFsX3F1YW50aXR5X2RhdGUgPSBtb21lbnQoZGF0YS5pbml0aWFsX3F1YW50aXR5X2RhdGUpLnRvSVNPU3RyaW5nKCk7XG4gICAgfVxuICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKGRhdGEpO1xuICB9XG5cbiAgYXN5bmMgc2F2ZSgpIHtcbiAgICB0aGlzLmZvcm0ubWFya0FsbEFzVG91Y2hlZCgpO1xuICAgIGlmICh0aGlzLmZvcm0uaW52YWxpZCkge1xuICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYWRkQWxlcnQoJ1BsZWFzZSBGaWxsIEFsbCBSZXF1aXJlZCBGaWVsZHMnLCAnd2FybicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgcHJvZHVjdCA9IHRoaXMuZm9ybS52YWx1ZTtcbiAgICBpZiAocHJvZHVjdC5tYXhpbXVtX3ByaWNlIDw9IDAgfHwgIXByb2R1Y3QubWF4aW11bV9wcmljZSkge1xuICAgICAgcHJvZHVjdC5tYXhpbXVtX3ByaWNlID0gcHJvZHVjdC5taW5pbXVtX3ByaWNlO1xuICAgIH1cblxuICAgIGlmIChwcm9kdWN0Py5pbml0aWFsX3F1YW50aXR5X2RhdGUpIHtcbiAgICAgIHByb2R1Y3QuaW5pdGlhbF9xdWFudGl0eV9kYXRlID0gbW9tZW50KHByb2R1Y3QuaW5pdGlhbF9xdWFudGl0eV9kYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcbiAgICB9XG4gICAgdGhpcy5pc1dvcmtpbmcgPSB0cnVlO1xuXG4gICAgbGV0IHByb21pc2UgPSBwcm9kdWN0LmlkXG4gICAgICA/IHRoaXMuc2VydmljZS51cGRhdGUocHJvZHVjdClcbiAgICAgIDogdGhpcy5zZXJ2aWNlLnN0b3JlKHByb2R1Y3QpO1xuXG4gICAgcHJvbWlzZS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICB0aGlzLmlzV29ya2luZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5hZGRBbGVydCgnUHJvZHVjdCBzYXZlZCBzdWNjZXNzZnVsbHkhJywgJ3N1Y2Nlc3MnKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKCkgPT4gKHRoaXMuaXNXb3JraW5nID0gZmFsc2UpLFxuICAgICAgY29tcGxldGU6ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNDcmVhdGVBbm90aGVyLnZhbHVlICYmICF0aGlzLmlzVXBkYXRlKSB7XG4gICAgICAgICAgdGhpcy5zYXZlZENvdW50Kys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvaW52ZW50b3J5L3Byb2R1Y3RzJ10pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGRpc3BsYXllZCBGb3JtIEZpZWxkcyBhcnJheSBmb3IgZm9ybSBmaWVsZCBhbmQgcmV0dXJucyBib29sZWFuIHJlc3VsdFxuICAgKi9cbiAgaXNGb3JtRmllbGRTaG93bihmaWVsZE5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRpc3BsYXllZEZvcm1GaWVsZHMubGVuZ3RoID4gMCAmJiB0aGlzLmRpc3BsYXllZEZvcm1GaWVsZHMuaW5jbHVkZXMoZmllbGROYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgZGlzcGxheWVkIEZvcm0gU2VjdGlvbiBhcnJheSBmb3IgZm9ybSBzZWN0aW9uIGFuZCByZXR1cm5zIGJvb2xlYW4gcmVzdWx0XG4gICAqL1xuICBpc0Zvcm1TZWN0aW9uU2hvd24oc2VjdGlvbk5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRpc3BsYXllZEZvcm1TZWN0aW9ucy5sZW5ndGggPiAwICYmIHRoaXMuZGlzcGxheWVkRm9ybVNlY3Rpb25zLmluY2x1ZGVzKHNlY3Rpb25OYW1lKTtcbiAgfVxuXG4gIGFzeW5jIGZpbGVDaGFuZ2VkKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLmZpbGVMaXN0ID0gZXZlbnQ7XG5cbiAgICBpZiAodGhpcy5maWxlTGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCByZXN1bHQ6IGFueSA9IGF3YWl0IHRoaXMuZmlsZVNlcnZpY2UudXBsb2FkRW50aXR5RmlsZSh0aGlzLmZpbGVMaXN0WzBdLCB7XG4gICAgICAgIGVudGl0eV9pZDogdGhpcy5wcm9kdWN0KCk/LmlkLFxuICAgICAgICBlbnRpdHlfdHlwZTogJ3Byb2R1Y3QnLFxuICAgICAgICBzdWJfcGF0aDogYCR7dGhpcy5wcm9kdWN0KCk/LmlkfWBcbiAgICAgIH0pO1xuICAgICAgdGhpcy5mb3JtLmdldCgnaW1hZ2VfZmlsZScpPy5zZXRWYWx1ZShyZXN1bHQuaXRlbS5maWxlKTtcbiAgICAgIHRoaXMuZm9ybS5nZXQoJ2ltYWdlX2ZpbGVfdXJsJyk/LnNldFZhbHVlKHJlc3VsdC5pdGVtLnVybCk7XG4gICAgICB0aGlzLmZpbGVMaXN0ID0gW107XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcmVtb3ZlRmlsZSgpIHtcbiAgICBpZiAodGhpcy5mb3JtLnZhbHVlLmltYWdlX2ZpbGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgICAgICBpbWFnZV9maWxlOiAnJyxcbiAgICAgICAgICBpbWFnZV9maWxlX3VybDogJydcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5hZGRBbGVydCgnVW5hYmxlIHRvIHJlbW92ZSBmaWxlLCB0cnkgbGF0ZXInLCAnd2FybicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiQGlmIChpc0Zvcm1TZXR1cCgpKSB7XG48ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGdhcC0yXCI+XG4gIDxtYXQtY2FyZCBjbGFzcz0nY29udGFpbmVyJz5cbiAgICA8bWF0LWNhcmQtY29udGVudD5cbiAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgPGgzIGNsYXNzPVwidGV4dC1jZW50ZXIgbS0wXCI+UHJvZHVjdCBGb3JtPC9oMz5cbiAgICAgICAgPGFwcC1mb3JtLWNvbmZpZ3VyYXRpb24tZm9yLWZvcm0gZm9ybUNvZGU9J3Byb2R1Y3QnPjwvYXBwLWZvcm0tY29uZmlndXJhdGlvbi1mb3ItZm9ybT5cbiAgICAgIDwvZGl2PlxuICAgIDwvbWF0LWNhcmQtY29udGVudD5cbiAgPC9tYXQtY2FyZD5cbiAgPG1hdC1jYXJkIGNsYXNzPSdjb250YWluZXInPlxuICAgIDxtYXQtY2FyZC1jb250ZW50PlxuICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtXCIgKHN1Ym1pdCk9XCJzYXZlKClcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtblwiPlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbiBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNmaWxlVXBsb2FkPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xMDBcIj5cbiAgICAgICAgICAgICAgICA8YXBwLWZpbGUtZHJvcHBlciAoZmlsZUNoYW5nZWQpPVwiZmlsZUNoYW5nZWQoJGV2ZW50KVwiIFtjb25maWddPVwiZmlsZUNvbmZpZ1wiIFtmaWxlQXJyYXldPVwiZmlsZUxpc3RcIj5cbiAgICAgICAgICAgICAgICA8L2FwcC1maWxlLWRyb3BwZXI+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmb3JtLmdldCgnaW1hZ2VfZmlsZScpPy52YWx1ZTsgZWxzZSBmaWxlVXBsb2FkO1wiIHN0eWxlPSd3aWR0aDogMjAwcHg7J1xuICAgICAgICAgICAgICBjbGFzcz0nanVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXInPlxuICAgICAgICAgICAgICA8YXBwLWRvY3VtZW50LXZpZXdlciAocmVtb3ZlKT1cInJlbW92ZUZpbGUoKVwiIFtjb25maWddPVwidmlld2VyQ29uZmlnXCJcbiAgICAgICAgICAgICAgICBbZmlsZVVybF09XCJmb3JtLmdldCgnaW1hZ2VfZmlsZV91cmwnKT8udmFsdWVcIiBbZmlsZV09XCJmb3JtLmdldCgnaW1hZ2VfZmlsZScpPy52YWx1ZVwiPlxuICAgICAgICAgICAgICA8L2FwcC1kb2N1bWVudC12aWV3ZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4gbXQtMlwiICpuZ0lmPVwiaXNGb3JtU2VjdGlvblNob3duKCdiYXNpYyBpbmZvcm1hdGlvbicpXCI+XG4gICAgICAgICAgICA8aDY+QmFzaWMgSW5mb3JtYXRpb248L2g2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtMlwiPlxuXG4gICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cInctNTBcIiAqbmdJZj1cImlzRm9ybUZpZWxkU2hvd24oJ25hbWUnKVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+TmFtZTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cIk5hbWVcIiBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCIgcmVxdWlyZWQgLz5cbiAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiaXNGaWVsZFZhbGlkKCduYW1lJylcIj57eyBnZXRFcnJvck1lc3NhZ2UoJ25hbWUnKSB9fSA8L21hdC1lcnJvcj5cbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJ3LTUwXCIgKm5nSWY9XCJpc0Zvcm1GaWVsZFNob3duKCdwcm9kdWN0IHR5cGUnKVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+UHJvZHVjdCBUeXBlPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgPGFwcC1zZWFyY2hhYmxlLXNlbGVjdG9yIGFwaVVybD1cImFwaS9wcm9kdWN0LXR5cGVzXCIgZm9ybUNvbnRyb2xOYW1lPVwidHlwZV9pZFwiPlxuICAgICAgICAgICAgICAgIDwvYXBwLXNlYXJjaGFibGUtc2VsZWN0b3I+XG4gICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImlzRmllbGRWYWxpZCgndHlwZV9pZCcpXCI+e3sgZ2V0RXJyb3JNZXNzYWdlKCd0eXBlX2lkJykgfX0gPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtMlwiPlxuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJ3LTUwXCIgKm5nSWY9XCJpc0Zvcm1GaWVsZFNob3duKCdza3UnKVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+U0tVPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IHBsYWNlaG9sZGVyPVwiU0tVXCIgZm9ybUNvbnRyb2xOYW1lPVwic2t1XCIgLz5cbiAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiaXNGaWVsZFZhbGlkKCdza3UnKVwiPnt7IGdldEVycm9yTWVzc2FnZSgnc2t1JykgfX0gPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwidy01MFwiPlxuICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+Q2F0ZWdvcnk8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICA8YXBwLXNlYXJjaGFibGUtc2VsZWN0b3IgYXBpVXJsPVwiYXBpL3Byb2R1Y3QtY2F0ZWdvcmllc1wiIGZvcm1Db250cm9sTmFtZT1cImNhdGVnb3J5X2lkc1wiXG4gICAgICAgICAgICAgICAgICBbbXVsdGlwbGVdPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgIDwvYXBwLXNlYXJjaGFibGUtc2VsZWN0b3I+XG4gICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImlzRmllbGRWYWxpZCgnY2F0ZWdvcnlfaWRzJylcIj5cbiAgICAgICAgICAgICAgICAgIHt7IGdldEVycm9yTWVzc2FnZSgnY2F0ZWdvcnlfaWRzJykgfX1cbiAgICAgICAgICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtMlwiPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwidy01MCBhbGlnbi1zZWxmLXN0YXJ0XCJcbiAgICAgICAgICAgICAgKm5nSWY9XCJpc0Zvcm1GaWVsZFNob3duKCdjb2xvcicpICYmIGZvcm1Db25maWd1cmF0aW9uVXRpbGl0eVNlcnZpY2UuZ2V0RmllbGRFbmFibGVkKCdjb2xvcl9pZCcpXCI+XG4gICAgICAgICAgICAgIDxtYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgQ29sb3IgPHN1cCAqbmdJZj1cImZvcm1Db25maWd1cmF0aW9uVXRpbGl0eVNlcnZpY2UuZ2V0RmllbGRSZXF1aXJlZCgnY29sb3JfaWQnKVwiPio8L3N1cD5cbiAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgIDxhcHAtc2VhcmNoYWJsZS1zZWxlY3RvciBhcGlVcmw9XCJhcGkvYXR0cmlidXRlcz90eXBlX2NvZGU9Y29sb3JcIlxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImNvbG9yX2lkXCI+PC9hcHAtc2VhcmNoYWJsZS1zZWxlY3Rvcj5cbiAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImlzRmllbGRWYWxpZCgnY29sb3JfaWQnKVwiPnt7Z2V0RXJyb3JNZXNzYWdlKCdjb2xvcl9pZCcpfX08L21hdC1lcnJvcj5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwidy01MFwiICpuZ0lmPVwiaXNGb3JtRmllbGRTaG93bignZGVzY3JpcHRpb24nKVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+RGVzY3JpcHRpb248L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XCJEZXNjcmlwdGlvblwiIGZvcm1Db250cm9sTmFtZT1cImRlc2NyaXB0aW9uXCI+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtblwiICpuZ0lmPVwiaXNGb3JtU2VjdGlvblNob3duKCdpbnZlbnRvcnkgaW5mb3JtYXRpb24nKVwiPlxuICAgICAgICAgICAgPGg2PkludmVudG9yeSBJbmZvcm1hdGlvbjwvaDY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0yXCI+XG5cbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwidy01MFwiICpuZ0lmPVwiaXNGb3JtRmllbGRTaG93bigncHJvZHVjdCBtZWFzdXJlJylcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPk1lYXN1cmU8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICA8YXBwLXNlYXJjaGFibGUtc2VsZWN0b3IgYXBpVXJsPVwiYXBpL3Byb2R1Y3QtbWVhc3VyZXNcIiBmb3JtQ29udHJvbE5hbWU9XCJtZWFzdXJlX2lkXCI+XG4gICAgICAgICAgICAgICAgPC9hcHAtc2VhcmNoYWJsZS1zZWxlY3Rvcj5cbiAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiaXNGaWVsZFZhbGlkKCdtZWFzdXJlX2lkJylcIj57eyBnZXRFcnJvck1lc3NhZ2UoJ21lYXN1cmVfaWQnKSB9fSA8L21hdC1lcnJvcj5cbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJ3LTUwXCIgKm5nSWY9XCJpc0Zvcm1GaWVsZFNob3duKCdyZW9yZGVyIHBvaW50JylcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlJlb3JkZXIgUG9pbnQ8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XCJSZW9yZGVyIFBvaW50XCIgZm9ybUNvbnRyb2xOYW1lPVwicmVvcmRlcl9wb2ludFwiIHR5cGU9XCJudW1iZXJcIiAvPlxuICAgICAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJpc0ZpZWxkVmFsaWQoJ3Jlb3JkZXJfcG9pbnQnKVwiPnt7IGdldEVycm9yTWVzc2FnZSgncmVvcmRlcl9wb2ludCcpIH19IDwvbWF0LWVycm9yPlxuICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0yXCI+XG4gICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cInctNTBcIiAqbmdJZj1cImlzRm9ybUZpZWxkU2hvd24oJ2luaXRpYWwgcXVhbnRpdHknKVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+SW5pdGlhbCBRdWFudGl0eTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cIkluaXRpYWwgUXVhbnRpdHlcIiBmb3JtQ29udHJvbE5hbWU9XCJpbml0aWFsX3F1YW50aXR5XCIgLz5cbiAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiaXNGaWVsZFZhbGlkKCdpbml0aWFsX3F1YW50aXR5JylcIj57eyBnZXRFcnJvck1lc3NhZ2UoJ2luaXRpYWxfcXVhbnRpdHknKSB9fVxuICAgICAgICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cInctNTBcIiAqbmdJZj1cImlzRm9ybUZpZWxkU2hvd24oJ2luaXRpYWwgcXVhbnRpdHkgZGF0ZScpXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5Jbml0aWFsIFF1YW50aXR5IERhdGU8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgW21hdERhdGVwaWNrZXJdPVwicGlja2VySW5pdGlhbFF1YW50aXR5RGF0ZVwiIHBsYWNlaG9sZGVyPVwiSW5pdGlhbCBRdWFudGl0eSBEYXRlXCJcbiAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImluaXRpYWxfcXVhbnRpdHlfZGF0ZVwiIC8+XG4gICAgICAgICAgICAgICAgPG1hdC1kYXRlcGlja2VyLXRvZ2dsZSBtYXRTdWZmaXggW2Zvcl09XCJwaWNrZXJJbml0aWFsUXVhbnRpdHlEYXRlXCI+PC9tYXQtZGF0ZXBpY2tlci10b2dnbGU+XG4gICAgICAgICAgICAgICAgPG1hdC1kYXRlcGlja2VyICNwaWNrZXJJbml0aWFsUXVhbnRpdHlEYXRlPjwvbWF0LWRhdGVwaWNrZXI+XG4gICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImlzRmllbGRWYWxpZCgnaW5pdGlhbF9xdWFudGl0eV9kYXRlJylcIj57eyBnZXRFcnJvck1lc3NhZ2UoJ2luaXRpYWxfcXVhbnRpdHlfZGF0ZScpIH19XG4gICAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uXCIgKm5nSWY9XCJpc0Zvcm1TZWN0aW9uU2hvd24oJ3NhbGVzIGluZm9ybWF0aW9uJylcIj5cbiAgICAgICAgICAgIDxoNj5TYWxlIEluZm9ybWF0aW9uPC9oNj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTJcIj5cbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwidy01MFwiICpuZ0lmPVwiaXNGb3JtRmllbGRTaG93bignc2FsZXMgcHJpY2UnKVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+U2VsbGluZyBQcmljZTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cIlNlbGxpbmcgUHJpY2VcIiBmb3JtQ29udHJvbE5hbWU9XCJzYWxlX3ByaWNlXCIgcmVxdWlyZWQgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgICAgICBzdGVwPVwiYW55XCIgLz5cbiAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiaXNGaWVsZFZhbGlkKCdzYWxlX3ByaWNlJylcIj57eyBnZXRFcnJvck1lc3NhZ2UoJ3NhbGVfcHJpY2UnKSB9fSA8L21hdC1lcnJvcj5cbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJ3LTUwXCIgKm5nSWY9XCJpc0Zvcm1GaWVsZFNob3duKCdjb25kaXRpb24gdHlwZXMnKVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+Q29uZGl0aW9uPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgPGFwcC1zZWFyY2hhYmxlLXNlbGVjdG9yIGFwaVVybD1cImFwaS9jb25kaXRpb24tdHlwZXNcIlxuICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiY29uZGl0aW9uX3R5cGVfaWRcIj48L2FwcC1zZWFyY2hhYmxlLXNlbGVjdG9yPlxuICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0yXCI+XG4gICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cInctNTBcIiAqbmdJZj1cImlzRm9ybUZpZWxkU2hvd24oJ21pbmltdW0gcHJpY2UnKVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+TWluaW11bSBQcmljZTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cIk1pbmltdW0gUHJpY2VcIiBmb3JtQ29udHJvbE5hbWU9XCJtaW5pbXVtX3ByaWNlXCIgcmVxdWlyZWQgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgICAgICBzdGVwPVwiYW55XCIgLz5cbiAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiaXNGaWVsZFZhbGlkKCdtaW5pbXVtX3ByaWNlJylcIj57eyBnZXRFcnJvck1lc3NhZ2UoJ21pbmltdW1fcHJpY2UnKSB9fSA8L21hdC1lcnJvcj5cbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJ3LTUwXCIgKm5nSWY9XCJpc0Zvcm1GaWVsZFNob3duKCdtYXhpbXVtIHByaWNlJylcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPk1heGltdW0gUHJpY2U8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XCJNYXhpbXVtIFByaWNlXCIgZm9ybUNvbnRyb2xOYW1lPVwibWF4aW11bV9wcmljZVwiIHR5cGU9XCJudW1iZXJcIiBzdGVwPVwiYW55XCIgLz5cbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInctMTAwIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiPlxuICAgICAgICAgICAgQGlmICghaXNVcGRhdGUpIHtcbiAgICAgICAgICAgIDxtYXQtY2hlY2tib3ggW2Zvcm1Db250cm9sXT1cImlzQ3JlYXRlQW5vdGhlclwiPkNyZWF0ZSBBbm90aGVyXG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic2F2ZWRDb3VudCA+IDBcIj4oe3sgc2F2ZWRDb3VudCB9fSBpdGVtcyBzYXZlZCk8L3NwYW4+XG4gICAgICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgPHNwYW4gY2xhc3M9J2QtZmxleCBmbGV4LWdyb3cnPjwvc3Bhbj5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LXJvdyBnYXAtMyBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWVuZFwiPlxuICAgICAgICAgICAgICA8YnV0dG9uIFtkaXNhYmxlZF09XCJpc1dvcmtpbmdcIiBtYXQtYnV0dG9uIGNsYXNzPVwibXQtMlwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwibG9jYXRpb24uYmFjaygpXCI+XG4gICAgICAgICAgICAgICAgQ2FuY2VsXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uIFtkaXNhYmxlZF09XCJpc1dvcmtpbmdcIiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiBjbGFzcz1cIm10LTJcIiB0eXBlPVwic3VibWl0XCI+U2F2ZTwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9mb3JtPlxuICAgIDwvbWF0LWNhcmQtY29udGVudD5cbiAgPC9tYXQtY2FyZD5cbjwvZGl2PlxufSBAZWxzZSB7XG48bWF0LWNhcmQtY29udGVudCBjbGFzcz1cImQtZmxleCB2aC0xMDAganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgPG1hdC1zcGlubmVyPjwvbWF0LXNwaW5uZXI+XG48L21hdC1jYXJkLWNvbnRlbnQ+XG59Il19
|