gamma-app-controller 1.1.4 → 1.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/application-controller/application-controller.module.mjs +20 -5
- package/esm2020/lib/application-controller/application-dataset-component/application-dataset/application-dataset.component.mjs +4 -4
- package/esm2020/lib/application-controller/application-metric-config/create-metrics/create-metrics.component.mjs +152 -0
- package/esm2020/lib/application-controller/application-metric-config/ofline-metrics/ofline-metrics.component.mjs +77 -0
- package/esm2020/lib/application-controller/application-metric-config/online-metrics/online-metrics.component.mjs +169 -0
- package/esm2020/public-api.mjs +4 -1
- package/fesm2015/gamma-app-controller.mjs +401 -29
- package/fesm2015/gamma-app-controller.mjs.map +1 -1
- package/fesm2020/gamma-app-controller.mjs +407 -29
- package/fesm2020/gamma-app-controller.mjs.map +1 -1
- package/lib/application-controller/application-controller.module.d.ts +14 -11
- package/lib/application-controller/application-metric-config/create-metrics/create-metrics.component.d.ts +130 -0
- package/lib/application-controller/application-metric-config/ofline-metrics/ofline-metrics.component.d.ts +42 -0
- package/lib/application-controller/application-metric-config/online-metrics/online-metrics.component.d.ts +49 -0
- package/package.json +1 -1
- package/public-api.d.ts +3 -0
|
@@ -0,0 +1,152 @@
|
|
|
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/common";
|
|
6
|
+
import * as i4 from "devextreme-angular/ui/select-box";
|
|
7
|
+
import * as i5 from "devextreme-angular/ui/text-box";
|
|
8
|
+
import * as i6 from "@angular/forms";
|
|
9
|
+
import * as i7 from "@angular/material/icon";
|
|
10
|
+
import * as i8 from "../../shared/loading/loading.component";
|
|
11
|
+
import * as i9 from "../online-metrics/online-metrics.component";
|
|
12
|
+
import * as i10 from "../ofline-metrics/ofline-metrics.component";
|
|
13
|
+
export class CreateMetricsComponent {
|
|
14
|
+
constructor(commonService, toastr) {
|
|
15
|
+
this.commonService = commonService;
|
|
16
|
+
this.toastr = toastr;
|
|
17
|
+
this.reqFieldsDataSource = [];
|
|
18
|
+
this.isreqFields = false;
|
|
19
|
+
this.iscdrParams = false;
|
|
20
|
+
this.cdrFieldsDataSource = [];
|
|
21
|
+
this.kpi_function = ["sum", "count", "avg", "max", "min", "stddev", "count_distinct"];
|
|
22
|
+
this.kpi_operator = ["eq", "gte", "lte", "ne", "in", "notIn"];
|
|
23
|
+
this.kpi_enrichment_name = [];
|
|
24
|
+
this.reqShortDataSource = [];
|
|
25
|
+
this.filterMapingDatasource = [];
|
|
26
|
+
this.isModelVisible = false;
|
|
27
|
+
this.isSqlCopiedText = false;
|
|
28
|
+
this.isReconColume = false;
|
|
29
|
+
this.reconColumeDatasource = [];
|
|
30
|
+
this.isQueryTypeSelect = false;
|
|
31
|
+
this.mesuresAndDimentionsColumns = [];
|
|
32
|
+
this.metricOnlineObject = {
|
|
33
|
+
"metricName": "msc_voice_day_metric",
|
|
34
|
+
"metricId": "",
|
|
35
|
+
"metricDisplayName": "Metric Voice Day Metric",
|
|
36
|
+
"metricType": "online",
|
|
37
|
+
"source": {
|
|
38
|
+
"datasource": "huawei-msc",
|
|
39
|
+
"eventName": "huawei_msc_fct",
|
|
40
|
+
"filters": [
|
|
41
|
+
{ "fieldName": "event_type_key", "operation": "string", "threshold": "1,5,6", "comparator": "in" }
|
|
42
|
+
],
|
|
43
|
+
"exclusions": [
|
|
44
|
+
{ "fieldName": "", "operation": "", "threshold": "", "comparator": "" }
|
|
45
|
+
],
|
|
46
|
+
"dimensions": [
|
|
47
|
+
{ "fieldName": "xdr_date", "aliasName": "record_date", "dataType": "string", "format": "yyyyMMdd" },
|
|
48
|
+
{ "fieldName": "event_type_key", "aliasName": "event_type", "dataType": "string" },
|
|
49
|
+
{ "fieldName": "srv_type_key", "aliasName": "srv_type", "dataType": "string" },
|
|
50
|
+
{ "fieldName": "other_nw_ind_key", "aliasName": "nw_call_type", "dataType": "string" },
|
|
51
|
+
{ "fieldName": "xdr_date", "aliasName": "hour", "dataType": "int", "method": "getHour" },
|
|
52
|
+
{ "fieldName": "other_msisdn_iso_code", "aliasName": "country", "dataType": "string" },
|
|
53
|
+
{ "fieldName": "other_oper", "aliasName": "operator", "dataType": "string" },
|
|
54
|
+
{ "fieldName": "event_direction_key", "aliasName": "direction", "dataType": "string" }
|
|
55
|
+
],
|
|
56
|
+
"measures": [
|
|
57
|
+
{ "fieldName": "original_dur", "aliasName": "msc_mou", "dataType": "double", "type": "sum" },
|
|
58
|
+
{ "aliasName": "msc_count", "type": "count" }
|
|
59
|
+
]
|
|
60
|
+
},
|
|
61
|
+
"target": {
|
|
62
|
+
"databaseName": "rafmdb",
|
|
63
|
+
"dbConfig": "mongo",
|
|
64
|
+
"tableName": "msc_daily_metric",
|
|
65
|
+
"dimensionColumns": ["record_date", "event_type", "srv_type", "direction", "nw_call_type", "hour",
|
|
66
|
+
"country", "operator"
|
|
67
|
+
],
|
|
68
|
+
"measureColumns": [
|
|
69
|
+
"msc_mou", "msc_count"
|
|
70
|
+
],
|
|
71
|
+
"createTable": false,
|
|
72
|
+
"writeDisposition": "append"
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
this.metricMainObject = {
|
|
76
|
+
"metricName": "msc_voice_day_metric",
|
|
77
|
+
"metricId": "",
|
|
78
|
+
"metricDisplayName": "Metric Voice Day Metric",
|
|
79
|
+
"metricType": "online",
|
|
80
|
+
};
|
|
81
|
+
this.metricOflineObject = {
|
|
82
|
+
"metricName": "",
|
|
83
|
+
"metricId": "",
|
|
84
|
+
"metricDisplayName": "",
|
|
85
|
+
"metricType": "offline",
|
|
86
|
+
"source": {
|
|
87
|
+
"databaseName": "rafms",
|
|
88
|
+
"dbConfig": "bigquery",
|
|
89
|
+
"queryTemplate": "",
|
|
90
|
+
"queryTemplateFile": ""
|
|
91
|
+
},
|
|
92
|
+
"target": {
|
|
93
|
+
"databaseName": "rafmdb",
|
|
94
|
+
"dbConfig": "mysql",
|
|
95
|
+
"tableName": "",
|
|
96
|
+
"dimensionColumns": [],
|
|
97
|
+
"measureColumns": [],
|
|
98
|
+
"partitionColumn": "",
|
|
99
|
+
"createTable": true,
|
|
100
|
+
"writeDisposition": "append"
|
|
101
|
+
},
|
|
102
|
+
"execution": {
|
|
103
|
+
"type": "scheduled",
|
|
104
|
+
"jobGroupId": "",
|
|
105
|
+
"arguments": [
|
|
106
|
+
{
|
|
107
|
+
"argumentName": "start_date",
|
|
108
|
+
"labelName": "Event Start Date",
|
|
109
|
+
"datatype": "timestamp",
|
|
110
|
+
"runtimeValue": "static",
|
|
111
|
+
"function": "D1_START"
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
"argumentName": "end_date",
|
|
115
|
+
"labelName": "Event End Date",
|
|
116
|
+
"runtimeValue": "static",
|
|
117
|
+
"datatype": "timestamp",
|
|
118
|
+
"function": "D1_END"
|
|
119
|
+
}
|
|
120
|
+
]
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
ngOnInit() {
|
|
125
|
+
}
|
|
126
|
+
getMetricType(e) {
|
|
127
|
+
if (e.event) {
|
|
128
|
+
this.metrictype = e.value;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
submittOnlineMetrics(data) {
|
|
132
|
+
data["metricName"] = this.metricMainObject['metricName'];
|
|
133
|
+
data["metricId"] = this.metricMainObject['metricId'];
|
|
134
|
+
data["metricDisplayName"] = this.metricMainObject['metricDisplayName'];
|
|
135
|
+
data["metricType"] = this.metricMainObject.metricType;
|
|
136
|
+
console.log(data);
|
|
137
|
+
}
|
|
138
|
+
submittOfflineMetrics(data) {
|
|
139
|
+
data["metricName"] = this.metricMainObject['metricName'];
|
|
140
|
+
data["metricId"] = this.metricMainObject['metricId'];
|
|
141
|
+
data["metricDisplayName"] = this.metricMainObject['metricDisplayName'];
|
|
142
|
+
data["metricType"] = this.metricMainObject.metricType;
|
|
143
|
+
console.log(data);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
CreateMetricsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CreateMetricsComponent, deps: [{ token: i1.CommonService }, { token: i2.ToastrService }], target: i0.ɵɵFactoryTarget.Component });
|
|
147
|
+
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: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.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: i5.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: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i8.LoadingComponent, selector: "app-loading" }, { kind: "component", type: i9.OnlineMetricsComponent, selector: "app-online-metrics", inputs: ["onlineMetricData"], outputs: ["getMetRicOnlineDataSet"] }, { kind: "component", type: i10.OflineMetricsComponent, selector: "app-ofline-metrics", inputs: ["onflineMetricData"], outputs: ["getMetRicOflineDataSet"] }] });
|
|
148
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CreateMetricsComponent, decorators: [{
|
|
149
|
+
type: Component,
|
|
150
|
+
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>" }]
|
|
151
|
+
}], ctorParameters: function () { return [{ type: i1.CommonService }, { type: i2.ToastrService }]; } });
|
|
152
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLW1ldHJpY3MuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2FtbWEtYXBwLWNvbnRyb2xsZXIvc3JjL2xpYi9hcHBsaWNhdGlvbi1jb250cm9sbGVyL2FwcGxpY2F0aW9uLW1ldHJpYy1jb25maWcvY3JlYXRlLW1ldHJpY3MvY3JlYXRlLW1ldHJpY3MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2FtbWEtYXBwLWNvbnRyb2xsZXIvc3JjL2xpYi9hcHBsaWNhdGlvbi1jb250cm9sbGVyL2FwcGxpY2F0aW9uLW1ldHJpYy1jb25maWcvY3JlYXRlLW1ldHJpY3MvY3JlYXRlLW1ldHJpY3MuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLFNBQVMsRUFBdUMsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7Ozs7OztBQVMvRSxNQUFNLE9BQU8sc0JBQXNCO0lBd0hqQyxZQUFtQixhQUE0QixFQUFVLE1BQXFCO1FBQTNELGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQVUsV0FBTSxHQUFOLE1BQU0sQ0FBZTtRQXJIOUUsd0JBQW1CLEdBQVEsRUFBRSxDQUFDO1FBQzlCLGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBQzdCLGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBQzdCLHdCQUFtQixHQUFRLEVBQUUsQ0FBQztRQUM5QixpQkFBWSxHQUFRLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQTtRQUNyRixpQkFBWSxHQUFRLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUM3RCx3QkFBbUIsR0FBUSxFQUFFLENBQUM7UUFDOUIsdUJB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VUFBVSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUM7U0FDM0I7SUFDSCxDQUFDO0lBRUQsb0JBQW9CLENBQUMsSUFBSTtRQUN2QixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3pELElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDdkUsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUM7UUFDdEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwQixDQUFDO0lBQ0QscUJBQXFCLENBQUMsSUFBSTtRQUN4QixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3pELElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDdkUsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUM7UUFDdEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwQixDQUFDOzttSEFsSlUsc0JBQXNCO3VHQUF0QixzQkFBc0IsMERDWG5DLDJyR0FnRU07MkZEckRPLHNCQUFzQjtrQkFMbEMsU0FBUzsrQkFDRSxvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJcblxuaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVG9hc3RyU2VydmljZSB9IGZyb20gJ25neC10b2FzdHInO1xuaW1wb3J0IHsgQ29tbW9uU2VydmljZSB9IGZyb20gJy4uLy4uL2NvbW1vbic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1jcmVhdGUtbWV0cmljcycsXG4gIHRlbXBsYXRlVXJsOiAnLi9jcmVhdGUtbWV0cmljcy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NyZWF0ZS1tZXRyaWNzLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgQ3JlYXRlTWV0cmljc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIGxvYWRpbmdNb2RhbDogYm9vbGVhbjtcbiAgLy8gQElucHV0KCkgcXVlcnlCdWxkZXJEYXRhc2V0OiBhbnk7XG4gIHJlcUZpZWxkc0RhdGFTb3VyY2U6IGFueSA9IFtdO1xuICBpc3JlcUZpZWxkczogYm9vbGVhbiA9IGZhbHNlO1xuICBpc2NkclBhcmFtczogYm9vbGVhbiA9IGZhbHNlO1xuICBjZHJGaWVsZHNEYXRhU291cmNlOiBhbnkgPSBbXTtcbiAga3BpX2Z1bmN0aW9uOiBhbnkgPSBbXCJzdW1cIiwgXCJjb3VudFwiLCBcImF2Z1wiLCBcIm1heFwiLCBcIm1pblwiLCBcInN0ZGRldlwiLCBcImNvdW50X2Rpc3RpbmN0XCJdXG4gIGtwaV9vcGVyYXRvcjogYW55ID0gW1wiZXFcIiwgXCJndGVcIiwgXCJsdGVcIiwgXCJuZVwiLCBcImluXCIsIFwibm90SW5cIl1cbiAga3BpX2VucmljaG1lbnRfbmFtZTogYW55ID0gW107XG4gIHJlcVNob3J0RGF0YVNvdXJjZTogYW55ID0gW107XG4gIGZpbHRlck1hcGluZ0RhdGFzb3VyY2U6IGFueSA9IFtdO1xuICBxdWVyeV9kYXRhOiBhbnk7XG4gIGlzTW9kZWxWaXNpYmxlOiBib29sZWFuID0gZmFsc2U7XG4gIGlzU3FsQ29waWVkVGV4dDogYm9vbGVhbiA9IGZhbHNlO1xuICBxdWVyeUJ1bGRlckRhdGFzZXQ6IGFueTtcbiAgaXNSZWNvbkNvbHVtZTogYm9vbGVhbiA9IGZhbHNlO1xuICAvLyBAT3V0cHV0KCkgcHVibGljIGdldFF1ZXJ5QnVsYmRlckRhdGFTZXQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIHJlY29uQ29sdW1lRGF0YXNvdXJjZSA9IFtdO1xuXG4gIHNlbGVjdGVkRGF0YVNvdXJjZTogYW55O1xuICBpc1F1ZXJ5VHlwZVNlbGVjdDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIG1lc3VyZXNBbmREaW1lbnRpb25zQ29sdW1ucyA9IFtdO1xuICBtZXRyaWNPbmxpbmVPYmplY3QgPSB7XG4gICAgXCJtZXRyaWNOYW1lXCI6IFwibXNjX3ZvaWNlX2RheV9tZXRyaWNcIixcbiAgICBcIm1ldHJpY0lkXCI6IFwiXCIsXG4gICAgXCJtZXRyaWNEaXNwbGF5TmFtZVwiOiBcIk1ldHJpYyBWb2ljZSBEYXkgTWV0cmljXCIsXG4gICAgXCJtZXRyaWNUeXBlXCI6IFwib25saW5lXCIsXG4gICAgXCJzb3VyY2VcIjoge1xuICAgICAgXCJkYXRhc291cmNlXCI6IFwiaHVhd2VpLW1zY1wiLFxuICAgICAgXCJldmVudE5hbWVcIjogXCJodWF3ZWlfbXNjX2ZjdFwiLFxuICAgICAgXCJmaWx0ZXJzXCI6IFtcbiAgICAgICAgeyBcImZpZWxkTmFtZVwiOiBcImV2ZW50X3R5cGVfa2V5XCIsIFwib3BlcmF0aW9uXCI6IFwic3RyaW5nXCIsIFwidGhyZXNob2xkXCI6IFwiMSw1LDZcIiwgXCJjb21wYXJhdG9yXCI6IFwiaW5cIiB9XG4gICAgICBdLFxuICAgICAgXCJleGNsdXNpb25zXCI6IFtcbiAgICAgICAgeyBcImZpZWxkTmFtZVwiOiBcIlwiLCBcIm9wZXJhdGlvblwiOiBcIlwiLCBcInRocmVzaG9sZFwiOiBcIlwiLCBcImNvbXBhcmF0b3JcIjogXCJcIiB9XG4gICAgICBdLFxuICAgICAgXCJkaW1lbnNpb25zXCI6IFtcbiAgICAgICAgeyBcImZpZWxkTmFtZVwiOiBcInhkcl9kYXRlXCIsIFwiYWxpYXNOYW1lXCI6IFwicmVjb3JkX2RhdGVcIiwgXCJkYXRhVHlwZVwiOiBcInN0cmluZ1wiLCBcImZvcm1hdFwiOiBcInl5eXlNTWRkXCIgfSxcbiAgICAgICAgeyBcImZpZWxkTmFtZVwiOiBcImV2ZW50X3R5cGVfa2V5XCIsIFwiYWxpYXNOYW1lXCI6IFwiZXZlbnRfdHlwZVwiLCBcImRhdGFUeXBlXCI6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgeyBcImZpZWxkTmFtZVwiOiBcInNydl90eXBlX2tleVwiLCBcImFsaWFzTmFtZVwiOiBcInNydl90eXBlXCIsIFwiZGF0YVR5cGVcIjogXCJzdHJpbmdcIiB9LFxuICAgICAgICB7IFwiZmllbGROYW1lXCI6IFwib3RoZXJfbndfaW5kX2tleVwiLCBcImFsaWFzTmFtZVwiOiBcIm53X2NhbGxfdHlwZVwiLCBcImRhdGFUeXBlXCI6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgeyBcImZpZWxkTmFtZVwiOiBcInhkcl9kYXRlXCIsIFwiYWxpYXNOYW1lXCI6IFwiaG91clwiLCBcImRhdGFUeXBlXCI6IFwiaW50XCIsIFwibWV0aG9kXCI6IFwiZ2V0SG91clwiIH0sXG4gICAgICAgIHsgXCJmaWVsZE5hbWVcIjogXCJvdGhlcl9tc2lzZG5faXNvX2NvZGVcIiwgXCJhbGlhc05hbWVcIjogXCJjb3VudHJ5XCIsIFwiZGF0YVR5cGVcIjogXCJzdHJpbmdcIiB9LFxuICAgICAgICB7IFwiZmllbGROYW1lXCI6IFwib3RoZXJfb3BlclwiLCBcImFsaWFzTmFtZVwiOiBcIm9wZXJhdG9yXCIsIFwiZGF0YVR5cGVcIjogXCJzdHJpbmdcIiB9LFxuICAgICAgICB7IFwiZmllbGROYW1lXCI6IFwiZXZlbnRfZGlyZWN0aW9uX2tleVwiLCBcImFsaWFzTmFtZVwiOiBcImRpcmVjdGlvblwiLCBcImRhdGFUeXBlXCI6IFwic3RyaW5nXCIgfVxuICAgICAgXSxcbiAgICAgIFwibWVhc3VyZXNcIjogW1xuICAgICAgICB7IFwiZmllbGROYW1lXCI6IFwib3JpZ2luYWxfZHVyXCIsIFwiYWxpYXNOYW1lXCI6IFwibXNjX21vdVwiLCBcImRhdGFUeXBlXCI6IFwiZG91YmxlXCIsIFwidHlwZVwiOiBcInN1bVwiIH0sXG4gICAgICAgIHsgXCJhbGlhc05hbWVcIjogXCJtc2NfY291bnRcIiwgXCJ0eXBlXCI6IFwiY291bnRcIiB9XG4gICAgICBdXG4gICAgfSxcbiAgICBcInRhcmdldFwiOiB7XG4gICAgICBcImRhdGFiYXNlTmFtZVwiOiBcInJhZm1kYlwiLFxuICAgICAgXCJkYkNvbmZpZ1wiOiBcIm1vbmdvXCIsXG4gICAgICBcInRhYmxlTmFtZVwiOiBcIm1zY19kYWlseV9tZXRyaWNcIixcbiAgICAgIFwiZGltZW5zaW9uQ29sdW1uc1wiOiBbXCJyZWNvcmRfZGF0ZVwiLCBcImV2ZW50X3R5cGVcIiwgXCJzcnZfdHlwZVwiLCBcImRpcmVjdGlvblwiLCBcIm53X2NhbGxfdHlwZVwiLCBcImhvdXJcIixcbiAgICAgICAgXCJjb3VudHJ5XCIsIFwib3BlcmF0b3JcIlxuICAgICAgXSxcbiAgICAgIFwibWVhc3VyZUNvbHVtbnNcIjogW1xuICAgICAgICBcIm1zY19tb3VcIiwgXCJtc2NfY291bnRcIlxuICAgICAgXSxcbiAgICAgIFwiY3JlYXRlVGFibGVcIjogZmFsc2UsXG4gICAgICBcIndyaXRlRGlzcG9zaXRpb25cIjogXCJhcHBlbmRcIlxuICAgIH1cbiAgfVxuICBtZXRyaWNNYWluT2JqZWN0OiBhbnkgPSB7XG4gICAgXCJtZXRyaWNOYW1lXCI6IFwibXNjX3ZvaWNlX2RheV9tZXRyaWNcIixcbiAgICBcIm1ldHJpY0lkXCI6IFwiXCIsXG4gICAgXCJtZXRyaWNEaXNwbGF5TmFtZVwiOiBcIk1ldHJpYyBWb2ljZSBEYXkgTWV0cmljXCIsXG4gICAgXCJtZXRyaWNUeXBlXCI6IFwib25saW5lXCIsXG4gIH07XG5cbiAgbWV0cmljT2ZsaW5lT2JqZWN0ID0ge1xuICAgIFwibWV0cmljTmFtZVwiOiBcIlwiLFxuICAgIFwibWV0cmljSWRcIjogXCJcIixcbiAgICBcIm1ldHJpY0Rpc3BsYXlOYW1lXCI6IFwiXCIsXG4gICAgXCJtZXRyaWNUeXBlXCI6IFwib2ZmbGluZVwiLFxuICAgIFwic291cmNlXCI6IHtcbiAgICAgIFwiZGF0YWJhc2VOYW1lXCI6IFwicmFmbXNcIixcbiAgICAgIFwiZGJDb25maWdcIjogXCJiaWdxdWVyeVwiLFxuICAgICAgXCJxdWVyeVRlbXBsYXRlXCI6IFwiXCIsXG4gICAgICBcInF1ZXJ5VGVtcGxhdGVGaWxlXCI6IFwiXCJcbiAgICB9LFxuICAgIFwidGFyZ2V0XCI6IHtcbiAgICAgIFwiZGF0YWJhc2VOYW1lXCI6IFwicmFmbWRiXCIsXG4gICAgICBcImRiQ29uZmlnXCI6IFwibXlzcWxcIixcbiAgICAgIFwidGFibGVOYW1lXCI6IFwiXCIsXG4gICAgICBcImRpbWVuc2lvbkNvbHVtbnNcIjogW10sXG4gICAgICBcIm1lYXN1cmVDb2x1bW5zXCI6IFtdLFxuICAgICAgXCJwYXJ0aXRpb25Db2x1bW5cIjogXCJcIixcbiAgICAgIFwiY3JlYXRlVGFibGVcIjogdHJ1ZSxcbiAgICAgIFwid3JpdGVEaXNwb3NpdGlvblwiOiBcImFwcGVuZFwiXG4gICAgfSxcbiAgICBcImV4ZWN1dGlvblwiOiB7XG4gICAgICBcInR5cGVcIjogXCJzY2hlZHVsZWRcIixcbiAgICAgIFwiam9iR3JvdXBJZFwiOiBcIlwiLFxuICAgICAgXCJhcmd1bWVudHNcIjogW1xuICAgICAgICB7XG4gICAgICAgICAgXCJhcmd1bWVudE5hbWVcIjogXCJzdGFydF9kYXRlXCIsXG4gICAgICAgICAgXCJsYWJlbE5hbWVcIjogXCJFdmVudCBTdGFydCBEYXRlXCIsXG4gICAgICAgICAgXCJkYXRhdHlwZVwiOiBcInRpbWVzdGFtcFwiLFxuICAgICAgICAgIFwicnVudGltZVZhbHVlXCI6IFwic3RhdGljXCIsXG4gICAgICAgICAgXCJmdW5jdGlvblwiOiBcIkQxX1NUQVJUXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiYXJndW1lbnROYW1lXCI6IFwiZW5kX2RhdGVcIixcbiAgICAgICAgICBcImxhYmVsTmFtZVwiOiBcIkV2ZW50IEVuZCBEYXRlXCIsXG4gICAgICAgICAgXCJydW50aW1lVmFsdWVcIjogXCJzdGF0aWNcIixcbiAgICAgICAgICBcImRhdGF0eXBlXCI6IFwidGltZXN0YW1wXCIsXG4gICAgICAgICAgXCJmdW5jdGlvblwiOiBcIkQxX0VORFwiXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9XG4gIH1cblxuICBtZXRyaWN0eXBlOiBhbnk7XG5cbiAgY29uc3RydWN0b3IocHVibGljIGNvbW1vblNlcnZpY2U6IENvbW1vblNlcnZpY2UsIHByaXZhdGUgdG9hc3RyOiBUb2FzdHJTZXJ2aWNlKSB7IH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcblxuICB9XG5cblxuICBnZXRNZXRyaWNUeXBlKGUpIHtcbiAgICBpZiAoZS5ldmVudCkge1xuICAgICAgdGhpcy5tZXRyaWN0eXBlID0gZS52YWx1ZTtcbiAgICB9XG4gIH1cblxuICBzdWJtaXR0T25saW5lTWV0cmljcyhkYXRhKSB7XG4gICAgZGF0YVtcIm1ldHJpY05hbWVcIl0gPSB0aGlzLm1ldHJpY01haW5PYmplY3RbJ21ldHJpY05hbWUnXTtcbiAgICBkYXRhW1wibWV0cmljSWRcIl0gPSB0aGlzLm1ldHJpY01haW5PYmplY3RbJ21ldHJpY0lkJ107XG4gICAgZGF0YVtcIm1ldHJpY0Rpc3BsYXlOYW1lXCJdID0gdGhpcy5tZXRyaWNNYWluT2JqZWN0WydtZXRyaWNEaXNwbGF5TmFtZSddO1xuICAgIGRhdGFbXCJtZXRyaWNUeXBlXCJdID0gdGhpcy5tZXRyaWNNYWluT2JqZWN0Lm1ldHJpY1R5cGU7XG4gICAgY29uc29sZS5sb2coZGF0YSk7XG4gIH1cbiAgc3VibWl0dE9mZmxpbmVNZXRyaWNzKGRhdGEpIHtcbiAgICBkYXRhW1wibWV0cmljTmFtZVwiXSA9IHRoaXMubWV0cmljTWFpbk9iamVjdFsnbWV0cmljTmFtZSddO1xuICAgIGRhdGFbXCJtZXRyaWNJZFwiXSA9IHRoaXMubWV0cmljTWFpbk9iamVjdFsnbWV0cmljSWQnXTtcbiAgICBkYXRhW1wibWV0cmljRGlzcGxheU5hbWVcIl0gPSB0aGlzLm1ldHJpY01haW5PYmplY3RbJ21ldHJpY0Rpc3BsYXlOYW1lJ107XG4gICAgZGF0YVtcIm1ldHJpY1R5cGVcIl0gPSB0aGlzLm1ldHJpY01haW5PYmplY3QubWV0cmljVHlwZTtcbiAgICBjb25zb2xlLmxvZyhkYXRhKTtcbiAgfVxuXG5cbn1cbiIsIjxhcHAtbG9hZGluZyAqbmdJZj1cImxvYWRpbmdNb2RhbFwiPjwvYXBwLWxvYWRpbmc+XG48ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBmbGV4LWF1dG8gdy1mdWxsXCI+XG4gICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2xcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1iZXR3ZWVuIGJvcmRlci1iICBkYXJrOmJnLXRyYW5zcGFyZW50XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCAgZmxleC1jb2wgbWwtMVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4ICBpdGVtcy1jZW50ZXIgZmxvYXQtc3RhcnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIG92ZXJmbG93LWhpZGRlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiaWNvbi1zaXplLTJcIiBbc3ZnSWNvbl09XCInaGVyb2ljb25zX3NvbGlkOnRlbXBsYXRlJ1wiPjwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8aDJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC0yeGwgbWQ6dGV4dC0yeGwgcHktMyBmb250LWV4dHJhYm9sZCBpdGVtcy1jZW50ZXIgbWwtMiB0cmFja2luZy10aWdodCBsZWFkaW5nLTUgdHJ1bmNhdGUgY2FwaXRhbGl6ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlIE1ldHJpY3NcbiAgICAgICAgICAgICAgICAgICAgPC9oMj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiXCI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1iZXR3ZWVuIGl0ZW1zLWNlbnRlciBib3JkZXItbC0yIHAtMCBtLTAgcmVsYXRpdmVcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXgtNFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1sZyBmb250LWJvbGQgbXgtNCBjb3JzdXItcG9pbnRlclwiIChjbGljayk9XCJvcGVuRGF0ZUZpbHRlcigpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7e3NlbGVjdGVkRGF0ZUFuZFRpbWV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jYWxlbmRhclwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIGJvcmRlci1yXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS0yXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgbWItMlwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXgtMiB3LTEvM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPk1ldHJpYyBOYW1lPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJtZXRyaWNNYWluT2JqZWN0Lm1ldHJpY05hbWVcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm14LTIgdy0xLzNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj5NZXRyaWMgRGlzcGxheSBOYW1lPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJtZXRyaWNNYWluT2JqZWN0Lm1ldHJpY0Rpc3BsYXlOYW1lXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJteC0yIHctMS8zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+TWV0cmljIElkPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJtZXRyaWNNYWluT2JqZWN0Lm1ldHJpY0lkXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJteC0yIHctMS8zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+TWV0cmljIFR5cGU8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IFtpdGVtc109XCJbJ29ubGluZScsJ29mbGluZSddXCIgWyhuZ01vZGVsKV09XCJtZXRyaWNNYWluT2JqZWN0Lm1ldHJpY1R5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvblZhbHVlQ2hhbmdlZCk9XCJnZXRNZXRyaWNUeXBlKCRldmVudClcIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtZXRyaWNNYWluT2JqZWN0Lm1ldHJpY1R5cGUgPT0gJ29ubGluZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgPGFwcC1vbmxpbmUtbWV0cmljcyBbb25saW5lTWV0cmljRGF0YV09XCJtZXRyaWNPbmxpbmVPYmplY3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGdldE1ldFJpY09ubGluZURhdGFTZXQpPVwic3VibWl0dE9ubGluZU1ldHJpY3MoJGV2ZW50KVwiPjwvYXBwLW9ubGluZS1tZXRyaWNzPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtZXRyaWNNYWluT2JqZWN0Lm1ldHJpY1R5cGUgPT0gJ29mbGluZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgPGFwcC1vZmxpbmUtbWV0cmljcyBbb25mbGluZU1ldHJpY0RhdGFdPVwibWV0cmljT2ZsaW5lT2JqZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChnZXRNZXRSaWNPZmxpbmVEYXRhU2V0KT1cInN1Ym1pdHRPZmZsaW5lTWV0cmljcygkZXZlbnQpXCI+PC9hcHAtb2ZsaW5lLW1ldHJpY3M+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cblxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+Il19
|
|
@@ -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\"> 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<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 <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\"> 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<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 <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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2ZsaW5lLW1ldHJpY3MuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2FtbWEtYXBwLWNvbnRyb2xsZXIvc3JjL2xpYi9hcHBsaWNhdGlvbi1jb250cm9sbGVyL2FwcGxpY2F0aW9uLW1ldHJpYy1jb25maWcvb2ZsaW5lLW1ldHJpY3Mvb2ZsaW5lLW1ldHJpY3MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2FtbWEtYXBwLWNvbnRyb2xsZXIvc3JjL2xpYi9hcHBsaWNhdGlvbi1jb250cm9sbGVyL2FwcGxpY2F0aW9uLW1ldHJpYy1jb25maWcvb2ZsaW5lLW1ldHJpY3Mvb2ZsaW5lLW1ldHJpY3MuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7OztBQVUvRSxNQUFNLE9BQU8sc0JBQXNCO0lBc0NqQyxZQUFtQixhQUE0QixFQUFVLE1BQXFCLEVBQVUsT0FBa0M7UUFBdkcsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFBVSxXQUFNLEdBQU4sTUFBTSxDQUFlO1FBQVUsWUFBTyxHQUFQLE9BQU8sQ0FBMkI7UUFuQzFILHdCQUFtQixHQUFRLEVBQUUsQ0FBQztRQUM5QixnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUM3QixnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUM3Qix3QkFBbUIsR0FBUSxFQUFFLENBQUM7UUFDOUIsaUJBQVksR0FBUSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixDQUFDLENBQUE7UUFDckYsaUJBQVksR0FBUSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDN0Qsd0JBQW1CLEdBQVEsRUFBRSxDQUFDO1FBQzlCLHVCQUFrQixHQUFRLEVBQUUsQ0FBQztRQUM3QiwyQkFBc0IsR0FBUSxFQUFFLENBQUM7UUFFakMsbUJBQWMsR0FBWSxLQUFLLENBQUM7UUFDaEMsb0JBQWUsR0FBWSxLQUFLLENBQUM7UUFFakMsa0JBQWEsR0FBWSxLQUFLLENBQUM7UUFDZCwyQkFBc0IsR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNoRiwwQkFBcUIsR0FBRyxDQUFDLGVBQWUsRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFFalQsMEJBQXFCLEdBQUcsRUFBRSxDQUFDO1FBRzNCLHNCQUFpQixHQUFZLEtBQUssQ0FBQztRQUVuQyxnQ0FBMkIsR0FBRyxFQUFFLENBQUM7UUFDakMscUJBQWdCLEdBQVEsRUFBRSxDQUFDO0lBWW1HLENBQUM7SUFQL0gsSUFDSSxpQkFBaUIsQ0FBQyxLQUFLO1FBQ3pCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7SUFDaEMsQ0FBQztJQU1ELFFBQVE7UUFDTixJQUFJLENBQUMsT0FBTyxDQUFDLDZCQUE2QixFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzVELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUM7UUFDbEMsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksR0FBRyxHQUFHO1lBQ1IsY0FBYyxFQUFFLEVBQUU7WUFDbEIsV0FBVyxFQUFFLEVBQUU7WUFDZixjQUFjLEVBQUUsRUFBRTtZQUNsQixVQUFVLEVBQUUsRUFBRTtZQUNkLFVBQVUsRUFBRSxFQUFFO1NBQ2YsQ0FBQTtRQUNELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBR0QsZUFBZSxDQUFDLENBQUM7UUFDZixJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQ3hELENBQUM7SUFJRCxtQkFBbUI7UUFHakIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtJQUN6RCxDQUFDO0lBSUQsYUFBYSxDQUFDLENBQUM7UUFDYixJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUU7WUFDWCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUNsQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1NBQy9CO0lBRUgsQ0FBQzs7bUhBOUVVLHNCQUFzQjt1R0FBdEIsc0JBQXNCLDZLQ1ZuQyxvOExBc0hNOzJGRDVHTyxzQkFBc0I7a0JBTGxDLFNBQVM7K0JBQ0Usb0JBQW9CO3dLQXFCYixzQkFBc0I7c0JBQXRDLE1BQU07Z0JBZUgsaUJBQWlCO3NCQURwQixLQUFLO3VCQUFDLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRvYXN0clNlcnZpY2UgfSBmcm9tICduZ3gtdG9hc3RyJztcbmltcG9ydCB7IEFwcGxpY2F0aW9uQ29udGVudFNlcnZpY2UgfSBmcm9tICcuLi8uLi9hcHBsaWNhdGlvbi1jb250ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29tbW9uU2VydmljZSB9IGZyb20gJy4uLy4uL2NvbW1vbic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1vZmxpbmUtbWV0cmljcycsXG4gIHRlbXBsYXRlVXJsOiAnLi9vZmxpbmUtbWV0cmljcy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL29mbGluZS1tZXRyaWNzLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgT2ZsaW5lTWV0cmljc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIGxvYWRpbmdNb2RhbDogYm9vbGVhbjtcbiAgLy8gQElucHV0KCkgcXVlcnlCdWxkZXJEYXRhc2V0OiBhbnk7XG4gIHJlcUZpZWxkc0RhdGFTb3VyY2U6IGFueSA9IFtdO1xuICBpc3JlcUZpZWxkczogYm9vbGVhbiA9IGZhbHNlO1xuICBpc2NkclBhcmFtczogYm9vbGVhbiA9IGZhbHNlO1xuICBjZHJGaWVsZHNEYXRhU291cmNlOiBhbnkgPSBbXTtcbiAga3BpX2Z1bmN0aW9uOiBhbnkgPSBbXCJzdW1cIiwgXCJjb3VudFwiLCBcImF2Z1wiLCBcIm1heFwiLCBcIm1pblwiLCBcInN0ZGRldlwiLCBcImNvdW50X2Rpc3RpbmN0XCJdXG4gIGtwaV9vcGVyYXRvcjogYW55ID0gW1wiZXFcIiwgXCJndGVcIiwgXCJsdGVcIiwgXCJuZVwiLCBcImluXCIsIFwibm90SW5cIl1cbiAga3BpX2VucmljaG1lbnRfbmFtZTogYW55ID0gW107XG4gIHJlcVNob3J0RGF0YVNvdXJjZTogYW55ID0gW107XG4gIGZpbHRlck1hcGluZ0RhdGFzb3VyY2U6IGFueSA9IFtdO1xuICBxdWVyeV9kYXRhOiBhbnk7XG4gIGlzTW9kZWxWaXNpYmxlOiBib29sZWFuID0gZmFsc2U7XG4gIGlzU3FsQ29waWVkVGV4dDogYm9vbGVhbiA9IGZhbHNlO1xuICBxdWVyeUJ1bGRlckRhdGFzZXQ6IGFueTtcbiAgaXNSZWNvbkNvbHVtZTogYm9vbGVhbiA9IGZhbHNlO1xuICBAT3V0cHV0KCkgcHVibGljIGdldE1ldFJpY09mbGluZURhdGFTZXQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBmdW5jdGlvbk5hbWVDb250YWluZXIgPSBbXCJMQVNUREFZX1NUQVJUXCIsIFwiRF8xX1NUQVJUXCIsIFwiTEFTVERBWV9FTkRcIiwgXCJEXzFfRU5EXCIsIFwiTEFTVERBWTJfU1RBUlRcIiwgXCJEXzJfU1RBUlRcIiwgXCJMQVNUREFZMl9FTkRcIiwgXCJEXzJfRU5EXCIsIFwiRF83X1NUQVJUXCIsIFwiRF83X0VORFwiLCBcIlRPREFZX1NUQVJUXCIsIFwiVE9EQVlfRU5EXCIsIFwiV0VFS19TVEFSVFwiLCBcIldFRUtfRU5EXCIsIFwiTU9OVEhfU1RBUlRcIiwgXCJNT05USF9FTkRcIiwgXCJIT1VSX1NUQVJUXCIsIFwiSE9VUl9FTkRcIiwgXCJMQVNUSE9VUl9TVEFSVFwiLCBcIkxBU1RIT1VSX0VORFwiXTtcblxuICByZWNvbkNvbHVtZURhdGFzb3VyY2UgPSBbXTtcblxuICBzZWxlY3RlZERhdGFTb3VyY2U6IGFueTtcbiAgaXNRdWVyeVR5cGVTZWxlY3Q6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBtZXN1cmVzQW5kRGltZW50aW9uc0NvbHVtbnMgPSBbXTtcbiAgbWV0cmljTWFpbk9iamVjdDogYW55ID0ge307XG5cbiAgbWV0cmljdHlwZTogYW55O1xuXG5cbiAgQElucHV0KCdvbmZsaW5lTWV0cmljRGF0YScpXG4gIHNldCBvbmZsaW5lTWV0cmljRGF0YSh2YWx1ZSkge1xuICAgIHRoaXMubWV0cmljTWFpbk9iamVjdCA9IHZhbHVlO1xuICB9XG5cblxuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBjb21tb25TZXJ2aWNlOiBDb21tb25TZXJ2aWNlLCBwcml2YXRlIHRvYXN0cjogVG9hc3RyU2VydmljZSwgcHJpdmF0ZSBzZXJ2aWNlOiBBcHBsaWNhdGlvbkNvbnRlbnRTZXJ2aWNlKSB7IH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNlcnZpY2UubGlzdENvbHVtbkVucmljaG1lbnRGdW5jdGlvbnMoKS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICB0aGlzLmtwaV9lbnJpY2htZW50X25hbWUgPSBkYXRhO1xuICAgIH0pXG4gIH1cblxuICBhZGRBcmd1bWVudHMoKSB7XG4gICAgbGV0IG9iaiA9IHtcbiAgICAgIFwiYXJndW1lbnROYW1lXCI6IFwiXCIsXG4gICAgICBcImxhYmVsTmFtZVwiOiBcIlwiLFxuICAgICAgXCJydW50aW1lVmFsdWVcIjogXCJcIixcbiAgICAgIFwiZGF0YVR5cGVcIjogXCJcIixcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJcIlxuICAgIH1cbiAgICB0aGlzLm1ldHJpY01haW5PYmplY3QuZXhlY3V0aW9uLmFyZ3VtZW50cy5wdXNoKG9iaik7XG4gIH1cblxuXG4gIGRlbGV0ZUFyZ3VtZW50cyhpKSB7XG4gICAgdGhpcy5tZXRyaWNNYWluT2JqZWN0LmV4ZWN1dGlvbi5hcmd1bWVudHMuc3BsaWNlKGksIDEpXG4gIH1cblxuXG5cbiAgY3JlYXRlT2ZsaW5lTWV0cmljcygpIHtcblxuXG4gICAgdGhpcy5nZXRNZXRSaWNPZmxpbmVEYXRhU2V0LmVtaXQodGhpcy5tZXRyaWNNYWluT2JqZWN0KVxuICB9XG5cblxuXG4gIGdldERhdGFDb25maWcoZSkge1xuICAgIGlmIChlLmV2ZW50KSB7XG4gICAgICB0aGlzLnNlbGVjdGVkRGF0YVNvdXJjZSA9IGUudmFsdWU7XG4gICAgICB0aGlzLmlzUXVlcnlUeXBlU2VsZWN0ID0gdHJ1ZTtcbiAgICB9XG5cbiAgfVxuXG5cbn1cbiIsIjxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGZsZXgtYXV0byBtaW4tdy0wIG15LTNcIj5cbiAgICA8ZGl2IGNsYXNzPVwidGV4dC1sZyBweS0yIGZvbnQtZXh0cmFib2xkIGJvcmRlci1iIGJnLWdyYXktNzAwIHRleHQtd2hpdGUgcHgtMlwiPiBUYXJnZXRcbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwicHQtMiBib3JkZXIteCBib3JkZXItYiBcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC13cmFwIHAtMlwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTIgbWItMiB3LTEvMlwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gRGF0YWJhc2UgTmFtZTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cIm1ldHJpY01haW5PYmplY3QudGFyZ2V0LmRhdGFiYXNlTmFtZVwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0yIG1iLTIgdy0xLzJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IERCIENvbmZpZyA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbaXRlbXNdPVwiWydtb25nbycsJ2ltcGFsYScsJ3Bvc3RncmVzJywnbXlzcWwnLCdiaWdxdWVyeSddXCJcbiAgICAgICAgICAgICAgICAgICAgKG9uVmFsdWVDaGFuZ2VkKT1cImdldERhdGFDb25maWcoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwibWV0cmljTWFpbk9iamVjdC50YXJnZXQuZGJDb25maWdcIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0yIG1iLTIgdy0xLzJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IFRhYmxlIE5hbWU8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJtZXRyaWNNYWluT2JqZWN0LnRhcmdldC50YWJsZU5hbWVcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMiBtYi0yIHctMS8yXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBEaW1lbnNpb24gQ29sdW1uczwvZGl2PlxuICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cIm1ldHJpY01haW5PYmplY3QudGFyZ2V0LmRpbWVuc2lvbkNvbHVtbnNcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMiBtYi0yIHctMS8zXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBNZWFzdXJlIENvbHVtbnM8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJtZXRyaWNNYWluT2JqZWN0LnRhcmdldC5tZWFzdXJlQ29sdW1uc1wiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0yIG1iLTIgdy0xLzNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IFBhcnRpdGlvbiBDb2x1bW48L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJtZXRyaWNNYWluT2JqZWN0LnRhcmdldC5wYXJ0aXRpb25Db2x1bW5cIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMiBtYi0yIHctMS8zXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBXcml0ZSBEaXNwb3NpdGlvbjwvZGl2PlxuICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cIm1ldHJpY01haW5PYmplY3QudGFyZ2V0LndyaXRlRGlzcG9zaXRpb25cIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMiBtYi0yIHctMS8zXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMiBtdC04XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPGR4LWNoZWNrLWJveCB0ZXh0PVwiQ3JlYXRlIFRhYmxlXCIgWyhuZ01vZGVsKV09XCJtZXRyaWNNYWluT2JqZWN0LnRhcmdldC5jcmVhdGVUYWJsZVwiPjwvZHgtY2hlY2stYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG48ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBmbGV4LWF1dG8gbWluLXctMCBteS0zXCI+XG4gICAgPGRpdiBjbGFzcz1cInRleHQtbGcgcHktMiBmb250LWV4dHJhYm9sZCBib3JkZXItYiBiZy1ncmF5LTcwMCB0ZXh0LXdoaXRlIHB4LTJcIj4gU291cmNlXG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInB0LTIgYm9yZGVyLXggYm9yZGVyLWIgXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcCBwLTJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0yIG1iLTIgdy0xLzJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IERhdGFiYXNlIE5hbWU8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJtZXRyaWNNYWluT2JqZWN0LnNvdXJjZS5kYXRhYmFzZU5hbWVcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMiBtYi0yIHctMS8yXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBEYiBDb25maWc8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbaXRlbXNdPVwiWydtb25nbycsJ2ltcGFsYScsJ3Bvc3RncmVzJywnbXlzcWwnLCdiaWdxdWVyeSddXCJcbiAgICAgICAgICAgICAgICAgICAgKG9uVmFsdWVDaGFuZ2VkKT1cImdldERhdGFDb25maWcoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwibWV0cmljTWFpbk9iamVjdC50YXJnZXQuZGJDb25maWdcIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0yIG1iLTIgdy0xLzJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IFF1ZXJ5IFRlbXBsYXRlPC9kaXY+XG4gICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwibWV0cmljTWFpbk9iamVjdC5zb3VyY2UucXVlcnlUZW1wbGF0ZVwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0yIG1iLTIgdy0xLzJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IFF1ZXJ5IFRlbXBsYXRlIEZpbGU8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJtZXRyaWNNYWluT2JqZWN0LnNvdXJjZS5xdWVyeVRlbXBsYXRlRmlsZVwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGZsZXgtYXV0byBtaW4tdy0wIG15LTJcIj5cbiAgICA8ZGl2IGNsYXNzPVwidGV4dC1sZyBweS0yIGZvbnQtZXh0cmFib2xkIGJvcmRlci1iIGJnLWdyYXktNzAwIHRleHQtd2hpdGUgcHgtMlwiPkV4ZWN1dGlvblxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJwdC0yIGJvcmRlci14IGJvcmRlci1iIFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibXktMiBmbGV4IGp1c3RpZnktYmV0d2VlblwiXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBtZXRyaWNNYWluT2JqZWN0LmV4ZWN1dGlvbi5hcmd1bWVudHM7IGxldCBpID0gaW5kZXg7XCI+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTIgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBBcmd1bWVudCBOYW1lPC9kaXY+XG4gICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiaXRlbS5hcmd1bWVudE5hbWVcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0yIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gTGFiZWwgTmFtZTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cIml0ZW0ubGFiZWxOYW1lXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0yIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gRGF0YXR5cGU8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbc2VhcmNoRW5hYmxlZF09XCJ0cnVlXCIgW2l0ZW1zXT1cIlsnZGF0ZScsJ3N0cmluZycsJ3RpbWVzdGFtcCcsJ2ludCcsICdkb3VibGUnLCAnYm9vbGVhbiddXCJcbiAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJpdGVtLmRhdGFUeXBlXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0yIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gRnVuY3Rpb248L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbc2VhcmNoRW5hYmxlZF09XCJ0cnVlXCIgW2l0ZW1zXT1cImZ1bmN0aW9uTmFtZUNvbnRhaW5lclwiXG4gICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaXRlbS5mdW5jdGlvblwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMiB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IHJ1bnRpbWVWYWx1ZTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IFtzZWFyY2hFbmFibGVkXT1cInRydWVcIiBbaXRlbXNdPVwiWydzdGF0aWMnLCdkeW5hbWljJ11cIlxuICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIml0ZW0ucnVudGltZVZhbHVlXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG10LTcgdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9kYW5nZXJfc219fSBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJkZWxldGVBcmd1bWVudHMoaSlcIj48aVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYSBmYS10cmFzaC1vXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGp1c3RpZnktZW5kIG15LTJcIj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX3ByaW1hcnlfc219fSBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJhZGRBcmd1bWVudHMoKVwiPkFkZFxuICAgICAgICAgICAgICAgIENvbHVtbnM8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj5cblxuPGRpdiBjbGFzcz1cImZsZXggdy1mdWxsIGp1c3RpZnktZW5kIG10LTUgYm9yZGVyLXRcIj5cbiAgICA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9zdWNjZXNzX21kfX0gY3Vyc29yLXBvaW50ZXIgbXgtMSBteS0yXCIgKGNsaWNrKT1cImNyZWF0ZU9mbGluZU1ldHJpY3MoKVwiPlxuICAgICAgICBTYXZlIE9mbGluZSBNZXRyaWNzXG4gICAgPC9idXR0b24+XG48L2Rpdj4iXX0=
|