@hitsoft/kadooglu.kalite 0.0.0-stage → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/README.md +23 -2
  2. package/config/enums/index.d.ts +1 -0
  3. package/config/enums/route-names.d.ts +5 -0
  4. package/config/index.d.ts +5 -0
  5. package/config/kalite-config.module.d.ts +8 -0
  6. package/config/providers/index.d.ts +1 -0
  7. package/config/providers/route.provider.d.ts +4 -0
  8. package/config/public-api.d.ts +3 -0
  9. package/esm2020/config/enums/index.mjs +2 -0
  10. package/esm2020/config/enums/route-names.mjs +2 -0
  11. package/esm2020/config/hitsoft-kadooglu.kalite-config.mjs +5 -0
  12. package/esm2020/config/kalite-config.module.mjs +18 -0
  13. package/esm2020/config/providers/index.mjs +2 -0
  14. package/esm2020/config/providers/route.provider.mjs +57 -0
  15. package/esm2020/config/public-api.mjs +4 -0
  16. package/esm2020/hitsoft-kadooglu.kalite.mjs +5 -0
  17. package/esm2020/lib/components/intake-form.component.mjs +162 -0
  18. package/esm2020/lib/components/intake-list.component.mjs +80 -0
  19. package/esm2020/lib/components/kalite.component.mjs +18 -0
  20. package/esm2020/lib/components/process-analysis.component.mjs +197 -0
  21. package/esm2020/lib/components/quality-definitions.component.mjs +97 -0
  22. package/esm2020/lib/components/quality-notifications.component.mjs +64 -0
  23. package/esm2020/lib/components/quality-parameters.component.mjs +332 -0
  24. package/esm2020/lib/components/quality-reports.component.mjs +107 -0
  25. package/esm2020/lib/kalite-notification.module.mjs +23 -0
  26. package/esm2020/lib/kalite-routing.module.mjs +41 -0
  27. package/esm2020/lib/kalite.module.mjs +41 -0
  28. package/esm2020/lib/models/intake.models.mjs +2 -0
  29. package/esm2020/lib/models/quality.models.mjs +2 -0
  30. package/esm2020/lib/services/kalite.service.mjs +21 -0
  31. package/esm2020/lib/services/print-form.mjs +96 -0
  32. package/esm2020/lib/services/quality-api.service.mjs +119 -0
  33. package/esm2020/lib/services/quality-measurements.mjs +127 -0
  34. package/esm2020/public-api.mjs +16 -0
  35. package/fesm2015/hitsoft-kadooglu.kalite-config.mjs +80 -0
  36. package/fesm2015/hitsoft-kadooglu.kalite-config.mjs.map +1 -0
  37. package/fesm2015/hitsoft-kadooglu.kalite.mjs +1483 -0
  38. package/fesm2015/hitsoft-kadooglu.kalite.mjs.map +1 -0
  39. package/fesm2020/hitsoft-kadooglu.kalite-config.mjs +80 -0
  40. package/fesm2020/hitsoft-kadooglu.kalite-config.mjs.map +1 -0
  41. package/fesm2020/hitsoft-kadooglu.kalite.mjs +1442 -0
  42. package/fesm2020/hitsoft-kadooglu.kalite.mjs.map +1 -0
  43. package/index.d.ts +5 -0
  44. package/lib/components/intake-form.component.d.ts +50 -0
  45. package/lib/components/intake-list.component.d.ts +48 -0
  46. package/lib/components/kalite.component.d.ts +10 -0
  47. package/lib/components/process-analysis.component.d.ts +46 -0
  48. package/lib/components/quality-definitions.component.d.ts +46 -0
  49. package/lib/components/quality-notifications.component.d.ts +44 -0
  50. package/lib/components/quality-parameters.component.d.ts +82 -0
  51. package/lib/components/quality-reports.component.d.ts +31 -0
  52. package/lib/kalite-notification.module.d.ts +14 -0
  53. package/lib/kalite-routing.module.d.ts +7 -0
  54. package/lib/kalite.module.d.ts +23 -0
  55. package/lib/models/intake.models.d.ts +185 -0
  56. package/lib/models/quality.models.d.ts +114 -0
  57. package/lib/services/kalite.service.d.ts +10 -0
  58. package/lib/services/print-form.d.ts +2 -0
  59. package/lib/services/quality-api.service.d.ts +71 -0
  60. package/lib/services/quality-measurements.d.ts +8 -0
  61. package/package.json +42 -3
  62. package/public-api.d.ts +12 -0
@@ -0,0 +1,80 @@
1
+ import { Component, ViewChild } from '@angular/core';
2
+ import CustomStore from 'devextreme/data/custom_store';
3
+ import { firstValueFrom } from 'rxjs';
4
+ import { download, errorMessage, statusLabel } from '../services/quality-measurements';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "../services/quality-api.service";
7
+ import * as i2 from "@abp/ng.core";
8
+ import * as i3 from "@angular/common";
9
+ import * as i4 from "@angular/forms";
10
+ import * as i5 from "@angular/router";
11
+ import * as i6 from "@abp/ng.theme.shared";
12
+ import * as i7 from "devextreme-angular";
13
+ import * as i8 from "devextreme-angular/ui/nested";
14
+ import * as i9 from "devextreme-angular/core";
15
+ import * as i10 from "@ng-bootstrap/ng-bootstrap";
16
+ export class IntakeListComponent {
17
+ constructor(api, permissions) {
18
+ this.api = api;
19
+ this.permissions = permissions;
20
+ this.statuses = [{ value: 'Waiting', text: 'Bekliyor' }, { value: 'Draft', text: 'Taslak' }, { value: 'Accepted', text: 'Kabul' }, { value: 'Rejected', text: 'Ret' }];
21
+ this.dataSource = new CustomStore({ key: 'docEntry', load: async (options) => {
22
+ this.error = '';
23
+ try {
24
+ const result = await firstValueFrom(this.api.intakeList({ ...this.query, search: String(options.searchValue || ''),
25
+ skipCount: options.skip || 0, maxResultCount: options.take || 20,
26
+ filter: options.filter ? JSON.stringify(options.filter) : '', sort: options.sort ? JSON.stringify(options.sort) : '' }));
27
+ this.rows = result.items;
28
+ this.total = result.totalCount;
29
+ return { data: result.items, totalCount: result.totalCount };
30
+ }
31
+ catch (e) {
32
+ this.error = errorMessage(e);
33
+ throw new Error(this.error);
34
+ }
35
+ } });
36
+ this.rows = [];
37
+ this.types = [];
38
+ this.total = 0;
39
+ this.busy = false;
40
+ this.error = '';
41
+ this.query = { pendingOnly: true, from: '', until: '', search: '', movementTypeCode: '', status: '', skipCount: 0, maxResultCount: 20 };
42
+ this.cancelRow = null;
43
+ this.reason = '';
44
+ this.statusLabel = statusLabel;
45
+ }
46
+ ngOnInit() { this.api.qualityMovementTypes().subscribe({ next: types => this.types = types, error: e => this.error = errorMessage(e) }); this.load(); }
47
+ allowed(policy) { return this.permissions.getGrantedPolicy('Hitsoft.Kadooglu.Kalite.Intake.' + policy); }
48
+ editable(row) { return row.vehicleStatus === '0' && !row.firstWeight && !row.hasExited; }
49
+ load(reset = false) {
50
+ this.busy = false;
51
+ if (reset)
52
+ this.grid?.instance.pageIndex(0);
53
+ this.grid?.instance.refresh();
54
+ }
55
+ tab(pending) { this.query.pendingOnly = pending; this.load(true); }
56
+ page(direction) { this.query.skipCount += direction * this.query.maxResultCount; this.load(); }
57
+ get pageNumber() { return Math.floor(this.query.skipCount / this.query.maxResultCount) + 1; }
58
+ print(row) { this.api.intakePdf(row.docEntry).subscribe({ next: blob => download(blob, `Girdi-Kontrol-${row.docEntry}.pdf`), error: e => this.error = errorMessage(e) }); }
59
+ cancel() {
60
+ if (!this.cancelRow || !this.reason.trim()) {
61
+ this.error = 'İptal gerekçesi girin.';
62
+ return;
63
+ }
64
+ this.busy = true;
65
+ const id = this.cancelRow.docEntry;
66
+ this.api.intake(id).subscribe({ next: form => this.api.cancelIntake(id, form.inspection.revision, this.reason).subscribe({
67
+ next: () => { this.cancelRow = null; this.reason = ''; this.load(); }, error: e => { this.error = errorMessage(e); this.busy = false; }
68
+ }), error: e => { this.error = errorMessage(e); this.busy = false; } });
69
+ }
70
+ }
71
+ IntakeListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: IntakeListComponent, deps: [{ token: i1.QualityApiService }, { token: i2.PermissionService }], target: i0.ɵɵFactoryTarget.Component });
72
+ IntakeListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: IntakeListComponent, selector: "lib-intake-list", viewQueries: [{ propertyName: "grid", first: true, predicate: ["grid"], descendants: true }], ngImport: i0, template: "<div class=\"container-fluid\"><h3>Ham Ya\u011F Giri\u015F Kalite Kontrol</h3><div class=\"card\"><div class=\"card-body\">\n <div class=\"btn-group mb-3\" role=\"tablist\"><button class=\"btn\" [class.btn-success]=\"query.pendingOnly\" [class.btn-outline-secondary]=\"!query.pendingOnly\" (click)=\"tab(true)\">Kalite Kontrol Bekleyenler</button><button class=\"btn\" [class.btn-success]=\"!query.pendingOnly\" [class.btn-outline-secondary]=\"query.pendingOnly\" (click)=\"tab(false)\">T\u00FCm Kay\u0131tlar</button></div>\n <div class=\"row mb-3\"><div class=\"col-md-3\"><label>Ba\u015Flang\u0131\u00E7</label><input type=\"date\" class=\"form-control\" [(ngModel)]=\"query.from\" /></div><div class=\"col-md-3\"><label>Biti\u015F</label><input type=\"date\" class=\"form-control\" [(ngModel)]=\"query.until\" /></div><div class=\"col-md-3\"><label>Ara\u00E7 Hareket T\u00FCr\u00FC</label><select class=\"form-control\" [(ngModel)]=\"query.movementTypeCode\"><option value=\"\">T\u00FCm\u00FC</option><option *ngFor=\"let type of types\" [value]=\"type.code\">{{type.name}}</option></select></div><div class=\"col-md-3 d-flex align-items-end\"><button class=\"btn btn-primary\" (click)=\"load(true)\">Filtrele</button></div></div>\n <div *ngIf=\"error\" class=\"alert alert-danger\" role=\"alert\">{{error}}</div>\n <dx-data-grid #grid class=\"intake-grid\" [dataSource]=\"dataSource\" [remoteOperations]=\"{paging: true, filtering: true, sorting: true}\" [showBorders]=\"true\" [rowAlternationEnabled]=\"true\" [columnAutoWidth]=\"true\" [allowColumnResizing]=\"true\" columnResizingMode=\"widget\" style=\"height: calc(100vh - 350px)\">\n <dxo-filter-row [visible]=\"true\"></dxo-filter-row><dxo-search-panel [visible]=\"true\" [width]=\"220\" placeholder=\"Ara\u2026\"></dxo-search-panel>\n <dxo-paging [pageSize]=\"20\"></dxo-paging><dxo-pager [visible]=\"true\" [showInfo]=\"true\" [allowedPageSizes]=\"[10,20,50]\" [showPageSizeSelector]=\"true\" [showNavigationButtons]=\"true\"></dxo-pager>\n <dxi-column caption=\"\u0130\u015Flemler\" cellTemplate=\"actions\" [allowFiltering]=\"false\" [allowSorting]=\"false\" [fixed]=\"true\" [width]=\"145\"></dxi-column>\n <dxi-column dataField=\"qualityStatus\" caption=\"Kalite Durumu\" cellTemplate=\"status\"><dxo-lookup [dataSource]=\"statuses\" valueExpr=\"value\" displayExpr=\"text\"></dxo-lookup></dxi-column>\n <dxi-column dataField=\"sequenceNumber\" caption=\"S\u0131ra No\"></dxi-column><dxi-column dataField=\"docNum\" caption=\"Belge No\" dataType=\"number\"></dxi-column><dxi-column dataField=\"gateCode\" caption=\"Kap\u0131\"></dxi-column>\n <dxi-column dataField=\"entryDate\" caption=\"Giri\u015F Tarihi / Saati\" dataType=\"datetime\" format=\"dd.MM.yyyy HH:mm\"></dxi-column><dxi-column dataField=\"movementTypeName\" caption=\"Ara\u00E7 Hareket T\u00FCr\u00FC\"></dxi-column><dxi-column dataField=\"movementDetailName\" caption=\"Detay\"></dxi-column>\n <dxi-column dataField=\"plate\" caption=\"Kamyon Plakas\u0131\"></dxi-column><dxi-column dataField=\"trailerPlate\" caption=\"Dorse Plakas\u0131\"></dxi-column><dxi-column dataField=\"driver\" caption=\"\u015Eof\u00F6r\"></dxi-column>\n <dxi-column dataField=\"partnerName\" caption=\"Muhatap\"></dxi-column><dxi-column dataField=\"shipName\" caption=\"Gemi\"></dxi-column><dxi-column dataField=\"stockTransferNumber\" caption=\"Stok Nakli\"></dxi-column>\n <dxi-column dataField=\"origin\" caption=\"Men\u015Fei\"><dxo-lookup [dataSource]=\"[{code:'Domestic',name:'\u0130\u00E7 Piyasa'},{code:'Imported',name:'\u0130thal'}]\" valueExpr=\"code\" displayExpr=\"name\"></dxo-lookup></dxi-column>\n <dxi-column dataField=\"sealNumber\" caption=\"M\u00FCh\u00FCr No\"></dxi-column><dxi-column dataField=\"analyst\" caption=\"Analizi Yapan\"></dxi-column><dxi-column dataField=\"inspectedAt\" caption=\"Kontrol Tarihi\" dataType=\"datetime\" format=\"dd.MM.yyyy HH:mm\"></dxi-column><dxi-column dataField=\"notes\" caption=\"A\u00E7\u0131klama\"></dxi-column>\n <div *dxTemplate=\"let cell of 'status'\"><span class=\"badge\" [class.badge-success]=\"cell.data.qualityStatus === 'Accepted'\" [class.badge-danger]=\"cell.data.qualityStatus === 'Rejected'\" [class.badge-warning]=\"cell.data.qualityStatus === 'Waiting' || cell.data.qualityStatus === 'Draft'\">{{statusLabel(cell.data.qualityStatus)}}</span></div>\n <div *dxTemplate=\"let cell of 'actions'\" class=\"intake-actions-cell\">\n <div ngbDropdown container=\"body\" class=\"d-inline-block\" placement=\"bottom-start top-start\">\n <button type=\"button\" ngbDropdownToggle class=\"btn btn-sm btn-primary intake-actions-toggle\"><i class=\"fa fa-cog\" aria-hidden=\"true\"></i><span>\u0130\u015Flemler</span></button>\n <div ngbDropdownMenu class=\"intake-action-menu\">\n <a ngbDropdownItem *ngIf=\"editable(cell.data) && allowed('Edit')\" [routerLink]=\"['/kalite/intake',cell.data.docEntry]\">{{cell.data.qualityStatus === 'Waiting' ? 'Kalite Kontrol Yap' : 'D\u00FCzenle'}}</a>\n <a ngbDropdownItem [routerLink]=\"['/kalite/intake',cell.data.docEntry]\" [queryParams]=\"{mode:'view'}\">\u00D6zeti G\u00F6r\u00FCnt\u00FCle</a>\n <button type=\"button\" ngbDropdownItem *ngIf=\"cell.data.qualityStatus !== 'Waiting' && allowed('Print')\" (click)=\"print(cell.data)\">Girdi Kontrol Formu Yazd\u0131r</button>\n <button type=\"button\" ngbDropdownItem *ngIf=\"editable(cell.data) && cell.data.qualityStatus !== 'Waiting' && allowed('Cancel')\" (click)=\"cancelRow = cell.data; reason = ''\">\u0130ptal Et</button>\n </div>\n </div>\n </div>\n </dx-data-grid>\n</div></div></div>\n<abp-modal [visible]=\"!!cancelRow\" (visibleChange)=\"!$event && (cancelRow = null)\" [busy]=\"busy\"><ng-template #abpHeader><h5>Kalite Kontrol\u00FCn\u00FC \u0130ptal Et</h5></ng-template><ng-template #abpBody><label>\u0130ptal Gerek\u00E7esi</label><textarea class=\"form-control\" rows=\"3\" [(ngModel)]=\"reason\"></textarea><p class=\"text-muted mt-2\">Kay\u0131t yeniden kalite kontrol bekleyenlere al\u0131n\u0131r.</p></ng-template><ng-template #abpFooter><button class=\"btn btn-secondary\" (click)=\"cancelRow = null\" [disabled]=\"busy\">Vazge\u00E7</button><button class=\"btn btn-danger\" (click)=\"cancel()\" [disabled]=\"busy || !reason.trim()\">\u0130ptal Et</button></ng-template></abp-modal>\n", styles: [".quality-loading{padding:1.5rem;text-align:center;color:#5b526c}.print-only{display:none}.quality-status{display:inline-flex;align-items:center;gap:.5rem;padding:.55rem .85rem;border:1px solid transparent;border-radius:.4rem;font-size:.9375rem;font-weight:600;line-height:1.4}.quality-status-accepted{color:#166534;background:#dcfce7;border-color:#86efac}.quality-status-rejected{color:#991b1b;background:#fee2e2;border-color:#fca5a5}.quality-status-draft{color:#1e40af;background:#dbeafe;border-color:#93c5fd}.quality-status-waiting{color:#854d0e;background:#fef3c7;border-color:#fcd34d}.vehicle-table{min-width:1950px;white-space:nowrap}.actions{min-width:130px}.quality-questions-link{display:inline-flex;align-items:center;min-height:calc(1.5em + .5rem + 2px);margin-left:.4rem;padding:.25rem .5rem;color:#9a5a00;background:#fff3d6;border:1px solid #edb85b;border-radius:.2rem;font-size:.875rem;line-height:1.5;text-decoration:none}.quality-questions-link:hover,.quality-questions-link:focus{color:#fff;background:#b86b00;border-color:#b86b00;text-decoration:none}.intake-actions-cell{display:flex;align-items:center}:host ::ng-deep .intake-grid .dx-data-row>td{vertical-align:middle}.intake-actions-toggle{display:inline-flex;align-items:center;gap:.5rem;padding:.3rem .65rem;font-family:inherit;font-size:.8125rem;line-height:1.3}.intake-action-menu{min-width:210px;margin-top:.35rem;padding:.3rem;background:#fff;border:1px solid #dee2e6;border-radius:.375rem;box-shadow:0 .25rem .75rem #0000001a}.intake-action-menu .dropdown-item{display:block;text-align:left;border:0;border-radius:.25rem;background:none;color:#343a40;padding:.5rem .65rem;font-family:inherit;font-size:.8125rem;font-weight:400;line-height:1.4;text-decoration:none;white-space:nowrap;cursor:pointer}.intake-action-menu .dropdown-item:hover,.intake-action-menu .dropdown-item:focus-visible{background:#eef2ff;color:#2446b5}.page-size{width:85px}.vehicle-info{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:1rem;margin:1rem 0}.vehicle-info label{font-size:.8rem;color:#6c757d;margin-bottom:.2rem}.vehicle-info p{background:#f5f3f8;padding:.55rem;min-height:2.5rem;overflow-wrap:anywhere}.measurement-table{min-width:700px}.measurement-table th{background:#f2edf7}.measurement-table td{vertical-align:middle}.out-of-limit,.rejected-row{background:#ffe6e9!important}.out-of-limit input,.out-of-limit select{border-color:#dc3545}@media (max-width: 900px){.vehicle-info{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (max-width: 550px){.vehicle-info{grid-template-columns:1fr}}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i5.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i6.ModalComponent, selector: "abp-modal", inputs: ["visible", "busy", "options", "suppressUnsavedChangesWarning"], outputs: ["visibleChange", "init", "appear", "disappear"] }, { kind: "component", type: i7.DxDataGridComponent, selector: "dx-data-grid", inputs: ["accessKey", "activeStateEnabled", "allowColumnReordering", "allowColumnResizing", "autoNavigateToFocusedRow", "cacheEnabled", "cellHintEnabled", "columnAutoWidth", "columnChooser", "columnFixing", "columnHidingEnabled", "columnMinWidth", "columnResizingMode", "columns", "columnWidth", "customizeColumns", "dataRowTemplate", "dataSource", "dateSerializationFormat", "disabled", "editing", "elementAttr", "errorRowEnabled", "export", "filterBuilder", "filterBuilderPopup", "filterPanel", "filterRow", "filterSyncEnabled", "filterValue", "focusedColumnIndex", "focusedRowEnabled", "focusedRowIndex", "focusedRowKey", "grouping", "groupPanel", "headerFilter", "height", "highlightChanges", "hint", "hoverStateEnabled", "keyboardNavigation", "keyExpr", "loadPanel", "masterDetail", "noDataText", "pager", "paging", "remoteOperations", "renderAsync", "repaintChangesOnly", "rowAlternationEnabled", "rowDragging", "rowTemplate", "rtlEnabled", "scrolling", "searchPanel", "selectedRowKeys", "selection", "selectionFilter", "showBorders", "showColumnHeaders", "showColumnLines", "showRowLines", "sortByGroupSummaryInfo", "sorting", "stateStoring", "summary", "syncLookupFilterValues", "tabIndex", "toolbar", "twoWayBindingEnabled", "visible", "width", "wordWrapEnabled"], outputs: ["onAdaptiveDetailRowPreparing", "onCellClick", "onCellDblClick", "onCellHoverChanged", "onCellPrepared", "onContentReady", "onContextMenuPreparing", "onDataErrorOccurred", "onDisposing", "onEditCanceled", "onEditCanceling", "onEditingStart", "onEditorPrepared", "onEditorPreparing", "onExporting", "onFocusedCellChanged", "onFocusedCellChanging", "onFocusedRowChanged", "onFocusedRowChanging", "onInitialized", "onInitNewRow", "onKeyDown", "onOptionChanged", "onRowClick", "onRowCollapsed", "onRowCollapsing", "onRowDblClick", "onRowExpanded", "onRowExpanding", "onRowInserted", "onRowInserting", "onRowPrepared", "onRowRemoved", "onRowRemoving", "onRowUpdated", "onRowUpdating", "onRowValidating", "onSaved", "onSaving", "onSelectionChanged", "onToolbarPreparing", "accessKeyChange", "activeStateEnabledChange", "allowColumnReorderingChange", "allowColumnResizingChange", "autoNavigateToFocusedRowChange", "cacheEnabledChange", "cellHintEnabledChange", "columnAutoWidthChange", "columnChooserChange", "columnFixingChange", "columnHidingEnabledChange", "columnMinWidthChange", "columnResizingModeChange", "columnsChange", "columnWidthChange", "customizeColumnsChange", "dataRowTemplateChange", "dataSourceChange", "dateSerializationFormatChange", "disabledChange", "editingChange", "elementAttrChange", "errorRowEnabledChange", "exportChange", "filterBuilderChange", "filterBuilderPopupChange", "filterPanelChange", "filterRowChange", "filterSyncEnabledChange", "filterValueChange", "focusedColumnIndexChange", "focusedRowEnabledChange", "focusedRowIndexChange", "focusedRowKeyChange", "groupingChange", "groupPanelChange", "headerFilterChange", "heightChange", "highlightChangesChange", "hintChange", "hoverStateEnabledChange", "keyboardNavigationChange", "keyExprChange", "loadPanelChange", "masterDetailChange", "noDataTextChange", "pagerChange", "pagingChange", "remoteOperationsChange", "renderAsyncChange", "repaintChangesOnlyChange", "rowAlternationEnabledChange", "rowDraggingChange", "rowTemplateChange", "rtlEnabledChange", "scrollingChange", "searchPanelChange", "selectedRowKeysChange", "selectionChange", "selectionFilterChange", "showBordersChange", "showColumnHeadersChange", "showColumnLinesChange", "showRowLinesChange", "sortByGroupSummaryInfoChange", "sortingChange", "stateStoringChange", "summaryChange", "syncLookupFilterValuesChange", "tabIndexChange", "toolbarChange", "twoWayBindingEnabledChange", "visibleChange", "widthChange", "wordWrapEnabledChange"] }, { kind: "component", type: i8.DxiColumnComponent, selector: "dxi-column", inputs: ["alignment", "allowEditing", "allowExporting", "allowFiltering", "allowFixing", "allowGrouping", "allowHeaderFiltering", "allowHiding", "allowReordering", "allowResizing", "allowSearch", "allowSorting", "autoExpandGroup", "buttons", "calculateCellValue", "calculateDisplayValue", "calculateFilterExpression", "calculateGroupValue", "calculateSortValue", "caption", "cellTemplate", "columns", "cssClass", "customizeText", "dataField", "dataType", "editCellTemplate", "editorOptions", "encodeHtml", "falseText", "filterOperations", "filterType", "filterValue", "filterValues", "fixed", "fixedPosition", "format", "formItem", "groupCellTemplate", "groupIndex", "headerCellTemplate", "headerFilter", "hidingPriority", "isBand", "lookup", "minWidth", "name", "ownerBand", "renderAsync", "selectedFilterOperation", "setCellValue", "showEditorAlways", "showInColumnChooser", "showWhenGrouped", "sortIndex", "sortingMethod", "sortOrder", "trueText", "type", "validationRules", "visible", "visibleIndex", "width"], outputs: ["filterValueChange", "filterValuesChange", "groupIndexChange", "selectedFilterOperationChange", "sortIndexChange", "sortOrderChange", "visibleChange", "visibleIndexChange"] }, { kind: "component", type: i8.DxoLookupComponent, selector: "dxo-lookup", inputs: ["allowClearing", "calculateCellValue", "dataSource", "displayExpr", "valueExpr"] }, { kind: "component", type: i8.DxoFilterRowComponent, selector: "dxo-filter-row", inputs: ["applyFilter", "applyFilterText", "betweenEndText", "betweenStartText", "operationDescriptions", "resetOperationText", "showAllText", "showOperationChooser", "visible"] }, { kind: "component", type: i8.DxoPagerComponent, selector: "dxo-pager", inputs: ["allowedPageSizes", "displayMode", "infoText", "label", "showInfo", "showNavigationButtons", "showPageSizeSelector", "visible"] }, { kind: "component", type: i8.DxoPagingComponent, selector: "dxo-paging", inputs: ["enabled", "pageIndex", "pageSize"], outputs: ["pageIndexChange", "pageSizeChange"] }, { kind: "component", type: i8.DxoSearchPanelComponent, selector: "dxo-search-panel", inputs: ["highlightCaseSensitive", "highlightSearchText", "placeholder", "searchVisibleColumnsOnly", "text", "visible", "width"], outputs: ["textChange"] }, { kind: "directive", type: i9.DxTemplateDirective, selector: "[dxTemplate]", inputs: ["dxTemplateOf"] }, { kind: "directive", type: i10.NgbDropdown, selector: "[ngbDropdown]", inputs: ["autoClose", "dropdownClass", "open", "placement", "container", "display"], outputs: ["openChange"], exportAs: ["ngbDropdown"] }, { kind: "directive", type: i10.NgbDropdownToggle, selector: "[ngbDropdownToggle]" }, { kind: "directive", type: i10.NgbDropdownMenu, selector: "[ngbDropdownMenu]" }, { kind: "directive", type: i10.NgbDropdownItem, selector: "[ngbDropdownItem]", inputs: ["disabled"] }] });
73
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: IntakeListComponent, decorators: [{
74
+ type: Component,
75
+ args: [{ selector: 'lib-intake-list', template: "<div class=\"container-fluid\"><h3>Ham Ya\u011F Giri\u015F Kalite Kontrol</h3><div class=\"card\"><div class=\"card-body\">\n <div class=\"btn-group mb-3\" role=\"tablist\"><button class=\"btn\" [class.btn-success]=\"query.pendingOnly\" [class.btn-outline-secondary]=\"!query.pendingOnly\" (click)=\"tab(true)\">Kalite Kontrol Bekleyenler</button><button class=\"btn\" [class.btn-success]=\"!query.pendingOnly\" [class.btn-outline-secondary]=\"query.pendingOnly\" (click)=\"tab(false)\">T\u00FCm Kay\u0131tlar</button></div>\n <div class=\"row mb-3\"><div class=\"col-md-3\"><label>Ba\u015Flang\u0131\u00E7</label><input type=\"date\" class=\"form-control\" [(ngModel)]=\"query.from\" /></div><div class=\"col-md-3\"><label>Biti\u015F</label><input type=\"date\" class=\"form-control\" [(ngModel)]=\"query.until\" /></div><div class=\"col-md-3\"><label>Ara\u00E7 Hareket T\u00FCr\u00FC</label><select class=\"form-control\" [(ngModel)]=\"query.movementTypeCode\"><option value=\"\">T\u00FCm\u00FC</option><option *ngFor=\"let type of types\" [value]=\"type.code\">{{type.name}}</option></select></div><div class=\"col-md-3 d-flex align-items-end\"><button class=\"btn btn-primary\" (click)=\"load(true)\">Filtrele</button></div></div>\n <div *ngIf=\"error\" class=\"alert alert-danger\" role=\"alert\">{{error}}</div>\n <dx-data-grid #grid class=\"intake-grid\" [dataSource]=\"dataSource\" [remoteOperations]=\"{paging: true, filtering: true, sorting: true}\" [showBorders]=\"true\" [rowAlternationEnabled]=\"true\" [columnAutoWidth]=\"true\" [allowColumnResizing]=\"true\" columnResizingMode=\"widget\" style=\"height: calc(100vh - 350px)\">\n <dxo-filter-row [visible]=\"true\"></dxo-filter-row><dxo-search-panel [visible]=\"true\" [width]=\"220\" placeholder=\"Ara\u2026\"></dxo-search-panel>\n <dxo-paging [pageSize]=\"20\"></dxo-paging><dxo-pager [visible]=\"true\" [showInfo]=\"true\" [allowedPageSizes]=\"[10,20,50]\" [showPageSizeSelector]=\"true\" [showNavigationButtons]=\"true\"></dxo-pager>\n <dxi-column caption=\"\u0130\u015Flemler\" cellTemplate=\"actions\" [allowFiltering]=\"false\" [allowSorting]=\"false\" [fixed]=\"true\" [width]=\"145\"></dxi-column>\n <dxi-column dataField=\"qualityStatus\" caption=\"Kalite Durumu\" cellTemplate=\"status\"><dxo-lookup [dataSource]=\"statuses\" valueExpr=\"value\" displayExpr=\"text\"></dxo-lookup></dxi-column>\n <dxi-column dataField=\"sequenceNumber\" caption=\"S\u0131ra No\"></dxi-column><dxi-column dataField=\"docNum\" caption=\"Belge No\" dataType=\"number\"></dxi-column><dxi-column dataField=\"gateCode\" caption=\"Kap\u0131\"></dxi-column>\n <dxi-column dataField=\"entryDate\" caption=\"Giri\u015F Tarihi / Saati\" dataType=\"datetime\" format=\"dd.MM.yyyy HH:mm\"></dxi-column><dxi-column dataField=\"movementTypeName\" caption=\"Ara\u00E7 Hareket T\u00FCr\u00FC\"></dxi-column><dxi-column dataField=\"movementDetailName\" caption=\"Detay\"></dxi-column>\n <dxi-column dataField=\"plate\" caption=\"Kamyon Plakas\u0131\"></dxi-column><dxi-column dataField=\"trailerPlate\" caption=\"Dorse Plakas\u0131\"></dxi-column><dxi-column dataField=\"driver\" caption=\"\u015Eof\u00F6r\"></dxi-column>\n <dxi-column dataField=\"partnerName\" caption=\"Muhatap\"></dxi-column><dxi-column dataField=\"shipName\" caption=\"Gemi\"></dxi-column><dxi-column dataField=\"stockTransferNumber\" caption=\"Stok Nakli\"></dxi-column>\n <dxi-column dataField=\"origin\" caption=\"Men\u015Fei\"><dxo-lookup [dataSource]=\"[{code:'Domestic',name:'\u0130\u00E7 Piyasa'},{code:'Imported',name:'\u0130thal'}]\" valueExpr=\"code\" displayExpr=\"name\"></dxo-lookup></dxi-column>\n <dxi-column dataField=\"sealNumber\" caption=\"M\u00FCh\u00FCr No\"></dxi-column><dxi-column dataField=\"analyst\" caption=\"Analizi Yapan\"></dxi-column><dxi-column dataField=\"inspectedAt\" caption=\"Kontrol Tarihi\" dataType=\"datetime\" format=\"dd.MM.yyyy HH:mm\"></dxi-column><dxi-column dataField=\"notes\" caption=\"A\u00E7\u0131klama\"></dxi-column>\n <div *dxTemplate=\"let cell of 'status'\"><span class=\"badge\" [class.badge-success]=\"cell.data.qualityStatus === 'Accepted'\" [class.badge-danger]=\"cell.data.qualityStatus === 'Rejected'\" [class.badge-warning]=\"cell.data.qualityStatus === 'Waiting' || cell.data.qualityStatus === 'Draft'\">{{statusLabel(cell.data.qualityStatus)}}</span></div>\n <div *dxTemplate=\"let cell of 'actions'\" class=\"intake-actions-cell\">\n <div ngbDropdown container=\"body\" class=\"d-inline-block\" placement=\"bottom-start top-start\">\n <button type=\"button\" ngbDropdownToggle class=\"btn btn-sm btn-primary intake-actions-toggle\"><i class=\"fa fa-cog\" aria-hidden=\"true\"></i><span>\u0130\u015Flemler</span></button>\n <div ngbDropdownMenu class=\"intake-action-menu\">\n <a ngbDropdownItem *ngIf=\"editable(cell.data) && allowed('Edit')\" [routerLink]=\"['/kalite/intake',cell.data.docEntry]\">{{cell.data.qualityStatus === 'Waiting' ? 'Kalite Kontrol Yap' : 'D\u00FCzenle'}}</a>\n <a ngbDropdownItem [routerLink]=\"['/kalite/intake',cell.data.docEntry]\" [queryParams]=\"{mode:'view'}\">\u00D6zeti G\u00F6r\u00FCnt\u00FCle</a>\n <button type=\"button\" ngbDropdownItem *ngIf=\"cell.data.qualityStatus !== 'Waiting' && allowed('Print')\" (click)=\"print(cell.data)\">Girdi Kontrol Formu Yazd\u0131r</button>\n <button type=\"button\" ngbDropdownItem *ngIf=\"editable(cell.data) && cell.data.qualityStatus !== 'Waiting' && allowed('Cancel')\" (click)=\"cancelRow = cell.data; reason = ''\">\u0130ptal Et</button>\n </div>\n </div>\n </div>\n </dx-data-grid>\n</div></div></div>\n<abp-modal [visible]=\"!!cancelRow\" (visibleChange)=\"!$event && (cancelRow = null)\" [busy]=\"busy\"><ng-template #abpHeader><h5>Kalite Kontrol\u00FCn\u00FC \u0130ptal Et</h5></ng-template><ng-template #abpBody><label>\u0130ptal Gerek\u00E7esi</label><textarea class=\"form-control\" rows=\"3\" [(ngModel)]=\"reason\"></textarea><p class=\"text-muted mt-2\">Kay\u0131t yeniden kalite kontrol bekleyenlere al\u0131n\u0131r.</p></ng-template><ng-template #abpFooter><button class=\"btn btn-secondary\" (click)=\"cancelRow = null\" [disabled]=\"busy\">Vazge\u00E7</button><button class=\"btn btn-danger\" (click)=\"cancel()\" [disabled]=\"busy || !reason.trim()\">\u0130ptal Et</button></ng-template></abp-modal>\n", styles: [".quality-loading{padding:1.5rem;text-align:center;color:#5b526c}.print-only{display:none}.quality-status{display:inline-flex;align-items:center;gap:.5rem;padding:.55rem .85rem;border:1px solid transparent;border-radius:.4rem;font-size:.9375rem;font-weight:600;line-height:1.4}.quality-status-accepted{color:#166534;background:#dcfce7;border-color:#86efac}.quality-status-rejected{color:#991b1b;background:#fee2e2;border-color:#fca5a5}.quality-status-draft{color:#1e40af;background:#dbeafe;border-color:#93c5fd}.quality-status-waiting{color:#854d0e;background:#fef3c7;border-color:#fcd34d}.vehicle-table{min-width:1950px;white-space:nowrap}.actions{min-width:130px}.quality-questions-link{display:inline-flex;align-items:center;min-height:calc(1.5em + .5rem + 2px);margin-left:.4rem;padding:.25rem .5rem;color:#9a5a00;background:#fff3d6;border:1px solid #edb85b;border-radius:.2rem;font-size:.875rem;line-height:1.5;text-decoration:none}.quality-questions-link:hover,.quality-questions-link:focus{color:#fff;background:#b86b00;border-color:#b86b00;text-decoration:none}.intake-actions-cell{display:flex;align-items:center}:host ::ng-deep .intake-grid .dx-data-row>td{vertical-align:middle}.intake-actions-toggle{display:inline-flex;align-items:center;gap:.5rem;padding:.3rem .65rem;font-family:inherit;font-size:.8125rem;line-height:1.3}.intake-action-menu{min-width:210px;margin-top:.35rem;padding:.3rem;background:#fff;border:1px solid #dee2e6;border-radius:.375rem;box-shadow:0 .25rem .75rem #0000001a}.intake-action-menu .dropdown-item{display:block;text-align:left;border:0;border-radius:.25rem;background:none;color:#343a40;padding:.5rem .65rem;font-family:inherit;font-size:.8125rem;font-weight:400;line-height:1.4;text-decoration:none;white-space:nowrap;cursor:pointer}.intake-action-menu .dropdown-item:hover,.intake-action-menu .dropdown-item:focus-visible{background:#eef2ff;color:#2446b5}.page-size{width:85px}.vehicle-info{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:1rem;margin:1rem 0}.vehicle-info label{font-size:.8rem;color:#6c757d;margin-bottom:.2rem}.vehicle-info p{background:#f5f3f8;padding:.55rem;min-height:2.5rem;overflow-wrap:anywhere}.measurement-table{min-width:700px}.measurement-table th{background:#f2edf7}.measurement-table td{vertical-align:middle}.out-of-limit,.rejected-row{background:#ffe6e9!important}.out-of-limit input,.out-of-limit select{border-color:#dc3545}@media (max-width: 900px){.vehicle-info{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (max-width: 550px){.vehicle-info{grid-template-columns:1fr}}\n"] }]
76
+ }], ctorParameters: function () { return [{ type: i1.QualityApiService }, { type: i2.PermissionService }]; }, propDecorators: { grid: [{
77
+ type: ViewChild,
78
+ args: ['grid']
79
+ }] } });
80
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50YWtlLWxpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2FsaXRlL3NyYy9saWIvY29tcG9uZW50cy9pbnRha2UtbGlzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rYWxpdGUvc3JjL2xpYi9jb21wb25lbnRzL2ludGFrZS1ncmlkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTdELE9BQU8sV0FBVyxNQUFNLDhCQUE4QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFJdEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLE1BQU0sa0NBQWtDLENBQUM7Ozs7Ozs7Ozs7OztBQUd2RixNQUFNLE9BQU8sbUJBQW1CO0lBZ0I5QixZQUFvQixHQUFzQixFQUFVLFdBQThCO1FBQTlELFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQVUsZ0JBQVcsR0FBWCxXQUFXLENBQW1CO1FBZHpFLGFBQVEsR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNsSyxlQUFVLEdBQUcsSUFBSSxXQUFXLENBQUMsRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUMsT0FBTyxFQUFDLEVBQUU7Z0JBQzdFLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO2dCQUNoQixJQUFJO29CQUNGLE1BQU0sTUFBTSxHQUFHLE1BQU0sY0FBYyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUM7d0JBQ2hILFNBQVMsRUFBRSxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsRUFBRSxjQUFjLEVBQUUsT0FBTyxDQUFDLElBQUksSUFBSSxFQUFFO3dCQUNoRSxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDM0gsSUFBSSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO29CQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQztvQkFDekQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7aUJBQzlEO2dCQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUFFO1lBQzVFLENBQUMsRUFBQyxDQUFDLENBQUM7UUFDSixTQUFJLEdBQW9CLEVBQUUsQ0FBQztRQUFDLFVBQUssR0FBbUIsRUFBRSxDQUFDO1FBQUMsVUFBSyxHQUFHLENBQUMsQ0FBQztRQUFDLFNBQUksR0FBRyxLQUFLLENBQUM7UUFBQyxVQUFLLEdBQUcsRUFBRSxDQUFDO1FBQzVGLFVBQUssR0FBRyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxjQUFjLEVBQUUsRUFBRSxFQUFFLENBQUM7UUFDbkksY0FBUyxHQUF5QixJQUFJLENBQUM7UUFBQyxXQUFNLEdBQUcsRUFBRSxDQUFDO1FBQUMsZ0JBQVcsR0FBRyxXQUFXLENBQUM7SUFDTSxDQUFDO0lBQ3RGLFFBQVEsS0FBVyxJQUFJLENBQUMsR0FBRyxDQUFDLG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM3SixPQUFPLENBQUMsTUFBYyxJQUFhLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxpQ0FBaUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUgsUUFBUSxDQUFDLEdBQWtCLElBQWEsT0FBTyxHQUFHLENBQUMsYUFBYSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUNqSCxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUs7UUFDaEIsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7UUFDbEIsSUFBSSxLQUFLO1lBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFDRCxHQUFHLENBQUMsT0FBZ0IsSUFBVSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsRixJQUFJLENBQUMsU0FBaUIsSUFBVSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzdHLElBQUksVUFBVSxLQUFhLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckcsS0FBSyxDQUFDLEdBQWtCLElBQVUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLEdBQUcsQ0FBQyxRQUFRLE1BQU0sQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaE0sTUFBTTtRQUNKLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsd0JBQXdCLENBQUM7WUFBQyxPQUFPO1NBQUU7UUFDOUYsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUM7UUFDbkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUM7Z0JBQ3ZILElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO2FBQ3hJLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMxRSxDQUFDOztnSEFwQ1UsbUJBQW1CO29HQUFuQixtQkFBbUIscUpDVmhDLG92TUE4QkE7MkZEcEJhLG1CQUFtQjtrQkFEL0IsU0FBUzsrQkFBYSxpQkFBaUI7d0lBRW5CLElBQUk7c0JBQXRCLFNBQVM7dUJBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IER4RGF0YUdyaWRDb21wb25lbnQgfSBmcm9tICdkZXZleHRyZW1lLWFuZ3VsYXInO1xuaW1wb3J0IEN1c3RvbVN0b3JlIGZyb20gJ2RldmV4dHJlbWUvZGF0YS9jdXN0b21fc3RvcmUnO1xuaW1wb3J0IHsgZmlyc3RWYWx1ZUZyb20gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFBlcm1pc3Npb25TZXJ2aWNlIH0gZnJvbSAnQGFicC9uZy5jb3JlJztcbmltcG9ydCB7IEludGFrZVZlaGljbGUsIE1vdmVtZW50VHlwZSB9IGZyb20gJy4uL21vZGVscy9pbnRha2UubW9kZWxzJztcbmltcG9ydCB7IFF1YWxpdHlBcGlTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvcXVhbGl0eS1hcGkuc2VydmljZSc7XG5pbXBvcnQgeyBkb3dubG9hZCwgZXJyb3JNZXNzYWdlLCBzdGF0dXNMYWJlbCB9IGZyb20gJy4uL3NlcnZpY2VzL3F1YWxpdHktbWVhc3VyZW1lbnRzJztcblxuQENvbXBvbmVudCh7IHNlbGVjdG9yOiAnbGliLWludGFrZS1saXN0JywgdGVtcGxhdGVVcmw6ICcuL2ludGFrZS1ncmlkLmNvbXBvbmVudC5odG1sJywgc3R5bGVVcmxzOiBbJy4vaW50YWtlLmNvbXBvbmVudC5zY3NzJ10gfSlcbmV4cG9ydCBjbGFzcyBJbnRha2VMaXN0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQFZpZXdDaGlsZCgnZ3JpZCcpIGdyaWQ/OiBEeERhdGFHcmlkQ29tcG9uZW50O1xuICByZWFkb25seSBzdGF0dXNlcyA9IFt7IHZhbHVlOiAnV2FpdGluZycsIHRleHQ6ICdCZWtsaXlvcicgfSwgeyB2YWx1ZTogJ0RyYWZ0JywgdGV4dDogJ1Rhc2xhaycgfSwgeyB2YWx1ZTogJ0FjY2VwdGVkJywgdGV4dDogJ0thYnVsJyB9LCB7IHZhbHVlOiAnUmVqZWN0ZWQnLCB0ZXh0OiAnUmV0JyB9XTtcbiAgcmVhZG9ubHkgZGF0YVNvdXJjZSA9IG5ldyBDdXN0b21TdG9yZSh7IGtleTogJ2RvY0VudHJ5JywgbG9hZDogYXN5bmMgb3B0aW9ucyA9PiB7XG4gICAgdGhpcy5lcnJvciA9ICcnO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLmFwaS5pbnRha2VMaXN0KHsgLi4udGhpcy5xdWVyeSwgc2VhcmNoOiBTdHJpbmcob3B0aW9ucy5zZWFyY2hWYWx1ZSB8fCAnJyksXG4gICAgICAgIHNraXBDb3VudDogb3B0aW9ucy5za2lwIHx8IDAsIG1heFJlc3VsdENvdW50OiBvcHRpb25zLnRha2UgfHwgMjAsXG4gICAgICAgIGZpbHRlcjogb3B0aW9ucy5maWx0ZXIgPyBKU09OLnN0cmluZ2lmeShvcHRpb25zLmZpbHRlcikgOiAnJywgc29ydDogb3B0aW9ucy5zb3J0ID8gSlNPTi5zdHJpbmdpZnkob3B0aW9ucy5zb3J0KSA6ICcnIH0pKTtcbiAgICAgIHRoaXMucm93cyA9IHJlc3VsdC5pdGVtczsgdGhpcy50b3RhbCA9IHJlc3VsdC50b3RhbENvdW50O1xuICAgICAgcmV0dXJuIHsgZGF0YTogcmVzdWx0Lml0ZW1zLCB0b3RhbENvdW50OiByZXN1bHQudG90YWxDb3VudCB9O1xuICAgIH0gY2F0Y2ggKGUpIHsgdGhpcy5lcnJvciA9IGVycm9yTWVzc2FnZShlKTsgdGhyb3cgbmV3IEVycm9yKHRoaXMuZXJyb3IpOyB9XG4gIH19KTtcbiAgcm93czogSW50YWtlVmVoaWNsZVtdID0gW107IHR5cGVzOiBNb3ZlbWVudFR5cGVbXSA9IFtdOyB0b3RhbCA9IDA7IGJ1c3kgPSBmYWxzZTsgZXJyb3IgPSAnJztcbiAgcXVlcnkgPSB7IHBlbmRpbmdPbmx5OiB0cnVlLCBmcm9tOiAnJywgdW50aWw6ICcnLCBzZWFyY2g6ICcnLCBtb3ZlbWVudFR5cGVDb2RlOiAnJywgc3RhdHVzOiAnJywgc2tpcENvdW50OiAwLCBtYXhSZXN1bHRDb3VudDogMjAgfTtcbiAgY2FuY2VsUm93OiBJbnRha2VWZWhpY2xlIHwgbnVsbCA9IG51bGw7IHJlYXNvbiA9ICcnOyBzdGF0dXNMYWJlbCA9IHN0YXR1c0xhYmVsO1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGFwaTogUXVhbGl0eUFwaVNlcnZpY2UsIHByaXZhdGUgcGVybWlzc2lvbnM6IFBlcm1pc3Npb25TZXJ2aWNlKSB7fVxuICBuZ09uSW5pdCgpOiB2b2lkIHsgdGhpcy5hcGkucXVhbGl0eU1vdmVtZW50VHlwZXMoKS5zdWJzY3JpYmUoeyBuZXh0OiB0eXBlcyA9PiB0aGlzLnR5cGVzID0gdHlwZXMsIGVycm9yOiBlID0+IHRoaXMuZXJyb3IgPSBlcnJvck1lc3NhZ2UoZSkgfSk7IHRoaXMubG9hZCgpOyB9XG4gIGFsbG93ZWQocG9saWN5OiBzdHJpbmcpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMucGVybWlzc2lvbnMuZ2V0R3JhbnRlZFBvbGljeSgnSGl0c29mdC5LYWRvb2dsdS5LYWxpdGUuSW50YWtlLicgKyBwb2xpY3kpOyB9XG4gIGVkaXRhYmxlKHJvdzogSW50YWtlVmVoaWNsZSk6IGJvb2xlYW4geyByZXR1cm4gcm93LnZlaGljbGVTdGF0dXMgPT09ICcwJyAmJiAhcm93LmZpcnN0V2VpZ2h0ICYmICFyb3cuaGFzRXhpdGVkOyB9XG4gIGxvYWQocmVzZXQgPSBmYWxzZSk6IHZvaWQge1xuICAgIHRoaXMuYnVzeSA9IGZhbHNlO1xuICAgIGlmIChyZXNldCkgdGhpcy5ncmlkPy5pbnN0YW5jZS5wYWdlSW5kZXgoMCk7XG4gICAgdGhpcy5ncmlkPy5pbnN0YW5jZS5yZWZyZXNoKCk7XG4gIH1cbiAgdGFiKHBlbmRpbmc6IGJvb2xlYW4pOiB2b2lkIHsgdGhpcy5xdWVyeS5wZW5kaW5nT25seSA9IHBlbmRpbmc7IHRoaXMubG9hZCh0cnVlKTsgfVxuICBwYWdlKGRpcmVjdGlvbjogbnVtYmVyKTogdm9pZCB7IHRoaXMucXVlcnkuc2tpcENvdW50ICs9IGRpcmVjdGlvbiAqIHRoaXMucXVlcnkubWF4UmVzdWx0Q291bnQ7IHRoaXMubG9hZCgpOyB9XG4gIGdldCBwYWdlTnVtYmVyKCk6IG51bWJlciB7IHJldHVybiBNYXRoLmZsb29yKHRoaXMucXVlcnkuc2tpcENvdW50IC8gdGhpcy5xdWVyeS5tYXhSZXN1bHRDb3VudCkgKyAxOyB9XG4gIHByaW50KHJvdzogSW50YWtlVmVoaWNsZSk6IHZvaWQgeyB0aGlzLmFwaS5pbnRha2VQZGYocm93LmRvY0VudHJ5KS5zdWJzY3JpYmUoeyBuZXh0OiBibG9iID0+IGRvd25sb2FkKGJsb2IsIGBHaXJkaS1Lb250cm9sLSR7cm93LmRvY0VudHJ5fS5wZGZgKSwgZXJyb3I6IGUgPT4gdGhpcy5lcnJvciA9IGVycm9yTWVzc2FnZShlKSB9KTsgfVxuICBjYW5jZWwoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNhbmNlbFJvdyB8fCAhdGhpcy5yZWFzb24udHJpbSgpKSB7IHRoaXMuZXJyb3IgPSAnxLBwdGFsIGdlcmVrw6dlc2kgZ2lyaW4uJzsgcmV0dXJuOyB9XG4gICAgdGhpcy5idXN5ID0gdHJ1ZTtcbiAgICBjb25zdCBpZCA9IHRoaXMuY2FuY2VsUm93LmRvY0VudHJ5O1xuICAgIHRoaXMuYXBpLmludGFrZShpZCkuc3Vic2NyaWJlKHsgbmV4dDogZm9ybSA9PiB0aGlzLmFwaS5jYW5jZWxJbnRha2UoaWQsIGZvcm0uaW5zcGVjdGlvbi5yZXZpc2lvbiwgdGhpcy5yZWFzb24pLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoKSA9PiB7IHRoaXMuY2FuY2VsUm93ID0gbnVsbDsgdGhpcy5yZWFzb24gPSAnJzsgdGhpcy5sb2FkKCk7IH0sIGVycm9yOiBlID0+IHsgdGhpcy5lcnJvciA9IGVycm9yTWVzc2FnZShlKTsgdGhpcy5idXN5ID0gZmFsc2U7IH1cbiAgICB9KSwgZXJyb3I6IGUgPT4geyB0aGlzLmVycm9yID0gZXJyb3JNZXNzYWdlKGUpOyB0aGlzLmJ1c3kgPSBmYWxzZTsgfSB9KTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPjxoMz5IYW0gWWHEnyBHaXJpxZ8gS2FsaXRlIEtvbnRyb2w8L2gzPjxkaXYgY2xhc3M9XCJjYXJkXCI+PGRpdiBjbGFzcz1cImNhcmQtYm9keVwiPlxuICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIG1iLTNcIiByb2xlPVwidGFibGlzdFwiPjxidXR0b24gY2xhc3M9XCJidG5cIiBbY2xhc3MuYnRuLXN1Y2Nlc3NdPVwicXVlcnkucGVuZGluZ09ubHlcIiBbY2xhc3MuYnRuLW91dGxpbmUtc2Vjb25kYXJ5XT1cIiFxdWVyeS5wZW5kaW5nT25seVwiIChjbGljayk9XCJ0YWIodHJ1ZSlcIj5LYWxpdGUgS29udHJvbCBCZWtsZXllbmxlcjwvYnV0dG9uPjxidXR0b24gY2xhc3M9XCJidG5cIiBbY2xhc3MuYnRuLXN1Y2Nlc3NdPVwiIXF1ZXJ5LnBlbmRpbmdPbmx5XCIgW2NsYXNzLmJ0bi1vdXRsaW5lLXNlY29uZGFyeV09XCJxdWVyeS5wZW5kaW5nT25seVwiIChjbGljayk9XCJ0YWIoZmFsc2UpXCI+VMO8bSBLYXnEsXRsYXI8L2J1dHRvbj48L2Rpdj5cbiAgPGRpdiBjbGFzcz1cInJvdyBtYi0zXCI+PGRpdiBjbGFzcz1cImNvbC1tZC0zXCI+PGxhYmVsPkJhxZ9sYW5nxLHDpzwvbGFiZWw+PGlucHV0IHR5cGU9XCJkYXRlXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cInF1ZXJ5LmZyb21cIiAvPjwvZGl2PjxkaXYgY2xhc3M9XCJjb2wtbWQtM1wiPjxsYWJlbD5CaXRpxZ88L2xhYmVsPjxpbnB1dCB0eXBlPVwiZGF0ZVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgWyhuZ01vZGVsKV09XCJxdWVyeS51bnRpbFwiIC8+PC9kaXY+PGRpdiBjbGFzcz1cImNvbC1tZC0zXCI+PGxhYmVsPkFyYcOnIEhhcmVrZXQgVMO8csO8PC9sYWJlbD48c2VsZWN0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgWyhuZ01vZGVsKV09XCJxdWVyeS5tb3ZlbWVudFR5cGVDb2RlXCI+PG9wdGlvbiB2YWx1ZT1cIlwiPlTDvG3DvDwvb3B0aW9uPjxvcHRpb24gKm5nRm9yPVwibGV0IHR5cGUgb2YgdHlwZXNcIiBbdmFsdWVdPVwidHlwZS5jb2RlXCI+e3t0eXBlLm5hbWV9fTwvb3B0aW9uPjwvc2VsZWN0PjwvZGl2PjxkaXYgY2xhc3M9XCJjb2wtbWQtMyBkLWZsZXggYWxpZ24taXRlbXMtZW5kXCI+PGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIChjbGljayk9XCJsb2FkKHRydWUpXCI+RmlsdHJlbGU8L2J1dHRvbj48L2Rpdj48L2Rpdj5cbiAgPGRpdiAqbmdJZj1cImVycm9yXCIgY2xhc3M9XCJhbGVydCBhbGVydC1kYW5nZXJcIiByb2xlPVwiYWxlcnRcIj57e2Vycm9yfX08L2Rpdj5cbiAgPGR4LWRhdGEtZ3JpZCAjZ3JpZCBjbGFzcz1cImludGFrZS1ncmlkXCIgW2RhdGFTb3VyY2VdPVwiZGF0YVNvdXJjZVwiIFtyZW1vdGVPcGVyYXRpb25zXT1cIntwYWdpbmc6IHRydWUsIGZpbHRlcmluZzogdHJ1ZSwgc29ydGluZzogdHJ1ZX1cIiBbc2hvd0JvcmRlcnNdPVwidHJ1ZVwiIFtyb3dBbHRlcm5hdGlvbkVuYWJsZWRdPVwidHJ1ZVwiIFtjb2x1bW5BdXRvV2lkdGhdPVwidHJ1ZVwiIFthbGxvd0NvbHVtblJlc2l6aW5nXT1cInRydWVcIiBjb2x1bW5SZXNpemluZ01vZGU9XCJ3aWRnZXRcIiBzdHlsZT1cImhlaWdodDogY2FsYygxMDB2aCAtIDM1MHB4KVwiPlxuICAgIDxkeG8tZmlsdGVyLXJvdyBbdmlzaWJsZV09XCJ0cnVlXCI+PC9keG8tZmlsdGVyLXJvdz48ZHhvLXNlYXJjaC1wYW5lbCBbdmlzaWJsZV09XCJ0cnVlXCIgW3dpZHRoXT1cIjIyMFwiIHBsYWNlaG9sZGVyPVwiQXJh4oCmXCI+PC9keG8tc2VhcmNoLXBhbmVsPlxuICAgIDxkeG8tcGFnaW5nIFtwYWdlU2l6ZV09XCIyMFwiPjwvZHhvLXBhZ2luZz48ZHhvLXBhZ2VyIFt2aXNpYmxlXT1cInRydWVcIiBbc2hvd0luZm9dPVwidHJ1ZVwiIFthbGxvd2VkUGFnZVNpemVzXT1cIlsxMCwyMCw1MF1cIiBbc2hvd1BhZ2VTaXplU2VsZWN0b3JdPVwidHJ1ZVwiIFtzaG93TmF2aWdhdGlvbkJ1dHRvbnNdPVwidHJ1ZVwiPjwvZHhvLXBhZ2VyPlxuICAgIDxkeGktY29sdW1uIGNhcHRpb249XCLEsMWfbGVtbGVyXCIgY2VsbFRlbXBsYXRlPVwiYWN0aW9uc1wiIFthbGxvd0ZpbHRlcmluZ109XCJmYWxzZVwiIFthbGxvd1NvcnRpbmddPVwiZmFsc2VcIiBbZml4ZWRdPVwidHJ1ZVwiIFt3aWR0aF09XCIxNDVcIj48L2R4aS1jb2x1bW4+XG4gICAgPGR4aS1jb2x1bW4gZGF0YUZpZWxkPVwicXVhbGl0eVN0YXR1c1wiIGNhcHRpb249XCJLYWxpdGUgRHVydW11XCIgY2VsbFRlbXBsYXRlPVwic3RhdHVzXCI+PGR4by1sb29rdXAgW2RhdGFTb3VyY2VdPVwic3RhdHVzZXNcIiB2YWx1ZUV4cHI9XCJ2YWx1ZVwiIGRpc3BsYXlFeHByPVwidGV4dFwiPjwvZHhvLWxvb2t1cD48L2R4aS1jb2x1bW4+XG4gICAgPGR4aS1jb2x1bW4gZGF0YUZpZWxkPVwic2VxdWVuY2VOdW1iZXJcIiBjYXB0aW9uPVwiU8SxcmEgTm9cIj48L2R4aS1jb2x1bW4+PGR4aS1jb2x1bW4gZGF0YUZpZWxkPVwiZG9jTnVtXCIgY2FwdGlvbj1cIkJlbGdlIE5vXCIgZGF0YVR5cGU9XCJudW1iZXJcIj48L2R4aS1jb2x1bW4+PGR4aS1jb2x1bW4gZGF0YUZpZWxkPVwiZ2F0ZUNvZGVcIiBjYXB0aW9uPVwiS2FwxLFcIj48L2R4aS1jb2x1bW4+XG4gICAgPGR4aS1jb2x1bW4gZGF0YUZpZWxkPVwiZW50cnlEYXRlXCIgY2FwdGlvbj1cIkdpcmnFnyBUYXJpaGkgLyBTYWF0aVwiIGRhdGFUeXBlPVwiZGF0ZXRpbWVcIiBmb3JtYXQ9XCJkZC5NTS55eXl5IEhIOm1tXCI+PC9keGktY29sdW1uPjxkeGktY29sdW1uIGRhdGFGaWVsZD1cIm1vdmVtZW50VHlwZU5hbWVcIiBjYXB0aW9uPVwiQXJhw6cgSGFyZWtldCBUw7xyw7xcIj48L2R4aS1jb2x1bW4+PGR4aS1jb2x1bW4gZGF0YUZpZWxkPVwibW92ZW1lbnREZXRhaWxOYW1lXCIgY2FwdGlvbj1cIkRldGF5XCI+PC9keGktY29sdW1uPlxuICAgIDxkeGktY29sdW1uIGRhdGFGaWVsZD1cInBsYXRlXCIgY2FwdGlvbj1cIkthbXlvbiBQbGFrYXPEsVwiPjwvZHhpLWNvbHVtbj48ZHhpLWNvbHVtbiBkYXRhRmllbGQ9XCJ0cmFpbGVyUGxhdGVcIiBjYXB0aW9uPVwiRG9yc2UgUGxha2FzxLFcIj48L2R4aS1jb2x1bW4+PGR4aS1jb2x1bW4gZGF0YUZpZWxkPVwiZHJpdmVyXCIgY2FwdGlvbj1cIsWeb2bDtnJcIj48L2R4aS1jb2x1bW4+XG4gICAgPGR4aS1jb2x1bW4gZGF0YUZpZWxkPVwicGFydG5lck5hbWVcIiBjYXB0aW9uPVwiTXVoYXRhcFwiPjwvZHhpLWNvbHVtbj48ZHhpLWNvbHVtbiBkYXRhRmllbGQ9XCJzaGlwTmFtZVwiIGNhcHRpb249XCJHZW1pXCI+PC9keGktY29sdW1uPjxkeGktY29sdW1uIGRhdGFGaWVsZD1cInN0b2NrVHJhbnNmZXJOdW1iZXJcIiBjYXB0aW9uPVwiU3RvayBOYWtsaVwiPjwvZHhpLWNvbHVtbj5cbiAgICA8ZHhpLWNvbHVtbiBkYXRhRmllbGQ9XCJvcmlnaW5cIiBjYXB0aW9uPVwiTWVuxZ9laVwiPjxkeG8tbG9va3VwIFtkYXRhU291cmNlXT1cIlt7Y29kZTonRG9tZXN0aWMnLG5hbWU6J8Sww6cgUGl5YXNhJ30se2NvZGU6J0ltcG9ydGVkJyxuYW1lOifEsHRoYWwnfV1cIiB2YWx1ZUV4cHI9XCJjb2RlXCIgZGlzcGxheUV4cHI9XCJuYW1lXCI+PC9keG8tbG9va3VwPjwvZHhpLWNvbHVtbj5cbiAgICA8ZHhpLWNvbHVtbiBkYXRhRmllbGQ9XCJzZWFsTnVtYmVyXCIgY2FwdGlvbj1cIk3DvGjDvHIgTm9cIj48L2R4aS1jb2x1bW4+PGR4aS1jb2x1bW4gZGF0YUZpZWxkPVwiYW5hbHlzdFwiIGNhcHRpb249XCJBbmFsaXppIFlhcGFuXCI+PC9keGktY29sdW1uPjxkeGktY29sdW1uIGRhdGFGaWVsZD1cImluc3BlY3RlZEF0XCIgY2FwdGlvbj1cIktvbnRyb2wgVGFyaWhpXCIgZGF0YVR5cGU9XCJkYXRldGltZVwiIGZvcm1hdD1cImRkLk1NLnl5eXkgSEg6bW1cIj48L2R4aS1jb2x1bW4+PGR4aS1jb2x1bW4gZGF0YUZpZWxkPVwibm90ZXNcIiBjYXB0aW9uPVwiQcOnxLFrbGFtYVwiPjwvZHhpLWNvbHVtbj5cbiAgICA8ZGl2ICpkeFRlbXBsYXRlPVwibGV0IGNlbGwgb2YgJ3N0YXR1cydcIj48c3BhbiBjbGFzcz1cImJhZGdlXCIgW2NsYXNzLmJhZGdlLXN1Y2Nlc3NdPVwiY2VsbC5kYXRhLnF1YWxpdHlTdGF0dXMgPT09ICdBY2NlcHRlZCdcIiBbY2xhc3MuYmFkZ2UtZGFuZ2VyXT1cImNlbGwuZGF0YS5xdWFsaXR5U3RhdHVzID09PSAnUmVqZWN0ZWQnXCIgW2NsYXNzLmJhZGdlLXdhcm5pbmddPVwiY2VsbC5kYXRhLnF1YWxpdHlTdGF0dXMgPT09ICdXYWl0aW5nJyB8fCBjZWxsLmRhdGEucXVhbGl0eVN0YXR1cyA9PT0gJ0RyYWZ0J1wiPnt7c3RhdHVzTGFiZWwoY2VsbC5kYXRhLnF1YWxpdHlTdGF0dXMpfX08L3NwYW4+PC9kaXY+XG4gICAgPGRpdiAqZHhUZW1wbGF0ZT1cImxldCBjZWxsIG9mICdhY3Rpb25zJ1wiIGNsYXNzPVwiaW50YWtlLWFjdGlvbnMtY2VsbFwiPlxuICAgICAgPGRpdiBuZ2JEcm9wZG93biBjb250YWluZXI9XCJib2R5XCIgY2xhc3M9XCJkLWlubGluZS1ibG9ja1wiIHBsYWNlbWVudD1cImJvdHRvbS1zdGFydCB0b3Atc3RhcnRcIj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbmdiRHJvcGRvd25Ub2dnbGUgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1wcmltYXJ5IGludGFrZS1hY3Rpb25zLXRvZ2dsZVwiPjxpIGNsYXNzPVwiZmEgZmEtY29nXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPjxzcGFuPsSwxZ9sZW1sZXI8L3NwYW4+PC9idXR0b24+XG4gICAgICAgIDxkaXYgbmdiRHJvcGRvd25NZW51IGNsYXNzPVwiaW50YWtlLWFjdGlvbi1tZW51XCI+XG4gICAgICAgICAgPGEgbmdiRHJvcGRvd25JdGVtICpuZ0lmPVwiZWRpdGFibGUoY2VsbC5kYXRhKSAmJiBhbGxvd2VkKCdFZGl0JylcIiBbcm91dGVyTGlua109XCJbJy9rYWxpdGUvaW50YWtlJyxjZWxsLmRhdGEuZG9jRW50cnldXCI+e3tjZWxsLmRhdGEucXVhbGl0eVN0YXR1cyA9PT0gJ1dhaXRpbmcnID8gJ0thbGl0ZSBLb250cm9sIFlhcCcgOiAnRMO8emVubGUnfX08L2E+XG4gICAgICAgICAgPGEgbmdiRHJvcGRvd25JdGVtIFtyb3V0ZXJMaW5rXT1cIlsnL2thbGl0ZS9pbnRha2UnLGNlbGwuZGF0YS5kb2NFbnRyeV1cIiBbcXVlcnlQYXJhbXNdPVwie21vZGU6J3ZpZXcnfVwiPsOWemV0aSBHw7Zyw7xudMO8bGU8L2E+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbmdiRHJvcGRvd25JdGVtICpuZ0lmPVwiY2VsbC5kYXRhLnF1YWxpdHlTdGF0dXMgIT09ICdXYWl0aW5nJyAmJiBhbGxvd2VkKCdQcmludCcpXCIgKGNsaWNrKT1cInByaW50KGNlbGwuZGF0YSlcIj5HaXJkaSBLb250cm9sIEZvcm11IFlhemTEsXI8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBuZ2JEcm9wZG93bkl0ZW0gKm5nSWY9XCJlZGl0YWJsZShjZWxsLmRhdGEpICYmIGNlbGwuZGF0YS5xdWFsaXR5U3RhdHVzICE9PSAnV2FpdGluZycgJiYgYWxsb3dlZCgnQ2FuY2VsJylcIiAoY2xpY2spPVwiY2FuY2VsUm93ID0gY2VsbC5kYXRhOyByZWFzb24gPSAnJ1wiPsSwcHRhbCBFdDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2R4LWRhdGEtZ3JpZD5cbjwvZGl2PjwvZGl2PjwvZGl2PlxuPGFicC1tb2RhbCBbdmlzaWJsZV09XCIhIWNhbmNlbFJvd1wiICh2aXNpYmxlQ2hhbmdlKT1cIiEkZXZlbnQgJiYgKGNhbmNlbFJvdyA9IG51bGwpXCIgW2J1c3ldPVwiYnVzeVwiPjxuZy10ZW1wbGF0ZSAjYWJwSGVhZGVyPjxoNT5LYWxpdGUgS29udHJvbMO8bsO8IMSwcHRhbCBFdDwvaDU+PC9uZy10ZW1wbGF0ZT48bmctdGVtcGxhdGUgI2FicEJvZHk+PGxhYmVsPsSwcHRhbCBHZXJla8OnZXNpPC9sYWJlbD48dGV4dGFyZWEgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiByb3dzPVwiM1wiIFsobmdNb2RlbCldPVwicmVhc29uXCI+PC90ZXh0YXJlYT48cCBjbGFzcz1cInRleHQtbXV0ZWQgbXQtMlwiPkthecSxdCB5ZW5pZGVuIGthbGl0ZSBrb250cm9sIGJla2xleWVubGVyZSBhbMSxbsSxci48L3A+PC9uZy10ZW1wbGF0ZT48bmctdGVtcGxhdGUgI2FicEZvb3Rlcj48YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnlcIiAoY2xpY2spPVwiY2FuY2VsUm93ID0gbnVsbFwiIFtkaXNhYmxlZF09XCJidXN5XCI+VmF6Z2XDpzwvYnV0dG9uPjxidXR0b24gY2xhc3M9XCJidG4gYnRuLWRhbmdlclwiIChjbGljayk9XCJjYW5jZWwoKVwiIFtkaXNhYmxlZF09XCJidXN5IHx8ICFyZWFzb24udHJpbSgpXCI+xLBwdGFsIEV0PC9idXR0b24+PC9uZy10ZW1wbGF0ZT48L2FicC1tb2RhbD5cbiJdfQ==
@@ -0,0 +1,18 @@
1
+ import { Component } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "../services/kalite.service";
4
+ export class KaliteComponent {
5
+ constructor(service) {
6
+ this.service = service;
7
+ }
8
+ ngOnInit() {
9
+ this.service.sample().subscribe(console.log);
10
+ }
11
+ }
12
+ KaliteComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: KaliteComponent, deps: [{ token: i1.KaliteService }], target: i0.ɵɵFactoryTarget.Component });
13
+ KaliteComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: KaliteComponent, selector: "lib-kalite", ngImport: i0, template: ` <p>kalite works!</p> `, isInline: true });
14
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: KaliteComponent, decorators: [{
15
+ type: Component,
16
+ args: [{ selector: 'lib-kalite', template: ` <p>kalite works!</p> ` }]
17
+ }], ctorParameters: function () { return [{ type: i1.KaliteService }]; } });
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2FsaXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2thbGl0ZS9zcmMvbGliL2NvbXBvbmVudHMva2FsaXRlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sZUFBZSxDQUFDOzs7QUFRbEQsTUFBTSxPQUFPLGVBQWU7SUFDMUIsWUFBb0IsT0FBc0I7UUFBdEIsWUFBTyxHQUFQLE9BQU8sQ0FBZTtJQUFHLENBQUM7SUFFOUMsUUFBUTtRQUNOLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMvQyxDQUFDOzs0R0FMVSxlQUFlO2dHQUFmLGVBQWUsa0RBSGhCLHdCQUF3QjsyRkFHdkIsZUFBZTtrQkFMM0IsU0FBUzsrQkFDRSxZQUFZLFlBQ1osd0JBQXdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEthbGl0ZVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9rYWxpdGUuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1rYWxpdGUnLFxuICB0ZW1wbGF0ZTogYCA8cD5rYWxpdGUgd29ya3MhPC9wPiBgLFxuICBzdHlsZXM6IFtdLFxufSlcbmV4cG9ydCBjbGFzcyBLYWxpdGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHNlcnZpY2U6IEthbGl0ZVNlcnZpY2UpIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zZXJ2aWNlLnNhbXBsZSgpLnN1YnNjcmliZShjb25zb2xlLmxvZyk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,197 @@
1
+ import { Component, ViewChild } from '@angular/core';
2
+ import { applicableLimit, recalculate } from '../services/quality-measurements';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "../services/quality-api.service";
5
+ import * as i2 from "@abp/ng.core";
6
+ import * as i3 from "@angular/common";
7
+ import * as i4 from "@angular/forms";
8
+ export class ProcessAnalysisComponent {
9
+ constructor(api, permissions) {
10
+ this.api = api;
11
+ this.permissions = permissions;
12
+ this.tanks = [];
13
+ this.facilities = [];
14
+ this.facilityCode = '';
15
+ this.businessDate = this.today();
16
+ this.analysis = null;
17
+ this.groups = [];
18
+ this.parameters = [];
19
+ this.reason = '';
20
+ this.busy = true;
21
+ this.busyText = 'Tesisler yükleniyor…';
22
+ this.error = '';
23
+ this.reasonError = '';
24
+ }
25
+ ngOnInit() {
26
+ this.api.tanks().subscribe({ next: x => this.tanks = x.filter(t => t.active), error: () => { } });
27
+ this.api.facilities().subscribe({
28
+ next: facilities => {
29
+ this.facilities = facilities;
30
+ this.facilityCode = facilities[0]?.code || '';
31
+ if (this.facilityCode)
32
+ this.load();
33
+ else
34
+ this.busy = false;
35
+ },
36
+ error: () => { this.error = 'Tesisler yüklenemedi.'; this.busy = false; },
37
+ });
38
+ }
39
+ get editable() {
40
+ return !this.busy && this.analysis?.status === 'Draft' &&
41
+ this.permissions.getGrantedPolicy('Hitsoft.Kadooglu.Kalite.ProcessAnalysis.Create');
42
+ }
43
+ get hasOutOfLimit() {
44
+ return this.analysis?.hours.some(h => h.measurements.some(v => v.outOfLimit)) || false;
45
+ }
46
+ get statusText() {
47
+ return { Draft: 'Taslak', LaborantSigned: 'Laborant imzaladı',
48
+ Checked: 'Mühendis kontrol etti', Approved: 'Onaylı' }[this.analysis?.status || ''] || '';
49
+ }
50
+ allowed(permission) {
51
+ return this.permissions.getGrantedPolicy(`Hitsoft.Kadooglu.Kalite.ProcessAnalysis.${permission}`);
52
+ }
53
+ load() {
54
+ if (!this.facilityCode || !this.businessDate)
55
+ return;
56
+ this.busy = true;
57
+ this.busyText = 'Analiz verileri yükleniyor…';
58
+ this.error = '';
59
+ this.api.process(this.facilityCode, this.businessDate).subscribe({
60
+ next: analysis => {
61
+ this.applyAnalysis(analysis);
62
+ this.busy = false;
63
+ },
64
+ error: () => { this.error = 'Analiz formu yüklenemedi.'; this.busy = false; },
65
+ });
66
+ }
67
+ applyAnalysis(analysis) {
68
+ this.analysis = analysis;
69
+ const template = analysis.templateSnapshot;
70
+ this.groups = [...template.steps].sort((a, b) => a.order - b.order).map(step => ({
71
+ step,
72
+ parameters: template.parameters.filter(p => p.active && p.stepCode === step.processCode)
73
+ .sort((a, b) => a.order - b.order),
74
+ }));
75
+ this.parameters = [].concat(...this.groups.map(group => group.parameters));
76
+ for (const hour of analysis.hours) {
77
+ hour.measurements || (hour.measurements = []);
78
+ for (const parameter of this.parameters) {
79
+ if (!hour.measurements.some(v => v.parameterCode === parameter.code)) {
80
+ hour.measurements.push({ parameterCode: parameter.code, number: null, text: '', outOfLimit: false });
81
+ }
82
+ }
83
+ }
84
+ }
85
+ measurement(row, parameter) {
86
+ return row.measurements.find(v => v.parameterCode === parameter.code);
87
+ }
88
+ limit(parameter) {
89
+ return applicableLimit(this.analysis?.templateSnapshot.limits || [], parameter.code, this.businessDate, this.analysis?.oilType || '');
90
+ }
91
+ limitLabel(parameter) {
92
+ const limit = this.limit(parameter);
93
+ if (!limit)
94
+ return '—';
95
+ if (limit.expectedText)
96
+ return limit.expectedText;
97
+ if (limit.minimum != null && limit.maximum != null)
98
+ return `${limit.minimum}–${limit.maximum}`;
99
+ if (limit.minimum != null)
100
+ return `≥ ${limit.minimum}`;
101
+ if (limit.maximum != null)
102
+ return `≤ ${limit.maximum}`;
103
+ return '—';
104
+ }
105
+ changed(row, parameter) {
106
+ try {
107
+ recalculate(this.parameters, row.measurements, this.analysis?.templateSnapshot.limits || [], this.businessDate, this.analysis?.oilType || '');
108
+ }
109
+ catch (e) {
110
+ this.error = e instanceof Error ? e.message : 'Hesaplama yapılamadı.';
111
+ }
112
+ const value = this.measurement(row, parameter);
113
+ const limit = this.limit(parameter);
114
+ value.outOfLimit = !!limit && ((value.number != null &&
115
+ ((limit.minimum != null && value.number < limit.minimum) ||
116
+ (limit.maximum != null && value.number > limit.maximum))) ||
117
+ (!!value.text && !!limit.expectedText &&
118
+ value.text.trim().toLocaleLowerCase('tr-TR') !== limit.expectedText.trim().toLocaleLowerCase('tr-TR')));
119
+ }
120
+ oilTypeChanged() {
121
+ for (const row of this.analysis?.hours || [])
122
+ for (const parameter of this.parameters)
123
+ this.changed(row, parameter);
124
+ }
125
+ average(parameter) {
126
+ const values = this.analysis?.hours.map(h => this.measurement(h, parameter).number)
127
+ .filter((v) => v != null) || [];
128
+ if (!values.length)
129
+ return '—';
130
+ return (values.reduce((a, b) => a + b, 0) / values.length).toFixed(parameter.decimalPlaces);
131
+ }
132
+ save() {
133
+ if (!this.analysis || !this.editable)
134
+ return;
135
+ this.busy = true;
136
+ this.busyText = 'Form kaydediliyor…';
137
+ this.error = '';
138
+ const input = {
139
+ facilityCode: this.analysis.facilityCode,
140
+ businessDate: this.businessDate,
141
+ oilType: this.analysis.oilType,
142
+ notes: this.analysis.notes,
143
+ revision: this.analysis.revision,
144
+ hours: this.analysis.hours,
145
+ };
146
+ this.api.saveProcess(input).subscribe({
147
+ next: analysis => { this.applyAnalysis(analysis); this.busy = false; },
148
+ error: () => { this.error = 'Form kaydedilemedi. Alanları ve bağlantıyı kontrol edin.'; this.busy = false; },
149
+ });
150
+ }
151
+ decision(action) {
152
+ if (!this.analysis || !this.analysis.revision)
153
+ return;
154
+ if ((action === 'revoke' || (action === 'approve' && this.hasOutOfLimit)) && !this.reason.trim()) {
155
+ this.reasonError = 'Bu işlem için gerekçe girin.';
156
+ setTimeout(() => this.reasonInput?.nativeElement.focus());
157
+ return;
158
+ }
159
+ this.busy = true;
160
+ this.busyText = 'İşlem tamamlanıyor…';
161
+ this.error = '';
162
+ this.reasonError = '';
163
+ this.api.decision(this.analysis.code, action, this.analysis.revision, this.reason).subscribe({
164
+ next: analysis => { this.reason = ''; this.applyAnalysis(analysis); this.busy = false; },
165
+ error: () => { this.error = 'İşlem tamamlanamadı. Formun son durumunu kontrol edin.'; this.busy = false; },
166
+ });
167
+ }
168
+ downloadPdf() {
169
+ if (!this.analysis?.revision)
170
+ return;
171
+ this.api.pdf(this.analysis.code).subscribe({
172
+ next: blob => {
173
+ const url = URL.createObjectURL(blob);
174
+ const anchor = document.createElement('a');
175
+ anchor.href = url;
176
+ anchor.download = `${this.analysis?.formSnapshot.documentCode}-${this.analysis?.code}.pdf`;
177
+ anchor.click();
178
+ setTimeout(() => URL.revokeObjectURL(url), 1000);
179
+ },
180
+ error: () => this.error = 'PDF oluşturulamadı.',
181
+ });
182
+ }
183
+ today() {
184
+ const date = new Date();
185
+ return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`;
186
+ }
187
+ }
188
+ ProcessAnalysisComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ProcessAnalysisComponent, deps: [{ token: i1.QualityApiService }, { token: i2.PermissionService }], target: i0.ɵɵFactoryTarget.Component });
189
+ ProcessAnalysisComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: ProcessAnalysisComponent, selector: "lib-process-analysis", viewQueries: [{ propertyName: "reasonInput", first: true, predicate: ["reasonInput"], descendants: true }], ngImport: i0, template: "<div class=\"container-fluid\">\r\n <div class=\"mb-2\">\r\n <h3 class=\"page-title\">Rafineri Proses Analiz Kontrol</h3>\r\n </div>\r\n\r\n <div class=\"card mt-2\"><div class=\"card-body\">\r\n <div class=\"row align-items-end mb-3\">\r\n <div class=\"col-md-3\">\r\n <label for=\"facility\">Tesis</label>\r\n <select id=\"facility\" class=\"form-control\" [disabled]=\"busy\" [(ngModel)]=\"facilityCode\" (change)=\"load()\">\r\n <option *ngFor=\"let facility of facilities\" [value]=\"facility.code\">{{ facility.name }}</option>\r\n </select>\r\n </div>\r\n <div class=\"col-md-3\">\r\n <label for=\"businessDate\">\u0130\u015F g\u00FCn\u00FC</label>\r\n <input id=\"businessDate\" type=\"date\" class=\"form-control\" [disabled]=\"busy\" [(ngModel)]=\"businessDate\" (change)=\"load()\" />\r\n </div>\r\n <div class=\"col-md-3\" *ngIf=\"analysis?.facilityCode === 'DEO3'\">\r\n <label for=\"oilType\">\u00DCretilen ya\u011F cinsi</label>\r\n <select id=\"oilType\" class=\"form-control\" [(ngModel)]=\"analysis!.oilType\" (change)=\"oilTypeChanged()\" [disabled]=\"!editable\">\r\n <option value=\"\">Se\u00E7iniz</option><option value=\"Palm Oil\">Palm Oil</option>\r\n <option value=\"Palm Olein\">Palm Olein</option>\r\n </select>\r\n </div>\r\n <div class=\"col-md-3 text-md-right mt-2 mt-md-0\">\r\n <span *ngIf=\"analysis\" class=\"badge badge-info mr-2\" style=\"margin-right: 6px;\">{{ statusText }}</span>\r\n <button class=\"btn btn-outline-primary\" (click)=\"downloadPdf()\" [disabled]=\"!analysis?.revision || busy\"\r\n *ngIf=\"allowed('Print')\">Formu Yazd\u0131r (PDF)</button>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"error\" class=\"alert alert-danger\" role=\"alert\">{{ error }}</div>\r\n <div class=\"quality-grid-loading\" *ngIf=\"busy\" role=\"status\" aria-live=\"polite\" aria-busy=\"true\">\r\n <span class=\"spinner-border text-primary\" aria-hidden=\"true\"></span>\r\n <span>{{ busyText }}</span>\r\n </div>\r\n <ng-container *ngIf=\"analysis\">\r\n <div class=\"small text-muted mb-2\">{{ analysis.formSnapshot.name }} \u00B7 {{ analysis.formSnapshot.documentCode }} \u00B7 Revizyon {{ analysis.formSnapshot.revisionNumber }}</div>\r\n <div class=\"quality-grid-scroll\" [hidden]=\"busy\">\r\n <table class=\"table table-bordered table-sm quality-grid\">\r\n <thead>\r\n <tr class=\"text-center bg-light\">\r\n <th rowspan=\"3\" class=\"sticky-hour\">Saat</th><th rowspan=\"3\">Vardiya / Laborant</th>\r\n <th rowspan=\"3\">Al\u0131nan Tank No</th>\r\n <th *ngFor=\"let group of groups\" [attr.colspan]=\"group.parameters.length\">{{ group.step.name }}</th>\r\n <th rowspan=\"3\">Aktar\u0131lan Tank No</th>\r\n </tr>\r\n <tr class=\"text-center bg-light\">\r\n <ng-container *ngFor=\"let group of groups\">\r\n <th *ngFor=\"let parameter of group.parameters\">{{ parameter.name }}<small *ngIf=\"parameter.unit\"> ({{ parameter.unit }})</small></th>\r\n </ng-container>\r\n </tr>\r\n <tr class=\"text-center limit-row\">\r\n <ng-container *ngFor=\"let group of groups\">\r\n <th *ngFor=\"let parameter of group.parameters\">{{ limitLabel(parameter) }}</th>\r\n </ng-container>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of analysis.hours\">\r\n <th class=\"sticky-hour\">{{ row.hour | number:'2.0-0' }}:00</th><td><small>{{row.shiftCode}}</small><input class=\"form-control form-control-sm\" [(ngModel)]=\"row.analyst\" [disabled]=\"!editable\" aria-label=\"Vardiya laborant\u0131\" /></td>\r\n <td><input class=\"form-control form-control-sm tank-input\" list=\"qualityTanks\" [(ngModel)]=\"row.intakeTank\" [disabled]=\"!editable\" aria-label=\"Al\u0131nan tank\" /></td>\r\n <ng-container *ngFor=\"let group of groups\">\r\n <td *ngFor=\"let parameter of group.parameters\" [class.out-of-limit]=\"measurement(row, parameter).outOfLimit\">\r\n <input *ngIf=\"parameter.valueType === 'Number' || parameter.calculated\" type=\"number\"\r\n class=\"form-control form-control-sm value-input\" [attr.step]=\"'any'\"\r\n [(ngModel)]=\"measurement(row, parameter).number\" (ngModelChange)=\"changed(row, parameter)\"\r\n [disabled]=\"!editable || parameter.calculated\" [attr.aria-label]=\"parameter.name\" />\r\n <select *ngIf=\"parameter.valueType === 'Choice' && !parameter.calculated\" class=\"form-control form-control-sm value-input\"\r\n [(ngModel)]=\"measurement(row, parameter).text\" (change)=\"changed(row, parameter)\" [disabled]=\"!editable\">\r\n <option value=\"\"></option><option *ngFor=\"let option of parameter.options\" [value]=\"option\">{{ option }}</option>\r\n </select>\r\n <input *ngIf=\"parameter.valueType === 'Text' && !parameter.calculated\" class=\"form-control form-control-sm value-input\"\r\n [(ngModel)]=\"measurement(row, parameter).text\" (ngModelChange)=\"changed(row, parameter)\" [disabled]=\"!editable\"\r\n [attr.aria-label]=\"parameter.name\" />\r\n </td>\r\n </ng-container>\r\n <td><input class=\"form-control form-control-sm tank-input\" list=\"qualityTanks\" [(ngModel)]=\"row.outputTank\" [disabled]=\"!editable\" aria-label=\"Aktar\u0131lan tank\" /></td>\r\n </tr>\r\n <tr class=\"average-row\">\r\n <th colspan=\"3\">ORTALAMA</th>\r\n <ng-container *ngFor=\"let group of groups\">\r\n <td *ngFor=\"let parameter of group.parameters\">{{ parameter.valueType === 'Number' ? average(parameter) : '\u2014' }}</td>\r\n </ng-container>\r\n <td></td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div class=\"row mt-3\">\r\n <div class=\"col-md-6\">\r\n <label for=\"notes\">{{ analysis.formSnapshot.code === 'FR52' ? 'A\u00E7\u0131klama / Bilgi' : 'Notlar' }}</label>\r\n <textarea id=\"notes\" class=\"form-control\" rows=\"3\" [(ngModel)]=\"analysis.notes\" [disabled]=\"!editable\"></textarea>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label for=\"reason\">Onay / geri alma gerek\u00E7esi</label>\r\n <textarea #reasonInput id=\"reason\" class=\"form-control\" rows=\"3\" [(ngModel)]=\"reason\" (ngModelChange)=\"reasonError = ''\"\r\n [class.is-invalid]=\"reasonError\" [attr.aria-invalid]=\"!!reasonError\"\r\n [disabled]=\"busy || analysis.status === 'LaborantSigned'\"></textarea>\r\n <div *ngIf=\"reasonError\" class=\"invalid-feedback d-block\" role=\"alert\">{{ reasonError }}</div>\r\n </div>\r\n </div>\r\n <div class=\"mt-3 d-flex flex-wrap align-items-center gap-2\">\r\n <button class=\"btn btn-primary mr-2 mb-2\" (click)=\"save()\" [disabled]=\"!editable || busy\">Kaydet</button>\r\n <button class=\"btn btn-outline-primary mr-2 mb-2\" *ngIf=\"analysis.status === 'Draft' && allowed('Sign')\"\r\n (click)=\"decision('sign')\" [disabled]=\"!analysis.revision || busy\">Laborant Olarak \u0130mzala</button>\r\n <button class=\"btn btn-outline-primary mr-2 mb-2\" *ngIf=\"analysis.status === 'LaborantSigned' && allowed('Check')\"\r\n (click)=\"decision('check')\" [disabled]=\"busy\">M\u00FChendis Kontrol\u00FC</button>\r\n <button class=\"btn btn-success mr-2 mb-2\" *ngIf=\"analysis.status === 'Checked' && allowed('Approve')\"\r\n (click)=\"decision('approve')\" [disabled]=\"busy\">Son Onay</button>\r\n <button class=\"btn btn-outline-danger mr-2 mb-2\" *ngIf=\"analysis.status === 'Approved' && allowed('Revoke')\"\r\n (click)=\"decision('revoke')\" [disabled]=\"busy\">Onay\u0131 Geri Al</button>\r\n <span *ngIf=\"hasOutOfLimit\" class=\"text-danger mb-2\">Limit d\u0131\u015F\u0131 \u00F6l\u00E7\u00FCm var. Son onay i\u00E7in gerek\u00E7e gerekli.</span>\r\n </div>\r\n <div class=\"mt-3 small text-muted\">\r\n <span>Laborant: {{ analysis.laborant?.userName || '\u2014' }}</span> \u00B7\r\n <span>M\u00FChendis: {{ analysis.engineer?.userName || '\u2014' }}</span> \u00B7\r\n <span>Onaylayan: {{ analysis.approver?.userName || '\u2014' }}</span>\r\n </div>\r\n <details class=\"mt-3\" *ngIf=\"analysis.history?.length\">\r\n <summary>\u0130\u015Flem ge\u00E7mi\u015Fi</summary>\r\n <ul class=\"mt-2\"><li *ngFor=\"let event of analysis.history\">{{ event.action }} \u00B7 {{ event.userName }} \u00B7 {{ event.occurredAt | date:'dd.MM.yyyy HH:mm' }}<span *ngIf=\"event.reason\"> \u00B7 {{ event.reason }}</span></li></ul>\r\n </details>\r\n </ng-container>\r\n </div></div>\r\n</div>\r\n\r\n<datalist id=\"qualityTanks\"><option *ngFor=\"let tank of tanks\" [value]=\"tank.code\">{{tank.name}}</option></datalist>\r\n", styles: [".quality-grid-scroll{overflow:auto;max-height:calc(100vh - 340px)}.quality-grid{width:max-content;min-width:100%;table-layout:fixed}.quality-grid th,.quality-grid td{min-width:105px;vertical-align:middle;white-space:nowrap}.quality-grid .sticky-hour{position:sticky;left:0;z-index:2;min-width:72px;background:#f8f9fa}.quality-grid thead{position:sticky;top:0;z-index:3}.quality-grid thead th{background:#f8f9fa}.quality-grid thead .sticky-hour{z-index:4}.quality-grid .value-input{min-width:90px;width:100%}.quality-grid .tank-input{min-width:110px;width:100%}.quality-grid .limit-row{color:#6f42a4;font-size:.82rem}.quality-grid .out-of-limit{background:#ffe0e0}.quality-grid .out-of-limit input,.quality-grid .out-of-limit select{border-color:#d33}.quality-grid .average-row{background:#fff8d8;font-weight:600}.quality-grid-loading{min-height:280px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:16px;background:#f8f9fa;border:1px solid #dee2e6;border-radius:4px;color:#495057}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i4.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: i3.DecimalPipe, name: "number" }, { kind: "pipe", type: i3.DatePipe, name: "date" }] });
190
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ProcessAnalysisComponent, decorators: [{
191
+ type: Component,
192
+ args: [{ selector: 'lib-process-analysis', template: "<div class=\"container-fluid\">\r\n <div class=\"mb-2\">\r\n <h3 class=\"page-title\">Rafineri Proses Analiz Kontrol</h3>\r\n </div>\r\n\r\n <div class=\"card mt-2\"><div class=\"card-body\">\r\n <div class=\"row align-items-end mb-3\">\r\n <div class=\"col-md-3\">\r\n <label for=\"facility\">Tesis</label>\r\n <select id=\"facility\" class=\"form-control\" [disabled]=\"busy\" [(ngModel)]=\"facilityCode\" (change)=\"load()\">\r\n <option *ngFor=\"let facility of facilities\" [value]=\"facility.code\">{{ facility.name }}</option>\r\n </select>\r\n </div>\r\n <div class=\"col-md-3\">\r\n <label for=\"businessDate\">\u0130\u015F g\u00FCn\u00FC</label>\r\n <input id=\"businessDate\" type=\"date\" class=\"form-control\" [disabled]=\"busy\" [(ngModel)]=\"businessDate\" (change)=\"load()\" />\r\n </div>\r\n <div class=\"col-md-3\" *ngIf=\"analysis?.facilityCode === 'DEO3'\">\r\n <label for=\"oilType\">\u00DCretilen ya\u011F cinsi</label>\r\n <select id=\"oilType\" class=\"form-control\" [(ngModel)]=\"analysis!.oilType\" (change)=\"oilTypeChanged()\" [disabled]=\"!editable\">\r\n <option value=\"\">Se\u00E7iniz</option><option value=\"Palm Oil\">Palm Oil</option>\r\n <option value=\"Palm Olein\">Palm Olein</option>\r\n </select>\r\n </div>\r\n <div class=\"col-md-3 text-md-right mt-2 mt-md-0\">\r\n <span *ngIf=\"analysis\" class=\"badge badge-info mr-2\" style=\"margin-right: 6px;\">{{ statusText }}</span>\r\n <button class=\"btn btn-outline-primary\" (click)=\"downloadPdf()\" [disabled]=\"!analysis?.revision || busy\"\r\n *ngIf=\"allowed('Print')\">Formu Yazd\u0131r (PDF)</button>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"error\" class=\"alert alert-danger\" role=\"alert\">{{ error }}</div>\r\n <div class=\"quality-grid-loading\" *ngIf=\"busy\" role=\"status\" aria-live=\"polite\" aria-busy=\"true\">\r\n <span class=\"spinner-border text-primary\" aria-hidden=\"true\"></span>\r\n <span>{{ busyText }}</span>\r\n </div>\r\n <ng-container *ngIf=\"analysis\">\r\n <div class=\"small text-muted mb-2\">{{ analysis.formSnapshot.name }} \u00B7 {{ analysis.formSnapshot.documentCode }} \u00B7 Revizyon {{ analysis.formSnapshot.revisionNumber }}</div>\r\n <div class=\"quality-grid-scroll\" [hidden]=\"busy\">\r\n <table class=\"table table-bordered table-sm quality-grid\">\r\n <thead>\r\n <tr class=\"text-center bg-light\">\r\n <th rowspan=\"3\" class=\"sticky-hour\">Saat</th><th rowspan=\"3\">Vardiya / Laborant</th>\r\n <th rowspan=\"3\">Al\u0131nan Tank No</th>\r\n <th *ngFor=\"let group of groups\" [attr.colspan]=\"group.parameters.length\">{{ group.step.name }}</th>\r\n <th rowspan=\"3\">Aktar\u0131lan Tank No</th>\r\n </tr>\r\n <tr class=\"text-center bg-light\">\r\n <ng-container *ngFor=\"let group of groups\">\r\n <th *ngFor=\"let parameter of group.parameters\">{{ parameter.name }}<small *ngIf=\"parameter.unit\"> ({{ parameter.unit }})</small></th>\r\n </ng-container>\r\n </tr>\r\n <tr class=\"text-center limit-row\">\r\n <ng-container *ngFor=\"let group of groups\">\r\n <th *ngFor=\"let parameter of group.parameters\">{{ limitLabel(parameter) }}</th>\r\n </ng-container>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of analysis.hours\">\r\n <th class=\"sticky-hour\">{{ row.hour | number:'2.0-0' }}:00</th><td><small>{{row.shiftCode}}</small><input class=\"form-control form-control-sm\" [(ngModel)]=\"row.analyst\" [disabled]=\"!editable\" aria-label=\"Vardiya laborant\u0131\" /></td>\r\n <td><input class=\"form-control form-control-sm tank-input\" list=\"qualityTanks\" [(ngModel)]=\"row.intakeTank\" [disabled]=\"!editable\" aria-label=\"Al\u0131nan tank\" /></td>\r\n <ng-container *ngFor=\"let group of groups\">\r\n <td *ngFor=\"let parameter of group.parameters\" [class.out-of-limit]=\"measurement(row, parameter).outOfLimit\">\r\n <input *ngIf=\"parameter.valueType === 'Number' || parameter.calculated\" type=\"number\"\r\n class=\"form-control form-control-sm value-input\" [attr.step]=\"'any'\"\r\n [(ngModel)]=\"measurement(row, parameter).number\" (ngModelChange)=\"changed(row, parameter)\"\r\n [disabled]=\"!editable || parameter.calculated\" [attr.aria-label]=\"parameter.name\" />\r\n <select *ngIf=\"parameter.valueType === 'Choice' && !parameter.calculated\" class=\"form-control form-control-sm value-input\"\r\n [(ngModel)]=\"measurement(row, parameter).text\" (change)=\"changed(row, parameter)\" [disabled]=\"!editable\">\r\n <option value=\"\"></option><option *ngFor=\"let option of parameter.options\" [value]=\"option\">{{ option }}</option>\r\n </select>\r\n <input *ngIf=\"parameter.valueType === 'Text' && !parameter.calculated\" class=\"form-control form-control-sm value-input\"\r\n [(ngModel)]=\"measurement(row, parameter).text\" (ngModelChange)=\"changed(row, parameter)\" [disabled]=\"!editable\"\r\n [attr.aria-label]=\"parameter.name\" />\r\n </td>\r\n </ng-container>\r\n <td><input class=\"form-control form-control-sm tank-input\" list=\"qualityTanks\" [(ngModel)]=\"row.outputTank\" [disabled]=\"!editable\" aria-label=\"Aktar\u0131lan tank\" /></td>\r\n </tr>\r\n <tr class=\"average-row\">\r\n <th colspan=\"3\">ORTALAMA</th>\r\n <ng-container *ngFor=\"let group of groups\">\r\n <td *ngFor=\"let parameter of group.parameters\">{{ parameter.valueType === 'Number' ? average(parameter) : '\u2014' }}</td>\r\n </ng-container>\r\n <td></td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div class=\"row mt-3\">\r\n <div class=\"col-md-6\">\r\n <label for=\"notes\">{{ analysis.formSnapshot.code === 'FR52' ? 'A\u00E7\u0131klama / Bilgi' : 'Notlar' }}</label>\r\n <textarea id=\"notes\" class=\"form-control\" rows=\"3\" [(ngModel)]=\"analysis.notes\" [disabled]=\"!editable\"></textarea>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label for=\"reason\">Onay / geri alma gerek\u00E7esi</label>\r\n <textarea #reasonInput id=\"reason\" class=\"form-control\" rows=\"3\" [(ngModel)]=\"reason\" (ngModelChange)=\"reasonError = ''\"\r\n [class.is-invalid]=\"reasonError\" [attr.aria-invalid]=\"!!reasonError\"\r\n [disabled]=\"busy || analysis.status === 'LaborantSigned'\"></textarea>\r\n <div *ngIf=\"reasonError\" class=\"invalid-feedback d-block\" role=\"alert\">{{ reasonError }}</div>\r\n </div>\r\n </div>\r\n <div class=\"mt-3 d-flex flex-wrap align-items-center gap-2\">\r\n <button class=\"btn btn-primary mr-2 mb-2\" (click)=\"save()\" [disabled]=\"!editable || busy\">Kaydet</button>\r\n <button class=\"btn btn-outline-primary mr-2 mb-2\" *ngIf=\"analysis.status === 'Draft' && allowed('Sign')\"\r\n (click)=\"decision('sign')\" [disabled]=\"!analysis.revision || busy\">Laborant Olarak \u0130mzala</button>\r\n <button class=\"btn btn-outline-primary mr-2 mb-2\" *ngIf=\"analysis.status === 'LaborantSigned' && allowed('Check')\"\r\n (click)=\"decision('check')\" [disabled]=\"busy\">M\u00FChendis Kontrol\u00FC</button>\r\n <button class=\"btn btn-success mr-2 mb-2\" *ngIf=\"analysis.status === 'Checked' && allowed('Approve')\"\r\n (click)=\"decision('approve')\" [disabled]=\"busy\">Son Onay</button>\r\n <button class=\"btn btn-outline-danger mr-2 mb-2\" *ngIf=\"analysis.status === 'Approved' && allowed('Revoke')\"\r\n (click)=\"decision('revoke')\" [disabled]=\"busy\">Onay\u0131 Geri Al</button>\r\n <span *ngIf=\"hasOutOfLimit\" class=\"text-danger mb-2\">Limit d\u0131\u015F\u0131 \u00F6l\u00E7\u00FCm var. Son onay i\u00E7in gerek\u00E7e gerekli.</span>\r\n </div>\r\n <div class=\"mt-3 small text-muted\">\r\n <span>Laborant: {{ analysis.laborant?.userName || '\u2014' }}</span> \u00B7\r\n <span>M\u00FChendis: {{ analysis.engineer?.userName || '\u2014' }}</span> \u00B7\r\n <span>Onaylayan: {{ analysis.approver?.userName || '\u2014' }}</span>\r\n </div>\r\n <details class=\"mt-3\" *ngIf=\"analysis.history?.length\">\r\n <summary>\u0130\u015Flem ge\u00E7mi\u015Fi</summary>\r\n <ul class=\"mt-2\"><li *ngFor=\"let event of analysis.history\">{{ event.action }} \u00B7 {{ event.userName }} \u00B7 {{ event.occurredAt | date:'dd.MM.yyyy HH:mm' }}<span *ngIf=\"event.reason\"> \u00B7 {{ event.reason }}</span></li></ul>\r\n </details>\r\n </ng-container>\r\n </div></div>\r\n</div>\r\n\r\n<datalist id=\"qualityTanks\"><option *ngFor=\"let tank of tanks\" [value]=\"tank.code\">{{tank.name}}</option></datalist>\r\n", styles: [".quality-grid-scroll{overflow:auto;max-height:calc(100vh - 340px)}.quality-grid{width:max-content;min-width:100%;table-layout:fixed}.quality-grid th,.quality-grid td{min-width:105px;vertical-align:middle;white-space:nowrap}.quality-grid .sticky-hour{position:sticky;left:0;z-index:2;min-width:72px;background:#f8f9fa}.quality-grid thead{position:sticky;top:0;z-index:3}.quality-grid thead th{background:#f8f9fa}.quality-grid thead .sticky-hour{z-index:4}.quality-grid .value-input{min-width:90px;width:100%}.quality-grid .tank-input{min-width:110px;width:100%}.quality-grid .limit-row{color:#6f42a4;font-size:.82rem}.quality-grid .out-of-limit{background:#ffe0e0}.quality-grid .out-of-limit input,.quality-grid .out-of-limit select{border-color:#d33}.quality-grid .average-row{background:#fff8d8;font-weight:600}.quality-grid-loading{min-height:280px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:16px;background:#f8f9fa;border:1px solid #dee2e6;border-radius:4px;color:#495057}\n"] }]
193
+ }], ctorParameters: function () { return [{ type: i1.QualityApiService }, { type: i2.PermissionService }]; }, propDecorators: { reasonInput: [{
194
+ type: ViewChild,
195
+ args: ['reasonInput']
196
+ }] } });
197
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2Vzcy1hbmFseXNpcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rYWxpdGUvc3JjL2xpYi9jb21wb25lbnRzL3Byb2Nlc3MtYW5hbHlzaXMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2FsaXRlL3NyYy9saWIvY29tcG9uZW50cy9wcm9jZXNzLWFuYWx5c2lzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQXNCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQVF6RSxPQUFPLEVBQUUsZUFBZSxFQUFFLFdBQVcsRUFBRSxNQUFNLGtDQUFrQyxDQUFDOzs7Ozs7QUFPaEYsTUFBTSxPQUFPLHdCQUF3QjtJQWVuQyxZQUFvQixHQUFzQixFQUFVLFdBQThCO1FBQTlELFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQVUsZ0JBQVcsR0FBWCxXQUFXLENBQW1CO1FBZGxGLFVBQUssR0FBa0IsRUFBRSxDQUFDO1FBQzFCLGVBQVUsR0FBc0IsRUFBRSxDQUFDO1FBQ25DLGlCQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLGlCQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzVCLGFBQVEsR0FBMkIsSUFBSSxDQUFDO1FBQ3hDLFdBQU0sR0FBNEQsRUFBRSxDQUFDO1FBQ3JFLGVBQVUsR0FBdUIsRUFBRSxDQUFDO1FBQ3BDLFdBQU0sR0FBRyxFQUFFLENBQUM7UUFDWixTQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ1osYUFBUSxHQUFHLHNCQUFzQixDQUFDO1FBQ2xDLFVBQUssR0FBRyxFQUFFLENBQUM7UUFDWCxnQkFBVyxHQUFHLEVBQUUsQ0FBQztJQUdvRSxDQUFDO0lBRXRGLFFBQVE7UUFDTixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUks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QUMsR0FBRyxDQUFDLENBQUM7Z0JBQzNDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO2dCQUNsQixNQUFNLENBQUMsUUFBUSxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxNQUFNLENBQUM7Z0JBQzNGLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDZixVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNuRCxDQUFDO1lBQ0QsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcscUJBQXFCO1NBQ2hELENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxLQUFLO1FBQ1gsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN4QixPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO0lBQzVILENBQUM7O3FIQXBMVSx3QkFBd0I7eUdBQXhCLHdCQUF3Qix3S0NmckMsOG9TQWlJQTsyRkRsSGEsd0JBQXdCO2tCQUxwQyxTQUFTOytCQUNFLHNCQUFzQjt3SUFpQk4sV0FBVztzQkFBcEMsU0FBUzt1QkFBQyxhQUFhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBQZXJtaXNzaW9uU2VydmljZSB9IGZyb20gJ0BhYnAvbmcuY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgUXVhbGl0eUFuYWx5c2lzLCBRdWFsaXR5RmFjaWxpdHksIFF1YWxpdHlIb3VyLCBRdWFsaXR5TGltaXQsXHJcbiAgUXVhbGl0eU1lYXN1cmVtZW50LCBRdWFsaXR5UGFyYW1ldGVyLCBRdWFsaXR5U3RlcCxcclxufSBmcm9tICcuLi9tb2RlbHMvcXVhbGl0eS5tb2RlbHMnO1xyXG5pbXBvcnQgeyBRdWFsaXR5QXBpU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3F1YWxpdHktYXBpLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBRdWFsaXR5VGFuayB9IGZyb20gJy4uL21vZGVscy9pbnRha2UubW9kZWxzJztcclxuaW1wb3J0IHsgYXBwbGljYWJsZUxpbWl0LCByZWNhbGN1bGF0ZSB9IGZyb20gJy4uL3NlcnZpY2VzL3F1YWxpdHktbWVhc3VyZW1lbnRzJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLXByb2Nlc3MtYW5hbHlzaXMnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9wcm9jZXNzLWFuYWx5c2lzLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9wcm9jZXNzLWFuYWx5c2lzLmNvbXBvbmVudC5zY3NzJ10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQcm9jZXNzQW5hbHlzaXNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIHRhbmtzOiBRdWFsaXR5VGFua1tdID0gW107XHJcbiAgZmFjaWxpdGllczogUXVhbGl0eUZhY2lsaXR5W10gPSBbXTtcclxuICBmYWNpbGl0eUNvZGUgPSAnJztcclxuICBidXNpbmVzc0RhdGUgPSB0aGlzLnRvZGF5KCk7XHJcbiAgYW5hbHlzaXM6IFF1YWxpdHlBbmFseXNpcyB8IG51bGwgPSBudWxsO1xyXG4gIGdyb3VwczogeyBzdGVwOiBRdWFsaXR5U3RlcDsgcGFyYW1ldGVyczogUXVhbGl0eVBhcmFtZXRlcltdIH1bXSA9IFtdO1xyXG4gIHBhcmFtZXRlcnM6IFF1YWxpdHlQYXJhbWV0ZXJbXSA9IFtdO1xyXG4gIHJlYXNvbiA9ICcnO1xyXG4gIGJ1c3kgPSB0cnVlO1xyXG4gIGJ1c3lUZXh0ID0gJ1Rlc2lzbGVyIHnDvGtsZW5peW9y4oCmJztcclxuICBlcnJvciA9ICcnO1xyXG4gIHJlYXNvbkVycm9yID0gJyc7XHJcbiAgQFZpZXdDaGlsZCgncmVhc29uSW5wdXQnKSByZWFzb25JbnB1dD86IEVsZW1lbnRSZWY8SFRNTFRleHRBcmVhRWxlbWVudD47XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYXBpOiBRdWFsaXR5QXBpU2VydmljZSwgcHJpdmF0ZSBwZXJtaXNzaW9uczogUGVybWlzc2lvblNlcnZpY2UpIHt9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5hcGkudGFua3MoKS5zdWJzY3JpYmUoeyBuZXh0OiB4ID0+IHRoaXMudGFua3MgPSB4LmZpbHRlcih0ID0+IHQuYWN0aXZlKSwgZXJyb3I6ICgpID0+IHt9IH0pO1xyXG4gICAgdGhpcy5hcGkuZmFjaWxpdGllcygpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IGZhY2lsaXRpZXMgPT4ge1xyXG4gICAgICAgIHRoaXMuZmFjaWxpdGllcyA9IGZhY2lsaXRpZXM7XHJcbiAgICAgICAgdGhpcy5mYWNpbGl0eUNvZGUgPSBmYWNpbGl0aWVzWzBdPy5jb2RlIHx8ICcnO1xyXG4gICAgICAgIGlmICh0aGlzLmZhY2lsaXR5Q29kZSkgdGhpcy5sb2FkKCk7XHJcbiAgICAgICAgZWxzZSB0aGlzLmJ1c3kgPSBmYWxzZTtcclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6ICgpID0+IHsgdGhpcy5lcnJvciA9ICdUZXNpc2xlciB5w7xrbGVuZW1lZGkuJzsgdGhpcy5idXN5ID0gZmFsc2U7IH0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldCBlZGl0YWJsZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhdGhpcy5idXN5ICYmIHRoaXMuYW5hbHlzaXM/LnN0YXR1cyA9PT0gJ0RyYWZ0JyAmJlxyXG4gICAgICB0aGlzLnBlcm1pc3Npb25zLmdldEdyYW50ZWRQb2xpY3koJ0hpdHNvZnQuS2Fkb29nbHUuS2FsaXRlLlByb2Nlc3NBbmFseXNpcy5DcmVhdGUnKTtcclxuICB9XHJcblxyXG4gIGdldCBoYXNPdXRPZkxpbWl0KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuYW5hbHlzaXM/LmhvdXJzLnNvbWUoaCA9PiBoLm1lYXN1cmVtZW50cy5zb21lKHYgPT4gdi5vdXRPZkxpbWl0KSkgfHwgZmFsc2U7XHJcbiAgfVxyXG5cclxuICBnZXQgc3RhdHVzVGV4dCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuICh7IERyYWZ0OiAnVGFzbGFrJywgTGFib3JhbnRTaWduZWQ6ICdMYWJvcmFudCBpbXphbGFkxLEnLFxyXG4gICAgICBDaGVja2VkOiAnTcO8aGVuZGlzIGtvbnRyb2wgZXR0aScsIEFwcHJvdmVkOiAnT25heWzEsScgfSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KVt0aGlzLmFuYWx5c2lzPy5zdGF0dXMgfHwgJyddIHx8ICcnO1xyXG4gIH1cclxuXHJcbiAgYWxsb3dlZChwZXJtaXNzaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnBlcm1pc3Npb25zLmdldEdyYW50ZWRQb2xpY3koYEhpdHNvZnQuS2Fkb29nbHUuS2FsaXRlLlByb2Nlc3NBbmFseXNpcy4ke3Blcm1pc3Npb259YCk7XHJcbiAgfVxyXG5cclxuICBsb2FkKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmZhY2lsaXR5Q29kZSB8fCAhdGhpcy5idXNpbmVzc0RhdGUpIHJldHVybjtcclxuICAgIHRoaXMuYnVzeSA9IHRydWU7XHJcbiAgICB0aGlzLmJ1c3lUZXh0ID0gJ0FuYWxpeiB2ZXJpbGVyaSB5w7xrbGVuaXlvcuKApic7XHJcbiAgICB0aGlzLmVycm9yID0gJyc7XHJcbiAgICB0aGlzLmFwaS5wcm9jZXNzKHRoaXMuZmFjaWxpdHlDb2RlLCB0aGlzLmJ1c2luZXNzRGF0ZSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogYW5hbHlzaXMgPT4ge1xyXG4gICAgICAgIHRoaXMuYXBwbHlBbmFseXNpcyhhbmFseXNpcyk7XHJcbiAgICAgICAgdGhpcy5idXN5ID0gZmFsc2U7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoKSA9PiB7IHRoaXMuZXJyb3IgPSAnQW5hbGl6IGZvcm11IHnDvGtsZW5lbWVkaS4nOyB0aGlzLmJ1c3kgPSBmYWxzZTsgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhcHBseUFuYWx5c2lzKGFuYWx5c2lzOiBRdWFsaXR5QW5hbHlzaXMpOiB2b2lkIHtcclxuICAgIHRoaXMuYW5hbHlzaXMgPSBhbmFseXNpcztcclxuICAgIGNvbnN0IHRlbXBsYXRlID0gYW5hbHlzaXMudGVtcGxhdGVTbmFwc2hvdDtcclxuICAgIHRoaXMuZ3JvdXBzID0gWy4uLnRlbXBsYXRlLnN0ZXBzXS5zb3J0KChhLCBiKSA9PiBhLm9yZGVyIC0gYi5vcmRlcikubWFwKHN0ZXAgPT4gKHtcclxuICAgICAgc3RlcCxcclxuICAgICAgcGFyYW1ldGVyczogdGVtcGxhdGUucGFyYW1ldGVycy5maWx0ZXIocCA9PiBwLmFjdGl2ZSAmJiBwLnN0ZXBDb2RlID09PSBzdGVwLnByb2Nlc3NDb2RlKVxyXG4gICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLm9yZGVyIC0gYi5vcmRlciksXHJcbiAgICB9KSk7XHJcbiAgICB0aGlzLnBhcmFtZXRlcnMgPSAoW10gYXMgUXVhbGl0eVBhcmFtZXRlcltdKS5jb25jYXQoLi4udGhpcy5ncm91cHMubWFwKGdyb3VwID0+IGdyb3VwLnBhcmFtZXRlcnMpKTtcclxuICAgIGZvciAoY29uc3QgaG91ciBvZiBhbmFseXNpcy5ob3Vycykge1xyXG4gICAgICBob3VyLm1lYXN1cmVtZW50cyB8fD0gW107XHJcbiAgICAgIGZvciAoY29uc3QgcGFyYW1ldGVyIG9mIHRoaXMucGFyYW1ldGVycykge1xyXG4gICAgICAgIGlmICghaG91ci5tZWFzdXJlbWVudHMuc29tZSh2ID0+IHYucGFyYW1ldGVyQ29kZSA9PT0gcGFyYW1ldGVyLmNvZGUpKSB7XHJcbiAgICAgICAgICBob3VyLm1lYXN1cmVtZW50cy5wdXNoKHsgcGFyYW1ldGVyQ29kZTogcGFyYW1ldGVyLmNvZGUsIG51bWJlcjogbnVsbCwgdGV4dDogJycsIG91dE9mTGltaXQ6IGZhbHNlIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbWVhc3VyZW1lbnQocm93OiBRdWFsaXR5SG91ciwgcGFyYW1ldGVyOiBRdWFsaXR5UGFyYW1ldGVyKTogUXVhbGl0eU1lYXN1cmVtZW50IHtcclxuICAgIHJldHVybiByb3cubWVhc3VyZW1lbnRzLmZpbmQodiA9PiB2LnBhcmFtZXRlckNvZGUgPT09IHBhcmFtZXRlci5jb2RlKSE7XHJcbiAgfVxyXG5cclxuICBsaW1pdChwYXJhbWV0ZXI6IFF1YWxpdHlQYXJhbWV0ZXIpOiBRdWFsaXR5TGltaXQgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIGFwcGxpY2FibGVMaW1pdCh0aGlzLmFuYWx5c2lzPy50ZW1wbGF0ZVNuYXBzaG90LmxpbWl0cyB8fCBbXSwgcGFyYW1ldGVyLmNvZGUsIHRoaXMuYnVzaW5lc3NEYXRlLCB0aGlzLmFuYWx5c2lzPy5vaWxUeXBlIHx8ICcnKTtcclxuICB9XHJcblxyXG4gIGxpbWl0TGFiZWwocGFyYW1ldGVyOiBRdWFsaXR5UGFyYW1ldGVyKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGxpbWl0ID0gdGhpcy5saW1pdChwYXJhbWV0ZXIpO1xyXG4gICAgaWYgKCFsaW1pdCkgcmV0dXJuICfigJQnO1xyXG4gICAgaWYgKGxpbWl0LmV4cGVjdGVkVGV4dCkgcmV0dXJuIGxpbWl0LmV4cGVjdGVkVGV4dDtcclxuICAgIGlmIChsaW1pdC5taW5pbXVtICE9IG51bGwgJiYgbGltaXQubWF4aW11bSAhPSBudWxsKSByZXR1cm4gYCR7bGltaXQubWluaW11bX3igJMke2xpbWl0Lm1heGltdW19YDtcclxuICAgIGlmIChsaW1pdC5taW5pbXVtICE9IG51bGwpIHJldHVybiBg4omlICR7bGltaXQubWluaW11bX1gO1xyXG4gICAgaWYgKGxpbWl0Lm1heGltdW0gIT0gbnVsbCkgcmV0dXJuIGDiiaQgJHtsaW1pdC5tYXhpbXVtfWA7XHJcbiAgICByZXR1cm4gJ+KAlCc7XHJcbiAgfVxyXG5cclxuICBjaGFuZ2VkKHJvdzogUXVhbGl0eUhvdXIsIHBhcmFtZXRlcjogUXVhbGl0eVBhcmFtZXRlcik6IHZvaWQge1xyXG4gICAgdHJ5IHsgcmVjYWxjdWxhdGUodGhpcy5wYXJhbWV0ZXJzLCByb3cubWVhc3VyZW1lbnRzLCB0aGlzLmFuYWx5c2lzPy50ZW1wbGF0ZVNuYXBzaG90LmxpbWl0cyB8fCBbXSwgdGhpcy5idXNpbmVzc0RhdGUsIHRoaXMuYW5hbHlzaXM/Lm9pbFR5cGUgfHwgJycpOyB9XHJcbiAgICBjYXRjaCAoZSkgeyB0aGlzLmVycm9yID0gZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogJ0hlc2FwbGFtYSB5YXDEsWxhbWFkxLEuJzsgfVxyXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLm1lYXN1cmVtZW50KHJvdywgcGFyYW1ldGVyKTtcclxuICAgIGNvbnN0IGxpbWl0ID0gdGhpcy5saW1pdChwYXJhbWV0ZXIpO1xyXG4gICAgdmFsdWUub3V0T2ZMaW1pdCA9ICEhbGltaXQgJiYgKFxyXG4gICAgICAodmFsdWUubnVtYmVyICE9IG51bGwgJiZcclxuICAgICAgICAoKGxpbWl0Lm1pbmltdW0gIT0gbnVsbCAmJiB2YWx1ZS5udW1iZXIgPCBsaW1pdC5taW5pbXVtKSB8fFxyXG4gICAgICAgICAobGltaXQubWF4aW11bSAhPSBudWxsICYmIHZhbHVlLm51bWJlciA+IGxpbWl0Lm1heGltdW0pKSkgfHxcclxuICAgICAgKCEhdmFsdWUudGV4dCAmJiAhIWxpbWl0LmV4cGVjdGVkVGV4dCAmJlxyXG4gICAgICAgIHZhbHVlLnRleHQudHJpbSgpLnRvTG9jYWxlTG93ZXJDYXNlKCd0ci1UUicpICE9PSBsaW1pdC5leHBlY3RlZFRleHQudHJpbSgpLnRvTG9jYWxlTG93ZXJDYXNlKCd0ci1UUicpKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIG9pbFR5cGVDaGFuZ2VkKCk6IHZvaWQge1xyXG4gICAgZm9yIChjb25zdCByb3cgb2YgdGhpcy5hbmFseXNpcz8uaG91cnMgfHwgW10pXHJcbiAgICAgIGZvciAoY29uc3QgcGFyYW1ldGVyIG9mIHRoaXMucGFyYW1ldGVycylcclxuICAgICAgICB0aGlzLmNoYW5nZWQocm93LCBwYXJhbWV0ZXIpO1xyXG4gIH1cclxuXHJcbiAgYXZlcmFnZShwYXJhbWV0ZXI6IFF1YWxpdHlQYXJhbWV0ZXIpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5hbmFseXNpcz8uaG91cnMubWFwKGggPT4gdGhpcy5tZWFzdXJlbWVudChoLCBwYXJhbWV0ZXIpLm51bWJlcilcclxuICAgICAgLmZpbHRlcigodik6IHYgaXMgbnVtYmVyID0+IHYgIT0gbnVsbCkgfHwgW107XHJcbiAgICBpZiAoIXZhbHVlcy5sZW5ndGgpIHJldHVybiAn4oCUJztcclxuICAgIHJldHVybiAodmFsdWVzLnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApIC8gdmFsdWVzLmxlbmd0aCkudG9GaXhlZChwYXJhbWV0ZXIuZGVjaW1hbFBsYWNlcyk7XHJcbiAgfVxyXG5cclxuICBzYXZlKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmFuYWx5c2lzIHx8ICF0aGlzLmVkaXRhYmxlKSByZXR1cm47XHJcbiAgICB0aGlzLmJ1c3kgPSB0cnVlO1xyXG4gICAgdGhpcy5idXN5VGV4dCA9ICdGb3JtIGtheWRlZGlsaXlvcuKApic7XHJcbiAgICB0aGlzLmVycm9yID0gJyc7XHJcbiAgICBjb25zdCBpbnB1dCA9IHtcclxuICAgICAgZmFjaWxpdHlDb2RlOiB0aGlzLmFuYWx5c2lzLmZhY2lsaXR5Q29kZSxcclxuICAgICAgYnVzaW5lc3NEYXRlOiB0aGlzLmJ1c2luZXNzRGF0ZSxcclxuICAgICAgb2lsVHlwZTogdGhpcy5hbmFseXNpcy5vaWxUeXBlLFxyXG4gICAgICBub3RlczogdGhpcy5hbmFseXNpcy5ub3RlcyxcclxuICAgICAgcmV2aXNpb246IHRoaXMuYW5hbHlzaXMucmV2aXNpb24sXHJcbiAgICAgIGhvdXJzOiB0aGlzLmFuYWx5c2lzLmhvdXJzLFxyXG4gICAgfTtcclxuICAgIHRoaXMuYXBpLnNhdmVQcm9jZXNzKGlucHV0KS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiBhbmFseXNpcyA9PiB7IHRoaXMuYXBwbHlBbmFseXNpcyhhbmFseXNpcyk7IHRoaXMuYnVzeSA9IGZhbHNlOyB9LFxyXG4gICAgICBlcnJvcjogKCkgPT4geyB0aGlzLmVycm9yID0gJ0Zvcm0ga2F5ZGVkaWxlbWVkaS4gQWxhbmxhcsSxIHZlIGJhxJ9sYW50xLF5xLEga29udHJvbCBlZGluLic7IHRoaXMuYnVzeSA9IGZhbHNlOyB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBkZWNpc2lvbihhY3Rpb246ICdzaWduJyB8ICdjaGVjaycgfCAnYXBwcm92ZScgfCAncmV2b2tlJyk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmFuYWx5c2lzIHx8ICF0aGlzLmFuYWx5c2lzLnJldmlzaW9uKSByZXR1cm47XHJcbiAgICBpZiAoKGFjdGlvbiA9PT0gJ3Jldm9rZScgfHwgKGFjdGlvbiA9PT0gJ2FwcHJvdmUnICYmIHRoaXMuaGFzT3V0T2ZMaW1pdCkpICYmICF0aGlzLnJlYXNvbi50cmltKCkpIHtcclxuICAgICAgdGhpcy5yZWFzb25FcnJvciA9ICdCdSBpxZ9sZW0gacOnaW4gZ2VyZWvDp2UgZ2lyaW4uJztcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnJlYXNvbklucHV0Py5uYXRpdmVFbGVtZW50LmZvY3VzKCkpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmJ1c3kgPSB0cnVlO1xyXG4gICAgdGhpcy5idXN5VGV4dCA9ICfEsMWfbGVtIHRhbWFtbGFuxLF5b3LigKYnO1xyXG4gICAgdGhpcy5lcnJvciA9ICcnO1xyXG4gICAgdGhpcy5yZWFzb25FcnJvciA9ICcnO1xyXG4gICAgdGhpcy5hcGkuZGVjaXNpb24odGhpcy5hbmFseXNpcy5jb2RlLCBhY3Rpb24sIHRoaXMuYW5hbHlzaXMucmV2aXNpb24sIHRoaXMucmVhc29uKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiBhbmFseXNpcyA9PiB7IHRoaXMucmVhc29uID0gJyc7IHRoaXMuYXBwbHlBbmFseXNpcyhhbmFseXNpcyk7IHRoaXMuYnVzeSA9IGZhbHNlOyB9LFxyXG4gICAgICBlcnJvcjogKCkgPT4geyB0aGlzLmVycm9yID0gJ8SwxZ9sZW0gdGFtYW1sYW5hbWFkxLEuIEZvcm11biBzb24gZHVydW11bnUga29udHJvbCBlZGluLic7IHRoaXMuYnVzeSA9IGZhbHNlOyB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBkb3dubG9hZFBkZigpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5hbmFseXNpcz8ucmV2aXNpb24pIHJldHVybjtcclxuICAgIHRoaXMuYXBpLnBkZih0aGlzLmFuYWx5c2lzLmNvZGUpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IGJsb2IgPT4ge1xyXG4gICAgICAgIGNvbnN0IHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XHJcbiAgICAgICAgY29uc3QgYW5jaG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xyXG4gICAgICAgIGFuY2hvci5ocmVmID0gdXJsO1xyXG4gICAgICAgIGFuY2hvci5kb3dubG9hZCA9IGAke3RoaXMuYW5hbHlzaXM/LmZvcm1TbmFwc2hvdC5kb2N1bWVudENvZGV9LSR7dGhpcy5hbmFseXNpcz8uY29kZX0ucGRmYDtcclxuICAgICAgICBhbmNob3IuY2xpY2soKTtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IFVSTC5yZXZva2VPYmplY3RVUkwodXJsKSwgMTAwMCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoKSA9PiB0aGlzLmVycm9yID0gJ1BERiBvbHXFn3R1cnVsYW1hZMSxLicsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdG9kYXkoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgcmV0dXJuIGAke2RhdGUuZ2V0RnVsbFllYXIoKX0tJHtTdHJpbmcoZGF0ZS5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgJzAnKX0tJHtTdHJpbmcoZGF0ZS5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsICcwJyl9YDtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPlxyXG4gIDxkaXYgY2xhc3M9XCJtYi0yXCI+XHJcbiAgICA8aDMgY2xhc3M9XCJwYWdlLXRpdGxlXCI+UmFmaW5lcmkgUHJvc2VzIEFuYWxpeiBLb250cm9sPC9oMz5cclxuICA8L2Rpdj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cImNhcmQgbXQtMlwiPjxkaXYgY2xhc3M9XCJjYXJkLWJvZHlcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJyb3cgYWxpZ24taXRlbXMtZW5kIG1iLTNcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0zXCI+XHJcbiAgICAgICAgPGxhYmVsIGZvcj1cImZhY2lsaXR5XCI+VGVzaXM8L2xhYmVsPlxyXG4gICAgICAgIDxzZWxlY3QgaWQ9XCJmYWNpbGl0eVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgW2Rpc2FibGVkXT1cImJ1c3lcIiBbKG5nTW9kZWwpXT1cImZhY2lsaXR5Q29kZVwiIChjaGFuZ2UpPVwibG9hZCgpXCI+XHJcbiAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBmYWNpbGl0eSBvZiBmYWNpbGl0aWVzXCIgW3ZhbHVlXT1cImZhY2lsaXR5LmNvZGVcIj57eyBmYWNpbGl0eS5uYW1lIH19PC9vcHRpb24+XHJcbiAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTNcIj5cclxuICAgICAgICA8bGFiZWwgZm9yPVwiYnVzaW5lc3NEYXRlXCI+xLDFnyBnw7xuw7w8L2xhYmVsPlxyXG4gICAgICAgIDxpbnB1dCBpZD1cImJ1c2luZXNzRGF0ZVwiIHR5cGU9XCJkYXRlXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbZGlzYWJsZWRdPVwiYnVzeVwiIFsobmdNb2RlbCldPVwiYnVzaW5lc3NEYXRlXCIgKGNoYW5nZSk9XCJsb2FkKClcIiAvPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0zXCIgKm5nSWY9XCJhbmFseXNpcz8uZmFjaWxpdHlDb2RlID09PSAnREVPMydcIj5cclxuICAgICAgICA8bGFiZWwgZm9yPVwib2lsVHlwZVwiPsOccmV0aWxlbiB5YcSfIGNpbnNpPC9sYWJlbD5cclxuICAgICAgICA8c2VsZWN0IGlkPVwib2lsVHlwZVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgWyhuZ01vZGVsKV09XCJhbmFseXNpcyEub2lsVHlwZVwiIChjaGFuZ2UpPVwib2lsVHlwZUNoYW5nZWQoKVwiIFtkaXNhYmxlZF09XCIhZWRpdGFibGVcIj5cclxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj5TZcOnaW5pejwvb3B0aW9uPjxvcHRpb24gdmFsdWU9XCJQYWxtIE9pbFwiPlBhbG0gT2lsPC9vcHRpb24+XHJcbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiUGFsbSBPbGVpblwiPlBhbG0gT2xlaW48L29wdGlvbj5cclxuICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMyB0ZXh0LW1kLXJpZ2h0IG10LTIgbXQtbWQtMFwiPlxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwiYW5hbHlzaXNcIiBjbGFzcz1cImJhZGdlIGJhZGdlLWluZm8gbXItMlwiIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiA2cHg7XCI+e3sgc3RhdHVzVGV4dCB9fTwvc3Bhbj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnlcIiAoY2xpY2spPVwiZG93bmxvYWRQZGYoKVwiIFtkaXNhYmxlZF09XCIhYW5hbHlzaXM/LnJldmlzaW9uIHx8IGJ1c3lcIlxyXG4gICAgICAgICAgKm5nSWY9XCJhbGxvd2VkKCdQcmludCcpXCI+Rm9ybXUgWWF6ZMSxciAoUERGKTwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgKm5nSWY9XCJlcnJvclwiIGNsYXNzPVwiYWxlcnQgYWxlcnQtZGFuZ2VyXCIgcm9sZT1cImFsZXJ0XCI+e3sgZXJyb3IgfX08L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJxdWFsaXR5LWdyaWQtbG9hZGluZ1wiICpuZ0lmPVwiYnVzeVwiIHJvbGU9XCJzdGF0dXNcIiBhcmlhLWxpdmU9XCJwb2xpdGVcIiBhcmlhLWJ1c3k9XCJ0cnVlXCI+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwic3Bpbm5lci1ib3JkZXIgdGV4dC1wcmltYXJ5XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPlxyXG4gICAgICA8c3Bhbj57eyBidXN5VGV4dCB9fTwvc3Bhbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFuYWx5c2lzXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzbWFsbCB0ZXh0LW11dGVkIG1iLTJcIj57eyBhbmFseXNpcy5mb3JtU25hcHNob3QubmFtZSB9fSDCtyB7eyBhbmFseXNpcy5mb3JtU25hcHNob3QuZG9jdW1lbnRDb2RlIH19IMK3IFJldml6eW9uIHt7IGFuYWx5c2lzLmZvcm1TbmFwc2hvdC5yZXZpc2lvbk51bWJlciB9fTwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicXVhbGl0eS1ncmlkLXNjcm9sbFwiIFtoaWRkZW5dPVwiYnVzeVwiPlxyXG4gICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIHRhYmxlLWJvcmRlcmVkIHRhYmxlLXNtIHF1YWxpdHktZ3JpZFwiPlxyXG4gICAgICAgICAgPHRoZWFkPlxyXG4gICAgICAgICAgICA8dHIgY2xhc3M9XCJ0ZXh0LWNlbnRlciBiZy1saWdodFwiPlxyXG4gICAgICAgICAgICAgIDx0aCByb3dzcGFuPVwiM1wiIGNsYXNzPVwic3RpY2t5LWhvdXJcIj5TYWF0PC90aD48dGggcm93c3Bhbj1cIjNcIj5WYXJkaXlhIC8gTGFib3JhbnQ8L3RoPlxyXG4gICAgICAgICAgICAgIDx0aCByb3dzcGFuPVwiM1wiPkFsxLFuYW4gVGFuayBObzwvdGg+XHJcbiAgICAgICAgICAgICAgPHRoICpuZ0Zvcj1cImxldCBncm91cCBvZiBncm91cHNcIiBbYXR0ci5jb2xzcGFuXT1cImdyb3VwLnBhcmFtZXRlcnMubGVuZ3RoXCI+e3sgZ3JvdXAuc3RlcC5uYW1lIH19PC90aD5cclxuICAgICAgICAgICAgICA8dGggcm93c3Bhbj1cIjNcIj5Ba3RhcsSxbGFuIFRhbmsgTm88L3RoPlxyXG4gICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICA8dHIgY2xhc3M9XCJ0ZXh0LWNlbnRlciBiZy1saWdodFwiPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGdyb3VwIG9mIGdyb3Vwc1wiPlxyXG4gICAgICAgICAgICAgICAgPHRoICpuZ0Zvcj1cImxldCBwYXJhbWV0ZXIgb2YgZ3JvdXAucGFyYW1ldGVyc1wiPnt7IHBhcmFtZXRlci5uYW1lIH19PHNtYWxsICpuZ0lmPVwicGFyYW1ldGVyLnVuaXRcIj4gKHt7IHBhcmFtZXRlci51bml0IH19KTwvc21hbGw+PC90aD5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgPHRyIGNsYXNzPVwidGV4dC1jZW50ZXIgbGltaXQtcm93XCI+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZ3JvdXAgb2YgZ3JvdXBzXCI+XHJcbiAgICAgICAgICAgICAgICA8dGggKm5nRm9yPVwibGV0IHBhcmFtZXRlciBvZiBncm91cC5wYXJhbWV0ZXJzXCI+e3sgbGltaXRMYWJlbChwYXJhbWV0ZXIpIH19PC90aD5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgcm93IG9mIGFuYWx5c2lzLmhvdXJzXCI+XHJcbiAgICAgICAgICAgICAgPHRoIGNsYXNzPVwic3RpY2t5LWhvdXJcIj57eyByb3cuaG91ciB8IG51bWJlcjonMi4wLTAnIH19OjAwPC90aD48dGQ+PHNtYWxsPnt7cm93LnNoaWZ0Q29kZX19PC9zbWFsbD48aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtXCIgWyhuZ01vZGVsKV09XCJyb3cuYW5hbHlzdFwiIFtkaXNhYmxlZF09XCIhZWRpdGFibGVcIiBhcmlhLWxhYmVsPVwiVmFyZGl5YSBsYWJvcmFudMSxXCIgLz48L3RkPlxyXG4gICAgICAgICAgICAgIDx0ZD48aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtIHRhbmstaW5wdXRcIiBsaXN0PVwicXVhbGl0eVRhbmtzXCIgWyhuZ01vZGVsKV09XCJyb3cuaW50YWtlVGFua1wiIFtkaXNhYmxlZF09XCIhZWRpdGFibGVcIiBhcmlhLWxhYmVsPVwiQWzEsW5hbiB0YW5rXCIgLz48L3RkPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGdyb3VwIG9mIGdyb3Vwc1wiPlxyXG4gICAgICAgICAgICAgICAgPHRkICpuZ0Zvcj1cImxldCBwYXJhbWV0ZXIgb2YgZ3JvdXAucGFyYW1ldGVyc1wiIFtjbGFzcy5vdXQtb2YtbGltaXRdPVwibWVhc3VyZW1lbnQocm93LCBwYXJhbWV0ZXIpLm91dE9mTGltaXRcIj5cclxuICAgICAgICAgICAgICAgICAgPGlucHV0ICpuZ0lmPVwicGFyYW1ldGVyLnZhbHVlVHlwZSA9PT0gJ051bWJlcicgfHwgcGFyYW1ldGVyLmNhbGN1bGF0ZWRcIiB0eXBlPVwibnVtYmVyXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2wtc20gdmFsdWUtaW5wdXRcIiBbYXR0ci5zdGVwXT1cIidhbnknXCJcclxuICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm1lYXN1cmVtZW50KHJvdywgcGFyYW1ldGVyKS5udW1iZXJcIiAobmdNb2RlbENoYW5nZSk9XCJjaGFuZ2VkKHJvdywgcGFyYW1ldGVyKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFlZGl0YWJsZSB8fCBwYXJhbWV0ZXIuY2FsY3VsYXRlZFwiIFthdHRyLmFyaWEtbGFiZWxdPVwicGFyYW1ldGVyLm5hbWVcIiAvPlxyXG4gICAgICAgICAgICAgICAgICA8c2VsZWN0ICpuZ0lmPVwicGFyYW1ldGVyLnZhbHVlVHlwZSA9PT0gJ0Nob2ljZScgJiYgIXBhcmFtZXRlci5jYWxjdWxhdGVkXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtIHZhbHVlLWlucHV0XCJcclxuICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm1lYXN1cmVtZW50KHJvdywgcGFyYW1ldGVyKS50ZXh0XCIgKGNoYW5nZSk9XCJjaGFuZ2VkKHJvdywgcGFyYW1ldGVyKVwiIFtkaXNhYmxlZF09XCIhZWRpdGFibGVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+PC9vcHRpb24+PG9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHBhcmFtZXRlci5vcHRpb25zXCIgW3ZhbHVlXT1cIm9wdGlvblwiPnt7IG9wdGlvbiB9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgPGlucHV0ICpuZ0lmPVwicGFyYW1ldGVyLnZhbHVlVHlwZSA9PT0gJ1RleHQnICYmICFwYXJhbWV0ZXIuY2FsY3VsYXRlZFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0tY29udHJvbC1zbSB2YWx1ZS1pbnB1dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJtZWFzdXJlbWVudChyb3csIHBhcmFtZXRlcikudGV4dFwiIChuZ01vZGVsQ2hhbmdlKT1cImNoYW5nZWQocm93LCBwYXJhbWV0ZXIpXCIgW2Rpc2FibGVkXT1cIiFlZGl0YWJsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJwYXJhbWV0ZXIubmFtZVwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDx0ZD48aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtIHRhbmstaW5wdXRcIiBsaXN0PVwicXVhbGl0eVRhbmtzXCIgWyhuZ01vZGVsKV09XCJyb3cub3V0cHV0VGFua1wiIFtkaXNhYmxlZF09XCIhZWRpdGFibGVcIiBhcmlhLWxhYmVsPVwiQWt0YXLEsWxhbiB0YW5rXCIgLz48L3RkPlxyXG4gICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICA8dHIgY2xhc3M9XCJhdmVyYWdlLXJvd1wiPlxyXG4gICAgICAgICAgICAgIDx0aCBjb2xzcGFuPVwiM1wiPk9SVEFMQU1BPC90aD5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBncm91cCBvZiBncm91cHNcIj5cclxuICAgICAgICAgICAgICAgIDx0ZCAqbmdGb3I9XCJsZXQgcGFyYW1ldGVyIG9mIGdyb3VwLnBhcmFtZXRlcnNcIj57eyBwYXJhbWV0ZXIudmFsdWVUeXBlID09PSAnTnVtYmVyJyA/IGF2ZXJhZ2UocGFyYW1ldGVyKSA6ICfigJQnIH19PC90ZD5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8dGQ+PC90ZD5cclxuICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgPC90YWJsZT5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwicm93IG10LTNcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cclxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJub3Rlc1wiPnt7IGFuYWx5c2lzLmZvcm1TbmFwc2hvdC5jb2RlID09PSAnRlI1MicgPyAnQcOnxLFrbGFtYSAvIEJpbGdpJyA6ICdOb3RsYXInIH19PC9sYWJlbD5cclxuICAgICAgICAgIDx0ZXh0YXJlYSBpZD1cIm5vdGVzXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiByb3dzPVwiM1wiIFsobmdNb2RlbCldPVwiYW5hbHlzaXMubm90ZXNcIiBbZGlzYWJsZWRdPVwiIWVkaXRhYmxlXCI+PC90ZXh0YXJlYT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cclxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJyZWFzb25cIj5PbmF5IC8gZ2VyaSBhbG1hIGdlcmVrw6dlc2k8L2xhYmVsPlxyXG4gICAgICAgICAgPHRleHRhcmVhICNyZWFzb25JbnB1dCBpZD1cInJlYXNvblwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgcm93cz1cIjNcIiBbKG5nTW9kZWwpXT1cInJlYXNvblwiIChuZ01vZGVsQ2hhbmdlKT1cInJlYXNvbkVycm9yID0gJydcIlxyXG4gICAgICAgICAgICBbY2xhc3MuaXMtaW52YWxpZF09XCJyZWFzb25FcnJvclwiIFthdHRyLmFyaWEtaW52YWxpZF09XCIhIXJlYXNvbkVycm9yXCJcclxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImJ1c3kgfHwgYW5hbHlzaXMuc3RhdHVzID09PSAnTGFib3JhbnRTaWduZWQnXCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJyZWFzb25FcnJvclwiIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFjayBkLWJsb2NrXCIgcm9sZT1cImFsZXJ0XCI+e3sgcmVhc29uRXJyb3IgfX08L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtdC0zIGQtZmxleCBmbGV4LXdyYXAgYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCI+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBtci0yIG1iLTJcIiAoY2xpY2spPVwic2F2ZSgpXCIgW2Rpc2FibGVkXT1cIiFlZGl0YWJsZSB8fCBidXN5XCI+S2F5ZGV0PC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IG1yLTIgbWItMlwiICpuZ0lmPVwiYW5hbHlzaXMuc3RhdHVzID09PSAnRHJhZnQnICYmIGFsbG93ZWQoJ1NpZ24nKVwiXHJcbiAgICAgICAgICAoY2xpY2spPVwiZGVjaXNpb24oJ3NpZ24nKVwiIFtkaXNhYmxlZF09XCIhYW5hbHlzaXMucmV2aXNpb24gfHwgYnVzeVwiPkxhYm9yYW50IE9sYXJhayDEsG16YWxhPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IG1yLTIgbWItMlwiICpuZ0lmPVwiYW5hbHlzaXMuc3RhdHVzID09PSAnTGFib3JhbnRTaWduZWQnICYmIGFsbG93ZWQoJ0NoZWNrJylcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cImRlY2lzaW9uKCdjaGVjaycpXCIgW2Rpc2FibGVkXT1cImJ1c3lcIj5Nw7xoZW5kaXMgS29udHJvbMO8PC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc3VjY2VzcyBtci0yIG1iLTJcIiAqbmdJZj1cImFuYWx5c2lzLnN0YXR1cyA9PT0gJ0NoZWNrZWQnICYmIGFsbG93ZWQoJ0FwcHJvdmUnKVwiXHJcbiAgICAgICAgICAoY2xpY2spPVwiZGVjaXNpb24oJ2FwcHJvdmUnKVwiIFtkaXNhYmxlZF09XCJidXN5XCI+U29uIE9uYXk8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLWRhbmdlciBtci0yIG1iLTJcIiAqbmdJZj1cImFuYWx5c2lzLnN0YXR1cyA9PT0gJ0FwcHJvdmVkJyAmJiBhbGxvd2VkKCdSZXZva2UnKVwiXHJcbiAgICAgICAgICAoY2xpY2spPVwiZGVjaXNpb24oJ3Jldm9rZScpXCIgW2Rpc2FibGVkXT1cImJ1c3lcIj5PbmF5xLEgR2VyaSBBbDwvYnV0dG9uPlxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwiaGFzT3V0T2ZMaW1pdFwiIGNsYXNzPVwidGV4dC1kYW5nZXIgbWItMlwiPkxpbWl0IGTEscWfxLEgw7Zsw6fDvG0gdmFyLiBTb24gb25heSBpw6dpbiBnZXJla8OnZSBnZXJla2xpLjwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtdC0zIHNtYWxsIHRleHQtbXV0ZWRcIj5cclxuICAgICAgICA8c3Bhbj5MYWJvcmFudDoge3sgYW5hbHlzaXMubGFib3JhbnQ/LnVzZXJOYW1lIHx8ICfigJQnIH19PC9zcGFuPiDCt1xyXG4gICAgICAgIDxzcGFuPk3DvGhlbmRpczoge3sgYW5hbHlzaXMuZW5naW5lZXI/LnVzZXJOYW1lIHx8ICfigJQnIH19PC9zcGFuPiDCt1xyXG4gICAgICAgIDxzcGFuPk9uYXlsYXlhbjoge3sgYW5hbHlzaXMuYXBwcm92ZXI/LnVzZXJOYW1lIHx8ICfigJQnIH19PC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRldGFpbHMgY2xhc3M9XCJtdC0zXCIgKm5nSWY9XCJhbmFseXNpcy5oaXN0b3J5Py5sZW5ndGhcIj5cclxuICAgICAgICA8c3VtbWFyeT7EsMWfbGVtIGdlw6dtacWfaTwvc3VtbWFyeT5cclxuICAgICAgICA8dWwgY2xhc3M9XCJtdC0yXCI+PGxpICpuZ0Zvcj1cImxldCBldmVudCBvZiBhbmFseXNpcy5oaXN0b3J5XCI+e3sgZXZlbnQuYWN0aW9uIH19IMK3IHt7IGV2ZW50LnVzZXJOYW1lIH19IMK3IHt7IGV2ZW50Lm9jY3VycmVkQXQgfCBkYXRlOidkZC5NTS55eXl5IEhIOm1tJyB9fTxzcGFuICpuZ0lmPVwiZXZlbnQucmVhc29uXCI+IMK3IHt7IGV2ZW50LnJlYXNvbiB9fTwvc3Bhbj48L2xpPjwvdWw+XHJcbiAgICAgIDwvZGV0YWlscz5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gIDwvZGl2PjwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjxkYXRhbGlzdCBpZD1cInF1YWxpdHlUYW5rc1wiPjxvcHRpb24gKm5nRm9yPVwibGV0IHRhbmsgb2YgdGFua3NcIiBbdmFsdWVdPVwidGFuay5jb2RlXCI+e3t0YW5rLm5hbWV9fTwvb3B0aW9uPjwvZGF0YWxpc3Q+XHJcbiJdfQ==