gamma-app-controller 1.1.4 → 1.1.6

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 (21) hide show
  1. package/esm2020/lib/application-controller/application-content.service.mjs +32 -1
  2. package/esm2020/lib/application-controller/application-controller.module.mjs +37 -5
  3. package/esm2020/lib/application-controller/application-dataset-component/application-dataset/application-dataset.component.mjs +4 -4
  4. package/esm2020/lib/application-controller/application-metric-config/all-metrics-config/all-metrics-config.component.mjs +95 -0
  5. package/esm2020/lib/application-controller/application-metric-config/create-metrics/create-metrics.component.mjs +173 -0
  6. package/esm2020/lib/application-controller/application-metric-config/ofline-metrics/ofline-metrics.component.mjs +77 -0
  7. package/esm2020/lib/application-controller/application-metric-config/online-metrics/online-metrics.component.mjs +171 -0
  8. package/esm2020/lib/application-controller/application-view-components/create-comp-view/create-comp-view.component.mjs +4 -4
  9. package/esm2020/public-api.mjs +5 -1
  10. package/fesm2015/gamma-app-controller.mjs +635 -115
  11. package/fesm2015/gamma-app-controller.mjs.map +1 -1
  12. package/fesm2020/gamma-app-controller.mjs +641 -115
  13. package/fesm2020/gamma-app-controller.mjs.map +1 -1
  14. package/lib/application-controller/application-content.service.d.ts +4 -0
  15. package/lib/application-controller/application-controller.module.d.ts +15 -11
  16. package/lib/application-controller/application-metric-config/all-metrics-config/all-metrics-config.component.d.ts +41 -0
  17. package/lib/application-controller/application-metric-config/create-metrics/create-metrics.component.d.ts +136 -0
  18. package/lib/application-controller/application-metric-config/ofline-metrics/ofline-metrics.component.d.ts +42 -0
  19. package/lib/application-controller/application-metric-config/online-metrics/online-metrics.component.d.ts +49 -0
  20. package/package.json +1 -1
  21. package/public-api.d.ts +4 -0
@@ -0,0 +1,173 @@
1
+ import { Component } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "../../common";
4
+ import * as i2 from "ngx-toastr";
5
+ import * as i3 from "@angular/router";
6
+ import * as i4 from "../../application-content.service";
7
+ import * as i5 from "@angular/common";
8
+ import * as i6 from "devextreme-angular/ui/select-box";
9
+ import * as i7 from "devextreme-angular/ui/text-box";
10
+ import * as i8 from "@angular/forms";
11
+ import * as i9 from "@angular/material/icon";
12
+ import * as i10 from "../../shared/loading/loading.component";
13
+ import * as i11 from "../online-metrics/online-metrics.component";
14
+ import * as i12 from "../ofline-metrics/ofline-metrics.component";
15
+ export class CreateMetricsComponent {
16
+ constructor(commonService, toastr, router, service) {
17
+ this.commonService = commonService;
18
+ this.toastr = toastr;
19
+ this.router = router;
20
+ this.service = service;
21
+ this.reqFieldsDataSource = [];
22
+ this.isreqFields = false;
23
+ this.iscdrParams = false;
24
+ this.cdrFieldsDataSource = [];
25
+ this.kpi_function = ["sum", "count", "avg", "max", "min", "stddev", "count_distinct"];
26
+ this.kpi_operator = ["eq", "gte", "lte", "ne", "in", "notIn"];
27
+ this.kpi_enrichment_name = [];
28
+ this.reqShortDataSource = [];
29
+ this.filterMapingDatasource = [];
30
+ this.isModelVisible = false;
31
+ this.isSqlCopiedText = false;
32
+ this.isReconColume = false;
33
+ this.reconColumeDatasource = [];
34
+ this.isQueryTypeSelect = false;
35
+ this.mesuresAndDimentionsColumns = [];
36
+ this.metricOnlineObject = {
37
+ "metricName": "msc_voice_day_metric",
38
+ "metricId": "",
39
+ "metricDisplayName": "Metric Voice Day Metric",
40
+ "metricType": "online",
41
+ "source": {
42
+ "datasource": "huawei-msc",
43
+ "eventName": "huawei_msc_fct",
44
+ "filters": [
45
+ { "fieldName": "event_type_key", "operation": "string", "threshold": "1,5,6", "comparator": "in" }
46
+ ],
47
+ "exclusions": [
48
+ { "fieldName": "", "operation": "", "threshold": "", "comparator": "" }
49
+ ],
50
+ "dimensions": [
51
+ { "fieldName": "xdr_date", "aliasName": "record_date", "dataType": "string", "format": "yyyyMMdd" },
52
+ { "fieldName": "event_type_key", "aliasName": "event_type", "dataType": "string" },
53
+ { "fieldName": "srv_type_key", "aliasName": "srv_type", "dataType": "string" },
54
+ { "fieldName": "other_nw_ind_key", "aliasName": "nw_call_type", "dataType": "string" },
55
+ { "fieldName": "xdr_date", "aliasName": "hour", "dataType": "int", "method": "getHour" },
56
+ { "fieldName": "other_msisdn_iso_code", "aliasName": "country", "dataType": "string" },
57
+ { "fieldName": "other_oper", "aliasName": "operator", "dataType": "string" },
58
+ { "fieldName": "event_direction_key", "aliasName": "direction", "dataType": "string" }
59
+ ],
60
+ "measures": [
61
+ { "fieldName": "original_dur", "aliasName": "msc_mou", "dataType": "double", "type": "sum" },
62
+ { "aliasName": "msc_count", "type": "count" }
63
+ ]
64
+ },
65
+ "target": {
66
+ "databaseName": "rafmdb",
67
+ "dbConfig": "mongo",
68
+ "tableName": "msc_daily_metric",
69
+ "partitionColumn": "",
70
+ "dimensionColumns": ["record_date", "event_type", "srv_type", "direction", "nw_call_type", "hour",
71
+ "country", "operator"
72
+ ],
73
+ "measureColumns": [
74
+ "msc_mou", "msc_count"
75
+ ],
76
+ "createTable": false,
77
+ "writeDisposition": "append"
78
+ }
79
+ };
80
+ this.metricMainObject = {
81
+ "metricName": "msc_voice_day_metric",
82
+ "metricId": "",
83
+ "metricDisplayName": "Metric Voice Day Metric",
84
+ "metricType": "online",
85
+ };
86
+ this.metricOflineObject = {
87
+ "metricName": "",
88
+ "metricId": "",
89
+ "metricDisplayName": "",
90
+ "metricType": "offline",
91
+ "runner": "",
92
+ "source": {
93
+ "databaseName": "rafms",
94
+ "dbConfig": "bigquery",
95
+ "queryTemplate": "",
96
+ "queryTemplateFile": ""
97
+ },
98
+ "target": {
99
+ "databaseName": "rafmdb",
100
+ "dbConfig": "mysql",
101
+ "tableName": "",
102
+ "dimensionColumns": [],
103
+ "measureColumns": [],
104
+ "partitionColumn": "",
105
+ "createTable": true,
106
+ "writeDisposition": "append"
107
+ },
108
+ "execution": {
109
+ "type": "scheduled",
110
+ "jobGroupId": "",
111
+ "arguments": [
112
+ {
113
+ "argumentName": "start_date",
114
+ "labelName": "Event Start Date",
115
+ "datatype": "timestamp",
116
+ "runtimeValue": "static",
117
+ "function": "D1_START"
118
+ },
119
+ {
120
+ "argumentName": "end_date",
121
+ "labelName": "Event End Date",
122
+ "runtimeValue": "static",
123
+ "datatype": "timestamp",
124
+ "function": "D1_END"
125
+ }
126
+ ]
127
+ }
128
+ };
129
+ }
130
+ ngOnInit() {
131
+ }
132
+ getMetricType(e) {
133
+ if (e.event) {
134
+ this.metrictype = e.value;
135
+ }
136
+ }
137
+ submittOnlineMetrics(data) {
138
+ data["appName"] = "pronto";
139
+ data["metricId"] = "";
140
+ data["activated"] = false;
141
+ console.log(data);
142
+ this.service.saveOnlineMetricConfig(data).subscribe({
143
+ next: (data) => {
144
+ this.toastr.success("Online Metrics Updates Successfully");
145
+ this.router.navigate(['/apps/controlPanel/metricController']);
146
+ }, error: (err) => {
147
+ this.toastr.error('Unexpected Server Exception. Please contact System Admin.', 'Create Metrics Config');
148
+ }
149
+ });
150
+ }
151
+ submittOfflineMetrics(data) {
152
+ data["appName"] = "pronto";
153
+ data["metricId"] = "";
154
+ data["activated"] = false;
155
+ console.log(data);
156
+ this.service.editOfflineMetricConfig(data).subscribe({
157
+ next: (data) => {
158
+ this.toastr.success("Offline Metrics Updates Successfully");
159
+ this.router.navigate(['/apps/controlPanel/metricController']);
160
+ }, error: (err) => {
161
+ this.toastr.error('Unexpected Server Exception. Please contact System Admin.', 'Create Metrics Config');
162
+ }
163
+ });
164
+ console.log(data);
165
+ }
166
+ }
167
+ CreateMetricsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CreateMetricsComponent, deps: [{ token: i1.CommonService }, { token: i2.ToastrService }, { token: i3.Router }, { token: i4.ApplicationContentService }], target: i0.ɵɵFactoryTarget.Component });
168
+ CreateMetricsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: CreateMetricsComponent, selector: "app-create-metrics", ngImport: i0, template: "<app-loading *ngIf=\"loadingModal\"></app-loading>\n<div class=\"flex flex-col flex-auto w-full\">\n <div class=\"flex flex-col\">\n <div class=\"flex justify-between border-b dark:bg-transparent\">\n <div class=\"flex flex-col ml-1\">\n <div class=\"flex items-center float-start\">\n <div class=\"flex items-center overflow-hidden\">\n <mat-icon class=\"icon-size-2\" [svgIcon]=\"'heroicons_solid:template'\"></mat-icon>\n </div>\n <h2\n class=\"text-2xl md:text-2xl py-3 font-extrabold items-center ml-2 tracking-tight leading-5 truncate capitalize\">\n Create Metrics\n </h2>\n </div>\n <div class=\"\">\n </div>\n </div>\n <!-- <div class=\"flex justify-between items-center border-l-2 p-0 m-0 relative\">\n <div class=\"mx-4\">\n <div class=\"text-lg font-bold mx-4 corsur-pointer\" (click)=\"openDateFilter()\">\n {{selectedDateAndTime}}\n <i class=\"fa fa-calendar\"></i>\n </div>\n </div>\n </div> -->\n </div>\n\n </div>\n\n <div class=\"flex\">\n <div class=\"w-full border-r\">\n <div class=\"m-2\">\n <div class=\"flex flex-row mb-2\">\n <div class=\"mx-2 w-1/3\">\n <div class=\"text-md mb-2\">Metric Name</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.metricName\"></dx-text-box>\n </div>\n <div class=\"mx-2 w-1/3\">\n <div class=\"text-md mb-2\">Metric Display Name</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.metricDisplayName\"></dx-text-box>\n </div>\n <div class=\"mx-2 w-1/3\">\n <div class=\"text-md mb-2\">Metric Id</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.metricId\"></dx-text-box>\n </div>\n <div class=\"mx-2 w-1/3\">\n <div class=\"text-md mb-2\">Metric Type</div>\n <dx-select-box [items]=\"['online','ofline']\" [(ngModel)]=\"metricMainObject.metricType\"\n (onValueChanged)=\"getMetricType($event)\"></dx-select-box>\n </div>\n </div>\n <ng-container *ngIf=\"metricMainObject.metricType == 'online'\">\n <app-online-metrics [onlineMetricData]=\"metricOnlineObject\"\n (getMetRicOnlineDataSet)=\"submittOnlineMetrics($event)\"></app-online-metrics>\n </ng-container>\n <ng-container *ngIf=\"metricMainObject.metricType == 'ofline'\">\n <app-ofline-metrics [onflineMetricData]=\"metricOflineObject\"\n (getMetRicOflineDataSet)=\"submittOfflineMetrics($event)\"></app-ofline-metrics>\n </ng-container>\n\n\n </div>\n </div>\n </div>\n</div>", styles: [""], dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i6.DxSelectBoxComponent, selector: "dx-select-box", inputs: ["acceptCustomValue", "accessKey", "activeStateEnabled", "buttons", "dataSource", "deferRendering", "disabled", "displayExpr", "displayValue", "dropDownButtonTemplate", "dropDownOptions", "elementAttr", "fieldTemplate", "focusStateEnabled", "grouped", "groupTemplate", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "items", "itemTemplate", "label", "labelMode", "maxLength", "minSearchLength", "name", "noDataText", "opened", "openOnFieldClick", "placeholder", "readOnly", "rtlEnabled", "searchEnabled", "searchExpr", "searchMode", "searchTimeout", "selectedItem", "showClearButton", "showDataBeforeSearch", "showDropDownButton", "showSelectionControls", "spellcheck", "stylingMode", "tabIndex", "text", "useItemTextAsTitle", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueChangeEvent", "valueExpr", "visible", "width", "wrapItemText"], outputs: ["onChange", "onClosed", "onContentReady", "onCopy", "onCustomItemCreating", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onItemClick", "onKeyDown", "onKeyUp", "onOpened", "onOptionChanged", "onPaste", "onSelectionChanged", "onValueChanged", "acceptCustomValueChange", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "dataSourceChange", "deferRenderingChange", "disabledChange", "displayExprChange", "displayValueChange", "dropDownButtonTemplateChange", "dropDownOptionsChange", "elementAttrChange", "fieldTemplateChange", "focusStateEnabledChange", "groupedChange", "groupTemplateChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "itemsChange", "itemTemplateChange", "labelChange", "labelModeChange", "maxLengthChange", "minSearchLengthChange", "nameChange", "noDataTextChange", "openedChange", "openOnFieldClickChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "searchEnabledChange", "searchExprChange", "searchModeChange", "searchTimeoutChange", "selectedItemChange", "showClearButtonChange", "showDataBeforeSearchChange", "showDropDownButtonChange", "showSelectionControlsChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useItemTextAsTitleChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "valueExprChange", "visibleChange", "widthChange", "wrapItemTextChange", "onBlur"] }, { kind: "component", type: i7.DxTextBoxComponent, selector: "dx-text-box", inputs: ["accessKey", "activeStateEnabled", "buttons", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "label", "labelMode", "mask", "maskChar", "maskInvalidMessage", "maskRules", "maxLength", "mode", "name", "placeholder", "readOnly", "rtlEnabled", "showClearButton", "showMaskMode", "spellcheck", "stylingMode", "tabIndex", "text", "useMaskedValue", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueChangeEvent", "visible", "width"], outputs: ["onChange", "onContentReady", "onCopy", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onKeyDown", "onKeyUp", "onOptionChanged", "onPaste", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "labelChange", "labelModeChange", "maskChange", "maskCharChange", "maskInvalidMessageChange", "maskRulesChange", "maxLengthChange", "modeChange", "nameChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "showClearButtonChange", "showMaskModeChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useMaskedValueChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "directive", type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i10.LoadingComponent, selector: "app-loading" }, { kind: "component", type: i11.OnlineMetricsComponent, selector: "app-online-metrics", inputs: ["onlineMetricData"], outputs: ["getMetRicOnlineDataSet"] }, { kind: "component", type: i12.OflineMetricsComponent, selector: "app-ofline-metrics", inputs: ["onflineMetricData"], outputs: ["getMetRicOflineDataSet"] }] });
169
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CreateMetricsComponent, decorators: [{
170
+ type: Component,
171
+ args: [{ selector: 'app-create-metrics', template: "<app-loading *ngIf=\"loadingModal\"></app-loading>\n<div class=\"flex flex-col flex-auto w-full\">\n <div class=\"flex flex-col\">\n <div class=\"flex justify-between border-b dark:bg-transparent\">\n <div class=\"flex flex-col ml-1\">\n <div class=\"flex items-center float-start\">\n <div class=\"flex items-center overflow-hidden\">\n <mat-icon class=\"icon-size-2\" [svgIcon]=\"'heroicons_solid:template'\"></mat-icon>\n </div>\n <h2\n class=\"text-2xl md:text-2xl py-3 font-extrabold items-center ml-2 tracking-tight leading-5 truncate capitalize\">\n Create Metrics\n </h2>\n </div>\n <div class=\"\">\n </div>\n </div>\n <!-- <div class=\"flex justify-between items-center border-l-2 p-0 m-0 relative\">\n <div class=\"mx-4\">\n <div class=\"text-lg font-bold mx-4 corsur-pointer\" (click)=\"openDateFilter()\">\n {{selectedDateAndTime}}\n <i class=\"fa fa-calendar\"></i>\n </div>\n </div>\n </div> -->\n </div>\n\n </div>\n\n <div class=\"flex\">\n <div class=\"w-full border-r\">\n <div class=\"m-2\">\n <div class=\"flex flex-row mb-2\">\n <div class=\"mx-2 w-1/3\">\n <div class=\"text-md mb-2\">Metric Name</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.metricName\"></dx-text-box>\n </div>\n <div class=\"mx-2 w-1/3\">\n <div class=\"text-md mb-2\">Metric Display Name</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.metricDisplayName\"></dx-text-box>\n </div>\n <div class=\"mx-2 w-1/3\">\n <div class=\"text-md mb-2\">Metric Id</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.metricId\"></dx-text-box>\n </div>\n <div class=\"mx-2 w-1/3\">\n <div class=\"text-md mb-2\">Metric Type</div>\n <dx-select-box [items]=\"['online','ofline']\" [(ngModel)]=\"metricMainObject.metricType\"\n (onValueChanged)=\"getMetricType($event)\"></dx-select-box>\n </div>\n </div>\n <ng-container *ngIf=\"metricMainObject.metricType == 'online'\">\n <app-online-metrics [onlineMetricData]=\"metricOnlineObject\"\n (getMetRicOnlineDataSet)=\"submittOnlineMetrics($event)\"></app-online-metrics>\n </ng-container>\n <ng-container *ngIf=\"metricMainObject.metricType == 'ofline'\">\n <app-ofline-metrics [onflineMetricData]=\"metricOflineObject\"\n (getMetRicOflineDataSet)=\"submittOfflineMetrics($event)\"></app-ofline-metrics>\n </ng-container>\n\n\n </div>\n </div>\n </div>\n</div>" }]
172
+ }], ctorParameters: function () { return [{ type: i1.CommonService }, { type: i2.ToastrService }, { type: i3.Router }, { type: i4.ApplicationContentService }]; } });
173
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLW1ldHJpY3MuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2FtbWEtYXBwLWNvbnRyb2xsZXIvc3JjL2xpYi9hcHBsaWNhdGlvbi1jb250cm9sbGVyL2FwcGxpY2F0aW9uLW1ldHJpYy1jb25maWcvY3JlYXRlLW1ldHJpY3MvY3JlYXRlLW1ldHJpY3MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2FtbWEtYXBwLWNvbnRyb2xsZXIvc3JjL2xpYi9hcHBsaWNhdGlvbi1jb250cm9sbGVyL2FwcGxpY2F0aW9uLW1ldHJpYy1jb25maWcvY3JlYXRlLW1ldHJpY3MvY3JlYXRlLW1ldHJpY3MuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLFNBQVMsRUFBdUMsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FBVy9FLE1BQU0sT0FBTyxzQkFBc0I7SUEwSGpDLFlBQW1CLGFBQTRCLEVBQ3JDLE1BQXFCLEVBQ3JCLE1BQWMsRUFDZCxPQUFrQztRQUh6QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUNyQyxXQUFNLEdBQU4sTUFBTSxDQUFlO1FBQ3JCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxZQUFPLEdBQVAsT0FBTyxDQUEyQjtRQTFINUMsd0JBQW1CLEdBQVEsRUFBRSxDQUFDO1FBQzlCLGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBQzdCLGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBQzdCLHdCQUFtQixHQUFRLEVBQUUsQ0FBQztRQUM5QixpQkFBWSxHQUFRLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQTtRQUNyRixpQkFBWSxHQUFRLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFL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Q0FBQztRQUNsQixJQUFJLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUNuRCxJQUFJLEVBQUUsQ0FBQyxJQUFTLEVBQUUsRUFBRTtnQkFDbEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsc0NBQXNDLENBQUMsQ0FBQTtnQkFDM0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDLENBQUE7WUFDL0QsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEdBQVEsRUFBRSxFQUFFO2dCQUNyQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQywyREFBMkQsRUFBRSx1QkFBdUIsQ0FBQyxDQUFBO1lBQ3pHLENBQUM7U0FDRixDQUFDLENBQUE7UUFDRixPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BCLENBQUM7O21IQXRLVSxzQkFBc0I7dUdBQXRCLHNCQUFzQiwwRENibkMsMnJHQWdFTTsyRkRuRE8sc0JBQXNCO2tCQUxsQyxTQUFTOytCQUNFLG9CQUFvQiIsInNvdXJjZXNDb250ZW50IjpbIlxuXG5pbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUb2FzdHJTZXJ2aWNlIH0gZnJvbSAnbmd4LXRvYXN0cic7XG5pbXBvcnQgeyBDb21tb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29tbW9uJztcbmltcG9ydCB7IEFwcGxpY2F0aW9uQ29udGVudFNlcnZpY2UgfSBmcm9tICcuLi8uLi9hcHBsaWNhdGlvbi1jb250ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWNyZWF0ZS1tZXRyaWNzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NyZWF0ZS1tZXRyaWNzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY3JlYXRlLW1ldHJpY3MuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBDcmVhdGVNZXRyaWNzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgbG9hZGluZ01vZGFsOiBib29sZWFuO1xuICAvLyBASW5wdXQoKSBxdWVyeUJ1bGRlckRhdGFzZXQ6IGFueTtcbiAgcmVxRmllbGRzRGF0YVNvdXJjZTogYW55ID0gW107XG4gIGlzcmVxRmllbGRzOiBib29sZWFuID0gZmFsc2U7XG4gIGlzY2RyUGFyYW1zOiBib29sZWFuID0gZmFsc2U7XG4gIGNkckZpZWxkc0RhdGFTb3VyY2U6IGFueSA9IFtdO1xuICBrcGlfZnVuY3Rpb246IGFueSA9IFtcInN1bVwiLCBcImNvdW50XCIsIFwiYXZnXCIsIFwibWF4XCIsIFwibWluXCIsIFwic3RkZGV2XCIsIFwiY291bnRfZGlzdGluY3RcIl1cbiAga3BpX29wZXJhdG9yOiBhbnkgPSBbXCJlcVwiLCBcImd0ZVwiLCBcImx0ZVwiLCBcIm5lXCIsIFwiaW5cIiwgXCJub3RJblwiXVxuICBrcGlfZW5yaWNobWVudF9uYW1lOiBhbnkgPSBbXTtcbiAgcmVxU2hvcnREYXRhU291cmNlOiBhbnkgPSBbXTtcbiAgZmlsdGVyTWFwaW5nRGF0YXNvdXJjZTogYW55ID0gW107XG4gIHF1ZXJ5X2RhdGE6IGFueTtcbiAgaXNNb2RlbFZpc2libGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNTcWxDb3BpZWRUZXh0OiBib29sZWFuID0gZmFsc2U7XG4gIHF1ZXJ5QnVsZGVyRGF0YXNldDogYW55O1xuICBpc1JlY29uQ29sdW1lOiBib29sZWFuID0gZmFsc2U7XG4gIC8vIEBPdXRwdXQoKSBwdWJsaWMgZ2V0UXVlcnlCdWxiZGVyRGF0YVNldDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgcmVjb25Db2x1bWVEYXRhc291cmNlID0gW107XG5cbiAgc2VsZWN0ZWREYXRhU291cmNlOiBhbnk7XG4gIGlzUXVlcnlUeXBlU2VsZWN0OiBib29sZWFuID0gZmFsc2U7XG5cbiAgbWVzdXJlc0FuZERpbWVudGlvbnNDb2x1bW5zID0gW107XG4gIG1ldHJpY09ubGluZU9iamVjdCA9IHtcbiAgICBcIm1ldHJpY05hbWVcIjogXCJtc2Nfdm9pY2VfZGF5X21ldHJpY1wiLFxuICAgIFwibWV0cmljSWRcIjogXCJcIixcbiAgICBcIm1ldHJpY0Rpc3BsYXlOYW1lXCI6IFwiTWV0cmljIFZvaWNlIERheSBNZXRyaWNcIixcbiAgICBcIm1ldHJpY1R5cGVcIjogXCJvbmxpbmVcIixcbiAgICBcInNvdXJjZVwiOiB7XG4gICAgICBcImRhdGFzb3VyY2VcIjogXCJodWF3ZWktbXNjXCIsXG4gICAgICBcImV2ZW50TmFtZVwiOiBcImh1YXdlaV9tc2NfZmN0XCIsXG4gICAgICBcImZpbHRlcnNcIjogW1xuICAgICAgICB7IFwiZmllbGROYW1lXCI6IFwiZXZlbnRfdHlwZV9rZXlcIiwgXCJvcGVyYXRpb25cIjogXCJzdHJpbmdcIiwgXCJ0aHJlc2hvbGRcIjogXCIxLDUsNlwiLCBcImNvbXBhcmF0b3JcIjogXCJpblwiIH1cbiAgICAgIF0sXG4gICAgICBcImV4Y2x1c2lvbnNcIjogW1xuICAgICAgICB7IFwiZmllbGROYW1lXCI6IFwiXCIsIFwib3BlcmF0aW9uXCI6IFwiXCIsIFwidGhyZXNob2xkXCI6IFwiXCIsIFwiY29tcGFyYXRvclwiOiBcIlwiIH1cbiAgICAgIF0sXG4gICAgICBcImRpbWVuc2lvbnNcIjogW1xuICAgICAgICB7IFwiZmllbGROYW1lXCI6IFwieGRyX2RhdGVcIiwgXCJhbGlhc05hbWVcIjogXCJyZWNvcmRfZGF0ZVwiLCBcImRhdGFUeXBlXCI6IFwic3RyaW5nXCIsIFwiZm9ybWF0XCI6IFwieXl5eU1NZGRcIiB9LFxuICAgICAgICB7IFwiZmllbGROYW1lXCI6IFwiZXZlbnRfdHlwZV9rZXlcIiwgXCJhbGlhc05hbWVcIjogXCJldmVudF90eXBlXCIsIFwiZGF0YVR5cGVcIjogXCJzdHJpbmdcIiB9LFxuICAgICAgICB7IFwiZmllbGROYW1lXCI6IFwic3J2X3R5cGVfa2V5XCIsIFwiYWxpYXNOYW1lXCI6IFwic3J2X3R5cGVcIiwgXCJkYXRhVHlwZVwiOiBcInN0cmluZ1wiIH0sXG4gICAgICAgIHsgXCJmaWVsZE5hbWVcIjogXCJvdGhlcl9ud19pbmRfa2V5XCIsIFwiYWxpYXNOYW1lXCI6IFwibndfY2FsbF90eXBlXCIsIFwiZGF0YVR5cGVcIjogXCJzdHJpbmdcIiB9LFxuICAgICAgICB7IFwiZmllbGROYW1lXCI6IFwieGRyX2RhdGVcIiwgXCJhbGlhc05hbWVcIjogXCJob3VyXCIsIFwiZGF0YVR5cGVcIjogXCJpbnRcIiwgXCJtZXRob2RcIjogXCJnZXRIb3VyXCIgfSxcbiAgICAgICAgeyBcImZpZWxkTmFtZVwiOiBcIm90aGVyX21zaXNkbl9pc29fY29kZVwiLCBcImFsaWFzTmFtZVwiOiBcImNvdW50cnlcIiwgXCJkYXRhVHlwZVwiOiBcInN0cmluZ1wiIH0sXG4gICAgICAgIHsgXCJmaWVsZE5hbWVcIjogXCJvdGhlcl9vcGVyXCIsIFwiYWxpYXNOYW1lXCI6IFwib3BlcmF0b3JcIiwgXCJkYXRhVHlwZVwiOiBcInN0cmluZ1wiIH0sXG4gICAgICAgIHsgXCJmaWVsZE5hbWVcIjogXCJldmVudF9kaXJlY3Rpb25fa2V5XCIsIFwiYWxpYXNOYW1lXCI6IFwiZGlyZWN0aW9uXCIsIFwiZGF0YVR5cGVcIjogXCJzdHJpbmdcIiB9XG4gICAgICBdLFxuICAgICAgXCJtZWFzdXJlc1wiOiBbXG4gICAgICAgIHsgXCJmaWVsZE5hbWVcIjogXCJvcmlnaW5hbF9kdXJcIiwgXCJhbGlhc05hbWVcIjogXCJtc2NfbW91XCIsIFwiZGF0YVR5cGVcIjogXCJkb3VibGVcIiwgXCJ0eXBlXCI6IFwic3VtXCIgfSxcbiAgICAgICAgeyBcImFsaWFzTmFtZVwiOiBcIm1zY19jb3VudFwiLCBcInR5cGVcIjogXCJjb3VudFwiIH1cbiAgICAgIF1cbiAgICB9LFxuICAgIFwidGFyZ2V0XCI6IHtcbiAgICAgIFwiZGF0YWJhc2VOYW1lXCI6IFwicmFmbWRiXCIsXG4gICAgICBcImRiQ29uZmlnXCI6IFwibW9uZ29cIixcbiAgICAgIFwidGFibGVOYW1lXCI6IFwibXNjX2RhaWx5X21ldHJpY1wiLFxuICAgICAgXCJwYXJ0aXRpb25Db2x1bW5cIjogXCJcIixcbiAgICAgIFwiZGltZW5zaW9uQ29sdW1uc1wiOiBbXCJyZWNvcmRfZGF0ZVwiLCBcImV2ZW50X3R5cGVcIiwgXCJzcnZfdHlwZVwiLCBcImRpcmVjdGlvblwiLCBcIm53X2NhbGxfdHlwZVwiLCBcImhvdXJcIixcbiAgICAgICAgXCJjb3VudHJ5XCIsIFwib3BlcmF0b3JcIlxuICAgICAgXSxcbiAgICAgIFwibWVhc3VyZUNvbHVtbnNcIjogW1xuICAgICAgICBcIm1zY19tb3VcIiwgXCJtc2NfY291bnRcIlxuICAgICAgXSxcbiAgICAgIFwiY3JlYXRlVGFibGVcIjogZmFsc2UsXG4gICAgICBcIndyaXRlRGlzcG9zaXRpb25cIjogXCJhcHBlbmRcIlxuICAgIH1cbiAgfVxuICBtZXRyaWNNYWluT2JqZWN0OiBhbnkgPSB7XG4gICAgXCJtZXRyaWNOYW1lXCI6IFwibXNjX3ZvaWNlX2RheV9tZXRyaWNcIixcbiAgICBcIm1ldHJpY0lkXCI6IFwiXCIsXG4gICAgXCJtZXRyaWNEaXNwbGF5TmFtZVwiOiBcIk1ldHJpYyBWb2ljZSBEYXkgTWV0cmljXCIsXG4gICAgXCJtZXRyaWNUeXBlXCI6IFwib25saW5lXCIsXG4gIH07XG5cbiAgbWV0cmljT2ZsaW5lT2JqZWN0ID0ge1xuICAgIFwibWV0cmljTmFtZVwiOiBcIlwiLFxuICAgIFwibWV0cmljSWRcIjogXCJcIixcbiAgICBcIm1ldHJpY0Rpc3BsYXlOYW1lXCI6IFwiXCIsXG4gICAgXCJtZXRyaWNUeXBlXCI6IFwib2ZmbGluZVwiLFxuICAgIFwicnVubmVyXCI6XCJcIixcbiAgICBcInNvdXJjZVwiOiB7XG4gICAgICBcImRhdGFiYXNlTmFtZVwiOiBcInJhZm1zXCIsXG4gICAgICBcImRiQ29uZmlnXCI6IFwiYmlncXVlcnlcIixcbiAgICAgIFwicXVlcnlUZW1wbGF0ZVwiOiBcIlwiLFxuICAgICAgXCJxdWVyeVRlbXBsYXRlRmlsZVwiOiBcIlwiXG4gICAgfSxcbiAgICBcInRhcmdldFwiOiB7XG4gICAgICBcImRhdGFiYXNlTmFtZVwiOiBcInJhZm1kYlwiLFxuICAgICAgXCJkYkNvbmZpZ1wiOiBcIm15c3FsXCIsXG4gICAgICBcInRhYmxlTmFtZVwiOiBcIlwiLFxuICAgICAgXCJkaW1lbnNpb25Db2x1bW5zXCI6IFtdLFxuICAgICAgXCJtZWFzdXJlQ29sdW1uc1wiOiBbXSxcbiAgICAgIFwicGFydGl0aW9uQ29sdW1uXCI6IFwiXCIsXG4gICAgICBcImNyZWF0ZVRhYmxlXCI6IHRydWUsXG4gICAgICBcIndyaXRlRGlzcG9zaXRpb25cIjogXCJhcHBlbmRcIlxuICAgIH0sXG4gICAgXCJleGVjdXRpb25cIjoge1xuICAgICAgXCJ0eXBlXCI6IFwic2NoZWR1bGVkXCIsXG4gICAgICBcImpvYkdyb3VwSWRcIjogXCJcIixcbiAgICAgIFwiYXJndW1lbnRzXCI6IFtcbiAgICAgICAge1xuICAgICAgICAgIFwiYXJndW1lbnROYW1lXCI6IFwic3RhcnRfZGF0ZVwiLFxuICAgICAgICAgIFwibGFiZWxOYW1lXCI6IFwiRXZlbnQgU3RhcnQgRGF0ZVwiLFxuICAgICAgICAgIFwiZGF0YXR5cGVcIjogXCJ0aW1lc3RhbXBcIixcbiAgICAgICAgICBcInJ1bnRpbWVWYWx1ZVwiOiBcInN0YXRpY1wiLFxuICAgICAgICAgIFwiZnVuY3Rpb25cIjogXCJEMV9TVEFSVFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcImFyZ3VtZW50TmFtZVwiOiBcImVuZF9kYXRlXCIsXG4gICAgICAgICAgXCJsYWJlbE5hbWVcIjogXCJFdmVudCBFbmQgRGF0ZVwiLFxuICAgICAgICAgIFwicnVudGltZVZhbHVlXCI6IFwic3RhdGljXCIsXG4gICAgICAgICAgXCJkYXRhdHlwZVwiOiBcInRpbWVzdGFtcFwiLFxuICAgICAgICAgIFwiZnVuY3Rpb25cIjogXCJEMV9FTkRcIlxuICAgICAgICB9XG4gICAgICBdXG4gICAgfVxuICB9XG5cbiAgbWV0cmljdHlwZTogYW55O1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBjb21tb25TZXJ2aWNlOiBDb21tb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgdG9hc3RyOiBUb2FzdHJTZXJ2aWNlLFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSBzZXJ2aWNlOiBBcHBsaWNhdGlvbkNvbnRlbnRTZXJ2aWNlKSB7IH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcblxuICB9XG5cblxuICBnZXRNZXRyaWNUeXBlKGUpIHtcbiAgICBpZiAoZS5ldmVudCkge1xuICAgICAgdGhpcy5tZXRyaWN0eXBlID0gZS52YWx1ZTtcbiAgICB9XG4gIH1cblxuICBzdWJtaXR0T25saW5lTWV0cmljcyhkYXRhKSB7XG4gICAgZGF0YVtcImFwcE5hbWVcIl0gPSBcInByb250b1wiO1xuICAgIGRhdGFbXCJtZXRyaWNJZFwiXSA9IFwiXCI7XG4gICAgZGF0YVtcImFjdGl2YXRlZFwiXSA9IGZhbHNlO1xuICAgIGNvbnNvbGUubG9nKGRhdGEpO1xuICAgIHRoaXMuc2VydmljZS5zYXZlT25saW5lTWV0cmljQ29uZmlnKGRhdGEpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMudG9hc3RyLnN1Y2Nlc3MoXCJPbmxpbmUgTWV0cmljcyBVcGRhdGVzIFN1Y2Nlc3NmdWxseVwiKVxuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9hcHBzL2NvbnRyb2xQYW5lbC9tZXRyaWNDb250cm9sbGVyJ10pXG4gICAgICB9LCBlcnJvcjogKGVycjogYW55KSA9PiB7XG4gICAgICAgIHRoaXMudG9hc3RyLmVycm9yKCdVbmV4cGVjdGVkIFNlcnZlciBFeGNlcHRpb24uIFBsZWFzZSBjb250YWN0IFN5c3RlbSBBZG1pbi4nLCAnQ3JlYXRlIE1ldHJpY3MgQ29uZmlnJylcbiAgICAgIH1cbiAgICB9KVxuICB9XG4gIHN1Ym1pdHRPZmZsaW5lTWV0cmljcyhkYXRhKSB7XG4gICAgZGF0YVtcImFwcE5hbWVcIl0gPSBcInByb250b1wiO1xuICAgIGRhdGFbXCJtZXRyaWNJZFwiXSA9IFwiXCI7XG4gICAgZGF0YVtcImFjdGl2YXRlZFwiXSA9IGZhbHNlO1xuICAgIGNvbnNvbGUubG9nKGRhdGEpO1xuICAgIHRoaXMuc2VydmljZS5lZGl0T2ZmbGluZU1ldHJpY0NvbmZpZyhkYXRhKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnRvYXN0ci5zdWNjZXNzKFwiT2ZmbGluZSBNZXRyaWNzIFVwZGF0ZXMgU3VjY2Vzc2Z1bGx5XCIpXG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2FwcHMvY29udHJvbFBhbmVsL21ldHJpY0NvbnRyb2xsZXInXSlcbiAgICAgIH0sIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoJ1VuZXhwZWN0ZWQgU2VydmVyIEV4Y2VwdGlvbi4gUGxlYXNlIGNvbnRhY3QgU3lzdGVtIEFkbWluLicsICdDcmVhdGUgTWV0cmljcyBDb25maWcnKVxuICAgICAgfVxuICAgIH0pXG4gICAgY29uc29sZS5sb2coZGF0YSk7XG4gIH1cblxuXG59XG4iLCI8YXBwLWxvYWRpbmcgKm5nSWY9XCJsb2FkaW5nTW9kYWxcIj48L2FwcC1sb2FkaW5nPlxuPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZmxleC1hdXRvIHctZnVsbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktYmV0d2VlbiBib3JkZXItYiAgZGFyazpiZy10cmFuc3BhcmVudFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggIGZsZXgtY29sIG1sLTFcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCAgaXRlbXMtY2VudGVyIGZsb2F0LXN0YXJ0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBvdmVyZmxvdy1oaWRkZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImljb24tc2l6ZS0yXCIgW3N2Z0ljb25dPVwiJ2hlcm9pY29uc19zb2xpZDp0ZW1wbGF0ZSdcIj48L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGgyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtMnhsIG1kOnRleHQtMnhsIHB5LTMgZm9udC1leHRyYWJvbGQgaXRlbXMtY2VudGVyIG1sLTIgdHJhY2tpbmctdGlnaHQgbGVhZGluZy01IHRydW5jYXRlIGNhcGl0YWxpemVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZSBNZXRyaWNzXG4gICAgICAgICAgICAgICAgICAgIDwvaDI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktYmV0d2VlbiBpdGVtcy1jZW50ZXIgYm9yZGVyLWwtMiBwLTAgbS0wIHJlbGF0aXZlXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm14LTRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbGcgZm9udC1ib2xkIG14LTQgY29yc3VyLXBvaW50ZXJcIiAoY2xpY2spPVwib3BlbkRhdGVGaWx0ZXIoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3tzZWxlY3RlZERhdGVBbmRUaW1lfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY2FsZW5kYXJcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICA8L2Rpdj5cblxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImZsZXhcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbCBib3JkZXItclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tMlwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IG1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm14LTIgdy0xLzNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj5NZXRyaWMgTmFtZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwibWV0cmljTWFpbk9iamVjdC5tZXRyaWNOYW1lXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJteC0yIHctMS8zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+TWV0cmljIERpc3BsYXkgTmFtZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwibWV0cmljTWFpbk9iamVjdC5tZXRyaWNEaXNwbGF5TmFtZVwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXgtMiB3LTEvM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPk1ldHJpYyBJZDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwibWV0cmljTWFpbk9iamVjdC5tZXRyaWNJZFwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXgtMiB3LTEvM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPk1ldHJpYyBUeXBlPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbaXRlbXNdPVwiWydvbmxpbmUnLCdvZmxpbmUnXVwiIFsobmdNb2RlbCldPVwibWV0cmljTWFpbk9iamVjdC5tZXRyaWNUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25WYWx1ZUNoYW5nZWQpPVwiZ2V0TWV0cmljVHlwZSgkZXZlbnQpXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibWV0cmljTWFpbk9iamVjdC5tZXRyaWNUeXBlID09ICdvbmxpbmUnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxhcHAtb25saW5lLW1ldHJpY3MgW29ubGluZU1ldHJpY0RhdGFdPVwibWV0cmljT25saW5lT2JqZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChnZXRNZXRSaWNPbmxpbmVEYXRhU2V0KT1cInN1Ym1pdHRPbmxpbmVNZXRyaWNzKCRldmVudClcIj48L2FwcC1vbmxpbmUtbWV0cmljcz5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibWV0cmljTWFpbk9iamVjdC5tZXRyaWNUeXBlID09ICdvZmxpbmUnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxhcHAtb2ZsaW5lLW1ldHJpY3MgW29uZmxpbmVNZXRyaWNEYXRhXT1cIm1ldHJpY09mbGluZU9iamVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoZ2V0TWV0UmljT2ZsaW5lRGF0YVNldCk9XCJzdWJtaXR0T2ZmbGluZU1ldHJpY3MoJGV2ZW50KVwiPjwvYXBwLW9mbGluZS1tZXRyaWNzPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PiJdfQ==
@@ -0,0 +1,77 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "../../common";
4
+ import * as i2 from "ngx-toastr";
5
+ import * as i3 from "../../application-content.service";
6
+ import * as i4 from "@angular/common";
7
+ import * as i5 from "devextreme-angular/ui/check-box";
8
+ import * as i6 from "devextreme-angular/ui/select-box";
9
+ import * as i7 from "devextreme-angular/ui/text-box";
10
+ import * as i8 from "@angular/forms";
11
+ export class OflineMetricsComponent {
12
+ constructor(commonService, toastr, service) {
13
+ this.commonService = commonService;
14
+ this.toastr = toastr;
15
+ this.service = service;
16
+ this.reqFieldsDataSource = [];
17
+ this.isreqFields = false;
18
+ this.iscdrParams = false;
19
+ this.cdrFieldsDataSource = [];
20
+ this.kpi_function = ["sum", "count", "avg", "max", "min", "stddev", "count_distinct"];
21
+ this.kpi_operator = ["eq", "gte", "lte", "ne", "in", "notIn"];
22
+ this.kpi_enrichment_name = [];
23
+ this.reqShortDataSource = [];
24
+ this.filterMapingDatasource = [];
25
+ this.isModelVisible = false;
26
+ this.isSqlCopiedText = false;
27
+ this.isReconColume = false;
28
+ this.getMetRicOflineDataSet = new EventEmitter();
29
+ this.functionNameContainer = ["LASTDAY_START", "D_1_START", "LASTDAY_END", "D_1_END", "LASTDAY2_START", "D_2_START", "LASTDAY2_END", "D_2_END", "D_7_START", "D_7_END", "TODAY_START", "TODAY_END", "WEEK_START", "WEEK_END", "MONTH_START", "MONTH_END", "HOUR_START", "HOUR_END", "LASTHOUR_START", "LASTHOUR_END"];
30
+ this.reconColumeDatasource = [];
31
+ this.isQueryTypeSelect = false;
32
+ this.mesuresAndDimentionsColumns = [];
33
+ this.metricMainObject = {};
34
+ }
35
+ set onflineMetricData(value) {
36
+ this.metricMainObject = value;
37
+ }
38
+ ngOnInit() {
39
+ this.service.listColumnEnrichmentFunctions().subscribe(data => {
40
+ this.kpi_enrichment_name = data;
41
+ });
42
+ }
43
+ addArguments() {
44
+ let obj = {
45
+ "argumentName": "",
46
+ "labelName": "",
47
+ "runtimeValue": "",
48
+ "dataType": "",
49
+ "function": ""
50
+ };
51
+ this.metricMainObject.execution.arguments.push(obj);
52
+ }
53
+ deleteArguments(i) {
54
+ this.metricMainObject.execution.arguments.splice(i, 1);
55
+ }
56
+ createOflineMetrics() {
57
+ this.getMetRicOflineDataSet.emit(this.metricMainObject);
58
+ }
59
+ getDataConfig(e) {
60
+ if (e.event) {
61
+ this.selectedDataSource = e.value;
62
+ this.isQueryTypeSelect = true;
63
+ }
64
+ }
65
+ }
66
+ OflineMetricsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: OflineMetricsComponent, deps: [{ token: i1.CommonService }, { token: i2.ToastrService }, { token: i3.ApplicationContentService }], target: i0.ɵɵFactoryTarget.Component });
67
+ OflineMetricsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: OflineMetricsComponent, selector: "app-ofline-metrics", inputs: { onflineMetricData: "onflineMetricData" }, outputs: { getMetRicOflineDataSet: "getMetRicOflineDataSet" }, ngImport: i0, template: "<div class=\"flex flex-col flex-auto min-w-0 my-3\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\"> Basic\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"flex flex-wrap p-2\">\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Runner</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.runner\"></dx-text-box>\n </div>\n \n </div>\n </div>\n</div>\n<div class=\"flex flex-col flex-auto min-w-0 my-3\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\"> Target\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"flex flex-wrap p-2\">\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Database Name</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.databaseName\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> DB Config </div>\n <dx-select-box [items]=\"['mongo','impala','postgres','mysql','bigquery']\"\n (onValueChanged)=\"getDataConfig($event)\"\n [(ngModel)]=\"metricMainObject.target.dbConfig\"></dx-select-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Table Name</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.tableName\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Dimension Columns</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.dimensionColumns\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/3\">\n <div class=\"text-md mb-2\"> Measure Columns</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.measureColumns\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/3\">\n <div class=\"text-md mb-2\"> Partition Column</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.partitionColumn\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/3\">\n <div class=\"text-md mb-2\"> Write Disposition</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.writeDisposition\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/3\">\n <div class=\"text-md mb-2 mt-8\"></div>\n <dx-check-box text=\"Create Table\" [(ngModel)]=\"metricMainObject.target.createTable\"></dx-check-box>\n </div>\n </div>\n </div>\n</div>\n<div class=\"flex flex-col flex-auto min-w-0 my-3\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\"> Source\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"flex flex-wrap p-2\">\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Database Name</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.source.databaseName\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Db Config</div>\n <dx-select-box [items]=\"['mongo','impala','postgres','mysql','bigquery']\"\n (onValueChanged)=\"getDataConfig($event)\"\n [(ngModel)]=\"metricMainObject.target.dbConfig\"></dx-select-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Query Template</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.source.queryTemplate\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Query Template File</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.source.queryTemplateFile\"></dx-text-box>\n </div>\n </div>\n </div>\n</div>\n\n<div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\">Execution\n </div>\n <div class=\"pt-2 border-x border-b \">\n\n <div class=\"flex flex-wrap p-2\">\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Type</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.execution.type\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Job GroupId</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.execution.jobGroupId\"></dx-text-box>\n </div>\n \n </div>\n\n <div class=\"my-2 flex justify-between\"\n *ngFor=\"let item of metricMainObject.execution.arguments; let i = index;\">\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Argument Name</div>\n <dx-text-box [(ngModel)]=\"item.argumentName\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Label Name</div>\n <dx-text-box [(ngModel)]=\"item.labelName\"></dx-text-box>\n </div>\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Datatype</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"['date','string','timestamp','int', 'double', 'boolean']\"\n [(ngModel)]=\"item.dataType\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Function</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"functionNameContainer\"\n [(ngModel)]=\"item.function\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> runtimeValue</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"['static','dynamic']\"\n [(ngModel)]=\"item.runtimeValue\"></dx-select-box>\n </div>\n\n <div class=\"px-1 mt-7 text-center\">\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer\" (click)=\"deleteArguments(i)\"><i\n class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"flex flex-row justify-end my-2\">\n <button class=\"{{commonService.btn_primary_sm}} cursor-pointer\" (click)=\"addArguments()\">Add\n Columns</button>\n </div>\n </div>\n</div>\n\n<div class=\"flex w-full justify-end mt-5 border-t\">\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mx-1 my-2\" (click)=\"createOflineMetrics()\">\n Save Ofline Metrics\n </button>\n</div>", styles: [""], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: i5.DxCheckBoxComponent, selector: "dx-check-box", inputs: ["accessKey", "activeStateEnabled", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "iconSize", "isValid", "name", "readOnly", "rtlEnabled", "tabIndex", "text", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "visible", "width"], outputs: ["onContentReady", "onDisposing", "onInitialized", "onOptionChanged", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "iconSizeChange", "isValidChange", "nameChange", "readOnlyChange", "rtlEnabledChange", "tabIndexChange", "textChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "component", type: i6.DxSelectBoxComponent, selector: "dx-select-box", inputs: ["acceptCustomValue", "accessKey", "activeStateEnabled", "buttons", "dataSource", "deferRendering", "disabled", "displayExpr", "displayValue", "dropDownButtonTemplate", "dropDownOptions", "elementAttr", "fieldTemplate", "focusStateEnabled", "grouped", "groupTemplate", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "items", "itemTemplate", "label", "labelMode", "maxLength", "minSearchLength", "name", "noDataText", "opened", "openOnFieldClick", "placeholder", "readOnly", "rtlEnabled", "searchEnabled", "searchExpr", "searchMode", "searchTimeout", "selectedItem", "showClearButton", "showDataBeforeSearch", "showDropDownButton", "showSelectionControls", "spellcheck", "stylingMode", "tabIndex", "text", "useItemTextAsTitle", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueChangeEvent", "valueExpr", "visible", "width", "wrapItemText"], outputs: ["onChange", "onClosed", "onContentReady", "onCopy", "onCustomItemCreating", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onItemClick", "onKeyDown", "onKeyUp", "onOpened", "onOptionChanged", "onPaste", "onSelectionChanged", "onValueChanged", "acceptCustomValueChange", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "dataSourceChange", "deferRenderingChange", "disabledChange", "displayExprChange", "displayValueChange", "dropDownButtonTemplateChange", "dropDownOptionsChange", "elementAttrChange", "fieldTemplateChange", "focusStateEnabledChange", "groupedChange", "groupTemplateChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "itemsChange", "itemTemplateChange", "labelChange", "labelModeChange", "maxLengthChange", "minSearchLengthChange", "nameChange", "noDataTextChange", "openedChange", "openOnFieldClickChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "searchEnabledChange", "searchExprChange", "searchModeChange", "searchTimeoutChange", "selectedItemChange", "showClearButtonChange", "showDataBeforeSearchChange", "showDropDownButtonChange", "showSelectionControlsChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useItemTextAsTitleChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "valueExprChange", "visibleChange", "widthChange", "wrapItemTextChange", "onBlur"] }, { kind: "component", type: i7.DxTextBoxComponent, selector: "dx-text-box", inputs: ["accessKey", "activeStateEnabled", "buttons", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "label", "labelMode", "mask", "maskChar", "maskInvalidMessage", "maskRules", "maxLength", "mode", "name", "placeholder", "readOnly", "rtlEnabled", "showClearButton", "showMaskMode", "spellcheck", "stylingMode", "tabIndex", "text", "useMaskedValue", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueChangeEvent", "visible", "width"], outputs: ["onChange", "onContentReady", "onCopy", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onKeyDown", "onKeyUp", "onOptionChanged", "onPaste", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "labelChange", "labelModeChange", "maskChange", "maskCharChange", "maskInvalidMessageChange", "maskRulesChange", "maxLengthChange", "modeChange", "nameChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "showClearButtonChange", "showMaskModeChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useMaskedValueChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "directive", type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
68
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: OflineMetricsComponent, decorators: [{
69
+ type: Component,
70
+ args: [{ selector: 'app-ofline-metrics', template: "<div class=\"flex flex-col flex-auto min-w-0 my-3\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\"> Basic\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"flex flex-wrap p-2\">\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Runner</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.runner\"></dx-text-box>\n </div>\n \n </div>\n </div>\n</div>\n<div class=\"flex flex-col flex-auto min-w-0 my-3\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\"> Target\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"flex flex-wrap p-2\">\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Database Name</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.databaseName\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> DB Config </div>\n <dx-select-box [items]=\"['mongo','impala','postgres','mysql','bigquery']\"\n (onValueChanged)=\"getDataConfig($event)\"\n [(ngModel)]=\"metricMainObject.target.dbConfig\"></dx-select-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Table Name</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.tableName\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Dimension Columns</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.dimensionColumns\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/3\">\n <div class=\"text-md mb-2\"> Measure Columns</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.measureColumns\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/3\">\n <div class=\"text-md mb-2\"> Partition Column</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.partitionColumn\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/3\">\n <div class=\"text-md mb-2\"> Write Disposition</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.writeDisposition\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/3\">\n <div class=\"text-md mb-2 mt-8\"></div>\n <dx-check-box text=\"Create Table\" [(ngModel)]=\"metricMainObject.target.createTable\"></dx-check-box>\n </div>\n </div>\n </div>\n</div>\n<div class=\"flex flex-col flex-auto min-w-0 my-3\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\"> Source\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"flex flex-wrap p-2\">\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Database Name</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.source.databaseName\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Db Config</div>\n <dx-select-box [items]=\"['mongo','impala','postgres','mysql','bigquery']\"\n (onValueChanged)=\"getDataConfig($event)\"\n [(ngModel)]=\"metricMainObject.target.dbConfig\"></dx-select-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Query Template</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.source.queryTemplate\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Query Template File</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.source.queryTemplateFile\"></dx-text-box>\n </div>\n </div>\n </div>\n</div>\n\n<div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\">Execution\n </div>\n <div class=\"pt-2 border-x border-b \">\n\n <div class=\"flex flex-wrap p-2\">\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Type</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.execution.type\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Job GroupId</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.execution.jobGroupId\"></dx-text-box>\n </div>\n \n </div>\n\n <div class=\"my-2 flex justify-between\"\n *ngFor=\"let item of metricMainObject.execution.arguments; let i = index;\">\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Argument Name</div>\n <dx-text-box [(ngModel)]=\"item.argumentName\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Label Name</div>\n <dx-text-box [(ngModel)]=\"item.labelName\"></dx-text-box>\n </div>\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Datatype</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"['date','string','timestamp','int', 'double', 'boolean']\"\n [(ngModel)]=\"item.dataType\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Function</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"functionNameContainer\"\n [(ngModel)]=\"item.function\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> runtimeValue</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"['static','dynamic']\"\n [(ngModel)]=\"item.runtimeValue\"></dx-select-box>\n </div>\n\n <div class=\"px-1 mt-7 text-center\">\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer\" (click)=\"deleteArguments(i)\"><i\n class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"flex flex-row justify-end my-2\">\n <button class=\"{{commonService.btn_primary_sm}} cursor-pointer\" (click)=\"addArguments()\">Add\n Columns</button>\n </div>\n </div>\n</div>\n\n<div class=\"flex w-full justify-end mt-5 border-t\">\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mx-1 my-2\" (click)=\"createOflineMetrics()\">\n Save Ofline Metrics\n </button>\n</div>" }]
71
+ }], ctorParameters: function () { return [{ type: i1.CommonService }, { type: i2.ToastrService }, { type: i3.ApplicationContentService }]; }, propDecorators: { getMetRicOflineDataSet: [{
72
+ type: Output
73
+ }], onflineMetricData: [{
74
+ type: Input,
75
+ args: ['onflineMetricData']
76
+ }] } });
77
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2ZsaW5lLW1ldHJpY3MuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2FtbWEtYXBwLWNvbnRyb2xsZXIvc3JjL2xpYi9hcHBsaWNhdGlvbi1jb250cm9sbGVyL2FwcGxpY2F0aW9uLW1ldHJpYy1jb25maWcvb2ZsaW5lLW1ldHJpY3Mvb2ZsaW5lLW1ldHJpY3MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2FtbWEtYXBwLWNvbnRyb2xsZXIvc3JjL2xpYi9hcHBsaWNhdGlvbi1jb250cm9sbGVyL2FwcGxpY2F0aW9uLW1ldHJpYy1jb25maWcvb2ZsaW5lLW1ldHJpY3Mvb2ZsaW5lLW1ldHJpY3MuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7OztBQVUvRSxNQUFNLE9BQU8sc0JBQXNCO0lBc0NqQyxZQUFtQixhQUE0QixFQUFVLE1BQXFCLEVBQVUsT0FBa0M7UUFBdkcsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFBVSxXQUFNLEdBQU4sTUFBTSxDQUFlO1FBQVUsWUFBTyxHQUFQLE9BQU8sQ0FBMkI7UUFuQzFILHdCQUFtQixHQUFRLEVBQUUsQ0FBQztRQUM5QixnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUM3QixnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUM3Qix3QkFBbUIsR0FBUSxFQUFFLENBQUM7UUFDOUIsaUJBQVksR0FBUSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixDQUFDLENBQUE7UUFDckYsaUJBQVksR0FBUSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDN0Qsd0JBQW1CLEdBQVEsRUFBRSxDQUFDO1FBQzlCLHVCQUFrQixHQUFRLEVBQUUsQ0FBQztRQUM3QiwyQkFBc0IsR0FBUSxFQUFFLENBQUM7UUFFakMsbUJBQWMsR0FBWSxLQUFLLENBQUM7UUFDaEMsb0JBQWUsR0FBWSxLQUFLLENBQUM7UUFFakMsa0JBQWEsR0FBWSxLQUFLLENBQUM7UUFDZCwyQkFBc0IsR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNoRiwwQkFBcUIsR0FBRyxDQUFDLGVBQWUsRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFFalQsMEJBQXFCLEdBQUcsRUFBRSxDQUFDO1FBRzNCLHNCQUFpQixHQUFZLEtBQUssQ0FBQztRQUVuQyxnQ0FBMkIsR0FBRyxFQUFFLENBQUM7UUFDakMscUJBQWdCLEdBQVEsRUFBRSxDQUFDO0lBWW1HLENBQUM7SUFQL0gsSUFDSSxpQkFBaUIsQ0FBQyxLQUFLO1FBQ3pCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7SUFDaEMsQ0FBQztJQU1ELFFBQVE7UUFDTixJQUFJLENBQUMsT0FBTyxDQUFDLDZCQUE2QixFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzVELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUM7UUFDbEMsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksR0FBRyxHQUFHO1lBQ1IsY0FBYyxFQUFFLEVBQUU7WUFDbEIsV0FBVyxFQUFFLEVBQUU7WUFDZixjQUFjLEVBQUUsRUFBRTtZQUNsQixVQUFVLEVBQUUsRUFBRTtZQUNkLFVBQVUsRUFBRSxFQUFFO1NBQ2YsQ0FBQTtRQUNELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBR0QsZUFBZSxDQUFDLENBQUM7UUFDZixJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQ3hELENBQUM7SUFJRCxtQkFBbUI7UUFHakIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtJQUN6RCxDQUFDO0lBSUQsYUFBYSxDQUFDLENBQUM7UUFDYixJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUU7WUFDWCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUNsQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1NBQy9CO0lBRUgsQ0FBQzs7bUhBOUVVLHNCQUFzQjt1R0FBdEIsc0JBQXNCLDZLQ1ZuQyx1OE5BaUpNOzJGRHZJTyxzQkFBc0I7a0JBTGxDLFNBQVM7K0JBQ0Usb0JBQW9CO3dLQXFCYixzQkFBc0I7c0JBQXRDLE1BQU07Z0JBZUgsaUJBQWlCO3NCQURwQixLQUFLO3VCQUFDLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRvYXN0clNlcnZpY2UgfSBmcm9tICduZ3gtdG9hc3RyJztcbmltcG9ydCB7IEFwcGxpY2F0aW9uQ29udGVudFNlcnZpY2UgfSBmcm9tICcuLi8uLi9hcHBsaWNhdGlvbi1jb250ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29tbW9uU2VydmljZSB9IGZyb20gJy4uLy4uL2NvbW1vbic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1vZmxpbmUtbWV0cmljcycsXG4gIHRlbXBsYXRlVXJsOiAnLi9vZmxpbmUtbWV0cmljcy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL29mbGluZS1tZXRyaWNzLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgT2ZsaW5lTWV0cmljc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIGxvYWRpbmdNb2RhbDogYm9vbGVhbjtcbiAgLy8gQElucHV0KCkgcXVlcnlCdWxkZXJEYXRhc2V0OiBhbnk7XG4gIHJlcUZpZWxkc0RhdGFTb3VyY2U6IGFueSA9IFtdO1xuICBpc3JlcUZpZWxkczogYm9vbGVhbiA9IGZhbHNlO1xuICBpc2NkclBhcmFtczogYm9vbGVhbiA9IGZhbHNlO1xuICBjZHJGaWVsZHNEYXRhU291cmNlOiBhbnkgPSBbXTtcbiAga3BpX2Z1bmN0aW9uOiBhbnkgPSBbXCJzdW1cIiwgXCJjb3VudFwiLCBcImF2Z1wiLCBcIm1heFwiLCBcIm1pblwiLCBcInN0ZGRldlwiLCBcImNvdW50X2Rpc3RpbmN0XCJdXG4gIGtwaV9vcGVyYXRvcjogYW55ID0gW1wiZXFcIiwgXCJndGVcIiwgXCJsdGVcIiwgXCJuZVwiLCBcImluXCIsIFwibm90SW5cIl1cbiAga3BpX2VucmljaG1lbnRfbmFtZTogYW55ID0gW107XG4gIHJlcVNob3J0RGF0YVNvdXJjZTogYW55ID0gW107XG4gIGZpbHRlck1hcGluZ0RhdGFzb3VyY2U6IGFueSA9IFtdO1xuICBxdWVyeV9kYXRhOiBhbnk7XG4gIGlzTW9kZWxWaXNpYmxlOiBib29sZWFuID0gZmFsc2U7XG4gIGlzU3FsQ29waWVkVGV4dDogYm9vbGVhbiA9IGZhbHNlO1xuICBxdWVyeUJ1bGRlckRhdGFzZXQ6IGFueTtcbiAgaXNSZWNvbkNvbHVtZTogYm9vbGVhbiA9IGZhbHNlO1xuICBAT3V0cHV0KCkgcHVibGljIGdldE1ldFJpY09mbGluZURhdGFTZXQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBmdW5jdGlvbk5hbWVDb250YWluZXIgPSBbXCJMQVNUREFZX1NUQVJUXCIsIFwiRF8xX1NUQVJUXCIsIFwiTEFTVERBWV9FTkRcIiwgXCJEXzFfRU5EXCIsIFwiTEFTVERBWTJfU1RBUlRcIiwgXCJEXzJfU1RBUlRcIiwgXCJMQVNUREFZMl9FTkRcIiwgXCJEXzJfRU5EXCIsIFwiRF83X1NUQVJUXCIsIFwiRF83X0VORFwiLCBcIlRPREFZX1NUQVJUXCIsIFwiVE9EQVlfRU5EXCIsIFwiV0VFS19TVEFSVFwiLCBcIldFRUtfRU5EXCIsIFwiTU9OVEhfU1RBUlRcIiwgXCJNT05USF9FTkRcIiwgXCJIT1VSX1NUQVJUXCIsIFwiSE9VUl9FTkRcIiwgXCJMQVNUSE9VUl9TVEFSVFwiLCBcIkxBU1RIT1VSX0VORFwiXTtcblxuICByZWNvbkNvbHVtZURhdGFzb3VyY2UgPSBbXTtcblxuICBzZWxlY3RlZERhdGFTb3VyY2U6IGFueTtcbiAgaXNRdWVyeVR5cGVTZWxlY3Q6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBtZXN1cmVzQW5kRGltZW50aW9uc0NvbHVtbnMgPSBbXTtcbiAgbWV0cmljTWFpbk9iamVjdDogYW55ID0ge307XG5cbiAgbWV0cmljdHlwZTogYW55O1xuXG5cbiAgQElucHV0KCdvbmZsaW5lTWV0cmljRGF0YScpXG4gIHNldCBvbmZsaW5lTWV0cmljRGF0YSh2YWx1ZSkge1xuICAgIHRoaXMubWV0cmljTWFpbk9iamVjdCA9IHZhbHVlO1xuICB9XG5cblxuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBjb21tb25TZXJ2aWNlOiBDb21tb25TZXJ2aWNlLCBwcml2YXRlIHRvYXN0cjogVG9hc3RyU2VydmljZSwgcHJpdmF0ZSBzZXJ2aWNlOiBBcHBsaWNhdGlvbkNvbnRlbnRTZXJ2aWNlKSB7IH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNlcnZpY2UubGlzdENvbHVtbkVucmljaG1lbnRGdW5jdGlvbnMoKS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICB0aGlzLmtwaV9lbnJpY2htZW50X25hbWUgPSBkYXRhO1xuICAgIH0pXG4gIH1cblxuICBhZGRBcmd1bWVudHMoKSB7XG4gICAgbGV0IG9iaiA9IHtcbiAgICAgIFwiYXJndW1lbnROYW1lXCI6IFwiXCIsXG4gICAgICBcImxhYmVsTmFtZVwiOiBcIlwiLFxuICAgICAgXCJydW50aW1lVmFsdWVcIjogXCJcIixcbiAgICAgIFwiZGF0YVR5cGVcIjogXCJcIixcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJcIlxuICAgIH1cbiAgICB0aGlzLm1ldHJpY01haW5PYmplY3QuZXhlY3V0aW9uLmFyZ3VtZW50cy5wdXNoKG9iaik7XG4gIH1cblxuXG4gIGRlbGV0ZUFyZ3VtZW50cyhpKSB7XG4gICAgdGhpcy5tZXRyaWNNYWluT2JqZWN0LmV4ZWN1dGlvbi5hcmd1bWVudHMuc3BsaWNlKGksIDEpXG4gIH1cblxuXG5cbiAgY3JlYXRlT2ZsaW5lTWV0cmljcygpIHtcblxuXG4gICAgdGhpcy5nZXRNZXRSaWNPZmxpbmVEYXRhU2V0LmVtaXQodGhpcy5tZXRyaWNNYWluT2JqZWN0KVxuICB9XG5cblxuXG4gIGdldERhdGFDb25maWcoZSkge1xuICAgIGlmIChlLmV2ZW50KSB7XG4gICAgICB0aGlzLnNlbGVjdGVkRGF0YVNvdXJjZSA9IGUudmFsdWU7XG4gICAgICB0aGlzLmlzUXVlcnlUeXBlU2VsZWN0ID0gdHJ1ZTtcbiAgICB9XG5cbiAgfVxuXG5cbn1cbiIsIjxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGZsZXgtYXV0byBtaW4tdy0wIG15LTNcIj5cbiAgICA8ZGl2IGNsYXNzPVwidGV4dC1sZyBweS0yIGZvbnQtZXh0cmFib2xkIGJvcmRlci1iIGJnLWdyYXktNzAwIHRleHQtd2hpdGUgcHgtMlwiPiBCYXNpY1xuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJwdC0yIGJvcmRlci14IGJvcmRlci1iIFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXdyYXAgcC0yXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMiBtYi0yIHctMS8yXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBSdW5uZXI8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJtZXRyaWNNYWluT2JqZWN0LnJ1bm5lclwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgXG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG48ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBmbGV4LWF1dG8gbWluLXctMCBteS0zXCI+XG4gICAgPGRpdiBjbGFzcz1cInRleHQtbGcgcHktMiBmb250LWV4dHJhYm9sZCBib3JkZXItYiBiZy1ncmF5LTcwMCB0ZXh0LXdoaXRlIHB4LTJcIj4gVGFyZ2V0XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInB0LTIgYm9yZGVyLXggYm9yZGVyLWIgXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcCBwLTJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0yIG1iLTIgdy0xLzJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IERhdGFiYXNlIE5hbWU8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJtZXRyaWNNYWluT2JqZWN0LnRhcmdldC5kYXRhYmFzZU5hbWVcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMiBtYi0yIHctMS8yXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBEQiBDb25maWcgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW2l0ZW1zXT1cIlsnbW9uZ28nLCdpbXBhbGEnLCdwb3N0Z3JlcycsJ215c3FsJywnYmlncXVlcnknXVwiXG4gICAgICAgICAgICAgICAgICAgIChvblZhbHVlQ2hhbmdlZCk9XCJnZXREYXRhQ29uZmlnKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm1ldHJpY01haW5PYmplY3QudGFyZ2V0LmRiQ29uZmlnXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMiBtYi0yIHctMS8yXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBUYWJsZSBOYW1lPC9kaXY+XG4gICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwibWV0cmljTWFpbk9iamVjdC50YXJnZXQudGFibGVOYW1lXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTIgbWItMiB3LTEvMlwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gRGltZW5zaW9uIENvbHVtbnM8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJtZXRyaWNNYWluT2JqZWN0LnRhcmdldC5kaW1lbnNpb25Db2x1bW5zXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTIgbWItMiB3LTEvM1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gTWVhc3VyZSBDb2x1bW5zPC9kaXY+XG4gICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwibWV0cmljTWFpbk9iamVjdC50YXJnZXQubWVhc3VyZUNvbHVtbnNcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMiBtYi0yIHctMS8zXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBQYXJ0aXRpb24gQ29sdW1uPC9kaXY+XG4gICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwibWV0cmljTWFpbk9iamVjdC50YXJnZXQucGFydGl0aW9uQ29sdW1uXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTIgbWItMiB3LTEvM1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gV3JpdGUgRGlzcG9zaXRpb248L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJtZXRyaWNNYWluT2JqZWN0LnRhcmdldC53cml0ZURpc3Bvc2l0aW9uXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTIgbWItMiB3LTEvM1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTIgbXQtOFwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDxkeC1jaGVjay1ib3ggdGV4dD1cIkNyZWF0ZSBUYWJsZVwiIFsobmdNb2RlbCldPVwibWV0cmljTWFpbk9iamVjdC50YXJnZXQuY3JlYXRlVGFibGVcIj48L2R4LWNoZWNrLWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZmxleC1hdXRvIG1pbi13LTAgbXktM1wiPlxuICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWxnIHB5LTIgZm9udC1leHRyYWJvbGQgYm9yZGVyLWIgYmctZ3JheS03MDAgdGV4dC13aGl0ZSBweC0yXCI+IFNvdXJjZVxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJwdC0yIGJvcmRlci14IGJvcmRlci1iIFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXdyYXAgcC0yXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMiBtYi0yIHctMS8yXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBEYXRhYmFzZSBOYW1lPC9kaXY+XG4gICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwibWV0cmljTWFpbk9iamVjdC5zb3VyY2UuZGF0YWJhc2VOYW1lXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTIgbWItMiB3LTEvMlwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gRGIgQ29uZmlnPC9kaXY+XG4gICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW2l0ZW1zXT1cIlsnbW9uZ28nLCdpbXBhbGEnLCdwb3N0Z3JlcycsJ215c3FsJywnYmlncXVlcnknXVwiXG4gICAgICAgICAgICAgICAgICAgIChvblZhbHVlQ2hhbmdlZCk9XCJnZXREYXRhQ29uZmlnKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm1ldHJpY01haW5PYmplY3QudGFyZ2V0LmRiQ29uZmlnXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMiBtYi0yIHctMS8yXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBRdWVyeSBUZW1wbGF0ZTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cIm1ldHJpY01haW5PYmplY3Quc291cmNlLnF1ZXJ5VGVtcGxhdGVcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMiBtYi0yIHctMS8yXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBRdWVyeSBUZW1wbGF0ZSBGaWxlPC9kaXY+XG4gICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwibWV0cmljTWFpbk9iamVjdC5zb3VyY2UucXVlcnlUZW1wbGF0ZUZpbGVcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGZsZXgtYXV0byBtaW4tdy0wIG15LTJcIj5cbiAgICA8ZGl2IGNsYXNzPVwidGV4dC1sZyBweS0yIGZvbnQtZXh0cmFib2xkIGJvcmRlci1iIGJnLWdyYXktNzAwIHRleHQtd2hpdGUgcHgtMlwiPkV4ZWN1dGlvblxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJwdC0yIGJvcmRlci14IGJvcmRlci1iIFwiPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcCBwLTJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0yIG1iLTIgdy0xLzJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IFR5cGU8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJtZXRyaWNNYWluT2JqZWN0LmV4ZWN1dGlvbi50eXBlXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTIgbWItMiB3LTEvMlwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gSm9iIEdyb3VwSWQ8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJtZXRyaWNNYWluT2JqZWN0LmV4ZWN1dGlvbi5qb2JHcm91cElkXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICBcbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm15LTIgZmxleCBqdXN0aWZ5LWJldHdlZW5cIlxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgbWV0cmljTWFpbk9iamVjdC5leGVjdXRpb24uYXJndW1lbnRzOyBsZXQgaSA9IGluZGV4O1wiPlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0yIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gQXJndW1lbnQgTmFtZTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cIml0ZW0uYXJndW1lbnROYW1lXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMiB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IExhYmVsIE5hbWU8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJpdGVtLmxhYmVsTmFtZVwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMiB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IERhdGF0eXBlPC9kaXY+XG4gICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW3NlYXJjaEVuYWJsZWRdPVwidHJ1ZVwiIFtpdGVtc109XCJbJ2RhdGUnLCdzdHJpbmcnLCd0aW1lc3RhbXAnLCdpbnQnLCAnZG91YmxlJywgJ2Jvb2xlYW4nXVwiXG4gICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaXRlbS5kYXRhVHlwZVwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMiB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IEZ1bmN0aW9uPC9kaXY+XG4gICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW3NlYXJjaEVuYWJsZWRdPVwidHJ1ZVwiIFtpdGVtc109XCJmdW5jdGlvbk5hbWVDb250YWluZXJcIlxuICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIml0ZW0uZnVuY3Rpb25cIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTIgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBydW50aW1lVmFsdWU8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbc2VhcmNoRW5hYmxlZF09XCJ0cnVlXCIgW2l0ZW1zXT1cIlsnc3RhdGljJywnZHluYW1pYyddXCJcbiAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJpdGVtLnJ1bnRpbWVWYWx1ZVwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtdC03IHRleHQtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fZGFuZ2VyX3NtfX0gY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiZGVsZXRlQXJndW1lbnRzKGkpXCI+PGlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmEgZmEtdHJhc2gtb1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWVuZCBteS0yXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9wcmltYXJ5X3NtfX0gY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiYWRkQXJndW1lbnRzKClcIj5BZGRcbiAgICAgICAgICAgICAgICBDb2x1bW5zPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJmbGV4IHctZnVsbCBqdXN0aWZ5LWVuZCBtdC01IGJvcmRlci10XCI+XG4gICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fc3VjY2Vzc19tZH19IGN1cnNvci1wb2ludGVyIG14LTEgbXktMlwiIChjbGljayk9XCJjcmVhdGVPZmxpbmVNZXRyaWNzKClcIj5cbiAgICAgICAgU2F2ZSBPZmxpbmUgTWV0cmljc1xuICAgIDwvYnV0dG9uPlxuPC9kaXY+Il19