ezlibrary_v2 0.0.1
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/ezlibrary_v2.mjs +5 -0
- package/esm2020/lib/admin-service/admin-service.service.mjs +36 -0
- package/esm2020/lib/analysis-search/analysis-search.component.mjs +1083 -0
- package/esm2020/lib/assort-service/assort-service.service.mjs +31 -0
- package/esm2020/lib/attribute-definition/attribute-definition.component.mjs +231 -0
- package/esm2020/lib/auth/auth.guard.mjs +40 -0
- package/esm2020/lib/bi-service/bi.service.mjs +58 -0
- package/esm2020/lib/call-info/callinfo.component.mjs +126 -0
- package/esm2020/lib/comman-service/comman-service.service.mjs +679 -0
- package/esm2020/lib/comman-service/share-data-service.service.mjs +23 -0
- package/esm2020/lib/contact-search/contact-search.component.mjs +679 -0
- package/esm2020/lib/contact-service/contact-service.service.mjs +47 -0
- package/esm2020/lib/ezheader/header.component.mjs +383 -0
- package/esm2020/lib/ezlib.module.mjs +220 -0
- package/esm2020/lib/file-upload/fileupload.component.mjs +920 -0
- package/esm2020/lib/file-upload-log/file-upload-log.component.mjs +175 -0
- package/esm2020/lib/fileupload-module/fileupload-dashboard/fileupload-dashboard.component.mjs +14 -0
- package/esm2020/lib/fileupload-module/fileupload-routing.module.mjs +28 -0
- package/esm2020/lib/footer/footer.component.mjs +18 -0
- package/esm2020/lib/globle/common-pdf.service.mjs +28 -0
- package/esm2020/lib/globle/globle-env.service.mjs +45 -0
- package/esm2020/lib/globle/memo-report.service.mjs +2800 -0
- package/esm2020/lib/globle/pdf-service.service.mjs +18848 -0
- package/esm2020/lib/globle/shared-services.service.mjs +27 -0
- package/esm2020/lib/globle/upload-service.service.mjs +69 -0
- package/esm2020/lib/header/header.component.mjs +179 -0
- package/esm2020/lib/invalid/invalid.component.mjs +71 -0
- package/esm2020/lib/logout/logout.component.mjs +107 -0
- package/esm2020/lib/menu-right/menu-right.component.mjs +252 -0
- package/esm2020/lib/pipes/number-with-commas.pipe.mjs +24 -0
- package/esm2020/lib/pipes/order-by-pipe.pipe.mjs +17 -0
- package/esm2020/lib/pipes/selectedCount.mjs +19 -0
- package/esm2020/lib/pipes/sum.pipe.mjs +16 -0
- package/esm2020/lib/pkt-data/pkt-data.component.mjs +1107 -0
- package/esm2020/lib/pricing-service/pricing.service.mjs +58 -0
- package/esm2020/lib/qa-analysis/qa-analysis.component.mjs +1035 -0
- package/esm2020/lib/report-format/report-format.component.mjs +400 -0
- package/esm2020/lib/sessionend/session-end.guard.mjs +28 -0
- package/esm2020/lib/stock-service/lazyload.service.mjs +21 -0
- package/esm2020/lib/stock-service/stock-service.service.mjs +62 -0
- package/esm2020/lib/system-module/subform/subform.component.mjs +2481 -0
- package/esm2020/lib/system-module/system/system.component.mjs +959 -0
- package/esm2020/lib/system-module/system-service/system-service.service.mjs +85 -0
- package/esm2020/lib/system-module/system-service/upload-file.service.mjs +86 -0
- package/esm2020/lib/utility/app-no-dbl-click.directive.mjs +23 -0
- package/esm2020/lib/utility/constants.mjs +5 -0
- package/esm2020/lib/utility/contact-table-search.pipe.mjs +25 -0
- package/esm2020/lib/utility/formate-num-field.pipe.mjs +19 -0
- package/esm2020/lib/utility/search-pipe.pipe.mjs +26 -0
- package/esm2020/lib/utility/selective-preloading-strategy.mjs +23 -0
- package/esm2020/lib/utility/table-search.pipe.mjs +25 -0
- package/esm2020/lib/utility/tranform.directive.mjs +27 -0
- package/esm2020/lib/websearch-history/websearch-history.component.mjs +273 -0
- package/esm2020/public_api.mjs +57 -0
- package/ezlibrary_v2.d.ts +5 -0
- package/fesm2015/ezlibrary_v2.mjs +33543 -0
- package/fesm2015/ezlibrary_v2.mjs.map +1 -0
- package/fesm2020/ezlibrary_v2.mjs +33533 -0
- package/fesm2020/ezlibrary_v2.mjs.map +1 -0
- package/lib/admin-service/admin-service.service.d.ts +13 -0
- package/lib/analysis-search/analysis-search.component.d.ts +122 -0
- package/lib/assort-service/assort-service.service.d.ts +12 -0
- package/lib/attribute-definition/attribute-definition.component.d.ts +47 -0
- package/lib/auth/auth.guard.d.ts +16 -0
- package/lib/bi-service/bi.service.d.ts +20 -0
- package/lib/call-info/callinfo.component.d.ts +30 -0
- package/lib/comman-service/comman-service.service.d.ts +111 -0
- package/lib/comman-service/share-data-service.service.d.ts +10 -0
- package/lib/contact-search/contact-search.component.d.ts +115 -0
- package/lib/contact-service/contact-service.service.d.ts +15 -0
- package/lib/ezheader/header.component.d.ts +61 -0
- package/lib/ezlib.module.d.ts +47 -0
- package/lib/file-upload/fileupload.component.d.ts +131 -0
- package/lib/file-upload-log/file-upload-log.component.d.ts +53 -0
- package/lib/fileupload-module/fileupload-dashboard/fileupload-dashboard.component.d.ts +8 -0
- package/lib/fileupload-module/fileupload-routing.module.d.ts +7 -0
- package/lib/footer/footer.component.d.ts +9 -0
- package/lib/globle/common-pdf.service.d.ts +9 -0
- package/lib/globle/globle-env.service.d.ts +16 -0
- package/lib/globle/memo-report.service.d.ts +107 -0
- package/lib/globle/pdf-service.service.d.ts +459 -0
- package/lib/globle/shared-services.service.d.ts +12 -0
- package/lib/globle/upload-service.service.d.ts +20 -0
- package/lib/header/header.component.d.ts +45 -0
- package/lib/invalid/invalid.component.d.ts +12 -0
- package/lib/logout/logout.component.d.ts +21 -0
- package/lib/menu-right/menu-right.component.d.ts +47 -0
- package/lib/pipes/number-with-commas.pipe.d.ts +7 -0
- package/lib/pipes/order-by-pipe.pipe.d.ts +7 -0
- package/lib/pipes/selectedCount.d.ts +7 -0
- package/lib/pipes/sum.pipe.d.ts +7 -0
- package/lib/pkt-data/pkt-data.component.d.ts +189 -0
- package/lib/pricing-service/pricing.service.d.ts +20 -0
- package/lib/qa-analysis/qa-analysis.component.d.ts +99 -0
- package/lib/report-format/report-format.component.d.ts +74 -0
- package/lib/sessionend/session-end.guard.d.ts +10 -0
- package/lib/stock-service/lazyload.service.d.ts +7 -0
- package/lib/stock-service/stock-service.service.d.ts +19 -0
- package/lib/system-module/subform/subform.component.d.ts +227 -0
- package/lib/system-module/system/system.component.d.ts +113 -0
- package/lib/system-module/system-service/system-service.service.d.ts +23 -0
- package/lib/system-module/system-service/upload-file.service.d.ts +12 -0
- package/lib/utility/app-no-dbl-click.directive.d.ts +7 -0
- package/lib/utility/constants.d.ts +4 -0
- package/lib/utility/contact-table-search.pipe.d.ts +7 -0
- package/lib/utility/formate-num-field.pipe.d.ts +7 -0
- package/lib/utility/search-pipe.pipe.d.ts +7 -0
- package/lib/utility/selective-preloading-strategy.d.ts +9 -0
- package/lib/utility/table-search.pipe.d.ts +7 -0
- package/lib/utility/tranform.directive.d.ts +10 -0
- package/lib/websearch-history/websearch-history.component.d.ts +62 -0
- package/package.json +48 -0
- package/public_api.d.ts +52 -0
|
@@ -0,0 +1,2481 @@
|
|
|
1
|
+
import { Component, ViewChild, ElementRef } from "@angular/core";
|
|
2
|
+
import { HttpHeaders } from "@angular/common/http";
|
|
3
|
+
import { Router, ActivatedRoute } from "@angular/router";
|
|
4
|
+
import { ToastrService } from "ngx-toastr";
|
|
5
|
+
import { Cookie } from "ng2-cookies/ng2-cookies";
|
|
6
|
+
import { NgxSpinnerService } from "ngx-spinner";
|
|
7
|
+
import { SystemServiceService } from "../system-service/system-service.service";
|
|
8
|
+
import { UploadFileService } from "../system-service/upload-file.service";
|
|
9
|
+
import { ContactServiceService } from "../../contact-service/contact-service.service";
|
|
10
|
+
// import * as AWS from 'aws-sdk/global';
|
|
11
|
+
import * as S3 from "aws-sdk/clients/s3";
|
|
12
|
+
// import * as awsservice from "aws-sdk/lib/service";
|
|
13
|
+
// import * as CognitoIdentity from "aws-sdk/clients/cognitoidentity";
|
|
14
|
+
// import { promise } from "protractor";
|
|
15
|
+
import { SortableComponent } from "ngx-bootstrap/sortable";
|
|
16
|
+
// import { ChangeDetectionStrategy } from "@angular/compiler/src/core";
|
|
17
|
+
// import { async } from "@angular/core/testing";
|
|
18
|
+
// import { debounce } from "rxjs-compat/operator/debounce";
|
|
19
|
+
import { CommanServiceService } from "../../comman-service/comman-service.service";
|
|
20
|
+
import * as i0 from "@angular/core";
|
|
21
|
+
import * as i1 from "@angular/router";
|
|
22
|
+
import * as i2 from "ngx-toastr";
|
|
23
|
+
import * as i3 from "../system-service/system-service.service";
|
|
24
|
+
import * as i4 from "../system-service/upload-file.service";
|
|
25
|
+
import * as i5 from "ngx-spinner";
|
|
26
|
+
import * as i6 from "../../contact-service/contact-service.service";
|
|
27
|
+
import * as i7 from "../../comman-service/comman-service.service";
|
|
28
|
+
import * as i8 from "ngx-pagination";
|
|
29
|
+
import * as i9 from "ng-select";
|
|
30
|
+
import * as i10 from "ngx-chips";
|
|
31
|
+
import * as i11 from "ngx-bootstrap/sortable";
|
|
32
|
+
import * as i12 from "@angular/common";
|
|
33
|
+
import * as i13 from "../../utility/app-no-dbl-click.directive";
|
|
34
|
+
import * as i14 from "@angular/forms";
|
|
35
|
+
import * as i15 from "ngx-order-pipe";
|
|
36
|
+
import * as i16 from "../../utility/search-pipe.pipe";
|
|
37
|
+
import * as i17 from "../../pipes/order-by-pipe.pipe";
|
|
38
|
+
// import { stringify } from "@angular/core/src/render3/util";
|
|
39
|
+
export class SubformComponent {
|
|
40
|
+
constructor(router, route, toastr, ss, uploadService, spinnerService, cs, cm) {
|
|
41
|
+
this.router = router;
|
|
42
|
+
this.route = route;
|
|
43
|
+
this.toastr = toastr;
|
|
44
|
+
this.ss = ss;
|
|
45
|
+
this.uploadService = uploadService;
|
|
46
|
+
this.spinnerService = spinnerService;
|
|
47
|
+
this.cs = cs;
|
|
48
|
+
this.cm = cm;
|
|
49
|
+
//#region vars and obj declaration section
|
|
50
|
+
this.cDt = new Date();
|
|
51
|
+
this.formFilds = [];
|
|
52
|
+
this.datalist = [];
|
|
53
|
+
this.actions = [];
|
|
54
|
+
this.lovs = [];
|
|
55
|
+
this.addNew = [];
|
|
56
|
+
this.tblH = [];
|
|
57
|
+
this.tblDesc = [];
|
|
58
|
+
this.navigation = [];
|
|
59
|
+
this.cLink = 0;
|
|
60
|
+
this.glbObj = {};
|
|
61
|
+
this.attrCListDtl = [];
|
|
62
|
+
this.attrQListDtl = [];
|
|
63
|
+
this.disableselc = false;
|
|
64
|
+
this.dataDtlist = [];
|
|
65
|
+
this.dataDtl = [];
|
|
66
|
+
this.itemStringsLeft = [];
|
|
67
|
+
this.applicationList = [];
|
|
68
|
+
this.userDtls = [];
|
|
69
|
+
this.moduleDtls = [];
|
|
70
|
+
this.menuList = [];
|
|
71
|
+
this.userRightsMenuList = [];
|
|
72
|
+
this.subMenuIdns = [];
|
|
73
|
+
this.whereMap = {};
|
|
74
|
+
this.paraObj = {};
|
|
75
|
+
this.currObj = {};
|
|
76
|
+
this.sqlArray = {};
|
|
77
|
+
this.s3details = {};
|
|
78
|
+
this.pk = this.route.snapshot.paramMap.get("subk");
|
|
79
|
+
this.pv = this.route.snapshot.paramMap.get("subv");
|
|
80
|
+
this.GFOLDER = "ezbiz/205/doc/";
|
|
81
|
+
this.GBUCKET = "qs";
|
|
82
|
+
this.fileUploads = [];
|
|
83
|
+
this.nameAttr = [];
|
|
84
|
+
this.imageUrlLst = [];
|
|
85
|
+
this.p = 1;
|
|
86
|
+
this.pageSize = 10;
|
|
87
|
+
this.order = "";
|
|
88
|
+
this.eveC = "fa-eye-slash";
|
|
89
|
+
this.estst = false;
|
|
90
|
+
this.inputtype = "password";
|
|
91
|
+
this.reverse = true;
|
|
92
|
+
this.subform = false;
|
|
93
|
+
this.usrisExist = false;
|
|
94
|
+
this.display_group = [];
|
|
95
|
+
this.display_row = [];
|
|
96
|
+
this.display_attr = [];
|
|
97
|
+
this.colVals = [];
|
|
98
|
+
this.termsList = [];
|
|
99
|
+
this.applUserList = [];
|
|
100
|
+
this.dataTrnsList = [];
|
|
101
|
+
this.byrObj = {};
|
|
102
|
+
this.userDetails = [];
|
|
103
|
+
this.outMappingList = [];
|
|
104
|
+
this.attrList = [];
|
|
105
|
+
this.exitBankDtlList = [];
|
|
106
|
+
this.bankList = [];
|
|
107
|
+
this.bankDtlList = [];
|
|
108
|
+
this.branch = "";
|
|
109
|
+
this.accountType = "savings";
|
|
110
|
+
this.selectBranchDtl = {};
|
|
111
|
+
this.selectBranchAddress = "";
|
|
112
|
+
this.selectIfsc = "";
|
|
113
|
+
this.editbank_dtl_idn = "";
|
|
114
|
+
this.deletBankIdn = "";
|
|
115
|
+
this.exitsingUserList = [];
|
|
116
|
+
this.selectedPeople3 = [];
|
|
117
|
+
this.docDeleteDtl = {};
|
|
118
|
+
this.reset = v => v.form.reset();
|
|
119
|
+
this.closeNull = () => (this.tbCell = null);
|
|
120
|
+
this.pageBck = () => window.history.back();
|
|
121
|
+
}
|
|
122
|
+
getPageDefination() {
|
|
123
|
+
this.routherDoc = "";
|
|
124
|
+
this.datalist = [];
|
|
125
|
+
this.whereMap = [];
|
|
126
|
+
let frmnme = this.route.snapshot.params["itmform"] || "";
|
|
127
|
+
let doctyp = this.route.snapshot.params["doctyp"] || "";
|
|
128
|
+
debugger;
|
|
129
|
+
this.spinnerService.show();
|
|
130
|
+
if (this.pk != null && this.subFrmWk != null) {
|
|
131
|
+
//subFrmWk == navigation panel's menu
|
|
132
|
+
if (this.subFrmWv != "ALL") {
|
|
133
|
+
this.paraObj["whereKeys"] = this.pk + "~" + this.subFrmWk;
|
|
134
|
+
this.paraObj["whereVlus"] = "" + this.pv + "~" + this.subFrmWv;
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
this.paraObj["whereKeys"] = this.pk;
|
|
138
|
+
this.paraObj["whereVlus"] = "" + this.pv;
|
|
139
|
+
}
|
|
140
|
+
this.whereMap[this.subFrmWk] = this.subFrmWv;
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
this.paraObj["whereKeys"] = this.pk;
|
|
144
|
+
this.paraObj["whereVlus"] = "" + this.pv;
|
|
145
|
+
this.whereMap[this.pk] = this.pv;
|
|
146
|
+
}
|
|
147
|
+
this.header["method"] = "loadList";
|
|
148
|
+
// if (this.pageInfo != null) {
|
|
149
|
+
// this.page_typ=this.pageInfo.page_typ;
|
|
150
|
+
// var pageTP = this.pageInfo.page_typ;
|
|
151
|
+
// if (pageTP == "jsonForm") {
|
|
152
|
+
// this.paraObj["whereKeys"] = this.pageInfo.where_clause;
|
|
153
|
+
// this.paraObj["whereVlus"] = this.whereMap[this.pageInfo.where_clause];
|
|
154
|
+
// }
|
|
155
|
+
// }
|
|
156
|
+
console.log(JSON.stringify(this.header));
|
|
157
|
+
console.log(JSON.stringify(this.paraObj));
|
|
158
|
+
let options = ({ headers: new HttpHeaders(this.header) });
|
|
159
|
+
this.ss
|
|
160
|
+
.getData(this.paraObj, options)
|
|
161
|
+
.then((response) => {
|
|
162
|
+
if (response.status == "SUCCESS") {
|
|
163
|
+
debugger;
|
|
164
|
+
console.log(response);
|
|
165
|
+
this.spinnerService.hide();
|
|
166
|
+
this.tblH = response.dataHeader;
|
|
167
|
+
this.tblDesc = response.dataHeaderPrint;
|
|
168
|
+
this.addNew = response.buttons[0];
|
|
169
|
+
this.pageInfo = response.pageInfo;
|
|
170
|
+
this.pkf = response.pageInfo.primary_key_field;
|
|
171
|
+
this.datalist = response.dataList;
|
|
172
|
+
this.actions = response.actions;
|
|
173
|
+
this.navigation = response.navigation;
|
|
174
|
+
if (this.paraObj["whereKeys"] == "nme_idn" || this.paraObj["whereKeys"] == "ledger_idn") {
|
|
175
|
+
if ((this.paraObj["formNme"] == "nameMaster" || this.paraObj["formNme"] == "ledgerMaster" || this.paraObj["formNme"] == "accNameMaster") &&
|
|
176
|
+
this.datalist.length == 1) {
|
|
177
|
+
let dtDtl = this.datalist[0];
|
|
178
|
+
let nme = dtDtl["nme"] || "";
|
|
179
|
+
let pnme = dtDtl["person_nme"] || "";
|
|
180
|
+
if (nme != "" || pnme != "") {
|
|
181
|
+
this.contactName = nme + "/" + pnme;
|
|
182
|
+
this.contactName = this.contactName.toUpperCase();
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
this.contactName = "";
|
|
188
|
+
}
|
|
189
|
+
if (doctyp != '') {
|
|
190
|
+
this.routherDoc = doctyp;
|
|
191
|
+
this.navigation.forEach((element, index) => {
|
|
192
|
+
if (element.form_field == 'uploadDocument') {
|
|
193
|
+
this.navigationFun(element, index);
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
this.spinnerService.hide();
|
|
200
|
+
this.toastr.error(response.message);
|
|
201
|
+
}
|
|
202
|
+
})
|
|
203
|
+
.catch((err) => {
|
|
204
|
+
this.spinnerService.hide();
|
|
205
|
+
this.toastr.error(err.message);
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
getRowGroup(displayAttrIdn) {
|
|
209
|
+
let reqObj = {};
|
|
210
|
+
reqObj["displayAttrIdn"] = displayAttrIdn;
|
|
211
|
+
this.header["method"] = "getPageDisplayAttr";
|
|
212
|
+
let options = ({ headers: new HttpHeaders(this.header) });
|
|
213
|
+
this.ss
|
|
214
|
+
.getRowGroup(reqObj, options, "admin/menuRights")
|
|
215
|
+
.then((response) => {
|
|
216
|
+
if (response.status == "SUCCESS") {
|
|
217
|
+
this.display_group = response.result.display_group;
|
|
218
|
+
this.display_row = response.result.display_row;
|
|
219
|
+
this.display_attr = response.result.display_attr;
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
this.toastr.error(response.message);
|
|
223
|
+
}
|
|
224
|
+
})
|
|
225
|
+
.catch((err) => {
|
|
226
|
+
this.toastr.error(err.message);
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
SaveRowGroup(displayAttrIdn, colname, colVals) {
|
|
230
|
+
this.spinnerService.show();
|
|
231
|
+
let reqObj = {};
|
|
232
|
+
reqObj["displayAttrIdn"] = displayAttrIdn;
|
|
233
|
+
reqObj["columnName"] = colname;
|
|
234
|
+
reqObj["columnValue"] = colVals;
|
|
235
|
+
this.header["method"] = "savePageDisplayAttr";
|
|
236
|
+
let options = ({ headers: new HttpHeaders(this.header) });
|
|
237
|
+
this.ss
|
|
238
|
+
.getRowGroup(reqObj, options, "admin/menuRights")
|
|
239
|
+
.then((response) => {
|
|
240
|
+
if (response.status == "SUCCESS") {
|
|
241
|
+
this.disableselc = false;
|
|
242
|
+
this.spinnerService.hide();
|
|
243
|
+
this.toastr.success(response.message);
|
|
244
|
+
this.colVals = [];
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
this.spinnerService.hide();
|
|
248
|
+
this.toastr.error(response.message);
|
|
249
|
+
}
|
|
250
|
+
})
|
|
251
|
+
.catch((err) => {
|
|
252
|
+
this.spinnerService.hide();
|
|
253
|
+
this.toastr.error(err.message);
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
onChangeDispRow(e) {
|
|
257
|
+
this.disableselc = true;
|
|
258
|
+
for (var key in e.target.form.elements) {
|
|
259
|
+
if (e.target.form.elements[key].id != "" &&
|
|
260
|
+
e.target.form.elements[key].id != undefined &&
|
|
261
|
+
e.target.form.elements[key].id != "undefined")
|
|
262
|
+
if (e.target.form.elements[key].id.startsWith("row_")) {
|
|
263
|
+
if (e.target.form.elements[key].value != "" &&
|
|
264
|
+
e.target.form.elements[key].value != undefined &&
|
|
265
|
+
e.target.form.elements[key].value != "undefined")
|
|
266
|
+
this.colVals.push(e.target.form.elements[key].value);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
this.SaveRowGroup(this.pid, "display_row", this.colVals);
|
|
270
|
+
}
|
|
271
|
+
onChangeDispGrp(e) {
|
|
272
|
+
this.disableselc = true;
|
|
273
|
+
for (var key in e.target.form.elements) {
|
|
274
|
+
if (e.target.form.elements[key].id != "" &&
|
|
275
|
+
e.target.form.elements[key].id != undefined &&
|
|
276
|
+
e.target.form.elements[key].id != "undefined")
|
|
277
|
+
if (e.target.form.elements[key].id.startsWith("grp_")) {
|
|
278
|
+
if (e.target.form.elements[key].value != "" &&
|
|
279
|
+
e.target.form.elements[key].value != undefined &&
|
|
280
|
+
e.target.form.elements[key].value != "undefined")
|
|
281
|
+
this.colVals.push(e.target.form.elements[key].value);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
this.SaveRowGroup(this.pid, "display_group", this.colVals);
|
|
285
|
+
}
|
|
286
|
+
getFormFields() {
|
|
287
|
+
this.spinnerService.show();
|
|
288
|
+
this.dfv = null;
|
|
289
|
+
this.paraObj["whereKeys"] = this.pk;
|
|
290
|
+
this.paraObj["whereVlus"] = this.pv;
|
|
291
|
+
this.header["method"] = "loadAddEdit";
|
|
292
|
+
console.log(this.paraObj);
|
|
293
|
+
console.log(this.header);
|
|
294
|
+
let options = ({ headers: new HttpHeaders(this.header) });
|
|
295
|
+
this.ss
|
|
296
|
+
.getFormF(this.paraObj, options)
|
|
297
|
+
.then((response) => {
|
|
298
|
+
if (response.status == "SUCCESS" && response.message != "SUCCESS") {
|
|
299
|
+
this.toastr.error(response.message);
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
302
|
+
if (response.status == "SUCCESS") {
|
|
303
|
+
console.log(response);
|
|
304
|
+
this.formFilds = response.formFields;
|
|
305
|
+
this.spinnerService.hide();
|
|
306
|
+
this.formFilds.forEach(element => {
|
|
307
|
+
if (element.form_field_typ == "tb") {
|
|
308
|
+
this.getLovList(element.form_field, element.page_item_idn);
|
|
309
|
+
}
|
|
310
|
+
if (element.form_field_typ == "s") {
|
|
311
|
+
this.getLovList(element.form_field, element.page_item_idn);
|
|
312
|
+
}
|
|
313
|
+
if (element.form_field_typ == "hd") {
|
|
314
|
+
element.default_value = this.whereMap[element.form_field];
|
|
315
|
+
}
|
|
316
|
+
if (element.form_field_typ == "fk") {
|
|
317
|
+
element.default_value = this.route.snapshot.paramMap.get("subv");
|
|
318
|
+
}
|
|
319
|
+
if (element.form_field_typ == "ck") {
|
|
320
|
+
element.default_value = this.whereMap[element.column_key];
|
|
321
|
+
}
|
|
322
|
+
if (element.form_field_typ == "sq") {
|
|
323
|
+
this.getSequence(element);
|
|
324
|
+
}
|
|
325
|
+
if (element.dta_typ == "sa") {
|
|
326
|
+
this.getLovList(element.form_field, element.page_item_idn);
|
|
327
|
+
}
|
|
328
|
+
if (element.dta_typ == "sr") {
|
|
329
|
+
this.getLovList(element.form_field, element.page_item_idn);
|
|
330
|
+
}
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
else {
|
|
334
|
+
this.spinnerService.hide();
|
|
335
|
+
this.toastr.error(response.message);
|
|
336
|
+
}
|
|
337
|
+
})
|
|
338
|
+
.catch((err) => {
|
|
339
|
+
this.spinnerService.hide();
|
|
340
|
+
this.toastr.error(err.message);
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
userAction(ua, c, a, i) {
|
|
344
|
+
debugger;
|
|
345
|
+
if (c.trim() == "add") {
|
|
346
|
+
this.spinnerService.show();
|
|
347
|
+
this.formFilds = [];
|
|
348
|
+
document.getElementById("datamdbtn").click();
|
|
349
|
+
this.getFormFields();
|
|
350
|
+
this.btnName = "Add";
|
|
351
|
+
}
|
|
352
|
+
else if (ua && c.trim() == "edit") {
|
|
353
|
+
this.glbObj = ua;
|
|
354
|
+
this.spinnerService.show();
|
|
355
|
+
this.formFilds = [];
|
|
356
|
+
document.getElementById("datamdbtn").click();
|
|
357
|
+
this.pid = ua[this.pkf];
|
|
358
|
+
this.getEditData(ua);
|
|
359
|
+
this.btnName = "Edit";
|
|
360
|
+
}
|
|
361
|
+
else if (ua &&
|
|
362
|
+
c.trim() == "addItem" &&
|
|
363
|
+
a.form_field_title != "Add Mapping") {
|
|
364
|
+
this.spinnerService.show();
|
|
365
|
+
this.formFilds = [];
|
|
366
|
+
this.curl = a.lov_qry;
|
|
367
|
+
this.router.navigate([a.lov_qry, this.pkf, ua[this.pkf]]);
|
|
368
|
+
}
|
|
369
|
+
else if (ua && c.trim() == "deleteterms") {
|
|
370
|
+
this.ci = i;
|
|
371
|
+
document.getElementById("deleteTerms").click();
|
|
372
|
+
this.pid = ua[this.pkf];
|
|
373
|
+
}
|
|
374
|
+
else if (ua && c.trim() == "delete") {
|
|
375
|
+
this.ci = i;
|
|
376
|
+
document.getElementById("deletebtn").click();
|
|
377
|
+
this.pid = ua[this.pkf];
|
|
378
|
+
}
|
|
379
|
+
else if (ua && c.trim() == "defination") {
|
|
380
|
+
this.ci = i;
|
|
381
|
+
document.getElementById("rowGrpbtn").click();
|
|
382
|
+
this.pid = ua[this.pkf];
|
|
383
|
+
this.getRowGroup(this.pid);
|
|
384
|
+
}
|
|
385
|
+
else if (ua &&
|
|
386
|
+
c.trim() == "addItem" &&
|
|
387
|
+
a.form_field_title == "Add Mapping") {
|
|
388
|
+
this.producDetailModelTitle = ua.display;
|
|
389
|
+
this.loadProductDetailMapping(ua["attr_d_idn"]);
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
loadProductDetailMapping(attrDtailIdn) {
|
|
393
|
+
this.attr_dtl_idn = attrDtailIdn;
|
|
394
|
+
this.spinnerService.show();
|
|
395
|
+
let obj = {};
|
|
396
|
+
obj["formNme"] = "fileUpload";
|
|
397
|
+
obj["attr_dtl_idn"] = attrDtailIdn;
|
|
398
|
+
this.header["method"] = "loadPrdMasterMapping";
|
|
399
|
+
let options = ({ headers: new HttpHeaders(this.header) });
|
|
400
|
+
this.ss
|
|
401
|
+
.Save(obj, options, "fileUpload/load")
|
|
402
|
+
.then((response) => {
|
|
403
|
+
if (response.status == "SUCCESS") {
|
|
404
|
+
console.log(response);
|
|
405
|
+
let result = response.result;
|
|
406
|
+
this.attrDtl = result.attrDtl;
|
|
407
|
+
this.attrMappingDtl = result.attrMappingDtl;
|
|
408
|
+
document.getElementById("btnproductDetailMapMD").click();
|
|
409
|
+
this.spinnerService.hide();
|
|
410
|
+
}
|
|
411
|
+
else {
|
|
412
|
+
this.spinnerService.hide();
|
|
413
|
+
this.toastr.error(response.message);
|
|
414
|
+
}
|
|
415
|
+
})
|
|
416
|
+
.catch((err) => {
|
|
417
|
+
this.spinnerService.hide();
|
|
418
|
+
this.toastr.error(err.message);
|
|
419
|
+
});
|
|
420
|
+
}
|
|
421
|
+
saveProductDetailMapping() {
|
|
422
|
+
this.spinnerService.show();
|
|
423
|
+
let obj = {};
|
|
424
|
+
obj["formNme"] = "fileUpload";
|
|
425
|
+
obj["attr_dtl_idn"] = this.attr_dtl_idn;
|
|
426
|
+
obj["attrDtlMap"] = this.attrMappingDtl;
|
|
427
|
+
this.header["method"] = "updateProductAttr";
|
|
428
|
+
console.log(JSON.stringify(obj));
|
|
429
|
+
let options = ({ headers: new HttpHeaders(this.header) });
|
|
430
|
+
this.ss
|
|
431
|
+
.Save(obj, options, "fileUpload/load")
|
|
432
|
+
.then((response) => {
|
|
433
|
+
if (response.status == "SUCCESS") {
|
|
434
|
+
console.log(response);
|
|
435
|
+
this.toastr.success(response.message);
|
|
436
|
+
this.spinnerService.hide();
|
|
437
|
+
this.productDetailMapclsbtn.nativeElement.click();
|
|
438
|
+
}
|
|
439
|
+
else {
|
|
440
|
+
this.spinnerService.hide();
|
|
441
|
+
this.toastr.error(response.message);
|
|
442
|
+
}
|
|
443
|
+
})
|
|
444
|
+
.catch((err) => {
|
|
445
|
+
this.spinnerService.hide();
|
|
446
|
+
this.toastr.error(err.message);
|
|
447
|
+
});
|
|
448
|
+
}
|
|
449
|
+
navigationFun(nav, i) {
|
|
450
|
+
debugger;
|
|
451
|
+
this.cLink = i;
|
|
452
|
+
this.subFrmWk = nav.column_key.trim() || '';
|
|
453
|
+
this.subFrmWv = nav.form_field.trim() || '';
|
|
454
|
+
if (this.subFrmWv == "0")
|
|
455
|
+
this.subFrmWv = "";
|
|
456
|
+
this.navform = nav.lov_qry.trim();
|
|
457
|
+
if (this.subFrmWv == "") {
|
|
458
|
+
this.subFrmWk = null;
|
|
459
|
+
this.subFrmWv = null;
|
|
460
|
+
}
|
|
461
|
+
if (this.navform != "") {
|
|
462
|
+
if (this.navform == "addtionalDtlMaster") {
|
|
463
|
+
this.addFrmNme = this.navform;
|
|
464
|
+
let mdl = ['contact'];
|
|
465
|
+
this.getNameAttr(this.addFrmNme, mdl);
|
|
466
|
+
}
|
|
467
|
+
else if (this.navform == "ledgerAddtionalDtlMaster") {
|
|
468
|
+
this.addFrmNme = this.navform;
|
|
469
|
+
let mdl = ['ledg_attr'];
|
|
470
|
+
this.getLedgerAttr(this.addFrmNme, mdl, 'attr');
|
|
471
|
+
}
|
|
472
|
+
else if (this.navform == "ledgerAccAdditinalDetails") {
|
|
473
|
+
this.addFrmNme = this.navform;
|
|
474
|
+
let mdl = ['ledgacc_attr'];
|
|
475
|
+
this.getLedgerAttr(this.addFrmNme, mdl, 'acc_attr');
|
|
476
|
+
}
|
|
477
|
+
else if (this.navform == "accDeleteRulesForm") {
|
|
478
|
+
this.addFrmNme = this.navform;
|
|
479
|
+
let mdl = ['delete_rule'];
|
|
480
|
+
this.getLedgerAttr(this.addFrmNme, mdl, 'delete_rule');
|
|
481
|
+
}
|
|
482
|
+
else if (this.navform == "accJournalAttrForm") {
|
|
483
|
+
this.addFrmNme = this.navform;
|
|
484
|
+
let mdl = ['jnlacc_attr'];
|
|
485
|
+
this.getLedgerAttr(this.addFrmNme, mdl, 'jnlacc_attr');
|
|
486
|
+
}
|
|
487
|
+
else if (this.navform == "accLoanAttrForm") {
|
|
488
|
+
this.addFrmNme = this.navform;
|
|
489
|
+
let mdl = ['loan'];
|
|
490
|
+
this.getLedgerAttr(this.addFrmNme, mdl, 'loan');
|
|
491
|
+
}
|
|
492
|
+
else if (this.navform == "accJournalSettingForm") {
|
|
493
|
+
this.addFrmNme = this.navform;
|
|
494
|
+
let mdl = ['jnl_sett'];
|
|
495
|
+
this.getJournalAttr(this.addFrmNme, mdl, 'jnl_sett');
|
|
496
|
+
}
|
|
497
|
+
else if (this.navform == "documentUploadMaster") {
|
|
498
|
+
this.addFrmNme = this.navform;
|
|
499
|
+
this.getFiles(this.pv);
|
|
500
|
+
}
|
|
501
|
+
else if (this.navform == "menuAccessMaster") {
|
|
502
|
+
this.addFrmNme = this.navform;
|
|
503
|
+
// this.loadUsrMdl(this.pv);//
|
|
504
|
+
this.loadApplication();
|
|
505
|
+
}
|
|
506
|
+
else if (this.navform == "webMenuAccessMaster") {
|
|
507
|
+
this.addFrmNme = this.navform;
|
|
508
|
+
// this.loadUsrMdl(this.pv);//
|
|
509
|
+
this.loadWebApplication();
|
|
510
|
+
}
|
|
511
|
+
else if (this.navform == "moduleAccessMaster") {
|
|
512
|
+
this.addFrmNme = this.navform;
|
|
513
|
+
this.loadUsrMdl(this.pv);
|
|
514
|
+
}
|
|
515
|
+
else if (this.navform == "termUserAssignForm") {
|
|
516
|
+
this.addFrmNme = this.navform;
|
|
517
|
+
this.loadApplicationUserTerms(this.pv);
|
|
518
|
+
}
|
|
519
|
+
else if (this.navform == "setPasswordForm") {
|
|
520
|
+
this.addFrmNme = this.navform;
|
|
521
|
+
this.loadUserPassword();
|
|
522
|
+
}
|
|
523
|
+
else if (this.navform == "ledgerBankDetails") {
|
|
524
|
+
this.addFrmNme = this.navform;
|
|
525
|
+
this.loadledgerBankDetails();
|
|
526
|
+
}
|
|
527
|
+
else {
|
|
528
|
+
this.paraObj["formNme"] = this.navform;
|
|
529
|
+
this.getPageDefination();
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
loadledgerBankDetails() {
|
|
534
|
+
this.spinnerService.show();
|
|
535
|
+
let reqObj = {};
|
|
536
|
+
reqObj['formNme'] = 'ledgerBankDetails';
|
|
537
|
+
reqObj['ledger_idn'] = this.route.snapshot.paramMap.get('subv');
|
|
538
|
+
this.header['method'] = 'loadledgerBankDetail';
|
|
539
|
+
let options = ({ headers: new HttpHeaders(this.header) });
|
|
540
|
+
this.cs.load(reqObj, options, 'accounts/accLedger').then((response) => {
|
|
541
|
+
if (response.status == 'SUCCESS') {
|
|
542
|
+
this.spinnerService.hide();
|
|
543
|
+
let result = response.result;
|
|
544
|
+
this.exitBankDtlList = result.bankDtlList || [];
|
|
545
|
+
this.editbank_dtl_idn = "";
|
|
546
|
+
this.branch = "";
|
|
547
|
+
this.accountno = "";
|
|
548
|
+
this.selectBranchAddress = "";
|
|
549
|
+
this.bank = "";
|
|
550
|
+
this.bankList = [];
|
|
551
|
+
this.bankDtlList = [];
|
|
552
|
+
}
|
|
553
|
+
else {
|
|
554
|
+
this.spinnerService.hide();
|
|
555
|
+
this.toastr.error(response.message);
|
|
556
|
+
}
|
|
557
|
+
}).catch((err) => {
|
|
558
|
+
this.spinnerService.hide();
|
|
559
|
+
this.toastr.error(err.message);
|
|
560
|
+
});
|
|
561
|
+
}
|
|
562
|
+
ledgerBankDetails(str) {
|
|
563
|
+
this.spinnerService.show();
|
|
564
|
+
let reqObj = {};
|
|
565
|
+
reqObj['formNme'] = 'ledgerBankDetails';
|
|
566
|
+
reqObj['likeStr'] = str;
|
|
567
|
+
this.header['method'] = 'loadPartyBank';
|
|
568
|
+
let options = ({ headers: new HttpHeaders(this.header) });
|
|
569
|
+
this.cs.load(reqObj, options, 'accounts/accLedger').then((response) => {
|
|
570
|
+
if (response.status == 'SUCCESS') {
|
|
571
|
+
this.spinnerService.hide();
|
|
572
|
+
let result = response.result;
|
|
573
|
+
this.bankList = result.bankList.map(option => ({
|
|
574
|
+
value: option,
|
|
575
|
+
label: option
|
|
576
|
+
}));
|
|
577
|
+
}
|
|
578
|
+
else {
|
|
579
|
+
this.spinnerService.hide();
|
|
580
|
+
this.toastr.error(response.message);
|
|
581
|
+
}
|
|
582
|
+
}).catch((err) => {
|
|
583
|
+
this.spinnerService.hide();
|
|
584
|
+
this.toastr.error(err.message);
|
|
585
|
+
});
|
|
586
|
+
}
|
|
587
|
+
getBankBranch(bank) {
|
|
588
|
+
this.branch = "";
|
|
589
|
+
this.selectBranchAddress = "";
|
|
590
|
+
this.selectIfsc = "";
|
|
591
|
+
this.spinnerService.show();
|
|
592
|
+
let reqObj = {};
|
|
593
|
+
reqObj['formNme'] = 'ledgerBankDetails';
|
|
594
|
+
reqObj['bankNme'] = bank;
|
|
595
|
+
this.header['method'] = 'getPartyBankDtl';
|
|
596
|
+
let options = ({ headers: new HttpHeaders(this.header) });
|
|
597
|
+
this.cs.load(reqObj, options, 'accounts/accLedger').then((response) => {
|
|
598
|
+
if (response.status == 'SUCCESS') {
|
|
599
|
+
this.spinnerService.hide();
|
|
600
|
+
let result = response.result;
|
|
601
|
+
this.bankDtlList = result.bankDtlList || [];
|
|
602
|
+
}
|
|
603
|
+
else {
|
|
604
|
+
this.spinnerService.hide();
|
|
605
|
+
this.toastr.error(response.message);
|
|
606
|
+
}
|
|
607
|
+
}).catch((err) => {
|
|
608
|
+
this.spinnerService.hide();
|
|
609
|
+
this.toastr.error(err.message);
|
|
610
|
+
});
|
|
611
|
+
}
|
|
612
|
+
selectBranch(branch) {
|
|
613
|
+
this.selectBranchAddress = "";
|
|
614
|
+
this.selectBranchDtl = this.bankDtlList.find(x => x.nme_idn == branch) || '';
|
|
615
|
+
let address = this.selectBranchDtl['address'] || [];
|
|
616
|
+
if (address.length > 0) {
|
|
617
|
+
let addressDtl = address[0];
|
|
618
|
+
let area = addressDtl['area'] || "";
|
|
619
|
+
if (area == "null")
|
|
620
|
+
area = "";
|
|
621
|
+
let street = addressDtl['street'] || "";
|
|
622
|
+
if (street == "null")
|
|
623
|
+
street = "";
|
|
624
|
+
let unit_no = addressDtl['unit_no'] || "";
|
|
625
|
+
if (unit_no == "null")
|
|
626
|
+
unit_no = "";
|
|
627
|
+
let building = addressDtl['building'] || "";
|
|
628
|
+
if (building == "null")
|
|
629
|
+
building = "";
|
|
630
|
+
let landmark = addressDtl['landmark'] || "";
|
|
631
|
+
if (landmark == "null")
|
|
632
|
+
landmark = "";
|
|
633
|
+
let zip = addressDtl['zip'] || "";
|
|
634
|
+
if (zip == "null")
|
|
635
|
+
zip = "";
|
|
636
|
+
let city_nm = addressDtl['city_nm'] || "";
|
|
637
|
+
if (city_nm == "null")
|
|
638
|
+
city_nm = "";
|
|
639
|
+
let country_nm = addressDtl['country_nm'] || "";
|
|
640
|
+
if (country_nm == "null")
|
|
641
|
+
country_nm = "";
|
|
642
|
+
let state_nm = addressDtl['state_nm'] || "";
|
|
643
|
+
if (state_nm == "null")
|
|
644
|
+
state_nm = "";
|
|
645
|
+
this.selectIfsc = this.selectBranchDtl['attr']['ifsc'];
|
|
646
|
+
this.selectBranchAddress = unit_no + " " + building + " " + street + " " + area + " " + landmark + " " + city_nm + " " + state_nm + " " + zip;
|
|
647
|
+
}
|
|
648
|
+
}
|
|
649
|
+
loadLedgerBank() {
|
|
650
|
+
}
|
|
651
|
+
loadEditBankDtl(bankdtl) {
|
|
652
|
+
debugger;
|
|
653
|
+
let bankName = bankdtl.bankname;
|
|
654
|
+
this.bankList = [{
|
|
655
|
+
value: bankName,
|
|
656
|
+
label: bankName
|
|
657
|
+
}];
|
|
658
|
+
this.bank = bankName;
|
|
659
|
+
this.getBankBranch(bankName);
|
|
660
|
+
this.editbank_dtl_idn = bankdtl.bankdtlIdn;
|
|
661
|
+
this.accountType = bankdtl.accountType;
|
|
662
|
+
this.accountno = bankdtl.accountNo;
|
|
663
|
+
this.selectBranchAddress = bankdtl.address;
|
|
664
|
+
this.selectIfsc = bankdtl.ifsc;
|
|
665
|
+
this.branch = bankdtl.bankRefIdn;
|
|
666
|
+
}
|
|
667
|
+
SaveLedgerBank() {
|
|
668
|
+
this.spinnerService.show();
|
|
669
|
+
let reqObj = {};
|
|
670
|
+
reqObj['formNme'] = 'ledgerBankDetails';
|
|
671
|
+
reqObj['ledger_idn'] = this.route.snapshot.paramMap.get('subv');
|
|
672
|
+
reqObj['bank_ref_idn'] = this.branch;
|
|
673
|
+
reqObj['account_type'] = this.accountType;
|
|
674
|
+
reqObj['account_no'] = this.accountno;
|
|
675
|
+
if (this.editbank_dtl_idn == '')
|
|
676
|
+
reqObj['action'] = 'add';
|
|
677
|
+
else {
|
|
678
|
+
reqObj['action'] = 'edit';
|
|
679
|
+
reqObj['bank_dtl_idn'] = this.editbank_dtl_idn;
|
|
680
|
+
}
|
|
681
|
+
this.header['method'] = 'saveBankDtlIntoAccLedger';
|
|
682
|
+
console.log(JSON.stringify(reqObj));
|
|
683
|
+
let options = ({ headers: new HttpHeaders(this.header) });
|
|
684
|
+
this.ss.subFgetData(reqObj, options, 'accounts/accLedger').then((response) => {
|
|
685
|
+
if (response.status == 'SUCCESS') {
|
|
686
|
+
let result = response.result;
|
|
687
|
+
this.exitBankDtlList = result.bankDtlList || [];
|
|
688
|
+
this.branch = "";
|
|
689
|
+
this.accountno = "";
|
|
690
|
+
this.selectBranchAddress = "";
|
|
691
|
+
this.bank = "";
|
|
692
|
+
this.bankList = [];
|
|
693
|
+
this.bankDtlList = [];
|
|
694
|
+
this.editbank_dtl_idn = "";
|
|
695
|
+
this.spinnerService.hide();
|
|
696
|
+
if (this.editbank_dtl_idn == "")
|
|
697
|
+
this.toastr.success("New Bank add successfully");
|
|
698
|
+
else {
|
|
699
|
+
this.toastr.success("Bank edit successfuly");
|
|
700
|
+
this.editbank_dtl_idn = "";
|
|
701
|
+
}
|
|
702
|
+
}
|
|
703
|
+
else {
|
|
704
|
+
this.spinnerService.hide();
|
|
705
|
+
this.toastr.error(response.message);
|
|
706
|
+
}
|
|
707
|
+
}).catch((err) => {
|
|
708
|
+
this.spinnerService.hide();
|
|
709
|
+
this.toastr.error(err.message);
|
|
710
|
+
});
|
|
711
|
+
}
|
|
712
|
+
ConfirmDeleteLedgerBank(bankdtl) {
|
|
713
|
+
document.getElementById('bnkdeletemodalbtn').click();
|
|
714
|
+
this.deletBankIdn = bankdtl.bankdtlIdn;
|
|
715
|
+
}
|
|
716
|
+
DeleteLedgerBank() {
|
|
717
|
+
this.spinnerService.show();
|
|
718
|
+
let reqObj = {};
|
|
719
|
+
reqObj['formNme'] = 'ledgerBankDetails';
|
|
720
|
+
reqObj['ledger_idn'] = this.route.snapshot.paramMap.get('subv');
|
|
721
|
+
reqObj['action'] = 'delete';
|
|
722
|
+
reqObj['bank_dtl_idn'] = this.deletBankIdn;
|
|
723
|
+
this.header['method'] = 'saveBankDtlIntoAccLedger';
|
|
724
|
+
console.log(JSON.stringify(reqObj));
|
|
725
|
+
let options = ({ headers: new HttpHeaders(this.header) });
|
|
726
|
+
this.ss.subFgetData(reqObj, options, 'accounts/accLedger').then((response) => {
|
|
727
|
+
if (response.status == 'SUCCESS') {
|
|
728
|
+
let result = response.result;
|
|
729
|
+
this.exitBankDtlList = result.bankDtlList || [];
|
|
730
|
+
this.deletBankIdn = "";
|
|
731
|
+
this.spinnerService.hide();
|
|
732
|
+
this.toastr.success("Bank Delete successfully");
|
|
733
|
+
}
|
|
734
|
+
else {
|
|
735
|
+
this.spinnerService.hide();
|
|
736
|
+
this.toastr.error(response.message);
|
|
737
|
+
}
|
|
738
|
+
}).catch((err) => {
|
|
739
|
+
this.spinnerService.hide();
|
|
740
|
+
this.toastr.error(err.message);
|
|
741
|
+
});
|
|
742
|
+
}
|
|
743
|
+
getLedgerAttr(formname, mdl, type) {
|
|
744
|
+
debugger;
|
|
745
|
+
let reqObj = {};
|
|
746
|
+
reqObj["formNme"] = formname;
|
|
747
|
+
reqObj["ledger_idn"] = this.route.snapshot.paramMap.get("subv");
|
|
748
|
+
reqObj['mdlList'] = mdl;
|
|
749
|
+
reqObj['type'] = type;
|
|
750
|
+
this.header["method"] = "loadLedgerAttr";
|
|
751
|
+
console.log(JSON.stringify(reqObj));
|
|
752
|
+
let options = ({ headers: new HttpHeaders(this.header) });
|
|
753
|
+
this.ss.subFgetData(reqObj, options, "accounts/accLedger")
|
|
754
|
+
.then((response) => {
|
|
755
|
+
if (response.status == "SUCCESS") {
|
|
756
|
+
this.pageInfo = response.pageInfo || {};
|
|
757
|
+
this.uiGrpList = response.uiGrpList;
|
|
758
|
+
this.uiGrpListDtl = response.uiGrpListDtl;
|
|
759
|
+
this.attrCListDtl = response.attrCListDtl;
|
|
760
|
+
this.attrQListDtl = response.attrQListDtl;
|
|
761
|
+
this.dataDtl = response.dataDtl;
|
|
762
|
+
}
|
|
763
|
+
else {
|
|
764
|
+
this.spinnerService.hide();
|
|
765
|
+
this.toastr.error(response.message);
|
|
766
|
+
}
|
|
767
|
+
})
|
|
768
|
+
.catch((err) => {
|
|
769
|
+
this.spinnerService.hide();
|
|
770
|
+
this.toastr.error(err.message);
|
|
771
|
+
});
|
|
772
|
+
}
|
|
773
|
+
getJournalAttr(formname, mdl, type) {
|
|
774
|
+
debugger;
|
|
775
|
+
let reqObj = {};
|
|
776
|
+
reqObj["formNme"] = formname;
|
|
777
|
+
reqObj["journal_idn"] = this.route.snapshot.paramMap.get("subv");
|
|
778
|
+
reqObj['mdlList'] = mdl;
|
|
779
|
+
reqObj['type'] = type;
|
|
780
|
+
this.header["method"] = "loadJournalAttr";
|
|
781
|
+
console.log(JSON.stringify(reqObj));
|
|
782
|
+
let options = ({ headers: new HttpHeaders(this.header) });
|
|
783
|
+
this.ss.subFgetData(reqObj, options, "accounts/accLedger")
|
|
784
|
+
.then((response) => {
|
|
785
|
+
console.log(response);
|
|
786
|
+
if (response.status == "SUCCESS") {
|
|
787
|
+
this.pageInfo = response.pageInfo || {};
|
|
788
|
+
this.uiGrpList = response.uiGrpList;
|
|
789
|
+
this.uiGrpListDtl = response.uiGrpListDtl || {};
|
|
790
|
+
let datatypelist = this.uiGrpListDtl["basic#T"] || [];
|
|
791
|
+
let attrlist = this.uiGrpListDtl["basic#V"] || [];
|
|
792
|
+
this.attrCListDtl = response.attrCListDtl;
|
|
793
|
+
this.attrQListDtl = response.attrQListDtl;
|
|
794
|
+
this.dataDtl = response.dataDtl || {};
|
|
795
|
+
this.contactName = this.dataDtl["contactName"] || "";
|
|
796
|
+
attrlist.forEach((key, index) => {
|
|
797
|
+
let type = datatypelist[index];
|
|
798
|
+
if (type == 'sa') {
|
|
799
|
+
let attrVal = this.dataDtl[key] || '';
|
|
800
|
+
let list = [{ value: attrVal, label: attrVal }];
|
|
801
|
+
this.sqlArray[key] = list;
|
|
802
|
+
}
|
|
803
|
+
});
|
|
804
|
+
this.spinnerService.hide();
|
|
805
|
+
}
|
|
806
|
+
else {
|
|
807
|
+
this.spinnerService.hide();
|
|
808
|
+
this.toastr.error(response.message);
|
|
809
|
+
}
|
|
810
|
+
})
|
|
811
|
+
.catch((err) => {
|
|
812
|
+
this.spinnerService.hide();
|
|
813
|
+
this.toastr.error(err.message);
|
|
814
|
+
});
|
|
815
|
+
}
|
|
816
|
+
loadUserPassword() {
|
|
817
|
+
this.spinnerService.show();
|
|
818
|
+
let reqObj = {};
|
|
819
|
+
reqObj["formNme"] = "applicationAccessMaster";
|
|
820
|
+
reqObj["nmeIdn"] = this.route.snapshot.paramMap.get("subv");
|
|
821
|
+
this.header["method"] = "loadChangePass";
|
|
822
|
+
this.header["source"] = "qs";
|
|
823
|
+
let options = ({ headers: new HttpHeaders(this.header) });
|
|
824
|
+
this.ss
|
|
825
|
+
.subFgetData(reqObj, options, "contact/loadContact")
|
|
826
|
+
.then((response) => {
|
|
827
|
+
if (response.status == "SUCCESS") {
|
|
828
|
+
this.spinnerService.hide();
|
|
829
|
+
let result = response.result;
|
|
830
|
+
this.userDetails = result.userDetails;
|
|
831
|
+
this.pageDefinationPswdCng = result.pageDefination;
|
|
832
|
+
}
|
|
833
|
+
else {
|
|
834
|
+
this.spinnerService.hide();
|
|
835
|
+
this.toastr.error(response.message);
|
|
836
|
+
}
|
|
837
|
+
})
|
|
838
|
+
.catch((err) => {
|
|
839
|
+
this.spinnerService.hide();
|
|
840
|
+
this.toastr.error(err.message);
|
|
841
|
+
});
|
|
842
|
+
}
|
|
843
|
+
changePswd(e, userIdn) {
|
|
844
|
+
this.spinnerService.show();
|
|
845
|
+
let reqObj = {};
|
|
846
|
+
reqObj["formNme"] = "setPasswordForm";
|
|
847
|
+
reqObj["userIdn"] = userIdn;
|
|
848
|
+
reqObj["password"] = e.target.value;
|
|
849
|
+
this.header["method"] = "changePassword";
|
|
850
|
+
this.header["source"] = "qs";
|
|
851
|
+
console.log(JSON.stringify(reqObj));
|
|
852
|
+
let options = ({ headers: new HttpHeaders(this.header) });
|
|
853
|
+
this.ss
|
|
854
|
+
.Save(reqObj, options, "contact/loadContact")
|
|
855
|
+
.then((response) => {
|
|
856
|
+
if (response.status == "SUCCESS") {
|
|
857
|
+
let result = response.result;
|
|
858
|
+
this.userDetails = result.userDetails;
|
|
859
|
+
this.pageDefinationPswdCng = result.pageDefination;
|
|
860
|
+
this.toastr.success(response.message);
|
|
861
|
+
this.loadUserPassword();
|
|
862
|
+
this.spinnerService.hide();
|
|
863
|
+
}
|
|
864
|
+
else {
|
|
865
|
+
this.spinnerService.hide();
|
|
866
|
+
this.toastr.error(response.message);
|
|
867
|
+
}
|
|
868
|
+
})
|
|
869
|
+
.catch((err) => {
|
|
870
|
+
this.spinnerService.hide();
|
|
871
|
+
this.toastr.error(err.message);
|
|
872
|
+
});
|
|
873
|
+
}
|
|
874
|
+
changePassword(obj) {
|
|
875
|
+
this.spinnerService.show();
|
|
876
|
+
let reqObj = {};
|
|
877
|
+
reqObj["formNme"] = "setPasswordForm";
|
|
878
|
+
reqObj["userIdn"] = obj.userIdn;
|
|
879
|
+
reqObj["password"] = obj.password;
|
|
880
|
+
this.header["method"] = "changePassword";
|
|
881
|
+
this.header["source"] = "qs";
|
|
882
|
+
console.log(JSON.stringify(reqObj));
|
|
883
|
+
let options = ({ headers: new HttpHeaders(this.header) });
|
|
884
|
+
this.ss
|
|
885
|
+
.Save(reqObj, options, "contact/loadContact")
|
|
886
|
+
.then((response) => {
|
|
887
|
+
if (response.status == "SUCCESS") {
|
|
888
|
+
let result = response.result;
|
|
889
|
+
this.userDetails = result.userDetails;
|
|
890
|
+
this.pageDefinationPswdCng = result.pageDefination;
|
|
891
|
+
this.toastr.success(response.message);
|
|
892
|
+
this.loadUserPassword();
|
|
893
|
+
this.spinnerService.hide();
|
|
894
|
+
}
|
|
895
|
+
else {
|
|
896
|
+
this.spinnerService.hide();
|
|
897
|
+
this.toastr.error(response.message);
|
|
898
|
+
}
|
|
899
|
+
})
|
|
900
|
+
.catch((err) => {
|
|
901
|
+
this.spinnerService.hide();
|
|
902
|
+
this.toastr.error(err.message);
|
|
903
|
+
});
|
|
904
|
+
}
|
|
905
|
+
loadApplicationUserTerms(nmeidn) {
|
|
906
|
+
this.spinnerService.show();
|
|
907
|
+
const reqObj = {};
|
|
908
|
+
reqObj["nme_idn"] = this.route.snapshot.paramMap.get("subv");
|
|
909
|
+
reqObj["formNme"] = "contactSearchForm";
|
|
910
|
+
this.header["method"] = "loadAssignApplicationUserterms";
|
|
911
|
+
const options = ({ headers: new HttpHeaders(this.header) });
|
|
912
|
+
this.cs
|
|
913
|
+
.load(reqObj, options, "contact/loadContact")
|
|
914
|
+
.then((response) => {
|
|
915
|
+
console.log(response);
|
|
916
|
+
if (response.status == "SUCCESS") {
|
|
917
|
+
let result = response.result;
|
|
918
|
+
this.gblObj = result;
|
|
919
|
+
this.termsList = result.termsList;
|
|
920
|
+
let applUserList = result.applUserList;
|
|
921
|
+
this.exitsingUserList = [];
|
|
922
|
+
this.termsList.forEach(element => {
|
|
923
|
+
let userIdnList = element.userIdnList || [];
|
|
924
|
+
userIdnList.forEach(userIdn => {
|
|
925
|
+
if (this.exitsingUserList.indexOf(userIdn) == -1)
|
|
926
|
+
this.exitsingUserList.push(userIdn);
|
|
927
|
+
});
|
|
928
|
+
});
|
|
929
|
+
debugger;
|
|
930
|
+
let pendingUserList = [];
|
|
931
|
+
applUserList.forEach(element => {
|
|
932
|
+
if (this.exitsingUserList.indexOf(element.k) == -1)
|
|
933
|
+
pendingUserList.push(element);
|
|
934
|
+
});
|
|
935
|
+
this.termsList.forEach(element => {
|
|
936
|
+
let userIdnList = element.userIdnList || [];
|
|
937
|
+
let TermUserList = pendingUserList.map(option => ({
|
|
938
|
+
value: option.k,
|
|
939
|
+
label: option.v
|
|
940
|
+
}));
|
|
941
|
+
if (userIdnList.length > 0) {
|
|
942
|
+
applUserList.forEach(element => {
|
|
943
|
+
if (userIdnList.indexOf(element.k) != -1) {
|
|
944
|
+
TermUserList.push({ "value": element.k, "label": element.v });
|
|
945
|
+
}
|
|
946
|
+
});
|
|
947
|
+
}
|
|
948
|
+
element.TermUserList = TermUserList;
|
|
949
|
+
});
|
|
950
|
+
console.log(this.termsList);
|
|
951
|
+
// this.applUserList = result.applUserList;
|
|
952
|
+
// let temparr = [];
|
|
953
|
+
//this.exitsingUser=[];
|
|
954
|
+
// this.termsList.forEach(element => {
|
|
955
|
+
// debugger
|
|
956
|
+
// element.userIdnList.forEach(a => {
|
|
957
|
+
// temparr.push(a.toString());
|
|
958
|
+
// if(this.exitsingUser.indexOf(a.toString())==-1)
|
|
959
|
+
// this.exitsingUser.push(a.toString());
|
|
960
|
+
// });
|
|
961
|
+
// element.userIdnList = temparr;
|
|
962
|
+
// temparr = [];
|
|
963
|
+
// element.selectedVals = [];
|
|
964
|
+
// });
|
|
965
|
+
// let applUserList=result.applUserList;
|
|
966
|
+
// this.applUserList=[]
|
|
967
|
+
// applUserList.forEach(element => {
|
|
968
|
+
// if(this.exitsingUser.indexOf(element.k)==-1)
|
|
969
|
+
// this.applUserList.push(element);
|
|
970
|
+
// });
|
|
971
|
+
this.applUserList = this.applUserList.map(option => ({
|
|
972
|
+
value: option.k,
|
|
973
|
+
label: option.v
|
|
974
|
+
}));
|
|
975
|
+
console.log(this.applUserList);
|
|
976
|
+
// setTimeout(() => {
|
|
977
|
+
// }, 1000);
|
|
978
|
+
this.spinnerService.hide();
|
|
979
|
+
}
|
|
980
|
+
else {
|
|
981
|
+
this.spinnerService.hide();
|
|
982
|
+
this.toastr.error(response.message);
|
|
983
|
+
}
|
|
984
|
+
})
|
|
985
|
+
.catch((err) => {
|
|
986
|
+
this.spinnerService.hide();
|
|
987
|
+
this.toastr.error(err.message);
|
|
988
|
+
});
|
|
989
|
+
}
|
|
990
|
+
ngAfterViewInit() {
|
|
991
|
+
console.log("in viewafter");
|
|
992
|
+
}
|
|
993
|
+
loadSuggdata(str, page_item_idn, form_field) {
|
|
994
|
+
if (str == undefined || str == '' || str.length < 3)
|
|
995
|
+
return;
|
|
996
|
+
let reqObj = {};
|
|
997
|
+
reqObj["formNme"] = this.route.snapshot.params["frmnme"] || 'loadSuggestionData';
|
|
998
|
+
reqObj['page_item_idn'] = page_item_idn;
|
|
999
|
+
reqObj['likeStr'] = str;
|
|
1000
|
+
this.header['method'] = 'loadSuggestionDataByItemIdn';
|
|
1001
|
+
console.log(this.header);
|
|
1002
|
+
let options = ({ headers: new HttpHeaders(this.header) });
|
|
1003
|
+
console.log(JSON.stringify(reqObj));
|
|
1004
|
+
// console.log(this.header);
|
|
1005
|
+
this.cs.load(reqObj, options, "contact/registerData").then((response) => {
|
|
1006
|
+
console.log(response);
|
|
1007
|
+
let result = response.result;
|
|
1008
|
+
let suggestionData = result.suggestionData || [];
|
|
1009
|
+
let list = suggestionData.map(option => ({
|
|
1010
|
+
value: option.k,
|
|
1011
|
+
label: option.v
|
|
1012
|
+
}));
|
|
1013
|
+
this.sqlArray[form_field] = list;
|
|
1014
|
+
});
|
|
1015
|
+
}
|
|
1016
|
+
loadJnlSuggdata(str, attr_nme, mdl) {
|
|
1017
|
+
if (str == undefined || str == '' || str.length < 3)
|
|
1018
|
+
return;
|
|
1019
|
+
let reqObj = {};
|
|
1020
|
+
reqObj["formNme"] = this.route.snapshot.params["frmnme"] || 'loadSuggestionData';
|
|
1021
|
+
reqObj['attr_nme'] = attr_nme;
|
|
1022
|
+
reqObj['mdl'] = mdl;
|
|
1023
|
+
reqObj['likeStr'] = str;
|
|
1024
|
+
this.header['method'] = 'loadSuggestionDataByAttrNme';
|
|
1025
|
+
console.log(this.header);
|
|
1026
|
+
let options = ({ headers: new HttpHeaders(this.header) });
|
|
1027
|
+
console.log(JSON.stringify(reqObj));
|
|
1028
|
+
// console.log(this.header);
|
|
1029
|
+
this.cs.load(reqObj, options, "accounts/accLedger").then((response) => {
|
|
1030
|
+
console.log(response);
|
|
1031
|
+
let result = response.result;
|
|
1032
|
+
let suggestionData = result.suggestionData || [];
|
|
1033
|
+
let list = suggestionData.map(option => ({
|
|
1034
|
+
value: option.v,
|
|
1035
|
+
label: option.v
|
|
1036
|
+
}));
|
|
1037
|
+
this.sqlArray[attr_nme] = list;
|
|
1038
|
+
});
|
|
1039
|
+
}
|
|
1040
|
+
onchaneVals(e, byrtrmid, selectedUserIdn) {
|
|
1041
|
+
this.dataTrnsList = [...this.termsList];
|
|
1042
|
+
this.byrObj["buyer_terms_idn"] = byrtrmid;
|
|
1043
|
+
if (selectedUserIdn != undefined)
|
|
1044
|
+
this.byrObj["userIdnList"] = selectedUserIdn;
|
|
1045
|
+
let checkBox = document.getElementById(byrtrmid);
|
|
1046
|
+
if (checkBox.checked == true &&
|
|
1047
|
+
selectedUserIdn != undefined &&
|
|
1048
|
+
selectedUserIdn != "") {
|
|
1049
|
+
var index = this.dataTrnsList.findIndex(x => x.buyer_terms_idn == byrtrmid);
|
|
1050
|
+
if (index > -1) {
|
|
1051
|
+
const filteredArr = this.dataTrnsList.filter(item => item.buyer_terms_idn !== byrtrmid);
|
|
1052
|
+
this.dataTrnsList = filteredArr;
|
|
1053
|
+
}
|
|
1054
|
+
// }
|
|
1055
|
+
this.dataTrnsList.push(this.byrObj);
|
|
1056
|
+
this.byrObj = {};
|
|
1057
|
+
}
|
|
1058
|
+
else {
|
|
1059
|
+
const filteredArr = this.dataTrnsList.filter(item => item.buyer_terms_idn !== byrtrmid);
|
|
1060
|
+
this.dataTrnsList = filteredArr;
|
|
1061
|
+
}
|
|
1062
|
+
}
|
|
1063
|
+
onchangeUserSelect(e, trmobj) {
|
|
1064
|
+
let obj = {};
|
|
1065
|
+
obj = { ...trmobj };
|
|
1066
|
+
// obj.selectedVals = [...trmobj.userIdnList];
|
|
1067
|
+
// if (obj.selectedVals.indexOf(e.value) != -1) {
|
|
1068
|
+
// obj.selectedVals.push(e.value);
|
|
1069
|
+
// }
|
|
1070
|
+
if (obj.selectedVals.indexOf(e.value) != -1) {
|
|
1071
|
+
}
|
|
1072
|
+
else {
|
|
1073
|
+
obj.selectedVals.push(e.value);
|
|
1074
|
+
}
|
|
1075
|
+
trmobj = obj;
|
|
1076
|
+
console.log(this.termsList);
|
|
1077
|
+
}
|
|
1078
|
+
onchangeUserDeselect(e, trmobj) {
|
|
1079
|
+
debugger;
|
|
1080
|
+
let obj = {};
|
|
1081
|
+
obj = { ...trmobj };
|
|
1082
|
+
obj.selectedVals.splice(this.termsList.indexOf(e.value), 1);
|
|
1083
|
+
trmobj = obj;
|
|
1084
|
+
console.log(this.termsList);
|
|
1085
|
+
}
|
|
1086
|
+
onchangeUserList(e, trmobj, typ) {
|
|
1087
|
+
this.spinnerService.show();
|
|
1088
|
+
const reqObj = {};
|
|
1089
|
+
reqObj["buyer_terms_idn"] = trmobj.buyer_terms_idn;
|
|
1090
|
+
reqObj["user_idn"] = e.value;
|
|
1091
|
+
reqObj['action'] = typ;
|
|
1092
|
+
reqObj["formNme"] = "contactSearchForm";
|
|
1093
|
+
this.header["method"] = "assignUserTerm";
|
|
1094
|
+
const options = ({ headers: new HttpHeaders(this.header) });
|
|
1095
|
+
this.cs
|
|
1096
|
+
.load(reqObj, options, "contact/loadContact")
|
|
1097
|
+
.then((response) => {
|
|
1098
|
+
console.log(response);
|
|
1099
|
+
if (response.status == "SUCCESS") {
|
|
1100
|
+
this.loadApplicationUserTerms('');
|
|
1101
|
+
this.spinnerService.hide();
|
|
1102
|
+
}
|
|
1103
|
+
else {
|
|
1104
|
+
this.spinnerService.hide();
|
|
1105
|
+
this.toastr.error(response.message);
|
|
1106
|
+
}
|
|
1107
|
+
})
|
|
1108
|
+
.catch((err) => {
|
|
1109
|
+
this.spinnerService.hide();
|
|
1110
|
+
this.toastr.error(err.message);
|
|
1111
|
+
});
|
|
1112
|
+
}
|
|
1113
|
+
saveAppUserterms() {
|
|
1114
|
+
let valArr = [];
|
|
1115
|
+
this.termsList.forEach(element => {
|
|
1116
|
+
let checkBox = document.getElementById(element.buyer_terms_idn);
|
|
1117
|
+
if (checkBox.checked == true) {
|
|
1118
|
+
let obj = {};
|
|
1119
|
+
obj["buyer_terms_idn"] = element.buyer_terms_idn;
|
|
1120
|
+
obj["userIdnList"] = element.userIdnList;
|
|
1121
|
+
valArr.push(obj);
|
|
1122
|
+
}
|
|
1123
|
+
});
|
|
1124
|
+
const reqObj = {};
|
|
1125
|
+
reqObj["nme_idn"] = this.route.snapshot.paramMap.get("subv");
|
|
1126
|
+
reqObj["formNme"] = "contactSearchForm";
|
|
1127
|
+
this.header["method"] = "saveAssignApplicationUserterms";
|
|
1128
|
+
reqObj["dataTrnsList"] = valArr;
|
|
1129
|
+
console.log(reqObj);
|
|
1130
|
+
console.log(JSON.stringify(reqObj));
|
|
1131
|
+
const options = ({ headers: new HttpHeaders(this.header) });
|
|
1132
|
+
this.ss
|
|
1133
|
+
.Save(reqObj, options, "contact/loadContact")
|
|
1134
|
+
.then((response) => {
|
|
1135
|
+
console.log(response);
|
|
1136
|
+
if (response.status == "SUCCESS") {
|
|
1137
|
+
console.log(response.status);
|
|
1138
|
+
this.spinnerService.hide();
|
|
1139
|
+
this.toastr.success(response.message);
|
|
1140
|
+
}
|
|
1141
|
+
else {
|
|
1142
|
+
this.spinnerService.hide();
|
|
1143
|
+
this.toastr.error(response.message);
|
|
1144
|
+
}
|
|
1145
|
+
})
|
|
1146
|
+
.catch((err) => {
|
|
1147
|
+
this.spinnerService.hide();
|
|
1148
|
+
this.toastr.error(err.message);
|
|
1149
|
+
});
|
|
1150
|
+
}
|
|
1151
|
+
getEditData(data) {
|
|
1152
|
+
this.formFilds = [];
|
|
1153
|
+
let reqObj = {};
|
|
1154
|
+
var pageTP = this.pageInfo.page_typ;
|
|
1155
|
+
reqObj["formNme"] = this.pageInfo.form_nme;
|
|
1156
|
+
reqObj["primaryKey"] = this.pageInfo.primary_key_field;
|
|
1157
|
+
reqObj["pageTyp"] = this.pageInfo.page_typ;
|
|
1158
|
+
reqObj["secondKeyField"] = this.pageInfo.second_key_field;
|
|
1159
|
+
if (this.tbCell != null) {
|
|
1160
|
+
reqObj["inLineEditColumn"] = this.tbCell;
|
|
1161
|
+
}
|
|
1162
|
+
reqObj["primaryId"] = this.pid;
|
|
1163
|
+
if (pageTP == "jsonForm") {
|
|
1164
|
+
reqObj["whereKeys"] = this.pageInfo.where_clause;
|
|
1165
|
+
reqObj["whereVlus"] = this.whereMap[this.pageInfo.where_clause];
|
|
1166
|
+
}
|
|
1167
|
+
console.log(reqObj);
|
|
1168
|
+
this.header["method"] = "loadAddEdit";
|
|
1169
|
+
let options = ({ headers: new HttpHeaders(this.header) });
|
|
1170
|
+
this.ss
|
|
1171
|
+
.getEditD(reqObj, options)
|
|
1172
|
+
.then((response) => {
|
|
1173
|
+
console.log(response);
|
|
1174
|
+
if (response.status == "SUCCESS" && response.message != "SUCCESS") {
|
|
1175
|
+
this.spinnerService.hide();
|
|
1176
|
+
this.toastr.error(response.message);
|
|
1177
|
+
return;
|
|
1178
|
+
}
|
|
1179
|
+
if (response.status == "SUCCESS") {
|
|
1180
|
+
this.spinnerService.hide();
|
|
1181
|
+
if (this.tbCell != null) {
|
|
1182
|
+
document.getElementById("datamdbtn").click();
|
|
1183
|
+
}
|
|
1184
|
+
this.formFilds = response.formFields;
|
|
1185
|
+
this.formFilds.forEach((element, index) => {
|
|
1186
|
+
if (element.form_field_typ == "tb") {
|
|
1187
|
+
this.getLovList(element.form_field, element.page_item_idn);
|
|
1188
|
+
}
|
|
1189
|
+
if (element.form_field_typ == "s") {
|
|
1190
|
+
this.getLovList(element.form_field, element.page_item_idn);
|
|
1191
|
+
}
|
|
1192
|
+
if (element.form_field_typ == "sb") {
|
|
1193
|
+
let qry = element.help || '';
|
|
1194
|
+
if (qry != '' && element.default_value != "") {
|
|
1195
|
+
if (this.pageInfo.form_nme == 'addressMaster' || this.pageInfo.form_nme == 'accAddressMaster' || this.pageInfo.form_nme == 'accAddressDetails') {
|
|
1196
|
+
let city = data.city_nm || '';
|
|
1197
|
+
let state = data.state_nm || '';
|
|
1198
|
+
let country = data.country_nm || '';
|
|
1199
|
+
if (city != '' && country != '') {
|
|
1200
|
+
let str = city + "#" + country;
|
|
1201
|
+
str = str.toLowerCase();
|
|
1202
|
+
this.getLovCityList(element, str);
|
|
1203
|
+
}
|
|
1204
|
+
}
|
|
1205
|
+
else {
|
|
1206
|
+
qry = qry.replace("#IDN", "'" + element.default_value + "'");
|
|
1207
|
+
this.getLovListdata(element);
|
|
1208
|
+
}
|
|
1209
|
+
}
|
|
1210
|
+
}
|
|
1211
|
+
if (element.form_field_typ == "hd") {
|
|
1212
|
+
element.default_value = this.whereMap[element.form_field];
|
|
1213
|
+
}
|
|
1214
|
+
if (element.form_field_typ == "sq") {
|
|
1215
|
+
this.getSequence(element);
|
|
1216
|
+
}
|
|
1217
|
+
if (element.dta_typ == "sa") {
|
|
1218
|
+
this.getLovList(element.form_field, element.page_item_idn);
|
|
1219
|
+
}
|
|
1220
|
+
if (element.dta_typ == "sr") {
|
|
1221
|
+
this.getLovList(element.form_field, element.page_item_idn);
|
|
1222
|
+
this.dfv = element.default_value;
|
|
1223
|
+
}
|
|
1224
|
+
if (element.form_field_typ == "hc") {
|
|
1225
|
+
element.default_value = element.lov_qry;
|
|
1226
|
+
}
|
|
1227
|
+
// if (element.form_field_typ == 'l') {
|
|
1228
|
+
// element.kv.map(option => ({
|
|
1229
|
+
// value: option.k,
|
|
1230
|
+
// label: option.v
|
|
1231
|
+
// }));
|
|
1232
|
+
// }
|
|
1233
|
+
});
|
|
1234
|
+
this.spinnerService.hide();
|
|
1235
|
+
}
|
|
1236
|
+
else {
|
|
1237
|
+
this.spinnerService.hide();
|
|
1238
|
+
this.toastr.error(response.message);
|
|
1239
|
+
}
|
|
1240
|
+
})
|
|
1241
|
+
.catch((err) => {
|
|
1242
|
+
this.spinnerService.hide();
|
|
1243
|
+
this.toastr.error(err.message);
|
|
1244
|
+
});
|
|
1245
|
+
}
|
|
1246
|
+
getSequence(element) {
|
|
1247
|
+
let reqObj = {};
|
|
1248
|
+
reqObj["seq"] = element.lov_qry;
|
|
1249
|
+
this.header["method"] = "getSeq";
|
|
1250
|
+
let options = ({ headers: new HttpHeaders(this.header) });
|
|
1251
|
+
this.ss
|
|
1252
|
+
.getData(reqObj, options)
|
|
1253
|
+
.then((response) => {
|
|
1254
|
+
if (response.status == "SUCCESS") {
|
|
1255
|
+
var seq = response.seq;
|
|
1256
|
+
element.default_value = seq;
|
|
1257
|
+
}
|
|
1258
|
+
else {
|
|
1259
|
+
this.toastr.error(response.message);
|
|
1260
|
+
}
|
|
1261
|
+
})
|
|
1262
|
+
.catch((err) => {
|
|
1263
|
+
this.toastr.error(err.message);
|
|
1264
|
+
});
|
|
1265
|
+
}
|
|
1266
|
+
getSequence1(seqnme) {
|
|
1267
|
+
var seq = "";
|
|
1268
|
+
debugger;
|
|
1269
|
+
let reqObj = {};
|
|
1270
|
+
reqObj["seq"] = seqnme;
|
|
1271
|
+
this.header["method"] = "getSeq";
|
|
1272
|
+
let options = ({ headers: new HttpHeaders(this.header) });
|
|
1273
|
+
this.ss
|
|
1274
|
+
.getData(reqObj, options)
|
|
1275
|
+
.then((response) => {
|
|
1276
|
+
if (response.status == "SUCCESS") {
|
|
1277
|
+
seq = response.seq;
|
|
1278
|
+
return seq;
|
|
1279
|
+
}
|
|
1280
|
+
else {
|
|
1281
|
+
this.toastr.error(response.message);
|
|
1282
|
+
}
|
|
1283
|
+
})
|
|
1284
|
+
.catch((err) => {
|
|
1285
|
+
this.toastr.error(err.message);
|
|
1286
|
+
});
|
|
1287
|
+
}
|
|
1288
|
+
getLovListdata(tblF) {
|
|
1289
|
+
let reqObj = {};
|
|
1290
|
+
reqObj["page_item_idn"] = tblF.page_item_idn;
|
|
1291
|
+
reqObj["str"] = tblF.default_value;
|
|
1292
|
+
this.header["method"] = "loadCityCountryData";
|
|
1293
|
+
let options = ({ headers: new HttpHeaders(this.header) });
|
|
1294
|
+
this.ss
|
|
1295
|
+
.getData(reqObj, options)
|
|
1296
|
+
.then((response) => {
|
|
1297
|
+
if (response.status == "SUCCESS") {
|
|
1298
|
+
this.lovs = response.kv.map(option => ({
|
|
1299
|
+
value: option.k,
|
|
1300
|
+
label: option.v
|
|
1301
|
+
}));
|
|
1302
|
+
this.sqlArray[tblF.form_field] = this.lovs;
|
|
1303
|
+
if (this.dfv == null)
|
|
1304
|
+
return;
|
|
1305
|
+
if (tblF == "attr") {
|
|
1306
|
+
this.sqlArray[tblF].forEach((element, index) => {
|
|
1307
|
+
this.dfv.forEach(element2 => {
|
|
1308
|
+
if (element.v == element2) {
|
|
1309
|
+
this.sqlArray[tblF].splice(index, 1);
|
|
1310
|
+
return;
|
|
1311
|
+
}
|
|
1312
|
+
});
|
|
1313
|
+
});
|
|
1314
|
+
}
|
|
1315
|
+
}
|
|
1316
|
+
else {
|
|
1317
|
+
this.toastr.error(response.message);
|
|
1318
|
+
}
|
|
1319
|
+
})
|
|
1320
|
+
.catch((err) => {
|
|
1321
|
+
this.toastr.error(err.message);
|
|
1322
|
+
});
|
|
1323
|
+
}
|
|
1324
|
+
getLovList(tblF, page_item_idn) {
|
|
1325
|
+
let reqObj = {};
|
|
1326
|
+
reqObj["page_item_idn"] = page_item_idn;
|
|
1327
|
+
this.header["method"] = "getDataByItemIdn";
|
|
1328
|
+
let options = ({ headers: new HttpHeaders(this.header) });
|
|
1329
|
+
this.ss
|
|
1330
|
+
.getData(reqObj, options)
|
|
1331
|
+
.then((response) => {
|
|
1332
|
+
if (response.status == "SUCCESS") {
|
|
1333
|
+
this.lovs = response.kv.map(option => ({
|
|
1334
|
+
value: option.k,
|
|
1335
|
+
label: option.v
|
|
1336
|
+
}));
|
|
1337
|
+
this.sqlArray[tblF] = this.lovs;
|
|
1338
|
+
if (this.dfv == null)
|
|
1339
|
+
return;
|
|
1340
|
+
if (tblF == "attr") {
|
|
1341
|
+
this.sqlArray[tblF].forEach((element, index) => {
|
|
1342
|
+
this.dfv.forEach(element2 => {
|
|
1343
|
+
if (element.v == element2) {
|
|
1344
|
+
this.sqlArray[tblF].splice(index, 1);
|
|
1345
|
+
return;
|
|
1346
|
+
}
|
|
1347
|
+
});
|
|
1348
|
+
});
|
|
1349
|
+
}
|
|
1350
|
+
}
|
|
1351
|
+
else {
|
|
1352
|
+
this.toastr.error(response.message);
|
|
1353
|
+
}
|
|
1354
|
+
})
|
|
1355
|
+
.catch((err) => {
|
|
1356
|
+
this.toastr.error(err.message);
|
|
1357
|
+
});
|
|
1358
|
+
}
|
|
1359
|
+
getLovCityList(tblF, str) {
|
|
1360
|
+
debugger;
|
|
1361
|
+
let reqObj = {};
|
|
1362
|
+
reqObj["page_item_idn"] = tblF.page_item_idn;
|
|
1363
|
+
reqObj["str"] = str;
|
|
1364
|
+
this.header["method"] = "loadCityCountryData";
|
|
1365
|
+
console.log(JSON.stringify(reqObj));
|
|
1366
|
+
let options = ({ headers: new HttpHeaders(this.header) });
|
|
1367
|
+
this.ss
|
|
1368
|
+
.getData(reqObj, options)
|
|
1369
|
+
.then((response) => {
|
|
1370
|
+
if (response.status == "SUCCESS") {
|
|
1371
|
+
debugger;
|
|
1372
|
+
this.lovs = response.kv.map(option => ({
|
|
1373
|
+
value: option.k,
|
|
1374
|
+
label: option.v
|
|
1375
|
+
}));
|
|
1376
|
+
debugger;
|
|
1377
|
+
this.sqlArray[tblF.form_field] = this.lovs;
|
|
1378
|
+
if (this.lovs.length > 1)
|
|
1379
|
+
tblF.default_value = this.lovs[1].value;
|
|
1380
|
+
}
|
|
1381
|
+
else {
|
|
1382
|
+
this.toastr.error(response.message);
|
|
1383
|
+
}
|
|
1384
|
+
})
|
|
1385
|
+
.catch((err) => {
|
|
1386
|
+
this.toastr.error(err.message);
|
|
1387
|
+
});
|
|
1388
|
+
}
|
|
1389
|
+
DeleteTerms() {
|
|
1390
|
+
this.spinnerService.show();
|
|
1391
|
+
let reqObj = {};
|
|
1392
|
+
reqObj["formNme"] = this.pageInfo.form_nme;
|
|
1393
|
+
reqObj["buyerTermsIdn"] = this.pid;
|
|
1394
|
+
this.header["method"] = "deleteBuyerTerms";
|
|
1395
|
+
console.log(JSON.stringify(reqObj));
|
|
1396
|
+
const options = ({ headers: new HttpHeaders(this.header) });
|
|
1397
|
+
this.cs.load(reqObj, options, "contact/loadContact").then((response) => {
|
|
1398
|
+
if (response.status == "SUCCESS") {
|
|
1399
|
+
this.paraObj["formNme"] = this.navform;
|
|
1400
|
+
this.getPageDefination();
|
|
1401
|
+
this.spinnerService.hide();
|
|
1402
|
+
this.toastr.success(response.message);
|
|
1403
|
+
}
|
|
1404
|
+
else {
|
|
1405
|
+
this.spinnerService.hide();
|
|
1406
|
+
this.toastr.error(response.message);
|
|
1407
|
+
}
|
|
1408
|
+
});
|
|
1409
|
+
}
|
|
1410
|
+
deleteDataList() {
|
|
1411
|
+
debugger;
|
|
1412
|
+
this.spinnerService.show();
|
|
1413
|
+
let reqObj = {};
|
|
1414
|
+
reqObj["formNme"] = this.pageInfo.form_nme;
|
|
1415
|
+
reqObj["pageTyp"] = this.pageInfo.page_typ;
|
|
1416
|
+
reqObj["primaryKey"] = this.pageInfo.primary_key_field;
|
|
1417
|
+
reqObj["primaryId"] = this.pid;
|
|
1418
|
+
reqObj["tableName"] = this.pageInfo.table_name;
|
|
1419
|
+
reqObj["trnsType"] = "DELETE";
|
|
1420
|
+
if (this.pk != "" && this.pv != "") {
|
|
1421
|
+
reqObj["whereKeys"] = this.pk;
|
|
1422
|
+
reqObj["whereVlus"] = "" + this.pv;
|
|
1423
|
+
}
|
|
1424
|
+
this.header["method"] = "save";
|
|
1425
|
+
console.log(reqObj);
|
|
1426
|
+
let options = ({ headers: new HttpHeaders(this.header) });
|
|
1427
|
+
this.ss
|
|
1428
|
+
.deleteData(reqObj, options)
|
|
1429
|
+
.then((response) => {
|
|
1430
|
+
if (response.status == "SUCCESS") {
|
|
1431
|
+
this.getPageDefination();
|
|
1432
|
+
// this.datalist.slice(this.ci, 1);
|
|
1433
|
+
this.deleteclsbtn.nativeElement.click();
|
|
1434
|
+
this.spinnerService.hide();
|
|
1435
|
+
}
|
|
1436
|
+
else {
|
|
1437
|
+
this.spinnerService.hide();
|
|
1438
|
+
this.toastr.error(response.message);
|
|
1439
|
+
}
|
|
1440
|
+
})
|
|
1441
|
+
.catch((err) => {
|
|
1442
|
+
this.spinnerService.hide();
|
|
1443
|
+
this.toastr.error(err.message);
|
|
1444
|
+
});
|
|
1445
|
+
}
|
|
1446
|
+
chkFun(fl, fData) {
|
|
1447
|
+
if (fl.validations == "" || fl.validations == null) {
|
|
1448
|
+
return;
|
|
1449
|
+
}
|
|
1450
|
+
else {
|
|
1451
|
+
if (fl.validations == "validateQuery") {
|
|
1452
|
+
this.validateQuery(fl, fData);
|
|
1453
|
+
}
|
|
1454
|
+
else if (fl.validations == "isUnique") {
|
|
1455
|
+
this.isUnique(fl, fData);
|
|
1456
|
+
}
|
|
1457
|
+
else if (fl.validations == 'setnameprint') {
|
|
1458
|
+
this.setnameprint(fl, fData);
|
|
1459
|
+
}
|
|
1460
|
+
else if (fl.validations == 'setfactor') {
|
|
1461
|
+
this.setfactor(fl, fData);
|
|
1462
|
+
}
|
|
1463
|
+
else if (fl.form_field_typ == "s") {
|
|
1464
|
+
if (fl.validations == null) {
|
|
1465
|
+
return;
|
|
1466
|
+
}
|
|
1467
|
+
let sq = fl.validations.replace(/#QVAL/g, fData);
|
|
1468
|
+
//this.getLovListdata(fl.column_key, sq);
|
|
1469
|
+
}
|
|
1470
|
+
else if (fl.validations == "isExist") {
|
|
1471
|
+
if (fl.validations == null) {
|
|
1472
|
+
return;
|
|
1473
|
+
}
|
|
1474
|
+
this.isExist(fl, fData);
|
|
1475
|
+
}
|
|
1476
|
+
}
|
|
1477
|
+
}
|
|
1478
|
+
setnameprint(fl, fData) {
|
|
1479
|
+
debugger;
|
|
1480
|
+
let nmeIdn = fData;
|
|
1481
|
+
let list = this.sqlArray[fl.form_field] || [];
|
|
1482
|
+
let nmwDtl = list.find(x => x.value == nmeIdn) || '';
|
|
1483
|
+
if (nmwDtl != '') {
|
|
1484
|
+
this.formFilds.forEach(element => {
|
|
1485
|
+
if (element.form_field == 'nme')
|
|
1486
|
+
element.default_value = nmwDtl.label;
|
|
1487
|
+
if (element.form_field == 'print_nme')
|
|
1488
|
+
element.default_value = nmwDtl.label;
|
|
1489
|
+
});
|
|
1490
|
+
}
|
|
1491
|
+
}
|
|
1492
|
+
setfactor(fl, fData) {
|
|
1493
|
+
let fctr = -1;
|
|
1494
|
+
if (fData == 'income' || fData == 'assets')
|
|
1495
|
+
fctr = 1;
|
|
1496
|
+
this.formFilds.forEach(element => {
|
|
1497
|
+
if (element.form_field == 'fctr')
|
|
1498
|
+
element.default_value = fctr;
|
|
1499
|
+
});
|
|
1500
|
+
}
|
|
1501
|
+
isExist(dtaObj, fData) {
|
|
1502
|
+
console.log(fData);
|
|
1503
|
+
if (fData == "" || fData == null)
|
|
1504
|
+
return;
|
|
1505
|
+
let reqObj = {};
|
|
1506
|
+
reqObj["username"] = fData;
|
|
1507
|
+
this.header["method"] = "isUserExist";
|
|
1508
|
+
let options = ({ headers: new HttpHeaders(this.header) });
|
|
1509
|
+
this.ss
|
|
1510
|
+
.validate(reqObj, options, "contact/loadContact")
|
|
1511
|
+
.then((response) => {
|
|
1512
|
+
if (response.message == "") {
|
|
1513
|
+
this.usrisExist = true;
|
|
1514
|
+
this.ico = "check";
|
|
1515
|
+
this.onErr = dtaObj.form_field;
|
|
1516
|
+
// this.flashMessagesService.show(response.message, { cssClass: 'alert-danger', timeout: 3000 });
|
|
1517
|
+
}
|
|
1518
|
+
else {
|
|
1519
|
+
dtaObj.default_value = "";
|
|
1520
|
+
this.usrisExist = true;
|
|
1521
|
+
this.ico = "times";
|
|
1522
|
+
this.spinnerService.hide();
|
|
1523
|
+
this.onErr = dtaObj.form_field;
|
|
1524
|
+
this.toastr.error(response.message);
|
|
1525
|
+
}
|
|
1526
|
+
})
|
|
1527
|
+
.catch((err) => {
|
|
1528
|
+
this.spinnerService.hide();
|
|
1529
|
+
this.toastr.error(err.message);
|
|
1530
|
+
});
|
|
1531
|
+
}
|
|
1532
|
+
submitForm(formVal, btn) {
|
|
1533
|
+
this.onSubmit(formVal, btn);
|
|
1534
|
+
}
|
|
1535
|
+
onSubmit(formVal, btn) {
|
|
1536
|
+
var t = Object.keys(formVal.form.controls).forEach(field => {
|
|
1537
|
+
const control = formVal.form.get(field);
|
|
1538
|
+
control.markAsTouched({ onlySelf: true });
|
|
1539
|
+
});
|
|
1540
|
+
if (formVal.form.valid == true) {
|
|
1541
|
+
this.addedit(formVal.value, btn);
|
|
1542
|
+
}
|
|
1543
|
+
else {
|
|
1544
|
+
return;
|
|
1545
|
+
}
|
|
1546
|
+
}
|
|
1547
|
+
addedit(v, btn) {
|
|
1548
|
+
this.spinnerService.show();
|
|
1549
|
+
if (this.pageInfo.form_nme == 'addressMaster' || this.pageInfo.form_nme == 'accAddressMaster' || this.pageInfo.form_nme == 'accAddressDetails') {
|
|
1550
|
+
let cityStr = v.city_nm || '';
|
|
1551
|
+
let cityStrLst = cityStr.split('#');
|
|
1552
|
+
if (cityStrLst.length == 3) {
|
|
1553
|
+
v.country_nm = cityStrLst[2];
|
|
1554
|
+
v.state_nm = cityStrLst[1];
|
|
1555
|
+
v.city_nm = cityStrLst[0];
|
|
1556
|
+
}
|
|
1557
|
+
else {
|
|
1558
|
+
this.toastr.success("Please check city");
|
|
1559
|
+
return;
|
|
1560
|
+
}
|
|
1561
|
+
if (this.btnName != "Add")
|
|
1562
|
+
v['address_idn'] = this.pid;
|
|
1563
|
+
}
|
|
1564
|
+
let reqObj = {};
|
|
1565
|
+
var pageTP = this.pageInfo.page_typ.trim();
|
|
1566
|
+
reqObj["formNme"] = this.pageInfo.form_nme;
|
|
1567
|
+
reqObj["primaryKey"] = this.pageInfo.primary_key_field;
|
|
1568
|
+
reqObj["pageTyp"] = this.pageInfo.page_typ;
|
|
1569
|
+
reqObj["secondKeyField"] = this.pageInfo.second_key_field;
|
|
1570
|
+
reqObj["primaryId"] = this.btnName == "Add" ? "" : "" + this.pid;
|
|
1571
|
+
reqObj["tableName"] = this.pageInfo.table_name;
|
|
1572
|
+
reqObj["trnsType"] = this.btnName == "Add" ? "ADD" : "EDIT";
|
|
1573
|
+
reqObj["dataTrnsDtl"] = v;
|
|
1574
|
+
if (pageTP == "jsonForm") {
|
|
1575
|
+
reqObj["whereKeys"] = this.pageInfo.where_clause;
|
|
1576
|
+
reqObj["whereVlus"] = this.whereMap[this.pageInfo.where_clause];
|
|
1577
|
+
}
|
|
1578
|
+
console.log(JSON.stringify(reqObj));
|
|
1579
|
+
this.header["method"] = "save";
|
|
1580
|
+
let options = ({ headers: new HttpHeaders(this.header) });
|
|
1581
|
+
this.ss
|
|
1582
|
+
.addData(reqObj, options)
|
|
1583
|
+
.then((response) => {
|
|
1584
|
+
console.log(response);
|
|
1585
|
+
if (response.status == "SUCCESS") {
|
|
1586
|
+
btn.disabled = false;
|
|
1587
|
+
this.tbCell = null;
|
|
1588
|
+
this.searchF = null;
|
|
1589
|
+
this.closebtn.nativeElement.click();
|
|
1590
|
+
// if (this.btnName != 'Add') {
|
|
1591
|
+
// for (const key in this.glbObj) {
|
|
1592
|
+
// if (v.hasOwnProperty(key)) {
|
|
1593
|
+
// this.glbObj[key] = v[key]
|
|
1594
|
+
// }
|
|
1595
|
+
// }
|
|
1596
|
+
// } else {
|
|
1597
|
+
// for (const key in this.datalist[0]) {
|
|
1598
|
+
// if (!v.hasOwnProperty(key)) {
|
|
1599
|
+
// this.glbObj[key] = response._id;
|
|
1600
|
+
// }
|
|
1601
|
+
// if (v.hasOwnProperty(key)) {
|
|
1602
|
+
// this.glbObj[key] = v[key]
|
|
1603
|
+
// }
|
|
1604
|
+
// }
|
|
1605
|
+
// this.datalist.push(this.glbObj);
|
|
1606
|
+
this.getPageDefination();
|
|
1607
|
+
// }
|
|
1608
|
+
this.spinnerService.hide();
|
|
1609
|
+
this.toastr.success(response.message);
|
|
1610
|
+
}
|
|
1611
|
+
else {
|
|
1612
|
+
btn.disabled = false;
|
|
1613
|
+
this.tbCell = null;
|
|
1614
|
+
this.spinnerService.hide();
|
|
1615
|
+
this.toastr.error(response.message);
|
|
1616
|
+
}
|
|
1617
|
+
})
|
|
1618
|
+
.catch((err) => {
|
|
1619
|
+
btn.disabled = false;
|
|
1620
|
+
this.tbCell = null;
|
|
1621
|
+
this.spinnerService.hide();
|
|
1622
|
+
this.toastr.error(err.message);
|
|
1623
|
+
});
|
|
1624
|
+
}
|
|
1625
|
+
validateQuery(tblObj, f) {
|
|
1626
|
+
if (f == "" || f == null)
|
|
1627
|
+
return;
|
|
1628
|
+
let reqObj = {};
|
|
1629
|
+
reqObj["sql"] = f;
|
|
1630
|
+
this.header["method"] = "validateQuery";
|
|
1631
|
+
let options = ({ headers: new HttpHeaders(this.header) });
|
|
1632
|
+
this.ss
|
|
1633
|
+
.validate(reqObj, options, "system/apppages")
|
|
1634
|
+
.then((response) => {
|
|
1635
|
+
if (response.status == "SUCCESS") {
|
|
1636
|
+
this.onErr = "";
|
|
1637
|
+
}
|
|
1638
|
+
else {
|
|
1639
|
+
this.spinnerService.hide();
|
|
1640
|
+
this.onErr = tblObj.form_field;
|
|
1641
|
+
this.toastr.error(response.message);
|
|
1642
|
+
}
|
|
1643
|
+
})
|
|
1644
|
+
.catch((err) => {
|
|
1645
|
+
this.spinnerService.hide();
|
|
1646
|
+
this.toastr.error(err.message);
|
|
1647
|
+
});
|
|
1648
|
+
}
|
|
1649
|
+
isUnique(dtaObj, inpuVal) {
|
|
1650
|
+
if (inpuVal == "" || inpuVal == null)
|
|
1651
|
+
return;
|
|
1652
|
+
let reqObj = {};
|
|
1653
|
+
reqObj["tableName"] = this.pageInfo.table_name;
|
|
1654
|
+
reqObj["whereKeys"] = dtaObj.form_field;
|
|
1655
|
+
reqObj["whereVlus"] = inpuVal;
|
|
1656
|
+
reqObj["primaryKey"] = this.pageInfo.primary_key_field;
|
|
1657
|
+
reqObj["primaryId"] = this.btnName == "Add" ? "" : this.pid;
|
|
1658
|
+
this.header["method"] = "uniqueConQ";
|
|
1659
|
+
let options = ({ headers: new HttpHeaders(this.header) });
|
|
1660
|
+
this.ss
|
|
1661
|
+
.validate(reqObj, options, "system/apppages")
|
|
1662
|
+
.then((response) => {
|
|
1663
|
+
if (response.status == "SUCCESS") {
|
|
1664
|
+
this.onErr = "";
|
|
1665
|
+
}
|
|
1666
|
+
else {
|
|
1667
|
+
this.spinnerService.hide();
|
|
1668
|
+
this.onErr = dtaObj.form_field;
|
|
1669
|
+
this.toastr.error(response.message);
|
|
1670
|
+
}
|
|
1671
|
+
})
|
|
1672
|
+
.catch((err) => {
|
|
1673
|
+
this.spinnerService.hide();
|
|
1674
|
+
this.toastr.error(err.message);
|
|
1675
|
+
});
|
|
1676
|
+
}
|
|
1677
|
+
onPageSizeChange(p) {
|
|
1678
|
+
if (p == "All") {
|
|
1679
|
+
this.pageSize = this.datalist.length;
|
|
1680
|
+
}
|
|
1681
|
+
else {
|
|
1682
|
+
this.pageSize = p;
|
|
1683
|
+
}
|
|
1684
|
+
}
|
|
1685
|
+
setOrder(value, i) {
|
|
1686
|
+
this.showarr = i;
|
|
1687
|
+
if (this.order === value) {
|
|
1688
|
+
this.reverse = !this.reverse;
|
|
1689
|
+
}
|
|
1690
|
+
this.order = value;
|
|
1691
|
+
}
|
|
1692
|
+
editCell(d, tbh) {
|
|
1693
|
+
this.glbObj = d;
|
|
1694
|
+
this.tbCell = tbh;
|
|
1695
|
+
this.title = d.title;
|
|
1696
|
+
this.btnName = "Edit";
|
|
1697
|
+
this.pid = d[this.pkf];
|
|
1698
|
+
this.getEditData(d);
|
|
1699
|
+
}
|
|
1700
|
+
getNameAttr(frmnme, mdl) {
|
|
1701
|
+
let reqObj = {};
|
|
1702
|
+
reqObj["formNme"] = frmnme;
|
|
1703
|
+
reqObj["nmeIdn"] = this.route.snapshot.paramMap.get("subv");
|
|
1704
|
+
reqObj['mdlList'] = mdl;
|
|
1705
|
+
this.header["method"] = "loadNmeAttr";
|
|
1706
|
+
console.log(JSON.stringify(reqObj));
|
|
1707
|
+
let options = ({ headers: new HttpHeaders(this.header) });
|
|
1708
|
+
this.ss
|
|
1709
|
+
.validate(reqObj, options, "system/apppages")
|
|
1710
|
+
.then((response) => {
|
|
1711
|
+
if (response.status == "SUCCESS") {
|
|
1712
|
+
console.log(response);
|
|
1713
|
+
this.uiGrpList = response.uiGrpList;
|
|
1714
|
+
this.uiGrpListDtl = response.uiGrpListDtl;
|
|
1715
|
+
this.attrCListDtl = response.attrCListDtl;
|
|
1716
|
+
this.attrQListDtl = response.attrQListDtl;
|
|
1717
|
+
this.dataDtl = response.dataDtl;
|
|
1718
|
+
console.log(response);
|
|
1719
|
+
}
|
|
1720
|
+
else {
|
|
1721
|
+
this.spinnerService.hide();
|
|
1722
|
+
this.toastr.error(response.message);
|
|
1723
|
+
}
|
|
1724
|
+
})
|
|
1725
|
+
.catch((err) => {
|
|
1726
|
+
this.spinnerService.hide();
|
|
1727
|
+
this.toastr.error(err.message);
|
|
1728
|
+
});
|
|
1729
|
+
}
|
|
1730
|
+
getFiles(nmeIdn) {
|
|
1731
|
+
this.spinnerService.show();
|
|
1732
|
+
this.doceditAction = false;
|
|
1733
|
+
this.docdeleteAction = false;
|
|
1734
|
+
const reqObj = {};
|
|
1735
|
+
reqObj["formNme"] = "documentUploadMaster";
|
|
1736
|
+
reqObj["nmeIdn"] = nmeIdn;
|
|
1737
|
+
this.header["method"] = "loadDocs";
|
|
1738
|
+
const options = ({ headers: new HttpHeaders(this.header) });
|
|
1739
|
+
console.log(JSON.stringify(reqObj));
|
|
1740
|
+
this.uploadService.getFilesList(reqObj, options).then((response) => {
|
|
1741
|
+
if (response.status == "SUCCESS") {
|
|
1742
|
+
console.log(response);
|
|
1743
|
+
this.spinnerService.hide();
|
|
1744
|
+
this.s3details = response.s3details || {};
|
|
1745
|
+
let docActionbtn = response.pageDefination.action || [];
|
|
1746
|
+
docActionbtn.forEach(element => {
|
|
1747
|
+
debugger;
|
|
1748
|
+
if (element.form_field == 'edit')
|
|
1749
|
+
this.doceditAction = true;
|
|
1750
|
+
if (element.form_field == 'delete')
|
|
1751
|
+
this.docdeleteAction = true;
|
|
1752
|
+
});
|
|
1753
|
+
let bucketName = this.s3details["docbucket"] || "";
|
|
1754
|
+
let folderName = this.s3details["docfolder"] || "";
|
|
1755
|
+
folderName = folderName.replace("#DS", Cookie.get("_ds").toUpperCase());
|
|
1756
|
+
this.s3details["docfolder"] = folderName;
|
|
1757
|
+
let s3AccessKey = this.s3details["docS3accessKey"] || "";
|
|
1758
|
+
let s3SecretKey = this.s3details["docS3secretKey"] || "";
|
|
1759
|
+
let s3region = this.s3details["docS3region"] || "";
|
|
1760
|
+
let isvaild = true;
|
|
1761
|
+
if (bucketName == "") {
|
|
1762
|
+
isvaild = false;
|
|
1763
|
+
this.toastr.error("Document Bucket not found");
|
|
1764
|
+
}
|
|
1765
|
+
if (folderName == "") {
|
|
1766
|
+
isvaild = false;
|
|
1767
|
+
this.toastr.error("Document Floder not found");
|
|
1768
|
+
}
|
|
1769
|
+
if (s3AccessKey == "") {
|
|
1770
|
+
isvaild = false;
|
|
1771
|
+
this.toastr.error("Document s3AccessKey not found");
|
|
1772
|
+
}
|
|
1773
|
+
if (s3SecretKey == "") {
|
|
1774
|
+
isvaild = false;
|
|
1775
|
+
this.toastr.error("Document s3SecretKey not found");
|
|
1776
|
+
}
|
|
1777
|
+
if (s3region == "") {
|
|
1778
|
+
isvaild = false;
|
|
1779
|
+
this.toastr.error("Document s3region not found");
|
|
1780
|
+
}
|
|
1781
|
+
if (isvaild) {
|
|
1782
|
+
this.dataDtl = response.dataDtl || {};
|
|
1783
|
+
this.documentUploadList = response.documentUploadDtl.documentUploadList;
|
|
1784
|
+
this.documentUploadList.sort();
|
|
1785
|
+
if (this.documentUploadList.length > 0)
|
|
1786
|
+
this.doctype = this.documentUploadList[0];
|
|
1787
|
+
let doctyp = this.route.snapshot.params["doctyp"] || "";
|
|
1788
|
+
if (doctyp != '')
|
|
1789
|
+
this.doctype = doctyp;
|
|
1790
|
+
this.documentUploadDtl = response.documentUploadDtl;
|
|
1791
|
+
const bucket = new S3({
|
|
1792
|
+
accessKeyId: this.s3details["docS3accessKey"],
|
|
1793
|
+
secretAccessKey: this.s3details["docS3secretKey"],
|
|
1794
|
+
region: s3region
|
|
1795
|
+
});
|
|
1796
|
+
debugger;
|
|
1797
|
+
this.documentUploadList.forEach(doctype => {
|
|
1798
|
+
if (this.dataDtl[doctype] != undefined) {
|
|
1799
|
+
this.dataDtl[doctype].forEach(dtl => {
|
|
1800
|
+
let urlParams = {
|
|
1801
|
+
Bucket: this.s3details["docbucket"],
|
|
1802
|
+
Key: this.s3details["docfolder"] + "/" + dtl["doc_nme"]
|
|
1803
|
+
};
|
|
1804
|
+
bucket.getSignedUrl("getObject", urlParams, function (err, url) {
|
|
1805
|
+
debugger;
|
|
1806
|
+
dtl["signUrl"] = url;
|
|
1807
|
+
});
|
|
1808
|
+
});
|
|
1809
|
+
}
|
|
1810
|
+
});
|
|
1811
|
+
}
|
|
1812
|
+
else {
|
|
1813
|
+
this.documentUploadList = [];
|
|
1814
|
+
}
|
|
1815
|
+
}
|
|
1816
|
+
})
|
|
1817
|
+
.catch((err) => {
|
|
1818
|
+
this.spinnerService.hide();
|
|
1819
|
+
this.toastr.error(err.message);
|
|
1820
|
+
});
|
|
1821
|
+
console.log("documentUploadList", this.documentUploadList);
|
|
1822
|
+
}
|
|
1823
|
+
opendocs(dtl) {
|
|
1824
|
+
let url = dtl.signUrl;
|
|
1825
|
+
window.open(url, '_blank');
|
|
1826
|
+
}
|
|
1827
|
+
async uploadDocs(event) {
|
|
1828
|
+
debugger;
|
|
1829
|
+
this.spinnerService.show();
|
|
1830
|
+
let nmeIdn = this.route.snapshot.paramMap.get("subv");
|
|
1831
|
+
let reqObj = {};
|
|
1832
|
+
reqObj["seq"] = "nme_docs_seq";
|
|
1833
|
+
this.header["method"] = "getSeq";
|
|
1834
|
+
let options = ({ headers: new HttpHeaders(this.header) });
|
|
1835
|
+
let seqDtl = await this.ss.getData(reqObj, options) || {};
|
|
1836
|
+
if (seqDtl['status'] == "SUCCESS") {
|
|
1837
|
+
var seq = seqDtl['seq'];
|
|
1838
|
+
this.selectedFiles = event.target.files;
|
|
1839
|
+
this.file = this.selectedFiles.item(0);
|
|
1840
|
+
let fileName = this.file.name;
|
|
1841
|
+
let ext = fileName.substring(fileName.lastIndexOf(".") + 1);
|
|
1842
|
+
fileName = nmeIdn + "_" + seq + "_" + this.doctype + "." + ext;
|
|
1843
|
+
let uploadFile = await this.uploadFile(this.file, fileName) || '';
|
|
1844
|
+
debugger;
|
|
1845
|
+
if (uploadFile != '') {
|
|
1846
|
+
let reqObj = {};
|
|
1847
|
+
let transdtl = {};
|
|
1848
|
+
transdtl["doc_ext"] = this.file.type;
|
|
1849
|
+
transdtl["doc_typ"] = this.doctype;
|
|
1850
|
+
transdtl["docs_idn"] = seq;
|
|
1851
|
+
transdtl["doc_nme"] = fileName;
|
|
1852
|
+
transdtl["stt"] = "1";
|
|
1853
|
+
reqObj["trnsType"] = "ADD";
|
|
1854
|
+
reqObj["dataTrnsDtl"] = transdtl;
|
|
1855
|
+
reqObj["nmeIdn"] = nmeIdn;
|
|
1856
|
+
this.header["method"] = "saveDocs";
|
|
1857
|
+
console.log(reqObj);
|
|
1858
|
+
let options = ({ headers: new HttpHeaders(this.header) });
|
|
1859
|
+
this.uploadService.saveDoctoDB(reqObj, options).then((response) => {
|
|
1860
|
+
if (response.status == "SUCCESS") {
|
|
1861
|
+
this.getFiles(reqObj['nmeIdn']); //// refrash after doc saved
|
|
1862
|
+
this.spinnerService.hide();
|
|
1863
|
+
this.toastr.success(response.message);
|
|
1864
|
+
}
|
|
1865
|
+
else {
|
|
1866
|
+
this.spinnerService.hide();
|
|
1867
|
+
this.toastr.error(response.message);
|
|
1868
|
+
}
|
|
1869
|
+
})
|
|
1870
|
+
.catch((err) => {
|
|
1871
|
+
this.spinnerService.hide();
|
|
1872
|
+
this.toastr.error(err.message);
|
|
1873
|
+
});
|
|
1874
|
+
}
|
|
1875
|
+
else {
|
|
1876
|
+
this.spinnerService.hide();
|
|
1877
|
+
this.toastr.error("File upload failed");
|
|
1878
|
+
}
|
|
1879
|
+
}
|
|
1880
|
+
else {
|
|
1881
|
+
this.spinnerService.hide();
|
|
1882
|
+
this.toastr.error("document Seq. genaration error");
|
|
1883
|
+
}
|
|
1884
|
+
}
|
|
1885
|
+
uploadFile(file, fileName) {
|
|
1886
|
+
const bucket = new S3({
|
|
1887
|
+
accessKeyId: this.s3details["docS3accessKey"],
|
|
1888
|
+
secretAccessKey: this.s3details["docS3secretKey"],
|
|
1889
|
+
region: this.s3details["docS3region"]
|
|
1890
|
+
});
|
|
1891
|
+
const params = {
|
|
1892
|
+
Bucket: this.s3details["docbucket"],
|
|
1893
|
+
Key: this.s3details["docfolder"] + "/" + fileName,
|
|
1894
|
+
Body: file,
|
|
1895
|
+
ContentType: file.type
|
|
1896
|
+
};
|
|
1897
|
+
debugger;
|
|
1898
|
+
return new Promise(function (resolve, reject) {
|
|
1899
|
+
bucket.upload(params, function (error, result) {
|
|
1900
|
+
if (error) {
|
|
1901
|
+
console.log("There was an error uploading your file: ", error);
|
|
1902
|
+
reject(error);
|
|
1903
|
+
}
|
|
1904
|
+
console.log("Successfully uploaded file.", result);
|
|
1905
|
+
resolve(result);
|
|
1906
|
+
});
|
|
1907
|
+
});
|
|
1908
|
+
}
|
|
1909
|
+
deleteDoc() {
|
|
1910
|
+
this.spinnerService.show();
|
|
1911
|
+
this.DeleteDocsFromS3(this.docDeleteDtl);
|
|
1912
|
+
// let deleteDtl = await this.DeleteDocsFromS3(this.docDeleteDtl) || '';
|
|
1913
|
+
// if (deleteDtl != '') {
|
|
1914
|
+
const reqObj = {};
|
|
1915
|
+
reqObj["docs_idn"] = this.docDeleteDtl['docs_idn'];
|
|
1916
|
+
reqObj["trnsType"] = "DELETE";
|
|
1917
|
+
reqObj["nmeIdn"] = this.route.snapshot.paramMap.get("subv");
|
|
1918
|
+
this.header["method"] = "saveDocs";
|
|
1919
|
+
console.log(reqObj);
|
|
1920
|
+
const options = ({ headers: new HttpHeaders(this.header) });
|
|
1921
|
+
this.uploadService.saveDoctoDB(reqObj, options).then((response) => {
|
|
1922
|
+
if (response.status == "SUCCESS") {
|
|
1923
|
+
this.getFiles(this.route.snapshot.paramMap.get("subv")); //// refrash after doc saved
|
|
1924
|
+
this.spinnerService.hide();
|
|
1925
|
+
this.toastr.success(response.message);
|
|
1926
|
+
}
|
|
1927
|
+
else {
|
|
1928
|
+
this.spinnerService.hide();
|
|
1929
|
+
this.toastr.error(response.message);
|
|
1930
|
+
}
|
|
1931
|
+
}).catch((err) => {
|
|
1932
|
+
this.spinnerService.hide();
|
|
1933
|
+
this.toastr.error(err.message);
|
|
1934
|
+
});
|
|
1935
|
+
// } else {
|
|
1936
|
+
// this.spinnerService.hide();
|
|
1937
|
+
// this.flashMessagesService.show("Error in file deletion", { cssClass: "alert-danger", timeout: 3000 });
|
|
1938
|
+
// }
|
|
1939
|
+
}
|
|
1940
|
+
DeleteDocsFromS3(docDtl) {
|
|
1941
|
+
const bucket = new S3({
|
|
1942
|
+
accessKeyId: this.s3details["docS3accessKey"],
|
|
1943
|
+
secretAccessKey: this.s3details["docS3secretKey"],
|
|
1944
|
+
region: this.s3details["docS3region"]
|
|
1945
|
+
});
|
|
1946
|
+
const params = {
|
|
1947
|
+
Bucket: this.s3details["docbucket"],
|
|
1948
|
+
Key: this.s3details["docfolder"] + "/" + docDtl['doc_nme'],
|
|
1949
|
+
};
|
|
1950
|
+
return new Promise(function (resolve, reject) {
|
|
1951
|
+
bucket.deleteObject(params, function (error, result) {
|
|
1952
|
+
if (error) {
|
|
1953
|
+
console.log("There was an error delete your file: ", error);
|
|
1954
|
+
reject("");
|
|
1955
|
+
}
|
|
1956
|
+
console.log("deleted uploaded file.", result);
|
|
1957
|
+
resolve(result);
|
|
1958
|
+
});
|
|
1959
|
+
});
|
|
1960
|
+
}
|
|
1961
|
+
ConfirmdeleteDoc(docDtl) {
|
|
1962
|
+
this.docDeleteDtl = docDtl;
|
|
1963
|
+
document.getElementById('docdeletebtn').click();
|
|
1964
|
+
}
|
|
1965
|
+
async EditUploadDocs(docDtl, event) {
|
|
1966
|
+
debugger;
|
|
1967
|
+
let deleteDtl = await this.DeleteDocsFromS3(this.docDeleteDtl) || '';
|
|
1968
|
+
debugger;
|
|
1969
|
+
if (deleteDtl != '') {
|
|
1970
|
+
const reqObj = {};
|
|
1971
|
+
reqObj["docs_idn"] = docDtl['docs_idn'];
|
|
1972
|
+
reqObj["trnsType"] = "DELETE";
|
|
1973
|
+
reqObj["nmeIdn"] = this.route.snapshot.paramMap.get("subv");
|
|
1974
|
+
this.header["method"] = "saveDocs";
|
|
1975
|
+
const options = ({ headers: new HttpHeaders(this.header) });
|
|
1976
|
+
let deleteDbDtl = await this.uploadService.saveDoctoDB(reqObj, options);
|
|
1977
|
+
debugger;
|
|
1978
|
+
if (deleteDbDtl['status'] == "SUCCESS") {
|
|
1979
|
+
this.uploadDocs(event);
|
|
1980
|
+
}
|
|
1981
|
+
else {
|
|
1982
|
+
this.toastr.error("Error in file Edit");
|
|
1983
|
+
}
|
|
1984
|
+
}
|
|
1985
|
+
}
|
|
1986
|
+
loadApplication() {
|
|
1987
|
+
this.application = "";
|
|
1988
|
+
this.spinnerService.show();
|
|
1989
|
+
const reqObj = {};
|
|
1990
|
+
reqObj["formNme"] = "contactSearchForm";
|
|
1991
|
+
this.header["method"] = "loadApplications";
|
|
1992
|
+
const options = ({ headers: new HttpHeaders(this.header) });
|
|
1993
|
+
this.cs
|
|
1994
|
+
.load(reqObj, options, "contact/loadContact")
|
|
1995
|
+
.then((response) => {
|
|
1996
|
+
console.log(response);
|
|
1997
|
+
if (response.status == "SUCCESS") {
|
|
1998
|
+
this.applicationList = response.applicationList;
|
|
1999
|
+
this.spinnerService.hide();
|
|
2000
|
+
}
|
|
2001
|
+
else {
|
|
2002
|
+
this.spinnerService.hide();
|
|
2003
|
+
this.toastr.error(response.message);
|
|
2004
|
+
}
|
|
2005
|
+
})
|
|
2006
|
+
.catch((err) => {
|
|
2007
|
+
this.spinnerService.hide();
|
|
2008
|
+
this.toastr.error(err.message);
|
|
2009
|
+
});
|
|
2010
|
+
}
|
|
2011
|
+
loadWebApplication() {
|
|
2012
|
+
this.spinnerService.show();
|
|
2013
|
+
const reqObj = {};
|
|
2014
|
+
reqObj["formNme"] = "contactSearchForm";
|
|
2015
|
+
reqObj["applicationStr"] = "WWW";
|
|
2016
|
+
this.header["method"] = "loadApplications";
|
|
2017
|
+
const options = ({ headers: new HttpHeaders(this.header) });
|
|
2018
|
+
this.cs
|
|
2019
|
+
.load(reqObj, options, "contact/loadContact")
|
|
2020
|
+
.then((response) => {
|
|
2021
|
+
console.log(response);
|
|
2022
|
+
if (response.status == "SUCCESS") {
|
|
2023
|
+
this.applicationList = response.applicationList;
|
|
2024
|
+
if (this.applicationList.length == 2) {
|
|
2025
|
+
this.application = this.applicationList[1].k;
|
|
2026
|
+
this.loadUsrMdl(this.application);
|
|
2027
|
+
}
|
|
2028
|
+
this.spinnerService.hide();
|
|
2029
|
+
}
|
|
2030
|
+
else {
|
|
2031
|
+
this.spinnerService.hide();
|
|
2032
|
+
this.toastr.error(response.message);
|
|
2033
|
+
}
|
|
2034
|
+
})
|
|
2035
|
+
.catch((err) => {
|
|
2036
|
+
this.spinnerService.hide();
|
|
2037
|
+
this.toastr.error(err.message);
|
|
2038
|
+
});
|
|
2039
|
+
}
|
|
2040
|
+
loadUsrMdl(applId) {
|
|
2041
|
+
this.Module = "";
|
|
2042
|
+
this.User = "";
|
|
2043
|
+
this.spinnerService.show();
|
|
2044
|
+
const reqObj = {};
|
|
2045
|
+
reqObj["nmeIdn"] = this.route.snapshot.paramMap.get("subv");
|
|
2046
|
+
reqObj["applId"] = applId;
|
|
2047
|
+
reqObj["formNme"] = "UserModuleList";
|
|
2048
|
+
this.header["method"] = "getUserModuleList";
|
|
2049
|
+
console.log(JSON.stringify(reqObj));
|
|
2050
|
+
const options = ({ headers: new HttpHeaders(this.header) });
|
|
2051
|
+
this.cs
|
|
2052
|
+
.loadMenuRightsUserWise(reqObj, options)
|
|
2053
|
+
.then((response) => {
|
|
2054
|
+
console.log(response);
|
|
2055
|
+
if (response.status == "SUCCESS") {
|
|
2056
|
+
this.userDtls = response.userDtls;
|
|
2057
|
+
if (this.userDtls.length > 0) {
|
|
2058
|
+
this.User = this.userDtls[0]['user_idn'];
|
|
2059
|
+
}
|
|
2060
|
+
this.moduleDtls = response.moduleDtls;
|
|
2061
|
+
if (this.moduleDtls.length > 0) {
|
|
2062
|
+
this.Module = this.moduleDtls[0]['module_idn'];
|
|
2063
|
+
}
|
|
2064
|
+
this.spinnerService.hide();
|
|
2065
|
+
}
|
|
2066
|
+
else {
|
|
2067
|
+
this.spinnerService.hide();
|
|
2068
|
+
this.toastr.error(response.message);
|
|
2069
|
+
}
|
|
2070
|
+
})
|
|
2071
|
+
.catch((err) => {
|
|
2072
|
+
this.spinnerService.hide();
|
|
2073
|
+
this.toastr.error(err.message);
|
|
2074
|
+
});
|
|
2075
|
+
}
|
|
2076
|
+
getUserRights(userId, ModuleId) {
|
|
2077
|
+
this.spinnerService.show();
|
|
2078
|
+
const reqObj = {};
|
|
2079
|
+
reqObj["moduleIdns"] = ModuleId;
|
|
2080
|
+
reqObj["userId"] = userId;
|
|
2081
|
+
this.header["method"] = "getMenuListByModule";
|
|
2082
|
+
console.log(reqObj);
|
|
2083
|
+
const options = ({ headers: new HttpHeaders(this.header) });
|
|
2084
|
+
this.cs
|
|
2085
|
+
.loadMenuRightsUserWise(reqObj, options)
|
|
2086
|
+
.then((response) => {
|
|
2087
|
+
console.log(response);
|
|
2088
|
+
if (response.status == "SUCCESS") {
|
|
2089
|
+
this.totMenu = 0;
|
|
2090
|
+
this.menuList = response.menuList;
|
|
2091
|
+
this.userRightsMenuList = response.userRightsMenuList;
|
|
2092
|
+
this.menuList.forEach(element => {
|
|
2093
|
+
this.totMenu += element.SubMenu.length;
|
|
2094
|
+
});
|
|
2095
|
+
this.spinnerService.hide();
|
|
2096
|
+
}
|
|
2097
|
+
else {
|
|
2098
|
+
this.spinnerService.hide();
|
|
2099
|
+
this.toastr.error(response.message);
|
|
2100
|
+
}
|
|
2101
|
+
})
|
|
2102
|
+
.catch((err) => {
|
|
2103
|
+
this.spinnerService.hide();
|
|
2104
|
+
this.toastr.error(err.message);
|
|
2105
|
+
});
|
|
2106
|
+
}
|
|
2107
|
+
onChangeSubMenu(e, subMenuId, MenuId, UserId, moduleId) {
|
|
2108
|
+
const reqObj = {};
|
|
2109
|
+
reqObj["userId"] = UserId;
|
|
2110
|
+
reqObj["menuIdn"] =
|
|
2111
|
+
e.target.checked == true ? [subMenuId, MenuId] : [subMenuId];
|
|
2112
|
+
reqObj["stt"] = e.target.checked == true ? "1" : "0";
|
|
2113
|
+
reqObj["formNme"] = "saveUserRightMaster";
|
|
2114
|
+
this.header["method"] = "saveUserRights";
|
|
2115
|
+
console.log(reqObj);
|
|
2116
|
+
const options = ({ headers: new HttpHeaders(this.header) });
|
|
2117
|
+
this.cs
|
|
2118
|
+
.saveUserMenuRightsContact(reqObj, options)
|
|
2119
|
+
.then((response) => {
|
|
2120
|
+
console.log(response);
|
|
2121
|
+
if (response.status == "SUCCESS") {
|
|
2122
|
+
this.getUserRights(UserId, moduleId);
|
|
2123
|
+
this.spinnerService.hide();
|
|
2124
|
+
this.toastr.success(response.message);
|
|
2125
|
+
}
|
|
2126
|
+
else {
|
|
2127
|
+
this.spinnerService.hide();
|
|
2128
|
+
this.toastr.error(response.message);
|
|
2129
|
+
}
|
|
2130
|
+
})
|
|
2131
|
+
.catch((err) => {
|
|
2132
|
+
this.spinnerService.hide();
|
|
2133
|
+
this.toastr.error(err.message);
|
|
2134
|
+
});
|
|
2135
|
+
}
|
|
2136
|
+
onChangeMenu(e, menuId, UserId, moduleId) {
|
|
2137
|
+
this.spinnerService.show();
|
|
2138
|
+
let subMenuObj = this.menuList.find(o => o.menu_idn === menuId);
|
|
2139
|
+
this.subMenuIdns.push(menuId);
|
|
2140
|
+
if (subMenuObj.SubMenu.length > 0) {
|
|
2141
|
+
subMenuObj.SubMenu.forEach(element => {
|
|
2142
|
+
this.subMenuIdns.push(element.menu_idn);
|
|
2143
|
+
});
|
|
2144
|
+
}
|
|
2145
|
+
const reqObj = {};
|
|
2146
|
+
reqObj["userId"] = UserId;
|
|
2147
|
+
reqObj["menuIdn"] = this.subMenuIdns;
|
|
2148
|
+
reqObj["stt"] = e.target.checked == true ? "1" : "0";
|
|
2149
|
+
reqObj["formNme"] = "saveUserRightMaster";
|
|
2150
|
+
this.header["method"] = "saveUserRights";
|
|
2151
|
+
console.log(reqObj);
|
|
2152
|
+
const options = ({ headers: new HttpHeaders(this.header) });
|
|
2153
|
+
this.cs
|
|
2154
|
+
.saveUserMenuRightsContact(reqObj, options)
|
|
2155
|
+
.then((response) => {
|
|
2156
|
+
console.log(response);
|
|
2157
|
+
if (response.status == "SUCCESS") {
|
|
2158
|
+
this.getUserRights(UserId, moduleId);
|
|
2159
|
+
this.subMenuIdns = [];
|
|
2160
|
+
this.spinnerService.hide();
|
|
2161
|
+
this.toastr.success(response.message);
|
|
2162
|
+
}
|
|
2163
|
+
else {
|
|
2164
|
+
this.spinnerService.hide();
|
|
2165
|
+
this.toastr.error(response.message);
|
|
2166
|
+
}
|
|
2167
|
+
})
|
|
2168
|
+
.catch((err) => {
|
|
2169
|
+
this.spinnerService.hide();
|
|
2170
|
+
this.toastr.error(err.message);
|
|
2171
|
+
});
|
|
2172
|
+
}
|
|
2173
|
+
onChangeWebSubMenu(e, subMenuId, MenuId, UserId, moduleId) {
|
|
2174
|
+
const reqObj = {};
|
|
2175
|
+
reqObj["userId"] = UserId;
|
|
2176
|
+
reqObj["menuIdn"] =
|
|
2177
|
+
e.target.checked == true ? [subMenuId, MenuId] : [subMenuId];
|
|
2178
|
+
reqObj["stt"] = e.target.checked == true ? "0" : "1";
|
|
2179
|
+
reqObj["formNme"] = "saveUserRightMaster";
|
|
2180
|
+
this.header["method"] = "saveUserRights";
|
|
2181
|
+
console.log(reqObj);
|
|
2182
|
+
const options = ({ headers: new HttpHeaders(this.header) });
|
|
2183
|
+
this.cs
|
|
2184
|
+
.saveUserMenuRightsContact(reqObj, options)
|
|
2185
|
+
.then((response) => {
|
|
2186
|
+
console.log(response);
|
|
2187
|
+
if (response.status == "SUCCESS") {
|
|
2188
|
+
this.getUserRights(UserId, moduleId);
|
|
2189
|
+
this.spinnerService.hide();
|
|
2190
|
+
this.toastr.success(response.message);
|
|
2191
|
+
}
|
|
2192
|
+
else {
|
|
2193
|
+
this.spinnerService.hide();
|
|
2194
|
+
this.toastr.error(response.message);
|
|
2195
|
+
}
|
|
2196
|
+
})
|
|
2197
|
+
.catch((err) => {
|
|
2198
|
+
this.spinnerService.hide();
|
|
2199
|
+
this.toastr.error(err.message);
|
|
2200
|
+
});
|
|
2201
|
+
}
|
|
2202
|
+
onChangeWebMenu(e, menuId, UserId, moduleId) {
|
|
2203
|
+
this.spinnerService.show();
|
|
2204
|
+
let subMenuObj = this.menuList.find(o => o.menu_idn === menuId);
|
|
2205
|
+
this.subMenuIdns.push(menuId);
|
|
2206
|
+
if (subMenuObj.SubMenu.length > 0) {
|
|
2207
|
+
subMenuObj.SubMenu.forEach(element => {
|
|
2208
|
+
this.subMenuIdns.push(element.menu_idn);
|
|
2209
|
+
});
|
|
2210
|
+
}
|
|
2211
|
+
const reqObj = {};
|
|
2212
|
+
reqObj["userId"] = UserId;
|
|
2213
|
+
reqObj["menuIdn"] = this.subMenuIdns;
|
|
2214
|
+
reqObj["stt"] = e.target.checked == true ? "0" : "1";
|
|
2215
|
+
reqObj["formNme"] = "saveUserRightMaster";
|
|
2216
|
+
this.header["method"] = "saveUserRights";
|
|
2217
|
+
console.log(reqObj);
|
|
2218
|
+
const options = ({ headers: new HttpHeaders(this.header) });
|
|
2219
|
+
this.cs
|
|
2220
|
+
.saveUserMenuRightsContact(reqObj, options)
|
|
2221
|
+
.then((response) => {
|
|
2222
|
+
console.log(response);
|
|
2223
|
+
if (response.status == "SUCCESS") {
|
|
2224
|
+
this.getUserRights(UserId, moduleId);
|
|
2225
|
+
this.subMenuIdns = [];
|
|
2226
|
+
this.spinnerService.hide();
|
|
2227
|
+
this.toastr.success(response.message);
|
|
2228
|
+
}
|
|
2229
|
+
else {
|
|
2230
|
+
this.spinnerService.hide();
|
|
2231
|
+
this.toastr.error(response.message);
|
|
2232
|
+
}
|
|
2233
|
+
})
|
|
2234
|
+
.catch((err) => {
|
|
2235
|
+
this.spinnerService.hide();
|
|
2236
|
+
this.toastr.error(err.message);
|
|
2237
|
+
});
|
|
2238
|
+
}
|
|
2239
|
+
onChangeAll(e, UserId, moduleId) {
|
|
2240
|
+
this.spinnerService.show();
|
|
2241
|
+
this.menuList.forEach(element => {
|
|
2242
|
+
this.subMenuIdns.push(element.menu_idn);
|
|
2243
|
+
if (element.SubMenu.length > 0) {
|
|
2244
|
+
element.SubMenu.forEach(subelement => {
|
|
2245
|
+
this.subMenuIdns.push(subelement.menu_idn);
|
|
2246
|
+
});
|
|
2247
|
+
}
|
|
2248
|
+
});
|
|
2249
|
+
const reqObj = {};
|
|
2250
|
+
reqObj["userId"] = UserId;
|
|
2251
|
+
reqObj["menuIdn"] = this.subMenuIdns;
|
|
2252
|
+
reqObj["stt"] = e.target.checked == true ? "1" : "0";
|
|
2253
|
+
reqObj["formNme"] = "saveUserRightMaster";
|
|
2254
|
+
this.header["method"] = "saveUserRights";
|
|
2255
|
+
console.log(reqObj);
|
|
2256
|
+
const options = ({ headers: new HttpHeaders(this.header) });
|
|
2257
|
+
this.cs
|
|
2258
|
+
.saveUserMenuRightsContact(reqObj, options)
|
|
2259
|
+
.then((response) => {
|
|
2260
|
+
console.log(response);
|
|
2261
|
+
if (response.status == "SUCCESS") {
|
|
2262
|
+
this.spinnerService.hide();
|
|
2263
|
+
this.getUserRights(UserId, moduleId);
|
|
2264
|
+
this.subMenuIdns = [];
|
|
2265
|
+
this.toastr.success(response.message);
|
|
2266
|
+
}
|
|
2267
|
+
else {
|
|
2268
|
+
this.spinnerService.hide();
|
|
2269
|
+
this.toastr.error(response.message);
|
|
2270
|
+
}
|
|
2271
|
+
})
|
|
2272
|
+
.catch((err) => {
|
|
2273
|
+
this.spinnerService.hide();
|
|
2274
|
+
this.toastr.error(err.message);
|
|
2275
|
+
});
|
|
2276
|
+
}
|
|
2277
|
+
saveFun(k, v, type) {
|
|
2278
|
+
this.spinnerService.show();
|
|
2279
|
+
let reqObj = {};
|
|
2280
|
+
let subObj = {};
|
|
2281
|
+
let url = "system/apppages";
|
|
2282
|
+
if (type == 'd')
|
|
2283
|
+
v = this.cm.FormatDate(v, 'dd-MMM-yyyy');
|
|
2284
|
+
subObj[k] = v;
|
|
2285
|
+
reqObj["formNme"] = this.addFrmNme;
|
|
2286
|
+
reqObj["dataTrnsDtl"] = subObj;
|
|
2287
|
+
if (this.addFrmNme == 'addtionalDtlMaster') {
|
|
2288
|
+
reqObj["nmeIdn"] = this.route.snapshot.paramMap.get("subv"); //this.whrV;
|
|
2289
|
+
this.header["method"] = "saveNmeAttr";
|
|
2290
|
+
}
|
|
2291
|
+
if (this.addFrmNme == 'ledgerAccAdditinalDetails') {
|
|
2292
|
+
reqObj["ledger_idn"] = this.route.snapshot.paramMap.get("subv"); //this.whrV;
|
|
2293
|
+
reqObj["type"] = "acc_attr";
|
|
2294
|
+
this.header["method"] = "saveLedgerAttr";
|
|
2295
|
+
url = "accounts/accLedger";
|
|
2296
|
+
}
|
|
2297
|
+
if (this.addFrmNme == 'ledgerAddtionalDtlMaster') {
|
|
2298
|
+
reqObj["ledger_idn"] = this.route.snapshot.paramMap.get("subv"); //this.whrV;
|
|
2299
|
+
reqObj["type"] = "attr";
|
|
2300
|
+
this.header["method"] = "saveLedgerAttr";
|
|
2301
|
+
url = "accounts/accLedger";
|
|
2302
|
+
}
|
|
2303
|
+
if (this.addFrmNme == 'accDeleteRulesForm') {
|
|
2304
|
+
reqObj["journal_idn"] = this.route.snapshot.paramMap.get("subv"); //this.whrV;
|
|
2305
|
+
reqObj["type"] = "delete_rules";
|
|
2306
|
+
this.header["method"] = "saveJournalAttr";
|
|
2307
|
+
url = "accounts/accLedger";
|
|
2308
|
+
}
|
|
2309
|
+
if (this.addFrmNme == 'accJournalAttrForm') {
|
|
2310
|
+
reqObj["journal_idn"] = this.route.snapshot.paramMap.get("subv"); //this.whrV;
|
|
2311
|
+
reqObj["type"] = "attr";
|
|
2312
|
+
this.header["method"] = "saveJournalAttr";
|
|
2313
|
+
url = "accounts/accLedger";
|
|
2314
|
+
}
|
|
2315
|
+
if (this.addFrmNme == 'accLoanAttrForm') {
|
|
2316
|
+
reqObj["journal_idn"] = this.route.snapshot.paramMap.get("subv"); //this.whrV;
|
|
2317
|
+
reqObj["type"] = "attr";
|
|
2318
|
+
this.header["method"] = "saveJournalAttr";
|
|
2319
|
+
url = "accounts/accLedger";
|
|
2320
|
+
}
|
|
2321
|
+
if (this.addFrmNme == 'accJournalSettingForm') {
|
|
2322
|
+
reqObj["journal_idn"] = this.route.snapshot.paramMap.get("subv"); //this.whrV;
|
|
2323
|
+
reqObj["type"] = "settings";
|
|
2324
|
+
this.header["method"] = "saveJournalAttr";
|
|
2325
|
+
url = "accounts/accLedger";
|
|
2326
|
+
}
|
|
2327
|
+
console.log(JSON.stringify(reqObj));
|
|
2328
|
+
let options = ({ headers: new HttpHeaders(this.header) });
|
|
2329
|
+
this.cs
|
|
2330
|
+
.load(reqObj, options, url)
|
|
2331
|
+
.then((response) => {
|
|
2332
|
+
if (response.status == "SUCCESS") {
|
|
2333
|
+
this.spinnerService.hide();
|
|
2334
|
+
this.toastr.success(response.message);
|
|
2335
|
+
}
|
|
2336
|
+
else {
|
|
2337
|
+
this.spinnerService.hide();
|
|
2338
|
+
this.toastr.error(response.message);
|
|
2339
|
+
}
|
|
2340
|
+
})
|
|
2341
|
+
.catch((err) => {
|
|
2342
|
+
this.spinnerService.hide();
|
|
2343
|
+
this.toastr.error(err.message);
|
|
2344
|
+
});
|
|
2345
|
+
}
|
|
2346
|
+
// ADD PAGE DISPLAY ATTRIBUTE
|
|
2347
|
+
addAttr(v, a, df) {
|
|
2348
|
+
if (v == undefined)
|
|
2349
|
+
return;
|
|
2350
|
+
this.addText(v, a, df);
|
|
2351
|
+
}
|
|
2352
|
+
addText(v, a, df) {
|
|
2353
|
+
if (df.indexOf(v) != -1) {
|
|
2354
|
+
this.toastr.error("Already Added");
|
|
2355
|
+
return;
|
|
2356
|
+
}
|
|
2357
|
+
else {
|
|
2358
|
+
this.toastr.success("Added");
|
|
2359
|
+
df.push(v);
|
|
2360
|
+
// a.splice(i, 1);
|
|
2361
|
+
this.sortableComponent.writeValue(df);
|
|
2362
|
+
}
|
|
2363
|
+
}
|
|
2364
|
+
remove(df, it, i, ff) {
|
|
2365
|
+
if (df.indexOf(it) != -1) {
|
|
2366
|
+
df.splice(i, 1);
|
|
2367
|
+
this.sqlArray[ff].unshift({ v: it });
|
|
2368
|
+
this.sortableComponent.writeValue(df);
|
|
2369
|
+
}
|
|
2370
|
+
}
|
|
2371
|
+
showHIdePass() {
|
|
2372
|
+
this.estst = !this.estst;
|
|
2373
|
+
if (this.estst) {
|
|
2374
|
+
this.eveC = "fa-eye";
|
|
2375
|
+
this.inputtype = "text";
|
|
2376
|
+
}
|
|
2377
|
+
else {
|
|
2378
|
+
this.eveC = "fa-eye-slash";
|
|
2379
|
+
this.inputtype = "password";
|
|
2380
|
+
}
|
|
2381
|
+
}
|
|
2382
|
+
rediecttokyc() {
|
|
2383
|
+
this.router.navigate(['contact/pending-kyc/pendingKycForm']);
|
|
2384
|
+
}
|
|
2385
|
+
formatDateSCMonthBefore(date, attr) {
|
|
2386
|
+
if (date != undefined && date != "") {
|
|
2387
|
+
let d = new Date(date), month = '' + (d.getMonth()), day = '' + d.getDate(), year = d.getFullYear();
|
|
2388
|
+
d.setDate(d.getDate() - 30);
|
|
2389
|
+
if (month.length < 2)
|
|
2390
|
+
month = '0' + month;
|
|
2391
|
+
if (day.length < 2)
|
|
2392
|
+
day = '0' + day;
|
|
2393
|
+
let newDate = [year, month, day].join('-');
|
|
2394
|
+
this.dataDtl[attr] = newDate;
|
|
2395
|
+
}
|
|
2396
|
+
}
|
|
2397
|
+
ngOnInit() {
|
|
2398
|
+
this.selectedPeople3 = [
|
|
2399
|
+
{ k: "204", v: "nilam" },
|
|
2400
|
+
{ k: "4781", v: "nilamweb" }
|
|
2401
|
+
];
|
|
2402
|
+
let mdlk = JSON.parse(localStorage.getItem("mdlKey"));
|
|
2403
|
+
let mdlKey = Object.keys(mdlk);
|
|
2404
|
+
debugger;
|
|
2405
|
+
this.cUrl = this.router.url;
|
|
2406
|
+
this.header = {
|
|
2407
|
+
clientkey: Cookie.get("_ck"),
|
|
2408
|
+
"Content-Type": "application/json",
|
|
2409
|
+
modulekey: mdlk[this.cUrl.split('/')[1]],
|
|
2410
|
+
loginid: Cookie.get("_logid"),
|
|
2411
|
+
source: "qs"
|
|
2412
|
+
};
|
|
2413
|
+
let companyDtl = JSON.parse(Cookie.get('_accCompany')) || {};
|
|
2414
|
+
let yearDtl = JSON.parse(Cookie.get('_accyear')) || {};
|
|
2415
|
+
let sub_co_idn = (companyDtl["sub_co_idn"] || '').toString();
|
|
2416
|
+
let fin_year_idn = (yearDtl["fin_year_idn"] || '').toString();
|
|
2417
|
+
if (sub_co_idn != '') {
|
|
2418
|
+
this.header['subcomidn'] = sub_co_idn;
|
|
2419
|
+
this.header['yearidn'] = fin_year_idn;
|
|
2420
|
+
}
|
|
2421
|
+
this.route.params.subscribe((params) => {
|
|
2422
|
+
this.subFrmWk = null;
|
|
2423
|
+
this.searchF = null;
|
|
2424
|
+
debugger;
|
|
2425
|
+
this.navform = params["itmform"];
|
|
2426
|
+
this.paraObj["formNme"] = params["itmform"];
|
|
2427
|
+
this.paraObj["whereKeys"] = params["subk"];
|
|
2428
|
+
this.paraObj["whereVlus"] = params["subv"];
|
|
2429
|
+
if (params["itmform"] == 'accDeleteRulesForm') {
|
|
2430
|
+
this.addFrmNme = params["itmform"];
|
|
2431
|
+
let mdl = ['delete_rule'];
|
|
2432
|
+
this.getJournalAttr(this.addFrmNme, mdl, 'delete_rules');
|
|
2433
|
+
}
|
|
2434
|
+
else if (params["itmform"] == 'accJournalAttrForm') {
|
|
2435
|
+
this.addFrmNme = params["itmform"];
|
|
2436
|
+
let mdl = ['jnlacc_attr'];
|
|
2437
|
+
this.getJournalAttr(this.addFrmNme, mdl, 'attr');
|
|
2438
|
+
}
|
|
2439
|
+
else if (params["itmform"] == 'accLoanAttrForm') {
|
|
2440
|
+
this.addFrmNme = params["itmform"];
|
|
2441
|
+
let mdl = ['loan'];
|
|
2442
|
+
this.getJournalAttr(this.addFrmNme, mdl, 'attr');
|
|
2443
|
+
}
|
|
2444
|
+
else if (params["itmform"] == "accJournalSettingForm") {
|
|
2445
|
+
this.addFrmNme = params["itmform"];
|
|
2446
|
+
let mdl = ['jnl_sett'];
|
|
2447
|
+
this.getJournalAttr(this.addFrmNme, mdl, 'settings');
|
|
2448
|
+
}
|
|
2449
|
+
else {
|
|
2450
|
+
this.getPageDefination();
|
|
2451
|
+
this.cLink = 0;
|
|
2452
|
+
this.p = 1;
|
|
2453
|
+
}
|
|
2454
|
+
});
|
|
2455
|
+
}
|
|
2456
|
+
}
|
|
2457
|
+
/** @nocollapse */ /** @nocollapse */ SubformComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: SubformComponent, deps: [{ token: i1.Router }, { token: i1.ActivatedRoute }, { token: i2.ToastrService }, { token: i3.SystemServiceService }, { token: i4.UploadFileService }, { token: i5.NgxSpinnerService }, { token: i6.ContactServiceService }, { token: i7.CommanServiceService }], target: i0.ɵɵFactoryTarget.Component });
|
|
2458
|
+
/** @nocollapse */ /** @nocollapse */ SubformComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: SubformComponent, selector: "app-subform", viewQueries: [{ propertyName: "closebtn", first: true, predicate: ["closebtn"], descendants: true }, { propertyName: "fileOptMapMDclsbtn", first: true, predicate: ["fileOptMapMDclsbtn"], descendants: true }, { propertyName: "productDetailMapclsbtn", first: true, predicate: ["productDetailMapclsbtn"], descendants: true }, { propertyName: "deleteclsbtn", first: true, predicate: ["deleteclsbtn"], descendants: true }, { propertyName: "input", first: true, predicate: ["inputs"], descendants: true }, { propertyName: "sortableComponent", first: true, predicate: SortableComponent, descendants: true }], ngImport: i0, template: "<div class=\"mt\">\r\n <div class=\"panel panel-default\">\r\n <div class=\"panel-heading\">\r\n <h3 class=\"panel-title\">\r\n <span class=\"fa fa-chevron-left cp\" (click)=\"pageBck();\"> Back</span> {{pageInfo?.title}}\r\n <span *ngIf=\"contactName==''\" class=\"f-12\">({{cDt | date:'medium'}})</span>\r\n <span *ngIf=\"contactName!=''\" class=\"f-12\"> for <b> {{contactName}}</b> </span>\r\n </h3>\r\n <button type=\"button\" id=\"addBtn\" class=\"btn btn-info pull-right\" *ngIf=\"addNew?.is_compulsory == 1\"\r\n appAppNoDblClick (click)=\"userAction('', 'add', '', '');f.reset();\">{{addNew?.form_field_title}}</button>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-2\" *ngIf=\"navigation.length > 0\">\r\n <div class=\"panel panel-default\">\r\n <div class=\"panel-body\">\r\n <div class=\"list-group border-bottom\">\r\n <a href=\"javascript:void(0)\" class=\"list-group-item\" [ngClass]=\"{'active' :i == cLink}\"\r\n *ngFor=\"let nav of navigation;let i=index\" (click)=\"navigationFun(nav,i);\">{{nav.form_field_title}}</a>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div [ngClass]=\"navigation.length > 0 ? 'col-md-10' : 'col-md-12'\">\r\n <div class=\"panel panel-default\">\r\n <!-- primery form -->\r\n <div class=\"panel-body\" style=\"overflow-x: scroll\"\r\n *ngIf=\"navform != 'addtionalDtlMaster' && navform != 'documentUploadMaster' && navform != 'menuAccessMaster' && navform != 'termUserAssignForm' && navform != 'setPasswordForm' && navform!='ledgerBankDetails' && navform!='ledgerAccAdditinalDetails' && navform!='ledgerAddtionalDtlMaster' && navform!='accDeleteRulesForm' && navform!='accJournalAttrForm' && navform!='accLoanAttrForm' && navform!='accJournalSettingForm' && navform!='webMenuAccessMaster' \">\r\n <div class=\"row\">\r\n <div class=\"col-sm-6\">\r\n <form class=\"form-inline pull-left\">\r\n <div class=\"form-group\">\r\n <label for=\"ddlPagesize\">Page Size </label>\r\n <select class=\"form-control\" name=\"pageSize\" [(ngModel)]=\"pageSize\"\r\n (change)=\"onPageSizeChange(pageSize)\">\r\n <option value=\"All\">All</option>\r\n <option value=\"10\">10</option>\r\n <option value=\"25\">25</option>\r\n <option value=\"50\">50</option>\r\n <option value=\"100\">100</option>\r\n </select>\r\n </div>\r\n </form>\r\n <button class=\"btn btn-default\" style=\"padding: 4px 15px 4px 20px;margin-left: 10px;\"\r\n data-toggle=\"tooltip\" data-placement=\"right\" title=\"Refresh\" (click)=\"ngOnInit();\">\r\n <span class=\"fa fa-refresh\"></span>\r\n </button>\r\n </div>\r\n <div class=\"col-sm-6\">\r\n <form class=\"form-inline pull-right\">\r\n <div class=\"form-group\">\r\n <label for=\"exampleInputName2\">Search </label>\r\n <input type=\"text\" class=\"form-control\" id=\"exampleInputName2\" name=\"schtxt\" [(ngModel)]=\"searchF\" />\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n <div class=\"table-responsive\" [ngClass]=\"{'table-responsive' :navigation.length > 0}\">\r\n <table class=\"table table-bordered table-hover table-hover-cells\">\r\n <thead>\r\n <tr>\r\n <th>SR No</th>\r\n <th>Action</th>\r\n <th *ngFor=\"let tbh of tblH; let i = index\" (click)=\"setOrder(tbh,i)\">{{tblDesc[tbh]}}\r\n <span [hidden]=\"reverse\" *ngIf=\"showarr === i\">\r\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\r\n </span>\r\n <span [hidden]=\"!reverse\" *ngIf=\"showarr === i\">\r\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\r\n </span>\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <ng-container\r\n *ngFor=\"let data of datalist | searchPipe:searchF | orderBy: order:reverse | paginate: { itemsPerPage: pageSize, currentPage: p }; let i = index\">\r\n <tr [ngClass]=\"{'Inactive':data.stt=='InActive'}\">\r\n <td>{{i + 1}}</td>\r\n <td>\r\n <div class=\"btn-group\">\r\n <a href=\"#\" data-toggle=\"dropdown\" class=\"btn btn-info dropdown-toggle\">Action\r\n <span class=\"caret\"></span>\r\n </a>\r\n <ul class=\"dropdown-menu\" role=\"menu\">\r\n <li *ngFor=\"let action of actions\">\r\n <a href=\"javascript:void(0)\" (click)=\"userAction(data,action.form_field,action, i);\">\r\n {{action.form_field_title}}\r\n </a>\r\n </li>\r\n </ul>\r\n </div>\r\n </td>\r\n <td *ngFor=\"let tbh of tblH; let i=index\" on-mouseover=\"hoveredI=i\" on-mouseleave=\"hoveredI=-1\"\r\n style=\"max-width: 300px; word-break: break-word;\">{{data[tbh]}}\r\n <div class=\"onHoverDiv\"\r\n *ngIf=\"i==hoveredI && page_typ!='jsonForm' && navform!='buyertermsMaster'\">\r\n <ul>\r\n <li (click)=\"editCell(data,tbh);\">\r\n <span class=\"fa fa-pencil\"></span>\r\n </li>\r\n </ul>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-container>\r\n </tbody>\r\n </table>\r\n </div>\r\n <pagination-controls (pageChange)=\"p = $event\" class=\"pull-right\"></pagination-controls>\r\n </div>\r\n <!-- custom form -->\r\n <div class=\"panel-body\"\r\n *ngIf=\"navform == 'addtionalDtlMaster' || navform == 'ledgerAddtionalDtlMaster' || navform == 'ledgerAccAdditinalDetails' || navform=='accDeleteRulesForm' || navform=='accJournalAttrForm' || navform=='accLoanAttrForm' || navform=='accJournalSettingForm'\">\r\n <div class=\"row\">\r\n <div class=\"col-md-12\" *ngFor=\"let ugld of uiGrpList\">\r\n <p class=\"headingCls\">{{uiGrpListDtl[ugld]}}</p>\r\n <div class=\"col-md-6\" *ngFor=\"let formF of uiGrpListDtl[ugld+'#T'];let i = index\">\r\n <div class=\"form-group\" style=\"margin-bottom: 45px !important;\">\r\n <label class=\"col-md-4 control-label\">{{uiGrpListDtl[ugld+'#D'][i]}}</label>\r\n <div class=\"col-md-8\" *ngIf=\"formF == 'n'\">\r\n <div class=\"input-group w-100\">\r\n <input type=\"number\" class=\"form-control\" name=\"{{uiGrpListDtl[ugld+'#V'][i]}}\"\r\n [value]=\"dataDtl[uiGrpListDtl[ugld+'#V'][i]]\" [(ngModel)]=\"dataDtl[uiGrpListDtl[ugld+'#V'][i]]\"\r\n (change)=\"saveFun(uiGrpListDtl[ugld+'#V'][i],dataDtl[uiGrpListDtl[ugld+'#V'][i]],formF)\"\r\n [disabled]=\"uiGrpListDtl[ugld+'#E'][i] == 0 ? false : true\">\r\n </div>\r\n </div>\r\n <div class=\"col-md-8\" *ngIf=\"formF == 't'\">\r\n <div class=\"input-group w-100\">\r\n <input type=\"text\" class=\"form-control\" name=\"{{uiGrpListDtl[ugld+'#V'][i]}}\"\r\n [value]=\"dataDtl[uiGrpListDtl[ugld+'#V'][i]]\" [(ngModel)]=\"dataDtl[uiGrpListDtl[ugld+'#V'][i]]\"\r\n (change)=\"saveFun(uiGrpListDtl[ugld+'#V'][i],dataDtl[uiGrpListDtl[ugld+'#V'][i]],formF)\"\r\n [disabled]=\"uiGrpListDtl[ugld+'#E'][i] == 0 ? false : true\">\r\n </div>\r\n </div>\r\n\r\n\r\n\r\n <!-- added for testing only -->\r\n <div class=\"col-md-8\" *ngIf=\"formF == 'c'\">\r\n <div class=\"input-group w-100\">\r\n <select type=\"text\" class=\"form-control\" name=\"{{uiGrpListDtl[ugld+'#V'][i]}}\"\r\n [(ngModel)]=\"dataDtl[uiGrpListDtl[ugld+'#V'][i]]\"\r\n (change)=\"saveFun(uiGrpListDtl[ugld+'#V'][i],dataDtl[uiGrpListDtl[ugld+'#V'][i]],formF)\">\r\n <option *ngFor=\"let key of attrCListDtl[uiGrpListDtl[ugld+'#V'][i] +'#D'];let j=index\"\r\n value=\"{{attrCListDtl[uiGrpListDtl[ugld+'#V'][i] +'#V'][j]}}\">{{key}}</option>\r\n </select>\r\n <!-- <p *ngFor=\"let a of attrCListDtl[uiGrpListDtl[ugld+'#V'][i] +'#V']\">{{a |json}}:\r\n {{attrCListDtl[uiGrpListDtl[ugld+'#V'][i] +'#V'] |json}}\r\n </p> -->\r\n <!-- <input type=\"text\" class=\"form-control\" name=\"{{uiGrpListDtl[ugld+'#V'][i]}}\" [value]=\"dataDtl[uiGrpListDtl[ugld+'#V'][i]]\"\r\n [(ngModel)]=\"dataDtl[uiGrpListDtl[ugld+'#V'][i]]\" (blur)=\"saveFun(uiGrpListDtl[ugld+'#V'][i],dataDtl[uiGrpListDtl[ugld+'#V'][i]])\"\r\n [disabled]=\"uiGrpListDtl[ugld+'#E'][i] == 0 ? false : true\"> -->\r\n </div>\r\n </div>\r\n <div class=\"col-md-8\" *ngIf=\"formF == 'q'\">\r\n <div class=\"input-group w-100\">\r\n <select type=\"text\" class=\"form-control\" name=\"{{uiGrpListDtl[ugld+'#V'][i]}}\"\r\n [(ngModel)]=\"dataDtl[uiGrpListDtl[ugld+'#V'][i]]\"\r\n (change)=\"saveFun(uiGrpListDtl[ugld+'#V'][i],dataDtl[uiGrpListDtl[ugld+'#V'][i]],formF)\">\r\n <option *ngFor=\"let key of attrQListDtl[uiGrpListDtl[ugld+'#V'][i] +'#D'];let j=index\"\r\n value=\"{{attrQListDtl[uiGrpListDtl[ugld+'#V'][i] +'#D'][j]}}\">{{key}}</option>\r\n </select>\r\n <!-- <p *ngFor=\"let a of attrCListDtl[uiGrpListDtl[ugld+'#V'][i] +'#V']\">{{a |json}}:\r\n {{attrCListDtl[uiGrpListDtl[ugld+'#V'][i] +'#V'] |json}}\r\n </p> -->\r\n <!-- <input type=\"text\" class=\"form-control\" name=\"{{uiGrpListDtl[ugld+'#V'][i]}}\" [value]=\"dataDtl[uiGrpListDtl[ugld+'#V'][i]]\"\r\n [(ngModel)]=\"dataDtl[uiGrpListDtl[ugld+'#V'][i]]\" (blur)=\"saveFun(uiGrpListDtl[ugld+'#V'][i],dataDtl[uiGrpListDtl[ugld+'#V'][i]])\"\r\n [disabled]=\"uiGrpListDtl[ugld+'#E'][i] == 0 ? false : true\"> -->\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-md-8\" *ngIf=\"formF == 'sa'\">\r\n <div class=\"input-group w-100\">\r\n <ng-select style=\"z-index: 5;\" [options]=\"sqlArray[uiGrpListDtl[ugld+'#V'][i]]\" #sfi=\"ngModel\"\r\n [(ngModel)]=\"dataDtl[uiGrpListDtl[ugld+'#V'][i]]\" name=\"{{uiGrpListDtl[ugld+'#V'][i]}}\"\r\n (selected)=\"saveFun(uiGrpListDtl[ugld+'#V'][i],dataDtl[uiGrpListDtl[ugld+'#V'][i]],formF)\"\r\n (filterInputChanged)=\"loadJnlSuggdata($event,uiGrpListDtl[ugld+'#V'][i],uiGrpListDtl[ugld+'#M'][i])\">\r\n </ng-select>\r\n\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-md-8\" *ngIf=\"formF == 'd'\">\r\n <div class=\"input-group w-100\">\r\n <input type=\"date\" class=\"form-control\" name=\"{{uiGrpListDtl[ugld+'#V'][i]}}\"\r\n (change)=\"saveFun(uiGrpListDtl[ugld+'#V'][i],dataDtl[uiGrpListDtl[ugld+'#V'][i]],formF)\"\r\n [value]=\"dataDtl[uiGrpListDtl[ugld+'#V'][i]]\" [(ngModel)]=\"dataDtl[uiGrpListDtl[ugld+'#V'][i]]\"\r\n [disabled]=\"uiGrpListDtl[ugld+'#E'][i] == 0 ? false : true\">\r\n </div>\r\n </div>\r\n <div class=\"col-md-8\" *ngIf=\"formF == 'e'\">\r\n <div class=\"input-group w-100\">\r\n <input type=\"email\" class=\"form-control\" name=\"{{uiGrpListDtl[ugld+'#V'][i]}}\"\r\n (change)=\"saveFun(uiGrpListDtl[ugld+'#V'][i],dataDtl[uiGrpListDtl[ugld+'#V'][i]],formF)\"\r\n [value]=\"dataDtl[uiGrpListDtl[ugld+'#V'][i]]\" [(ngModel)]=\"dataDtl[uiGrpListDtl[ugld+'#V'][i]]\"\r\n (blur)=\"saveFun(uiGrpListDtl[ugld+'#V'][i],dataDtl[uiGrpListDtl[ugld+'#V'][i]],formF)\"\r\n [disabled]=\"uiGrpListDtl[ugld+'#E'][i] == 0 ? false : true\">\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"panel-body form\"\r\n *ngIf=\"navform == 'documentUploadMaster' && navform != 'menuAccessMaster' && navform != 'termUserAssignForm' && navform != 'setPasswordForm'\">\r\n <div class=\"row\">\r\n <form action=\"#\" class=\"form-horizontal form-bordered\">\r\n <div class=\"form-body\">\r\n\r\n <div class=\"col-md-4\">\r\n <select type=\"text\" class=\"form-control\" name=\"doctype\" [(ngModel)]=\"doctype\">\r\n <option *ngFor=\"let docs of documentUploadList\" value=\"{{docs}}\">{{documentUploadDtl[docs]}}\r\n </option>\r\n </select>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <div class=\"fileinput fileinput-new\" data-provides=\"fileinput\">\r\n <span class=\"btn green btn-file\">\r\n <span> Upload </span>\r\n\r\n <input type=\"file\" name=\"...\" (change)=\"uploadDocs($event)\"> </span>\r\n <span class=\"fileinput-filename\"> </span> \r\n <a href=\"javascript:;\" class=\"close fileinput-exists\" data-dismiss=\"fileinput\"> </a>\r\n </div>\r\n <a *ngIf=\"routherDoc!=''\" style=\"cursor:pointer \" (click)=\"rediecttokyc()\"><b>\r\n << back</b></a>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <p class=\"headingCls\">Existing Documents</p>\r\n </div>\r\n <div class=\"col-md-12\">\r\n <table class=\"subDisplayTable\">\r\n <ng-container *ngFor=\"let docs of documentUploadList;let i = index \">\r\n <tr *ngIf=\"dataDtl[docs]!=undefined\">\r\n <td style=\"width: 10%\">{{documentUploadDtl[docs]}}</td>\r\n <td style=\"width: 90%;text-align: left\">\r\n <ng-container *ngFor=\"let docdtl of dataDtl[docs]\">\r\n <div class=\"fileinput fileinput-new\" *ngIf=\"doceditAction\" data-provides=\"fileinput\">\r\n <span class=\"btn-file\">\r\n <i class=\"fa fa-edit\" tooltip=\"Edit Document\" style=\"font-size:20px\"> </i>\r\n\r\n <input type=\"file\" name=\"...\" (change)=\"EditUploadDocs(docdtl,$event)\"> </span>\r\n <span class=\"fileinput-filename\"> </span> \r\n <a href=\"javascript:;\" class=\"close fileinput-exists\" data-dismiss=\"fileinput\"> </a>\r\n </div>\r\n\r\n \r\n <a><i class=\"fa fa-trash-o\" *ngIf=\"docdeleteAction\" (click)=\"ConfirmdeleteDoc(docdtl)\"\r\n style=\"font-size:20px;cursor: pointer\"> </i> </a> \r\n <a (click)=\"opendocs(docdtl)\"> <i class=\"fa fa-file-o\" style=\"font-size:20px\"> </i> </a>\r\n | \r\n </ng-container>\r\n\r\n </td>\r\n </tr>\r\n </ng-container>\r\n </table>\r\n </div>\r\n\r\n </div>\r\n\r\n\r\n\r\n\r\n </div>\r\n <div class=\"panel-body\"\r\n *ngIf=\"navform != 'documentUploadMaster' && navform == 'menuAccessMaster' && navform != 'termUserAssignForm' && navform != 'setPasswordForm' \">\r\n <div class=\"row\">\r\n <div class=\"col-md-2\">\r\n <div class=\"form-group\">\r\n <label class=\"control-label\" style=\"padding-left: 2px;\">Application</label>\r\n <select class=\"form-control\" [(ngModel)]=\"application\" name=\"User\" (change)=\"loadUsrMdl(application)\">\r\n <option *ngFor=\"let app of applicationList\" value=\"{{app.k}}\">{{app.v}}</option>\r\n </select>\r\n </div>\r\n </div>\r\n <div class=\"col-md-2\" *ngIf=\"userDtls.length>0\">\r\n <div class=\"form-group\">\r\n <label class=\"control-label\" style=\"padding-left: 2px;\">User</label>\r\n <select class=\"form-control\" [(ngModel)]=\"User\" name=\"User\">\r\n <option *ngFor=\"let lov of userDtls\" value=\"{{lov.user_idn}}\">{{lov.username}}</option>\r\n </select>\r\n </div>\r\n </div>\r\n <div class=\"col-md-2\" *ngIf=\"moduleDtls.length>0 && userDtls.length >0 \">\r\n <div class=\"form-group\">\r\n <label class=\"control-label\" style=\"padding-left: 2px;\">Module</label>\r\n <select class=\"form-control\" [(ngModel)]=\"Module\" name=\"Module\">\r\n <option *ngFor=\"let lov of moduleDtls\" value=\"{{lov.module_idn}}\">{{lov.print}}</option>\r\n </select>\r\n </div>\r\n </div>\r\n <div class=\"col-md-2 \">\r\n <button type=\"button\" id=\"addBtn\" class=\"btn btn-info\" style=\"margin-top: 23px;\"\r\n (click)=\"getUserRights(User,Module)\">Assign\r\n Rights\r\n </button>\r\n </div>\r\n </div>\r\n <div style=\"padding: 0 10px;\" *ngIf=\"menuList.length>0\">\r\n <div style=\"border:1px solid #e5e5e5;margin-top: 30px\">\r\n <div class=\"row\">\r\n <div class=\"panel panel-default\" style=\"margin-bottom: 25px;\">\r\n <div class=\"panel-heading\" style=\"padding: 0px;\">\r\n <h3 class=\"panel-title\" style=\"padding: 8px; font-size: 14px;\">Users</h3>\r\n <div class=\"col-md-2 chkAll\" style=\"margin: 0px;\">\r\n <div class=\"form-group\" style=\"padding: 10px;\">\r\n <div class=\"col-md-3\">\r\n <label class=\"switch\">\r\n <input type=\"checkbox\" class=\"switch\" name=\"chkAll\" id=\"chkAll\"\r\n (change)=\"onChangeAll($event,User,Module)\"\r\n [checked]=\"(false !== (userRightsMenuList.length == (menuList.length + totMenu)) ? 'checked' : '')\">\r\n <span></span>\r\n </label>\r\n </div>\r\n <label class=\"col-md-4 control-label text-left\" style=\"padding-top: 8px;\r\n padding-left: 40px;\">All\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <form class=\"form-horizontal\">\r\n <div class=\"col-md-12\" *ngFor=\"let mdl of menuList;let i=index\">\r\n <div class=\"form-group\">\r\n <div class=\"col-md-1\">\r\n <label class=\"switch\">\r\n <input type=\"checkbox\" class=\"switch\" name=\"chkMenu\" id=\"chkMenu{{mdl.menu_idn}}\"\r\n (change)=\"onChangeMenu($event,mdl.menu_idn,User,Module)\"\r\n [checked]=\"(false !== userRightsMenuList.includes(mdl?.menu_idn) ? 'checked' : '')\">\r\n <span></span>\r\n </label>\r\n </div>\r\n <label class=\"col-md-2 control-label text-left\" style=\"padding-top: 3px;\">{{mdl.menu}}</label>\r\n </div>\r\n <div class=\"col-md-12\" *ngIf=\"mdl.SubMenu.length > 0\">\r\n <div class=\"form-group\" *ngFor=\"let smdl of mdl.SubMenu\">\r\n <div class=\"col-md-1\" style=\"margin-left:10px;padding-left: 60px;\">\r\n <label class=\"switch\">\r\n <input type=\"checkbox\" class=\"switch\" name=\"chkSubMenu\" id=\"chkSubMenu{{smdl.menu_idn}}\"\r\n (change)=\"onChangeSubMenu($event,smdl.menu_idn,mdl.menu_idn,User,Module)\"\r\n [checked]=\"( false !== userRightsMenuList.includes(smdl?.menu_idn) ? 'checked' : '')\">\r\n <span></span>\r\n </label>\r\n </div>\r\n <label class=\"col-md-4 control-label text-left\"\r\n style=\"padding-top: 8px; font-weight: 100;padding-left: 40px;\"> {{smdl.hdr}}</label>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"panel-body\" *ngIf=\"navform == 'webMenuAccessMaster'\">\r\n <div class=\"row\">\r\n <div class=\"col-md-2\">\r\n <div class=\"form-group\">\r\n <label class=\"control-label\" style=\"padding-left: 2px;\">Application</label>\r\n <select class=\"form-control\" [(ngModel)]=\"application\" name=\"User\" (change)=\"loadUsrMdl(application)\">\r\n <option *ngFor=\"let app of applicationList\" value=\"{{app.k}}\">{{app.v}}</option>\r\n </select>\r\n </div>\r\n </div>\r\n <div class=\"col-md-2\" *ngIf=\"userDtls.length>0\">\r\n <div class=\"form-group\">\r\n <label class=\"control-label\" style=\"padding-left: 2px;\">User</label>\r\n <select class=\"form-control\" [(ngModel)]=\"User\" name=\"User\">\r\n <option *ngFor=\"let lov of userDtls\" value=\"{{lov.user_idn}}\">{{lov.username}}</option>\r\n </select>\r\n </div>\r\n </div>\r\n <div class=\"col-md-2\" *ngIf=\"moduleDtls.length>0 && userDtls.length >0 \">\r\n <div class=\"form-group\">\r\n <label class=\"control-label\" style=\"padding-left: 2px;\">Module</label>\r\n <select class=\"form-control\" [(ngModel)]=\"Module\" name=\"Module\">\r\n <option *ngFor=\"let lov of moduleDtls\" value=\"{{lov.module_idn}}\">{{lov.print}}</option>\r\n </select>\r\n </div>\r\n </div>\r\n <div class=\"col-md-2 \">\r\n <button type=\"button\" id=\"addBtn\" class=\"btn btn-info\" style=\"margin-top: 23px;\"\r\n (click)=\"getUserRights(User,Module)\">Assign\r\n Rights\r\n </button>\r\n </div>\r\n </div>\r\n <div style=\"padding: 0 10px;\" *ngIf=\"menuList.length>0\">\r\n <div style=\"border:1px solid #e5e5e5;margin-top: 30px\">\r\n <div class=\"row\">\r\n <div class=\"panel panel-default\" style=\"margin-bottom: 25px;\">\r\n <div class=\"panel-heading\" style=\"padding: 0px;\">\r\n <h3 class=\"panel-title\" style=\"padding: 8px; font-size: 14px;\">Users</h3>\r\n <div class=\"col-md-2 chkAll\" style=\"margin: 0px;\">\r\n <div class=\"form-group\" style=\"padding: 10px;\">\r\n <div class=\"col-md-3\">\r\n <label class=\"switch\">\r\n <input type=\"checkbox\" class=\"switch\" name=\"chkAll\" id=\"chkAll\"\r\n (change)=\"onChangeAll($event,User,Module)\"\r\n [checked]=\"(false !== (userRightsMenuList.length == (menuList.length + totMenu)) ? 'checked' : '')\">\r\n <span></span>\r\n </label>\r\n </div>\r\n <label class=\"col-md-4 control-label text-left\" style=\"padding-top: 8px;\r\n padding-left: 40px;\">All\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <form class=\"form-horizontal\">\r\n <div class=\"col-md-12\" *ngFor=\"let mdl of menuList;let i=index\">\r\n <div class=\"form-group\">\r\n <div class=\"col-md-1\">\r\n <label class=\"switch\">\r\n <input type=\"checkbox\" class=\"switch\" name=\"chkMenu\" id=\"chkMenu{{mdl.menu_idn}}\"\r\n (change)=\"onChangeWebMenu($event,mdl.menu_idn,User,Module)\"\r\n [checked]=\"(false == userRightsMenuList.includes(mdl?.menu_idn) ? 'checked' : '')\">\r\n <span></span>\r\n </label>\r\n </div>\r\n <label class=\"col-md-2 control-label text-left\" style=\"padding-top: 3px;\">{{mdl.menu}}</label>\r\n </div>\r\n <div class=\"col-md-12\" *ngIf=\"mdl.SubMenu.length > 0\">\r\n <div class=\"form-group\" *ngFor=\"let smdl of mdl.SubMenu\">\r\n <div class=\"col-md-1\" style=\"margin-left:10px;padding-left: 60px;\">\r\n <label class=\"switch\">\r\n <input type=\"checkbox\" class=\"switch\" name=\"chkSubMenu\" id=\"chkSubMenu{{smdl.menu_idn}}\"\r\n (change)=\"onChangeWebSubMenu($event,smdl.menu_idn,mdl.menu_idn,User,Module)\"\r\n [checked]=\"( false == userRightsMenuList.includes(smdl?.menu_idn) ? 'checked' : '')\">\r\n <span></span>\r\n </label>\r\n </div>\r\n <label class=\"col-md-4 control-label text-left\"\r\n style=\"padding-top: 8px; font-weight: 100;padding-left: 40px;\"> {{smdl.hdr}}</label>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"panel-body\" style=\"background: #fff;min-height: 550px;\"\r\n *ngIf=\"navform != 'addtionalDtlMaster' && navform != 'documentUploadMaster' && navform != 'menuAccessMaster' && navform == 'termUserAssignForm' && navform != 'setPasswordForm' \">\r\n <div class=\"row\" style=\"margin-top: 10px;\">\r\n <div class=\"col-md-2\">\r\n <div class=\"form-group\">\r\n <label class=\"control-label\">Terms</label>\r\n </div>\r\n </div>\r\n <div class=\"col-md-1\" style=\"margin-left: 85px;\">\r\n <div class=\"form-group\">\r\n <label class=\"control-label\">Users</label>\r\n </div>\r\n </div>\r\n </div>\r\n <ng-container *ngFor=\"let term of termsList; let i=index;\">\r\n <div class=\"row\">\r\n <div class=\"col-md-3\">\r\n <div class=\"form-group\">\r\n\r\n <label for=\"{{term.buyer_terms_idn}}\" class=\"control-label\"\r\n style=\"padding: 10px;\">{{term.dsc}}</label>\r\n </div>\r\n </div>\r\n <div class=\"col-md-3\" *ngIf=\"term.userIdnList != undefined\">\r\n <div class=\"form-group w-100\">\r\n <div class=\"input-group w-100\">\r\n\r\n <!-- <ng-select [items]=\"applUserList\" [multiple]=\"true\" [addTag]=\"addTag\" (change)=\"onchaneVals(null,term.buyer_terms_idn,term.userIdnList)\"\r\n bindLabel=\"v\" bindValue=\"k\" name=\"{{term ?.buyer_terms_idn}}\" [(ngModel)]=\"term.userIdnList\">\r\n </ng-select> -->\r\n <ng-select placeholder=\"Select user\" [options]=\"term.TermUserList\" [(ngModel)]=\"term.userIdnList\"\r\n (deselected)=\"onchangeUserList($event,term,'delete')\"\r\n (selected)=\"onchangeUserList($event,term,'add')\" name=\"status\" [multiple]=\"true\"\r\n [allowClear]=\"true\">\r\n <ng-template #optionTemplate let-option=\"option\">\r\n <div class=\"famfamfam-flags {{option?.value}}\"></div>\r\n {{option?.label}}\r\n </ng-template>\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\"></div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"panel-body\" style=\"background: #fff;min-height: 550px;\"\r\n *ngIf=\"navform != 'addtionalDtlMaster' && navform != 'documentUploadMaster' && navform != 'menuAccessMaster' && navform != 'termUserAssignForm' && navform == 'setPasswordForm' \">\r\n <div class=\"row\" style=\"margin-top: 10px;\">\r\n <div class=\"col-md-12\">\r\n <p class=\"headingCls\">Change User Password</p>\r\n </div>\r\n <div class=\"col-md-2\">\r\n <div class=\"form-group\">\r\n <label class=\"control-label\" style=\"padding: 8px;\">Username</label>\r\n </div>\r\n </div>\r\n <div class=\"col-md-1\" style=\"margin-left: 85px;\">\r\n <div class=\"form-group\">\r\n <label class=\"control-label\" style=\"padding: 8px;\">Password</label>\r\n </div>\r\n </div>\r\n </div>\r\n <ng-container *ngFor=\"let user of userDetails; let i=index;\">\r\n <div class=\"row\">\r\n <div class=\"col-md-3\">\r\n <div class=\"form-group\">\r\n <label class=\"control-label\" style=\"padding: 10px;font-weight: normal;\">{{user?.username}}</label>\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <div class=\"form-group w-100\">\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"user.password\" [value]=\"user?.password\" />\r\n <!-- (blur)=\"changePswd($event,user.userIdn)\" -->\r\n </div>\r\n </div>\r\n <div class=\"col-md-3\">\r\n <div class=\"form-group\">\r\n <button type=\"submit\" class=\"btn btn-success\" (click)=\"changePassword(user)\">save</button>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <!-- <button type=\"submit\" class=\"btn btn-success\" (click)=\"saveAppUserterms(applUsrLst)\">save</button> -->\r\n </div>\r\n <div class=\"panel-body\" style=\"background: #fff;min-height: 550px;\" *ngIf=\"navform=='ledgerBankDetails'\">\r\n <div class=\"row\">\r\n <div class=\"col-md-12\" style=\"margin:5px\">\r\n <div class=\"form-group w-100\">\r\n <label class=\"col-md-2 control-label\">Bank</label>\r\n <div class=\"col-md-4\">\r\n <ng-select placeholder=\"Select Bank\" [options]=\"bankList\" [(ngModel)]=\"bank\" name=\"bank\"\r\n (selected)=\"getBankBranch(bank)\" (filterInputChanged)=\"ledgerBankDetails($event)\"\r\n [allowClear]=\"true\">\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12\" style=\"margin:5px\">\r\n <div class=\"form-group w-100\">\r\n <label class=\"col-md-2 control-label\">Branch Details</label>\r\n <div class=\"col-md-4\">\r\n <select name=\"branch\" (change)=\"selectBranch(branch)\" [(ngModel)]=\"branch\" class=\"form-control\">\r\n <option value=\"\">Select branch</option>\r\n <option *ngFor=\"let bnkDtl of bankDtlList\" [ngValue]=\"bnkDtl.nme_idn\">{{bnkDtl.person_nme}}</option>\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12\" *ngIf=\"selectBranchAddress!=''\" style=\"margin:5px\">\r\n <div class=\"form-group w-100\">\r\n <label class=\"col-md-2 control-label\"> </label>\r\n <div class=\"col-md-4\">\r\n <div class=\"col-md-3\">Address:</div>\r\n <div class=\"col-md-9\">{{selectBranchAddress}}</div>\r\n <div class=\"col-md-3\">IFSC Code:</div>\r\n <div class=\"col-md-9\">{{selectIfsc}}</div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12\" style=\"margin:5px\">\r\n <div class=\"form-group w-100\">\r\n <label class=\"col-md-2 control-label\">Account Type</label>\r\n <div class=\"col-md-4\">\r\n <select name=\"accountType\" [(ngModel)]=\"accountType\" class=\"form-control\">\r\n <option value=\"current\">Current</option>\r\n <option value=\"savings\">Savings</option>\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12\" style=\"margin:5px\">\r\n <div class=\"form-group w-100\">\r\n <label class=\"col-md-2 control-label\">Account No</label>\r\n <div class=\"col-md-4\">\r\n <textarea class=\"form-control\" cols=\"45\" rows=\"2\" name=\"accountno\" [(ngModel)]=\"accountno\"></textarea>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12\" style=\"margin:5px\">\r\n <div class=\"form-group w-100\">\r\n <div class=\"col-md-2\"> </div>\r\n <div class=\"col-md-4\">\r\n <button type=\"button\" *ngIf=\"editbank_dtl_idn==''\" (click)=\"SaveLedgerBank()\"\r\n class=\"btn btn-success\">Add</button>\r\n <button type=\"button\" *ngIf=\"editbank_dtl_idn!=''\" (click)=\"SaveLedgerBank()\"\r\n class=\"btn btn-success\">Edit</button>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"row\" *ngIf=\"exitBankDtlList.length>0\">\r\n <div class=\"col-md-1 pull-left\">\r\n \r\n </div>\r\n <div class=\"col-md-6 pull-right\">\r\n <form class=\"form-inline pull-right\">\r\n <div class=\"form-group\">\r\n <label for=\"exampleInputName2\">Search </label>\r\n <input type=\"text\" class=\"form-control\" id=\"exampleInputName2\" name=\"searchF\" [(ngModel)]=\"searchF\" />\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n <div class=\"row\" *ngIf=\"exitBankDtlList.length>0\">\r\n <div class=\"col-md-12\">\r\n <table class=\"displayTable\">\r\n <thead>\r\n <th>Actions</th>\r\n <th>Account Type</th>\r\n <th>Account No</th>\r\n <th>Name</th>\r\n <th>Branch</th>\r\n <th>Address</th>\r\n <th>IFSC Code</th>\r\n </thead>\r\n <tbody>\r\n <ng-container *ngFor=\"let bankdtl of exitBankDtlList ; let i = index\">\r\n <tr [ngClass]=\"{'even':i%2==0,'odd':i%2==1}\">\r\n <td> <i class=\"fa fa-edit\" (click)=\"loadEditBankDtl(bankdtl)\" tooltip=\"Edit Bank\"\r\n style=\"font-size:15px;cursor: pointer\"> </i> |\r\n <i class=\"fa fa-trash-o\" (click)=\"ConfirmDeleteLedgerBank(bankdtl)\" tooltip=\"Delete Bank\"\r\n style=\"font-size:15px;cursor: pointer\"> </i>\r\n <td>{{bankdtl.accountType}}</td>\r\n <td>{{bankdtl.accountNo}}</td>\r\n <td>{{bankdtl.bankname}}</td>\r\n <td>{{bankdtl.branchname}}</td>\r\n <td>{{bankdtl.address}}</td>\r\n <td>{{bankdtl.ifsc}}</td>\r\n </tr>\r\n </ng-container>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"modal\" id=\"datamodal\" role=\"dialog\" aria-labelledby=\"defModalHead\" aria-hidden=\"true\"\r\n data-backdrop=\"static\" data-keyboard=\"false\">\r\n <div class=\"modal-dialog\">\r\n <div class=\"modal-content\">\r\n <form class=\"form-horizontal\" #f=\"ngForm\" name=\"appForm\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\" (click)=\"closeNull();\" #closebtn>\r\n <span aria-hidden=\"true\">×</span>\r\n <span class=\"sr-only\">Close</span>\r\n </button>\r\n <h4 class=\"modal-title\" id=\"defModalHead\">{{btnName}} Record</h4>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"row\">\r\n <div class=\"col-md-12\" *ngFor=\"let fl of formFilds | orderByPipe: 'srt': 'asc'\">\r\n <div class=\"form-group\"\r\n *ngIf=\"fl?.form_field_typ == 't' && fl?.is_hidden == 0 && fl?.dta_typ =='c' || fl?.dta_typ =='t'\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <input type=\"text\" class=\"form-control posrel\" name=\"{{fl?.form_field}}\"\r\n [value]=\"fl?.default_value\" [(ngModel)]=\"fl.default_value\" #textInput=\"ngModel\"\r\n (blur)=\"chkFun(fl,fl.default_value);\" [required]=\"fl?.is_compulsory == '1'\" />\r\n <span class=\"fa fa-{{ico}} eye\" [ngStyle]=\"{'color':ico == 'check' ? 'green' : 'red' }\"\r\n *ngIf=\"usrisExist && onErr == fl.form_field \"></span>\r\n </div>\r\n <div *ngIf=\"textInput.invalid && (textInput.dirty || textInput.touched)\"\r\n class=\"alert alert-danger ca\">\r\n <div *ngIf=\"textInput.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\" *ngIf=\"fl?.form_field_typ == 't' && fl?.is_hidden == 0 && fl?.dta_typ =='n'\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <input type=\"number\" class=\"form-control\" name=\"{{fl?.form_field}}\" [value]=\"fl?.default_value\"\r\n [(ngModel)]=\"fl.default_value\" #numberInput=\"ngModel\" [required]=\"fl?.is_compulsory==1\">\r\n </div>\r\n <div *ngIf=\"numberInput.invalid && (numberInput.dirty || numberInput.touched)\"\r\n class=\"alert alert-danger ca\">\r\n <div *ngIf=\"numberInput.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n <div *ngIf=\"numberInput.invalid && (numberInput.dirty || numberInput.touched)\"\r\n class=\"alert alert-danger ca\">\r\n <div *ngIf=\"numberInput.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\"\r\n *ngIf=\"fl?.form_field_typ == 'pw' && fl?.is_hidden == 0 && fl?.dta_typ =='pw'\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <input type=\"{{inputtype}}\" class=\"form-control posrel\" name=\"{{fl?.form_field}}\"\r\n [value]=\"fl?.default_value\" [(ngModel)]=\"fl.default_value\" #passInput=\"ngModel\"\r\n [required]=\"fl?.is_compulsory == '1'\" />\r\n <span class=\"fa {{eveC}} eye\" (click)=\"showHIdePass();\"></span>\r\n </div>\r\n <div *ngIf=\"passInput.invalid && (passInput.dirty || passInput.touched)\"\r\n class=\"alert alert-danger ca\">\r\n <div *ngIf=\"passInput.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\" *ngIf=\"fl?.form_field_typ == 't' && fl?.dta_typ =='a'\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n\r\n <!-- <ng-select [items]=\"[]\" [addTag]=\"true\" bindValue=\"label\" [multiple]=\"true\" name=\"{{fl?.form_field}}\"\r\n [(ngModel)]=\"fl.default_value\" [isOpen]=\"false\" #afield=\"ngModel\" [required]=\"fl?.is_compulsory == '1'\">\r\n </ng-select> -->\r\n\r\n <!-- <ng-select style=\"z-index: 5;\" [options]=\"[]\" [(ngModel)]=\"fl.default_value\" name=\"{{fl?.form_field}}\"\r\n #afield=\"ngModel\" [required]=\"fl?.is_compulsory == '1'\">\r\n </ng-select> last commented-->\r\n\r\n <tag-input [(ngModel)]=\"fl.default_value\" name=\"{{fl?.form_field}}\" [modelAsStrings]=\"true\"\r\n [allowDupes]=\"true\" [editable]='true'></tag-input>\r\n\r\n\r\n </div>\r\n <!-- <div *ngIf=\"afield.invalid && (afield.dirty || afield.touched)\" class=\"alert alert-danger ca\">\r\n <div *ngIf=\"afield.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n </div> -->\r\n </div>\r\n </div>\r\n <div class=\"form-group\" *ngIf=\"fl?.form_field_typ == 't' && fl?.dta_typ =='sr'\">\r\n <div class=\"row\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-7\">\r\n <div class=\"input-group w-100\">\r\n <!-- <ng-select [items]=\"sqlArray[fl.form_field]\" [dropdownPosition]=\"'bottom'\" bindLabel=\"v\"\r\n [(ngModel)]=\"pageDisplay\" [ngModelOptions]=\"{standalone: true}\">\r\n </ng-select> -->\r\n <ng-select style=\"z-index: 5;\" [options]=\"sqlArray[fl.form_field]\" [(ngModel)]=\"pageDisplay\"\r\n name=\"{{fl?.form_field}}\">\r\n </ng-select>\r\n </div>\r\n </div>\r\n <div class=\"col-md-2\">\r\n <button class=\"btn btn-info\" type=\"button\" style=\"width:100%;\"\r\n (click)=\"addAttr(pageDisplay, sqlArray[fl.form_field], fl.default_value);\">Add</button>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <label class=\"col-md-3 control-label\">Selected Modules</label>\r\n <div cclass=\"col-md-9\">\r\n <div class=\"mds\">\r\n <ng-template #itemTemplate let-item=\"item\" let-index=\"index\">\r\n <span\r\n style=\"padding: 4px;border: 1px solid #c9c9c9;border-radius: 6px;display: inline-block;width: 100%;position: relative;\">\r\n <span>{{index+1}}</span> - {{item.value}}\r\n <span class=\"rm\" (click)=\"remove(fl.default_value,item.value,index,fl?.form_field);\">\r\n <i class=\"fa fa-times\" aria-hidden=\"true\"></i>\r\n </span>\r\n </span>\r\n </ng-template>\r\n <div class=\"row\">\r\n <div>\r\n <bs-sortable [(ngModel)]=\"fl.default_value\" name=\"{{fl?.form_field}}\"\r\n [itemTemplate]=\"itemTemplate\" itemClass=\"sortable-item\"\r\n itemActiveClass=\"sortable-item-active\" placeholderClass=\"placeholderStyle\"\r\n wrapperClass=\"sortable-wrapper\" #srf=\"ngModel\" [required]=\"fl?.is_compulsory == '1'\">\r\n </bs-sortable>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"srf.invalid && (srf.dirty || srf.touched)\" class=\"alert alert-danger ca\">\r\n <div *ngIf=\"srf.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group\" *ngIf=\"fl?.form_field_typ == 't' && fl?.dta_typ =='sa'\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <!-- <ng-select [items]=\"sqlArray[fl.form_field]\" [addTag]=\"addTag\" bindValue=\"k\" [hideSelected]=\"true\"\r\n multiple=\"true\" bindLabel=\"v\" name=\"{{fl?.form_field}}\" [(ngModel)]=\"fl.default_value\"\r\n #safield=\"ngModel\" [required]=\"fl?.is_compulsory == '1'\">\r\n </ng-select> -->\r\n\r\n <ng-select style=\"z-index: 5;\" [options]=\"sqlArray[fl.form_field]\"\r\n [(ngModel)]=\"fl.default_value\" [multiple]=\"true\" [allowClear]=\"true\" name=\"{{fl?.form_field}}\"\r\n #safield=\"ngModel\" [required]=\"fl?.is_compulsory == '1'\">\r\n <ng-template #optionTemplate let-option=\"option\">\r\n <div class=\"famfamfam-flags {{option?.value}}\"></div>\r\n {{option?.label}}\r\n </ng-template>\r\n </ng-select>\r\n\r\n </div>\r\n <div *ngIf=\"safield.invalid && (safield.dirty || safield.touched)\" class=\"alert alert-danger ca\">\r\n <div *ngIf=\"safield.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\" *ngIf=\"fl?.form_field_typ == 'ta' && fl?.is_hidden == 0 && fl?.dta_typ =='c'\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <textarea class=\"form-control\" rows=\"3\" name=\"{{fl?.form_field}}\" [value]=\"fl?.default_value\"\r\n [(ngModel)]=\"fl.default_value\" #textArea=\"ngModel\" (blur)=\"chkFun(fl,fl.default_value);\"\r\n [ngClass]=\"{'uniqErrMsg': fl?.form_field == onErr}\"\r\n [required]=\"fl?.is_compulsory == '1'\"></textarea>\r\n </div>\r\n <div *ngIf=\"textArea.invalid && (textArea.dirty || textArea.touched)\"\r\n class=\"alert alert-danger ca\">\r\n <div *ngIf=\"textArea.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"fl?.form_field_typ == 'hd' || fl?.form_field_typ == 'hc' || fl?.form_field_typ == 'df' || fl?.form_field_typ == 'fk' || fl?.form_field_typ == 'ck' && fl?.is_hidden == 0\"\r\n [ngClass]=\"{'mt0': fl?.form_field_typ == 'hd'}\">\r\n <input type=\"hidden\" class=\"form-control\" name=\"{{fl?.form_field}}\" [value]=\"fl?.default_value\"\r\n [(ngModel)]=\"fl.default_value\" #hdf=\"ngModel\" />\r\n </div>\r\n <div class=\"form-group\" *ngIf=\"fl?.form_field_typ == 'sq' && fl?.is_hidden == 0\">\r\n <label class=\"col-md-3 control-label\"></label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <input type=\"hidden\" class=\"form-control\" name=\"{{fl?.form_field}}\" [value]=\"fl?.default_value\"\r\n [(ngModel)]=\"fl.default_value\" />\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\" *ngIf=\"fl?.form_field_typ == 'tb' && fl?.is_hidden == 0\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <select class=\"form-control select\" name=\"{{fl?.form_field}}\" [value]=\"fl?.default_value\"\r\n [(ngModel)]=\"fl.default_value\" #tdf=\"ngModel\" [required]=\"fl?.is_compulsory == '1'\">\r\n <option *ngFor=\"let dynamic of sqlArray[fl.form_field]\" value=\"{{dynamic.value}}\">\r\n {{dynamic.label}}</option>\r\n </select>\r\n </div>\r\n <div *ngIf=\"tdf.invalid && (tdf.dirty || tdf.touched)\" class=\"alert alert-danger ca\">\r\n <div *ngIf=\"tdf.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\" *ngIf=\"fl?.form_field_typ == 'l' && fl?.is_hidden == 0\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <select class=\"form-control select\" name=\"{{fl?.form_field}}\" [value]=\"fl?.default_value\"\r\n [(ngModel)]=\"fl.default_value\" #lInput=\"ngModel\" [required]=\"fl?.is_compulsory == '1'\">\r\n <option *ngFor=\"let lov of fl.kv\" value=\"{{lov.k}}\">{{lov.v}}</option>\r\n </select>\r\n </div>\r\n <div *ngIf=\"lInput.invalid && (lInput.dirty || lInput.touched)\" class=\"alert alert-danger ca\">\r\n <div *ngIf=\"lInput.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\" *ngIf=\"fl?.form_field_typ == 'ld' && fl?.is_hidden == 0\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <select class=\"form-control select\" name=\"{{fl?.form_field}}\" [value]=\"fl?.default_value\"\r\n [(ngModel)]=\"fl.default_value\" #ldInput=\"ngModel\" [required]=\"fl?.is_compulsory == '1'\">\r\n <option *ngFor=\"let dynamic of sqlArray[fl.form_field]\" value=\"{{dynamic.value}}\">\r\n {{dynamic.label}}</option>\r\n </select>\r\n </div>\r\n <div *ngIf=\"ldInput.invalid && (ldInput.dirty || ldInput.touched)\" class=\"alert alert-danger ca\">\r\n <div *ngIf=\"ldInput.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\" *ngIf=\"fl?.form_field_typ == 's' && fl?.is_hidden == 0\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <select class=\"form-control select\" name=\"{{fl?.form_field}}\" [value]=\"fl?.default_value\"\r\n [(ngModel)]=\"fl.default_value\" (change)=\"chkFun(fl,fl.default_value)\" id=\"{{fl.column_key}}\"\r\n #sfi=\"ngModel\" [required]=\"fl?.is_compulsory == '1'\">\r\n <option *ngFor=\"let dynamic of sqlArray[fl.form_field]\" value=\"{{dynamic.value}}\">\r\n {{dynamic.label}}</option>\r\n </select>\r\n </div>\r\n <div *ngIf=\"sfi.invalid && (sfi.dirty || sfi.touched)\" class=\"alert alert-danger ca\">\r\n <div *ngIf=\"sfi.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group\" *ngIf=\"fl?.form_field_typ == 'sb'\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-8\">\r\n <div class=\"input-group w-100\">\r\n <ng-select style=\"z-index: 5;\" [options]=\"sqlArray[fl.form_field]\" #sfi=\"ngModel\"\r\n [(ngModel)]=\"fl.default_value\" name=\"{{fl?.form_field}}\"\r\n (selected)=\"chkFun(fl,fl.default_value)\"\r\n (filterInputChanged)=\"loadSuggdata($event,fl.page_item_idn,fl.form_field)\">\r\n </ng-select>\r\n </div>\r\n <div *ngIf=\"sfi.invalid && (sfi.dirty || sfi.touched)\" class=\"alert alert-danger ca\">\r\n <div *ngIf=\"sfi.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-1\" *ngIf=\"fl?.form_field_icon == 'add'\">\r\n <button type=\"button\" class=\"btn btn-success btn-rounded\"><span><i\r\n class=\"fa fa-plus\"></i></span></button>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"submit\" class=\"btn btn-success\" (click)=\"submitForm(f,submitBtn)\" appAppNoDblClick\r\n #submitBtn>{{btnName}}</button>\r\n <button type=\"reset\" class=\"btn btn-danger\" (click)=\"reset(f)\" *ngIf=\"btnName == 'Add'\">Reset</button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"modal\" id=\"deleteTermsmodal\" role=\"dialog\" aria-labelledby=\"smallModalHead\" aria-hidden=\"true\"\r\n data-backdrop=\"static\" data-keyboard=\"false\">\r\n <div class=\"modal-dialog modal-sm\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\" (click)=\"closeNull();\" #deleteclsbtn>\r\n <span aria-hidden=\"true\">×</span>\r\n <span class=\"sr-only\">Close</span>\r\n </button>\r\n <h4 class=\"modal-title\" id=\"smallModalHead\">Warning</h4>\r\n </div>\r\n <div class=\"modal-body\">\r\n Are you sure want to delete term?\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\">Close</button>\r\n <button type=\"button\" class=\"btn btn-danger\" data-dismiss=\"modal\" (click)=\"DeleteTerms();\">Delete</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"modal\" id=\"deletemodal\" role=\"dialog\" aria-labelledby=\"smallModalHead\" aria-hidden=\"true\"\r\n data-backdrop=\"static\" data-keyboard=\"false\">\r\n <div class=\"modal-dialog modal-sm\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\" (click)=\"closeNull();\" #deleteclsbtn>\r\n <span aria-hidden=\"true\">×</span>\r\n <span class=\"sr-only\">Close</span>\r\n </button>\r\n <h4 class=\"modal-title\" id=\"smallModalHead\">Warning</h4>\r\n </div>\r\n <div class=\"modal-body\">\r\n Are you sure want to delete?\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\">Close</button>\r\n <button type=\"button\" class=\"btn btn-danger\" data-dismiss=\"modal\"\r\n (click)=\"deleteDataList();\">Delete</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"modal\" id=\"modal_sys\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"defModalHead\" aria-hidden=\"true\">\r\n <div class=\"modal-dialog\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\">\r\n <span aria-hidden=\"true\">×</span>\r\n <span class=\"sr-only\">Close</span>\r\n </button>\r\n <h4 class=\"modal-title\" id=\"defModalHead\">Basic Modal</h4>\r\n </div>\r\n <div class=\"modal-body\">\r\n Some content in modal example\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\">Close</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"modal\" id=\"rowGrpmodal\" tabindex=\"-2\" role=\"dialog\" aria-labelledby=\"rowGrpmodal\" aria-hidden=\"true\"\r\n data-backdrop=\"static\" data-keyboard=\"false\">\r\n <div class=\"modal-dialog\">\r\n <div class=\"modal-content\">\r\n <form class=\"form-horizontal\" #frg=\"ngForm\" name=\"appFormRowGrp\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\" (click)=\"closeNull();\" #closebtn>\r\n <span aria-hidden=\"true\">×</span>\r\n <span class=\"sr-only\">Close</span>\r\n </button>\r\n <h4 class=\"modal-title\" id=\"rowGrpHead\">Row Group</h4>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"row\">\r\n <div class=\"col-md-12\" style=\"padding-bottom: 10px;\">\r\n <label class=\"col-md-2 control-label\">Attributes</label>\r\n <label class=\"col-md-5 control-label\" style=\"padding-right: 90px;\">Row Display</label>\r\n <label class=\"col-md-5 control-label\" style=\"padding-right: 76px;\">Row Group </label>\r\n </div>\r\n <div class=\"col-md-12\">\r\n <div class=\"form-group\" *ngFor=\"let att of display_attr;\">\r\n <label class=\"col-md-2 control-label\">{{att.attr}}</label>\r\n <div class=\"col-md-5\">\r\n <div class=\"input-group w-100\">\r\n <select class=\"form-control\" name=\"att.display_row\" [disabled]=\"disableselc\"\r\n id=\"row_{{att.attr}}\" [value]=\"att.display_row\" (change)=\"onChangeDispRow($event)\">\r\n <!-- [value]=\"att.display_row\" -->\r\n <option *ngFor=\"let dr of display_row;\" value=\"{{dr.idn}}\">{{dr.print}}</option>\r\n </select>\r\n </div>\r\n </div>\r\n <div class=\"col-md-5\">\r\n <div class=\"input-group w-100\">\r\n <select class=\"form-control\" name=\"att.display_group\" [disabled]=\"disableselc\"\r\n id=\"grp_{{att.attr}}\" [value]=\"att.display_group\" (change)=\"onChangeDispGrp($event)\">\r\n <option *ngFor=\"let dg of display_group;\" value=\"{{dg.idn}}\">{{dg.print}}</option>\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"reset\" class=\"btn btn-danger\" data-dismiss=\"modal\">close</button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n\r\n\r\n <div class=\"modal\" id=\"productDetailMapMD\" role=\"dialog\" aria-labelledby=\"smallModalHead\" aria-hidden=\"true\"\r\n data-backdrop=\"static\" data-keyboard=\"false\">\r\n <div class=\"modal-dialog modal-sm mwidth\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\" (click)=\"closeNull();\" #productMapclsbtn>\r\n <span aria-hidden=\"true\">×</span>\r\n <span class=\"sr-only\" productDetailMapclsbtn>Close</span>\r\n </button>\r\n <h4 class=\"modal-title\" id=\"smallModalHead\">Product Mapping of {{producDetailModelTitle}}</h4>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"table-responsive\">\r\n <table class=\"table table-bordered table-hover table-hover-cells\">\r\n <thead>\r\n <tr>\r\n <th>\r\n Name\r\n </th>\r\n <th>\r\n Value\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <ng-container *ngFor=\"let key of attrDtl?.prpList\">\r\n <tr>\r\n <td>\r\n {{key.print}}\r\n </td>\r\n <td>\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"attrMappingDtl[key?.val]\" />\r\n </td>\r\n </tr>\r\n </ng-container>\r\n </tbody>\r\n </table>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\" #productDetailMapclsbtn>Close</button>\r\n <button type=\"button\" class=\"btn btn-success\" data-dismiss=\"modal\"\r\n (click)=\"saveProductDetailMapping();\">Save</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"modal\" id=\"docdeletemodal\" role=\"dialog\" aria-labelledby=\"smallModalHead\" aria-hidden=\"true\"\r\n data-backdrop=\"static\" data-keyboard=\"false\">\r\n <div class=\"modal-dialog modal-sm\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\" (click)=\"closeNull();\" #deleteclsbtn>\r\n <span aria-hidden=\"true\">×</span>\r\n <span class=\"sr-only\">Close</span>\r\n </button>\r\n <h4 class=\"modal-title\" id=\"smallModalHead\">Warning</h4>\r\n </div>\r\n <div class=\"modal-body\">\r\n Are you sure want to delete?\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\">Close</button>\r\n <button type=\"button\" class=\"btn btn-danger\" data-dismiss=\"modal\" (click)=\"deleteDoc();\">Delete</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"modal\" id=\"bnkdeletemodal\" role=\"dialog\" aria-labelledby=\"smallModalHead\" aria-hidden=\"true\"\r\n data-backdrop=\"static\" data-keyboard=\"false\">\r\n <div class=\"modal-dialog modal-sm\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\" (click)=\"closeNull();\" #deleteclsbtn>\r\n <span aria-hidden=\"true\">×</span>\r\n <span class=\"sr-only\">Close</span>\r\n </button>\r\n <h4 class=\"modal-title\" id=\"smallModalHead\">Warning</h4>\r\n </div>\r\n <div class=\"modal-body\">\r\n Are you sure want to delete?\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\">Close</button>\r\n <button type=\"button\" class=\"btn btn-danger\" data-dismiss=\"modal\"\r\n (click)=\"DeleteLedgerBank()\">Delete</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <button id=\"bnkdeletemodalbtn\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#bnkdeletemodal\"></button>\r\n\r\n <button id=\"docdeletebtn\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#docdeletemodal\"></button>\r\n <button id=\"deletebtn\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#deletemodal\"></button>\r\n <button id=\"deleteTerms\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#deleteTermsmodal\"></button>\r\n\r\n <button id=\"datamdbtn\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#datamodal\"></button>\r\n <button id=\"clsMd\" [hidden]=\"true\" data-dismiss=\"modal\" data-target=\"#datamodal\"></button>\r\n <button id=\"sysmd\" [hidden]=\"true\" data-dismiss=\"modal\" data-target=\"#modal_sys\"></button>\r\n <button id=\"btnproductDetailMapMD\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#productDetailMapMD\"></button>\r\n\r\n <button id=\"rowGrpbtn\" [hidden]=\"true\" data-dismiss=\"modal\" data-toggle=\"modal\" data-target=\"#rowGrpmodal\"></button>\r\n </div>", styles: [".btn-default.btn-on-1.active,.btn-default.btn-off-1.active{background-color:#3b5998;color:#fff}.btn.btn-xs,.btn-group-xs>.btn{font-size:12px;padding:5px 15px}.tbactive{background:#3B5998;color:#fff}input[type=radio]{display:none}.content-frame-body{padding:0 10px 10px!important}.content-frame-left{background:transparent!important;width:250px!important}.f-12{font-size:12px}.mt0{margin-bottom:0!important}.headingCls{padding:10px;background:#f0efef;font-size:14px;font-weight:400;margin-bottom:20px}.onHover{position:absolute;top:50%;transform:translate(-50%,-50%);left:50%;width:100%;text-align:center}.sortable-item{display:inline-block!important}.mds{border:1px solid #c9c9c9;height:265px;overflow:auto;margin-top:15px;width:175px;position:relative;right:-10px}.mds ul{padding-left:10px;list-style:none}.mds ul li{margin:5px 0;-webkit-user-select:all;user-select:all}.page-container .page-content .content-frame .content-frame-left{padding:0 10px!important}.mwidth{width:500px}.thcenter,.tdcenter{text-align:center}.Inactive{background-color:#ebebe0}btn-file>input{position:absolute;top:0;right:0;width:100%;height:100%;margin:0;font-size:23px;cursor:pointer;filter:alpha(opacity=0);opacity:0;direction:ltr;background-color:#32c5d2;border-color:#32c5d2}.btn.green{color:#fff;background:#3b5998!important;border-color:#3b5998!important}.btn.red{color:#fff;background-color:#e7505a;border-color:#e7505a}\n"], components: [{ type: i8.PaginationControlsComponent, selector: "pagination-controls", inputs: ["maxSize", "previousLabel", "nextLabel", "screenReaderPaginationLabel", "screenReaderPageLabel", "screenReaderCurrentLabel", "directionLinks", "autoHide", "responsive", "id"], outputs: ["pageChange"] }, { type: i9.SelectComponent, selector: "ng-select", inputs: ["options", "allowClear", "disabled", "multiple", "noFilter", "notFoundMsg", "placeholder", "filterPlaceholder", "label", "highlightColor", "highlightTextColor"], outputs: ["opened", "closed", "selected", "deselected", "focus", "blur", "noOptionsFound", "filterInputChanged"] }, { type: i10.TagInputComponent, selector: "tag-input", inputs: ["separatorKeys", "separatorKeyCodes", "placeholder", "secondaryPlaceholder", "maxItems", "validators", "asyncValidators", "onlyFromAutocomplete", "errorMessages", "theme", "onTextChangeDebounce", "inputId", "inputClass", "clearOnBlur", "hideForm", "addOnBlur", "addOnPaste", "pasteSplitPattern", "blinkIfDupe", "removable", "editable", "allowDupes", "modelAsStrings", "trimTags", "ripple", "tabindex", "disable", "dragZone", "onRemoving", "onAdding", "animationDuration", "inputText"], outputs: ["onAdd", "onRemove", "onSelect", "onFocus", "onBlur", "onTextChange", "onPaste", "onValidationError", "onTagEdited", "inputTextChange"] }, { type: i11.SortableComponent, selector: "bs-sortable", inputs: ["wrapperClass", "wrapperStyle", "itemClass", "itemStyle", "itemActiveClass", "itemActiveStyle", "placeholderClass", "placeholderStyle", "placeholderItem", "fieldName", "itemTemplate"], outputs: ["onChange"], exportAs: ["bs-sortable"] }], directives: [{ type: i12.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i13.AppNoDblClickDirective, selector: "[appAppNoDblClick]" }, { type: i12.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i12.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i14.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i14.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i14.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i14.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i14.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i14.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i14.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i14.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i14.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i14.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { type: i14.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i12.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], pipes: { "date": i12.DatePipe, "paginate": i8.PaginatePipe, "orderBy": i15.OrderPipe, "searchPipe": i16.SearchPipePipe, "orderByPipe": i17.OrderByPipePipe } });
|
|
2459
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: SubformComponent, decorators: [{
|
|
2460
|
+
type: Component,
|
|
2461
|
+
args: [{ selector: "app-subform", template: "<div class=\"mt\">\r\n <div class=\"panel panel-default\">\r\n <div class=\"panel-heading\">\r\n <h3 class=\"panel-title\">\r\n <span class=\"fa fa-chevron-left cp\" (click)=\"pageBck();\"> Back</span> {{pageInfo?.title}}\r\n <span *ngIf=\"contactName==''\" class=\"f-12\">({{cDt | date:'medium'}})</span>\r\n <span *ngIf=\"contactName!=''\" class=\"f-12\"> for <b> {{contactName}}</b> </span>\r\n </h3>\r\n <button type=\"button\" id=\"addBtn\" class=\"btn btn-info pull-right\" *ngIf=\"addNew?.is_compulsory == 1\"\r\n appAppNoDblClick (click)=\"userAction('', 'add', '', '');f.reset();\">{{addNew?.form_field_title}}</button>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-2\" *ngIf=\"navigation.length > 0\">\r\n <div class=\"panel panel-default\">\r\n <div class=\"panel-body\">\r\n <div class=\"list-group border-bottom\">\r\n <a href=\"javascript:void(0)\" class=\"list-group-item\" [ngClass]=\"{'active' :i == cLink}\"\r\n *ngFor=\"let nav of navigation;let i=index\" (click)=\"navigationFun(nav,i);\">{{nav.form_field_title}}</a>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div [ngClass]=\"navigation.length > 0 ? 'col-md-10' : 'col-md-12'\">\r\n <div class=\"panel panel-default\">\r\n <!-- primery form -->\r\n <div class=\"panel-body\" style=\"overflow-x: scroll\"\r\n *ngIf=\"navform != 'addtionalDtlMaster' && navform != 'documentUploadMaster' && navform != 'menuAccessMaster' && navform != 'termUserAssignForm' && navform != 'setPasswordForm' && navform!='ledgerBankDetails' && navform!='ledgerAccAdditinalDetails' && navform!='ledgerAddtionalDtlMaster' && navform!='accDeleteRulesForm' && navform!='accJournalAttrForm' && navform!='accLoanAttrForm' && navform!='accJournalSettingForm' && navform!='webMenuAccessMaster' \">\r\n <div class=\"row\">\r\n <div class=\"col-sm-6\">\r\n <form class=\"form-inline pull-left\">\r\n <div class=\"form-group\">\r\n <label for=\"ddlPagesize\">Page Size </label>\r\n <select class=\"form-control\" name=\"pageSize\" [(ngModel)]=\"pageSize\"\r\n (change)=\"onPageSizeChange(pageSize)\">\r\n <option value=\"All\">All</option>\r\n <option value=\"10\">10</option>\r\n <option value=\"25\">25</option>\r\n <option value=\"50\">50</option>\r\n <option value=\"100\">100</option>\r\n </select>\r\n </div>\r\n </form>\r\n <button class=\"btn btn-default\" style=\"padding: 4px 15px 4px 20px;margin-left: 10px;\"\r\n data-toggle=\"tooltip\" data-placement=\"right\" title=\"Refresh\" (click)=\"ngOnInit();\">\r\n <span class=\"fa fa-refresh\"></span>\r\n </button>\r\n </div>\r\n <div class=\"col-sm-6\">\r\n <form class=\"form-inline pull-right\">\r\n <div class=\"form-group\">\r\n <label for=\"exampleInputName2\">Search </label>\r\n <input type=\"text\" class=\"form-control\" id=\"exampleInputName2\" name=\"schtxt\" [(ngModel)]=\"searchF\" />\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n <div class=\"table-responsive\" [ngClass]=\"{'table-responsive' :navigation.length > 0}\">\r\n <table class=\"table table-bordered table-hover table-hover-cells\">\r\n <thead>\r\n <tr>\r\n <th>SR No</th>\r\n <th>Action</th>\r\n <th *ngFor=\"let tbh of tblH; let i = index\" (click)=\"setOrder(tbh,i)\">{{tblDesc[tbh]}}\r\n <span [hidden]=\"reverse\" *ngIf=\"showarr === i\">\r\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\r\n </span>\r\n <span [hidden]=\"!reverse\" *ngIf=\"showarr === i\">\r\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\r\n </span>\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <ng-container\r\n *ngFor=\"let data of datalist | searchPipe:searchF | orderBy: order:reverse | paginate: { itemsPerPage: pageSize, currentPage: p }; let i = index\">\r\n <tr [ngClass]=\"{'Inactive':data.stt=='InActive'}\">\r\n <td>{{i + 1}}</td>\r\n <td>\r\n <div class=\"btn-group\">\r\n <a href=\"#\" data-toggle=\"dropdown\" class=\"btn btn-info dropdown-toggle\">Action\r\n <span class=\"caret\"></span>\r\n </a>\r\n <ul class=\"dropdown-menu\" role=\"menu\">\r\n <li *ngFor=\"let action of actions\">\r\n <a href=\"javascript:void(0)\" (click)=\"userAction(data,action.form_field,action, i);\">\r\n {{action.form_field_title}}\r\n </a>\r\n </li>\r\n </ul>\r\n </div>\r\n </td>\r\n <td *ngFor=\"let tbh of tblH; let i=index\" on-mouseover=\"hoveredI=i\" on-mouseleave=\"hoveredI=-1\"\r\n style=\"max-width: 300px; word-break: break-word;\">{{data[tbh]}}\r\n <div class=\"onHoverDiv\"\r\n *ngIf=\"i==hoveredI && page_typ!='jsonForm' && navform!='buyertermsMaster'\">\r\n <ul>\r\n <li (click)=\"editCell(data,tbh);\">\r\n <span class=\"fa fa-pencil\"></span>\r\n </li>\r\n </ul>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-container>\r\n </tbody>\r\n </table>\r\n </div>\r\n <pagination-controls (pageChange)=\"p = $event\" class=\"pull-right\"></pagination-controls>\r\n </div>\r\n <!-- custom form -->\r\n <div class=\"panel-body\"\r\n *ngIf=\"navform == 'addtionalDtlMaster' || navform == 'ledgerAddtionalDtlMaster' || navform == 'ledgerAccAdditinalDetails' || navform=='accDeleteRulesForm' || navform=='accJournalAttrForm' || navform=='accLoanAttrForm' || navform=='accJournalSettingForm'\">\r\n <div class=\"row\">\r\n <div class=\"col-md-12\" *ngFor=\"let ugld of uiGrpList\">\r\n <p class=\"headingCls\">{{uiGrpListDtl[ugld]}}</p>\r\n <div class=\"col-md-6\" *ngFor=\"let formF of uiGrpListDtl[ugld+'#T'];let i = index\">\r\n <div class=\"form-group\" style=\"margin-bottom: 45px !important;\">\r\n <label class=\"col-md-4 control-label\">{{uiGrpListDtl[ugld+'#D'][i]}}</label>\r\n <div class=\"col-md-8\" *ngIf=\"formF == 'n'\">\r\n <div class=\"input-group w-100\">\r\n <input type=\"number\" class=\"form-control\" name=\"{{uiGrpListDtl[ugld+'#V'][i]}}\"\r\n [value]=\"dataDtl[uiGrpListDtl[ugld+'#V'][i]]\" [(ngModel)]=\"dataDtl[uiGrpListDtl[ugld+'#V'][i]]\"\r\n (change)=\"saveFun(uiGrpListDtl[ugld+'#V'][i],dataDtl[uiGrpListDtl[ugld+'#V'][i]],formF)\"\r\n [disabled]=\"uiGrpListDtl[ugld+'#E'][i] == 0 ? false : true\">\r\n </div>\r\n </div>\r\n <div class=\"col-md-8\" *ngIf=\"formF == 't'\">\r\n <div class=\"input-group w-100\">\r\n <input type=\"text\" class=\"form-control\" name=\"{{uiGrpListDtl[ugld+'#V'][i]}}\"\r\n [value]=\"dataDtl[uiGrpListDtl[ugld+'#V'][i]]\" [(ngModel)]=\"dataDtl[uiGrpListDtl[ugld+'#V'][i]]\"\r\n (change)=\"saveFun(uiGrpListDtl[ugld+'#V'][i],dataDtl[uiGrpListDtl[ugld+'#V'][i]],formF)\"\r\n [disabled]=\"uiGrpListDtl[ugld+'#E'][i] == 0 ? false : true\">\r\n </div>\r\n </div>\r\n\r\n\r\n\r\n <!-- added for testing only -->\r\n <div class=\"col-md-8\" *ngIf=\"formF == 'c'\">\r\n <div class=\"input-group w-100\">\r\n <select type=\"text\" class=\"form-control\" name=\"{{uiGrpListDtl[ugld+'#V'][i]}}\"\r\n [(ngModel)]=\"dataDtl[uiGrpListDtl[ugld+'#V'][i]]\"\r\n (change)=\"saveFun(uiGrpListDtl[ugld+'#V'][i],dataDtl[uiGrpListDtl[ugld+'#V'][i]],formF)\">\r\n <option *ngFor=\"let key of attrCListDtl[uiGrpListDtl[ugld+'#V'][i] +'#D'];let j=index\"\r\n value=\"{{attrCListDtl[uiGrpListDtl[ugld+'#V'][i] +'#V'][j]}}\">{{key}}</option>\r\n </select>\r\n <!-- <p *ngFor=\"let a of attrCListDtl[uiGrpListDtl[ugld+'#V'][i] +'#V']\">{{a |json}}:\r\n {{attrCListDtl[uiGrpListDtl[ugld+'#V'][i] +'#V'] |json}}\r\n </p> -->\r\n <!-- <input type=\"text\" class=\"form-control\" name=\"{{uiGrpListDtl[ugld+'#V'][i]}}\" [value]=\"dataDtl[uiGrpListDtl[ugld+'#V'][i]]\"\r\n [(ngModel)]=\"dataDtl[uiGrpListDtl[ugld+'#V'][i]]\" (blur)=\"saveFun(uiGrpListDtl[ugld+'#V'][i],dataDtl[uiGrpListDtl[ugld+'#V'][i]])\"\r\n [disabled]=\"uiGrpListDtl[ugld+'#E'][i] == 0 ? false : true\"> -->\r\n </div>\r\n </div>\r\n <div class=\"col-md-8\" *ngIf=\"formF == 'q'\">\r\n <div class=\"input-group w-100\">\r\n <select type=\"text\" class=\"form-control\" name=\"{{uiGrpListDtl[ugld+'#V'][i]}}\"\r\n [(ngModel)]=\"dataDtl[uiGrpListDtl[ugld+'#V'][i]]\"\r\n (change)=\"saveFun(uiGrpListDtl[ugld+'#V'][i],dataDtl[uiGrpListDtl[ugld+'#V'][i]],formF)\">\r\n <option *ngFor=\"let key of attrQListDtl[uiGrpListDtl[ugld+'#V'][i] +'#D'];let j=index\"\r\n value=\"{{attrQListDtl[uiGrpListDtl[ugld+'#V'][i] +'#D'][j]}}\">{{key}}</option>\r\n </select>\r\n <!-- <p *ngFor=\"let a of attrCListDtl[uiGrpListDtl[ugld+'#V'][i] +'#V']\">{{a |json}}:\r\n {{attrCListDtl[uiGrpListDtl[ugld+'#V'][i] +'#V'] |json}}\r\n </p> -->\r\n <!-- <input type=\"text\" class=\"form-control\" name=\"{{uiGrpListDtl[ugld+'#V'][i]}}\" [value]=\"dataDtl[uiGrpListDtl[ugld+'#V'][i]]\"\r\n [(ngModel)]=\"dataDtl[uiGrpListDtl[ugld+'#V'][i]]\" (blur)=\"saveFun(uiGrpListDtl[ugld+'#V'][i],dataDtl[uiGrpListDtl[ugld+'#V'][i]])\"\r\n [disabled]=\"uiGrpListDtl[ugld+'#E'][i] == 0 ? false : true\"> -->\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-md-8\" *ngIf=\"formF == 'sa'\">\r\n <div class=\"input-group w-100\">\r\n <ng-select style=\"z-index: 5;\" [options]=\"sqlArray[uiGrpListDtl[ugld+'#V'][i]]\" #sfi=\"ngModel\"\r\n [(ngModel)]=\"dataDtl[uiGrpListDtl[ugld+'#V'][i]]\" name=\"{{uiGrpListDtl[ugld+'#V'][i]}}\"\r\n (selected)=\"saveFun(uiGrpListDtl[ugld+'#V'][i],dataDtl[uiGrpListDtl[ugld+'#V'][i]],formF)\"\r\n (filterInputChanged)=\"loadJnlSuggdata($event,uiGrpListDtl[ugld+'#V'][i],uiGrpListDtl[ugld+'#M'][i])\">\r\n </ng-select>\r\n\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-md-8\" *ngIf=\"formF == 'd'\">\r\n <div class=\"input-group w-100\">\r\n <input type=\"date\" class=\"form-control\" name=\"{{uiGrpListDtl[ugld+'#V'][i]}}\"\r\n (change)=\"saveFun(uiGrpListDtl[ugld+'#V'][i],dataDtl[uiGrpListDtl[ugld+'#V'][i]],formF)\"\r\n [value]=\"dataDtl[uiGrpListDtl[ugld+'#V'][i]]\" [(ngModel)]=\"dataDtl[uiGrpListDtl[ugld+'#V'][i]]\"\r\n [disabled]=\"uiGrpListDtl[ugld+'#E'][i] == 0 ? false : true\">\r\n </div>\r\n </div>\r\n <div class=\"col-md-8\" *ngIf=\"formF == 'e'\">\r\n <div class=\"input-group w-100\">\r\n <input type=\"email\" class=\"form-control\" name=\"{{uiGrpListDtl[ugld+'#V'][i]}}\"\r\n (change)=\"saveFun(uiGrpListDtl[ugld+'#V'][i],dataDtl[uiGrpListDtl[ugld+'#V'][i]],formF)\"\r\n [value]=\"dataDtl[uiGrpListDtl[ugld+'#V'][i]]\" [(ngModel)]=\"dataDtl[uiGrpListDtl[ugld+'#V'][i]]\"\r\n (blur)=\"saveFun(uiGrpListDtl[ugld+'#V'][i],dataDtl[uiGrpListDtl[ugld+'#V'][i]],formF)\"\r\n [disabled]=\"uiGrpListDtl[ugld+'#E'][i] == 0 ? false : true\">\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"panel-body form\"\r\n *ngIf=\"navform == 'documentUploadMaster' && navform != 'menuAccessMaster' && navform != 'termUserAssignForm' && navform != 'setPasswordForm'\">\r\n <div class=\"row\">\r\n <form action=\"#\" class=\"form-horizontal form-bordered\">\r\n <div class=\"form-body\">\r\n\r\n <div class=\"col-md-4\">\r\n <select type=\"text\" class=\"form-control\" name=\"doctype\" [(ngModel)]=\"doctype\">\r\n <option *ngFor=\"let docs of documentUploadList\" value=\"{{docs}}\">{{documentUploadDtl[docs]}}\r\n </option>\r\n </select>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <div class=\"fileinput fileinput-new\" data-provides=\"fileinput\">\r\n <span class=\"btn green btn-file\">\r\n <span> Upload </span>\r\n\r\n <input type=\"file\" name=\"...\" (change)=\"uploadDocs($event)\"> </span>\r\n <span class=\"fileinput-filename\"> </span> \r\n <a href=\"javascript:;\" class=\"close fileinput-exists\" data-dismiss=\"fileinput\"> </a>\r\n </div>\r\n <a *ngIf=\"routherDoc!=''\" style=\"cursor:pointer \" (click)=\"rediecttokyc()\"><b>\r\n << back</b></a>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <p class=\"headingCls\">Existing Documents</p>\r\n </div>\r\n <div class=\"col-md-12\">\r\n <table class=\"subDisplayTable\">\r\n <ng-container *ngFor=\"let docs of documentUploadList;let i = index \">\r\n <tr *ngIf=\"dataDtl[docs]!=undefined\">\r\n <td style=\"width: 10%\">{{documentUploadDtl[docs]}}</td>\r\n <td style=\"width: 90%;text-align: left\">\r\n <ng-container *ngFor=\"let docdtl of dataDtl[docs]\">\r\n <div class=\"fileinput fileinput-new\" *ngIf=\"doceditAction\" data-provides=\"fileinput\">\r\n <span class=\"btn-file\">\r\n <i class=\"fa fa-edit\" tooltip=\"Edit Document\" style=\"font-size:20px\"> </i>\r\n\r\n <input type=\"file\" name=\"...\" (change)=\"EditUploadDocs(docdtl,$event)\"> </span>\r\n <span class=\"fileinput-filename\"> </span> \r\n <a href=\"javascript:;\" class=\"close fileinput-exists\" data-dismiss=\"fileinput\"> </a>\r\n </div>\r\n\r\n \r\n <a><i class=\"fa fa-trash-o\" *ngIf=\"docdeleteAction\" (click)=\"ConfirmdeleteDoc(docdtl)\"\r\n style=\"font-size:20px;cursor: pointer\"> </i> </a> \r\n <a (click)=\"opendocs(docdtl)\"> <i class=\"fa fa-file-o\" style=\"font-size:20px\"> </i> </a>\r\n | \r\n </ng-container>\r\n\r\n </td>\r\n </tr>\r\n </ng-container>\r\n </table>\r\n </div>\r\n\r\n </div>\r\n\r\n\r\n\r\n\r\n </div>\r\n <div class=\"panel-body\"\r\n *ngIf=\"navform != 'documentUploadMaster' && navform == 'menuAccessMaster' && navform != 'termUserAssignForm' && navform != 'setPasswordForm' \">\r\n <div class=\"row\">\r\n <div class=\"col-md-2\">\r\n <div class=\"form-group\">\r\n <label class=\"control-label\" style=\"padding-left: 2px;\">Application</label>\r\n <select class=\"form-control\" [(ngModel)]=\"application\" name=\"User\" (change)=\"loadUsrMdl(application)\">\r\n <option *ngFor=\"let app of applicationList\" value=\"{{app.k}}\">{{app.v}}</option>\r\n </select>\r\n </div>\r\n </div>\r\n <div class=\"col-md-2\" *ngIf=\"userDtls.length>0\">\r\n <div class=\"form-group\">\r\n <label class=\"control-label\" style=\"padding-left: 2px;\">User</label>\r\n <select class=\"form-control\" [(ngModel)]=\"User\" name=\"User\">\r\n <option *ngFor=\"let lov of userDtls\" value=\"{{lov.user_idn}}\">{{lov.username}}</option>\r\n </select>\r\n </div>\r\n </div>\r\n <div class=\"col-md-2\" *ngIf=\"moduleDtls.length>0 && userDtls.length >0 \">\r\n <div class=\"form-group\">\r\n <label class=\"control-label\" style=\"padding-left: 2px;\">Module</label>\r\n <select class=\"form-control\" [(ngModel)]=\"Module\" name=\"Module\">\r\n <option *ngFor=\"let lov of moduleDtls\" value=\"{{lov.module_idn}}\">{{lov.print}}</option>\r\n </select>\r\n </div>\r\n </div>\r\n <div class=\"col-md-2 \">\r\n <button type=\"button\" id=\"addBtn\" class=\"btn btn-info\" style=\"margin-top: 23px;\"\r\n (click)=\"getUserRights(User,Module)\">Assign\r\n Rights\r\n </button>\r\n </div>\r\n </div>\r\n <div style=\"padding: 0 10px;\" *ngIf=\"menuList.length>0\">\r\n <div style=\"border:1px solid #e5e5e5;margin-top: 30px\">\r\n <div class=\"row\">\r\n <div class=\"panel panel-default\" style=\"margin-bottom: 25px;\">\r\n <div class=\"panel-heading\" style=\"padding: 0px;\">\r\n <h3 class=\"panel-title\" style=\"padding: 8px; font-size: 14px;\">Users</h3>\r\n <div class=\"col-md-2 chkAll\" style=\"margin: 0px;\">\r\n <div class=\"form-group\" style=\"padding: 10px;\">\r\n <div class=\"col-md-3\">\r\n <label class=\"switch\">\r\n <input type=\"checkbox\" class=\"switch\" name=\"chkAll\" id=\"chkAll\"\r\n (change)=\"onChangeAll($event,User,Module)\"\r\n [checked]=\"(false !== (userRightsMenuList.length == (menuList.length + totMenu)) ? 'checked' : '')\">\r\n <span></span>\r\n </label>\r\n </div>\r\n <label class=\"col-md-4 control-label text-left\" style=\"padding-top: 8px;\r\n padding-left: 40px;\">All\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <form class=\"form-horizontal\">\r\n <div class=\"col-md-12\" *ngFor=\"let mdl of menuList;let i=index\">\r\n <div class=\"form-group\">\r\n <div class=\"col-md-1\">\r\n <label class=\"switch\">\r\n <input type=\"checkbox\" class=\"switch\" name=\"chkMenu\" id=\"chkMenu{{mdl.menu_idn}}\"\r\n (change)=\"onChangeMenu($event,mdl.menu_idn,User,Module)\"\r\n [checked]=\"(false !== userRightsMenuList.includes(mdl?.menu_idn) ? 'checked' : '')\">\r\n <span></span>\r\n </label>\r\n </div>\r\n <label class=\"col-md-2 control-label text-left\" style=\"padding-top: 3px;\">{{mdl.menu}}</label>\r\n </div>\r\n <div class=\"col-md-12\" *ngIf=\"mdl.SubMenu.length > 0\">\r\n <div class=\"form-group\" *ngFor=\"let smdl of mdl.SubMenu\">\r\n <div class=\"col-md-1\" style=\"margin-left:10px;padding-left: 60px;\">\r\n <label class=\"switch\">\r\n <input type=\"checkbox\" class=\"switch\" name=\"chkSubMenu\" id=\"chkSubMenu{{smdl.menu_idn}}\"\r\n (change)=\"onChangeSubMenu($event,smdl.menu_idn,mdl.menu_idn,User,Module)\"\r\n [checked]=\"( false !== userRightsMenuList.includes(smdl?.menu_idn) ? 'checked' : '')\">\r\n <span></span>\r\n </label>\r\n </div>\r\n <label class=\"col-md-4 control-label text-left\"\r\n style=\"padding-top: 8px; font-weight: 100;padding-left: 40px;\"> {{smdl.hdr}}</label>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"panel-body\" *ngIf=\"navform == 'webMenuAccessMaster'\">\r\n <div class=\"row\">\r\n <div class=\"col-md-2\">\r\n <div class=\"form-group\">\r\n <label class=\"control-label\" style=\"padding-left: 2px;\">Application</label>\r\n <select class=\"form-control\" [(ngModel)]=\"application\" name=\"User\" (change)=\"loadUsrMdl(application)\">\r\n <option *ngFor=\"let app of applicationList\" value=\"{{app.k}}\">{{app.v}}</option>\r\n </select>\r\n </div>\r\n </div>\r\n <div class=\"col-md-2\" *ngIf=\"userDtls.length>0\">\r\n <div class=\"form-group\">\r\n <label class=\"control-label\" style=\"padding-left: 2px;\">User</label>\r\n <select class=\"form-control\" [(ngModel)]=\"User\" name=\"User\">\r\n <option *ngFor=\"let lov of userDtls\" value=\"{{lov.user_idn}}\">{{lov.username}}</option>\r\n </select>\r\n </div>\r\n </div>\r\n <div class=\"col-md-2\" *ngIf=\"moduleDtls.length>0 && userDtls.length >0 \">\r\n <div class=\"form-group\">\r\n <label class=\"control-label\" style=\"padding-left: 2px;\">Module</label>\r\n <select class=\"form-control\" [(ngModel)]=\"Module\" name=\"Module\">\r\n <option *ngFor=\"let lov of moduleDtls\" value=\"{{lov.module_idn}}\">{{lov.print}}</option>\r\n </select>\r\n </div>\r\n </div>\r\n <div class=\"col-md-2 \">\r\n <button type=\"button\" id=\"addBtn\" class=\"btn btn-info\" style=\"margin-top: 23px;\"\r\n (click)=\"getUserRights(User,Module)\">Assign\r\n Rights\r\n </button>\r\n </div>\r\n </div>\r\n <div style=\"padding: 0 10px;\" *ngIf=\"menuList.length>0\">\r\n <div style=\"border:1px solid #e5e5e5;margin-top: 30px\">\r\n <div class=\"row\">\r\n <div class=\"panel panel-default\" style=\"margin-bottom: 25px;\">\r\n <div class=\"panel-heading\" style=\"padding: 0px;\">\r\n <h3 class=\"panel-title\" style=\"padding: 8px; font-size: 14px;\">Users</h3>\r\n <div class=\"col-md-2 chkAll\" style=\"margin: 0px;\">\r\n <div class=\"form-group\" style=\"padding: 10px;\">\r\n <div class=\"col-md-3\">\r\n <label class=\"switch\">\r\n <input type=\"checkbox\" class=\"switch\" name=\"chkAll\" id=\"chkAll\"\r\n (change)=\"onChangeAll($event,User,Module)\"\r\n [checked]=\"(false !== (userRightsMenuList.length == (menuList.length + totMenu)) ? 'checked' : '')\">\r\n <span></span>\r\n </label>\r\n </div>\r\n <label class=\"col-md-4 control-label text-left\" style=\"padding-top: 8px;\r\n padding-left: 40px;\">All\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <form class=\"form-horizontal\">\r\n <div class=\"col-md-12\" *ngFor=\"let mdl of menuList;let i=index\">\r\n <div class=\"form-group\">\r\n <div class=\"col-md-1\">\r\n <label class=\"switch\">\r\n <input type=\"checkbox\" class=\"switch\" name=\"chkMenu\" id=\"chkMenu{{mdl.menu_idn}}\"\r\n (change)=\"onChangeWebMenu($event,mdl.menu_idn,User,Module)\"\r\n [checked]=\"(false == userRightsMenuList.includes(mdl?.menu_idn) ? 'checked' : '')\">\r\n <span></span>\r\n </label>\r\n </div>\r\n <label class=\"col-md-2 control-label text-left\" style=\"padding-top: 3px;\">{{mdl.menu}}</label>\r\n </div>\r\n <div class=\"col-md-12\" *ngIf=\"mdl.SubMenu.length > 0\">\r\n <div class=\"form-group\" *ngFor=\"let smdl of mdl.SubMenu\">\r\n <div class=\"col-md-1\" style=\"margin-left:10px;padding-left: 60px;\">\r\n <label class=\"switch\">\r\n <input type=\"checkbox\" class=\"switch\" name=\"chkSubMenu\" id=\"chkSubMenu{{smdl.menu_idn}}\"\r\n (change)=\"onChangeWebSubMenu($event,smdl.menu_idn,mdl.menu_idn,User,Module)\"\r\n [checked]=\"( false == userRightsMenuList.includes(smdl?.menu_idn) ? 'checked' : '')\">\r\n <span></span>\r\n </label>\r\n </div>\r\n <label class=\"col-md-4 control-label text-left\"\r\n style=\"padding-top: 8px; font-weight: 100;padding-left: 40px;\"> {{smdl.hdr}}</label>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"panel-body\" style=\"background: #fff;min-height: 550px;\"\r\n *ngIf=\"navform != 'addtionalDtlMaster' && navform != 'documentUploadMaster' && navform != 'menuAccessMaster' && navform == 'termUserAssignForm' && navform != 'setPasswordForm' \">\r\n <div class=\"row\" style=\"margin-top: 10px;\">\r\n <div class=\"col-md-2\">\r\n <div class=\"form-group\">\r\n <label class=\"control-label\">Terms</label>\r\n </div>\r\n </div>\r\n <div class=\"col-md-1\" style=\"margin-left: 85px;\">\r\n <div class=\"form-group\">\r\n <label class=\"control-label\">Users</label>\r\n </div>\r\n </div>\r\n </div>\r\n <ng-container *ngFor=\"let term of termsList; let i=index;\">\r\n <div class=\"row\">\r\n <div class=\"col-md-3\">\r\n <div class=\"form-group\">\r\n\r\n <label for=\"{{term.buyer_terms_idn}}\" class=\"control-label\"\r\n style=\"padding: 10px;\">{{term.dsc}}</label>\r\n </div>\r\n </div>\r\n <div class=\"col-md-3\" *ngIf=\"term.userIdnList != undefined\">\r\n <div class=\"form-group w-100\">\r\n <div class=\"input-group w-100\">\r\n\r\n <!-- <ng-select [items]=\"applUserList\" [multiple]=\"true\" [addTag]=\"addTag\" (change)=\"onchaneVals(null,term.buyer_terms_idn,term.userIdnList)\"\r\n bindLabel=\"v\" bindValue=\"k\" name=\"{{term ?.buyer_terms_idn}}\" [(ngModel)]=\"term.userIdnList\">\r\n </ng-select> -->\r\n <ng-select placeholder=\"Select user\" [options]=\"term.TermUserList\" [(ngModel)]=\"term.userIdnList\"\r\n (deselected)=\"onchangeUserList($event,term,'delete')\"\r\n (selected)=\"onchangeUserList($event,term,'add')\" name=\"status\" [multiple]=\"true\"\r\n [allowClear]=\"true\">\r\n <ng-template #optionTemplate let-option=\"option\">\r\n <div class=\"famfamfam-flags {{option?.value}}\"></div>\r\n {{option?.label}}\r\n </ng-template>\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\"></div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"panel-body\" style=\"background: #fff;min-height: 550px;\"\r\n *ngIf=\"navform != 'addtionalDtlMaster' && navform != 'documentUploadMaster' && navform != 'menuAccessMaster' && navform != 'termUserAssignForm' && navform == 'setPasswordForm' \">\r\n <div class=\"row\" style=\"margin-top: 10px;\">\r\n <div class=\"col-md-12\">\r\n <p class=\"headingCls\">Change User Password</p>\r\n </div>\r\n <div class=\"col-md-2\">\r\n <div class=\"form-group\">\r\n <label class=\"control-label\" style=\"padding: 8px;\">Username</label>\r\n </div>\r\n </div>\r\n <div class=\"col-md-1\" style=\"margin-left: 85px;\">\r\n <div class=\"form-group\">\r\n <label class=\"control-label\" style=\"padding: 8px;\">Password</label>\r\n </div>\r\n </div>\r\n </div>\r\n <ng-container *ngFor=\"let user of userDetails; let i=index;\">\r\n <div class=\"row\">\r\n <div class=\"col-md-3\">\r\n <div class=\"form-group\">\r\n <label class=\"control-label\" style=\"padding: 10px;font-weight: normal;\">{{user?.username}}</label>\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <div class=\"form-group w-100\">\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"user.password\" [value]=\"user?.password\" />\r\n <!-- (blur)=\"changePswd($event,user.userIdn)\" -->\r\n </div>\r\n </div>\r\n <div class=\"col-md-3\">\r\n <div class=\"form-group\">\r\n <button type=\"submit\" class=\"btn btn-success\" (click)=\"changePassword(user)\">save</button>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <!-- <button type=\"submit\" class=\"btn btn-success\" (click)=\"saveAppUserterms(applUsrLst)\">save</button> -->\r\n </div>\r\n <div class=\"panel-body\" style=\"background: #fff;min-height: 550px;\" *ngIf=\"navform=='ledgerBankDetails'\">\r\n <div class=\"row\">\r\n <div class=\"col-md-12\" style=\"margin:5px\">\r\n <div class=\"form-group w-100\">\r\n <label class=\"col-md-2 control-label\">Bank</label>\r\n <div class=\"col-md-4\">\r\n <ng-select placeholder=\"Select Bank\" [options]=\"bankList\" [(ngModel)]=\"bank\" name=\"bank\"\r\n (selected)=\"getBankBranch(bank)\" (filterInputChanged)=\"ledgerBankDetails($event)\"\r\n [allowClear]=\"true\">\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12\" style=\"margin:5px\">\r\n <div class=\"form-group w-100\">\r\n <label class=\"col-md-2 control-label\">Branch Details</label>\r\n <div class=\"col-md-4\">\r\n <select name=\"branch\" (change)=\"selectBranch(branch)\" [(ngModel)]=\"branch\" class=\"form-control\">\r\n <option value=\"\">Select branch</option>\r\n <option *ngFor=\"let bnkDtl of bankDtlList\" [ngValue]=\"bnkDtl.nme_idn\">{{bnkDtl.person_nme}}</option>\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12\" *ngIf=\"selectBranchAddress!=''\" style=\"margin:5px\">\r\n <div class=\"form-group w-100\">\r\n <label class=\"col-md-2 control-label\"> </label>\r\n <div class=\"col-md-4\">\r\n <div class=\"col-md-3\">Address:</div>\r\n <div class=\"col-md-9\">{{selectBranchAddress}}</div>\r\n <div class=\"col-md-3\">IFSC Code:</div>\r\n <div class=\"col-md-9\">{{selectIfsc}}</div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12\" style=\"margin:5px\">\r\n <div class=\"form-group w-100\">\r\n <label class=\"col-md-2 control-label\">Account Type</label>\r\n <div class=\"col-md-4\">\r\n <select name=\"accountType\" [(ngModel)]=\"accountType\" class=\"form-control\">\r\n <option value=\"current\">Current</option>\r\n <option value=\"savings\">Savings</option>\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12\" style=\"margin:5px\">\r\n <div class=\"form-group w-100\">\r\n <label class=\"col-md-2 control-label\">Account No</label>\r\n <div class=\"col-md-4\">\r\n <textarea class=\"form-control\" cols=\"45\" rows=\"2\" name=\"accountno\" [(ngModel)]=\"accountno\"></textarea>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12\" style=\"margin:5px\">\r\n <div class=\"form-group w-100\">\r\n <div class=\"col-md-2\"> </div>\r\n <div class=\"col-md-4\">\r\n <button type=\"button\" *ngIf=\"editbank_dtl_idn==''\" (click)=\"SaveLedgerBank()\"\r\n class=\"btn btn-success\">Add</button>\r\n <button type=\"button\" *ngIf=\"editbank_dtl_idn!=''\" (click)=\"SaveLedgerBank()\"\r\n class=\"btn btn-success\">Edit</button>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"row\" *ngIf=\"exitBankDtlList.length>0\">\r\n <div class=\"col-md-1 pull-left\">\r\n \r\n </div>\r\n <div class=\"col-md-6 pull-right\">\r\n <form class=\"form-inline pull-right\">\r\n <div class=\"form-group\">\r\n <label for=\"exampleInputName2\">Search </label>\r\n <input type=\"text\" class=\"form-control\" id=\"exampleInputName2\" name=\"searchF\" [(ngModel)]=\"searchF\" />\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n <div class=\"row\" *ngIf=\"exitBankDtlList.length>0\">\r\n <div class=\"col-md-12\">\r\n <table class=\"displayTable\">\r\n <thead>\r\n <th>Actions</th>\r\n <th>Account Type</th>\r\n <th>Account No</th>\r\n <th>Name</th>\r\n <th>Branch</th>\r\n <th>Address</th>\r\n <th>IFSC Code</th>\r\n </thead>\r\n <tbody>\r\n <ng-container *ngFor=\"let bankdtl of exitBankDtlList ; let i = index\">\r\n <tr [ngClass]=\"{'even':i%2==0,'odd':i%2==1}\">\r\n <td> <i class=\"fa fa-edit\" (click)=\"loadEditBankDtl(bankdtl)\" tooltip=\"Edit Bank\"\r\n style=\"font-size:15px;cursor: pointer\"> </i> |\r\n <i class=\"fa fa-trash-o\" (click)=\"ConfirmDeleteLedgerBank(bankdtl)\" tooltip=\"Delete Bank\"\r\n style=\"font-size:15px;cursor: pointer\"> </i>\r\n <td>{{bankdtl.accountType}}</td>\r\n <td>{{bankdtl.accountNo}}</td>\r\n <td>{{bankdtl.bankname}}</td>\r\n <td>{{bankdtl.branchname}}</td>\r\n <td>{{bankdtl.address}}</td>\r\n <td>{{bankdtl.ifsc}}</td>\r\n </tr>\r\n </ng-container>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"modal\" id=\"datamodal\" role=\"dialog\" aria-labelledby=\"defModalHead\" aria-hidden=\"true\"\r\n data-backdrop=\"static\" data-keyboard=\"false\">\r\n <div class=\"modal-dialog\">\r\n <div class=\"modal-content\">\r\n <form class=\"form-horizontal\" #f=\"ngForm\" name=\"appForm\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\" (click)=\"closeNull();\" #closebtn>\r\n <span aria-hidden=\"true\">×</span>\r\n <span class=\"sr-only\">Close</span>\r\n </button>\r\n <h4 class=\"modal-title\" id=\"defModalHead\">{{btnName}} Record</h4>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"row\">\r\n <div class=\"col-md-12\" *ngFor=\"let fl of formFilds | orderByPipe: 'srt': 'asc'\">\r\n <div class=\"form-group\"\r\n *ngIf=\"fl?.form_field_typ == 't' && fl?.is_hidden == 0 && fl?.dta_typ =='c' || fl?.dta_typ =='t'\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <input type=\"text\" class=\"form-control posrel\" name=\"{{fl?.form_field}}\"\r\n [value]=\"fl?.default_value\" [(ngModel)]=\"fl.default_value\" #textInput=\"ngModel\"\r\n (blur)=\"chkFun(fl,fl.default_value);\" [required]=\"fl?.is_compulsory == '1'\" />\r\n <span class=\"fa fa-{{ico}} eye\" [ngStyle]=\"{'color':ico == 'check' ? 'green' : 'red' }\"\r\n *ngIf=\"usrisExist && onErr == fl.form_field \"></span>\r\n </div>\r\n <div *ngIf=\"textInput.invalid && (textInput.dirty || textInput.touched)\"\r\n class=\"alert alert-danger ca\">\r\n <div *ngIf=\"textInput.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\" *ngIf=\"fl?.form_field_typ == 't' && fl?.is_hidden == 0 && fl?.dta_typ =='n'\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <input type=\"number\" class=\"form-control\" name=\"{{fl?.form_field}}\" [value]=\"fl?.default_value\"\r\n [(ngModel)]=\"fl.default_value\" #numberInput=\"ngModel\" [required]=\"fl?.is_compulsory==1\">\r\n </div>\r\n <div *ngIf=\"numberInput.invalid && (numberInput.dirty || numberInput.touched)\"\r\n class=\"alert alert-danger ca\">\r\n <div *ngIf=\"numberInput.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n <div *ngIf=\"numberInput.invalid && (numberInput.dirty || numberInput.touched)\"\r\n class=\"alert alert-danger ca\">\r\n <div *ngIf=\"numberInput.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\"\r\n *ngIf=\"fl?.form_field_typ == 'pw' && fl?.is_hidden == 0 && fl?.dta_typ =='pw'\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <input type=\"{{inputtype}}\" class=\"form-control posrel\" name=\"{{fl?.form_field}}\"\r\n [value]=\"fl?.default_value\" [(ngModel)]=\"fl.default_value\" #passInput=\"ngModel\"\r\n [required]=\"fl?.is_compulsory == '1'\" />\r\n <span class=\"fa {{eveC}} eye\" (click)=\"showHIdePass();\"></span>\r\n </div>\r\n <div *ngIf=\"passInput.invalid && (passInput.dirty || passInput.touched)\"\r\n class=\"alert alert-danger ca\">\r\n <div *ngIf=\"passInput.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\" *ngIf=\"fl?.form_field_typ == 't' && fl?.dta_typ =='a'\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n\r\n <!-- <ng-select [items]=\"[]\" [addTag]=\"true\" bindValue=\"label\" [multiple]=\"true\" name=\"{{fl?.form_field}}\"\r\n [(ngModel)]=\"fl.default_value\" [isOpen]=\"false\" #afield=\"ngModel\" [required]=\"fl?.is_compulsory == '1'\">\r\n </ng-select> -->\r\n\r\n <!-- <ng-select style=\"z-index: 5;\" [options]=\"[]\" [(ngModel)]=\"fl.default_value\" name=\"{{fl?.form_field}}\"\r\n #afield=\"ngModel\" [required]=\"fl?.is_compulsory == '1'\">\r\n </ng-select> last commented-->\r\n\r\n <tag-input [(ngModel)]=\"fl.default_value\" name=\"{{fl?.form_field}}\" [modelAsStrings]=\"true\"\r\n [allowDupes]=\"true\" [editable]='true'></tag-input>\r\n\r\n\r\n </div>\r\n <!-- <div *ngIf=\"afield.invalid && (afield.dirty || afield.touched)\" class=\"alert alert-danger ca\">\r\n <div *ngIf=\"afield.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n </div> -->\r\n </div>\r\n </div>\r\n <div class=\"form-group\" *ngIf=\"fl?.form_field_typ == 't' && fl?.dta_typ =='sr'\">\r\n <div class=\"row\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-7\">\r\n <div class=\"input-group w-100\">\r\n <!-- <ng-select [items]=\"sqlArray[fl.form_field]\" [dropdownPosition]=\"'bottom'\" bindLabel=\"v\"\r\n [(ngModel)]=\"pageDisplay\" [ngModelOptions]=\"{standalone: true}\">\r\n </ng-select> -->\r\n <ng-select style=\"z-index: 5;\" [options]=\"sqlArray[fl.form_field]\" [(ngModel)]=\"pageDisplay\"\r\n name=\"{{fl?.form_field}}\">\r\n </ng-select>\r\n </div>\r\n </div>\r\n <div class=\"col-md-2\">\r\n <button class=\"btn btn-info\" type=\"button\" style=\"width:100%;\"\r\n (click)=\"addAttr(pageDisplay, sqlArray[fl.form_field], fl.default_value);\">Add</button>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <label class=\"col-md-3 control-label\">Selected Modules</label>\r\n <div cclass=\"col-md-9\">\r\n <div class=\"mds\">\r\n <ng-template #itemTemplate let-item=\"item\" let-index=\"index\">\r\n <span\r\n style=\"padding: 4px;border: 1px solid #c9c9c9;border-radius: 6px;display: inline-block;width: 100%;position: relative;\">\r\n <span>{{index+1}}</span> - {{item.value}}\r\n <span class=\"rm\" (click)=\"remove(fl.default_value,item.value,index,fl?.form_field);\">\r\n <i class=\"fa fa-times\" aria-hidden=\"true\"></i>\r\n </span>\r\n </span>\r\n </ng-template>\r\n <div class=\"row\">\r\n <div>\r\n <bs-sortable [(ngModel)]=\"fl.default_value\" name=\"{{fl?.form_field}}\"\r\n [itemTemplate]=\"itemTemplate\" itemClass=\"sortable-item\"\r\n itemActiveClass=\"sortable-item-active\" placeholderClass=\"placeholderStyle\"\r\n wrapperClass=\"sortable-wrapper\" #srf=\"ngModel\" [required]=\"fl?.is_compulsory == '1'\">\r\n </bs-sortable>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"srf.invalid && (srf.dirty || srf.touched)\" class=\"alert alert-danger ca\">\r\n <div *ngIf=\"srf.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group\" *ngIf=\"fl?.form_field_typ == 't' && fl?.dta_typ =='sa'\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <!-- <ng-select [items]=\"sqlArray[fl.form_field]\" [addTag]=\"addTag\" bindValue=\"k\" [hideSelected]=\"true\"\r\n multiple=\"true\" bindLabel=\"v\" name=\"{{fl?.form_field}}\" [(ngModel)]=\"fl.default_value\"\r\n #safield=\"ngModel\" [required]=\"fl?.is_compulsory == '1'\">\r\n </ng-select> -->\r\n\r\n <ng-select style=\"z-index: 5;\" [options]=\"sqlArray[fl.form_field]\"\r\n [(ngModel)]=\"fl.default_value\" [multiple]=\"true\" [allowClear]=\"true\" name=\"{{fl?.form_field}}\"\r\n #safield=\"ngModel\" [required]=\"fl?.is_compulsory == '1'\">\r\n <ng-template #optionTemplate let-option=\"option\">\r\n <div class=\"famfamfam-flags {{option?.value}}\"></div>\r\n {{option?.label}}\r\n </ng-template>\r\n </ng-select>\r\n\r\n </div>\r\n <div *ngIf=\"safield.invalid && (safield.dirty || safield.touched)\" class=\"alert alert-danger ca\">\r\n <div *ngIf=\"safield.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\" *ngIf=\"fl?.form_field_typ == 'ta' && fl?.is_hidden == 0 && fl?.dta_typ =='c'\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <textarea class=\"form-control\" rows=\"3\" name=\"{{fl?.form_field}}\" [value]=\"fl?.default_value\"\r\n [(ngModel)]=\"fl.default_value\" #textArea=\"ngModel\" (blur)=\"chkFun(fl,fl.default_value);\"\r\n [ngClass]=\"{'uniqErrMsg': fl?.form_field == onErr}\"\r\n [required]=\"fl?.is_compulsory == '1'\"></textarea>\r\n </div>\r\n <div *ngIf=\"textArea.invalid && (textArea.dirty || textArea.touched)\"\r\n class=\"alert alert-danger ca\">\r\n <div *ngIf=\"textArea.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"fl?.form_field_typ == 'hd' || fl?.form_field_typ == 'hc' || fl?.form_field_typ == 'df' || fl?.form_field_typ == 'fk' || fl?.form_field_typ == 'ck' && fl?.is_hidden == 0\"\r\n [ngClass]=\"{'mt0': fl?.form_field_typ == 'hd'}\">\r\n <input type=\"hidden\" class=\"form-control\" name=\"{{fl?.form_field}}\" [value]=\"fl?.default_value\"\r\n [(ngModel)]=\"fl.default_value\" #hdf=\"ngModel\" />\r\n </div>\r\n <div class=\"form-group\" *ngIf=\"fl?.form_field_typ == 'sq' && fl?.is_hidden == 0\">\r\n <label class=\"col-md-3 control-label\"></label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <input type=\"hidden\" class=\"form-control\" name=\"{{fl?.form_field}}\" [value]=\"fl?.default_value\"\r\n [(ngModel)]=\"fl.default_value\" />\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\" *ngIf=\"fl?.form_field_typ == 'tb' && fl?.is_hidden == 0\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <select class=\"form-control select\" name=\"{{fl?.form_field}}\" [value]=\"fl?.default_value\"\r\n [(ngModel)]=\"fl.default_value\" #tdf=\"ngModel\" [required]=\"fl?.is_compulsory == '1'\">\r\n <option *ngFor=\"let dynamic of sqlArray[fl.form_field]\" value=\"{{dynamic.value}}\">\r\n {{dynamic.label}}</option>\r\n </select>\r\n </div>\r\n <div *ngIf=\"tdf.invalid && (tdf.dirty || tdf.touched)\" class=\"alert alert-danger ca\">\r\n <div *ngIf=\"tdf.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\" *ngIf=\"fl?.form_field_typ == 'l' && fl?.is_hidden == 0\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <select class=\"form-control select\" name=\"{{fl?.form_field}}\" [value]=\"fl?.default_value\"\r\n [(ngModel)]=\"fl.default_value\" #lInput=\"ngModel\" [required]=\"fl?.is_compulsory == '1'\">\r\n <option *ngFor=\"let lov of fl.kv\" value=\"{{lov.k}}\">{{lov.v}}</option>\r\n </select>\r\n </div>\r\n <div *ngIf=\"lInput.invalid && (lInput.dirty || lInput.touched)\" class=\"alert alert-danger ca\">\r\n <div *ngIf=\"lInput.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\" *ngIf=\"fl?.form_field_typ == 'ld' && fl?.is_hidden == 0\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <select class=\"form-control select\" name=\"{{fl?.form_field}}\" [value]=\"fl?.default_value\"\r\n [(ngModel)]=\"fl.default_value\" #ldInput=\"ngModel\" [required]=\"fl?.is_compulsory == '1'\">\r\n <option *ngFor=\"let dynamic of sqlArray[fl.form_field]\" value=\"{{dynamic.value}}\">\r\n {{dynamic.label}}</option>\r\n </select>\r\n </div>\r\n <div *ngIf=\"ldInput.invalid && (ldInput.dirty || ldInput.touched)\" class=\"alert alert-danger ca\">\r\n <div *ngIf=\"ldInput.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\" *ngIf=\"fl?.form_field_typ == 's' && fl?.is_hidden == 0\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <select class=\"form-control select\" name=\"{{fl?.form_field}}\" [value]=\"fl?.default_value\"\r\n [(ngModel)]=\"fl.default_value\" (change)=\"chkFun(fl,fl.default_value)\" id=\"{{fl.column_key}}\"\r\n #sfi=\"ngModel\" [required]=\"fl?.is_compulsory == '1'\">\r\n <option *ngFor=\"let dynamic of sqlArray[fl.form_field]\" value=\"{{dynamic.value}}\">\r\n {{dynamic.label}}</option>\r\n </select>\r\n </div>\r\n <div *ngIf=\"sfi.invalid && (sfi.dirty || sfi.touched)\" class=\"alert alert-danger ca\">\r\n <div *ngIf=\"sfi.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group\" *ngIf=\"fl?.form_field_typ == 'sb'\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-8\">\r\n <div class=\"input-group w-100\">\r\n <ng-select style=\"z-index: 5;\" [options]=\"sqlArray[fl.form_field]\" #sfi=\"ngModel\"\r\n [(ngModel)]=\"fl.default_value\" name=\"{{fl?.form_field}}\"\r\n (selected)=\"chkFun(fl,fl.default_value)\"\r\n (filterInputChanged)=\"loadSuggdata($event,fl.page_item_idn,fl.form_field)\">\r\n </ng-select>\r\n </div>\r\n <div *ngIf=\"sfi.invalid && (sfi.dirty || sfi.touched)\" class=\"alert alert-danger ca\">\r\n <div *ngIf=\"sfi.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-1\" *ngIf=\"fl?.form_field_icon == 'add'\">\r\n <button type=\"button\" class=\"btn btn-success btn-rounded\"><span><i\r\n class=\"fa fa-plus\"></i></span></button>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"submit\" class=\"btn btn-success\" (click)=\"submitForm(f,submitBtn)\" appAppNoDblClick\r\n #submitBtn>{{btnName}}</button>\r\n <button type=\"reset\" class=\"btn btn-danger\" (click)=\"reset(f)\" *ngIf=\"btnName == 'Add'\">Reset</button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"modal\" id=\"deleteTermsmodal\" role=\"dialog\" aria-labelledby=\"smallModalHead\" aria-hidden=\"true\"\r\n data-backdrop=\"static\" data-keyboard=\"false\">\r\n <div class=\"modal-dialog modal-sm\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\" (click)=\"closeNull();\" #deleteclsbtn>\r\n <span aria-hidden=\"true\">×</span>\r\n <span class=\"sr-only\">Close</span>\r\n </button>\r\n <h4 class=\"modal-title\" id=\"smallModalHead\">Warning</h4>\r\n </div>\r\n <div class=\"modal-body\">\r\n Are you sure want to delete term?\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\">Close</button>\r\n <button type=\"button\" class=\"btn btn-danger\" data-dismiss=\"modal\" (click)=\"DeleteTerms();\">Delete</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"modal\" id=\"deletemodal\" role=\"dialog\" aria-labelledby=\"smallModalHead\" aria-hidden=\"true\"\r\n data-backdrop=\"static\" data-keyboard=\"false\">\r\n <div class=\"modal-dialog modal-sm\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\" (click)=\"closeNull();\" #deleteclsbtn>\r\n <span aria-hidden=\"true\">×</span>\r\n <span class=\"sr-only\">Close</span>\r\n </button>\r\n <h4 class=\"modal-title\" id=\"smallModalHead\">Warning</h4>\r\n </div>\r\n <div class=\"modal-body\">\r\n Are you sure want to delete?\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\">Close</button>\r\n <button type=\"button\" class=\"btn btn-danger\" data-dismiss=\"modal\"\r\n (click)=\"deleteDataList();\">Delete</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"modal\" id=\"modal_sys\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"defModalHead\" aria-hidden=\"true\">\r\n <div class=\"modal-dialog\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\">\r\n <span aria-hidden=\"true\">×</span>\r\n <span class=\"sr-only\">Close</span>\r\n </button>\r\n <h4 class=\"modal-title\" id=\"defModalHead\">Basic Modal</h4>\r\n </div>\r\n <div class=\"modal-body\">\r\n Some content in modal example\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\">Close</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"modal\" id=\"rowGrpmodal\" tabindex=\"-2\" role=\"dialog\" aria-labelledby=\"rowGrpmodal\" aria-hidden=\"true\"\r\n data-backdrop=\"static\" data-keyboard=\"false\">\r\n <div class=\"modal-dialog\">\r\n <div class=\"modal-content\">\r\n <form class=\"form-horizontal\" #frg=\"ngForm\" name=\"appFormRowGrp\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\" (click)=\"closeNull();\" #closebtn>\r\n <span aria-hidden=\"true\">×</span>\r\n <span class=\"sr-only\">Close</span>\r\n </button>\r\n <h4 class=\"modal-title\" id=\"rowGrpHead\">Row Group</h4>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"row\">\r\n <div class=\"col-md-12\" style=\"padding-bottom: 10px;\">\r\n <label class=\"col-md-2 control-label\">Attributes</label>\r\n <label class=\"col-md-5 control-label\" style=\"padding-right: 90px;\">Row Display</label>\r\n <label class=\"col-md-5 control-label\" style=\"padding-right: 76px;\">Row Group </label>\r\n </div>\r\n <div class=\"col-md-12\">\r\n <div class=\"form-group\" *ngFor=\"let att of display_attr;\">\r\n <label class=\"col-md-2 control-label\">{{att.attr}}</label>\r\n <div class=\"col-md-5\">\r\n <div class=\"input-group w-100\">\r\n <select class=\"form-control\" name=\"att.display_row\" [disabled]=\"disableselc\"\r\n id=\"row_{{att.attr}}\" [value]=\"att.display_row\" (change)=\"onChangeDispRow($event)\">\r\n <!-- [value]=\"att.display_row\" -->\r\n <option *ngFor=\"let dr of display_row;\" value=\"{{dr.idn}}\">{{dr.print}}</option>\r\n </select>\r\n </div>\r\n </div>\r\n <div class=\"col-md-5\">\r\n <div class=\"input-group w-100\">\r\n <select class=\"form-control\" name=\"att.display_group\" [disabled]=\"disableselc\"\r\n id=\"grp_{{att.attr}}\" [value]=\"att.display_group\" (change)=\"onChangeDispGrp($event)\">\r\n <option *ngFor=\"let dg of display_group;\" value=\"{{dg.idn}}\">{{dg.print}}</option>\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"reset\" class=\"btn btn-danger\" data-dismiss=\"modal\">close</button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n\r\n\r\n <div class=\"modal\" id=\"productDetailMapMD\" role=\"dialog\" aria-labelledby=\"smallModalHead\" aria-hidden=\"true\"\r\n data-backdrop=\"static\" data-keyboard=\"false\">\r\n <div class=\"modal-dialog modal-sm mwidth\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\" (click)=\"closeNull();\" #productMapclsbtn>\r\n <span aria-hidden=\"true\">×</span>\r\n <span class=\"sr-only\" productDetailMapclsbtn>Close</span>\r\n </button>\r\n <h4 class=\"modal-title\" id=\"smallModalHead\">Product Mapping of {{producDetailModelTitle}}</h4>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"table-responsive\">\r\n <table class=\"table table-bordered table-hover table-hover-cells\">\r\n <thead>\r\n <tr>\r\n <th>\r\n Name\r\n </th>\r\n <th>\r\n Value\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <ng-container *ngFor=\"let key of attrDtl?.prpList\">\r\n <tr>\r\n <td>\r\n {{key.print}}\r\n </td>\r\n <td>\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"attrMappingDtl[key?.val]\" />\r\n </td>\r\n </tr>\r\n </ng-container>\r\n </tbody>\r\n </table>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\" #productDetailMapclsbtn>Close</button>\r\n <button type=\"button\" class=\"btn btn-success\" data-dismiss=\"modal\"\r\n (click)=\"saveProductDetailMapping();\">Save</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"modal\" id=\"docdeletemodal\" role=\"dialog\" aria-labelledby=\"smallModalHead\" aria-hidden=\"true\"\r\n data-backdrop=\"static\" data-keyboard=\"false\">\r\n <div class=\"modal-dialog modal-sm\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\" (click)=\"closeNull();\" #deleteclsbtn>\r\n <span aria-hidden=\"true\">×</span>\r\n <span class=\"sr-only\">Close</span>\r\n </button>\r\n <h4 class=\"modal-title\" id=\"smallModalHead\">Warning</h4>\r\n </div>\r\n <div class=\"modal-body\">\r\n Are you sure want to delete?\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\">Close</button>\r\n <button type=\"button\" class=\"btn btn-danger\" data-dismiss=\"modal\" (click)=\"deleteDoc();\">Delete</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"modal\" id=\"bnkdeletemodal\" role=\"dialog\" aria-labelledby=\"smallModalHead\" aria-hidden=\"true\"\r\n data-backdrop=\"static\" data-keyboard=\"false\">\r\n <div class=\"modal-dialog modal-sm\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\" (click)=\"closeNull();\" #deleteclsbtn>\r\n <span aria-hidden=\"true\">×</span>\r\n <span class=\"sr-only\">Close</span>\r\n </button>\r\n <h4 class=\"modal-title\" id=\"smallModalHead\">Warning</h4>\r\n </div>\r\n <div class=\"modal-body\">\r\n Are you sure want to delete?\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\">Close</button>\r\n <button type=\"button\" class=\"btn btn-danger\" data-dismiss=\"modal\"\r\n (click)=\"DeleteLedgerBank()\">Delete</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <button id=\"bnkdeletemodalbtn\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#bnkdeletemodal\"></button>\r\n\r\n <button id=\"docdeletebtn\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#docdeletemodal\"></button>\r\n <button id=\"deletebtn\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#deletemodal\"></button>\r\n <button id=\"deleteTerms\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#deleteTermsmodal\"></button>\r\n\r\n <button id=\"datamdbtn\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#datamodal\"></button>\r\n <button id=\"clsMd\" [hidden]=\"true\" data-dismiss=\"modal\" data-target=\"#datamodal\"></button>\r\n <button id=\"sysmd\" [hidden]=\"true\" data-dismiss=\"modal\" data-target=\"#modal_sys\"></button>\r\n <button id=\"btnproductDetailMapMD\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#productDetailMapMD\"></button>\r\n\r\n <button id=\"rowGrpbtn\" [hidden]=\"true\" data-dismiss=\"modal\" data-toggle=\"modal\" data-target=\"#rowGrpmodal\"></button>\r\n </div>", styles: [".btn-default.btn-on-1.active,.btn-default.btn-off-1.active{background-color:#3b5998;color:#fff}.btn.btn-xs,.btn-group-xs>.btn{font-size:12px;padding:5px 15px}.tbactive{background:#3B5998;color:#fff}input[type=radio]{display:none}.content-frame-body{padding:0 10px 10px!important}.content-frame-left{background:transparent!important;width:250px!important}.f-12{font-size:12px}.mt0{margin-bottom:0!important}.headingCls{padding:10px;background:#f0efef;font-size:14px;font-weight:400;margin-bottom:20px}.onHover{position:absolute;top:50%;transform:translate(-50%,-50%);left:50%;width:100%;text-align:center}.sortable-item{display:inline-block!important}.mds{border:1px solid #c9c9c9;height:265px;overflow:auto;margin-top:15px;width:175px;position:relative;right:-10px}.mds ul{padding-left:10px;list-style:none}.mds ul li{margin:5px 0;-webkit-user-select:all;user-select:all}.page-container .page-content .content-frame .content-frame-left{padding:0 10px!important}.mwidth{width:500px}.thcenter,.tdcenter{text-align:center}.Inactive{background-color:#ebebe0}btn-file>input{position:absolute;top:0;right:0;width:100%;height:100%;margin:0;font-size:23px;cursor:pointer;filter:alpha(opacity=0);opacity:0;direction:ltr;background-color:#32c5d2;border-color:#32c5d2}.btn.green{color:#fff;background:#3b5998!important;border-color:#3b5998!important}.btn.red{color:#fff;background-color:#e7505a;border-color:#e7505a}\n"] }]
|
|
2462
|
+
}], ctorParameters: function () { return [{ type: i1.Router }, { type: i1.ActivatedRoute }, { type: i2.ToastrService }, { type: i3.SystemServiceService }, { type: i4.UploadFileService }, { type: i5.NgxSpinnerService }, { type: i6.ContactServiceService }, { type: i7.CommanServiceService }]; }, propDecorators: { closebtn: [{
|
|
2463
|
+
type: ViewChild,
|
|
2464
|
+
args: ["closebtn"]
|
|
2465
|
+
}], fileOptMapMDclsbtn: [{
|
|
2466
|
+
type: ViewChild,
|
|
2467
|
+
args: ["fileOptMapMDclsbtn"]
|
|
2468
|
+
}], productDetailMapclsbtn: [{
|
|
2469
|
+
type: ViewChild,
|
|
2470
|
+
args: ["productDetailMapclsbtn"]
|
|
2471
|
+
}], deleteclsbtn: [{
|
|
2472
|
+
type: ViewChild,
|
|
2473
|
+
args: ["deleteclsbtn"]
|
|
2474
|
+
}], input: [{
|
|
2475
|
+
type: ViewChild,
|
|
2476
|
+
args: ["inputs"]
|
|
2477
|
+
}], sortableComponent: [{
|
|
2478
|
+
type: ViewChild,
|
|
2479
|
+
args: [SortableComponent]
|
|
2480
|
+
}] } });
|
|
2481
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ViZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lemxpYi9zcmMvbGliL3N5c3RlbS1tb2R1bGUvc3ViZm9ybS9zdWJmb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2V6bGliL3NyYy9saWIvc3lzdGVtLW1vZHVsZS9zdWJmb3JtL3N1YmZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBVSxNQUFNLGlCQUFpQixDQUFDO0FBRWpFLE9BQU8sRUFBRSxhQUFhLEVBQUcsTUFBTSxZQUFZLENBQUM7QUFDNUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNoRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNoRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUMxRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUN0Rix5Q0FBeUM7QUFDekMsT0FBTyxLQUFLLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN6QyxxREFBcUQ7QUFDckQsc0VBQXNFO0FBQ3RFLHdDQUF3QztBQUN4QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMzRCx3RUFBd0U7QUFDeEUsaURBQWlEO0FBQ2pELDREQUE0RDtBQUM1RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw2Q0FBNkMs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QUF0QyxTQUFTO3VCQUFDLGNBQWM7Z0JBQ0osS0FBSztzQkFBekIsU0FBUzt1QkFBQyxRQUFRO2dCQUNXLGlCQUFpQjtzQkFBOUMsU0FBUzt1QkFBQyxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgVmlld0NoaWxkLCBFbGVtZW50UmVmIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgSHR0cEhlYWRlcnMgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcclxuaW1wb3J0IHsgUm91dGVyLCBBY3RpdmF0ZWRSb3V0ZSwgUGFyYW1zIH0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xyXG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7IFRvYXN0clNlcnZpY2UgIH0gZnJvbSBcIm5neC10b2FzdHJcIjtcclxuaW1wb3J0IHsgQ29va2llIH0gZnJvbSBcIm5nMi1jb29raWVzL25nMi1jb29raWVzXCI7XHJcbmltcG9ydCB7IE5neFNwaW5uZXJTZXJ2aWNlIH0gZnJvbSBcIm5neC1zcGlubmVyXCI7XHJcbmltcG9ydCB7IFN5c3RlbVNlcnZpY2VTZXJ2aWNlIH0gZnJvbSBcIi4uL3N5c3RlbS1zZXJ2aWNlL3N5c3RlbS1zZXJ2aWNlLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgVXBsb2FkRmlsZVNlcnZpY2UgfSBmcm9tIFwiLi4vc3lzdGVtLXNlcnZpY2UvdXBsb2FkLWZpbGUuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBDb250YWN0U2VydmljZVNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vY29udGFjdC1zZXJ2aWNlL2NvbnRhY3Qtc2VydmljZS5zZXJ2aWNlXCI7XHJcbi8vIGltcG9ydCAqIGFzIEFXUyBmcm9tICdhd3Mtc2RrL2dsb2JhbCc7XHJcbmltcG9ydCAqIGFzIFMzIGZyb20gXCJhd3Mtc2RrL2NsaWVudHMvczNcIjtcclxuLy8gaW1wb3J0ICogYXMgYXdzc2VydmljZSBmcm9tIFwiYXdzLXNkay9saWIvc2VydmljZVwiO1xyXG4vLyBpbXBvcnQgKiBhcyBDb2duaXRvSWRlbnRpdHkgZnJvbSBcImF3cy1zZGsvY2xpZW50cy9jb2duaXRvaWRlbnRpdHlcIjtcclxuLy8gaW1wb3J0IHsgcHJvbWlzZSB9IGZyb20gXCJwcm90cmFjdG9yXCI7XHJcbmltcG9ydCB7IFNvcnRhYmxlQ29tcG9uZW50IH0gZnJvbSBcIm5neC1ib290c3RyYXAvc29ydGFibGVcIjtcclxuLy8gaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kgfSBmcm9tIFwiQGFuZ3VsYXIvY29tcGlsZXIvc3JjL2NvcmVcIjtcclxuLy8gaW1wb3J0IHsgYXN5bmMgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZS90ZXN0aW5nXCI7XHJcbi8vIGltcG9ydCB7IGRlYm91bmNlIH0gZnJvbSBcInJ4anMtY29tcGF0L29wZXJhdG9yL2RlYm91bmNlXCI7XHJcbmltcG9ydCB7IENvbW1hblNlcnZpY2VTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL2NvbW1hbi1zZXJ2aWNlL2NvbW1hbi1zZXJ2aWNlLnNlcnZpY2VcIjtcclxuLy8gaW1wb3J0IHsgc3RyaW5naWZ5IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmUvc3JjL3JlbmRlcjMvdXRpbFwiO1xyXG5cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcImFwcC1zdWJmb3JtXCIsXHJcbiAgdGVtcGxhdGVVcmw6IFwiLi9zdWJmb3JtLmNvbXBvbmVudC5odG1sXCIsXHJcbiAgc3R5bGVVcmxzOiBbXCIuL3N1YmZvcm0uY29tcG9uZW50LmNzc1wiXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgU3ViZm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgQFZpZXdDaGlsZChcImNsb3NlYnRuXCIpIGNsb3NlYnRuOiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoXCJmaWxlT3B0TWFwTURjbHNidG5cIikgZmlsZU9wdE1hcE1EY2xzYnRuOiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoXCJwcm9kdWN0RGV0YWlsTWFwY2xzYnRuXCIpIHByb2R1Y3REZXRhaWxNYXBjbHNidG46IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZChcImRlbGV0ZWNsc2J0blwiKSBkZWxldGVjbHNidG46IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZChcImlucHV0c1wiKSBpbnB1dDogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKFNvcnRhYmxlQ29tcG9uZW50KSBzb3J0YWJsZUNvbXBvbmVudDogU29ydGFibGVDb21wb25lbnQ7XHJcblxyXG4gIC8vI3JlZ2lvbiB2YXJzIGFuZCBvYmogZGVjbGFyYXRpb24gc2VjdGlvblxyXG4gIGNEdCA9IG5ldyBEYXRlKCk7XHJcblxyXG4gIGZvcm1GaWxkcyA9IFtdO1xyXG4gIGRhdGFsaXN0ID0gW107XHJcbiAgYWN0aW9ucyA9IFtdO1xyXG4gIGxvdnMgPSBbXTtcclxuICBhZGROZXc6IGFueSA9IFtdO1xyXG4gIHRibEggPSBbXTtcclxuICB0YmxEZXNjID0gW107XHJcbiAgbmF2aWdhdGlvbiA9IFtdO1xyXG4gIGNMaW5rID0gMDtcclxuICBnbGJPYmogPSB7fTtcclxuXHJcbiAgc2hvd2FycjtcclxuICBwYWdlSW5mbztcclxuICBoZWFkZXI7XHJcbiAgYnRuTmFtZTtcclxuICBwaWQ7XHJcbiAgc2VhcmNoRjtcclxuICB3aHJLO1xyXG4gIHdoclY7XHJcbiAgc3ViRnJtV2s7XHJcbiAgc3ViRnJtV3Y7XHJcbiAgbmF2Zm9ybTtcclxuICBvbkVycjtcclxuICBob3ZlcmVkSTtcclxuICB0YkNlbGw7XHJcbiAgdGl0bGU7XHJcbiAgcGtmO1xyXG4gIGN1cmw7XHJcbiAgdWlHcnBMaXN0O1xyXG4gIHVpR3JwTGlzdER0bDtcclxuICBhdHRyQ0xpc3REdGwgPSBbXTtcclxuICBhdHRyUUxpc3REdGwgPSBbXTtcclxuXHJcbiAgZGZ2O1xyXG4gIGNpO1xyXG4gIGRpc2FibGVzZWxjID0gZmFsc2U7XHJcblxyXG4gIGRhdGFEdGxpc3QgPSBbXTtcclxuICBkYXRhRHRsID0gW107XHJcbiAgaXRlbVN0cmluZ3NMZWZ0OiBhbnkgPSBbXTtcclxuXHJcbiAgYWRkRnJtTm1lO1xyXG4gIGRvY3VtZW50VXBsb2FkTGlzdDtcclxuICBkb2N1bWVudFVwbG9hZER0bDtcclxuICBzZWxlY3RlZEZpbGVzO1xyXG4gIGFwcGxpY2F0aW9uTGlzdCA9IFtdO1xyXG4gIHVzZXJEdGxzID0gW107XHJcbiAgbW9kdWxlRHRscyA9IFtdO1xyXG4gIG1lbnVMaXN0ID0gW107XHJcbiAgdXNlclJpZ2h0c01lbnVMaXN0ID0gW107XHJcbiAgdG90TWVudTtcclxuICBzdWJNZW51SWRucyA9IFtdO1xyXG4gIHdoZXJlTWFwID0ge307XHJcbiAgcGFyYU9iaiA9IHt9O1xyXG4gIGN1cnJPYmogPSB7fTtcclxuICBzcWxBcnJheSA9IHt9O1xyXG4gIHMzZGV0YWlscyA9IHt9O1xyXG5cclxuICBkb2N0eXBlO1xyXG4gIHBrID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5wYXJhbU1hcC5nZXQoXCJzdWJrXCIpO1xyXG4gIHB2ID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5wYXJhbU1hcC5nZXQoXCJzdWJ2XCIpO1xyXG5cclxuICBHRk9MREVSID0gXCJlemJpei8yMDUvZG9jL1wiO1xyXG4gIEdCVUNLRVQgPSBcInFzXCI7XHJcbiAgZmlsZVVwbG9hZHMgPSBbXTtcclxuICBuYW1lQXR0ciA9IFtdO1xyXG5cclxuICBmaWxlO1xyXG5cclxuICByZXNGaWxlcztcclxuICBpbWFnZVVybExzdCA9IFtdO1xyXG4gIHAgPSAxO1xyXG4gIHBhZ2VTaXplID0gMTA7XHJcbiAgb3JkZXIgPSBcIlwiO1xyXG4gIGV2ZUMgPSBcImZhLWV5ZS1zbGFzaFwiO1xyXG4gIGVzdHN0ID0gZmFsc2U7XHJcbiAgaW5wdXR0eXBlID0gXCJwYXNzd29yZFwiO1xyXG5cclxuICByZXZlcnNlID0gdHJ1ZTtcclxuICBzdWJmb3JtID0gZmFsc2U7XHJcbiAgdXNyaXNFeGlzdCA9IGZhbHNlO1xyXG4gIGljbztcclxuXHJcbiAgZGlzcGxheV9ncm91cCA9IFtdO1xyXG4gIGRpc3BsYXlfcm93ID0gW107XHJcbiAgZGlzcGxheV9hdHRyID0gW107XHJcbiAgY29sVmFscyA9IFtdO1xyXG5cclxuICB0ZXJtc0xpc3QgPSBbXTtcclxuICBhcHBsVXNlckxpc3QgPSBbXTtcclxuICByb3V0aGVyRG9jXHJcbiAgZGF0YVRybnNMaXN0ID0gW107XHJcbiAgYnlyT2JqID0ge307XHJcbiAgdXNlckRldGFpbHMgPSBbXTtcclxuICBwYWdlRGVmaW5hdGlvblBzd2RDbmc7XHJcbiAgcGFnZV90eXA7XHJcbiAgYXR0ckR0bDtcclxuICBhdHRyTWFwcGluZ0R0bDtcclxuICBhdHRyX2R0bF9pZG47XHJcbiAgb3V0TWFwcGluZ0xpc3QgPSBbXTtcclxuICBhdHRyTGlzdCA9IFtdO1xyXG4gIGNvbnRhY3ROYW1lO1xyXG4gIHByb2R1Y0RldGFpbE1vZGVsVGl0bGU7XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICAgIHByaXZhdGUgdG9hc3RyOiBUb2FzdHJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBzczogU3lzdGVtU2VydmljZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHVwbG9hZFNlcnZpY2U6IFVwbG9hZEZpbGVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBzcGlubmVyU2VydmljZTogTmd4U3Bpbm5lclNlcnZpY2UgLFxyXG4gICAgcHVibGljIGNzOiBDb250YWN0U2VydmljZVNlcnZpY2UsXHJcbiAgICBwdWJsaWMgY206IENvbW1hblNlcnZpY2VTZXJ2aWNlXHJcbiAgKSB7IH1cclxuXHJcbiAgZ2V0UGFnZURlZmluYXRpb24oKSB7XHJcbiAgICB0aGlzLnJvdXRoZXJEb2MgPSBcIlwiO1xyXG4gICAgdGhpcy5kYXRhbGlzdCA9IFtdO1xyXG4gICAgdGhpcy53aGVyZU1hcCA9IFtdO1xyXG4gICAgbGV0IGZybW5tZSA9IHRoaXMucm91dGUuc25hcHNob3QucGFyYW1zW1wiaXRtZm9ybVwiXSB8fCBcIlwiO1xyXG4gICAgbGV0IGRvY3R5cCA9IHRoaXMucm91dGUuc25hcHNob3QucGFyYW1zW1wiZG9jdHlwXCJdIHx8IFwiXCI7XHJcbiAgICBkZWJ1Z2dlclxyXG4gICAgdGhpcy5zcGlubmVyU2VydmljZS5zaG93KCk7XHJcbiAgICBpZiAodGhpcy5wayAhPSBudWxsICYmIHRoaXMuc3ViRnJtV2sgIT0gbnVsbCkge1xyXG4gICAgICAvL3N1YkZybVdrID09IG5hdmlnYXRpb24gcGFuZWwncyBtZW51XHJcbiAgICAgIGlmICh0aGlzLnN1YkZybVd2ICE9IFwiQUxMXCIpIHtcclxuICAgICAgICB0aGlzLnBhcmFPYmpbXCJ3aGVyZUtleXNcIl0gPSB0aGlzLnBrICsgXCJ+XCIgKyB0aGlzLnN1YkZybVdrO1xyXG4gICAgICAgIHRoaXMucGFyYU9ialtcIndoZXJlVmx1c1wiXSA9IFwiXCIgKyB0aGlzLnB2ICsgXCJ+XCIgKyB0aGlzLnN1YkZybVd2O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMucGFyYU9ialtcIndoZXJlS2V5c1wiXSA9IHRoaXMucGs7XHJcbiAgICAgICAgdGhpcy5wYXJhT2JqW1wid2hlcmVWbHVzXCJdID0gXCJcIiArIHRoaXMucHY7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy53aGVyZU1hcFt0aGlzLnN1YkZybVdrXSA9IHRoaXMuc3ViRnJtV3Y7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnBhcmFPYmpbXCJ3aGVyZUtleXNcIl0gPSB0aGlzLnBrO1xyXG4gICAgICB0aGlzLnBhcmFPYmpbXCJ3aGVyZVZsdXNcIl0gPSBcIlwiICsgdGhpcy5wdjtcclxuICAgICAgdGhpcy53aGVyZU1hcFt0aGlzLnBrXSA9IHRoaXMucHY7XHJcbiAgICB9XHJcbiAgICB0aGlzLmhlYWRlcltcIm1ldGhvZFwiXSA9IFwibG9hZExpc3RcIjtcclxuICAgIC8vIGlmICh0aGlzLnBhZ2VJbmZvICE9IG51bGwpIHtcclxuICAgIC8vICAgdGhpcy5wYWdlX3R5cD10aGlzLnBhZ2VJbmZvLnBhZ2VfdHlwO1xyXG4gICAgLy8gICB2YXIgcGFnZVRQID0gdGhpcy5wYWdlSW5mby5wYWdlX3R5cDtcclxuICAgIC8vICAgaWYgKHBhZ2VUUCA9PSBcImpzb25Gb3JtXCIpIHtcclxuICAgIC8vICAgICB0aGlzLnBhcmFPYmpbXCJ3aGVyZUtleXNcIl0gPSB0aGlzLnBhZ2VJbmZvLndoZXJlX2NsYXVzZTtcclxuICAgIC8vICAgICB0aGlzLnBhcmFPYmpbXCJ3aGVyZVZsdXNcIl0gPSB0aGlzLndoZXJlTWFwW3RoaXMucGFnZUluZm8ud2hlcmVfY2xhdXNlXTtcclxuICAgIC8vICAgfVxyXG4gICAgLy8gfVxyXG4gICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkodGhpcy5oZWFkZXIpKTtcclxuICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHRoaXMucGFyYU9iaikpO1xyXG4gICAgbGV0IG9wdGlvbnMgPSAoeyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnModGhpcy5oZWFkZXIpIH0pO1xyXG4gICAgdGhpcy5zc1xyXG4gICAgICAuZ2V0RGF0YSh0aGlzLnBhcmFPYmosIG9wdGlvbnMpXHJcbiAgICAgIC50aGVuKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSBcIlNVQ0NFU1NcIikge1xyXG4gICAgICAgICAgZGVidWdnZXI7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhyZXNwb25zZSk7XHJcbiAgICAgICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgICAgIHRoaXMudGJsSCA9IHJlc3BvbnNlLmRhdGFIZWFkZXI7XHJcbiAgICAgICAgICB0aGlzLnRibERlc2MgPSByZXNwb25zZS5kYXRhSGVhZGVyUHJpbnQ7XHJcbiAgICAgICAgICB0aGlzLmFkZE5ldyA9IHJlc3BvbnNlLmJ1dHRvbnNbMF07XHJcbiAgICAgICAgICB0aGlzLnBhZ2VJbmZvID0gcmVzcG9uc2UucGFnZUluZm87XHJcbiAgICAgICAgICB0aGlzLnBrZiA9IHJlc3BvbnNlLnBhZ2VJbmZvLnByaW1hcnlfa2V5X2ZpZWxkO1xyXG4gICAgICAgICAgdGhpcy5kYXRhbGlzdCA9IHJlc3BvbnNlLmRhdGFMaXN0O1xyXG4gICAgICAgICAgdGhpcy5hY3Rpb25zID0gcmVzcG9uc2UuYWN0aW9ucztcclxuICAgICAgICAgIHRoaXMubmF2aWdhdGlvbiA9IHJlc3BvbnNlLm5hdmlnYXRpb247XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMucGFyYU9ialtcIndoZXJlS2V5c1wiXSA9PSBcIm5tZV9pZG5cIiB8fCB0aGlzLnBhcmFPYmpbXCJ3aGVyZUtleXNcIl0gPT0gXCJsZWRnZXJfaWRuXCIpIHtcclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICh0aGlzLnBhcmFPYmpbXCJmb3JtTm1lXCJdID09IFwibmFtZU1hc3RlclwiIHx8IHRoaXMucGFyYU9ialtcImZvcm1ObWVcIl0gPT0gXCJsZWRnZXJNYXN0ZXJcIiB8fCB0aGlzLnBhcmFPYmpbXCJmb3JtTm1lXCJdID09IFwiYWNjTmFtZU1hc3RlclwiKSAmJlxyXG4gICAgICAgICAgICAgIHRoaXMuZGF0YWxpc3QubGVuZ3RoID09IDFcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgbGV0IGR0RHRsID0gdGhpcy5kYXRhbGlzdFswXTtcclxuICAgICAgICAgICAgICBsZXQgbm1lID0gZHREdGxbXCJubWVcIl0gfHwgXCJcIjtcclxuICAgICAgICAgICAgICBsZXQgcG5tZSA9IGR0RHRsW1wicGVyc29uX25tZVwiXSB8fCBcIlwiO1xyXG4gICAgICAgICAgICAgIGlmIChubWUgIT0gXCJcIiB8fCBwbm1lICE9IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29udGFjdE5hbWUgPSBubWUgKyBcIi9cIiArIHBubWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRhY3ROYW1lID0gdGhpcy5jb250YWN0TmFtZS50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5jb250YWN0TmFtZSA9IFwiXCI7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKGRvY3R5cCAhPSAnJykge1xyXG4gICAgICAgICAgICB0aGlzLnJvdXRoZXJEb2MgPSBkb2N0eXA7XHJcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvbi5mb3JFYWNoKChlbGVtZW50LCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChlbGVtZW50LmZvcm1fZmllbGQgPT0gJ3VwbG9hZERvY3VtZW50Jykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uRnVuKGVsZW1lbnQsIGluZGV4KTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IocmVzcG9uc2UubWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICAuY2F0Y2goKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoZXJyLm1lc3NhZ2UpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldFJvd0dyb3VwKGRpc3BsYXlBdHRySWRuKSB7XHJcbiAgICBsZXQgcmVxT2JqID0ge307XHJcbiAgICByZXFPYmpbXCJkaXNwbGF5QXR0cklkblwiXSA9IGRpc3BsYXlBdHRySWRuO1xyXG4gICAgdGhpcy5oZWFkZXJbXCJtZXRob2RcIl0gPSBcImdldFBhZ2VEaXNwbGF5QXR0clwiO1xyXG4gICAgbGV0IG9wdGlvbnMgPSAoeyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnModGhpcy5oZWFkZXIpIH0pO1xyXG4gICAgdGhpcy5zc1xyXG4gICAgICAuZ2V0Um93R3JvdXAocmVxT2JqLCBvcHRpb25zLCBcImFkbWluL21lbnVSaWdodHNcIilcclxuICAgICAgLnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09IFwiU1VDQ0VTU1wiKSB7XHJcbiAgICAgICAgICB0aGlzLmRpc3BsYXlfZ3JvdXAgPSByZXNwb25zZS5yZXN1bHQuZGlzcGxheV9ncm91cDtcclxuICAgICAgICAgIHRoaXMuZGlzcGxheV9yb3cgPSByZXNwb25zZS5yZXN1bHQuZGlzcGxheV9yb3c7XHJcbiAgICAgICAgICB0aGlzLmRpc3BsYXlfYXR0ciA9IHJlc3BvbnNlLnJlc3VsdC5kaXNwbGF5X2F0dHI7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMudG9hc3RyLmVycm9yKHJlc3BvbnNlLm1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgLmNhdGNoKChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMudG9hc3RyLmVycm9yKGVyci5tZXNzYWdlKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBTYXZlUm93R3JvdXAoZGlzcGxheUF0dHJJZG4sIGNvbG5hbWUsIGNvbFZhbHMpIHtcclxuICAgIHRoaXMuc3Bpbm5lclNlcnZpY2Uuc2hvdygpO1xyXG4gICAgbGV0IHJlcU9iaiA9IHt9O1xyXG4gICAgcmVxT2JqW1wiZGlzcGxheUF0dHJJZG5cIl0gPSBkaXNwbGF5QXR0cklkbjtcclxuICAgIHJlcU9ialtcImNvbHVtbk5hbWVcIl0gPSBjb2xuYW1lO1xyXG4gICAgcmVxT2JqW1wiY29sdW1uVmFsdWVcIl0gPSBjb2xWYWxzO1xyXG4gICAgdGhpcy5oZWFkZXJbXCJtZXRob2RcIl0gPSBcInNhdmVQYWdlRGlzcGxheUF0dHJcIjtcclxuICAgIGxldCBvcHRpb25zID0gKHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHRoaXMuaGVhZGVyKSB9KTtcclxuICAgIHRoaXMuc3NcclxuICAgICAgLmdldFJvd0dyb3VwKHJlcU9iaiwgb3B0aW9ucywgXCJhZG1pbi9tZW51UmlnaHRzXCIpXHJcbiAgICAgIC50aGVuKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSBcIlNVQ0NFU1NcIikge1xyXG4gICAgICAgICAgdGhpcy5kaXNhYmxlc2VsYyA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0ci5zdWNjZXNzKHJlc3BvbnNlLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgdGhpcy5jb2xWYWxzID0gW107XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IocmVzcG9uc2UubWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICAuY2F0Y2goKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoZXJyLm1lc3NhZ2UpO1xyXG4gICAgICB9KTtcclxuICB9XHJcbiAgb25DaGFuZ2VEaXNwUm93KGUpIHtcclxuICAgIHRoaXMuZGlzYWJsZXNlbGMgPSB0cnVlO1xyXG4gICAgZm9yICh2YXIga2V5IGluIGUudGFyZ2V0LmZvcm0uZWxlbWVudHMpIHtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIGUudGFyZ2V0LmZvcm0uZWxlbWVudHNba2V5XS5pZCAhPSBcIlwiICYmXHJcbiAgICAgICAgZS50YXJnZXQuZm9ybS5lbGVtZW50c1trZXldLmlkICE9IHVuZGVmaW5lZCAmJlxyXG4gICAgICAgIGUudGFyZ2V0LmZvcm0uZWxlbWVudHNba2V5XS5pZCAhPSBcInVuZGVmaW5lZFwiXHJcbiAgICAgIClcclxuICAgICAgICBpZiAoZS50YXJnZXQuZm9ybS5lbGVtZW50c1trZXldLmlkLnN0YXJ0c1dpdGgoXCJyb3dfXCIpKSB7XHJcbiAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIGUudGFyZ2V0LmZvcm0uZWxlbWVudHNba2V5XS52YWx1ZSAhPSBcIlwiICYmXHJcbiAgICAgICAgICAgIGUudGFyZ2V0LmZvcm0uZWxlbWVudHNba2V5XS52YWx1ZSAhPSB1bmRlZmluZWQgJiZcclxuICAgICAgICAgICAgZS50YXJnZXQuZm9ybS5lbGVtZW50c1trZXldLnZhbHVlICE9IFwidW5kZWZpbmVkXCJcclxuICAgICAgICAgIClcclxuICAgICAgICAgICAgdGhpcy5jb2xWYWxzLnB1c2goZS50YXJnZXQuZm9ybS5lbGVtZW50c1trZXldLnZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLlNhdmVSb3dHcm91cCh0aGlzLnBpZCwgXCJkaXNwbGF5X3Jvd1wiLCB0aGlzLmNvbFZhbHMpO1xyXG4gIH1cclxuXHJcbiAgb25DaGFuZ2VEaXNwR3JwKGUpIHtcclxuICAgIHRoaXMuZGlzYWJsZXNlbGMgPSB0cnVlO1xyXG4gICAgZm9yICh2YXIga2V5IGluIGUudGFyZ2V0LmZvcm0uZWxlbWVudHMpIHtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIGUudGFyZ2V0LmZvcm0uZWxlbWVudHNba2V5XS5pZCAhPSBcIlwiICYmXHJcbiAgICAgICAgZS50YXJnZXQuZm9ybS5lbGVtZW50c1trZXldLmlkICE9IHVuZGVmaW5lZCAmJlxyXG4gICAgICAgIGUudGFyZ2V0LmZvcm0uZWxlbWVudHNba2V5XS5pZCAhPSBcInVuZGVmaW5lZFwiXHJcbiAgICAgIClcclxuICAgICAgICBpZiAoZS50YXJnZXQuZm9ybS5lbGVtZW50c1trZXldLmlkLnN0YXJ0c1dpdGgoXCJncnBfXCIpKSB7XHJcbiAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIGUudGFyZ2V0LmZvcm0uZWxlbWVudHNba2V5XS52YWx1ZSAhPSBcIlwiICYmXHJcbiAgICAgICAgICAgIGUudGFyZ2V0LmZvcm0uZWxlbWVudHNba2V5XS52YWx1ZSAhPSB1bmRlZmluZWQgJiZcclxuICAgICAgICAgICAgZS50YXJnZXQuZm9ybS5lbGVtZW50c1trZXldLnZhbHVlICE9IFwidW5kZWZpbmVkXCJcclxuICAgICAgICAgIClcclxuICAgICAgICAgICAgdGhpcy5jb2xWYWxzLnB1c2goZS50YXJnZXQuZm9ybS5lbGVtZW50c1trZXldLnZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLlNhdmVSb3dHcm91cCh0aGlzLnBpZCwgXCJkaXNwbGF5X2dyb3VwXCIsIHRoaXMuY29sVmFscyk7XHJcbiAgfVxyXG4gIGdldEZvcm1GaWVsZHMoKSB7XHJcbiAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLnNob3coKTtcclxuICAgIHRoaXMuZGZ2ID0gbnVsbDtcclxuICAgIHRoaXMucGFyYU9ialtcIndoZXJlS2V5c1wiXSA9IHRoaXMucGs7XHJcbiAgICB0aGlzLnBhcmFPYmpbXCJ3aGVyZVZsdXNcIl0gPSB0aGlzLnB2O1xyXG4gICAgdGhpcy5oZWFkZXJbXCJtZXRob2RcIl0gPSBcImxvYWRBZGRFZGl0XCI7XHJcbiAgICBjb25zb2xlLmxvZyh0aGlzLnBhcmFPYmopO1xyXG4gICAgY29uc29sZS5sb2codGhpcy5oZWFkZXIpO1xyXG4gICAgbGV0IG9wdGlvbnMgPSAoeyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnModGhpcy5oZWFkZXIpIH0pO1xyXG4gICAgdGhpcy5zc1xyXG4gICAgICAuZ2V0Rm9ybUYodGhpcy5wYXJhT2JqLCBvcHRpb25zKVxyXG4gICAgICAudGhlbigocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT0gXCJTVUNDRVNTXCIgJiYgcmVzcG9uc2UubWVzc2FnZSAhPSBcIlNVQ0NFU1NcIikge1xyXG4gICAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IocmVzcG9uc2UubWVzc2FnZSk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT0gXCJTVUNDRVNTXCIpIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKHJlc3BvbnNlKTtcclxuICAgICAgICAgIHRoaXMuZm9ybUZpbGRzID0gcmVzcG9uc2UuZm9ybUZpZWxkcztcclxuICAgICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgICAgdGhpcy5mb3JtRmlsZHMuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICAgICAgaWYgKGVsZW1lbnQuZm9ybV9maWVsZF90eXAgPT0gXCJ0YlwiKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5nZXRMb3ZMaXN0KGVsZW1lbnQuZm9ybV9maWVsZCwgZWxlbWVudC5wYWdlX2l0ZW1faWRuKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZWxlbWVudC5mb3JtX2ZpZWxkX3R5cCA9PSBcInNcIikge1xyXG4gICAgICAgICAgICAgIHRoaXMuZ2V0TG92TGlzdChlbGVtZW50LmZvcm1fZmllbGQsIGVsZW1lbnQucGFnZV9pdGVtX2lkbik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGVsZW1lbnQuZm9ybV9maWVsZF90eXAgPT0gXCJoZFwiKSB7XHJcbiAgICAgICAgICAgICAgZWxlbWVudC5kZWZhdWx0X3ZhbHVlID0gdGhpcy53aGVyZU1hcFtlbGVtZW50LmZvcm1fZmllbGRdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50LmZvcm1fZmllbGRfdHlwID09IFwiZmtcIikge1xyXG4gICAgICAgICAgICAgIGVsZW1lbnQuZGVmYXVsdF92YWx1ZSA9IHRoaXMucm91dGUuc25hcHNob3QucGFyYW1NYXAuZ2V0KFwic3VidlwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZWxlbWVudC5mb3JtX2ZpZWxkX3R5cCA9PSBcImNrXCIpIHtcclxuICAgICAgICAgICAgICBlbGVtZW50LmRlZmF1bHRfdmFsdWUgPSB0aGlzLndoZXJlTWFwW2VsZW1lbnQuY29sdW1uX2tleV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGVsZW1lbnQuZm9ybV9maWVsZF90eXAgPT0gXCJzcVwiKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5nZXRTZXF1ZW5jZShlbGVtZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZWxlbWVudC5kdGFfdHlwID09IFwic2FcIikge1xyXG4gICAgICAgICAgICAgIHRoaXMuZ2V0TG92TGlzdChlbGVtZW50LmZvcm1fZmllbGQsIGVsZW1lbnQucGFnZV9pdGVtX2lkbik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGVsZW1lbnQuZHRhX3R5cCA9PSBcInNyXCIpIHtcclxuICAgICAgICAgICAgICB0aGlzLmdldExvdkxpc3QoZWxlbWVudC5mb3JtX2ZpZWxkLCBlbGVtZW50LnBhZ2VfaXRlbV9pZG4pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcihyZXNwb25zZS5tZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIC5jYXRjaCgoZXJyOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcihlcnIubWVzc2FnZSk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdXNlckFjdGlvbih1YSwgYywgYSwgaSkge1xyXG4gICAgZGVidWdnZXJcclxuICAgIGlmIChjLnRyaW0oKSA9PSBcImFkZFwiKSB7XHJcbiAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2Uuc2hvdygpO1xyXG4gICAgICB0aGlzLmZvcm1GaWxkcyA9IFtdO1xyXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImRhdGFtZGJ0blwiKS5jbGljaygpO1xyXG4gICAgICB0aGlzLmdldEZvcm1GaWVsZHMoKTtcclxuICAgICAgdGhpcy5idG5OYW1lID0gXCJBZGRcIjtcclxuICAgIH0gZWxzZSBpZiAodWEgJiYgYy50cmltKCkgPT0gXCJlZGl0XCIpIHtcclxuICAgICAgdGhpcy5nbGJPYmogPSB1YTtcclxuICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5zaG93KCk7XHJcbiAgICAgIHRoaXMuZm9ybUZpbGRzID0gW107XHJcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiZGF0YW1kYnRuXCIpLmNsaWNrKCk7XHJcbiAgICAgIHRoaXMucGlkID0gdWFbdGhpcy5wa2ZdO1xyXG4gICAgICB0aGlzLmdldEVkaXREYXRhKHVhKTtcclxuICAgICAgdGhpcy5idG5OYW1lID0gXCJFZGl0XCI7XHJcbiAgICB9IGVsc2UgaWYgKFxyXG4gICAgICB1YSAmJlxyXG4gICAgICBjLnRyaW0oKSA9PSBcImFkZEl0ZW1cIiAmJlxyXG4gICAgICBhLmZvcm1fZmllbGRfdGl0bGUgIT0gXCJBZGQgTWFwcGluZ1wiXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5zaG93KCk7XHJcbiAgICAgIHRoaXMuZm9ybUZpbGRzID0gW107XHJcbiAgICAgIHRoaXMuY3VybCA9IGEubG92X3FyeTtcclxuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2EubG92X3FyeSwgdGhpcy5wa2YsIHVhW3RoaXMucGtmXV0pO1xyXG4gICAgfSBlbHNlIGlmICh1YSAmJiBjLnRyaW0oKSA9PSBcImRlbGV0ZXRlcm1zXCIpIHtcclxuXHJcbiAgICAgIHRoaXMuY2kgPSBpO1xyXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImRlbGV0ZVRlcm1zXCIpLmNsaWNrKCk7XHJcbiAgICAgIHRoaXMucGlkID0gdWFbdGhpcy5wa2ZdO1xyXG4gICAgfSBlbHNlIGlmICh1YSAmJiBjLnRyaW0oKSA9PSBcImRlbGV0ZVwiKSB7XHJcblxyXG4gICAgICB0aGlzLmNpID0gaTtcclxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJkZWxldGVidG5cIikuY2xpY2soKTtcclxuICAgICAgdGhpcy5waWQgPSB1YVt0aGlzLnBrZl07XHJcbiAgICB9IGVsc2UgaWYgKHVhICYmIGMudHJpbSgpID09IFwiZGVmaW5hdGlvblwiKSB7XHJcbiAgICAgIHRoaXMuY2kgPSBpO1xyXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInJvd0dycGJ0blwiKS5jbGljaygpO1xyXG4gICAgICB0aGlzLnBpZCA9IHVhW3RoaXMucGtmXTtcclxuICAgICAgdGhpcy5nZXRSb3dHcm91cCh0aGlzLnBpZCk7XHJcbiAgICB9IGVsc2UgaWYgKFxyXG4gICAgICB1YSAmJlxyXG4gICAgICBjLnRyaW0oKSA9PSBcImFkZEl0ZW1cIiAmJlxyXG4gICAgICBhLmZvcm1fZmllbGRfdGl0bGUgPT0gXCJBZGQgTWFwcGluZ1wiXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5wcm9kdWNEZXRhaWxNb2RlbFRpdGxlID0gdWEuZGlzcGxheTtcclxuICAgICAgdGhpcy5sb2FkUHJvZHVjdERldGFpbE1hcHBpbmcodWFbXCJhdHRyX2RfaWRuXCJdKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGxvYWRQcm9kdWN0RGV0YWlsTWFwcGluZyhhdHRyRHRhaWxJZG4pIHtcclxuICAgIHRoaXMuYXR0cl9kdGxfaWRuID0gYXR0ckR0YWlsSWRuO1xyXG4gICAgdGhpcy5zcGlubmVyU2VydmljZS5zaG93KCk7XHJcbiAgICBsZXQgb2JqID0ge307XHJcbiAgICBvYmpbXCJmb3JtTm1lXCJdID0gXCJmaWxlVXBsb2FkXCI7XHJcbiAgICBvYmpbXCJhdHRyX2R0bF9pZG5cIl0gPSBhdHRyRHRhaWxJZG47XHJcbiAgICB0aGlzLmhlYWRlcltcIm1ldGhvZFwiXSA9IFwibG9hZFByZE1hc3Rlck1hcHBpbmdcIjtcclxuICAgIGxldCBvcHRpb25zID0gKHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHRoaXMuaGVhZGVyKSB9KTtcclxuICAgIHRoaXMuc3NcclxuICAgICAgLlNhdmUob2JqLCBvcHRpb25zLCBcImZpbGVVcGxvYWQvbG9hZFwiKVxyXG4gICAgICAudGhlbigocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT0gXCJTVUNDRVNTXCIpIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKHJlc3BvbnNlKTtcclxuICAgICAgICAgIGxldCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQ7XHJcbiAgICAgICAgICB0aGlzLmF0dHJEdGwgPSByZXN1bHQuYXR0ckR0bDtcclxuICAgICAgICAgIHRoaXMuYXR0ck1hcHBpbmdEdGwgPSByZXN1bHQuYXR0ck1hcHBpbmdEdGw7XHJcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImJ0bnByb2R1Y3REZXRhaWxNYXBNRFwiKS5jbGljaygpO1xyXG4gICAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IocmVzcG9uc2UubWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICAuY2F0Y2goKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoZXJyLm1lc3NhZ2UpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHNhdmVQcm9kdWN0RGV0YWlsTWFwcGluZygpIHtcclxuICAgIHRoaXMuc3Bpbm5lclNlcnZpY2Uuc2hvdygpO1xyXG4gICAgbGV0IG9iaiA9IHt9O1xyXG4gICAgb2JqW1wiZm9ybU5tZVwiXSA9IFwiZmlsZVVwbG9hZFwiO1xyXG4gICAgb2JqW1wiYXR0cl9kdGxfaWRuXCJdID0gdGhpcy5hdHRyX2R0bF9pZG47XHJcbiAgICBvYmpbXCJhdHRyRHRsTWFwXCJdID0gdGhpcy5hdHRyTWFwcGluZ0R0bDtcclxuICAgIHRoaXMuaGVhZGVyW1wibWV0aG9kXCJdID0gXCJ1cGRhdGVQcm9kdWN0QXR0clwiO1xyXG4gICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkob2JqKSk7XHJcbiAgICBsZXQgb3B0aW9ucyA9ICh7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh0aGlzLmhlYWRlcikgfSk7XHJcbiAgICB0aGlzLnNzXHJcbiAgICAgIC5TYXZlKG9iaiwgb3B0aW9ucywgXCJmaWxlVXBsb2FkL2xvYWRcIilcclxuICAgICAgLnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09IFwiU1VDQ0VTU1wiKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhyZXNwb25zZSk7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0ci5zdWNjZXNzKHJlc3BvbnNlLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgICB0aGlzLnByb2R1Y3REZXRhaWxNYXBjbHNidG4ubmF0aXZlRWxlbWVudC5jbGljaygpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgICAgIHRoaXMudG9hc3RyLmVycm9yKHJlc3BvbnNlLm1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgLmNhdGNoKChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgIHRoaXMudG9hc3RyLmVycm9yKGVyci5tZXNzYWdlKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBuYXZpZ2F0aW9uRnVuKG5hdiwgaSkge1xyXG4gICAgZGVidWdnZXJcclxuICAgIHRoaXMuY0xpbmsgPSBpO1xyXG4gICAgdGhpcy5zdWJGcm1XayA9IG5hdi5jb2x1bW5fa2V5LnRyaW0oKSB8fCAnJztcclxuICAgIHRoaXMuc3ViRnJtV3YgPSBuYXYuZm9ybV9maWVsZC50cmltKCkgfHwgJyc7XHJcbiAgICBpZiAodGhpcy5zdWJGcm1XdiA9PSBcIjBcIilcclxuICAgICAgdGhpcy5zdWJGcm1XdiA9IFwiXCI7XHJcbiAgICB0aGlzLm5hdmZvcm0gPSBuYXYubG92X3FyeS50cmltKCk7XHJcbiAgICBpZiAodGhpcy5zdWJGcm1XdiA9PSBcIlwiKSB7XHJcbiAgICAgIHRoaXMuc3ViRnJtV2sgPSBudWxsO1xyXG4gICAgICB0aGlzLnN1YkZybVd2ID0gbnVsbDtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLm5hdmZvcm0gIT0gXCJcIikge1xyXG4gICAgICBpZiAodGhpcy5uYXZmb3JtID09IFwiYWRkdGlvbmFsRHRsTWFzdGVyXCIpIHtcclxuICAgICAgICB0aGlzLmFkZEZybU5tZSA9IHRoaXMubmF2Zm9ybTtcclxuICAgICAgICBsZXQgbWRsID0gWydjb250YWN0J107XHJcbiAgICAgICAgdGhpcy5nZXROYW1lQXR0cih0aGlzLmFkZEZybU5tZSwgbWRsKTtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLm5hdmZvcm0gPT0gXCJsZWRnZXJBZGR0aW9uYWxEdGxNYXN0ZXJcIikge1xyXG4gICAgICAgIHRoaXMuYWRkRnJtTm1lID0gdGhpcy5uYXZmb3JtO1xyXG4gICAgICAgIGxldCBtZGwgPSBbJ2xlZGdfYXR0ciddO1xyXG4gICAgICAgIHRoaXMuZ2V0TGVkZ2VyQXR0cih0aGlzLmFkZEZybU5tZSwgbWRsLCAnYXR0cicpO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMubmF2Zm9ybSA9PSBcImxlZGdlckFjY0FkZGl0aW5hbERldGFpbHNcIikge1xyXG4gICAgICAgIHRoaXMuYWRkRnJtTm1lID0gdGhpcy5uYXZmb3JtO1xyXG4gICAgICAgIGxldCBtZGwgPSBbJ2xlZGdhY2NfYXR0ciddO1xyXG4gICAgICAgIHRoaXMuZ2V0TGVkZ2VyQXR0cih0aGlzLmFkZEZybU5tZSwgbWRsLCAnYWNjX2F0dHInKTtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLm5hdmZvcm0gPT0gXCJhY2NEZWxldGVSdWxlc0Zvcm1cIikge1xyXG4gICAgICAgIHRoaXMuYWRkRnJtTm1lID0gdGhpcy5uYXZmb3JtO1xyXG4gICAgICAgIGxldCBtZGwgPSBbJ2RlbGV0ZV9ydWxlJ107XHJcbiAgICAgICAgdGhpcy5nZXRMZWRnZXJBdHRyKHRoaXMuYWRkRnJtTm1lLCBtZGwsICdkZWxldGVfcnVsZScpO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMubmF2Zm9ybSA9PSBcImFjY0pvdXJuYWxBdHRyRm9ybVwiKSB7XHJcbiAgICAgICAgdGhpcy5hZGRGcm1ObWUgPSB0aGlzLm5hdmZvcm07XHJcbiAgICAgICAgbGV0IG1kbCA9IFsnam5sYWNjX2F0dHInXTtcclxuICAgICAgICB0aGlzLmdldExlZGdlckF0dHIodGhpcy5hZGRGcm1ObWUsIG1kbCwgJ2pubGFjY19hdHRyJyk7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5uYXZmb3JtID09IFwiYWNjTG9hbkF0dHJGb3JtXCIpIHtcclxuICAgICAgICB0aGlzLmFkZEZybU5tZSA9IHRoaXMubmF2Zm9ybTtcclxuICAgICAgICBsZXQgbWRsID0gWydsb2FuJ107XHJcbiAgICAgICAgdGhpcy5nZXRMZWRnZXJBdHRyKHRoaXMuYWRkRnJtTm1lLCBtZGwsICdsb2FuJyk7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5uYXZmb3JtID09IFwiYWNjSm91cm5hbFNldHRpbmdGb3JtXCIpIHtcclxuICAgICAgICB0aGlzLmFkZEZybU5tZSA9IHRoaXMubmF2Zm9ybTtcclxuICAgICAgICBsZXQgbWRsID0gWydqbmxfc2V0dCddO1xyXG4gICAgICAgIHRoaXMuZ2V0Sm91cm5hbEF0dHIodGhpcy5hZGRGcm1ObWUsIG1kbCwgJ2pubF9zZXR0Jyk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAodGhpcy5uYXZmb3JtID09IFwiZG9jdW1lbnRVcGxvYWRNYXN0ZXJcIikge1xyXG4gICAgICAgIHRoaXMuYWRkRnJtTm1lID0gdGhpcy5uYXZmb3JtO1xyXG4gICAgICAgIHRoaXMuZ2V0RmlsZXModGhpcy5wdik7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5uYXZmb3JtID09IFwibWVudUFjY2Vzc01hc3RlclwiKSB7XHJcbiAgICAgICAgdGhpcy5hZGRGcm1ObWUgPSB0aGlzLm5hdmZvcm07XHJcbiAgICAgICAgLy8gIHRoaXMubG9hZFVzck1kbCh0aGlzLnB2KTsvL1xyXG4gICAgICAgIHRoaXMubG9hZEFwcGxpY2F0aW9uKCk7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5uYXZmb3JtID09IFwid2ViTWVudUFjY2Vzc01hc3RlclwiKSB7XHJcbiAgICAgICAgdGhpcy5hZGRGcm1ObWUgPSB0aGlzLm5hdmZvcm07XHJcbiAgICAgICAgLy8gIHRoaXMubG9hZFVzck1kbCh0aGlzLnB2KTsvL1xyXG4gICAgICAgIHRoaXMubG9hZFdlYkFwcGxpY2F0aW9uKCk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAodGhpcy5uYXZmb3JtID09IFwibW9kdWxlQWNjZXNzTWFzdGVyXCIpIHtcclxuICAgICAgICB0aGlzLmFkZEZybU5tZSA9IHRoaXMubmF2Zm9ybTtcclxuICAgICAgICB0aGlzLmxvYWRVc3JNZGwodGhpcy5wdik7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5uYXZmb3JtID09IFwidGVybVVzZXJBc3NpZ25Gb3JtXCIpIHtcclxuICAgICAgICB0aGlzLmFkZEZybU5tZSA9IHRoaXMubmF2Zm9ybTtcclxuICAgICAgICB0aGlzLmxvYWRBcHBsaWNhdGlvblVzZXJUZXJtcyh0aGlzLnB2KTtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLm5hdmZvcm0gPT0gXCJzZXRQYXNzd29yZEZvcm1cIikge1xyXG4gICAgICAgIHRoaXMuYWRkRnJtTm1lID0gdGhpcy5uYXZmb3JtO1xyXG4gICAgICAgIHRoaXMubG9hZFVzZXJQYXNzd29yZCgpO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMubmF2Zm9ybSA9PSBcImxlZGdlckJhbmtEZXRhaWxzXCIpIHtcclxuICAgICAgICB0aGlzLmFkZEZybU5tZSA9IHRoaXMubmF2Zm9ybTtcclxuICAgICAgICB0aGlzLmxvYWRsZWRnZXJCYW5rRGV0YWlscygpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMucGFyYU9ialtcImZvcm1ObWVcIl0gPSB0aGlzLm5hdmZvcm07XHJcbiAgICAgICAgdGhpcy5nZXRQYWdlRGVmaW5hdGlvbigpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIGV4aXRCYW5rRHRsTGlzdCA9IFtdO1xyXG4gIGxvYWRsZWRnZXJCYW5rRGV0YWlscygpIHtcclxuICAgIHRoaXMuc3Bpbm5lclNlcnZpY2Uuc2hvdygpO1xyXG4gICAgbGV0IHJlcU9iaiA9IHt9O1xyXG4gICAgcmVxT2JqWydmb3JtTm1lJ10gPSAnbGVkZ2VyQmFua0RldGFpbHMnO1xyXG4gICAgcmVxT2JqWydsZWRnZXJfaWRuJ10gPSB0aGlzLnJvdXRlLnNuYXBzaG90LnBhcmFtTWFwLmdldCgnc3VidicpO1xyXG4gICAgdGhpcy5oZWFkZXJbJ21ldGhvZCddID0gJ2xvYWRsZWRnZXJCYW5rRGV0YWlsJztcclxuICAgIGxldCBvcHRpb25zID0gKHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHRoaXMuaGVhZGVyKSB9KTtcclxuICAgIHRoaXMuY3MubG9hZChyZXFPYmosIG9wdGlvbnMsICdhY2NvdW50cy9hY2NMZWRnZXInKS50aGVuKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT0gJ1NVQ0NFU1MnKSB7XHJcbiAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdDtcclxuICAgICAgICB0aGlzLmV4aXRCYW5rRHRsTGlzdCA9IHJlc3VsdC5iYW5rRHRsTGlzdCB8fCBbXTtcclxuICAgICAgICB0aGlzLmVkaXRiYW5rX2R0bF9pZG4gPSBcIlwiO1xyXG4gICAgICAgIHRoaXMuYnJhbmNoID0gXCJcIjtcclxuICAgICAgICB0aGlzLmFjY291bnRubyA9IFwiXCI7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RCcmFuY2hBZGRyZXNzID0gXCJcIjtcclxuICAgICAgICB0aGlzLmJhbmsgPSBcIlwiO1xyXG4gICAgICAgIHRoaXMuYmFua0xpc3QgPSBbXTtcclxuICAgICAgICB0aGlzLmJhbmtEdGxMaXN0ID0gW107XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IocmVzcG9uc2UubWVzc2FnZSlcclxuICAgICAgfVxyXG4gICAgfSkuY2F0Y2goKGVycjogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICB0aGlzLnRvYXN0ci5lcnJvcihlcnIubWVzc2FnZSlcclxuICAgIH0pO1xyXG5cclxuICB9XHJcbiAgYmFua0xpc3QgPSBbXTtcclxuICBiYW5rRHRsTGlzdCA9IFtdO1xyXG4gIGJhbms7XHJcbiAgYnJhbmNoID0gXCJcIjtcclxuICBhY2NvdW50bm87XHJcbiAgYWNjb3VudFR5cGUgPSBcInNhdmluZ3NcIlxyXG4gIGxlZGdlckJhbmtEZXRhaWxzKHN0cikge1xyXG4gICAgdGhpcy5zcGlubmVyU2VydmljZS5zaG93KCk7XHJcbiAgICBsZXQgcmVxT2JqID0ge307XHJcbiAgICByZXFPYmpbJ2Zvcm1ObWUnXSA9ICdsZWRnZXJCYW5rRGV0YWlscyc7XHJcbiAgICByZXFPYmpbJ2xpa2VTdHInXSA9IHN0cjtcclxuICAgIHRoaXMuaGVhZGVyWydtZXRob2QnXSA9ICdsb2FkUGFydHlCYW5rJztcclxuICAgIGxldCBvcHRpb25zID0gKHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHRoaXMuaGVhZGVyKSB9KTtcclxuICAgIHRoaXMuY3MubG9hZChyZXFPYmosIG9wdGlvbnMsICdhY2NvdW50cy9hY2NMZWRnZXInKS50aGVuKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT0gJ1NVQ0NFU1MnKSB7XHJcbiAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdDtcclxuICAgICAgICB0aGlzLmJhbmtMaXN0ID0gcmVzdWx0LmJhbmtMaXN0Lm1hcChvcHRpb24gPT4gKHtcclxuICAgICAgICAgIHZhbHVlOiBvcHRpb24sXHJcbiAgICAgICAgICBsYWJlbDogb3B0aW9uXHJcbiAgICAgICAgfSkpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgIHRoaXMudG9hc3RyLmVycm9yKHJlc3BvbnNlLm1lc3NhZ2UpXHJcbiAgICAgIH1cclxuICAgIH0pLmNhdGNoKChlcnI6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgdGhpcy50b2FzdHIuZXJyb3IoZXJyLm1lc3NhZ2UpXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldEJhbmtCcmFuY2goYmFuaykge1xyXG4gICAgdGhpcy5icmFuY2ggPSBcIlwiO1xyXG4gICAgdGhpcy5zZWxlY3RCcmFuY2hBZGRyZXNzID0gXCJcIjtcclxuICAgIHRoaXMuc2VsZWN0SWZzYyA9IFwiXCI7XHJcbiAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLnNob3coKTtcclxuICAgIGxldCByZXFPYmogPSB7fTtcclxuICAgIHJlcU9ialsnZm9ybU5tZSddID0gJ2xlZGdlckJhbmtEZXRhaWxzJztcclxuICAgIHJlcU9ialsnYmFua05tZSddID0gYmFuaztcclxuICAgIHRoaXMuaGVhZGVyWydtZXRob2QnXSA9ICdnZXRQYXJ0eUJhbmtEdGwnO1xyXG4gICAgbGV0IG9wdGlvbnMgPSAoeyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnModGhpcy5oZWFkZXIpIH0pO1xyXG4gICAgdGhpcy5jcy5sb2FkKHJlcU9iaiwgb3B0aW9ucywgJ2FjY291bnRzL2FjY0xlZGdlcicpLnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSAnU1VDQ0VTUycpIHtcclxuICAgICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0O1xyXG4gICAgICAgIHRoaXMuYmFua0R0bExpc3QgPSByZXN1bHQuYmFua0R0bExpc3QgfHwgW107XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IocmVzcG9uc2UubWVzc2FnZSlcclxuICAgICAgfVxyXG4gICAgfSkuY2F0Y2goKGVycjogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICB0aGlzLnRvYXN0ci5lcnJvcihlcnIubWVzc2FnZSlcclxuICAgIH0pO1xyXG5cclxuICB9XHJcbiAgc2VsZWN0QnJhbmNoRHRsID0ge307XHJcbiAgc2VsZWN0QnJhbmNoQWRkcmVzcyA9IFwiXCI7XHJcbiAgc2VsZWN0SWZzYyA9IFwiXCI7XHJcbiAgc2VsZWN0QnJhbmNoKGJyYW5jaCkge1xyXG4gICAgdGhpcy5zZWxlY3RCcmFuY2hBZGRyZXNzID0gXCJcIjtcclxuICAgIHRoaXMuc2VsZWN0QnJhbmNoRHRsID0gdGhpcy5iYW5rRHRsTGlzdC5maW5kKHggPT4geC5ubWVfaWRuID09IGJyYW5jaCkgfHwgJyc7XHJcbiAgICBsZXQgYWRkcmVzcyA9IHRoaXMuc2VsZWN0QnJhbmNoRHRsWydhZGRyZXNzJ10gfHwgW107XHJcbiAgICBpZiAoYWRkcmVzcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGxldCBhZGRyZXNzRHRsID0gYWRkcmVzc1swXTtcclxuICAgICAgbGV0IGFyZWEgPSBhZGRyZXNzRHRsWydhcmVhJ10gfHwgXCJcIjtcclxuICAgICAgaWYgKGFyZWEgPT0gXCJudWxsXCIpXHJcbiAgICAgICAgYXJlYSA9IFwiXCI7XHJcbiAgICAgIGxldCBzdHJlZXQgPSBhZGRyZXNzRHRsWydzdHJlZXQnXSB8fCBcIlwiO1xyXG4gICAgICBpZiAoc3RyZWV0ID09IFwibnVsbFwiKVxyXG4gICAgICAgIHN0cmVldCA9IFwiXCI7XHJcbiAgICAgIGxldCB1bml0X25vID0gYWRkcmVzc0R0bFsndW5pdF9ubyddIHx8IFwiXCI7XHJcbiAgICAgIGlmICh1bml0X25vID09IFwibnVsbFwiKVxyXG4gICAgICAgIHVuaXRfbm8gPSBcIlwiO1xyXG4gICAgICBsZXQgYnVpbGRpbmcgPSBhZGRyZXNzRHRsWydidWlsZGluZyddIHx8IFwiXCI7XHJcbiAgICAgIGlmIChidWlsZGluZyA9PSBcIm51bGxcIilcclxuICAgICAgICBidWlsZGluZyA9IFwiXCI7XHJcbiAgICAgIGxldCBsYW5kbWFyayA9IGFkZHJlc3NEdGxbJ2xhbmRtYXJrJ10gfHwgXCJcIjtcclxuICAgICAgaWYgKGxhbmRtYXJrID09IFwibnVsbFwiKVxyXG4gICAgICAgIGxhbmRtYXJrID0gXCJcIjtcclxuICAgICAgbGV0IHppcCA9IGFkZHJlc3NEdGxbJ3ppcCddIHx8IFwiXCI7XHJcbiAgICAgIGlmICh6aXAgPT0gXCJudWxsXCIpXHJcbiAgICAgICAgemlwID0gXCJcIjtcclxuICAgICAgbGV0IGNpdHlfbm0gPSBhZGRyZXNzRHRsWydjaXR5X25tJ10gfHwgXCJcIjtcclxuICAgICAgaWYgKGNpdHlfbm0gPT0gXCJudWxsXCIpXHJcbiAgICAgICAgY2l0eV9ubSA9IFwiXCI7XHJcbiAgICAgIGxldCBjb3VudHJ5X25tID0gYWRkcmVzc0R0bFsnY291bnRyeV9ubSddIHx8IFwiXCI7XHJcbiAgICAgIGlmIChjb3VudHJ5X25tID09IFwibnVsbFwiKVxyXG4gICAgICAgIGNvdW50cnlfbm0gPSBcIlwiO1xyXG4gICAgICBsZXQgc3RhdGVfbm0gPSBhZGRyZXNzRHRsWydzdGF0ZV9ubSddIHx8IFwiXCI7XHJcbiAgICAgIGlmIChzdGF0ZV9ubSA9PSBcIm51bGxcIilcclxuICAgICAgICBzdGF0ZV9ubSA9IFwiXCI7XHJcbiAgICAgIHRoaXMuc2VsZWN0SWZzYyA9IHRoaXMuc2VsZWN0QnJhbmNoRHRsWydhdHRyJ11bJ2lmc2MnXTtcclxuICAgICAgdGhpcy5zZWxlY3RCcmFuY2hBZGRyZXNzID0gdW5pdF9ubyArIFwiIFwiICsgYnVpbGRpbmcgKyBcIiBcIiArIHN0cmVldCArIFwiIFwiICsgYXJlYSArIFwiIFwiICsgbGFuZG1hcmsgKyBcIiBcIiArIGNpdHlfbm0gKyBcIiBcIiArIHN0YXRlX25tICsgXCIgXCIgKyB6aXBcclxuXHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgbG9hZExlZGdlckJhbmsoKSB7XHJcblxyXG4gIH1cclxuICBlZGl0YmFua19kdGxfaWRuID0gXCJcIjtcclxuICBsb2FkRWRpdEJhbmtEdGwoYmFua2R0bCkge1xyXG4gICAgZGVidWdnZXJcclxuICAgIGxldCBiYW5rTmFtZSA9IGJhbmtkdGwuYmFua25hbWU7XHJcbiAgICB0aGlzLmJhbmtMaXN0ID0gW3tcclxuICAgICAgdmFsdWU6IGJhbmtOYW1lLFxyXG4gICAgICBsYWJlbDogYmFua05hbWVcclxuICAgIH1dO1xyXG4gICAgdGhpcy5iYW5rID0gYmFua05hbWU7XHJcbiAgICB0aGlzLmdldEJhbmtCcmFuY2goYmFua05hbWUpO1xyXG4gICAgdGhpcy5lZGl0YmFua19kdGxfaWRuID0gYmFua2R0bC5iYW5rZHRsSWRuO1xyXG4gICAgdGhpcy5hY2NvdW50VHlwZSA9IGJhbmtkdGwuYWNjb3VudFR5cGU7XHJcbiAgICB0aGlzLmFjY291bnRubyA9IGJhbmtkdGwuYWNjb3VudE5vO1xyXG4gICAgdGhpcy5zZWxlY3RCcmFuY2hBZGRyZXNzID0gYmFua2R0bC5hZGRyZXNzO1xyXG4gICAgdGhpcy5zZWxlY3RJZnNjID0gYmFua2R0bC5pZnNjO1xyXG4gICAgdGhpcy5icmFuY2ggPSBiYW5rZHRsLmJhbmtSZWZJZG47XHJcbiAgfVxyXG4gIFNhdmVMZWRnZXJCYW5rKCkge1xyXG4gICAgdGhpcy5zcGlubmVyU2VydmljZS5zaG93KCk7XHJcbiAgICBsZXQgcmVxT2JqID0ge307XHJcbiAgICByZXFPYmpbJ2Zvcm1ObWUnXSA9ICdsZWRnZXJCYW5rRGV0YWlscyc7XHJcbiAgICByZXFPYmpbJ2xlZGdlcl9pZG4nXSA9IHRoaXMucm91dGUuc25hcHNob3QucGFyYW1NYXAuZ2V0KCdzdWJ2Jyk7XHJcbiAgICByZXFPYmpbJ2JhbmtfcmVmX2lkbiddID0gdGhpcy5icmFuY2g7XHJcbiAgICByZXFPYmpbJ2FjY291bnRfdHlwZSddID0gdGhpcy5hY2NvdW50VHlwZTtcclxuICAgIHJlcU9ialsnYWNjb3VudF9ubyddID0gdGhpcy5hY2NvdW50bm87XHJcbiAgICBpZiAodGhpcy5lZGl0YmFua19kdGxfaWRuID09ICcnKVxyXG4gICAgICByZXFPYmpbJ2FjdGlvbiddID0gJ2FkZCc7XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmVxT2JqWydhY3Rpb24nXSA9ICdlZGl0JztcclxuICAgICAgcmVxT2JqWydiYW5rX2R0bF9pZG4nXSA9IHRoaXMuZWRpdGJhbmtfZHRsX2lkbjtcclxuICAgIH1cclxuICAgIHRoaXMuaGVhZGVyWydtZXRob2QnXSA9ICdzYXZlQmFua0R0bEludG9BY2NMZWRnZXInO1xyXG4gICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkocmVxT2JqKSk7XHJcbiAgICBsZXQgb3B0aW9ucyA9ICh7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh0aGlzLmhlYWRlcikgfSk7XHJcbiAgICB0aGlzLnNzLnN1YkZnZXREYXRhKHJlcU9iaiwgb3B0aW9ucywgJ2FjY291bnRzL2FjY0xlZGdlcicpLnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSAnU1VDQ0VTUycpIHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0O1xyXG4gICAgICAgIHRoaXMuZXhpdEJhbmtEdGxMaXN0ID0gcmVzdWx0LmJhbmtEdGxMaXN0IHx8IFtdO1xyXG4gICAgICAgIHRoaXMuYnJhbmNoID0gXCJcIjtcclxuICAgICAgICB0aGlzLmFjY291bnRubyA9IFwiXCI7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RCcmFuY2hBZGRyZXNzID0gXCJcIjtcclxuICAgICAgICB0aGlzLmJhbmsgPSBcIlwiO1xyXG4gICAgICAgIHRoaXMuYmFua0xpc3QgPSBbXTtcclxuICAgICAgICB0aGlzLmJhbmtEdGxMaXN0ID0gW107XHJcbiAgICAgICAgdGhpcy5lZGl0YmFua19kdGxfaWRuID0gXCJcIjtcclxuICAgICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgICBpZiAodGhpcy5lZGl0YmFua19kdGxfaWRuID09IFwiXCIpXHJcbiAgICAgICAgICB0aGlzLnRvYXN0ci5zdWNjZXNzKFwiTmV3IEJhbmsgYWRkIHN1Y2Nlc3NmdWxseVwiKTtcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHRoaXMudG9hc3RyLnN1Y2Nlc3MoXCJCYW5rIGVkaXQgc3VjY2Vzc2Z1bHlcIik7XHJcbiAgICAgICAgICB0aGlzLmVkaXRiYW5rX2R0bF9pZG4gPSBcIlwiO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IocmVzcG9uc2UubWVzc2FnZSlcclxuICAgICAgfVxyXG4gICAgfSkuY2F0Y2goKGVycjogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICB0aGlzLnRvYXN0ci5lcnJvcihlcnIubWVzc2FnZSlcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZGVsZXRCYW5rSWRuID0gXCJcIjtcclxuICBDb25maXJtRGVsZXRlTGVkZ2VyQmFuayhiYW5rZHRsKSB7XHJcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYm5rZGVsZXRlbW9kYWxidG4nKS5jbGljaygpO1xyXG4gICAgdGhpcy5kZWxldEJhbmtJZG4gPSBiYW5rZHRsLmJhbmtkdGxJZG47XHJcbiAgfVxyXG5cclxuICBEZWxldGVMZWRnZXJCYW5rKCkge1xyXG4gICAgdGhpcy5zcGlubmVyU2VydmljZS5zaG93KCk7XHJcbiAgICBsZXQgcmVxT2JqID0ge307XHJcbiAgICByZXFPYmpbJ2Zvcm1ObWUnXSA9ICdsZWRnZXJCYW5rRGV0YWlscyc7XHJcbiAgICByZXFPYmpbJ2xlZGdlcl9pZG4nXSA9IHRoaXMucm91dGUuc25hcHNob3QucGFyYW1NYXAuZ2V0KCdzdWJ2Jyk7XHJcbiAgICByZXFPYmpbJ2FjdGlvbiddID0gJ2RlbGV0ZSc7XHJcbiAgICByZXFPYmpbJ2JhbmtfZHRsX2lkbiddID0gdGhpcy5kZWxldEJhbmtJZG47XHJcblxyXG4gICAgdGhpcy5oZWFkZXJbJ21ldGhvZCddID0gJ3NhdmVCYW5rRHRsSW50b0FjY0xlZGdlcic7XHJcbiAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShyZXFPYmopKTtcclxuICAgIGxldCBvcHRpb25zID0gKHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHRoaXMuaGVhZGVyKSB9KTtcclxuICAgIHRoaXMuc3Muc3ViRmdldERhdGEocmVxT2JqLCBvcHRpb25zLCAnYWNjb3VudHMvYWNjTGVkZ2VyJykudGhlbigocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09ICdTVUNDRVNTJykge1xyXG4gICAgICAgIGxldCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQ7XHJcbiAgICAgICAgdGhpcy5leGl0QmFua0R0bExpc3QgPSByZXN1bHQuYmFua0R0bExpc3QgfHwgW107XHJcbiAgICAgICAgdGhpcy5kZWxldEJhbmtJZG4gPSBcIlwiO1xyXG4gICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgIHRoaXMudG9hc3RyLnN1Y2Nlc3MoXCJCYW5rIERlbGV0ZSBzdWNjZXNzZnVsbHlcIik7XHJcblxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgIHRoaXMudG9hc3RyLmVycm9yKHJlc3BvbnNlLm1lc3NhZ2UpO1xyXG4gICAgICB9XHJcbiAgICB9KS5jYXRjaCgoZXJyOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgIHRoaXMudG9hc3RyLmVycm9yKGVyci5tZXNzYWdlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0TGVkZ2VyQXR0cihmb3JtbmFtZSwgbWRsLCB0eXBlKSB7XHJcbiAgICBkZWJ1Z2dlcjtcclxuICAgIGxldCByZXFPYmogPSB7fTtcclxuICAgIHJlcU9ialtcImZvcm1ObWVcIl0gPSBmb3JtbmFtZTtcclxuICAgIHJlcU9ialtcImxlZGdlcl9pZG5cIl0gPSB0aGlzLnJvdXRlLnNuYXBzaG90LnBhcmFtTWFwLmdldChcInN1YnZcIik7XHJcbiAgICByZXFPYmpbJ21kbExpc3QnXSA9IG1kbDtcclxuICAgIHJlcU9ialsndHlwZSddID0gdHlwZTtcclxuICAgIHRoaXMuaGVhZGVyW1wibWV0aG9kXCJdID0gXCJsb2FkTGVkZ2VyQXR0clwiO1xyXG4gICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkocmVxT2JqKSk7XHJcbiAgICBsZXQgb3B0aW9ucyA9ICh7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh0aGlzLmhlYWRlcikgfSk7XHJcbiAgICB0aGlzLnNzLnN1YkZnZXREYXRhKHJlcU9iaiwgb3B0aW9ucywgXCJhY2NvdW50cy9hY2NMZWRnZXJcIilcclxuICAgICAgLnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09IFwiU1VDQ0VTU1wiKSB7XHJcbiAgICAgICAgICB0aGlzLnBhZ2VJbmZvID0gcmVzcG9uc2UucGFnZUluZm8gfHwge307XHJcbiAgICAgICAgICB0aGlzLnVpR3JwTGlzdCA9IHJlc3BvbnNlLnVpR3JwTGlzdDtcclxuICAgICAgICAgIHRoaXMudWlHcnBMaXN0RHRsID0gcmVzcG9uc2UudWlHcnBMaXN0RHRsO1xyXG4gICAgICAgICAgdGhpcy5hdHRyQ0xpc3REdGwgPSByZXNwb25zZS5hdHRyQ0xpc3REdGw7XHJcbiAgICAgICAgICB0aGlzLmF0dHJRTGlzdER0bCA9IHJlc3BvbnNlLmF0dHJRTGlzdER0bDtcclxuXHJcbiAgICAgICAgICB0aGlzLmRhdGFEdGwgPSByZXNwb25zZS5kYXRhRHRsO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgICAgIHRoaXMudG9hc3RyLmVycm9yKHJlc3BvbnNlLm1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgLmNhdGNoKChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgIHRoaXMudG9hc3RyLmVycm9yKGVyci5tZXNzYWdlKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXRKb3VybmFsQXR0cihmb3JtbmFtZSwgbWRsLCB0eXBlKSB7XHJcbiAgICBkZWJ1Z2dlcjtcclxuICAgIGxldCByZXFPYmogPSB7fTtcclxuICAgIHJlcU9ialtcImZvcm1ObWVcIl0gPSBmb3JtbmFtZTtcclxuICAgIHJlcU9ialtcImpvdXJuYWxfaWRuXCJdID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5wYXJhbU1hcC5nZXQoXCJzdWJ2XCIpO1xyXG4gICAgcmVxT2JqWydtZGxMaXN0J10gPSBtZGw7XHJcbiAgICByZXFPYmpbJ3R5cGUnXSA9IHR5cGU7XHJcbiAgICB0aGlzLmhlYWRlcltcIm1ldGhvZFwiXSA9IFwibG9hZEpvdXJuYWxBdHRyXCI7XHJcbiAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShyZXFPYmopKTtcclxuICAgIGxldCBvcHRpb25zID0gKHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHRoaXMuaGVhZGVyKSB9KTtcclxuICAgIHRoaXMuc3Muc3ViRmdldERhdGEocmVxT2JqLCBvcHRpb25zLCBcImFjY291bnRzL2FjY0xlZGdlclwiKVxyXG4gICAgICAudGhlbigocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKHJlc3BvbnNlKTtcclxuICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09IFwiU1VDQ0VTU1wiKSB7XHJcbiAgICAgICAgICB0aGlzLnBhZ2VJbmZvID0gcmVzcG9uc2UucGFnZUluZm8gfHwge307XHJcbiAgICAgICAgICB0aGlzLnVpR3JwTGlzdCA9IHJlc3BvbnNlLnVpR3JwTGlzdDtcclxuICAgICAgICAgIHRoaXMudWlHcnBMaXN0RHRsID0gcmVzcG9uc2UudWlHcnBMaXN0RHRsIHx8IHt9O1xyXG4gICAgICAgICAgbGV0IGRhdGF0eXBlbGlzdCA9IHRoaXMudWlHcnBMaXN0RHRsW1wiYmFzaWMjVFwiXSB8fCBbXTtcclxuICAgICAgICAgIGxldCBhdHRybGlzdCA9IHRoaXMudWlHcnBMaXN0RHRsW1wiYmFzaWMjVlwiXSB8fCBbXTtcclxuICAgICAgICAgIHRoaXMuYXR0ckNMaXN0RHRsID0gcmVzcG9uc2UuYXR0ckNMaXN0RHRsO1xyXG4gICAgICAgICAgdGhpcy5hdHRyUUxpc3REdGwgPSByZXNwb25zZS5hdHRyUUxpc3REdGw7XHJcbiAgICAgICAgICB0aGlzLmRhdGFEdGwgPSByZXNwb25zZS5kYXRhRHRsIHx8IHt9O1xyXG4gICAgICAgICAgdGhpcy5jb250YWN0TmFtZSA9IHRoaXMuZGF0YUR0bFtcImNvbnRhY3ROYW1lXCJdIHx8IFwiXCI7XHJcbiAgICAgICAgICBhdHRybGlzdC5mb3JFYWNoKChrZXksIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCB0eXBlID0gZGF0YXR5cGVsaXN0W2luZGV4XTtcclxuICAgICAgICAgICAgaWYgKHR5cGUgPT0gJ3NhJykge1xyXG4gICAgICAgICAgICAgIGxldCBhdHRyVmFsID0gdGhpcy5kYXRhRHRsW2tleV0gfHwgJyc7XHJcbiAgICAgICAgICAgICAgbGV0IGxpc3QgPSBbeyB2YWx1ZTogYXR0clZhbCwgbGFiZWw6IGF0dHJWYWwgfV07XHJcbiAgICAgICAgICAgICAgdGhpcy5zcWxBcnJheVtrZXldID0gbGlzdDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IocmVzcG9uc2UubWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICAuY2F0Y2goKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoZXJyLm1lc3NhZ2UpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIGxvYWRVc2VyUGFzc3dvcmQoKSB7XHJcbiAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLnNob3coKTtcclxuICAgIGxldCByZXFPYmogPSB7fTtcclxuICAgIHJlcU9ialtcImZvcm1ObWVcIl0gPSBcImFwcGxpY2F0aW9uQWNjZXNzTWFzdGVyXCI7XHJcbiAgICByZXFPYmpbXCJubWVJZG5cIl0gPSB0aGlzLnJvdXRlLnNuYXBzaG90LnBhcmFtTWFwLmdldChcInN1YnZcIik7XHJcbiAgICB0aGlzLmhlYWRlcltcIm1ldGhvZFwiXSA9IFwibG9hZENoYW5nZVBhc3NcIjtcclxuICAgIHRoaXMuaGVhZGVyW1wic291cmNlXCJdID0gXCJxc1wiO1xyXG4gICAgbGV0IG9wdGlvbnMgPSAoeyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnModGhpcy5oZWFkZXIpIH0pO1xyXG4gICAgdGhpcy5zc1xyXG4gICAgICAuc3ViRmdldERhdGEocmVxT2JqLCBvcHRpb25zLCBcImNvbnRhY3QvbG9hZENvbnRhY3RcIilcclxuICAgICAgLnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09IFwiU1VDQ0VTU1wiKSB7XHJcbiAgICAgICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgICAgIGxldCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQ7XHJcbiAgICAgICAgICB0aGlzLnVzZXJEZXRhaWxzID0gcmVzdWx0LnVzZXJEZXRhaWxzO1xyXG4gICAgICAgICAgdGhpcy5wYWdlRGVmaW5hdGlvblBzd2RDbmcgPSByZXN1bHQucGFnZURlZmluYXRpb247XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IocmVzcG9uc2UubWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICAuY2F0Y2goKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoZXJyLm1lc3NhZ2UpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIGNoYW5nZVBzd2QoZSwgdXNlcklkbikge1xyXG4gICAgdGhpcy5zcGlubmVyU2VydmljZS5zaG93KCk7XHJcbiAgICBsZXQgcmVxT2JqID0ge307XHJcbiAgICByZXFPYmpbXCJmb3JtTm1lXCJdID0gXCJzZXRQYXNzd29yZEZvcm1cIjtcclxuICAgIHJlcU9ialtcInVzZXJJZG5cIl0gPSB1c2VySWRuO1xyXG4gICAgcmVxT2JqW1wicGFzc3dvcmRcIl0gPSBlLnRhcmdldC52YWx1ZTtcclxuICAgIHRoaXMuaGVhZGVyW1wibWV0aG9kXCJdID0gXCJjaGFuZ2VQYXNzd29yZFwiO1xyXG4gICAgdGhpcy5oZWFkZXJbXCJzb3VyY2VcIl0gPSBcInFzXCI7XHJcbiAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShyZXFPYmopKTtcclxuICAgIGxldCBvcHRpb25zID0gKHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHRoaXMuaGVhZGVyKSB9KTtcclxuICAgIHRoaXMuc3NcclxuICAgICAgLlNhdmUocmVxT2JqLCBvcHRpb25zLCBcImNvbnRhY3QvbG9hZENvbnRhY3RcIilcclxuICAgICAgLnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09IFwiU1VDQ0VTU1wiKSB7XHJcbiAgICAgICAgICBsZXQgcmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0O1xyXG4gICAgICAgICAgdGhpcy51c2VyRGV0YWlscyA9IHJlc3VsdC51c2VyRGV0YWlscztcclxuICAgICAgICAgIHRoaXMucGFnZURlZmluYXRpb25Qc3dkQ25nID0gcmVzdWx0LnBhZ2VEZWZpbmF0aW9uO1xyXG4gICAgICAgICAgdGhpcy50b2FzdHIuc3VjY2VzcyhyZXNwb25zZS5tZXNzYWdlKTtcclxuICAgICAgICAgIHRoaXMubG9hZFVzZXJQYXNzd29yZCgpO1xyXG4gICAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IocmVzcG9uc2UubWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICAuY2F0Y2goKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoZXJyLm1lc3NhZ2UpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIGNoYW5nZVBhc3N3b3JkKG9iaikge1xyXG4gICAgdGhpcy5zcGlubmVyU2VydmljZS5zaG93KCk7XHJcbiAgICBsZXQgcmVxT2JqID0ge307XHJcbiAgICByZXFPYmpbXCJmb3JtTm1lXCJdID0gXCJzZXRQYXNzd29yZEZvcm1cIjtcclxuICAgIHJlcU9ialtcInVzZXJJZG5cIl0gPSBvYmoudXNlcklkbjtcclxuICAgIHJlcU9ialtcInBhc3N3b3JkXCJdID0gb2JqLnBhc3N3b3JkO1xyXG4gICAgdGhpcy5oZWFkZXJbXCJtZXRob2RcIl0gPSBcImNoYW5nZVBhc3N3b3JkXCI7XHJcbiAgICB0aGlzLmhlYWRlcltcInNvdXJjZVwiXSA9IFwicXNcIjtcclxuICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHJlcU9iaikpO1xyXG4gICAgbGV0IG9wdGlvbnMgPSAoeyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnModGhpcy5oZWFkZXIpIH0pO1xyXG4gICAgdGhpcy5zc1xyXG4gICAgICAuU2F2ZShyZXFPYmosIG9wdGlvbnMsIFwiY29udGFjdC9sb2FkQ29udGFjdFwiKVxyXG4gICAgICAudGhlbigocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT0gXCJTVUNDRVNTXCIpIHtcclxuICAgICAgICAgIGxldCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQ7XHJcbiAgICAgICAgICB0aGlzLnVzZXJEZXRhaWxzID0gcmVzdWx0LnVzZXJEZXRhaWxzO1xyXG4gICAgICAgICAgdGhpcy5wYWdlRGVmaW5hdGlvblBzd2RDbmcgPSByZXN1bHQucGFnZURlZmluYXRpb247XHJcbiAgICAgICAgICB0aGlzLnRvYXN0ci5zdWNjZXNzKHJlc3BvbnNlLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgdGhpcy5sb2FkVXNlclBhc3N3b3JkKCk7XHJcbiAgICAgICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcihyZXNwb25zZS5tZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIC5jYXRjaCgoZXJyOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcihlcnIubWVzc2FnZSk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcblxyXG4gIGdibE9iajtcclxuICBleGl0c2luZ1VzZXJMaXN0ID0gW107XHJcbiAgbG9hZEFwcGxpY2F0aW9uVXNlclRlcm1zKG5tZWlkbikge1xyXG4gICAgdGhpcy5zcGlubmVyU2VydmljZS5zaG93KCk7XHJcbiAgICBjb25zdCByZXFPYmogPSB7fTtcclxuICAgIHJlcU9ialtcIm5tZV9pZG5cIl0gPSB0aGlzLnJvdXRlLnNuYXBzaG90LnBhcmFtTWFwLmdldChcInN1YnZcIik7XHJcbiAgICByZXFPYmpbXCJmb3JtTm1lXCJdID0gXCJjb250YWN0U2VhcmNoRm9ybVwiO1xyXG4gICAgdGhpcy5oZWFkZXJbXCJtZXRob2RcIl0gPSBcImxvYWRBc3NpZ25BcHBsaWNhdGlvblVzZXJ0ZXJtc1wiO1xyXG4gICBjb25zdCBvcHRpb25zID0gKHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHRoaXMuaGVhZGVyKSB9KTtcclxuICAgIHRoaXMuY3NcclxuICAgICAgLmxvYWQocmVxT2JqLCBvcHRpb25zLCBcImNvbnRhY3QvbG9hZENvbnRhY3RcIilcclxuICAgICAgLnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhyZXNwb25zZSk7XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSBcIlNVQ0NFU1NcIikge1xyXG4gICAgICAgICAgbGV0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdDtcclxuICAgICAgICAgIHRoaXMuZ2JsT2JqID0gcmVzdWx0O1xyXG4gICAgICAgICAgdGhpcy50ZXJtc0xpc3QgPSByZXN1bHQudGVybXNMaXN0O1xyXG4gICAgICAgICAgbGV0IGFwcGxVc2VyTGlzdCA9IHJlc3VsdC5hcHBsVXNlckxpc3Q7XHJcbiAgICAgICAgICB0aGlzLmV4aXRzaW5nVXNlckxpc3QgPSBbXTtcclxuICAgICAgICAgIHRoaXMudGVybXNMaXN0LmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgICAgICAgIGxldCB1c2VySWRuTGlzdCA9IGVsZW1lbnQudXNlcklkbkxpc3QgfHwgW107XHJcbiAgICAgICAgICAgIHVzZXJJZG5MaXN0LmZvckVhY2godXNlcklkbiA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuZXhpdHNpbmdVc2VyTGlzdC5pbmRleE9mKHVzZXJJZG4pID09IC0xKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5leGl0c2luZ1VzZXJMaXN0LnB1c2godXNlcklkbik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBkZWJ1Z2dlclxyXG4gICAgICAgICAgbGV0IHBlbmRpbmdVc2VyTGlzdCA9IFtdXHJcbiAgICAgICAgICBhcHBsVXNlckxpc3QuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZXhpdHNpbmdVc2VyTGlzdC5pbmRleE9mKGVsZW1lbnQuaykgPT0gLTEpXHJcbiAgICAgICAgICAgICAgcGVuZGluZ1VzZXJMaXN0LnB1c2goZWxlbWVudCk7XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICB0aGlzLnRlcm1zTGlzdC5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICBsZXQgdXNlcklkbkxpc3QgPSBlbGVtZW50LnVzZXJJZG5MaXN0IHx8IFtdO1xyXG4gICAgICAgICAgICBsZXQgVGVybVVzZXJMaXN0ID0gcGVuZGluZ1VzZXJMaXN0Lm1hcChvcHRpb24gPT4gKHtcclxuICAgICAgICAgICAgICB2YWx1ZTogb3B0aW9uLmssXHJcbiAgICAgICAgICAgICAgbGFiZWw6IG9wdGlvbi52XHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgaWYgKHVzZXJJZG5MaXN0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICBhcHBsVXNlckxpc3QuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh1c2VySWRuTGlzdC5pbmRleE9mKGVsZW1lbnQuaykgIT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgVGVybVVzZXJMaXN0LnB1c2goeyBcInZhbHVlXCI6IGVsZW1lbnQuaywgXCJsYWJlbFwiOiBlbGVtZW50LnYgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbGVtZW50LlRlcm1Vc2VyTGlzdCA9IFRlcm1Vc2VyTGlzdDtcclxuXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKHRoaXMudGVybXNMaXN0KTtcclxuICAgICAgICAgIC8vICB0aGlzLmFwcGxVc2VyTGlzdCA9IHJlc3VsdC5hcHBsVXNlckxpc3Q7XHJcbiAgICAgICAgICAvLyAgbGV0IHRlbXBhcnIgPSBbXTtcclxuICAgICAgICAgIC8vdGhpcy5leGl0c2luZ1VzZXI9W107XHJcbiAgICAgICAgICAvLyB0aGlzLnRlcm1zTGlzdC5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgLy8gZGVidWdnZXJcclxuICAgICAgICAgIC8vIGVsZW1lbnQudXNlcklkbkxpc3QuZm9yRWFjaChhID0+IHtcclxuICAgICAgICAgIC8vICAgdGVtcGFyci5wdXNoKGEudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAvLyAgaWYodGhpcy5leGl0c2luZ1VzZXIuaW5kZXhPZihhLnRvU3RyaW5nKCkpPT0tMSlcclxuICAgICAgICAgIC8vICB0aGlzLmV4aXRzaW5nVXNlci5wdXNoKGEudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAvLyB9KTtcclxuICAgICAgICAgIC8vIGVsZW1lbnQudXNlcklkbkxpc3QgPSB0ZW1wYXJyO1xyXG4gICAgICAgICAgLy8gdGVtcGFyciA9IFtdO1xyXG4gICAgICAgICAgLy8gIGVsZW1lbnQuc2VsZWN0ZWRWYWxzID0gW107XHJcbiAgICAgICAgICAvLyB9KTtcclxuICAgICAgICAgIC8vIGxldCBhcHBsVXNlckxpc3Q9cmVzdWx0LmFwcGxVc2VyTGlzdDtcclxuICAgICAgICAgIC8vIHRoaXMuYXBwbFVzZXJMaXN0PVtdXHJcbiAgICAgICAgICAvLyBhcHBsVXNlckxpc3QuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICAgIC8vICAgaWYodGhpcy5leGl0c2luZ1VzZXIuaW5kZXhPZihlbGVtZW50LmspPT0tMSlcclxuICAgICAgICAgIC8vICAgdGhpcy5hcHBsVXNlckxpc3QucHVzaChlbGVtZW50KTtcclxuICAgICAgICAgIC8vIH0pO1xyXG5cclxuXHJcbiAgICAgICAgICB0aGlzLmFwcGxVc2VyTGlzdCA9IHRoaXMuYXBwbFVzZXJMaXN0Lm1hcChvcHRpb24gPT4gKHtcclxuICAgICAgICAgICAgdmFsdWU6IG9wdGlvbi5rLFxyXG4gICAgICAgICAgICBsYWJlbDogb3B0aW9uLnZcclxuICAgICAgICAgIH0pKTtcclxuXHJcbiAgICAgICAgICBjb25zb2xlLmxvZyh0aGlzLmFwcGxVc2VyTGlzdCk7XHJcbiAgICAgICAgICAvLyBzZXRUaW1lb3V0KCgpID0+IHtcclxuXHJcbiAgICAgICAgICAvLyB9LCAxMDAwKTtcclxuXHJcbiAgICAgICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcihyZXNwb25zZS5tZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIC5jYXRjaCgoZXJyOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcihlcnIubWVzc2FnZSk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuICBzZWxlY3RlZFBlb3BsZTMgPSBbXTtcclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICBjb25zb2xlLmxvZyhcImluIHZpZXdhZnRlclwiKTtcclxuICB9XHJcblxyXG4gIGxvYWRTdWdnZGF0YShzdHIsIHBhZ2VfaXRlbV9pZG4sIGZvcm1fZmllbGQpIHtcclxuICAgIGlmIChzdHIgPT0gdW5kZWZpbmVkIHx8IHN0ciA9PSAnJyB8fCBzdHIubGVuZ3RoIDwgMykgcmV0dXJuO1xyXG4gICAgbGV0IHJlcU9iaiA9IHt9O1xyXG4gICAgcmVxT2JqW1wiZm9ybU5tZVwiXSA9IHRoaXMucm91dGUuc25hcHNob3QucGFyYW1zW1wiZnJtbm1lXCJdIHx8ICdsb2FkU3VnZ2VzdGlvbkRhdGEnO1xyXG4gICAgcmVxT2JqWydwYWdlX2l0ZW1faWRuJ10gPSBwYWdlX2l0ZW1faWRuO1xyXG4gICAgcmVxT2JqWydsaWtlU3RyJ10gPSBzdHI7XHJcbiAgICB0aGlzLmhlYWRlclsnbWV0aG9kJ10gPSAnbG9hZFN1Z2dlc3Rpb25EYXRhQnlJdGVtSWRuJztcclxuICAgIGNvbnNvbGUubG9nKHRoaXMuaGVhZGVyKTtcclxuICAgIGxldCBvcHRpb25zID0gKHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHRoaXMuaGVhZGVyKSB9KTtcclxuICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHJlcU9iaikpO1xyXG4gICAgLy8gY29uc29sZS5sb2codGhpcy5oZWFkZXIpO1xyXG4gICAgdGhpcy5jcy5sb2FkKHJlcU9iaiwgb3B0aW9ucywgXCJjb250YWN0L3JlZ2lzdGVyRGF0YVwiKS50aGVuKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKHJlc3BvbnNlKTtcclxuICAgICAgbGV0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdDtcclxuICAgICAgbGV0IHN1Z2dlc3Rpb25EYXRhID0gcmVzdWx0LnN1Z2dlc3Rpb25EYXRhIHx8IFtdO1xyXG4gICAgICBsZXQgbGlzdCA9IHN1Z2dlc3Rpb25EYXRhLm1hcChvcHRpb24gPT4gKHtcclxuICAgICAgICB2YWx1ZTogb3B0aW9uLmssXHJcbiAgICAgICAgbGFiZWw6IG9wdGlvbi52XHJcbiAgICAgIH0pKTtcclxuICAgICAgdGhpcy5zcWxBcnJheVtmb3JtX2ZpZWxkXSA9IGxpc3Q7XHJcbiAgICB9KVxyXG5cclxuICB9XHJcblxyXG4gIGxvYWRKbmxTdWdnZGF0YShzdHIsIGF0dHJfbm1lLCBtZGwpIHtcclxuICAgIGlmIChzdHIgPT0gdW5kZWZpbmVkIHx8IHN0ciA9PSAnJyB8fCBzdHIubGVuZ3RoIDwgMykgcmV0dXJuO1xyXG4gICAgbGV0IHJlcU9iaiA9IHt9O1xyXG4gICAgcmVxT2JqW1wiZm9ybU5tZVwiXSA9IHRoaXMucm91dGUuc25hcHNob3QucGFyYW1zW1wiZnJtbm1lXCJdIHx8ICdsb2FkU3VnZ2VzdGlvbkRhdGEnO1xyXG4gICAgcmVxT2JqWydhdHRyX25tZSddID0gYXR0cl9ubWU7XHJcbiAgICByZXFPYmpbJ21kbCddID0gbWRsO1xyXG4gICAgcmVxT2JqWydsaWtlU3RyJ10gPSBzdHI7XHJcbiAgICB0aGlzLmhlYWRlclsnbWV0aG9kJ10gPSAnbG9hZFN1Z2dlc3Rpb25EYXRhQnlBdHRyTm1lJztcclxuICAgIGNvbnNvbGUubG9nKHRoaXMuaGVhZGVyKTtcclxuICAgIGxldCBvcHRpb25zID0gKHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHRoaXMuaGVhZGVyKSB9KTtcclxuICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHJlcU9iaikpO1xyXG4gICAgLy8gY29uc29sZS5sb2codGhpcy5oZWFkZXIpO1xyXG4gICAgdGhpcy5jcy5sb2FkKHJlcU9iaiwgb3B0aW9ucywgXCJhY2NvdW50cy9hY2NMZWRnZXJcIikudGhlbigocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICBjb25zb2xlLmxvZyhyZXNwb25zZSk7XHJcbiAgICAgIGxldCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQ7XHJcbiAgICAgIGxldCBzdWdnZXN0aW9uRGF0YSA9IHJlc3VsdC5zdWdnZXN0aW9uRGF0YSB8fCBbXTtcclxuICAgICAgbGV0IGxpc3QgPSBzdWdnZXN0aW9uRGF0YS5tYXAob3B0aW9uID0+ICh7XHJcbiAgICAgICAgdmFsdWU6IG9wdGlvbi52LFxyXG4gICAgICAgIGxhYmVsOiBvcHRpb24udlxyXG4gICAgICB9KSk7XHJcbiAgICAgIHRoaXMuc3FsQXJyYXlbYXR0cl9ubWVdID0gbGlzdDtcclxuICAgIH0pXHJcblxyXG4gIH1cclxuXHJcbiAgb25jaGFuZVZhbHMoZSwgYnlydHJtaWQsIHNlbGVjdGVkVXNlcklkbikge1xyXG4gICAgdGhpcy5kYXRhVHJuc0xpc3QgPSBbLi4udGhpcy50ZXJtc0xpc3RdO1xyXG4gICAgdGhpcy5ieXJPYmpbXCJidXllcl90ZXJtc19pZG5cIl0gPSBieXJ0cm1pZDtcclxuICAgIGlmIChzZWxlY3RlZFVzZXJJZG4gIT0gdW5kZWZpbmVkKVxyXG4gICAgICB0aGlzLmJ5ck9ialtcInVzZXJJZG5MaXN0XCJdID0gc2VsZWN0ZWRVc2VySWRuO1xyXG5cclxuICAgIGxldCBjaGVja0JveCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJ5cnRybWlkKTtcclxuICAgIGlmIChcclxuICAgICAgKGNoZWNrQm94IGFzIGFueSkuY2hlY2tlZCA9PSB0cnVlICYmXHJcbiAgICAgIHNlbGVjdGVkVXNlcklkbiAhPSB1bmRlZmluZWQgJiZcclxuICAgICAgc2VsZWN0ZWRVc2VySWRuICE9IFwiXCJcclxuICAgICkge1xyXG4gICAgICB2YXIgaW5kZXggPSB0aGlzLmRhdGFUcm5zTGlzdC5maW5kSW5kZXgoXHJcbiAgICAgICAgeCA9PiB4LmJ1eWVyX3Rlcm1zX2lkbiA9PSBieXJ0cm1pZFxyXG4gICAgICApO1xyXG4gICAgICBpZiAoaW5kZXggPiAtMSkge1xyXG4gICAgICAgIGNvbnN0IGZpbHRlcmVkQXJyID0gdGhpcy5kYXRhVHJuc0xpc3QuZmlsdGVyKFxyXG4gICAgICAgICAgaXRlbSA9PiBpdGVtLmJ1eWVyX3Rlcm1zX2lkbiAhPT0gYnlydHJtaWRcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMuZGF0YVRybnNMaXN0ID0gZmlsdGVyZWRBcnI7XHJcbiAgICAgIH1cclxuICAgICAgLy8gfVxyXG4gICAgICB0aGlzLmRhdGFUcm5zTGlzdC5wdXNoKHRoaXMuYnlyT2JqKTtcclxuICAgICAgdGhpcy5ieXJPYmogPSB7fTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IGZpbHRlcmVkQXJyID0gdGhpcy5kYXRhVHJuc0xpc3QuZmlsdGVyKFxyXG4gICAgICAgIGl0ZW0gPT4gaXRlbS5idXllcl90ZXJtc19pZG4gIT09IGJ5cnRybWlkXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMuZGF0YVRybnNMaXN0ID0gZmlsdGVyZWRBcnI7XHJcbiAgICB9XHJcbiAgfVxyXG4gIG9uY2hhbmdlVXNlclNlbGVjdChlLCB0cm1vYmopIHtcclxuICAgIGxldCBvYmo6IGFueSA9IHt9O1xyXG4gICAgb2JqID0geyAuLi50cm1vYmogfTtcclxuXHJcbiAgICAvLyBvYmouc2VsZWN0ZWRWYWxzID0gWy4uLnRybW9iai51c2VySWRuTGlzdF07XHJcbiAgICAvLyBpZiAob2JqLnNlbGVjdGVkVmFscy5pbmRleE9mKGUudmFsdWUpICE9IC0xKSB7XHJcbiAgICAvLyAgIG9iai5zZWxlY3RlZFZhbHMucHVzaChlLnZhbHVlKTtcclxuICAgIC8vIH1cclxuXHJcbiAgICBpZiAob2JqLnNlbGVjdGVkVmFscy5pbmRleE9mKGUudmFsdWUpICE9IC0xKSB7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBvYmouc2VsZWN0ZWRWYWxzLnB1c2goZS52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICB0cm1vYmogPSBvYmo7XHJcbiAgICBjb25zb2xlLmxvZyh0aGlzLnRlcm1zTGlzdCk7XHJcbiAgfVxyXG4gIG9uY2hhbmdlVXNlckRlc2VsZWN0KGUsIHRybW9iaikge1xyXG4gICAgZGVidWdnZXJcclxuICAgIGxldCBvYmo6IGFueSA9IHt9O1xyXG4gICAgb2JqID0geyAuLi50cm1vYmogfTtcclxuICAgIG9iai5zZWxlY3RlZFZhbHMuc3BsaWNlKHRoaXMudGVybXNMaXN0LmluZGV4T2YoZS52YWx1ZSksIDEpO1xyXG4gICAgdHJtb2JqID0gb2JqO1xyXG4gICAgY29uc29sZS5sb2codGhpcy50ZXJtc0xpc3QpO1xyXG4gIH1cclxuXHJcbiAgb25jaGFuZ2VVc2VyTGlzdChlLCB0cm1vYmosIHR5cCkge1xyXG5cclxuICAgIHRoaXMuc3Bpbm5lclNlcnZpY2Uuc2hvdygpO1xyXG4gICAgY29uc3QgcmVxT2JqID0ge307XHJcbiAgICByZXFPYmpbXCJidXllcl90ZXJtc19pZG5cIl0gPSB0cm1vYmouYnV5ZXJfdGVybXNfaWRuO1xyXG4gICAgcmVxT2JqW1widXNlcl9pZG5cIl0gPSBlLnZhbHVlO1xyXG4gICAgcmVxT2JqWydhY3Rpb24nXSA9IHR5cDtcclxuICAgIHJlcU9ialtcImZvcm1ObWVcIl0gPSBcImNvbnRhY3RTZWFyY2hGb3JtXCI7XHJcbiAgICB0aGlzLmhlYWRlcltcIm1ldGhvZFwiXSA9IFwiYXNzaWduVXNlclRlcm1cIjtcclxuICAgY29uc3Qgb3B0aW9ucyA9ICh7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh0aGlzLmhlYWRlcikgfSk7XHJcbiAgICB0aGlzLmNzXHJcbiAgICAgIC5sb2FkKHJlcU9iaiwgb3B0aW9ucywgXCJjb250YWN0L2xvYWRDb250YWN0XCIpXHJcbiAgICAgIC50aGVuKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2cocmVzcG9uc2UpO1xyXG4gICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT0gXCJTVUNDRVNTXCIpIHtcclxuXHJcbiAgICAgICAgICB0aGlzLmxvYWRBcHBsaWNhdGlvblVzZXJUZXJtcygnJyk7XHJcbiAgICAgICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcihyZXNwb25zZS5tZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIC5jYXRjaCgoZXJyOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcihlcnIubWVzc2FnZSk7XHJcbiAgICAgIH0pO1xyXG5cclxuXHJcbiAgfVxyXG4gIHNhdmVBcHBVc2VydGVybXMoKSB7XHJcbiAgICBsZXQgdmFsQXJyID0gW107XHJcbiAgICB0aGlzLnRlcm1zTGlzdC5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICBsZXQgY2hlY2tCb3ggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtZW50LmJ1eWVyX3Rlcm1zX2lkbik7XHJcbiAgICAgIGlmICgoY2hlY2tCb3ggYXMgYW55KS5jaGVja2VkID09IHRydWUpIHtcclxuICAgICAgICBsZXQgb2JqID0ge307XHJcbiAgICAgICAgb2JqW1wiYnV5ZXJfdGVybXNfaWRuXCJdID0gZWxlbWVudC5idXllcl90ZXJtc19pZG47XHJcbiAgICAgICAgb2JqW1widXNlcklkbkxpc3RcIl0gPSBlbGVtZW50LnVzZXJJZG5MaXN0O1xyXG4gICAgICAgIHZhbEFyci5wdXNoKG9iaik7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IHJlcU9iaiA9IHt9O1xyXG4gICAgcmVxT2JqW1wibm1lX2lkblwiXSA9IHRoaXMucm91dGUuc25hcHNob3QucGFyYW1NYXAuZ2V0KFwic3VidlwiKTtcclxuICAgIHJlcU9ialtcImZvcm1ObWVcIl0gPSBcImNvbnRhY3RTZWFyY2hGb3JtXCI7XHJcbiAgICB0aGlzLmhlYWRlcltcIm1ldGhvZFwiXSA9IFwic2F2ZUFzc2lnbkFwcGxpY2F0aW9uVXNlcnRlcm1zXCI7XHJcbiAgICByZXFPYmpbXCJkYXRhVHJuc0xpc3RcIl0gPSB2YWxBcnI7XHJcblxyXG4gICAgY29uc29sZS5sb2cocmVxT2JqKTtcclxuICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHJlcU9iaikpO1xyXG5cclxuICAgY29uc3Qgb3B0aW9ucyA9ICh7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh0aGlzLmhlYWRlcikgfSk7XHJcbiAgICB0aGlzLnNzXHJcbiAgICAgIC5TYXZlKHJlcU9iaiwgb3B0aW9ucywgXCJjb250YWN0L2xvYWRDb250YWN0XCIpXHJcbiAgICAgIC50aGVuKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2cocmVzcG9uc2UpO1xyXG4gICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT0gXCJTVUNDRVNTXCIpIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKHJlc3BvbnNlLnN0YXR1cyk7XHJcbiAgICAgICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgICAgIHRoaXMudG9hc3RyLnN1Y2Nlc3MocmVzcG9uc2UubWVzc2FnZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IocmVzcG9uc2UubWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICAuY2F0Y2goKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoZXJyLm1lc3NhZ2UpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldEVkaXREYXRhKGRhdGEpIHtcclxuICAgIHRoaXMuZm9ybUZpbGRzID0gW107XHJcbiAgICBsZXQgcmVxT2JqID0ge307XHJcbiAgICB2YXIgcGFnZVRQID0gdGhpcy5wYWdlSW5mby5wYWdlX3R5cDtcclxuICAgIHJlcU9ialtcImZvcm1ObWVcIl0gPSB0aGlzLnBhZ2VJbmZvLmZvcm1fbm1lO1xyXG4gICAgcmVxT2JqW1wicHJpbWFyeUtleVwiXSA9IHRoaXMucGFnZUluZm8ucHJpbWFyeV9rZXlfZmllbGQ7XHJcbiAgICByZXFPYmpbXCJwYWdlVHlwXCJdID0gdGhpcy5wYWdlSW5mby5wYWdlX3R5cDtcclxuICAgIHJlcU9ialtcInNlY29uZEtleUZpZWxkXCJdID0gdGhpcy5wYWdlSW5mby5zZWNvbmRfa2V5X2ZpZWxkO1xyXG4gICAgaWYgKHRoaXMudGJDZWxsICE9IG51bGwpIHtcclxuICAgICAgcmVxT2JqW1wiaW5MaW5lRWRpdENvbHVtblwiXSA9IHRoaXMudGJDZWxsO1xyXG4gICAgfVxyXG4gICAgcmVxT2JqW1wicHJpbWFyeUlkXCJdID0gdGhpcy5waWQ7XHJcbiAgICBpZiAocGFnZVRQID09IFwianNvbkZvcm1cIikge1xyXG4gICAgICByZXFPYmpbXCJ3aGVyZUtleXNcIl0gPSB0aGlzLnBhZ2VJbmZvLndoZXJlX2NsYXVzZTtcclxuICAgICAgcmVxT2JqW1wid2hlcmVWbHVzXCJdID0gdGhpcy53aGVyZU1hcFt0aGlzLnBhZ2VJbmZvLndoZXJlX2NsYXVzZV07XHJcbiAgICB9XHJcbiAgICBjb25zb2xlLmxvZyhyZXFPYmopO1xyXG4gICAgdGhpcy5oZWFkZXJbXCJtZXRob2RcIl0gPSBcImxvYWRBZGRFZGl0XCI7XHJcbiAgICBsZXQgb3B0aW9ucyA9ICh7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh0aGlzLmhlYWRlcikgfSk7XHJcbiAgICB0aGlzLnNzXHJcbiAgICAgIC5nZXRFZGl0RChyZXFPYmosIG9wdGlvbnMpXHJcbiAgICAgIC50aGVuKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2cocmVzcG9uc2UpO1xyXG4gICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT0gXCJTVUNDRVNTXCIgJiYgcmVzcG9uc2UubWVzc2FnZSAhPSBcIlNVQ0NFU1NcIikge1xyXG4gICAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcihyZXNwb25zZS5tZXNzYWdlKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSBcIlNVQ0NFU1NcIikge1xyXG4gICAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgICBpZiAodGhpcy50YkNlbGwgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImRhdGFtZGJ0blwiKS5jbGljaygpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5mb3JtRmlsZHMgPSByZXNwb25zZS5mb3JtRmllbGRzO1xyXG4gICAgICAgICAgdGhpcy5mb3JtRmlsZHMuZm9yRWFjaCgoZWxlbWVudCwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgaWYgKGVsZW1lbnQuZm9ybV9maWVsZF90eXAgPT0gXCJ0YlwiKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5nZXRMb3ZMaXN0KGVsZW1lbnQuZm9ybV9maWVsZCwgZWxlbWVudC5wYWdlX2l0ZW1faWRuKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZWxlbWVudC5mb3JtX2ZpZWxkX3R5cCA9PSBcInNcIikge1xyXG4gICAgICAgICAgICAgIHRoaXMuZ2V0TG92TGlzdChlbGVtZW50LmZvcm1fZmllbGQsIGVsZW1lbnQucGFnZV9pdGVtX2lkbik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGVsZW1lbnQuZm9ybV9maWVsZF90eXAgPT0gXCJzYlwiKSB7XHJcblxyXG4gICAgICAgICAgICAgIGxldCBxcnkgPSBlbGVtZW50LmhlbHAgfHwgJyc7XHJcbiAgICAgICAgICAgICAgaWYgKHFyeSAhPSAnJyAmJiBlbGVtZW50LmRlZmF1bHRfdmFsdWUgIT0gXCJcIikge1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhZ2VJbmZvLmZvcm1fbm1lID09ICdhZGRyZXNzTWFzdGVyJyB8fCB0aGlzLnBhZ2VJbmZvLmZvcm1fbm1lID09ICdhY2NBZGRyZXNzTWFzdGVyJyB8fCB0aGlzLnBhZ2VJbmZvLmZvcm1fbm1lID09ICdhY2NBZGRyZXNzRGV0YWlscycpIHtcclxuICAgICAgICAgICAgICAgICAgbGV0IGNpdHkgPSBkYXRhLmNpdHlfbm0gfHwgJyc7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBzdGF0ZSA9IGRhdGEuc3RhdGVfbm0gfHwgJyc7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBjb3VudHJ5ID0gZGF0YS5jb3VudHJ5X25tIHx8ICcnO1xyXG4gICAgICAgICAgICAgICAgICBpZiAoY2l0eSAhPSAnJyAmJiBjb3VudHJ5ICE9ICcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHN0ciA9IGNpdHkgKyBcIiNcIiArIGNvdW50cnk7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RyID0gc3RyLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRMb3ZDaXR5TGlzdChlbGVtZW50LCBzdHIpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBxcnkgPSBxcnkucmVwbGFjZShcIiNJRE5cIiwgXCInXCIgKyBlbGVtZW50LmRlZmF1bHRfdmFsdWUgKyBcIidcIilcclxuICAgICAgICAgICAgICAgICAgdGhpcy5nZXRMb3ZMaXN0ZGF0YShlbGVtZW50KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGVsZW1lbnQuZm9ybV9maWVsZF90eXAgPT0gXCJoZFwiKSB7XHJcbiAgICAgICAgICAgICAgZWxlbWVudC5kZWZhdWx0X3ZhbHVlID0gdGhpcy53aGVyZU1hcFtlbGVtZW50LmZvcm1fZmllbGRdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50LmZvcm1fZmllbGRfdHlwID09IFwic3FcIikge1xyXG4gICAgICAgICAgICAgIHRoaXMuZ2V0U2VxdWVuY2UoZWxlbWVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGVsZW1lbnQuZHRhX3R5cCA9PSBcInNhXCIpIHtcclxuICAgICAgICAgICAgICB0aGlzLmdldExvdkxpc3QoZWxlbWVudC5mb3JtX2ZpZWxkLCBlbGVtZW50LnBhZ2VfaXRlbV9pZG4pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50LmR0YV90eXAgPT0gXCJzclwiKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5nZXRMb3ZMaXN0KGVsZW1lbnQuZm9ybV9maWVsZCwgZWxlbWVudC5wYWdlX2l0ZW1faWRuKTtcclxuICAgICAgICAgICAgICB0aGlzLmRmdiA9IGVsZW1lbnQuZGVmYXVsdF92YWx1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZWxlbWVudC5mb3JtX2ZpZWxkX3R5cCA9PSBcImhjXCIpIHtcclxuICAgICAgICAgICAgICBlbGVtZW50LmRlZmF1bHRfdmFsdWUgPSBlbGVtZW50Lmxvdl9xcnk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gaWYgKGVsZW1lbnQuZm9ybV9maWVsZF90eXAgPT0gJ2wnKSB7XHJcbiAgICAgICAgICAgIC8vICAgZWxlbWVudC5rdi5tYXAob3B0aW9uID0+ICh7XHJcbiAgICAgICAgICAgIC8vICAgICB2YWx1ZTogb3B0aW9uLmssXHJcbiAgICAgICAgICAgIC8vICAgICBsYWJlbDogb3B0aW9uLnZcclxuICAgICAgICAgICAgLy8gICB9KSk7XHJcbiAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IocmVzcG9uc2UubWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICAuY2F0Y2goKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoZXJyLm1lc3NhZ2UpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldFNlcXVlbmNlKGVsZW1lbnQpIHtcclxuICAgIGxldCByZXFPYmogPSB7fTtcclxuICAgIHJlcU9ialtcInNlcVwiXSA9IGVsZW1lbnQubG92X3FyeTtcclxuICAgIHRoaXMuaGVhZGVyW1wibWV0aG9kXCJdID0gXCJnZXRTZXFcIjtcclxuICAgIGxldCBvcHRpb25zID0gKHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHRoaXMuaGVhZGVyKSB9KTtcclxuICAgIHRoaXMuc3NcclxuICAgICAgLmdldERhdGEocmVxT2JqLCBvcHRpb25zKVxyXG4gICAgICAudGhlbigocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT0gXCJTVUNDRVNTXCIpIHtcclxuICAgICAgICAgIHZhciBzZXEgPSByZXNwb25zZS5zZXE7XHJcbiAgICAgICAgICBlbGVtZW50LmRlZmF1bHRfdmFsdWUgPSBzZXE7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMudG9hc3RyLmVycm9yKHJlc3BvbnNlLm1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgLmNhdGNoKChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMudG9hc3RyLmVycm9yKGVyci5tZXNzYWdlKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXRTZXF1ZW5jZTEoc2Vxbm1lKSB7XHJcbiAgICB2YXIgc2VxID0gXCJcIjtcclxuICAgIGRlYnVnZ2VyO1xyXG4gICAgbGV0IHJlcU9iaiA9IHt9O1xyXG4gICAgcmVxT2JqW1wic2VxXCJdID0gc2Vxbm1lO1xyXG4gICAgdGhpcy5oZWFkZXJbXCJtZXRob2RcIl0gPSBcImdldFNlcVwiO1xyXG4gICAgbGV0IG9wdGlvbnMgPSAoeyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnModGhpcy5oZWFkZXIpIH0pO1xyXG4gICAgdGhpcy5zc1xyXG4gICAgICAuZ2V0RGF0YShyZXFPYmosIG9wdGlvbnMpXHJcbiAgICAgIC50aGVuKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSBcIlNVQ0NFU1NcIikge1xyXG4gICAgICAgICAgc2VxID0gcmVzcG9uc2Uuc2VxO1xyXG4gICAgICAgICAgcmV0dXJuIHNlcTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IocmVzcG9uc2UubWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICAuY2F0Y2goKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoZXJyLm1lc3NhZ2UpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldExvdkxpc3RkYXRhKHRibEYpIHtcclxuICAgIGxldCByZXFPYmogPSB7fTtcclxuICAgIHJlcU9ialtcInBhZ2VfaXRlbV9pZG5cIl0gPSB0YmxGLnBhZ2VfaXRlbV9pZG47XHJcbiAgICByZXFPYmpbXCJzdHJcIl0gPSB0YmxGLmRlZmF1bHRfdmFsdWU7XHJcbiAgICB0aGlzLmhlYWRlcltcIm1ldGhvZFwiXSA9IFwibG9hZENpdHlDb3VudHJ5RGF0YVwiO1xyXG4gICAgbGV0IG9wdGlvbnMgPSAoeyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnModGhpcy5oZWFkZXIpIH0pO1xyXG4gICAgdGhpcy5zc1xyXG4gICAgICAuZ2V0RGF0YShyZXFPYmosIG9wdGlvbnMpXHJcbiAgICAgIC50aGVuKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSBcIlNVQ0NFU1NcIikge1xyXG4gICAgICAgICAgdGhpcy5sb3ZzID0gcmVzcG9uc2Uua3YubWFwKG9wdGlvbiA9PiAoe1xyXG4gICAgICAgICAgICB2YWx1ZTogb3B0aW9uLmssXHJcbiAgICAgICAgICAgIGxhYmVsOiBvcHRpb24udlxyXG4gICAgICAgICAgfSkpO1xyXG5cclxuICAgICAgICAgIHRoaXMuc3FsQXJyYXlbdGJsRi5mb3JtX2ZpZWxkXSA9IHRoaXMubG92cztcclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5kZnYgPT0gbnVsbCkgcmV0dXJuO1xyXG4gICAgICAgICAgaWYgKHRibEYgPT0gXCJhdHRyXCIpIHtcclxuICAgICAgICAgICAgdGhpcy5zcWxBcnJheVt0YmxGXS5mb3JFYWNoKChlbGVtZW50LCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuZGZ2LmZvckVhY2goZWxlbWVudDIgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQudiA9PSBlbGVtZW50Mikge1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLnNxbEFycmF5W3RibEZdLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMudG9hc3RyLmVycm9yKHJlc3BvbnNlLm1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgLmNhdGNoKChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMudG9hc3RyLmVycm9yKGVyci5tZXNzYWdlKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXRMb3ZMaXN0KHRibEYsIHBhZ2VfaXRlbV9pZG4pIHtcclxuICAgIGxldCByZXFPYmogPSB7fTtcclxuICAgIHJlcU9ialtcInBhZ2VfaXRlbV9pZG5cIl0gPSBwYWdlX2l0ZW1faWRuO1xyXG4gICAgdGhpcy5oZWFkZXJbXCJtZXRob2RcIl0gPSBcImdldERhdGFCeUl0ZW1JZG5cIjtcclxuICAgIGxldCBvcHRpb25zID0gKHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHRoaXMuaGVhZGVyKSB9KTtcclxuICAgIHRoaXMuc3NcclxuICAgICAgLmdldERhdGEocmVxT2JqLCBvcHRpb25zKVxyXG4gICAgICAudGhlbigocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT0gXCJTVUNDRVNTXCIpIHtcclxuICAgICAgICAgIHRoaXMubG92cyA9IHJlc3BvbnNlLmt2Lm1hcChvcHRpb24gPT4gKHtcclxuICAgICAgICAgICAgdmFsdWU6IG9wdGlvbi5rLFxyXG4gICAgICAgICAgICBsYWJlbDogb3B0aW9uLnZcclxuICAgICAgICAgIH0pKTtcclxuXHJcbiAgICAgICAgICB0aGlzLnNxbEFycmF5W3RibEZdID0gdGhpcy5sb3ZzO1xyXG5cclxuICAgICAgICAgIGlmICh0aGlzLmRmdiA9PSBudWxsKSByZXR1cm47XHJcbiAgICAgICAgICBpZiAodGJsRiA9PSBcImF0dHJcIikge1xyXG4gICAgICAgICAgICB0aGlzLnNxbEFycmF5W3RibEZdLmZvckVhY2goKGVsZW1lbnQsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5kZnYuZm9yRWFjaChlbGVtZW50MiA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC52ID09IGVsZW1lbnQyKSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuc3FsQXJyYXlbdGJsRl0uc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IocmVzcG9uc2UubWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICAuY2F0Y2goKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoZXJyLm1lc3NhZ2UpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldExvdkNpdHlMaXN0KHRibEYsIHN0cikge1xyXG4gICAgZGVidWdnZXI7XHJcbiAgICBsZXQgcmVxT2JqID0ge307XHJcbiAgICByZXFPYmpbXCJwYWdlX2l0ZW1faWRuXCJdID0gdGJsRi5wYWdlX2l0ZW1faWRuO1xyXG4gICAgcmVxT2JqW1wic3RyXCJdID0gc3RyO1xyXG4gICAgdGhpcy5oZWFkZXJbXCJtZXRob2RcIl0gPSBcImxvYWRDaXR5Q291bnRyeURhdGFcIjtcclxuICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHJlcU9iaikpO1xyXG4gICAgbGV0IG9wdGlvbnMgPSAoeyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnModGhpcy5oZWFkZXIpIH0pO1xyXG4gICAgdGhpcy5zc1xyXG4gICAgICAuZ2V0RGF0YShyZXFPYmosIG9wdGlvbnMpXHJcbiAgICAgIC50aGVuKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSBcIlNVQ0NFU1NcIikge1xyXG4gICAgICAgICAgZGVidWdnZXI7XHJcblxyXG4gICAgICAgICAgdGhpcy5sb3ZzID0gcmVzcG9uc2Uua3YubWFwKG9wdGlvbiA9PiAoe1xyXG4gICAgICAgICAgICB2YWx1ZTogb3B0aW9uLmssXHJcbiAgICAgICAgICAgIGxhYmVsOiBvcHRpb24udlxyXG4gICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgZGVidWdnZXI7XHJcblxyXG4gICAgICAgICAgdGhpcy5zcWxBcnJheVt0YmxGLmZvcm1fZmllbGRdID0gdGhpcy5sb3ZzO1xyXG4gICAgICAgICAgaWYgKHRoaXMubG92cy5sZW5ndGggPiAxKVxyXG4gICAgICAgICAgICB0YmxGLmRlZmF1bHRfdmFsdWUgPSB0aGlzLmxvdnNbMV0udmFsdWU7XHJcblxyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IocmVzcG9uc2UubWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICAuY2F0Y2goKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoZXJyLm1lc3NhZ2UpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIERlbGV0ZVRlcm1zKCkge1xyXG4gICAgdGhpcy5zcGlubmVyU2VydmljZS5zaG93KCk7XHJcbiAgICBsZXQgcmVxT2JqID0ge307XHJcbiAgICByZXFPYmpbXCJmb3JtTm1lXCJdID0gdGhpcy5wYWdlSW5mby5mb3JtX25tZTtcclxuICAgIHJlcU9ialtcImJ1eWVyVGVybXNJZG5cIl0gPSB0aGlzLnBpZDtcclxuICAgIHRoaXMuaGVhZGVyW1wibWV0aG9kXCJdID0gXCJkZWxldGVCdXllclRlcm1zXCI7XHJcbiAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShyZXFPYmopKTtcclxuICAgY29uc3Qgb3B0aW9ucyA9ICh7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh0aGlzLmhlYWRlcikgfSk7XHJcbiAgICB0aGlzLmNzLmxvYWQocmVxT2JqLCBvcHRpb25zLCBcImNvbnRhY3QvbG9hZENvbnRhY3RcIikudGhlbigocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09IFwiU1VDQ0VTU1wiKSB7XHJcbiAgICAgICAgdGhpcy5wYXJhT2JqW1wiZm9ybU5tZVwiXSA9IHRoaXMubmF2Zm9ybTtcclxuICAgICAgICB0aGlzLmdldFBhZ2VEZWZpbmF0aW9uKCk7XHJcbiAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcblxyXG4gICAgICAgIHRoaXMudG9hc3RyLnN1Y2Nlc3MocmVzcG9uc2UubWVzc2FnZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcblxyXG4gICAgICAgIHRoaXMudG9hc3RyLmVycm9yKHJlc3BvbnNlLm1lc3NhZ2UpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGRlbGV0ZURhdGFMaXN0KCkge1xyXG4gICAgZGVidWdnZXJcclxuICAgIHRoaXMuc3Bpbm5lclNlcnZpY2Uuc2hvdygpO1xyXG4gICAgbGV0IHJlcU9iaiA9IHt9O1xyXG4gICAgcmVxT2JqW1wiZm9ybU5tZVwiXSA9IHRoaXMucGFnZUluZm8uZm9ybV9ubWU7XHJcbiAgICByZXFPYmpbXCJwYWdlVHlwXCJdID0gdGhpcy5wYWdlSW5mby5wYWdlX3R5cDtcclxuICAgIHJlcU9ialtcInByaW1hcnlLZXlcIl0gPSB0aGlzLnBhZ2VJbmZvLnByaW1hcnlfa2V5X2ZpZWxkO1xyXG4gICAgcmVxT2JqW1wicHJpbWFyeUlkXCJdID0gdGhpcy5waWQ7XHJcbiAgICByZXFPYmpbXCJ0YWJsZU5hbWVcIl0gPSB0aGlzLnBhZ2VJbmZvLnRhYmxlX25hbWU7XHJcbiAgICByZXFPYmpbXCJ0cm5zVHlwZVwiXSA9IFwiREVMRVRFXCI7XHJcbiAgICBpZiAodGhpcy5wayAhPSBcIlwiICYmIHRoaXMucHYgIT0gXCJcIikge1xyXG4gICAgICByZXFPYmpbXCJ3aGVyZUtleXNcIl0gPSB0aGlzLnBrO1xyXG4gICAgICByZXFPYmpbXCJ3aGVyZVZsdXNcIl0gPSBcIlwiICsgdGhpcy5wdjtcclxuICAgIH1cclxuICAgIHRoaXMuaGVhZGVyW1wibWV0aG9kXCJdID0gXCJzYXZlXCI7XHJcbiAgICBjb25zb2xlLmxvZyhyZXFPYmopO1xyXG4gICAgbGV0IG9wdGlvbnMgPSAoeyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnModGhpcy5oZWFkZXIpIH0pO1xyXG4gICAgdGhpcy5zc1xyXG4gICAgICAuZGVsZXRlRGF0YShyZXFPYmosIG9wdGlvbnMpXHJcbiAgICAgIC50aGVuKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSBcIlNVQ0NFU1NcIikge1xyXG4gICAgICAgICAgdGhpcy5nZXRQYWdlRGVmaW5hdGlvbigpO1xyXG4gICAgICAgICAgLy8gdGhpcy5kYXRhbGlzdC5zbGljZSh0aGlzLmNpLCAxKTtcclxuICAgICAgICAgIHRoaXMuZGVsZXRlY2xzYnRuLm5hdGl2ZUVsZW1lbnQuY2xpY2soKTtcclxuICAgICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgICAgIHRoaXMudG9hc3RyLmVycm9yKHJlc3BvbnNlLm1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgLmNhdGNoKChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgIHRoaXMudG9hc3RyLmVycm9yKGVyci5tZXNzYWdlKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBjaGtGdW4oZmwsIGZEYXRhKSB7XHJcbiAgICBpZiAoZmwudmFsaWRhdGlvbnMgPT0gXCJcIiB8fCBmbC52YWxpZGF0aW9ucyA9PSBudWxsKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmIChmbC52YWxpZGF0aW9ucyA9PSBcInZhbGlkYXRlUXVlcnlcIikge1xyXG4gICAgICAgIHRoaXMudmFsaWRhdGVRdWVyeShmbCwgZkRhdGEpO1xyXG4gICAgICB9IGVsc2UgaWYgKGZsLnZhbGlkYXRpb25zID09IFwiaXNVbmlxdWVcIikge1xyXG4gICAgICAgIHRoaXMuaXNVbmlxdWUoZmwsIGZEYXRhKTtcclxuICAgICAgfSBlbHNlIGlmIChmbC52YWxpZGF0aW9ucyA9PSAnc2V0bmFtZXByaW50Jykge1xyXG4gICAgICAgIHRoaXMuc2V0bmFtZXByaW50KGZsLCBmRGF0YSk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZmwudmFsaWRhdGlvbnMgPT0gJ3NldGZhY3RvcicpIHtcclxuICAgICAgICB0aGlzLnNldGZhY3RvcihmbCwgZkRhdGEpO1xyXG4gICAgICB9IGVsc2UgaWYgKGZsLmZvcm1fZmllbGRfdHlwID09IFwic1wiKSB7XHJcbiAgICAgICAgaWYgKGZsLnZhbGlkYXRpb25zID09IG51bGwpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHNxID0gZmwudmFsaWRhdGlvbnMucmVwbGFjZSgvI1FWQUwvZywgZkRhdGEpO1xyXG4gICAgICAgIC8vdGhpcy5nZXRMb3ZMaXN0ZGF0YShmbC5jb2x1bW5fa2V5LCBzcSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAoZmwudmFsaWRhdGlvbnMgPT0gXCJpc0V4aXN0XCIpIHtcclxuICAgICAgICBpZiAoZmwudmFsaWRhdGlvbnMgPT0gbnVsbCkge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmlzRXhpc3QoZmwsIGZEYXRhKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0bmFtZXByaW50KGZsLCBmRGF0YSkge1xyXG4gICAgZGVidWdnZXJcclxuICAgIGxldCBubWVJZG4gPSBmRGF0YTtcclxuICAgIGxldCBsaXN0ID0gdGhpcy5zcWxBcnJheVtmbC5mb3JtX2ZpZWxkXSB8fCBbXTtcclxuICAgIGxldCBubXdEdGwgPSBsaXN0LmZpbmQoeCA9PiB4LnZhbHVlID09IG5tZUlkbikgfHwgJyc7XHJcbiAgICBpZiAobm13RHRsICE9ICcnKSB7XHJcbiAgICAgIHRoaXMuZm9ybUZpbGRzLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgICAgaWYgKGVsZW1lbnQuZm9ybV9maWVsZCA9PSAnbm1lJylcclxuICAgICAgICAgIGVsZW1lbnQuZGVmYXVsdF92YWx1ZSA9IG5td0R0bC5sYWJlbFxyXG4gICAgICAgIGlmIChlbGVtZW50LmZvcm1fZmllbGQgPT0gJ3ByaW50X25tZScpXHJcbiAgICAgICAgICBlbGVtZW50LmRlZmF1bHRfdmFsdWUgPSBubXdEdGwubGFiZWxcclxuXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0ZmFjdG9yKGZsLCBmRGF0YSkge1xyXG4gICAgbGV0IGZjdHIgPSAtMTtcclxuICAgIGlmIChmRGF0YSA9PSAnaW5jb21lJyB8fCBmRGF0YSA9PSAnYXNzZXRzJylcclxuICAgICAgZmN0ciA9IDE7XHJcbiAgICB0aGlzLmZvcm1GaWxkcy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICBpZiAoZWxlbWVudC5mb3JtX2ZpZWxkID09ICdmY3RyJylcclxuICAgICAgICBlbGVtZW50LmRlZmF1bHRfdmFsdWUgPSBmY3RyXHJcbiAgICB9KTtcclxuICB9XHJcbiAgaXNFeGlzdChkdGFPYmosIGZEYXRhKSB7XHJcbiAgICBjb25zb2xlLmxvZyhmRGF0YSk7XHJcbiAgICBpZiAoZkRhdGEgPT0gXCJcIiB8fCBmRGF0YSA9PSBudWxsKSByZXR1cm47XHJcbiAgICBsZXQgcmVxT2JqID0ge307XHJcbiAgICByZXFPYmpbXCJ1c2VybmFtZVwiXSA9IGZEYXRhO1xyXG4gICAgdGhpcy5oZWFkZXJbXCJtZXRob2RcIl0gPSBcImlzVXNlckV4aXN0XCI7XHJcbiAgICBsZXQgb3B0aW9ucyA9ICh7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh0aGlzLmhlYWRlcikgfSk7XHJcbiAgICB0aGlzLnNzXHJcbiAgICAgIC52YWxpZGF0ZShyZXFPYmosIG9wdGlvbnMsIFwiY29udGFjdC9sb2FkQ29udGFjdFwiKVxyXG4gICAgICAudGhlbigocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXNwb25zZS5tZXNzYWdlID09IFwiXCIpIHtcclxuICAgICAgICAgIHRoaXMudXNyaXNFeGlzdCA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLmljbyA9IFwiY2hlY2tcIjtcclxuICAgICAgICAgIHRoaXMub25FcnIgPSBkdGFPYmouZm9ybV9maWVsZDtcclxuICAgICAgICAgIC8vIHRoaXMuZmxhc2hNZXNzYWdlc1NlcnZpY2Uuc2hvdyhyZXNwb25zZS5tZXNzYWdlLCB7IGNzc0NsYXNzOiAnYWxlcnQtZGFuZ2VyJywgdGltZW91dDogMzAwMCB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgZHRhT2JqLmRlZmF1bHRfdmFsdWUgPSBcIlwiO1xyXG4gICAgICAgICAgdGhpcy51c3Jpc0V4aXN0ID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMuaWNvID0gXCJ0aW1lc1wiO1xyXG4gICAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgICB0aGlzLm9uRXJyID0gZHRhT2JqLmZvcm1fZmllbGQ7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcihyZXNwb25zZS5tZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIC5jYXRjaCgoZXJyOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcihlcnIubWVzc2FnZSk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc3VibWl0Rm9ybShmb3JtVmFsLCBidG4pIHtcclxuICAgIHRoaXMub25TdWJtaXQoZm9ybVZhbCwgYnRuKTtcclxuICB9XHJcblxyXG4gIG9uU3VibWl0KGZvcm1WYWwsIGJ0bikge1xyXG4gICAgdmFyIHQgPSBPYmplY3Qua2V5cyhmb3JtVmFsLmZvcm0uY29udHJvbHMpLmZvckVhY2goZmllbGQgPT4ge1xyXG4gICAgICBjb25zdCBjb250cm9sID0gZm9ybVZhbC5mb3JtLmdldChmaWVsZCk7XHJcbiAgICAgIGNvbnRyb2wubWFya0FzVG91Y2hlZCh7IG9ubHlTZWxmOiB0cnVlIH0pO1xyXG4gICAgfSk7XHJcbiAgICBpZiAoZm9ybVZhbC5mb3JtLnZhbGlkID09IHRydWUpIHtcclxuICAgICAgdGhpcy5hZGRlZGl0KGZvcm1WYWwudmFsdWUsIGJ0bik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGRlZGl0KHYsIGJ0bikge1xyXG5cclxuICAgIHRoaXMuc3Bpbm5lclNlcnZpY2Uuc2hvdygpO1xyXG4gICAgaWYgKHRoaXMucGFnZUluZm8uZm9ybV9ubWUgPT0gJ2FkZHJlc3NNYXN0ZXInIHx8IHRoaXMucGFnZUluZm8uZm9ybV9ubWUgPT0gJ2FjY0FkZHJlc3NNYXN0ZXInIHx8IHRoaXMucGFnZUluZm8uZm9ybV9ubWUgPT0gJ2FjY0FkZHJlc3NEZXRhaWxzJykge1xyXG4gICAgICBsZXQgY2l0eVN0ciA9IHYuY2l0eV9ubSB8fCAnJztcclxuICAgICAgbGV0IGNpdHlTdHJMc3QgPSBjaXR5U3RyLnNwbGl0KCcjJyk7XHJcbiAgICAgIGlmIChjaXR5U3RyTHN0Lmxlbmd0aCA9PSAzKSB7XHJcbiAgICAgICAgdi5jb3VudHJ5X25tID0gY2l0eVN0ckxzdFsyXTtcclxuICAgICAgICB2LnN0YXRlX25tID0gY2l0eVN0ckxzdFsxXTtcclxuICAgICAgICB2LmNpdHlfbm0gPSBjaXR5U3RyTHN0WzBdO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMudG9hc3RyLnN1Y2Nlc3MoXCJQbGVhc2UgY2hlY2sgY2l0eVwiKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuYnRuTmFtZSAhPSBcIkFkZFwiKVxyXG4gICAgICAgIHZbJ2FkZHJlc3NfaWRuJ10gPSB0aGlzLnBpZDtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcmVxT2JqID0ge307XHJcbiAgICB2YXIgcGFnZVRQID0gdGhpcy5wYWdlSW5mby5wYWdlX3R5cC50cmltKCk7XHJcbiAgICByZXFPYmpbXCJmb3JtTm1lXCJdID0gdGhpcy5wYWdlSW5mby5mb3JtX25tZTtcclxuICAgIHJlcU9ialtcInByaW1hcnlLZXlcIl0gPSB0aGlzLnBhZ2VJbmZvLnByaW1hcnlfa2V5X2ZpZWxkO1xyXG4gICAgcmVxT2JqW1wicGFnZVR5cFwiXSA9IHRoaXMucGFnZUluZm8ucGFnZV90eXA7XHJcbiAgICByZXFPYmpbXCJzZWNvbmRLZXlGaWVsZFwiXSA9IHRoaXMucGFnZUluZm8uc2Vjb25kX2tleV9maWVsZDtcclxuICAgIHJlcU9ialtcInByaW1hcnlJZFwiXSA9IHRoaXMuYnRuTmFtZSA9PSBcIkFkZFwiID8gXCJcIiA6IFwiXCIgKyB0aGlzLnBpZDtcclxuICAgIHJlcU9ialtcInRhYmxlTmFtZVwiXSA9IHRoaXMucGFnZUluZm8udGFibGVfbmFtZTtcclxuICAgIHJlcU9ialtcInRybnNUeXBlXCJdID0gdGhpcy5idG5OYW1lID09IFwiQWRkXCIgPyBcIkFERFwiIDogXCJFRElUXCI7XHJcbiAgICByZXFPYmpbXCJkYXRhVHJuc0R0bFwiXSA9IHY7XHJcbiAgICBpZiAocGFnZVRQID09IFwianNvbkZvcm1cIikge1xyXG4gICAgICByZXFPYmpbXCJ3aGVyZUtleXNcIl0gPSB0aGlzLnBhZ2VJbmZvLndoZXJlX2NsYXVzZTtcclxuICAgICAgcmVxT2JqW1wid2hlcmVWbHVzXCJdID0gdGhpcy53aGVyZU1hcFt0aGlzLnBhZ2VJbmZvLndoZXJlX2NsYXVzZV07XHJcbiAgICB9XHJcbiAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShyZXFPYmopKTtcclxuICAgIHRoaXMuaGVhZGVyW1wibWV0aG9kXCJdID0gXCJzYXZlXCI7XHJcbiAgICBsZXQgb3B0aW9ucyA9ICh7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh0aGlzLmhlYWRlcikgfSk7XHJcbiAgICB0aGlzLnNzXHJcbiAgICAgIC5hZGREYXRhKHJlcU9iaiwgb3B0aW9ucylcclxuICAgICAgLnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhyZXNwb25zZSk7XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSBcIlNVQ0NFU1NcIikge1xyXG4gICAgICAgICAgYnRuLmRpc2FibGVkID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLnRiQ2VsbCA9IG51bGw7XHJcbiAgICAgICAgICB0aGlzLnNlYXJjaEYgPSBudWxsO1xyXG4gICAgICAgICAgdGhpcy5jbG9zZWJ0bi5uYXRpdmVFbGVtZW50LmNsaWNrKCk7XHJcbiAgICAgICAgICAvLyBpZiAodGhpcy5idG5OYW1lICE9ICdBZGQnKSB7XHJcbiAgICAgICAgICAvLyAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuZ2xiT2JqKSB7XHJcbiAgICAgICAgICAvLyAgICAgaWYgKHYuaGFzT3duUHJvcGVydHkoa2V5KSkge1xyXG4gICAgICAgICAgLy8gICAgICAgdGhpcy5nbGJPYmpba2V5XSA9IHZba2V5XVxyXG4gICAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAgIC8vICAgfVxyXG4gICAgICAgICAgLy8gfSBlbHNlIHtcclxuICAgICAgICAgIC8vIGZvciAoY29uc3Qga2V5IGluIHRoaXMuZGF0YWxpc3RbMF0pIHtcclxuICAgICAgICAgIC8vICAgaWYgKCF2Lmhhc093blByb3BlcnR5KGtleSkpIHtcclxuICAgICAgICAgIC8vICAgICB0aGlzLmdsYk9ialtrZXldID0gcmVzcG9uc2UuX2lkO1xyXG4gICAgICAgICAgLy8gICB9XHJcbiAgICAgICAgICAvLyAgIGlmICh2Lmhhc093blByb3BlcnR5KGtleSkpIHtcclxuICAgICAgICAgIC8vICAgICB0aGlzLmdsYk9ialtrZXldID0gdltrZXldXHJcbiAgICAgICAgICAvLyAgIH1cclxuICAgICAgICAgIC8vIH1cclxuICAgICAgICAgIC8vIHRoaXMuZGF0YWxpc3QucHVzaCh0aGlzLmdsYk9iaik7XHJcbiAgICAgICAgICB0aGlzLmdldFBhZ2VEZWZpbmF0aW9uKCk7XHJcbiAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgICAgIHRoaXMudG9hc3RyLnN1Y2Nlc3MocmVzcG9uc2UubWVzc2FnZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy50YkNlbGwgPSBudWxsO1xyXG4gICAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcihyZXNwb25zZS5tZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIC5jYXRjaCgoZXJyOiBhbnkpID0+IHtcclxuICAgICAgICBidG4uZGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnRiQ2VsbCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoZXJyLm1lc3NhZ2UpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHZhbGlkYXRlUXVlcnkodGJsT2JqLCBmKSB7XHJcbiAgICBpZiAoZiA9PSBcIlwiIHx8IGYgPT0gbnVsbCkgcmV0dXJuO1xyXG4gICAgbGV0IHJlcU9iaiA9IHt9O1xyXG4gICAgcmVxT2JqW1wic3FsXCJdID0gZjtcclxuICAgIHRoaXMuaGVhZGVyW1wibWV0aG9kXCJdID0gXCJ2YWxpZGF0ZVF1ZXJ5XCI7XHJcbiAgICBsZXQgb3B0aW9ucyA9ICh7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh0aGlzLmhlYWRlcikgfSk7XHJcbiAgICB0aGlzLnNzXHJcbiAgICAgIC52YWxpZGF0ZShyZXFPYmosIG9wdGlvbnMsIFwic3lzdGVtL2FwcHBhZ2VzXCIpXHJcbiAgICAgIC50aGVuKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSBcIlNVQ0NFU1NcIikge1xyXG4gICAgICAgICAgdGhpcy5vbkVyciA9IFwiXCI7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgICAgdGhpcy5vbkVyciA9IHRibE9iai5mb3JtX2ZpZWxkO1xyXG4gICAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IocmVzcG9uc2UubWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICAuY2F0Y2goKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoZXJyLm1lc3NhZ2UpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIGlzVW5pcXVlKGR0YU9iaiwgaW5wdVZhbCkge1xyXG4gICAgaWYgKGlucHVWYWwgPT0gXCJcIiB8fCBpbnB1VmFsID09IG51bGwpIHJldHVybjtcclxuICAgIGxldCByZXFPYmogPSB7fTtcclxuICAgIHJlcU9ialtcInRhYmxlTmFtZVwiXSA9IHRoaXMucGFnZUluZm8udGFibGVfbmFtZTtcclxuICAgIHJlcU9ialtcIndoZXJlS2V5c1wiXSA9IGR0YU9iai5mb3JtX2ZpZWxkO1xyXG4gICAgcmVxT2JqW1wid2hlcmVWbHVzXCJdID0gaW5wdVZhbDtcclxuICAgIHJlcU9ialtcInByaW1hcnlLZXlcIl0gPSB0aGlzLnBhZ2VJbmZvLnByaW1hcnlfa2V5X2ZpZWxkO1xyXG4gICAgcmVxT2JqW1wicHJpbWFyeUlkXCJdID0gdGhpcy5idG5OYW1lID09IFwiQWRkXCIgPyBcIlwiIDogdGhpcy5waWQ7XHJcbiAgICB0aGlzLmhlYWRlcltcIm1ldGhvZFwiXSA9IFwidW5pcXVlQ29uUVwiO1xyXG4gICAgbGV0IG9wdGlvbnMgPSAoeyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnModGhpcy5oZWFkZXIpIH0pO1xyXG4gICAgdGhpcy5zc1xyXG4gICAgICAudmFsaWRhdGUocmVxT2JqLCBvcHRpb25zLCBcInN5c3RlbS9hcHBwYWdlc1wiKVxyXG4gICAgICAudGhlbigocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT0gXCJTVUNDRVNTXCIpIHtcclxuICAgICAgICAgIHRoaXMub25FcnIgPSBcIlwiO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgICAgIHRoaXMub25FcnIgPSBkdGFPYmouZm9ybV9maWVsZDtcclxuICAgICAgICAgIHRoaXMudG9hc3RyLmVycm9yKHJlc3BvbnNlLm1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgLmNhdGNoKChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgIHRoaXMudG9hc3RyLmVycm9yKGVyci5tZXNzYWdlKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBvblBhZ2VTaXplQ2hhbmdlKHApIHtcclxuICAgIGlmIChwID09IFwiQWxsXCIpIHtcclxuICAgICAgdGhpcy5wYWdlU2l6ZSA9IHRoaXMuZGF0YWxpc3QubGVuZ3RoO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5wYWdlU2l6ZSA9IHA7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXRPcmRlcih2YWx1ZTogc3RyaW5nLCBpKSB7XHJcbiAgICB0aGlzLnNob3dhcnIgPSBpO1xyXG4gICAgaWYgKHRoaXMub3JkZXIgPT09IHZhbHVlKSB7XHJcbiAgICAgIHRoaXMucmV2ZXJzZSA9ICF0aGlzLnJldmVyc2U7XHJcbiAgICB9XHJcbiAgICB0aGlzLm9yZGVyID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBlZGl0Q2VsbChkLCB0YmgpIHtcclxuICAgIHRoaXMuZ2xiT2JqID0gZDtcclxuICAgIHRoaXMudGJDZWxsID0gdGJoO1xyXG4gICAgdGhpcy50aXRsZSA9IGQudGl0bGU7XHJcbiAgICB0aGlzLmJ0bk5hbWUgPSBcIkVkaXRcIjtcclxuICAgIHRoaXMucGlkID0gZFt0aGlzLnBrZl07XHJcbiAgICB0aGlzLmdldEVkaXREYXRhKGQpO1xyXG4gIH1cclxuXHJcbiAgZ2V0TmFtZUF0dHIoZnJtbm1lLCBtZGwpIHtcclxuICAgIGxldCByZXFPYmogPSB7fTtcclxuICAgIHJlcU9ialtcImZvcm1ObWVcIl0gPSBmcm1ubWU7XHJcbiAgICByZXFPYmpbXCJubWVJZG5cIl0gPSB0aGlzLnJvdXRlLnNuYXBzaG90LnBhcmFtTWFwLmdldChcInN1YnZcIik7XHJcbiAgICByZXFPYmpbJ21kbExpc3QnXSA9IG1kbDtcclxuICAgIHRoaXMuaGVhZGVyW1wibWV0aG9kXCJdID0gXCJsb2FkTm1lQXR0clwiO1xyXG4gICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkocmVxT2JqKSk7XHJcbiAgICBsZXQgb3B0aW9ucyA9ICh7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh0aGlzLmhlYWRlcikgfSk7XHJcbiAgICB0aGlzLnNzXHJcbiAgICAgIC52YWxpZGF0ZShyZXFPYmosIG9wdGlvbnMsIFwic3lzdGVtL2FwcHBhZ2VzXCIpXHJcbiAgICAgIC50aGVuKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSBcIlNVQ0NFU1NcIikge1xyXG4gICAgICAgICAgY29uc29sZS5sb2cocmVzcG9uc2UpXHJcbiAgICAgICAgICB0aGlzLnVpR3JwTGlzdCA9IHJlc3BvbnNlLnVpR3JwTGlzdDtcclxuICAgICAgICAgIHRoaXMudWlHcnBMaXN0RHRsID0gcmVzcG9uc2UudWlHcnBMaXN0RHRsO1xyXG4gICAgICAgICAgdGhpcy5hdHRyQ0xpc3REdGwgPSByZXNwb25zZS5hdHRyQ0xpc3REdGw7XHJcbiAgICAgICAgICB0aGlzLmF0dHJRTGlzdER0bCA9IHJlc3BvbnNlLmF0dHJRTGlzdER0bDtcclxuICAgICAgICAgIHRoaXMuZGF0YUR0bCA9IHJlc3BvbnNlLmRhdGFEdGw7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhyZXNwb25zZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IocmVzcG9uc2UubWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICAuY2F0Y2goKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoZXJyLm1lc3NhZ2UpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIGRvY2VkaXRBY3Rpb247XHJcbiAgZG9jZGVsZXRlQWN0aW9uO1xyXG5cclxuICBnZXRGaWxlcyhubWVJZG4pIHtcclxuXHJcbiAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLnNob3coKTtcclxuICAgIHRoaXMuZG9jZWRpdEFjdGlvbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5kb2NkZWxldGVBY3Rpb24gPSBmYWxzZTtcclxuICAgIGNvbnN0IHJlcU9iaiA9IHt9O1xyXG4gICAgcmVxT2JqW1wiZm9ybU5tZVwiXSA9IFwiZG9jdW1lbnRVcGxvYWRNYXN0ZXJcIjtcclxuICAgIHJlcU9ialtcIm5tZUlkblwiXSA9IG5tZUlkbjtcclxuICAgIHRoaXMuaGVhZGVyW1wibWV0aG9kXCJdID0gXCJsb2FkRG9jc1wiO1xyXG4gICBjb25zdCBvcHRpb25zID0gKHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHRoaXMuaGVhZGVyKSB9KTtcclxuICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHJlcU9iaikpO1xyXG4gICAgdGhpcy51cGxvYWRTZXJ2aWNlLmdldEZpbGVzTGlzdChyZXFPYmosIG9wdGlvbnMpLnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSBcIlNVQ0NFU1NcIikge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKHJlc3BvbnNlKTtcclxuICAgICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgICB0aGlzLnMzZGV0YWlscyA9IHJlc3BvbnNlLnMzZGV0YWlscyB8fCB7fTtcclxuICAgICAgICBsZXQgZG9jQWN0aW9uYnRuID0gcmVzcG9uc2UucGFnZURlZmluYXRpb24uYWN0aW9uIHx8IFtdO1xyXG4gICAgICAgIGRvY0FjdGlvbmJ0bi5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgZGVidWdnZXI7XHJcbiAgICAgICAgICBpZiAoZWxlbWVudC5mb3JtX2ZpZWxkID09ICdlZGl0JylcclxuICAgICAgICAgICAgdGhpcy5kb2NlZGl0QWN0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgIGlmIChlbGVtZW50LmZvcm1fZmllbGQgPT0gJ2RlbGV0ZScpXHJcbiAgICAgICAgICAgIHRoaXMuZG9jZGVsZXRlQWN0aW9uID0gdHJ1ZTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBsZXQgYnVja2V0TmFtZSA9IHRoaXMuczNkZXRhaWxzW1wiZG9jYnVja2V0XCJdIHx8IFwiXCI7XHJcbiAgICAgICAgbGV0IGZvbGRlck5hbWUgPSB0aGlzLnMzZGV0YWlsc1tcImRvY2ZvbGRlclwiXSB8fCBcIlwiO1xyXG4gICAgICAgIGZvbGRlck5hbWUgPSBmb2xkZXJOYW1lLnJlcGxhY2UoXCIjRFNcIiwgQ29va2llLmdldChcIl9kc1wiKS50b1VwcGVyQ2FzZSgpKTtcclxuICAgICAgICB0aGlzLnMzZGV0YWlsc1tcImRvY2ZvbGRlclwiXSA9IGZvbGRlck5hbWU7XHJcbiAgICAgICAgbGV0IHMzQWNjZXNzS2V5ID0gdGhpcy5zM2RldGFpbHNbXCJkb2NTM2FjY2Vzc0tleVwiXSB8fCBcIlwiO1xyXG4gICAgICAgIGxldCBzM1NlY3JldEtleSA9IHRoaXMuczNkZXRhaWxzW1wiZG9jUzNzZWNyZXRLZXlcIl0gfHwgXCJcIjtcclxuICAgICAgICBsZXQgczNyZWdpb24gPSB0aGlzLnMzZGV0YWlsc1tcImRvY1MzcmVnaW9uXCJdIHx8IFwiXCI7XHJcbiAgICAgICAgbGV0IGlzdmFpbGQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChidWNrZXROYW1lID09IFwiXCIpIHtcclxuICAgICAgICAgIGlzdmFpbGQgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMudG9hc3RyLmVycm9yKFwiRG9jdW1lbnQgQnVja2V0IG5vdCBmb3VuZFwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGZvbGRlck5hbWUgPT0gXCJcIikge1xyXG4gICAgICAgICAgaXN2YWlsZCA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoXCJEb2N1bWVudCBGbG9kZXIgbm90IGZvdW5kXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoczNBY2Nlc3NLZXkgPT0gXCJcIikge1xyXG4gICAgICAgICAgaXN2YWlsZCA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoXCJEb2N1bWVudCBzM0FjY2Vzc0tleSBub3QgZm91bmRcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzM1NlY3JldEtleSA9PSBcIlwiKSB7XHJcbiAgICAgICAgICBpc3ZhaWxkID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcihcIkRvY3VtZW50IHMzU2VjcmV0S2V5IG5vdCBmb3VuZFwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHMzcmVnaW9uID09IFwiXCIpIHtcclxuICAgICAgICAgIGlzdmFpbGQgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMudG9hc3RyLmVycm9yKFwiRG9jdW1lbnQgczNyZWdpb24gbm90IGZvdW5kXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaXN2YWlsZCkge1xyXG4gICAgICAgICAgdGhpcy5kYXRhRHRsID0gcmVzcG9uc2UuZGF0YUR0bCB8fCB7fTtcclxuICAgICAgICAgIHRoaXMuZG9jdW1lbnRVcGxvYWRMaXN0ID0gcmVzcG9uc2UuZG9jdW1lbnRVcGxvYWREdGwuZG9jdW1lbnRVcGxvYWRMaXN0O1xyXG4gICAgICAgICAgdGhpcy5kb2N1bWVudFVwbG9hZExpc3Quc29ydCgpO1xyXG4gICAgICAgICAgaWYgKHRoaXMuZG9jdW1lbnRVcGxvYWRMaXN0Lmxlbmd0aCA+IDApXHJcbiAgICAgICAgICAgIHRoaXMuZG9jdHlwZSA9IHRoaXMuZG9jdW1lbnRVcGxvYWRMaXN0WzBdO1xyXG5cclxuICAgICAgICAgIGxldCBkb2N0eXAgPSB0aGlzLnJvdXRlLnNuYXBzaG90LnBhcmFtc1tcImRvY3R5cFwiXSB8fCBcIlwiO1xyXG4gICAgICAgICAgaWYgKGRvY3R5cCAhPSAnJylcclxuICAgICAgICAgICAgdGhpcy5kb2N0eXBlID0gZG9jdHlwO1xyXG5cclxuICAgICAgICAgIHRoaXMuZG9jdW1lbnRVcGxvYWREdGwgPSByZXNwb25zZS5kb2N1bWVudFVwbG9hZER0bDtcclxuXHJcbiAgICAgICAgICBjb25zdCBidWNrZXQgPSBuZXcgUzMoe1xyXG4gICAgICAgICAgICBhY2Nlc3NLZXlJZDogdGhpcy5zM2RldGFpbHNbXCJkb2NTM2FjY2Vzc0tleVwiXSxcclxuICAgICAgICAgICAgc2VjcmV0QWNjZXNzS2V5OiB0aGlzLnMzZGV0YWlsc1tcImRvY1Mzc2VjcmV0S2V5XCJdLFxyXG4gICAgICAgICAgICByZWdpb246IHMzcmVnaW9uXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIGRlYnVnZ2VyXHJcbiAgICAgICAgICB0aGlzLmRvY3VtZW50VXBsb2FkTGlzdC5mb3JFYWNoKGRvY3R5cGUgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5kYXRhRHRsW2RvY3R5cGVdICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgIHRoaXMuZGF0YUR0bFtkb2N0eXBlXS5mb3JFYWNoKGR0bCA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdXJsUGFyYW1zID0ge1xyXG4gICAgICAgICAgICAgICAgICBCdWNrZXQ6IHRoaXMuczNkZXRhaWxzW1wiZG9jYnVja2V0XCJdLFxyXG4gICAgICAgICAgICAgICAgICBLZXk6IHRoaXMuczNkZXRhaWxzW1wiZG9jZm9sZGVyXCJdICsgXCIvXCIgKyBkdGxbXCJkb2Nfbm1lXCJdXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgYnVja2V0LmdldFNpZ25lZFVybChcImdldE9iamVjdFwiLCB1cmxQYXJhbXMsIGZ1bmN0aW9uIChlcnIsIHVybCkge1xyXG4gICAgICAgICAgICAgICAgICBkZWJ1Z2dlclxyXG4gICAgICAgICAgICAgICAgICBkdGxbXCJzaWduVXJsXCJdID0gdXJsO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmRvY3VtZW50VXBsb2FkTGlzdCA9IFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSlcclxuICAgICAgLmNhdGNoKChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgIHRoaXMudG9hc3RyLmVycm9yKGVyci5tZXNzYWdlKTtcclxuICAgICAgfSk7XHJcbiAgICBjb25zb2xlLmxvZyhcImRvY3VtZW50VXBsb2FkTGlzdFwiLCB0aGlzLmRvY3VtZW50VXBsb2FkTGlzdClcclxuICB9XHJcbiAgb3BlbmRvY3MoZHRsKSB7XHJcbiAgICBsZXQgdXJsID0gZHRsLnNpZ25Vcmw7XHJcbiAgICB3aW5kb3cub3Blbih1cmwsICdfYmxhbmsnKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHVwbG9hZERvY3MoZXZlbnQpIHtcclxuICAgIGRlYnVnZ2VyO1xyXG4gICAgdGhpcy5zcGlubmVyU2VydmljZS5zaG93KCk7XHJcbiAgICBsZXQgbm1lSWRuID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5wYXJhbU1hcC5nZXQoXCJzdWJ2XCIpO1xyXG4gICAgbGV0IHJlcU9iaiA9IHt9O1xyXG4gICAgcmVxT2JqW1wic2VxXCJdID0gXCJubWVfZG9jc19zZXFcIjtcclxuICAgIHRoaXMuaGVhZGVyW1wibWV0aG9kXCJdID0gXCJnZXRTZXFcIjtcclxuICAgIGxldCBvcHRpb25zID0gKHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHRoaXMuaGVhZGVyKSB9KTtcclxuICAgIGxldCBzZXFEdGwgPSBhd2FpdCB0aGlzLnNzLmdldERhdGEocmVxT2JqLCBvcHRpb25zKSB8fCB7fTtcclxuICAgIGlmIChzZXFEdGxbJ3N0YXR1cyddID09IFwiU1VDQ0VTU1wiKSB7XHJcbiAgICAgIHZhciBzZXEgPSBzZXFEdGxbJ3NlcSddO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRmlsZXMgPSBldmVudC50YXJnZXQuZmlsZXM7XHJcbiAgICAgIHRoaXMuZmlsZSA9IHRoaXMuc2VsZWN0ZWRGaWxlcy5pdGVtKDApO1xyXG4gICAgICBsZXQgZmlsZU5hbWUgPSB0aGlzLmZpbGUubmFtZTtcclxuICAgICAgbGV0IGV4dCA9IGZpbGVOYW1lLnN1YnN0cmluZyhmaWxlTmFtZS5sYXN0SW5kZXhPZihcIi5cIikgKyAxKTtcclxuICAgICAgZmlsZU5hbWUgPSBubWVJZG4gKyBcIl9cIiArIHNlcSArIFwiX1wiICsgdGhpcy5kb2N0eXBlICsgXCIuXCIgKyBleHQ7XHJcbiAgICAgIGxldCB1cGxvYWRGaWxlID0gYXdhaXQgdGhpcy51cGxvYWRGaWxlKHRoaXMuZmlsZSwgZmlsZU5hbWUpIHx8ICcnO1xyXG4gICAgICBkZWJ1Z2dlcjtcclxuICAgICAgaWYgKHVwbG9hZEZpbGUgIT0gJycpIHtcclxuICAgICAgICBsZXQgcmVxT2JqID0ge307XHJcbiAgICAgICAgbGV0IHRyYW5zZHRsID0ge307XHJcbiAgICAgICAgdHJhbnNkdGxbXCJkb2NfZXh0XCJdID0gdGhpcy5maWxlLnR5cGU7XHJcbiAgICAgICAgdHJhbnNkdGxbXCJkb2NfdHlwXCJdID0gdGhpcy5kb2N0eXBlO1xyXG4gICAgICAgIHRyYW5zZHRsW1wiZG9jc19pZG5cIl0gPSBzZXE7XHJcbiAgICAgICAgdHJhbnNkdGxbXCJkb2Nfbm1lXCJdID0gZmlsZU5hbWU7XHJcbiAgICAgICAgdHJhbnNkdGxbXCJzdHRcIl0gPSBcIjFcIjtcclxuICAgICAgICByZXFPYmpbXCJ0cm5zVHlwZVwiXSA9IFwiQUREXCI7XHJcbiAgICAgICAgcmVxT2JqW1wiZGF0YVRybnNEdGxcIl0gPSB0cmFuc2R0bDtcclxuICAgICAgICByZXFPYmpbXCJubWVJZG5cIl0gPSBubWVJZG47XHJcbiAgICAgICAgdGhpcy5oZWFkZXJbXCJtZXRob2RcIl0gPSBcInNhdmVEb2NzXCI7XHJcbiAgICAgICAgY29uc29sZS5sb2cocmVxT2JqKTtcclxuICAgICAgICBsZXQgb3B0aW9ucyA9ICh7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh0aGlzLmhlYWRlcikgfSk7XHJcbiAgICAgICAgdGhpcy51cGxvYWRTZXJ2aWNlLnNhdmVEb2N0b0RCKHJlcU9iaiwgb3B0aW9ucykudGhlbigocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSBcIlNVQ0NFU1NcIikge1xyXG4gICAgICAgICAgICB0aGlzLmdldEZpbGVzKHJlcU9ialsnbm1lSWRuJ10pOyAvLy8vIHJlZnJhc2ggYWZ0ZXIgZG9jIHNhdmVkXHJcbiAgICAgICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgICAgICB0aGlzLnRvYXN0ci5zdWNjZXNzKHJlc3BvbnNlLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgICAgIHRoaXMudG9hc3RyLmVycm9yKHJlc3BvbnNlLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgICAuY2F0Y2goKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcihlcnIubWVzc2FnZSk7XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoXCJGaWxlIHVwbG9hZCBmYWlsZWRcIik7XHJcbiAgICAgIH1cclxuXHJcblxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgIHRoaXMudG9hc3RyLmVycm9yKFwiZG9jdW1lbnQgU2VxLiBnZW5hcmF0aW9uIGVycm9yXCIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG5cclxuXHJcbiAgdXBsb2FkRmlsZShmaWxlLCBmaWxlTmFtZSkge1xyXG4gICAgY29uc3QgYnVja2V0ID0gbmV3IFMzKHtcclxuICAgICAgYWNjZXNzS2V5SWQ6IHRoaXMuczNkZXRhaWxzW1wiZG9jUzNhY2Nlc3NLZXlcIl0sXHJcbiAgICAgIHNlY3JldEFjY2Vzc0tleTogdGhpcy5zM2RldGFpbHNbXCJkb2NTM3NlY3JldEtleVwiXSxcclxuICAgICAgcmVnaW9uOiB0aGlzLnMzZGV0YWlsc1tcImRvY1MzcmVnaW9uXCJdXHJcbiAgICB9KTtcclxuICAgIGNvbnN0IHBhcmFtcyA9IHtcclxuICAgICAgQnVja2V0OiB0aGlzLnMzZGV0YWlsc1tcImRvY2J1Y2tldFwiXSxcclxuICAgICAgS2V5OiB0aGlzLnMzZGV0YWlsc1tcImRvY2ZvbGRlclwiXSArIFwiL1wiICsgZmlsZU5hbWUsXHJcbiAgICAgIEJvZHk6IGZpbGUsXHJcbiAgICAgIENvbnRlbnRUeXBlOiBmaWxlLnR5cGVcclxuICAgIH07XHJcbiAgICBkZWJ1Z2dlcjtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgIGJ1Y2tldC51cGxvYWQocGFyYW1zLCBmdW5jdGlvbiAoZXJyb3IsIHJlc3VsdCkge1xyXG4gICAgICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coXCJUaGVyZSB3YXMgYW4gZXJyb3IgdXBsb2FkaW5nIHlvdXIgZmlsZTogXCIsIGVycm9yKTtcclxuICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiU3VjY2Vzc2Z1bGx5IHVwbG9hZGVkIGZpbGUuXCIsIHJlc3VsdCk7XHJcbiAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcblxyXG4gIGRlbGV0ZURvYygpIHtcclxuICAgIHRoaXMuc3Bpbm5lclNlcnZpY2Uuc2hvdygpO1xyXG4gICAgdGhpcy5EZWxldGVEb2NzRnJvbVMzKHRoaXMuZG9jRGVsZXRlRHRsKTtcclxuICAgIC8vIGxldCBkZWxldGVEdGwgPSBhd2FpdCB0aGlzLkRlbGV0ZURvY3NGcm9tUzModGhpcy5kb2NEZWxldGVEdGwpIHx8ICcnO1xyXG4gICAgLy8gaWYgKGRlbGV0ZUR0bCAhPSAnJykge1xyXG4gICAgY29uc3QgcmVxT2JqID0ge307XHJcbiAgICByZXFPYmpbXCJkb2NzX2lkblwiXSA9IHRoaXMuZG9jRGVsZXRlRHRsWydkb2NzX2lkbiddO1xyXG4gICAgcmVxT2JqW1widHJuc1R5cGVcIl0gPSBcIkRFTEVURVwiO1xyXG4gICAgcmVxT2JqW1wibm1lSWRuXCJdID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5wYXJhbU1hcC5nZXQoXCJzdWJ2XCIpO1xyXG4gICAgdGhpcy5oZWFkZXJbXCJtZXRob2RcIl0gPSBcInNhdmVEb2NzXCI7XHJcbiAgICBjb25zb2xlLmxvZyhyZXFPYmopO1xyXG4gICBjb25zdCBvcHRpb25zID0gKHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHRoaXMuaGVhZGVyKSB9KTtcclxuICAgIHRoaXMudXBsb2FkU2VydmljZS5zYXZlRG9jdG9EQihyZXFPYmosIG9wdGlvbnMpLnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSBcIlNVQ0NFU1NcIikge1xyXG4gICAgICAgIHRoaXMuZ2V0RmlsZXModGhpcy5yb3V0ZS5zbmFwc2hvdC5wYXJhbU1hcC5nZXQoXCJzdWJ2XCIpKTsgLy8vLyByZWZyYXNoIGFmdGVyIGRvYyBzYXZlZFxyXG4gICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgIHRoaXMudG9hc3RyLnN1Y2Nlc3MocmVzcG9uc2UubWVzc2FnZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IocmVzcG9uc2UubWVzc2FnZSk7XHJcbiAgICAgIH1cclxuICAgIH0pLmNhdGNoKChlcnI6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgdGhpcy50b2FzdHIuZXJyb3IoZXJyLm1lc3NhZ2UpO1xyXG4gICAgfSk7XHJcbiAgICAvLyB9IGVsc2Uge1xyXG4gICAgLy8gICB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgIC8vICAgdGhpcy5mbGFzaE1lc3NhZ2VzU2VydmljZS5zaG93KFwiRXJyb3IgaW4gZmlsZSBkZWxldGlvblwiLCB7IGNzc0NsYXNzOiBcImFsZXJ0LWRhbmdlclwiLCB0aW1lb3V0OiAzMDAwIH0pO1xyXG4gICAgLy8gfVxyXG4gIH1cclxuXHJcblxyXG4gIERlbGV0ZURvY3NGcm9tUzMoZG9jRHRsKSB7XHJcbiAgICBjb25zdCBidWNrZXQgPSBuZXcgUzMoe1xyXG4gICAgICBhY2Nlc3NLZXlJZDogdGhpcy5zM2RldGFpbHNbXCJkb2NTM2FjY2Vzc0tleVwiXSxcclxuICAgICAgc2VjcmV0QWNjZXNzS2V5OiB0aGlzLnMzZGV0YWlsc1tcImRvY1Mzc2VjcmV0S2V5XCJdLFxyXG4gICAgICByZWdpb246IHRoaXMuczNkZXRhaWxzW1wiZG9jUzNyZWdpb25cIl1cclxuICAgIH0pO1xyXG4gICAgY29uc3QgcGFyYW1zID0ge1xyXG4gICAgICBCdWNrZXQ6IHRoaXMuczNkZXRhaWxzW1wiZG9jYnVja2V0XCJdLFxyXG4gICAgICBLZXk6IHRoaXMuczNkZXRhaWxzW1wiZG9jZm9sZGVyXCJdICsgXCIvXCIgKyBkb2NEdGxbJ2RvY19ubWUnXSxcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgYnVja2V0LmRlbGV0ZU9iamVjdChwYXJhbXMsIGZ1bmN0aW9uIChlcnJvciwgcmVzdWx0KSB7XHJcbiAgICAgICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIlRoZXJlIHdhcyBhbiBlcnJvciBkZWxldGUgeW91ciBmaWxlOiBcIiwgZXJyb3IpO1xyXG4gICAgICAgICAgcmVqZWN0KFwiXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zb2xlLmxvZyhcImRlbGV0ZWQgdXBsb2FkZWQgZmlsZS5cIiwgcmVzdWx0KTtcclxuICAgICAgICByZXNvbHZlKHJlc3VsdCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gIH1cclxuICBkb2NEZWxldGVEdGwgPSB7fTtcclxuICBDb25maXJtZGVsZXRlRG9jKGRvY0R0bCkge1xyXG4gICAgdGhpcy5kb2NEZWxldGVEdGwgPSBkb2NEdGw7XHJcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9jZGVsZXRlYnRuJykuY2xpY2soKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIEVkaXRVcGxvYWREb2NzKGRvY0R0bCwgZXZlbnQpIHtcclxuICAgIGRlYnVnZ2VyO1xyXG4gICAgbGV0IGRlbGV0ZUR0bCA9IGF3YWl0IHRoaXMuRGVsZXRlRG9jc0Zyb21TMyh0aGlzLmRvY0RlbGV0ZUR0bCkgfHwgJyc7XHJcbiAgICBkZWJ1Z2dlcjtcclxuICAgIGlmIChkZWxldGVEdGwgIT0gJycpIHtcclxuICAgICAgY29uc3QgcmVxT2JqID0ge307XHJcbiAgICAgIHJlcU9ialtcImRvY3NfaWRuXCJdID0gZG9jRHRsWydkb2NzX2lkbiddO1xyXG4gICAgICByZXFPYmpbXCJ0cm5zVHlwZVwiXSA9IFwiREVMRVRFXCI7XHJcbiAgICAgIHJlcU9ialtcIm5tZUlkblwiXSA9IHRoaXMucm91dGUuc25hcHNob3QucGFyYW1NYXAuZ2V0KFwic3VidlwiKTtcclxuICAgICAgdGhpcy5oZWFkZXJbXCJtZXRob2RcIl0gPSBcInNhdmVEb2NzXCI7XHJcbiAgICAgY29uc3Qgb3B0aW9ucyA9ICh7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh0aGlzLmhlYWRlcikgfSk7XHJcbiAgICAgIGxldCBkZWxldGVEYkR0bCA9IGF3YWl0IHRoaXMudXBsb2FkU2VydmljZS5zYXZlRG9jdG9EQihyZXFPYmosIG9wdGlvbnMpO1xyXG4gICAgICBkZWJ1Z2dlcjtcclxuICAgICAgaWYgKGRlbGV0ZURiRHRsWydzdGF0dXMnXSA9PSBcIlNVQ0NFU1NcIikge1xyXG4gICAgICAgIHRoaXMudXBsb2FkRG9jcyhldmVudClcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcihcIkVycm9yIGluIGZpbGUgRWRpdFwiKTtcclxuICAgICAgfVxyXG5cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGxvYWRBcHBsaWNhdGlvbigpIHtcclxuICAgIHRoaXMuYXBwbGljYXRpb24gPSBcIlwiO1xyXG4gICAgdGhpcy5zcGlubmVyU2VydmljZS5zaG93KCk7XHJcbiAgICBjb25zdCByZXFPYmogPSB7fTtcclxuICAgIHJlcU9ialtcImZvcm1ObWVcIl0gPSBcImNvbnRhY3RTZWFyY2hGb3JtXCI7XHJcbiAgICB0aGlzLmhlYWRlcltcIm1ldGhvZFwiXSA9IFwibG9hZEFwcGxpY2F0aW9uc1wiO1xyXG4gICBjb25zdCBvcHRpb25zID0gKHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHRoaXMuaGVhZGVyKSB9KTtcclxuICAgIHRoaXMuY3NcclxuICAgICAgLmxvYWQocmVxT2JqLCBvcHRpb25zLCBcImNvbnRhY3QvbG9hZENvbnRhY3RcIilcclxuICAgICAgLnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhyZXNwb25zZSk7XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSBcIlNVQ0NFU1NcIikge1xyXG4gICAgICAgICAgdGhpcy5hcHBsaWNhdGlvbkxpc3QgPSByZXNwb25zZS5hcHBsaWNhdGlvbkxpc3Q7XHJcbiAgICAgICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcihyZXNwb25zZS5tZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIC5jYXRjaCgoZXJyOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcihlcnIubWVzc2FnZSk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuICBhcHBsaWNhdGlvbjtcclxuICBNb2R1bGU7XHJcbiAgVXNlcjtcclxuICBsb2FkV2ViQXBwbGljYXRpb24oKSB7XHJcbiAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLnNob3coKTtcclxuICAgIGNvbnN0IHJlcU9iaiA9IHt9O1xyXG4gICAgcmVxT2JqW1wiZm9ybU5tZVwiXSA9IFwiY29udGFjdFNlYXJjaEZvcm1cIjtcclxuICAgIHJlcU9ialtcImFwcGxpY2F0aW9uU3RyXCJdID0gXCJXV1dcIjtcclxuICAgIHRoaXMuaGVhZGVyW1wibWV0aG9kXCJdID0gXCJsb2FkQXBwbGljYXRpb25zXCI7XHJcbiAgIGNvbnN0IG9wdGlvbnMgPSAoeyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnModGhpcy5oZWFkZXIpIH0pO1xyXG4gICAgdGhpcy5jc1xyXG4gICAgICAubG9hZChyZXFPYmosIG9wdGlvbnMsIFwiY29udGFjdC9sb2FkQ29udGFjdFwiKVxyXG4gICAgICAudGhlbigocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKHJlc3BvbnNlKTtcclxuICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09IFwiU1VDQ0VTU1wiKSB7XHJcbiAgICAgICAgICB0aGlzLmFwcGxpY2F0aW9uTGlzdCA9IHJlc3BvbnNlLmFwcGxpY2F0aW9uTGlzdDtcclxuICAgICAgICAgIGlmICh0aGlzLmFwcGxpY2F0aW9uTGlzdC5sZW5ndGggPT0gMikge1xyXG4gICAgICAgICAgICB0aGlzLmFwcGxpY2F0aW9uID0gdGhpcy5hcHBsaWNhdGlvbkxpc3RbMV0uaztcclxuICAgICAgICAgICAgdGhpcy5sb2FkVXNyTWRsKHRoaXMuYXBwbGljYXRpb24pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IocmVzcG9uc2UubWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICAuY2F0Y2goKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoZXJyLm1lc3NhZ2UpO1xyXG4gICAgICB9KTtcclxuICB9XHJcbiAgbG9hZFVzck1kbChhcHBsSWQpIHtcclxuICAgIHRoaXMuTW9kdWxlID0gXCJcIjtcclxuICAgIHRoaXMuVXNlciA9IFwiXCI7XHJcbiAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLnNob3coKTtcclxuICAgIGNvbnN0IHJlcU9iaiA9IHt9O1xyXG4gICAgcmVxT2JqW1wibm1lSWRuXCJdID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5wYXJhbU1hcC5nZXQoXCJzdWJ2XCIpO1xyXG4gICAgcmVxT2JqW1wiYXBwbElkXCJdID0gYXBwbElkO1xyXG4gICAgcmVxT2JqW1wiZm9ybU5tZVwiXSA9IFwiVXNlck1vZHVsZUxpc3RcIjtcclxuICAgIHRoaXMuaGVhZGVyW1wibWV0aG9kXCJdID0gXCJnZXRVc2VyTW9kdWxlTGlzdFwiO1xyXG4gICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkocmVxT2JqKSk7XHJcbiAgIGNvbnN0IG9wdGlvbnMgPSAoeyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnModGhpcy5oZWFkZXIpIH0pO1xyXG4gICAgdGhpcy5jc1xyXG4gICAgICAubG9hZE1lbnVSaWdodHNVc2VyV2lzZShyZXFPYmosIG9wdGlvbnMpXHJcbiAgICAgIC50aGVuKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2cocmVzcG9uc2UpO1xyXG4gICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT0gXCJTVUNDRVNTXCIpIHtcclxuICAgICAgICAgIHRoaXMudXNlckR0bHMgPSByZXNwb25zZS51c2VyRHRscztcclxuICAgICAgICAgIGlmICh0aGlzLnVzZXJEdGxzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5Vc2VyID0gdGhpcy51c2VyRHRsc1swXVsndXNlcl9pZG4nXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMubW9kdWxlRHRscyA9IHJlc3BvbnNlLm1vZHVsZUR0bHM7XHJcbiAgICAgICAgICBpZiAodGhpcy5tb2R1bGVEdGxzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5Nb2R1bGUgPSB0aGlzLm1vZHVsZUR0bHNbMF1bJ21vZHVsZV9pZG4nXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgICAgIHRoaXMudG9hc3RyLmVycm9yKHJlc3BvbnNlLm1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgLmNhdGNoKChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgIHRoaXMudG9hc3RyLmVycm9yKGVyci5tZXNzYWdlKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXRVc2VyUmlnaHRzKHVzZXJJZCwgTW9kdWxlSWQpIHtcclxuICAgIHRoaXMuc3Bpbm5lclNlcnZpY2Uuc2hvdygpO1xyXG4gICAgY29uc3QgcmVxT2JqID0ge307XHJcbiAgICByZXFPYmpbXCJtb2R1bGVJZG5zXCJdID0gTW9kdWxlSWQ7XHJcbiAgICByZXFPYmpbXCJ1c2VySWRcIl0gPSB1c2VySWQ7XHJcbiAgICB0aGlzLmhlYWRlcltcIm1ldGhvZFwiXSA9IFwiZ2V0TWVudUxpc3RCeU1vZHVsZVwiO1xyXG4gICAgY29uc29sZS5sb2cocmVxT2JqKTtcclxuICAgY29uc3Qgb3B0aW9ucyA9ICh7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh0aGlzLmhlYWRlcikgfSk7XHJcbiAgICB0aGlzLmNzXHJcbiAgICAgIC5sb2FkTWVudVJpZ2h0c1VzZXJXaXNlKHJlcU9iaiwgb3B0aW9ucylcclxuICAgICAgLnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhyZXNwb25zZSk7XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSBcIlNVQ0NFU1NcIikge1xyXG4gICAgICAgICAgdGhpcy50b3RNZW51ID0gMDtcclxuICAgICAgICAgIHRoaXMubWVudUxpc3QgPSByZXNwb25zZS5tZW51TGlzdDtcclxuICAgICAgICAgIHRoaXMudXNlclJpZ2h0c01lbnVMaXN0ID0gcmVzcG9uc2UudXNlclJpZ2h0c01lbnVMaXN0O1xyXG4gICAgICAgICAgdGhpcy5tZW51TGlzdC5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnRvdE1lbnUgKz0gZWxlbWVudC5TdWJNZW51Lmxlbmd0aDtcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgICAgIHRoaXMudG9hc3RyLmVycm9yKHJlc3BvbnNlLm1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgLmNhdGNoKChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgIHRoaXMudG9hc3RyLmVycm9yKGVyci5tZXNzYWdlKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBvbkNoYW5nZVN1Yk1lbnUoZSwgc3ViTWVudUlkLCBNZW51SWQsIFVzZXJJZCwgbW9kdWxlSWQpIHtcclxuICAgIGNvbnN0IHJlcU9iaiA9IHt9O1xyXG4gICAgcmVxT2JqW1widXNlcklkXCJdID0gVXNlcklkO1xyXG4gICAgcmVxT2JqW1wibWVudUlkblwiXSA9XHJcbiAgICAgIGUudGFyZ2V0LmNoZWNrZWQgPT0gdHJ1ZSA/IFtzdWJNZW51SWQsIE1lbnVJZF0gOiBbc3ViTWVudUlkXTtcclxuICAgIHJlcU9ialtcInN0dFwiXSA9IGUudGFyZ2V0LmNoZWNrZWQgPT0gdHJ1ZSA/IFwiMVwiIDogXCIwXCI7XHJcbiAgICByZXFPYmpbXCJmb3JtTm1lXCJdID0gXCJzYXZlVXNlclJpZ2h0TWFzdGVyXCI7XHJcbiAgICB0aGlzLmhlYWRlcltcIm1ldGhvZFwiXSA9IFwic2F2ZVVzZXJSaWdodHNcIjtcclxuICAgIGNvbnNvbGUubG9nKHJlcU9iaik7XHJcbiAgIGNvbnN0IG9wdGlvbnMgPSAoeyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnModGhpcy5oZWFkZXIpIH0pO1xyXG4gICAgdGhpcy5jc1xyXG4gICAgICAuc2F2ZVVzZXJNZW51UmlnaHRzQ29udGFjdChyZXFPYmosIG9wdGlvbnMpXHJcbiAgICAgIC50aGVuKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2cocmVzcG9uc2UpO1xyXG4gICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT0gXCJTVUNDRVNTXCIpIHtcclxuICAgICAgICAgIHRoaXMuZ2V0VXNlclJpZ2h0cyhVc2VySWQsIG1vZHVsZUlkKTtcclxuICAgICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgICAgdGhpcy50b2FzdHIuc3VjY2VzcyhyZXNwb25zZS5tZXNzYWdlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcihyZXNwb25zZS5tZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIC5jYXRjaCgoZXJyOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcihlcnIubWVzc2FnZSk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb25DaGFuZ2VNZW51KGUsIG1lbnVJZCwgVXNlcklkLCBtb2R1bGVJZCkge1xyXG4gICAgdGhpcy5zcGlubmVyU2VydmljZS5zaG93KCk7XHJcbiAgICBsZXQgc3ViTWVudU9iaiA9IHRoaXMubWVudUxpc3QuZmluZChvID0+IG8ubWVudV9pZG4gPT09IG1lbnVJZCk7XHJcbiAgICB0aGlzLnN1Yk1lbnVJZG5zLnB1c2gobWVudUlkKTtcclxuXHJcbiAgICBpZiAoc3ViTWVudU9iai5TdWJNZW51Lmxlbmd0aCA+IDApIHtcclxuICAgICAgc3ViTWVudU9iai5TdWJNZW51LmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgICAgdGhpcy5zdWJNZW51SWRucy5wdXNoKGVsZW1lbnQubWVudV9pZG4pO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGNvbnN0IHJlcU9iaiA9IHt9O1xyXG4gICAgcmVxT2JqW1widXNlcklkXCJdID0gVXNlcklkO1xyXG4gICAgcmVxT2JqW1wibWVudUlkblwiXSA9IHRoaXMuc3ViTWVudUlkbnM7XHJcbiAgICByZXFPYmpbXCJzdHRcIl0gPSBlLnRhcmdldC5jaGVja2VkID09IHRydWUgPyBcIjFcIiA6IFwiMFwiO1xyXG4gICAgcmVxT2JqW1wiZm9ybU5tZVwiXSA9IFwic2F2ZVVzZXJSaWdodE1hc3RlclwiO1xyXG4gICAgdGhpcy5oZWFkZXJbXCJtZXRob2RcIl0gPSBcInNhdmVVc2VyUmlnaHRzXCI7XHJcbiAgICBjb25zb2xlLmxvZyhyZXFPYmopO1xyXG4gICBjb25zdCBvcHRpb25zID0gKHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHRoaXMuaGVhZGVyKSB9KTtcclxuICAgIHRoaXMuY3NcclxuICAgICAgLnNhdmVVc2VyTWVudVJpZ2h0c0NvbnRhY3QocmVxT2JqLCBvcHRpb25zKVxyXG4gICAgICAudGhlbigocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKHJlc3BvbnNlKTtcclxuICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09IFwiU1VDQ0VTU1wiKSB7XHJcbiAgICAgICAgICB0aGlzLmdldFVzZXJSaWdodHMoVXNlcklkLCBtb2R1bGVJZCk7XHJcbiAgICAgICAgICB0aGlzLnN1Yk1lbnVJZG5zID0gW107XHJcbiAgICAgICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgICAgIHRoaXMudG9hc3RyLnN1Y2Nlc3MocmVzcG9uc2UubWVzc2FnZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IocmVzcG9uc2UubWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICAuY2F0Y2goKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoZXJyLm1lc3NhZ2UpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG5cclxuICBvbkNoYW5nZVdlYlN1Yk1lbnUoZSwgc3ViTWVudUlkLCBNZW51SWQsIFVzZXJJZCwgbW9kdWxlSWQpIHtcclxuICAgIGNvbnN0IHJlcU9iaiA9IHt9O1xyXG4gICAgcmVxT2JqW1widXNlcklkXCJdID0gVXNlcklkO1xyXG4gICAgcmVxT2JqW1wibWVudUlkblwiXSA9XHJcbiAgICAgIGUudGFyZ2V0LmNoZWNrZWQgPT0gdHJ1ZSA/IFtzdWJNZW51SWQsIE1lbnVJZF0gOiBbc3ViTWVudUlkXTtcclxuICAgIHJlcU9ialtcInN0dFwiXSA9IGUudGFyZ2V0LmNoZWNrZWQgPT0gdHJ1ZSA/IFwiMFwiIDogXCIxXCI7XHJcbiAgICByZXFPYmpbXCJmb3JtTm1lXCJdID0gXCJzYXZlVXNlclJpZ2h0TWFzdGVyXCI7XHJcbiAgICB0aGlzLmhlYWRlcltcIm1ldGhvZFwiXSA9IFwic2F2ZVVzZXJSaWdodHNcIjtcclxuICAgIGNvbnNvbGUubG9nKHJlcU9iaik7XHJcbiAgIGNvbnN0IG9wdGlvbnMgPSAoeyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnModGhpcy5oZWFkZXIpIH0pO1xyXG4gICAgdGhpcy5jc1xyXG4gICAgICAuc2F2ZVVzZXJNZW51UmlnaHRzQ29udGFjdChyZXFPYmosIG9wdGlvbnMpXHJcbiAgICAgIC50aGVuKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2cocmVzcG9uc2UpO1xyXG4gICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT0gXCJTVUNDRVNTXCIpIHtcclxuICAgICAgICAgIHRoaXMuZ2V0VXNlclJpZ2h0cyhVc2VySWQsIG1vZHVsZUlkKTtcclxuICAgICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgICAgdGhpcy50b2FzdHIuc3VjY2VzcyhyZXNwb25zZS5tZXNzYWdlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcihyZXNwb25zZS5tZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIC5jYXRjaCgoZXJyOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcihlcnIubWVzc2FnZSk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb25DaGFuZ2VXZWJNZW51KGUsIG1lbnVJZCwgVXNlcklkLCBtb2R1bGVJZCkge1xyXG4gICAgdGhpcy5zcGlubmVyU2VydmljZS5zaG93KCk7XHJcbiAgICBsZXQgc3ViTWVudU9iaiA9IHRoaXMubWVudUxpc3QuZmluZChvID0+IG8ubWVudV9pZG4gPT09IG1lbnVJZCk7XHJcbiAgICB0aGlzLnN1Yk1lbnVJZG5zLnB1c2gobWVudUlkKTtcclxuXHJcbiAgICBpZiAoc3ViTWVudU9iai5TdWJNZW51Lmxlbmd0aCA+IDApIHtcclxuICAgICAgc3ViTWVudU9iai5TdWJNZW51LmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgICAgdGhpcy5zdWJNZW51SWRucy5wdXNoKGVsZW1lbnQubWVudV9pZG4pO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGNvbnN0IHJlcU9iaiA9IHt9O1xyXG4gICAgcmVxT2JqW1widXNlcklkXCJdID0gVXNlcklkO1xyXG4gICAgcmVxT2JqW1wibWVudUlkblwiXSA9IHRoaXMuc3ViTWVudUlkbnM7XHJcbiAgICByZXFPYmpbXCJzdHRcIl0gPSBlLnRhcmdldC5jaGVja2VkID09IHRydWUgPyBcIjBcIiA6IFwiMVwiO1xyXG4gICAgcmVxT2JqW1wiZm9ybU5tZVwiXSA9IFwic2F2ZVVzZXJSaWdodE1hc3RlclwiO1xyXG4gICAgdGhpcy5oZWFkZXJbXCJtZXRob2RcIl0gPSBcInNhdmVVc2VyUmlnaHRzXCI7XHJcbiAgICBjb25zb2xlLmxvZyhyZXFPYmopO1xyXG4gICBjb25zdCBvcHRpb25zID0gKHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHRoaXMuaGVhZGVyKSB9KTtcclxuICAgIHRoaXMuY3NcclxuICAgICAgLnNhdmVVc2VyTWVudVJpZ2h0c0NvbnRhY3QocmVxT2JqLCBvcHRpb25zKVxyXG4gICAgICAudGhlbigocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKHJlc3BvbnNlKTtcclxuICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09IFwiU1VDQ0VTU1wiKSB7XHJcbiAgICAgICAgICB0aGlzLmdldFVzZXJSaWdodHMoVXNlcklkLCBtb2R1bGVJZCk7XHJcbiAgICAgICAgICB0aGlzLnN1Yk1lbnVJZG5zID0gW107XHJcbiAgICAgICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgICAgIHRoaXMudG9hc3RyLnN1Y2Nlc3MocmVzcG9uc2UubWVzc2FnZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IocmVzcG9uc2UubWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICAuY2F0Y2goKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoZXJyLm1lc3NhZ2UpO1xyXG4gICAgICB9KTtcclxuICB9XHJcbiAgb25DaGFuZ2VBbGwoZSwgVXNlcklkLCBtb2R1bGVJZCkge1xyXG4gICAgdGhpcy5zcGlubmVyU2VydmljZS5zaG93KCk7XHJcblxyXG4gICAgdGhpcy5tZW51TGlzdC5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICB0aGlzLnN1Yk1lbnVJZG5zLnB1c2goZWxlbWVudC5tZW51X2lkbik7XHJcbiAgICAgIGlmIChlbGVtZW50LlN1Yk1lbnUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGVsZW1lbnQuU3ViTWVudS5mb3JFYWNoKHN1YmVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zdWJNZW51SWRucy5wdXNoKHN1YmVsZW1lbnQubWVudV9pZG4pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCByZXFPYmogPSB7fTtcclxuICAgIHJlcU9ialtcInVzZXJJZFwiXSA9IFVzZXJJZDtcclxuICAgIHJlcU9ialtcIm1lbnVJZG5cIl0gPSB0aGlzLnN1Yk1lbnVJZG5zO1xyXG4gICAgcmVxT2JqW1wic3R0XCJdID0gZS50YXJnZXQuY2hlY2tlZCA9PSB0cnVlID8gXCIxXCIgOiBcIjBcIjtcclxuICAgIHJlcU9ialtcImZvcm1ObWVcIl0gPSBcInNhdmVVc2VyUmlnaHRNYXN0ZXJcIjtcclxuICAgIHRoaXMuaGVhZGVyW1wibWV0aG9kXCJdID0gXCJzYXZlVXNlclJpZ2h0c1wiO1xyXG4gICAgY29uc29sZS5sb2cocmVxT2JqKTtcclxuICAgY29uc3Qgb3B0aW9ucyA9ICh7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh0aGlzLmhlYWRlcikgfSk7XHJcbiAgICB0aGlzLmNzXHJcbiAgICAgIC5zYXZlVXNlck1lbnVSaWdodHNDb250YWN0KHJlcU9iaiwgb3B0aW9ucylcclxuICAgICAgLnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhyZXNwb25zZSk7XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSBcIlNVQ0NFU1NcIikge1xyXG4gICAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgICB0aGlzLmdldFVzZXJSaWdodHMoVXNlcklkLCBtb2R1bGVJZCk7XHJcbiAgICAgICAgICB0aGlzLnN1Yk1lbnVJZG5zID0gW107XHJcbiAgICAgICAgICB0aGlzLnRvYXN0ci5zdWNjZXNzKHJlc3BvbnNlLm1lc3NhZ2UpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgICAgIHRoaXMudG9hc3RyLmVycm9yKHJlc3BvbnNlLm1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgLmNhdGNoKChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgIHRoaXMudG9hc3RyLmVycm9yKGVyci5tZXNzYWdlKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBzYXZlRnVuKGssIHYsIHR5cGUpIHtcclxuICAgIHRoaXMuc3Bpbm5lclNlcnZpY2Uuc2hvdygpO1xyXG4gICAgbGV0IHJlcU9iaiA9IHt9O1xyXG4gICAgbGV0IHN1Yk9iaiA9IHt9O1xyXG4gICAgbGV0IHVybCA9IFwic3lzdGVtL2FwcHBhZ2VzXCI7XHJcbiAgICBpZiAodHlwZSA9PSAnZCcpXHJcbiAgICAgIHYgPSB0aGlzLmNtLkZvcm1hdERhdGUodiwgJ2RkLU1NTS15eXl5Jyk7XHJcbiAgICBzdWJPYmpba10gPSB2O1xyXG4gICAgcmVxT2JqW1wiZm9ybU5tZVwiXSA9IHRoaXMuYWRkRnJtTm1lO1xyXG4gICAgcmVxT2JqW1wiZGF0YVRybnNEdGxcIl0gPSBzdWJPYmo7XHJcbiAgICBpZiAodGhpcy5hZGRGcm1ObWUgPT0gJ2FkZHRpb25hbER0bE1hc3RlcicpIHtcclxuICAgICAgcmVxT2JqW1wibm1lSWRuXCJdID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5wYXJhbU1hcC5nZXQoXCJzdWJ2XCIpOyAvL3RoaXMud2hyVjtcclxuICAgICAgdGhpcy5oZWFkZXJbXCJtZXRob2RcIl0gPSBcInNhdmVObWVBdHRyXCI7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5hZGRGcm1ObWUgPT0gJ2xlZGdlckFjY0FkZGl0aW5hbERldGFpbHMnKSB7XHJcbiAgICAgIHJlcU9ialtcImxlZGdlcl9pZG5cIl0gPSB0aGlzLnJvdXRlLnNuYXBzaG90LnBhcmFtTWFwLmdldChcInN1YnZcIik7IC8vdGhpcy53aHJWO1xyXG4gICAgICByZXFPYmpbXCJ0eXBlXCJdID0gXCJhY2NfYXR0clwiO1xyXG4gICAgICB0aGlzLmhlYWRlcltcIm1ldGhvZFwiXSA9IFwic2F2ZUxlZGdlckF0dHJcIjtcclxuICAgICAgdXJsID0gXCJhY2NvdW50cy9hY2NMZWRnZXJcIjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmFkZEZybU5tZSA9PSAnbGVkZ2VyQWRkdGlvbmFsRHRsTWFzdGVyJykge1xyXG4gICAgICByZXFPYmpbXCJsZWRnZXJfaWRuXCJdID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5wYXJhbU1hcC5nZXQoXCJzdWJ2XCIpOyAvL3RoaXMud2hyVjtcclxuICAgICAgcmVxT2JqW1widHlwZVwiXSA9IFwiYXR0clwiO1xyXG4gICAgICB0aGlzLmhlYWRlcltcIm1ldGhvZFwiXSA9IFwic2F2ZUxlZGdlckF0dHJcIjtcclxuICAgICAgdXJsID0gXCJhY2NvdW50cy9hY2NMZWRnZXJcIjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmFkZEZybU5tZSA9PSAnYWNjRGVsZXRlUnVsZXNGb3JtJykge1xyXG4gICAgICByZXFPYmpbXCJqb3VybmFsX2lkblwiXSA9IHRoaXMucm91dGUuc25hcHNob3QucGFyYW1NYXAuZ2V0KFwic3VidlwiKTsgLy90aGlzLndoclY7XHJcbiAgICAgIHJlcU9ialtcInR5cGVcIl0gPSBcImRlbGV0ZV9ydWxlc1wiO1xyXG4gICAgICB0aGlzLmhlYWRlcltcIm1ldGhvZFwiXSA9IFwic2F2ZUpvdXJuYWxBdHRyXCI7XHJcbiAgICAgIHVybCA9IFwiYWNjb3VudHMvYWNjTGVkZ2VyXCI7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5hZGRGcm1ObWUgPT0gJ2FjY0pvdXJuYWxBdHRyRm9ybScpIHtcclxuICAgICAgcmVxT2JqW1wiam91cm5hbF9pZG5cIl0gPSB0aGlzLnJvdXRlLnNuYXBzaG90LnBhcmFtTWFwLmdldChcInN1YnZcIik7IC8vdGhpcy53aHJWO1xyXG4gICAgICByZXFPYmpbXCJ0eXBlXCJdID0gXCJhdHRyXCI7XHJcbiAgICAgIHRoaXMuaGVhZGVyW1wibWV0aG9kXCJdID0gXCJzYXZlSm91cm5hbEF0dHJcIjtcclxuICAgICAgdXJsID0gXCJhY2NvdW50cy9hY2NMZWRnZXJcIjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmFkZEZybU5tZSA9PSAnYWNjTG9hbkF0dHJGb3JtJykge1xyXG4gICAgICByZXFPYmpbXCJqb3VybmFsX2lkblwiXSA9IHRoaXMucm91dGUuc25hcHNob3QucGFyYW1NYXAuZ2V0KFwic3VidlwiKTsgLy90aGlzLndoclY7XHJcbiAgICAgIHJlcU9ialtcInR5cGVcIl0gPSBcImF0dHJcIjtcclxuICAgICAgdGhpcy5oZWFkZXJbXCJtZXRob2RcIl0gPSBcInNhdmVKb3VybmFsQXR0clwiO1xyXG4gICAgICB1cmwgPSBcImFjY291bnRzL2FjY0xlZGdlclwiO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuYWRkRnJtTm1lID09ICdhY2NKb3VybmFsU2V0dGluZ0Zvcm0nKSB7XHJcbiAgICAgIHJlcU9ialtcImpvdXJuYWxfaWRuXCJdID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5wYXJhbU1hcC5nZXQoXCJzdWJ2XCIpOyAvL3RoaXMud2hyVjtcclxuICAgICAgcmVxT2JqW1widHlwZVwiXSA9IFwic2V0dGluZ3NcIjtcclxuICAgICAgdGhpcy5oZWFkZXJbXCJtZXRob2RcIl0gPSBcInNhdmVKb3VybmFsQXR0clwiO1xyXG4gICAgICB1cmwgPSBcImFjY291bnRzL2FjY0xlZGdlclwiO1xyXG4gICAgfVxyXG4gICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkocmVxT2JqKSk7XHJcbiAgICBsZXQgb3B0aW9ucyA9ICh7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh0aGlzLmhlYWRlcikgfSk7XHJcblxyXG4gICAgdGhpcy5jc1xyXG4gICAgICAubG9hZChyZXFPYmosIG9wdGlvbnMsIHVybClcclxuICAgICAgLnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuXHJcbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSBcIlNVQ0NFU1NcIikge1xyXG4gICAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0ci5zdWNjZXNzKHJlc3BvbnNlLm1lc3NhZ2UpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgICAgIHRoaXMudG9hc3RyLmVycm9yKHJlc3BvbnNlLm1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgLmNhdGNoKChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgIHRoaXMudG9hc3RyLmVycm9yKGVyci5tZXNzYWdlKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwYWdlRGlzcGxheTtcclxuICAvLyBBREQgUEFHRSBESVNQTEFZIEFUVFJJQlVURVxyXG4gIGFkZEF0dHIodiwgYSwgZGYpIHtcclxuICAgIGlmICh2ID09IHVuZGVmaW5lZCkgcmV0dXJuO1xyXG4gICAgdGhpcy5hZGRUZXh0KHYsIGEsIGRmKTtcclxuICB9XHJcblxyXG4gIGFkZFRleHQodiwgYSwgZGYpIHtcclxuICAgIGlmIChkZi5pbmRleE9mKHYpICE9IC0xKSB7XHJcbiAgICAgIHRoaXMudG9hc3RyLmVycm9yKFwiQWxyZWFkeSBBZGRlZFwiKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy50b2FzdHIuc3VjY2VzcyhcIkFkZGVkXCIpO1xyXG4gICAgICBkZi5wdXNoKHYpO1xyXG4gICAgICAvLyBhLnNwbGljZShpLCAxKTtcclxuICAgICAgdGhpcy5zb3J0YWJsZUNvbXBvbmVudC53cml0ZVZhbHVlKGRmKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlbW92ZShkZiwgaXQsIGksIGZmKSB7XHJcbiAgICBpZiAoZGYuaW5kZXhPZihpdCkgIT0gLTEpIHtcclxuICAgICAgZGYuc3BsaWNlKGksIDEpO1xyXG4gICAgICB0aGlzLnNxbEFycmF5W2ZmXS51bnNoaWZ0KHsgdjogaXQgfSk7XHJcbiAgICAgIHRoaXMuc29ydGFibGVDb21wb25lbnQud3JpdGVWYWx1ZShkZik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzaG93SElkZVBhc3MoKSB7XHJcbiAgICB0aGlzLmVzdHN0ID0gIXRoaXMuZXN0c3Q7XHJcbiAgICBpZiAodGhpcy5lc3RzdCkge1xyXG4gICAgICB0aGlzLmV2ZUMgPSBcImZhLWV5ZVwiO1xyXG4gICAgICB0aGlzLmlucHV0dHlwZSA9IFwidGV4dFwiO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5ldmVDID0gXCJmYS1leWUtc2xhc2hcIjtcclxuICAgICAgdGhpcy5pbnB1dHR5cGUgPSBcInBhc3N3b3JkXCI7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJlZGllY3R0b2t5YygpIHtcclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnY29udGFjdC9wZW5kaW5nLWt5Yy9wZW5kaW5nS3ljRm9ybSddKTtcclxuICB9XHJcblxyXG5cclxuXHJcbiAgZm9ybWF0RGF0ZVNDTW9udGhCZWZvcmUoZGF0ZSwgYXR0cikge1xyXG4gICAgaWYgKGRhdGUgIT0gdW5kZWZpbmVkICYmIGRhdGUgIT0gXCJcIikge1xyXG5cclxuICAgICAgbGV0IGQgPSBuZXcgRGF0ZShkYXRlKSxcclxuICAgICAgICBtb250aCA9ICcnICsgKGQuZ2V0TW9udGgoKSksXHJcbiAgICAgICAgZGF5ID0gJycgKyBkLmdldERhdGUoKSxcclxuICAgICAgICB5ZWFyID0gZC5nZXRGdWxsWWVhcigpO1xyXG4gICAgICBkLnNldERhdGUoZC5nZXREYXRlKCkgLSAzMCk7XHJcblxyXG4gICAgICBpZiAobW9udGgubGVuZ3RoIDwgMikgbW9udGggPSAnMCcgKyBtb250aDtcclxuICAgICAgaWYgKGRheS5sZW5ndGggPCAyKSBkYXkgPSAnMCcgKyBkYXk7XHJcblxyXG4gICAgICBsZXQgbmV3RGF0ZSA9IFt5ZWFyLCBtb250aCwgZGF5XS5qb2luKCctJyk7XHJcblxyXG4gICAgICB0aGlzLmRhdGFEdGxbYXR0cl0gPSBuZXdEYXRlO1xyXG4gICAgfVxyXG4gIH1cclxuICByZXNldCA9IHYgPT4gdi5mb3JtLnJlc2V0KCk7XHJcbiAgY2xvc2VOdWxsID0gKCkgPT4gKHRoaXMudGJDZWxsID0gbnVsbCk7XHJcbiAgcGFnZUJjayA9ICgpID0+IHdpbmRvdy5oaXN0b3J5LmJhY2soKTtcclxuICBjVXJsO1xyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5zZWxlY3RlZFBlb3BsZTMgPSBbXHJcbiAgICAgIHsgazogXCIyMDRcIiwgdjogXCJuaWxhbVwiIH0sXHJcbiAgICAgIHsgazogXCI0NzgxXCIsIHY6IFwibmlsYW13ZWJcIiB9XHJcbiAgICBdO1xyXG4gICAgbGV0IG1kbGsgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwibWRsS2V5XCIpKTtcclxuICAgIGxldCBtZGxLZXkgPSBPYmplY3Qua2V5cyhtZGxrKTtcclxuICAgIGRlYnVnZ2VyXHJcbiAgICB0aGlzLmNVcmwgPSB0aGlzLnJvdXRlci51cmw7XHJcbiAgICB0aGlzLmhlYWRlciA9IHtcclxuICAgICAgY2xpZW50a2V5OiBDb29raWUuZ2V0KFwiX2NrXCIpLFxyXG4gICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgbW9kdWxla2V5OiBtZGxrW3RoaXMuY1VybC5zcGxpdCgnLycpWzFdXSxcclxuICAgICAgbG9naW5pZDogQ29va2llLmdldChcIl9sb2dpZFwiKSxcclxuICAgICAgc291cmNlOiBcInFzXCJcclxuICAgIH07XHJcbiAgICBsZXQgY29tcGFueUR0bCA9IEpTT04ucGFyc2UoQ29va2llLmdldCgnX2FjY0NvbXBhbnknKSkgfHwge307XHJcbiAgICBsZXQgeWVhckR0bCA9IEpTT04ucGFyc2UoQ29va2llLmdldCgnX2FjY3llYXInKSkgfHwge307XHJcbiAgICBsZXQgc3ViX2NvX2lkbiA9IChjb21wYW55RHRsW1wic3ViX2NvX2lkblwiXSB8fCAnJykudG9TdHJpbmcoKTtcclxuICAgIGxldCBmaW5feWVhcl9pZG4gPSAoeWVhckR0bFtcImZpbl95ZWFyX2lkblwiXSB8fCAnJykudG9TdHJpbmcoKTtcclxuICAgIGlmIChzdWJfY29faWRuICE9ICcnKSB7XHJcbiAgICAgIHRoaXMuaGVhZGVyWydzdWJjb21pZG4nXSA9IHN1Yl9jb19pZG47XHJcbiAgICAgIHRoaXMuaGVhZGVyWyd5ZWFyaWRuJ10gPSBmaW5feWVhcl9pZG47XHJcbiAgICB9XHJcbiAgICB0aGlzLnJvdXRlLnBhcmFtcy5zdWJzY3JpYmUoKHBhcmFtczogUGFyYW1zKSA9PiB7XHJcbiAgICAgIHRoaXMuc3ViRnJtV2sgPSBudWxsO1xyXG4gICAgICB0aGlzLnNlYXJjaEYgPSBudWxsO1xyXG4gICAgICBkZWJ1Z2dlclxyXG4gICAgICB0aGlzLm5hdmZvcm0gPSBwYXJhbXNbXCJpdG1mb3JtXCJdO1xyXG4gICAgICB0aGlzLnBhcmFPYmpbXCJmb3JtTm1lXCJdID0gcGFyYW1zW1wiaXRtZm9ybVwiXTtcclxuICAgICAgdGhpcy5wYXJhT2JqW1wid2hlcmVLZXlzXCJdID0gcGFyYW1zW1wic3Via1wiXTtcclxuICAgICAgdGhpcy5wYXJhT2JqW1wid2hlcmVWbHVzXCJdID0gcGFyYW1zW1wic3VidlwiXTtcclxuICAgICAgaWYgKHBhcmFtc1tcIml0bWZvcm1cIl0gPT0gJ2FjY0RlbGV0ZVJ1bGVzRm9ybScpIHtcclxuICAgICAgICB0aGlzLmFkZEZybU5tZSA9IHBhcmFtc1tcIml0bWZvcm1cIl07XHJcbiAgICAgICAgbGV0IG1kbCA9IFsnZGVsZXRlX3J1bGUnXTtcclxuICAgICAgICB0aGlzLmdldEpvdXJuYWxBdHRyKHRoaXMuYWRkRnJtTm1lLCBtZGwsICdkZWxldGVfcnVsZXMnKTtcclxuICAgICAgfSBlbHNlIGlmIChwYXJhbXNbXCJpdG1mb3JtXCJdID09ICdhY2NKb3VybmFsQXR0ckZvcm0nKSB7XHJcbiAgICAgICAgdGhpcy5hZGRGcm1ObWUgPSBwYXJhbXNbXCJpdG1mb3JtXCJdO1xyXG4gICAgICAgIGxldCBtZGwgPSBbJ2pubGFjY19hdHRyJ107XHJcbiAgICAgICAgdGhpcy5nZXRKb3VybmFsQXR0cih0aGlzLmFkZEZybU5tZSwgbWRsLCAnYXR0cicpO1xyXG4gICAgICB9IGVsc2UgaWYgKHBhcmFtc1tcIml0bWZvcm1cIl0gPT0gJ2FjY0xvYW5BdHRyRm9ybScpIHtcclxuICAgICAgICB0aGlzLmFkZEZybU5tZSA9IHBhcmFtc1tcIml0bWZvcm1cIl07XHJcbiAgICAgICAgbGV0IG1kbCA9IFsnbG9hbiddO1xyXG4gICAgICAgIHRoaXMuZ2V0Sm91cm5hbEF0dHIodGhpcy5hZGRGcm1ObWUsIG1kbCwgJ2F0dHInKTtcclxuICAgICAgfSBlbHNlIGlmIChwYXJhbXNbXCJpdG1mb3JtXCJdID09IFwiYWNjSm91cm5hbFNldHRpbmdGb3JtXCIpIHtcclxuICAgICAgICB0aGlzLmFkZEZybU5tZSA9IHBhcmFtc1tcIml0bWZvcm1cIl07XHJcbiAgICAgICAgbGV0IG1kbCA9IFsnam5sX3NldHQnXTtcclxuICAgICAgICB0aGlzLmdldEpvdXJuYWxBdHRyKHRoaXMuYWRkRnJtTm1lLCBtZGwsICdzZXR0aW5ncycpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZ2V0UGFnZURlZmluYXRpb24oKTtcclxuICAgICAgICB0aGlzLmNMaW5rID0gMDtcclxuICAgICAgICB0aGlzLnAgPSAxO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cIm10XCI+XHJcbiAgPGRpdiBjbGFzcz1cInBhbmVsIHBhbmVsLWRlZmF1bHRcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1oZWFkaW5nXCI+XHJcbiAgICAgIDxoMyBjbGFzcz1cInBhbmVsLXRpdGxlXCI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1jaGV2cm9uLWxlZnQgY3BcIiAoY2xpY2spPVwicGFnZUJjaygpO1wiPiBCYWNrPC9zcGFuPiZuYnNwOyZuYnNwOyZuYnNwOyB7e3BhZ2VJbmZvPy50aXRsZX19XHJcbiAgICAgICAgPHNwYW4gKm5nSWY9XCJjb250YWN0TmFtZT09JydcIiBjbGFzcz1cImYtMTJcIj4oe3tjRHQgfCBkYXRlOidtZWRpdW0nfX0pPC9zcGFuPlxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwiY29udGFjdE5hbWUhPScnXCIgY2xhc3M9XCJmLTEyXCI+Jm5ic3A7Zm9yIDxiPiB7e2NvbnRhY3ROYW1lfX08L2I+IDwvc3Bhbj5cclxuICAgICAgPC9oMz5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWQ9XCJhZGRCdG5cIiBjbGFzcz1cImJ0biBidG4taW5mbyBwdWxsLXJpZ2h0XCIgKm5nSWY9XCJhZGROZXc/LmlzX2NvbXB1bHNvcnkgPT0gMVwiXHJcbiAgICAgICAgYXBwQXBwTm9EYmxDbGljayAoY2xpY2spPVwidXNlckFjdGlvbignJywgJ2FkZCcsICcnLCAnJyk7Zi5yZXNldCgpO1wiPnt7YWRkTmV3Py5mb3JtX2ZpZWxkX3RpdGxlfX08L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMlwiICpuZ0lmPVwibmF2aWdhdGlvbi5sZW5ndGggPiAwXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbCBwYW5lbC1kZWZhdWx0XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWJvZHlcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXN0LWdyb3VwIGJvcmRlci1ib3R0b21cIj5cclxuICAgICAgICAgICAgPGEgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKVwiIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtXCIgW25nQ2xhc3NdPVwieydhY3RpdmUnIDppID09IGNMaW5rfVwiXHJcbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IG5hdiBvZiBuYXZpZ2F0aW9uO2xldCBpPWluZGV4XCIgKGNsaWNrKT1cIm5hdmlnYXRpb25GdW4obmF2LGkpO1wiPnt7bmF2LmZvcm1fZmllbGRfdGl0bGV9fTwvYT5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBbbmdDbGFzc109XCJuYXZpZ2F0aW9uLmxlbmd0aCA+IDAgPyAnY29sLW1kLTEwJyA6ICdjb2wtbWQtMTInXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbCBwYW5lbC1kZWZhdWx0XCI+XHJcbiAgICAgICAgPCEtLSBwcmltZXJ5IGZvcm0gLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWJvZHlcIiBzdHlsZT1cIm92ZXJmbG93LXg6IHNjcm9sbFwiXHJcbiAgICAgICAgICAqbmdJZj1cIm5hdmZvcm0gIT0gJ2FkZHRpb25hbER0bE1hc3RlcicgJiYgbmF2Zm9ybSAhPSAnZG9jdW1lbnRVcGxvYWRNYXN0ZXInICAmJiBuYXZmb3JtICE9ICdtZW51QWNjZXNzTWFzdGVyJyAgJiYgbmF2Zm9ybSAhPSAndGVybVVzZXJBc3NpZ25Gb3JtJyAmJiBuYXZmb3JtICE9ICdzZXRQYXNzd29yZEZvcm0nICYmIG5hdmZvcm0hPSdsZWRnZXJCYW5rRGV0YWlscycgJiYgbmF2Zm9ybSE9J2xlZGdlckFjY0FkZGl0aW5hbERldGFpbHMnICYmIG5hdmZvcm0hPSdsZWRnZXJBZGR0aW9uYWxEdGxNYXN0ZXInICYmIG5hdmZvcm0hPSdhY2NEZWxldGVSdWxlc0Zvcm0nICYmIG5hdmZvcm0hPSdhY2NKb3VybmFsQXR0ckZvcm0nICYmIG5hdmZvcm0hPSdhY2NMb2FuQXR0ckZvcm0nICYmIG5hdmZvcm0hPSdhY2NKb3VybmFsU2V0dGluZ0Zvcm0nICYmIG5hdmZvcm0hPSd3ZWJNZW51QWNjZXNzTWFzdGVyJyBcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS02XCI+XHJcbiAgICAgICAgICAgICAgPGZvcm0gY2xhc3M9XCJmb3JtLWlubGluZSBwdWxsLWxlZnRcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJkZGxQYWdlc2l6ZVwiPlBhZ2UgU2l6ZSAmbmJzcDsgJm5ic3A7PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tY29udHJvbFwiIG5hbWU9XCJwYWdlU2l6ZVwiIFsobmdNb2RlbCldPVwicGFnZVNpemVcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25QYWdlU2l6ZUNoYW5nZShwYWdlU2l6ZSlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiQWxsXCI+QWxsPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjEwXCI+MTA8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiMjVcIj4yNTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCI1MFwiPjUwPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjEwMFwiPjEwMDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZm9ybT5cclxuICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCIgc3R5bGU9XCJwYWRkaW5nOiA0cHggMTVweCA0cHggMjBweDttYXJnaW4tbGVmdDogMTBweDtcIlxyXG4gICAgICAgICAgICAgICAgZGF0YS10b2dnbGU9XCJ0b29sdGlwXCIgZGF0YS1wbGFjZW1lbnQ9XCJyaWdodFwiIHRpdGxlPVwiUmVmcmVzaFwiIChjbGljayk9XCJuZ09uSW5pdCgpO1wiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1yZWZyZXNoXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS02XCI+XHJcbiAgICAgICAgICAgICAgPGZvcm0gY2xhc3M9XCJmb3JtLWlubGluZSBwdWxsLXJpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZXhhbXBsZUlucHV0TmFtZTJcIj5TZWFyY2ggJm5ic3A7Jm5ic3A7PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImV4YW1wbGVJbnB1dE5hbWUyXCIgbmFtZT1cInNjaHR4dFwiIFsobmdNb2RlbCldPVwic2VhcmNoRlwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Zvcm0+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiIFtuZ0NsYXNzXT1cInsndGFibGUtcmVzcG9uc2l2ZScgOm5hdmlnYXRpb24ubGVuZ3RoID4gMH1cIj5cclxuICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgdGFibGUtYm9yZGVyZWQgdGFibGUtaG92ZXIgdGFibGUtaG92ZXItY2VsbHNcIj5cclxuICAgICAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgIDx0aD5TUiBObzwvdGg+XHJcbiAgICAgICAgICAgICAgICAgIDx0aD5BY3Rpb248L3RoPlxyXG4gICAgICAgICAgICAgICAgICA8dGggKm5nRm9yPVwibGV0IHRiaCBvZiB0YmxIOyBsZXQgaSA9IGluZGV4XCIgKGNsaWNrKT1cInNldE9yZGVyKHRiaCxpKVwiPnt7dGJsRGVzY1t0YmhdfX1cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBbaGlkZGVuXT1cInJldmVyc2VcIiAqbmdJZj1cInNob3dhcnIgPT09IGlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYXJyb3ctZG93blwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2hpZGRlbl09XCIhcmV2ZXJzZVwiICpuZ0lmPVwic2hvd2FyciA9PT0gaVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1hcnJvdy11cFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICAgICAgPHRib2R5PlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgZGF0YSBvZiBkYXRhbGlzdCB8IHNlYXJjaFBpcGU6c2VhcmNoRiB8IG9yZGVyQnk6IG9yZGVyOnJldmVyc2UgfCBwYWdpbmF0ZTogeyBpdGVtc1BlclBhZ2U6IHBhZ2VTaXplLCBjdXJyZW50UGFnZTogcCB9OyBsZXQgaSA9IGluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgIDx0ciBbbmdDbGFzc109XCJ7J0luYWN0aXZlJzpkYXRhLnN0dD09J0luQWN0aXZlJ31cIj5cclxuICAgICAgICAgICAgICAgICAgICA8dGQ+e3tpICsgMX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgZGF0YS10b2dnbGU9XCJkcm9wZG93blwiIGNsYXNzPVwiYnRuIGJ0bi1pbmZvIGRyb3Bkb3duLXRvZ2dsZVwiPkFjdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2FyZXRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwiZHJvcGRvd24tbWVudVwiIHJvbGU9XCJtZW51XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpICpuZ0Zvcj1cImxldCBhY3Rpb24gb2YgYWN0aW9uc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKVwiIChjbGljayk9XCJ1c2VyQWN0aW9uKGRhdGEsYWN0aW9uLmZvcm1fZmllbGQsYWN0aW9uLCBpKTtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3thY3Rpb24uZm9ybV9maWVsZF90aXRsZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0Zvcj1cImxldCB0Ymggb2YgdGJsSDsgbGV0IGk9aW5kZXhcIiBvbi1tb3VzZW92ZXI9XCJob3ZlcmVkST1pXCIgb24tbW91c2VsZWF2ZT1cImhvdmVyZWRJPS0xXCJcclxuICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwibWF4LXdpZHRoOiAzMDBweDsgd29yZC1icmVhazogYnJlYWstd29yZDtcIj57e2RhdGFbdGJoXX19XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib25Ib3ZlckRpdlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaT09aG92ZXJlZEkgJiYgcGFnZV90eXAhPSdqc29uRm9ybScgJiYgbmF2Zm9ybSE9J2J1eWVydGVybXNNYXN0ZXInXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx1bD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgKGNsaWNrKT1cImVkaXRDZWxsKGRhdGEsdGJoKTtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtcGVuY2lsXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPHBhZ2luYXRpb24tY29udHJvbHMgKHBhZ2VDaGFuZ2UpPVwicCA9ICRldmVudFwiIGNsYXNzPVwicHVsbC1yaWdodFwiPjwvcGFnaW5hdGlvbi1jb250cm9scz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8IS0tIGN1c3RvbSBmb3JtIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1ib2R5XCJcclxuICAgICAgICAgICpuZ0lmPVwibmF2Zm9ybSA9PSAnYWRkdGlvbmFsRHRsTWFzdGVyJyB8fCBuYXZmb3JtID09ICdsZWRnZXJBZGR0aW9uYWxEdGxNYXN0ZXInIHx8IG5hdmZvcm0gPT0gJ2xlZGdlckFjY0FkZGl0aW5hbERldGFpbHMnIHx8IG5hdmZvcm09PSdhY2NEZWxldGVSdWxlc0Zvcm0nIHx8IG5hdmZvcm09PSdhY2NKb3VybmFsQXR0ckZvcm0nIHx8IG5hdmZvcm09PSdhY2NMb2FuQXR0ckZvcm0nIHx8IG5hdmZvcm09PSdhY2NKb3VybmFsU2V0dGluZ0Zvcm0nXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIiAqbmdGb3I9XCJsZXQgdWdsZCBvZiB1aUdycExpc3RcIj5cclxuICAgICAgICAgICAgICA8cCBjbGFzcz1cImhlYWRpbmdDbHNcIj57e3VpR3JwTGlzdER0bFt1Z2xkXX19PC9wPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiICpuZ0Zvcj1cImxldCBmb3JtRiBvZiB1aUdycExpc3REdGxbdWdsZCsnI1QnXTtsZXQgaSA9IGluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiIHN0eWxlPVwibWFyZ2luLWJvdHRvbTogNDVweCAhaW1wb3J0YW50O1wiPlxyXG4gICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtbWQtNCBjb250cm9sLWxhYmVsXCI+e3t1aUdycExpc3REdGxbdWdsZCsnI0QnXVtpXX19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC04XCIgKm5nSWY9XCJmb3JtRiA9PSAnbidcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBuYW1lPVwie3t1aUdycExpc3REdGxbdWdsZCsnI1YnXVtpXX19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImRhdGFEdGxbdWlHcnBMaXN0RHRsW3VnbGQrJyNWJ11baV1dXCIgWyhuZ01vZGVsKV09XCJkYXRhRHRsW3VpR3JwTGlzdER0bFt1Z2xkKycjViddW2ldXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwic2F2ZUZ1bih1aUdycExpc3REdGxbdWdsZCsnI1YnXVtpXSxkYXRhRHRsW3VpR3JwTGlzdER0bFt1Z2xkKycjViddW2ldXSxmb3JtRilcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwidWlHcnBMaXN0RHRsW3VnbGQrJyNFJ11baV0gPT0gMCA/IGZhbHNlIDogdHJ1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC04XCIgKm5nSWY9XCJmb3JtRiA9PSAndCdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgbmFtZT1cInt7dWlHcnBMaXN0RHRsW3VnbGQrJyNWJ11baV19fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJkYXRhRHRsW3VpR3JwTGlzdER0bFt1Z2xkKycjViddW2ldXVwiIFsobmdNb2RlbCldPVwiZGF0YUR0bFt1aUdycExpc3REdGxbdWdsZCsnI1YnXVtpXV1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNhdmVGdW4odWlHcnBMaXN0RHRsW3VnbGQrJyNWJ11baV0sZGF0YUR0bFt1aUdycExpc3REdGxbdWdsZCsnI1YnXVtpXV0sZm9ybUYpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInVpR3JwTGlzdER0bFt1Z2xkKycjRSddW2ldID09IDAgPyBmYWxzZSA6IHRydWVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDwhLS0gYWRkZWQgZm9yIHRlc3Rpbmcgb25seSAtLT5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC04XCIgKm5nSWY9XCJmb3JtRiA9PSAnYydcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIG5hbWU9XCJ7e3VpR3JwTGlzdER0bFt1Z2xkKycjViddW2ldfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImRhdGFEdGxbdWlHcnBMaXN0RHRsW3VnbGQrJyNWJ11baV1dXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJzYXZlRnVuKHVpR3JwTGlzdER0bFt1Z2xkKycjViddW2ldLGRhdGFEdGxbdWlHcnBMaXN0RHRsW3VnbGQrJyNWJ11baV1dLGZvcm1GKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBrZXkgb2YgYXR0ckNMaXN0RHRsW3VpR3JwTGlzdER0bFt1Z2xkKycjViddW2ldICsnI0QnXTtsZXQgaj1pbmRleFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9XCJ7e2F0dHJDTGlzdER0bFt1aUdycExpc3REdGxbdWdsZCsnI1YnXVtpXSArJyNWJ11bal19fVwiPnt7a2V5fX08L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPCEtLSA8cCAqbmdGb3I9XCJsZXQgYSBvZiBhdHRyQ0xpc3REdGxbdWlHcnBMaXN0RHRsW3VnbGQrJyNWJ11baV0gKycjViddXCI+e3thIHxqc29ufX06XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7YXR0ckNMaXN0RHRsW3VpR3JwTGlzdER0bFt1Z2xkKycjViddW2ldICsnI1YnXSB8anNvbn19XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3A+IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPCEtLSA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIG5hbWU9XCJ7e3VpR3JwTGlzdER0bFt1Z2xkKycjViddW2ldfX1cIiBbdmFsdWVdPVwiZGF0YUR0bFt1aUdycExpc3REdGxbdWdsZCsnI1YnXVtpXV1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImRhdGFEdGxbdWlHcnBMaXN0RHRsW3VnbGQrJyNWJ11baV1dXCIgKGJsdXIpPVwic2F2ZUZ1bih1aUdycExpc3REdGxbdWdsZCsnI1YnXVtpXSxkYXRhRHRsW3VpR3JwTGlzdER0bFt1Z2xkKycjViddW2ldXSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwidWlHcnBMaXN0RHRsW3VnbGQrJyNFJ11baV0gPT0gMCA/IGZhbHNlIDogdHJ1ZVwiPiAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtOFwiICpuZ0lmPVwiZm9ybUYgPT0gJ3EnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIHctMTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBuYW1lPVwie3t1aUdycExpc3REdGxbdWdsZCsnI1YnXVtpXX19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJkYXRhRHRsW3VpR3JwTGlzdER0bFt1Z2xkKycjViddW2ldXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwic2F2ZUZ1bih1aUdycExpc3REdGxbdWdsZCsnI1YnXVtpXSxkYXRhRHRsW3VpR3JwTGlzdER0bFt1Z2xkKycjViddW2ldXSxmb3JtRilcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQga2V5IG9mIGF0dHJRTGlzdER0bFt1aUdycExpc3REdGxbdWdsZCsnI1YnXVtpXSArJyNEJ107bGV0IGo9aW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPVwie3thdHRyUUxpc3REdGxbdWlHcnBMaXN0RHRsW3VnbGQrJyNWJ11baV0gKycjRCddW2pdfX1cIj57e2tleX19PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPHAgKm5nRm9yPVwibGV0IGEgb2YgYXR0ckNMaXN0RHRsW3VpR3JwTGlzdER0bFt1Z2xkKycjViddW2ldICsnI1YnXVwiPnt7YSB8anNvbn19OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7e2F0dHJDTGlzdER0bFt1aUdycExpc3REdGxbdWdsZCsnI1YnXVtpXSArJyNWJ10gfGpzb259fVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9wPiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBuYW1lPVwie3t1aUdycExpc3REdGxbdWdsZCsnI1YnXVtpXX19XCIgW3ZhbHVlXT1cImRhdGFEdGxbdWlHcnBMaXN0RHRsW3VnbGQrJyNWJ11baV1dXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJkYXRhRHRsW3VpR3JwTGlzdER0bFt1Z2xkKycjViddW2ldXVwiIChibHVyKT1cInNhdmVGdW4odWlHcnBMaXN0RHRsW3VnbGQrJyNWJ11baV0sZGF0YUR0bFt1aUdycExpc3REdGxbdWdsZCsnI1YnXVtpXV0pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInVpR3JwTGlzdER0bFt1Z2xkKycjRSddW2ldID09IDAgPyBmYWxzZSA6IHRydWVcIj4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC04XCIgKm5nSWY9XCJmb3JtRiA9PSAnc2EnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIHctMTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctc2VsZWN0IHN0eWxlPVwiei1pbmRleDogNTtcIiBbb3B0aW9uc109XCJzcWxBcnJheVt1aUdycExpc3REdGxbdWdsZCsnI1YnXVtpXV1cIiAjc2ZpPVwibmdNb2RlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZGF0YUR0bFt1aUdycExpc3REdGxbdWdsZCsnI1YnXVtpXV1cIiBuYW1lPVwie3t1aUdycExpc3REdGxbdWdsZCsnI1YnXVtpXX19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkKT1cInNhdmVGdW4odWlHcnBMaXN0RHRsW3VnbGQrJyNWJ11baV0sZGF0YUR0bFt1aUdycExpc3REdGxbdWdsZCsnI1YnXVtpXV0sZm9ybUYpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGZpbHRlcklucHV0Q2hhbmdlZCk9XCJsb2FkSm5sU3VnZ2RhdGEoJGV2ZW50LHVpR3JwTGlzdER0bFt1Z2xkKycjViddW2ldLHVpR3JwTGlzdER0bFt1Z2xkKycjTSddW2ldKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1zZWxlY3Q+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtOFwiICpuZ0lmPVwiZm9ybUYgPT0gJ2QnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIHctMTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImRhdGVcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIG5hbWU9XCJ7e3VpR3JwTGlzdER0bFt1Z2xkKycjViddW2ldfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNhdmVGdW4odWlHcnBMaXN0RHRsW3VnbGQrJyNWJ11baV0sZGF0YUR0bFt1aUdycExpc3REdGxbdWdsZCsnI1YnXVtpXV0sZm9ybUYpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImRhdGFEdGxbdWlHcnBMaXN0RHRsW3VnbGQrJyNWJ11baV1dXCIgWyhuZ01vZGVsKV09XCJkYXRhRHRsW3VpR3JwTGlzdER0bFt1Z2xkKycjViddW2ldXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ1aUdycExpc3REdGxbdWdsZCsnI0UnXVtpXSA9PSAwID8gZmFsc2UgOiB0cnVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLThcIiAqbmdJZj1cImZvcm1GID09ICdlJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCB3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJlbWFpbFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgbmFtZT1cInt7dWlHcnBMaXN0RHRsW3VnbGQrJyNWJ11baV19fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwic2F2ZUZ1bih1aUdycExpc3REdGxbdWdsZCsnI1YnXVtpXSxkYXRhRHRsW3VpR3JwTGlzdER0bFt1Z2xkKycjViddW2ldXSxmb3JtRilcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZGF0YUR0bFt1aUdycExpc3REdGxbdWdsZCsnI1YnXVtpXV1cIiBbKG5nTW9kZWwpXT1cImRhdGFEdGxbdWlHcnBMaXN0RHRsW3VnbGQrJyNWJ11baV1dXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGJsdXIpPVwic2F2ZUZ1bih1aUdycExpc3REdGxbdWdsZCsnI1YnXVtpXSxkYXRhRHRsW3VpR3JwTGlzdER0bFt1Z2xkKycjViddW2ldXSxmb3JtRilcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwidWlHcnBMaXN0RHRsW3VnbGQrJyNFJ11baV0gPT0gMCA/IGZhbHNlIDogdHJ1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1ib2R5IGZvcm1cIlxyXG4gICAgICAgICAgKm5nSWY9XCJuYXZmb3JtID09ICdkb2N1bWVudFVwbG9hZE1hc3RlcicgICYmIG5hdmZvcm0gIT0gJ21lbnVBY2Nlc3NNYXN0ZXInICAmJiBuYXZmb3JtICE9ICd0ZXJtVXNlckFzc2lnbkZvcm0nICYmIG5hdmZvcm0gIT0gJ3NldFBhc3N3b3JkRm9ybSdcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgPGZvcm0gYWN0aW9uPVwiI1wiIGNsYXNzPVwiZm9ybS1ob3Jpem9udGFsIGZvcm0tYm9yZGVyZWRcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ib2R5XCI+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzZWxlY3QgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIG5hbWU9XCJkb2N0eXBlXCIgWyhuZ01vZGVsKV09XCJkb2N0eXBlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgZG9jcyBvZiBkb2N1bWVudFVwbG9hZExpc3RcIiB2YWx1ZT1cInt7ZG9jc319XCI+e3tkb2N1bWVudFVwbG9hZER0bFtkb2NzXX19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTRcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpbGVpbnB1dCBmaWxlaW5wdXQtbmV3XCIgZGF0YS1wcm92aWRlcz1cImZpbGVpbnB1dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnRuIGdyZWVuIGJ0bi1maWxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj4gVXBsb2FkIDwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImZpbGVcIiBuYW1lPVwiLi4uXCIgKGNoYW5nZSk9XCJ1cGxvYWREb2NzKCRldmVudClcIj4gPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmlsZWlucHV0LWZpbGVuYW1lXCI+IDwvc3Bhbj4gJm5ic3A7XHJcbiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cImphdmFzY3JpcHQ6O1wiIGNsYXNzPVwiY2xvc2UgZmlsZWlucHV0LWV4aXN0c1wiIGRhdGEtZGlzbWlzcz1cImZpbGVpbnB1dFwiPiA8L2E+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8YSAqbmdJZj1cInJvdXRoZXJEb2MhPScnXCIgc3R5bGU9XCJjdXJzb3I6cG9pbnRlciBcIiAoY2xpY2spPVwicmVkaWVjdHRva3ljKClcIj48Yj5cclxuICAgICAgICAgICAgICAgICAgICAgIDw8IGJhY2s8L2I+PC9hPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZm9ybT5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICAgICAgPHAgY2xhc3M9XCJoZWFkaW5nQ2xzXCI+RXhpc3RpbmcgRG9jdW1lbnRzPC9wPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInN1YkRpc3BsYXlUYWJsZVwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZG9jcyBvZiBkb2N1bWVudFVwbG9hZExpc3Q7bGV0IGkgPSBpbmRleCBcIj5cclxuICAgICAgICAgICAgICAgICAgPHRyICpuZ0lmPVwiZGF0YUR0bFtkb2NzXSE9dW5kZWZpbmVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDEwJVwiPnt7ZG9jdW1lbnRVcGxvYWREdGxbZG9jc119fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDkwJTt0ZXh0LWFsaWduOiBsZWZ0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBkb2NkdGwgb2YgZGF0YUR0bFtkb2NzXVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsZWlucHV0IGZpbGVpbnB1dC1uZXdcIiAqbmdJZj1cImRvY2VkaXRBY3Rpb25cIiBkYXRhLXByb3ZpZGVzPVwiZmlsZWlucHV0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJidG4tZmlsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1lZGl0XCIgdG9vbHRpcD1cIkVkaXQgRG9jdW1lbnRcIiBzdHlsZT1cImZvbnQtc2l6ZToyMHB4XCI+IDwvaT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImZpbGVcIiBuYW1lPVwiLi4uXCIgKGNoYW5nZSk9XCJFZGl0VXBsb2FkRG9jcyhkb2NkdGwsJGV2ZW50KVwiPiA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWxlaW5wdXQtZmlsZW5hbWVcIj4gPC9zcGFuPiAmbmJzcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiamF2YXNjcmlwdDo7XCIgY2xhc3M9XCJjbG9zZSBmaWxlaW5wdXQtZXhpc3RzXCIgZGF0YS1kaXNtaXNzPVwiZmlsZWlucHV0XCI+IDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDsmbmJzcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgPGE+PGkgY2xhc3M9XCJmYSBmYS10cmFzaC1vXCIgKm5nSWY9XCJkb2NkZWxldGVBY3Rpb25cIiAoY2xpY2spPVwiQ29uZmlybWRlbGV0ZURvYyhkb2NkdGwpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiZm9udC1zaXplOjIwcHg7Y3Vyc29yOiBwb2ludGVyXCI+IDwvaT4gPC9hPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YSAoY2xpY2spPVwib3BlbmRvY3MoZG9jZHRsKVwiPiA8aSBjbGFzcz1cImZhIGZhLWZpbGUtb1wiIHN0eWxlPVwiZm9udC1zaXplOjIwcHhcIj4gPC9pPiA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwOyZuYnNwO3wmbmJzcDsmbmJzcDtcclxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG5cclxuXHJcblxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1ib2R5XCJcclxuICAgICAgICAgICpuZ0lmPVwibmF2Zm9ybSAhPSAnZG9jdW1lbnRVcGxvYWRNYXN0ZXInICYmIG5hdmZvcm0gPT0gJ21lbnVBY2Nlc3NNYXN0ZXInICAmJiBuYXZmb3JtICE9ICd0ZXJtVXNlckFzc2lnbkZvcm0nICYmIG5hdmZvcm0gIT0gJ3NldFBhc3N3b3JkRm9ybScgXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMlwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb250cm9sLWxhYmVsXCIgc3R5bGU9XCJwYWRkaW5nLWxlZnQ6IDJweDtcIj5BcHBsaWNhdGlvbjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgWyhuZ01vZGVsKV09XCJhcHBsaWNhdGlvblwiIG5hbWU9XCJVc2VyXCIgKGNoYW5nZSk9XCJsb2FkVXNyTWRsKGFwcGxpY2F0aW9uKVwiPlxyXG4gICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBhcHAgb2YgYXBwbGljYXRpb25MaXN0XCIgdmFsdWU9XCJ7e2FwcC5rfX1cIj57e2FwcC52fX08L29wdGlvbj5cclxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0yXCIgKm5nSWY9XCJ1c2VyRHRscy5sZW5ndGg+MFwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb250cm9sLWxhYmVsXCIgc3R5bGU9XCJwYWRkaW5nLWxlZnQ6IDJweDtcIj5Vc2VyPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cIlVzZXJcIiBuYW1lPVwiVXNlclwiPlxyXG4gICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBsb3Ygb2YgdXNlckR0bHNcIiB2YWx1ZT1cInt7bG92LnVzZXJfaWRufX1cIj57e2xvdi51c2VybmFtZX19PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMlwiICpuZ0lmPVwibW9kdWxlRHRscy5sZW5ndGg+MCAmJiB1c2VyRHRscy5sZW5ndGggPjAgXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIiBzdHlsZT1cInBhZGRpbmctbGVmdDogMnB4O1wiPk1vZHVsZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgWyhuZ01vZGVsKV09XCJNb2R1bGVcIiBuYW1lPVwiTW9kdWxlXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGxvdiBvZiBtb2R1bGVEdGxzXCIgdmFsdWU9XCJ7e2xvdi5tb2R1bGVfaWRufX1cIj57e2xvdi5wcmludH19PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMiBcIj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBpZD1cImFkZEJ0blwiIGNsYXNzPVwiYnRuIGJ0bi1pbmZvXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAyM3B4O1wiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZ2V0VXNlclJpZ2h0cyhVc2VyLE1vZHVsZSlcIj5Bc3NpZ25cclxuICAgICAgICAgICAgICAgIFJpZ2h0c1xyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDAgMTBweDtcIiAqbmdJZj1cIm1lbnVMaXN0Lmxlbmd0aD4wXCI+XHJcbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJib3JkZXI6MXB4IHNvbGlkICNlNWU1ZTU7bWFyZ2luLXRvcDogMzBweFwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbCBwYW5lbC1kZWZhdWx0XCIgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAyNXB4O1wiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtaGVhZGluZ1wiIHN0eWxlPVwicGFkZGluZzogMHB4O1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cInBhbmVsLXRpdGxlXCIgc3R5bGU9XCJwYWRkaW5nOiA4cHg7IGZvbnQtc2l6ZTogMTRweDtcIj5Vc2VyczwvaDM+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0yIGNoa0FsbFwiIHN0eWxlPVwibWFyZ2luOiAwcHg7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiIHN0eWxlPVwicGFkZGluZzogMTBweDtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwic3dpdGNoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJzd2l0Y2hcIiBuYW1lPVwiY2hrQWxsXCIgaWQ9XCJjaGtBbGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uQ2hhbmdlQWxsKCRldmVudCxVc2VyLE1vZHVsZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCIoZmFsc2UgIT09ICh1c2VyUmlnaHRzTWVudUxpc3QubGVuZ3RoID09IChtZW51TGlzdC5sZW5ndGggKyB0b3RNZW51KSkgPyAnY2hlY2tlZCcgOiAnJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLW1kLTQgY29udHJvbC1sYWJlbCB0ZXh0LWxlZnRcIiBzdHlsZT1cInBhZGRpbmctdG9wOiA4cHg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZy1sZWZ0OiA0MHB4O1wiPkFsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgPGZvcm0gY2xhc3M9XCJmb3JtLWhvcml6b250YWxcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiICpuZ0Zvcj1cImxldCBtZGwgb2YgbWVudUxpc3Q7bGV0IGk9aW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInN3aXRjaFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cInN3aXRjaFwiIG5hbWU9XCJjaGtNZW51XCIgaWQ9XCJjaGtNZW51e3ttZGwubWVudV9pZG59fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uQ2hhbmdlTWVudSgkZXZlbnQsbWRsLm1lbnVfaWRuLFVzZXIsTW9kdWxlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCIoZmFsc2UgIT09IHVzZXJSaWdodHNNZW51TGlzdC5pbmNsdWRlcyhtZGw/Lm1lbnVfaWRuKSA/ICdjaGVja2VkJyA6ICcnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLW1kLTIgY29udHJvbC1sYWJlbCB0ZXh0LWxlZnRcIiBzdHlsZT1cInBhZGRpbmctdG9wOiAzcHg7XCI+e3ttZGwubWVudX19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCIgKm5nSWY9XCJtZGwuU3ViTWVudS5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiICpuZ0Zvcj1cImxldCBzbWRsIG9mIG1kbC5TdWJNZW51XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMVwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6MTBweDtwYWRkaW5nLWxlZnQ6IDYwcHg7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwic3dpdGNoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJzd2l0Y2hcIiBuYW1lPVwiY2hrU3ViTWVudVwiIGlkPVwiY2hrU3ViTWVudXt7c21kbC5tZW51X2lkbn19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkNoYW5nZVN1Yk1lbnUoJGV2ZW50LHNtZGwubWVudV9pZG4sbWRsLm1lbnVfaWRuLFVzZXIsTW9kdWxlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cIiggZmFsc2UgIT09IHVzZXJSaWdodHNNZW51TGlzdC5pbmNsdWRlcyhzbWRsPy5tZW51X2lkbikgPyAnY2hlY2tlZCcgOiAnJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLW1kLTQgY29udHJvbC1sYWJlbCB0ZXh0LWxlZnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwicGFkZGluZy10b3A6IDhweDsgZm9udC13ZWlnaHQ6IDEwMDtwYWRkaW5nLWxlZnQ6IDQwcHg7XCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7e3tzbWRsLmhkcn19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZm9ybT5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWJvZHlcIiAqbmdJZj1cIm5hdmZvcm0gPT0gJ3dlYk1lbnVBY2Nlc3NNYXN0ZXInXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMlwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb250cm9sLWxhYmVsXCIgc3R5bGU9XCJwYWRkaW5nLWxlZnQ6IDJweDtcIj5BcHBsaWNhdGlvbjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgWyhuZ01vZGVsKV09XCJhcHBsaWNhdGlvblwiIG5hbWU9XCJVc2VyXCIgKGNoYW5nZSk9XCJsb2FkVXNyTWRsKGFwcGxpY2F0aW9uKVwiPlxyXG4gICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBhcHAgb2YgYXBwbGljYXRpb25MaXN0XCIgdmFsdWU9XCJ7e2FwcC5rfX1cIj57e2FwcC52fX08L29wdGlvbj5cclxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0yXCIgKm5nSWY9XCJ1c2VyRHRscy5sZW5ndGg+MFwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb250cm9sLWxhYmVsXCIgc3R5bGU9XCJwYWRkaW5nLWxlZnQ6IDJweDtcIj5Vc2VyPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cIlVzZXJcIiBuYW1lPVwiVXNlclwiPlxyXG4gICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBsb3Ygb2YgdXNlckR0bHNcIiB2YWx1ZT1cInt7bG92LnVzZXJfaWRufX1cIj57e2xvdi51c2VybmFtZX19PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMlwiICpuZ0lmPVwibW9kdWxlRHRscy5sZW5ndGg+MCAmJiB1c2VyRHRscy5sZW5ndGggPjAgXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIiBzdHlsZT1cInBhZGRpbmctbGVmdDogMnB4O1wiPk1vZHVsZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgWyhuZ01vZGVsKV09XCJNb2R1bGVcIiBuYW1lPVwiTW9kdWxlXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGxvdiBvZiBtb2R1bGVEdGxzXCIgdmFsdWU9XCJ7e2xvdi5tb2R1bGVfaWRufX1cIj57e2xvdi5wcmludH19PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMiBcIj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBpZD1cImFkZEJ0blwiIGNsYXNzPVwiYnRuIGJ0bi1pbmZvXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAyM3B4O1wiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZ2V0VXNlclJpZ2h0cyhVc2VyLE1vZHVsZSlcIj5Bc3NpZ25cclxuICAgICAgICAgICAgICAgIFJpZ2h0c1xyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDAgMTBweDtcIiAqbmdJZj1cIm1lbnVMaXN0Lmxlbmd0aD4wXCI+XHJcbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJib3JkZXI6MXB4IHNvbGlkICNlNWU1ZTU7bWFyZ2luLXRvcDogMzBweFwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbCBwYW5lbC1kZWZhdWx0XCIgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAyNXB4O1wiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtaGVhZGluZ1wiIHN0eWxlPVwicGFkZGluZzogMHB4O1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cInBhbmVsLXRpdGxlXCIgc3R5bGU9XCJwYWRkaW5nOiA4cHg7IGZvbnQtc2l6ZTogMTRweDtcIj5Vc2VyczwvaDM+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0yIGNoa0FsbFwiIHN0eWxlPVwibWFyZ2luOiAwcHg7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiIHN0eWxlPVwicGFkZGluZzogMTBweDtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwic3dpdGNoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJzd2l0Y2hcIiBuYW1lPVwiY2hrQWxsXCIgaWQ9XCJjaGtBbGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uQ2hhbmdlQWxsKCRldmVudCxVc2VyLE1vZHVsZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCIoZmFsc2UgIT09ICh1c2VyUmlnaHRzTWVudUxpc3QubGVuZ3RoID09IChtZW51TGlzdC5sZW5ndGggKyB0b3RNZW51KSkgPyAnY2hlY2tlZCcgOiAnJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLW1kLTQgY29udHJvbC1sYWJlbCB0ZXh0LWxlZnRcIiBzdHlsZT1cInBhZGRpbmctdG9wOiA4cHg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZy1sZWZ0OiA0MHB4O1wiPkFsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgPGZvcm0gY2xhc3M9XCJmb3JtLWhvcml6b250YWxcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiICpuZ0Zvcj1cImxldCBtZGwgb2YgbWVudUxpc3Q7bGV0IGk9aW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInN3aXRjaFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cInN3aXRjaFwiIG5hbWU9XCJjaGtNZW51XCIgaWQ9XCJjaGtNZW51e3ttZGwubWVudV9pZG59fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uQ2hhbmdlV2ViTWVudSgkZXZlbnQsbWRsLm1lbnVfaWRuLFVzZXIsTW9kdWxlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCIoZmFsc2UgPT0gdXNlclJpZ2h0c01lbnVMaXN0LmluY2x1ZGVzKG1kbD8ubWVudV9pZG4pID8gJ2NoZWNrZWQnIDogJycpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtbWQtMiBjb250cm9sLWxhYmVsIHRleHQtbGVmdFwiIHN0eWxlPVwicGFkZGluZy10b3A6IDNweDtcIj57e21kbC5tZW51fX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIiAqbmdJZj1cIm1kbC5TdWJNZW51Lmxlbmd0aCA+IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCIgKm5nRm9yPVwibGV0IHNtZGwgb2YgbWRsLlN1Yk1lbnVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xXCIgc3R5bGU9XCJtYXJnaW4tbGVmdDoxMHB4O3BhZGRpbmctbGVmdDogNjBweDtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJzd2l0Y2hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cInN3aXRjaFwiIG5hbWU9XCJjaGtTdWJNZW51XCIgaWQ9XCJjaGtTdWJNZW51e3tzbWRsLm1lbnVfaWRufX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uQ2hhbmdlV2ViU3ViTWVudSgkZXZlbnQsc21kbC5tZW51X2lkbixtZGwubWVudV9pZG4sVXNlcixNb2R1bGUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiKCBmYWxzZSA9PSB1c2VyUmlnaHRzTWVudUxpc3QuaW5jbHVkZXMoc21kbD8ubWVudV9pZG4pID8gJ2NoZWNrZWQnIDogJycpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1tZC00IGNvbnRyb2wtbGFiZWwgdGV4dC1sZWZ0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cInBhZGRpbmctdG9wOiA4cHg7IGZvbnQtd2VpZ2h0OiAxMDA7cGFkZGluZy1sZWZ0OiA0MHB4O1wiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3t7c21kbC5oZHJ9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Zvcm0+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWJvZHlcIiBzdHlsZT1cImJhY2tncm91bmQ6ICNmZmY7bWluLWhlaWdodDogNTUwcHg7XCJcclxuICAgICAgICAgICpuZ0lmPVwibmF2Zm9ybSAhPSAnYWRkdGlvbmFsRHRsTWFzdGVyJyAmJiAgbmF2Zm9ybSAhPSAnZG9jdW1lbnRVcGxvYWRNYXN0ZXInICYmIG5hdmZvcm0gIT0gJ21lbnVBY2Nlc3NNYXN0ZXInICYmIG5hdmZvcm0gPT0gJ3Rlcm1Vc2VyQXNzaWduRm9ybScgJiYgbmF2Zm9ybSAhPSAnc2V0UGFzc3dvcmRGb3JtJyAgXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAxMHB4O1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTJcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29udHJvbC1sYWJlbFwiPlRlcm1zPC9sYWJlbD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMVwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6IDg1cHg7XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIj5Vc2VyczwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB0ZXJtIG9mIHRlcm1zTGlzdDsgbGV0IGk9aW5kZXg7XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTNcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwie3t0ZXJtLmJ1eWVyX3Rlcm1zX2lkbn19XCIgY2xhc3M9XCJjb250cm9sLWxhYmVsXCJcclxuICAgICAgICAgICAgICAgICAgICBzdHlsZT1cInBhZGRpbmc6IDEwcHg7XCI+e3t0ZXJtLmRzY319PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtM1wiICpuZ0lmPVwidGVybS51c2VySWRuTGlzdCAhPSB1bmRlZmluZWRcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHctMTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCB3LTEwMFwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIDxuZy1zZWxlY3QgW2l0ZW1zXT1cImFwcGxVc2VyTGlzdFwiIFttdWx0aXBsZV09XCJ0cnVlXCIgW2FkZFRhZ109XCJhZGRUYWdcIiAoY2hhbmdlKT1cIm9uY2hhbmVWYWxzKG51bGwsdGVybS5idXllcl90ZXJtc19pZG4sdGVybS51c2VySWRuTGlzdClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgYmluZExhYmVsPVwidlwiIGJpbmRWYWx1ZT1cImtcIiBuYW1lPVwie3t0ZXJtID8uYnV5ZXJfdGVybXNfaWRufX1cIiBbKG5nTW9kZWwpXT1cInRlcm0udXNlcklkbkxpc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXNlbGVjdD4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXNlbGVjdCBwbGFjZWhvbGRlcj1cIlNlbGVjdCB1c2VyXCIgW29wdGlvbnNdPVwidGVybS5UZXJtVXNlckxpc3RcIiBbKG5nTW9kZWwpXT1cInRlcm0udXNlcklkbkxpc3RcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGRlc2VsZWN0ZWQpPVwib25jaGFuZ2VVc2VyTGlzdCgkZXZlbnQsdGVybSwnZGVsZXRlJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkKT1cIm9uY2hhbmdlVXNlckxpc3QoJGV2ZW50LHRlcm0sJ2FkZCcpXCIgbmFtZT1cInN0YXR1c1wiIFttdWx0aXBsZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFthbGxvd0NsZWFyXT1cInRydWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjb3B0aW9uVGVtcGxhdGUgbGV0LW9wdGlvbj1cIm9wdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmFtZmFtZmFtLWZsYWdzIHt7b3B0aW9uPy52YWx1ZX19XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7b3B0aW9uPy5sYWJlbH19XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPjwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtYm9keVwiIHN0eWxlPVwiYmFja2dyb3VuZDogI2ZmZjttaW4taGVpZ2h0OiA1NTBweDtcIlxyXG4gICAgICAgICAgKm5nSWY9XCJuYXZmb3JtICE9ICdhZGR0aW9uYWxEdGxNYXN0ZXInICYmICBuYXZmb3JtICE9ICdkb2N1bWVudFVwbG9hZE1hc3RlcicgJiYgbmF2Zm9ybSAhPSAnbWVudUFjY2Vzc01hc3RlcicgJiYgbmF2Zm9ybSAhPSAndGVybVVzZXJBc3NpZ25Gb3JtJyAmJiBuYXZmb3JtID09ICdzZXRQYXNzd29yZEZvcm0nIFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiIHN0eWxlPVwibWFyZ2luLXRvcDogMTBweDtcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICAgIDxwIGNsYXNzPVwiaGVhZGluZ0Nsc1wiPkNoYW5nZSBVc2VyIFBhc3N3b3JkPC9wPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0yXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIiBzdHlsZT1cInBhZGRpbmc6IDhweDtcIj5Vc2VybmFtZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTFcIiBzdHlsZT1cIm1hcmdpbi1sZWZ0OiA4NXB4O1wiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb250cm9sLWxhYmVsXCIgc3R5bGU9XCJwYWRkaW5nOiA4cHg7XCI+UGFzc3dvcmQ8L2xhYmVsPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdXNlciBvZiB1c2VyRGV0YWlsczsgbGV0IGk9aW5kZXg7XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTNcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIiBzdHlsZT1cInBhZGRpbmc6IDEwcHg7Zm9udC13ZWlnaHQ6IG5vcm1hbDtcIj57e3VzZXI/LnVzZXJuYW1lfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCB3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiICBbKG5nTW9kZWwpXT1cInVzZXIucGFzc3dvcmRcIiBbdmFsdWVdPVwidXNlcj8ucGFzc3dvcmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICA8IS0tIChibHVyKT1cImNoYW5nZVBzd2QoJGV2ZW50LHVzZXIudXNlcklkbilcIiAtLT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtM1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgY2xhc3M9XCJidG4gYnRuLXN1Y2Nlc3NcIiAoY2xpY2spPVwiY2hhbmdlUGFzc3dvcmQodXNlcilcIj5zYXZlPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwhLS0gPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgY2xhc3M9XCJidG4gYnRuLXN1Y2Nlc3NcIiAoY2xpY2spPVwic2F2ZUFwcFVzZXJ0ZXJtcyhhcHBsVXNyTHN0KVwiPnNhdmU8L2J1dHRvbj4gLS0+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWJvZHlcIiBzdHlsZT1cImJhY2tncm91bmQ6ICNmZmY7bWluLWhlaWdodDogNTUwcHg7XCIgKm5nSWY9XCJuYXZmb3JtPT0nbGVkZ2VyQmFua0RldGFpbHMnXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIiBzdHlsZT1cIm1hcmdpbjo1cHhcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCB3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLW1kLTIgY29udHJvbC1sYWJlbFwiPkJhbms8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1zZWxlY3QgcGxhY2Vob2xkZXI9XCJTZWxlY3QgQmFua1wiIFtvcHRpb25zXT1cImJhbmtMaXN0XCIgWyhuZ01vZGVsKV09XCJiYW5rXCIgbmFtZT1cImJhbmtcIlxyXG4gICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZCk9XCJnZXRCYW5rQnJhbmNoKGJhbmspXCIgKGZpbHRlcklucHV0Q2hhbmdlZCk9XCJsZWRnZXJCYW5rRGV0YWlscygkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICBbYWxsb3dDbGVhcl09XCJ0cnVlXCI+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCIgc3R5bGU9XCJtYXJnaW46NXB4XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1tZC0yIGNvbnRyb2wtbGFiZWxcIj5CcmFuY2ggRGV0YWlsczwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTRcIj5cclxuICAgICAgICAgICAgICAgICAgPHNlbGVjdCBuYW1lPVwiYnJhbmNoXCIgKGNoYW5nZSk9XCJzZWxlY3RCcmFuY2goYnJhbmNoKVwiIFsobmdNb2RlbCldPVwiYnJhbmNoXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIj5cclxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+U2VsZWN0IGJyYW5jaDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGJua0R0bCBvZiBiYW5rRHRsTGlzdFwiIFtuZ1ZhbHVlXT1cImJua0R0bC5ubWVfaWRuXCI+e3tibmtEdGwucGVyc29uX25tZX19PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCIgKm5nSWY9XCJzZWxlY3RCcmFuY2hBZGRyZXNzIT0nJ1wiIHN0eWxlPVwibWFyZ2luOjVweFwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHctMTAwXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtbWQtMiBjb250cm9sLWxhYmVsXCI+Jm5ic3A7PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTNcIj5BZGRyZXNzOjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTlcIj57e3NlbGVjdEJyYW5jaEFkZHJlc3N9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTNcIj5JRlNDIENvZGU6PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtOVwiPnt7c2VsZWN0SWZzY319PC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCIgc3R5bGU9XCJtYXJnaW46NXB4XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1tZC0yIGNvbnRyb2wtbGFiZWxcIj5BY2NvdW50IFR5cGU8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzZWxlY3QgbmFtZT1cImFjY291bnRUeXBlXCIgWyhuZ01vZGVsKV09XCJhY2NvdW50VHlwZVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImN1cnJlbnRcIj5DdXJyZW50PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInNhdmluZ3NcIj5TYXZpbmdzPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCIgc3R5bGU9XCJtYXJnaW46NXB4XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1tZC0yIGNvbnRyb2wtbGFiZWxcIj5BY2NvdW50IE5vPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPlxyXG4gICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBjb2xzPVwiNDVcIiByb3dzPVwiMlwiIG5hbWU9XCJhY2NvdW50bm9cIiBbKG5nTW9kZWwpXT1cImFjY291bnRub1wiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIiBzdHlsZT1cIm1hcmdpbjo1cHhcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCB3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0yXCI+Jm5ic3A7PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTRcIj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKm5nSWY9XCJlZGl0YmFua19kdGxfaWRuPT0nJ1wiIChjbGljayk9XCJTYXZlTGVkZ2VyQmFuaygpXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tc3VjY2Vzc1wiPkFkZDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAqbmdJZj1cImVkaXRiYW5rX2R0bF9pZG4hPScnXCIgKGNsaWNrKT1cIlNhdmVMZWRnZXJCYW5rKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1zdWNjZXNzXCI+RWRpdDwvYnV0dG9uPlxyXG5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiICpuZ0lmPVwiZXhpdEJhbmtEdGxMaXN0Lmxlbmd0aD4wXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMSBwdWxsLWxlZnRcIj5cclxuICAgICAgICAgICAgICAmbmJzcDtcclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNiBwdWxsLXJpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgPGZvcm0gY2xhc3M9XCJmb3JtLWlubGluZSBwdWxsLXJpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZXhhbXBsZUlucHV0TmFtZTJcIj5TZWFyY2ggJm5ic3A7Jm5ic3A7PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImV4YW1wbGVJbnB1dE5hbWUyXCIgbmFtZT1cInNlYXJjaEZcIiBbKG5nTW9kZWwpXT1cInNlYXJjaEZcIiAvPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9mb3JtPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiICpuZ0lmPVwiZXhpdEJhbmtEdGxMaXN0Lmxlbmd0aD4wXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJkaXNwbGF5VGFibGVcIj5cclxuICAgICAgICAgICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgICAgICAgICAgPHRoPkFjdGlvbnM8L3RoPlxyXG4gICAgICAgICAgICAgICAgICA8dGg+QWNjb3VudCBUeXBlPC90aD5cclxuICAgICAgICAgICAgICAgICAgPHRoPkFjY291bnQgTm88L3RoPlxyXG4gICAgICAgICAgICAgICAgICA8dGg+TmFtZTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgIDx0aD5CcmFuY2g8L3RoPlxyXG4gICAgICAgICAgICAgICAgICA8dGg+QWRkcmVzczwvdGg+XHJcbiAgICAgICAgICAgICAgICAgIDx0aD5JRlNDIENvZGU8L3RoPlxyXG4gICAgICAgICAgICAgICAgPC90aGVhZD5cclxuICAgICAgICAgICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYmFua2R0bCBvZiBleGl0QmFua0R0bExpc3QgOyBsZXQgaSA9IGluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRyIFtuZ0NsYXNzXT1cInsnZXZlbic6aSUyPT0wLCdvZGQnOmklMj09MX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0ZD4gPGkgY2xhc3M9XCJmYSBmYS1lZGl0XCIgKGNsaWNrKT1cImxvYWRFZGl0QmFua0R0bChiYW5rZHRsKVwiIHRvb2x0aXA9XCJFZGl0IEJhbmtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiZm9udC1zaXplOjE1cHg7Y3Vyc29yOiBwb2ludGVyXCI+IDwvaT4mbmJzcDt8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtdHJhc2gtb1wiIChjbGljayk9XCJDb25maXJtRGVsZXRlTGVkZ2VyQmFuayhiYW5rZHRsKVwiIHRvb2x0aXA9XCJEZWxldGUgQmFua1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6MTVweDtjdXJzb3I6IHBvaW50ZXJcIj4gPC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRkPnt7YmFua2R0bC5hY2NvdW50VHlwZX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e2JhbmtkdGwuYWNjb3VudE5vfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRkPnt7YmFua2R0bC5iYW5rbmFtZX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e2JhbmtkdGwuYnJhbmNobmFtZX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e2JhbmtkdGwuYWRkcmVzc319PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e2JhbmtkdGwuaWZzY319PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbFwiIGlkPVwiZGF0YW1vZGFsXCIgcm9sZT1cImRpYWxvZ1wiIGFyaWEtbGFiZWxsZWRieT1cImRlZk1vZGFsSGVhZFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXHJcbiAgICAgIGRhdGEtYmFja2Ryb3A9XCJzdGF0aWNcIiBkYXRhLWtleWJvYXJkPVwiZmFsc2VcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZ1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XHJcbiAgICAgICAgICA8Zm9ybSBjbGFzcz1cImZvcm0taG9yaXpvbnRhbFwiICNmPVwibmdGb3JtXCIgbmFtZT1cImFwcEZvcm1cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2xvc2VcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiIChjbGljayk9XCJjbG9zZU51bGwoKTtcIiAjY2xvc2VidG4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4mdGltZXM7PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzci1vbmx5XCI+Q2xvc2U8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPGg0IGNsYXNzPVwibW9kYWwtdGl0bGVcIiBpZD1cImRlZk1vZGFsSGVhZFwiPnt7YnRuTmFtZX19IFJlY29yZDwvaDQ+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIiAqbmdGb3I9XCJsZXQgZmwgb2YgZm9ybUZpbGRzIHwgb3JkZXJCeVBpcGU6ICdzcnQnOiAnYXNjJ1wiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJmbD8uZm9ybV9maWVsZF90eXAgPT0gJ3QnICYmIGZsPy5pc19oaWRkZW4gPT0gMCAmJiBmbD8uZHRhX3R5cCA9PSdjJyB8fCBmbD8uZHRhX3R5cCA9PSd0J1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1tZC0zIGNvbnRyb2wtbGFiZWxcIj57e2ZsPy5mb3JtX2ZpZWxkX3RpdGxlfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cImZsLmlzX2NvbXB1bHNvcnkgPT0gMVwiPio8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCB3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbCBwb3NyZWxcIiBuYW1lPVwie3tmbD8uZm9ybV9maWVsZH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZmw/LmRlZmF1bHRfdmFsdWVcIiBbKG5nTW9kZWwpXT1cImZsLmRlZmF1bHRfdmFsdWVcIiAjdGV4dElucHV0PVwibmdNb2RlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGJsdXIpPVwiY2hrRnVuKGZsLGZsLmRlZmF1bHRfdmFsdWUpO1wiIFtyZXF1aXJlZF09XCJmbD8uaXNfY29tcHVsc29yeSA9PSAnMSdcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLXt7aWNvfX0gZXllXCIgW25nU3R5bGVdPVwieydjb2xvcic6aWNvID09ICdjaGVjaycgPyAnZ3JlZW4nIDogJ3JlZCcgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJ1c3Jpc0V4aXN0ICYmIG9uRXJyID09IGZsLmZvcm1fZmllbGQgXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidGV4dElucHV0LmludmFsaWQgJiYgKHRleHRJbnB1dC5kaXJ0eSB8fCB0ZXh0SW5wdXQudG91Y2hlZClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFsZXJ0IGFsZXJ0LWRhbmdlciBjYVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidGV4dElucHV0LmVycm9ycy5yZXF1aXJlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7ZmwuZm9ybV9maWVsZF90aXRsZX19IGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCIgKm5nSWY9XCJmbD8uZm9ybV9maWVsZF90eXAgPT0gJ3QnICYmIGZsPy5pc19oaWRkZW4gPT0gMCAmJiBmbD8uZHRhX3R5cCA9PSduJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1tZC0zIGNvbnRyb2wtbGFiZWxcIj57e2ZsPy5mb3JtX2ZpZWxkX3RpdGxlfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cImZsLmlzX2NvbXB1bHNvcnkgPT0gMVwiPio8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCB3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgbmFtZT1cInt7Zmw/LmZvcm1fZmllbGR9fVwiIFt2YWx1ZV09XCJmbD8uZGVmYXVsdF92YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmbC5kZWZhdWx0X3ZhbHVlXCIgI251bWJlcklucHV0PVwibmdNb2RlbFwiIFtyZXF1aXJlZF09XCJmbD8uaXNfY29tcHVsc29yeT09MVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwibnVtYmVySW5wdXQuaW52YWxpZCAmJiAobnVtYmVySW5wdXQuZGlydHkgfHwgbnVtYmVySW5wdXQudG91Y2hlZClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFsZXJ0IGFsZXJ0LWRhbmdlciBjYVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwibnVtYmVySW5wdXQuZXJyb3JzLnJlcXVpcmVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3tmbC5mb3JtX2ZpZWxkX3RpdGxlfX0gaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwibnVtYmVySW5wdXQuaW52YWxpZCAmJiAobnVtYmVySW5wdXQuZGlydHkgfHwgbnVtYmVySW5wdXQudG91Y2hlZClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWxlcnQgYWxlcnQtZGFuZ2VyIGNhXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIm51bWJlcklucHV0LmVycm9ycy5yZXF1aXJlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tmbC5mb3JtX2ZpZWxkX3RpdGxlfX0gaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJmbD8uZm9ybV9maWVsZF90eXAgPT0gJ3B3JyAmJiBmbD8uaXNfaGlkZGVuID09IDAgJiYgZmw/LmR0YV90eXAgPT0ncHcnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLW1kLTMgY29udHJvbC1sYWJlbFwiPnt7Zmw/LmZvcm1fZmllbGRfdGl0bGV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwiZmwuaXNfY29tcHVsc29yeSA9PSAxXCI+Kjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtOVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIHctMTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwie3tpbnB1dHR5cGV9fVwiIGNsYXNzPVwiZm9ybS1jb250cm9sIHBvc3JlbFwiIG5hbWU9XCJ7e2ZsPy5mb3JtX2ZpZWxkfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJmbD8uZGVmYXVsdF92YWx1ZVwiIFsobmdNb2RlbCldPVwiZmwuZGVmYXVsdF92YWx1ZVwiICNwYXNzSW5wdXQ9XCJuZ01vZGVsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwiZmw/LmlzX2NvbXB1bHNvcnkgPT0gJzEnXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSB7e2V2ZUN9fSBleWVcIiAoY2xpY2spPVwic2hvd0hJZGVQYXNzKCk7XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicGFzc0lucHV0LmludmFsaWQgJiYgKHBhc3NJbnB1dC5kaXJ0eSB8fCBwYXNzSW5wdXQudG91Y2hlZClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFsZXJ0IGFsZXJ0LWRhbmdlciBjYVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicGFzc0lucHV0LmVycm9ycy5yZXF1aXJlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7ZmwuZm9ybV9maWVsZF90aXRsZX19IGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIiAqbmdJZj1cImZsPy5mb3JtX2ZpZWxkX3R5cCA9PSAndCcgJiYgZmw/LmR0YV90eXAgPT0nYSdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtbWQtMyBjb250cm9sLWxhYmVsXCI+e3tmbD8uZm9ybV9maWVsZF90aXRsZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJmbC5pc19jb21wdWxzb3J5ID09IDFcIj4qPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC05XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgdy0xMDBcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPG5nLXNlbGVjdCBbaXRlbXNdPVwiW11cIiBbYWRkVGFnXT1cInRydWVcIiBiaW5kVmFsdWU9XCJsYWJlbFwiIFttdWx0aXBsZV09XCJ0cnVlXCIgbmFtZT1cInt7Zmw/LmZvcm1fZmllbGR9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmbC5kZWZhdWx0X3ZhbHVlXCIgW2lzT3Blbl09XCJmYWxzZVwiICNhZmllbGQ9XCJuZ01vZGVsXCIgW3JlcXVpcmVkXT1cImZsPy5pc19jb21wdWxzb3J5ID09ICcxJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXNlbGVjdD4gLS0+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxuZy1zZWxlY3Qgc3R5bGU9XCJ6LWluZGV4OiA1O1wiIFtvcHRpb25zXT1cIltdXCIgWyhuZ01vZGVsKV09XCJmbC5kZWZhdWx0X3ZhbHVlXCIgbmFtZT1cInt7Zmw/LmZvcm1fZmllbGR9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgI2FmaWVsZD1cIm5nTW9kZWxcIiBbcmVxdWlyZWRdPVwiZmw/LmlzX2NvbXB1bHNvcnkgPT0gJzEnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctc2VsZWN0PiBsYXN0IGNvbW1lbnRlZC0tPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRhZy1pbnB1dCBbKG5nTW9kZWwpXT1cImZsLmRlZmF1bHRfdmFsdWVcIiBuYW1lPVwie3tmbD8uZm9ybV9maWVsZH19XCIgW21vZGVsQXNTdHJpbmdzXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFthbGxvd0R1cGVzXT1cInRydWVcIiBbZWRpdGFibGVdPSd0cnVlJz48L3RhZy1pbnB1dD5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXYgKm5nSWY9XCJhZmllbGQuaW52YWxpZCAmJiAoYWZpZWxkLmRpcnR5IHx8IGFmaWVsZC50b3VjaGVkKVwiIGNsYXNzPVwiYWxlcnQgYWxlcnQtZGFuZ2VyIGNhXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJhZmllbGQuZXJyb3JzLnJlcXVpcmVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3tmbC5mb3JtX2ZpZWxkX3RpdGxlfX0gaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIiAqbmdJZj1cImZsPy5mb3JtX2ZpZWxkX3R5cCA9PSAndCcgJiYgZmw/LmR0YV90eXAgPT0nc3InXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLW1kLTMgY29udHJvbC1sYWJlbFwiPnt7Zmw/LmZvcm1fZmllbGRfdGl0bGV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJmbC5pc19jb21wdWxzb3J5ID09IDFcIj4qPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtN1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxuZy1zZWxlY3QgW2l0ZW1zXT1cInNxbEFycmF5W2ZsLmZvcm1fZmllbGRdXCIgW2Ryb3Bkb3duUG9zaXRpb25dPVwiJ2JvdHRvbSdcIiBiaW5kTGFiZWw9XCJ2XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicGFnZURpc3BsYXlcIiBbbmdNb2RlbE9wdGlvbnNdPVwie3N0YW5kYWxvbmU6IHRydWV9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1zZWxlY3Q+IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1zZWxlY3Qgc3R5bGU9XCJ6LWluZGV4OiA1O1wiIFtvcHRpb25zXT1cInNxbEFycmF5W2ZsLmZvcm1fZmllbGRdXCIgWyhuZ01vZGVsKV09XCJwYWdlRGlzcGxheVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwie3tmbD8uZm9ybV9maWVsZH19XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4taW5mb1wiIHR5cGU9XCJidXR0b25cIiBzdHlsZT1cIndpZHRoOjEwMCU7XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkQXR0cihwYWdlRGlzcGxheSwgc3FsQXJyYXlbZmwuZm9ybV9maWVsZF0sIGZsLmRlZmF1bHRfdmFsdWUpO1wiPkFkZDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLW1kLTMgY29udHJvbC1sYWJlbFwiPlNlbGVjdGVkIE1vZHVsZXM8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjY2xhc3M9XCJjb2wtbWQtOVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWRzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNpdGVtVGVtcGxhdGUgbGV0LWl0ZW09XCJpdGVtXCIgbGV0LWluZGV4PVwiaW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwicGFkZGluZzogNHB4O2JvcmRlcjogMXB4IHNvbGlkICNjOWM5Yzk7Ym9yZGVyLXJhZGl1czogNnB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt3aWR0aDogMTAwJTtwb3NpdGlvbjogcmVsYXRpdmU7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7aW5kZXgrMX19PC9zcGFuPiAtIHt7aXRlbS52YWx1ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicm1cIiAoY2xpY2spPVwicmVtb3ZlKGZsLmRlZmF1bHRfdmFsdWUsaXRlbS52YWx1ZSxpbmRleCxmbD8uZm9ybV9maWVsZCk7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS10aW1lc1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJzLXNvcnRhYmxlIFsobmdNb2RlbCldPVwiZmwuZGVmYXVsdF92YWx1ZVwiIG5hbWU9XCJ7e2ZsPy5mb3JtX2ZpZWxkfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpdGVtVGVtcGxhdGVdPVwiaXRlbVRlbXBsYXRlXCIgaXRlbUNsYXNzPVwic29ydGFibGUtaXRlbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUFjdGl2ZUNsYXNzPVwic29ydGFibGUtaXRlbS1hY3RpdmVcIiBwbGFjZWhvbGRlckNsYXNzPVwicGxhY2Vob2xkZXJTdHlsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlckNsYXNzPVwic29ydGFibGUtd3JhcHBlclwiICNzcmY9XCJuZ01vZGVsXCIgW3JlcXVpcmVkXT1cImZsPy5pc19jb21wdWxzb3J5ID09ICcxJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2JzLXNvcnRhYmxlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic3JmLmludmFsaWQgJiYgKHNyZi5kaXJ0eSB8fCBzcmYudG91Y2hlZClcIiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWRhbmdlciBjYVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic3JmLmVycm9ycy5yZXF1aXJlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7ZmwuZm9ybV9maWVsZF90aXRsZX19IGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCIgKm5nSWY9XCJmbD8uZm9ybV9maWVsZF90eXAgPT0gJ3QnICYmIGZsPy5kdGFfdHlwID09J3NhJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1tZC0zIGNvbnRyb2wtbGFiZWxcIj57e2ZsPy5mb3JtX2ZpZWxkX3RpdGxlfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cImZsLmlzX2NvbXB1bHNvcnkgPT0gMVwiPio8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCB3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxuZy1zZWxlY3QgW2l0ZW1zXT1cInNxbEFycmF5W2ZsLmZvcm1fZmllbGRdXCIgW2FkZFRhZ109XCJhZGRUYWdcIiBiaW5kVmFsdWU9XCJrXCIgW2hpZGVTZWxlY3RlZF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZT1cInRydWVcIiBiaW5kTGFiZWw9XCJ2XCIgbmFtZT1cInt7Zmw/LmZvcm1fZmllbGR9fVwiIFsobmdNb2RlbCldPVwiZmwuZGVmYXVsdF92YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgI3NhZmllbGQ9XCJuZ01vZGVsXCIgW3JlcXVpcmVkXT1cImZsPy5pc19jb21wdWxzb3J5ID09ICcxJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXNlbGVjdD4gLS0+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctc2VsZWN0IHN0eWxlPVwiei1pbmRleDogNTtcIiBbb3B0aW9uc109XCJzcWxBcnJheVtmbC5mb3JtX2ZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmbC5kZWZhdWx0X3ZhbHVlXCIgW211bHRpcGxlXT1cInRydWVcIiBbYWxsb3dDbGVhcl09XCJ0cnVlXCIgbmFtZT1cInt7Zmw/LmZvcm1fZmllbGR9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgI3NhZmllbGQ9XCJuZ01vZGVsXCIgW3JlcXVpcmVkXT1cImZsPy5pc19jb21wdWxzb3J5ID09ICcxJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjb3B0aW9uVGVtcGxhdGUgbGV0LW9wdGlvbj1cIm9wdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZhbWZhbWZhbS1mbGFncyB7e29wdGlvbj8udmFsdWV9fVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tvcHRpb24/LmxhYmVsfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXNlbGVjdD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzYWZpZWxkLmludmFsaWQgJiYgKHNhZmllbGQuZGlydHkgfHwgc2FmaWVsZC50b3VjaGVkKVwiIGNsYXNzPVwiYWxlcnQgYWxlcnQtZGFuZ2VyIGNhXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzYWZpZWxkLmVycm9ycy5yZXF1aXJlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7ZmwuZm9ybV9maWVsZF90aXRsZX19IGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIiAqbmdJZj1cImZsPy5mb3JtX2ZpZWxkX3R5cCA9PSAndGEnICYmIGZsPy5pc19oaWRkZW4gPT0gMCAmJiBmbD8uZHRhX3R5cCA9PSdjJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1tZC0zIGNvbnRyb2wtbGFiZWxcIj57e2ZsPy5mb3JtX2ZpZWxkX3RpdGxlfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cImZsLmlzX2NvbXB1bHNvcnkgPT0gMVwiPio8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCB3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiByb3dzPVwiM1wiIG5hbWU9XCJ7e2ZsPy5mb3JtX2ZpZWxkfX1cIiBbdmFsdWVdPVwiZmw/LmRlZmF1bHRfdmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZmwuZGVmYXVsdF92YWx1ZVwiICN0ZXh0QXJlYT1cIm5nTW9kZWxcIiAoYmx1cik9XCJjaGtGdW4oZmwsZmwuZGVmYXVsdF92YWx1ZSk7XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J3VuaXFFcnJNc2cnOiBmbD8uZm9ybV9maWVsZCA9PSBvbkVycn1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJmbD8uaXNfY29tcHVsc29yeSA9PSAnMSdcIj48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidGV4dEFyZWEuaW52YWxpZCAmJiAodGV4dEFyZWEuZGlydHkgfHwgdGV4dEFyZWEudG91Y2hlZClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFsZXJ0IGFsZXJ0LWRhbmdlciBjYVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidGV4dEFyZWEuZXJyb3JzLnJlcXVpcmVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3tmbC5mb3JtX2ZpZWxkX3RpdGxlfX0gaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZmw/LmZvcm1fZmllbGRfdHlwID09ICdoZCcgfHwgZmw/LmZvcm1fZmllbGRfdHlwID09ICdoYycgfHwgZmw/LmZvcm1fZmllbGRfdHlwID09ICdkZicgfHwgZmw/LmZvcm1fZmllbGRfdHlwID09ICdmaycgfHwgZmw/LmZvcm1fZmllbGRfdHlwID09ICdjaycgJiYgZmw/LmlzX2hpZGRlbiA9PSAwXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J210MCc6IGZsPy5mb3JtX2ZpZWxkX3R5cCA9PSAnaGQnfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBuYW1lPVwie3tmbD8uZm9ybV9maWVsZH19XCIgW3ZhbHVlXT1cImZsPy5kZWZhdWx0X3ZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZmwuZGVmYXVsdF92YWx1ZVwiICNoZGY9XCJuZ01vZGVsXCIgLz5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCIgKm5nSWY9XCJmbD8uZm9ybV9maWVsZF90eXAgPT0gJ3NxJyAmJiBmbD8uaXNfaGlkZGVuID09IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtbWQtMyBjb250cm9sLWxhYmVsXCI+PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCB3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImhpZGRlblwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgbmFtZT1cInt7Zmw/LmZvcm1fZmllbGR9fVwiIFt2YWx1ZV09XCJmbD8uZGVmYXVsdF92YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmbC5kZWZhdWx0X3ZhbHVlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIiAqbmdJZj1cImZsPy5mb3JtX2ZpZWxkX3R5cCA9PSAndGInICYmIGZsPy5pc19oaWRkZW4gPT0gMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1tZC0zIGNvbnRyb2wtbGFiZWxcIj57e2ZsPy5mb3JtX2ZpZWxkX3RpdGxlfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cImZsLmlzX2NvbXB1bHNvcnkgPT0gMVwiPio8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC05XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tY29udHJvbCBzZWxlY3RcIiBuYW1lPVwie3tmbD8uZm9ybV9maWVsZH19XCIgW3ZhbHVlXT1cImZsPy5kZWZhdWx0X3ZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZsLmRlZmF1bHRfdmFsdWVcIiAjdGRmPVwibmdNb2RlbFwiIFtyZXF1aXJlZF09XCJmbD8uaXNfY29tcHVsc29yeSA9PSAnMSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBkeW5hbWljIG9mIHNxbEFycmF5W2ZsLmZvcm1fZmllbGRdXCIgdmFsdWU9XCJ7e2R5bmFtaWMudmFsdWV9fVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tkeW5hbWljLmxhYmVsfX08L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ0ZGYuaW52YWxpZCAmJiAodGRmLmRpcnR5IHx8IHRkZi50b3VjaGVkKVwiIGNsYXNzPVwiYWxlcnQgYWxlcnQtZGFuZ2VyIGNhXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ0ZGYuZXJyb3JzLnJlcXVpcmVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3tmbC5mb3JtX2ZpZWxkX3RpdGxlfX0gaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiICpuZ0lmPVwiZmw/LmZvcm1fZmllbGRfdHlwID09ICdsJyAmJiBmbD8uaXNfaGlkZGVuID09IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtbWQtMyBjb250cm9sLWxhYmVsXCI+e3tmbD8uZm9ybV9maWVsZF90aXRsZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJmbC5pc19jb21wdWxzb3J5ID09IDFcIj4qPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC05XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tY29udHJvbCBzZWxlY3RcIiBuYW1lPVwie3tmbD8uZm9ybV9maWVsZH19XCIgW3ZhbHVlXT1cImZsPy5kZWZhdWx0X3ZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZsLmRlZmF1bHRfdmFsdWVcIiAjbElucHV0PVwibmdNb2RlbFwiIFtyZXF1aXJlZF09XCJmbD8uaXNfY29tcHVsc29yeSA9PSAnMSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBsb3Ygb2YgZmwua3ZcIiB2YWx1ZT1cInt7bG92Lmt9fVwiPnt7bG92LnZ9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImxJbnB1dC5pbnZhbGlkICYmIChsSW5wdXQuZGlydHkgfHwgbElucHV0LnRvdWNoZWQpXCIgY2xhc3M9XCJhbGVydCBhbGVydC1kYW5nZXIgY2FcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImxJbnB1dC5lcnJvcnMucmVxdWlyZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7e2ZsLmZvcm1fZmllbGRfdGl0bGV9fSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCIgKm5nSWY9XCJmbD8uZm9ybV9maWVsZF90eXAgPT0gJ2xkJyAgJiYgZmw/LmlzX2hpZGRlbiA9PSAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLW1kLTMgY29udHJvbC1sYWJlbFwiPnt7Zmw/LmZvcm1fZmllbGRfdGl0bGV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwiZmwuaXNfY29tcHVsc29yeSA9PSAxXCI+Kjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtOVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIHctMTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2wgc2VsZWN0XCIgbmFtZT1cInt7Zmw/LmZvcm1fZmllbGR9fVwiIFt2YWx1ZV09XCJmbD8uZGVmYXVsdF92YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmbC5kZWZhdWx0X3ZhbHVlXCIgI2xkSW5wdXQ9XCJuZ01vZGVsXCIgW3JlcXVpcmVkXT1cImZsPy5pc19jb21wdWxzb3J5ID09ICcxJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGR5bmFtaWMgb2Ygc3FsQXJyYXlbZmwuZm9ybV9maWVsZF1cIiB2YWx1ZT1cInt7ZHluYW1pYy52YWx1ZX19XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2R5bmFtaWMubGFiZWx9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImxkSW5wdXQuaW52YWxpZCAmJiAobGRJbnB1dC5kaXJ0eSB8fCBsZElucHV0LnRvdWNoZWQpXCIgY2xhc3M9XCJhbGVydCBhbGVydC1kYW5nZXIgY2FcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImxkSW5wdXQuZXJyb3JzLnJlcXVpcmVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3tmbC5mb3JtX2ZpZWxkX3RpdGxlfX0gaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiICpuZ0lmPVwiZmw/LmZvcm1fZmllbGRfdHlwID09ICdzJyAmJiBmbD8uaXNfaGlkZGVuID09IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtbWQtMyBjb250cm9sLWxhYmVsXCI+e3tmbD8uZm9ybV9maWVsZF90aXRsZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJmbC5pc19jb21wdWxzb3J5ID09IDFcIj4qPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC05XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tY29udHJvbCBzZWxlY3RcIiBuYW1lPVwie3tmbD8uZm9ybV9maWVsZH19XCIgW3ZhbHVlXT1cImZsPy5kZWZhdWx0X3ZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZsLmRlZmF1bHRfdmFsdWVcIiAoY2hhbmdlKT1cImNoa0Z1bihmbCxmbC5kZWZhdWx0X3ZhbHVlKVwiIGlkPVwie3tmbC5jb2x1bW5fa2V5fX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICNzZmk9XCJuZ01vZGVsXCIgW3JlcXVpcmVkXT1cImZsPy5pc19jb21wdWxzb3J5ID09ICcxJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGR5bmFtaWMgb2Ygc3FsQXJyYXlbZmwuZm9ybV9maWVsZF1cIiB2YWx1ZT1cInt7ZHluYW1pYy52YWx1ZX19XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2R5bmFtaWMubGFiZWx9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNmaS5pbnZhbGlkICYmIChzZmkuZGlydHkgfHwgc2ZpLnRvdWNoZWQpXCIgY2xhc3M9XCJhbGVydCBhbGVydC1kYW5nZXIgY2FcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNmaS5lcnJvcnMucmVxdWlyZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7e2ZsLmZvcm1fZmllbGRfdGl0bGV9fSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiICpuZ0lmPVwiZmw/LmZvcm1fZmllbGRfdHlwID09ICdzYidcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtbWQtMyBjb250cm9sLWxhYmVsXCI+e3tmbD8uZm9ybV9maWVsZF90aXRsZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJmbC5pc19jb21wdWxzb3J5ID09IDFcIj4qPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC04XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXNlbGVjdCBzdHlsZT1cInotaW5kZXg6IDU7XCIgW29wdGlvbnNdPVwic3FsQXJyYXlbZmwuZm9ybV9maWVsZF1cIiAjc2ZpPVwibmdNb2RlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmbC5kZWZhdWx0X3ZhbHVlXCIgbmFtZT1cInt7Zmw/LmZvcm1fZmllbGR9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkKT1cImNoa0Z1bihmbCxmbC5kZWZhdWx0X3ZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpbHRlcklucHV0Q2hhbmdlZCk9XCJsb2FkU3VnZ2RhdGEoJGV2ZW50LGZsLnBhZ2VfaXRlbV9pZG4sZmwuZm9ybV9maWVsZClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzZmkuaW52YWxpZCAmJiAoc2ZpLmRpcnR5IHx8IHNmaS50b3VjaGVkKVwiIGNsYXNzPVwiYWxlcnQgYWxlcnQtZGFuZ2VyIGNhXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzZmkuZXJyb3JzLnJlcXVpcmVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3tmbC5mb3JtX2ZpZWxkX3RpdGxlfX0gaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xXCIgKm5nSWY9XCJmbD8uZm9ybV9maWVsZF9pY29uID09ICdhZGQnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc3VjY2VzcyBidG4tcm91bmRlZFwiPjxzcGFuPjxpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhIGZhLXBsdXNcIj48L2k+PC9zcGFuPjwvYnV0dG9uPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBjbGFzcz1cImJ0biBidG4tc3VjY2Vzc1wiIChjbGljayk9XCJzdWJtaXRGb3JtKGYsc3VibWl0QnRuKVwiIGFwcEFwcE5vRGJsQ2xpY2tcclxuICAgICAgICAgICAgICAgICNzdWJtaXRCdG4+e3tidG5OYW1lfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJyZXNldFwiIGNsYXNzPVwiYnRuIGJ0bi1kYW5nZXJcIiAoY2xpY2spPVwicmVzZXQoZilcIiAqbmdJZj1cImJ0bk5hbWUgPT0gJ0FkZCdcIj5SZXNldDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZm9ybT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbFwiIGlkPVwiZGVsZXRlVGVybXNtb2RhbFwiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLWxhYmVsbGVkYnk9XCJzbWFsbE1vZGFsSGVhZFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXHJcbiAgICAgIGRhdGEtYmFja2Ryb3A9XCJzdGF0aWNcIiBkYXRhLWtleWJvYXJkPVwiZmFsc2VcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZyBtb2RhbC1zbVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2xvc2VcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiIChjbGljayk9XCJjbG9zZU51bGwoKTtcIiAjZGVsZXRlY2xzYnRuPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzci1vbmx5XCI+Q2xvc2U8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8aDQgY2xhc3M9XCJtb2RhbC10aXRsZVwiIGlkPVwic21hbGxNb2RhbEhlYWRcIj5XYXJuaW5nPC9oND5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cclxuICAgICAgICAgICAgQXJlIHlvdSBzdXJlIHdhbnQgdG8gZGVsZXRlIHRlcm0/XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHRcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiPkNsb3NlPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1kYW5nZXJcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiIChjbGljayk9XCJEZWxldGVUZXJtcygpO1wiPkRlbGV0ZTwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsXCIgaWQ9XCJkZWxldGVtb2RhbFwiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLWxhYmVsbGVkYnk9XCJzbWFsbE1vZGFsSGVhZFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXHJcbiAgICAgIGRhdGEtYmFja2Ryb3A9XCJzdGF0aWNcIiBkYXRhLWtleWJvYXJkPVwiZmFsc2VcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZyBtb2RhbC1zbVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2xvc2VcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiIChjbGljayk9XCJjbG9zZU51bGwoKTtcIiAjZGVsZXRlY2xzYnRuPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzci1vbmx5XCI+Q2xvc2U8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8aDQgY2xhc3M9XCJtb2RhbC10aXRsZVwiIGlkPVwic21hbGxNb2RhbEhlYWRcIj5XYXJuaW5nPC9oND5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cclxuICAgICAgICAgICAgQXJlIHlvdSBzdXJlIHdhbnQgdG8gZGVsZXRlP1xyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIj5DbG9zZTwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tZGFuZ2VyXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVEYXRhTGlzdCgpO1wiPkRlbGV0ZTwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbFwiIGlkPVwibW9kYWxfc3lzXCIgdGFiaW5kZXg9XCItMVwiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLWxhYmVsbGVkYnk9XCJkZWZNb2RhbEhlYWRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZ1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2xvc2VcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzci1vbmx5XCI+Q2xvc2U8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8aDQgY2xhc3M9XCJtb2RhbC10aXRsZVwiIGlkPVwiZGVmTW9kYWxIZWFkXCI+QmFzaWMgTW9kYWw8L2g0PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxyXG4gICAgICAgICAgICBTb21lIGNvbnRlbnQgaW4gbW9kYWwgZXhhbXBsZVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIj5DbG9zZTwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWxcIiBpZD1cInJvd0dycG1vZGFsXCIgdGFiaW5kZXg9XCItMlwiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLWxhYmVsbGVkYnk9XCJyb3dHcnBtb2RhbFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXHJcbiAgICAgIGRhdGEtYmFja2Ryb3A9XCJzdGF0aWNcIiBkYXRhLWtleWJvYXJkPVwiZmFsc2VcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZ1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XHJcbiAgICAgICAgICA8Zm9ybSBjbGFzcz1cImZvcm0taG9yaXpvbnRhbFwiICNmcmc9XCJuZ0Zvcm1cIiBuYW1lPVwiYXBwRm9ybVJvd0dycFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjbG9zZVwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCIgKGNsaWNrKT1cImNsb3NlTnVsbCgpO1wiICNjbG9zZWJ0bj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNyLW9ubHlcIj5DbG9zZTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8aDQgY2xhc3M9XCJtb2RhbC10aXRsZVwiIGlkPVwicm93R3JwSGVhZFwiPlJvdyBHcm91cDwvaDQ+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIiBzdHlsZT1cInBhZGRpbmctYm90dG9tOiAxMHB4O1wiPlxyXG4gICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtbWQtMiBjb250cm9sLWxhYmVsXCI+QXR0cmlidXRlczwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1tZC01IGNvbnRyb2wtbGFiZWxcIiBzdHlsZT1cInBhZGRpbmctcmlnaHQ6IDkwcHg7XCI+Um93IERpc3BsYXk8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtbWQtNSBjb250cm9sLWxhYmVsXCIgc3R5bGU9XCJwYWRkaW5nLXJpZ2h0OiA3NnB4O1wiPlJvdyBHcm91cCA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCIgKm5nRm9yPVwibGV0IGF0dCBvZiBkaXNwbGF5X2F0dHI7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLW1kLTIgY29udHJvbC1sYWJlbFwiPnt7YXR0LmF0dHJ9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tY29udHJvbFwiIG5hbWU9XCJhdHQuZGlzcGxheV9yb3dcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZXNlbGNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwicm93X3t7YXR0LmF0dHJ9fVwiIFt2YWx1ZV09XCJhdHQuZGlzcGxheV9yb3dcIiAoY2hhbmdlKT1cIm9uQ2hhbmdlRGlzcFJvdygkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBbdmFsdWVdPVwiYXR0LmRpc3BsYXlfcm93XCIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgZHIgb2YgZGlzcGxheV9yb3c7XCIgdmFsdWU9XCJ7e2RyLmlkbn19XCI+e3tkci5wcmludH19PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tY29udHJvbFwiIG5hbWU9XCJhdHQuZGlzcGxheV9ncm91cFwiIFtkaXNhYmxlZF09XCJkaXNhYmxlc2VsY1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJncnBfe3thdHQuYXR0cn19XCIgW3ZhbHVlXT1cImF0dC5kaXNwbGF5X2dyb3VwXCIgKGNoYW5nZSk9XCJvbkNoYW5nZURpc3BHcnAoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGRnIG9mIGRpc3BsYXlfZ3JvdXA7XCIgdmFsdWU9XCJ7e2RnLmlkbn19XCI+e3tkZy5wcmludH19PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwicmVzZXRcIiBjbGFzcz1cImJ0biBidG4tZGFuZ2VyXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIj5jbG9zZTwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZm9ybT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcblxyXG5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWxcIiBpZD1cInByb2R1Y3REZXRhaWxNYXBNRFwiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLWxhYmVsbGVkYnk9XCJzbWFsbE1vZGFsSGVhZFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXHJcbiAgICAgIGRhdGEtYmFja2Ryb3A9XCJzdGF0aWNcIiBkYXRhLWtleWJvYXJkPVwiZmFsc2VcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZyBtb2RhbC1zbSBtd2lkdGhcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNsb3NlXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIiAoY2xpY2spPVwiY2xvc2VOdWxsKCk7XCIgI3Byb2R1Y3RNYXBjbHNidG4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JnRpbWVzOzwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNyLW9ubHlcIiBwcm9kdWN0RGV0YWlsTWFwY2xzYnRuPkNsb3NlPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGg0IGNsYXNzPVwibW9kYWwtdGl0bGVcIiBpZD1cInNtYWxsTW9kYWxIZWFkXCI+UHJvZHVjdCBNYXBwaW5nIG9mJm5ic3A7e3twcm9kdWNEZXRhaWxNb2RlbFRpdGxlfX08L2g0PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiPlxyXG4gICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIHRhYmxlLWJvcmRlcmVkIHRhYmxlLWhvdmVyIHRhYmxlLWhvdmVyLWNlbGxzXCI+XHJcbiAgICAgICAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICA8dGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICBOYW1lXHJcbiAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICA8dGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICBWYWx1ZVxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgICAgICAgICAgPHRib2R5PlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBrZXkgb2YgYXR0ckR0bD8ucHJwTGlzdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3trZXkucHJpbnR9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cImF0dHJNYXBwaW5nRHRsW2tleT8udmFsXVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICAgICAgICA8L3RhYmxlPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIiAjcHJvZHVjdERldGFpbE1hcGNsc2J0bj5DbG9zZTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zdWNjZXNzXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNhdmVQcm9kdWN0RGV0YWlsTWFwcGluZygpO1wiPlNhdmU8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWxcIiBpZD1cImRvY2RlbGV0ZW1vZGFsXCIgcm9sZT1cImRpYWxvZ1wiIGFyaWEtbGFiZWxsZWRieT1cInNtYWxsTW9kYWxIZWFkXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCJcclxuICAgICAgZGF0YS1iYWNrZHJvcD1cInN0YXRpY1wiIGRhdGEta2V5Ym9hcmQ9XCJmYWxzZVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nIG1vZGFsLXNtXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjbG9zZVwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCIgKGNsaWNrKT1cImNsb3NlTnVsbCgpO1wiICNkZWxldGVjbHNidG4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JnRpbWVzOzwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNyLW9ubHlcIj5DbG9zZTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxoNCBjbGFzcz1cIm1vZGFsLXRpdGxlXCIgaWQ9XCJzbWFsbE1vZGFsSGVhZFwiPldhcm5pbmc8L2g0PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxyXG4gICAgICAgICAgICBBcmUgeW91IHN1cmUgd2FudCB0byBkZWxldGU/XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHRcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiPkNsb3NlPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1kYW5nZXJcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiIChjbGljayk9XCJkZWxldGVEb2MoKTtcIj5EZWxldGU8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbFwiIGlkPVwiYm5rZGVsZXRlbW9kYWxcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1sYWJlbGxlZGJ5PVwic21hbGxNb2RhbEhlYWRcIiBhcmlhLWhpZGRlbj1cInRydWVcIlxyXG4gICAgICBkYXRhLWJhY2tkcm9wPVwic3RhdGljXCIgZGF0YS1rZXlib2FyZD1cImZhbHNlXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1kaWFsb2cgbW9kYWwtc21cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNsb3NlXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIiAoY2xpY2spPVwiY2xvc2VOdWxsKCk7XCIgI2RlbGV0ZWNsc2J0bj5cclxuICAgICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4mdGltZXM7PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3Itb25seVwiPkNsb3NlPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGg0IGNsYXNzPVwibW9kYWwtdGl0bGVcIiBpZD1cInNtYWxsTW9kYWxIZWFkXCI+V2FybmluZzwvaDQ+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XHJcbiAgICAgICAgICAgIEFyZSB5b3Ugc3VyZSB3YW50IHRvIGRlbGV0ZT9cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tZGVmYXVsdFwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCI+Q2xvc2U8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWRhbmdlclwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwiRGVsZXRlTGVkZ2VyQmFuaygpXCI+RGVsZXRlPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxidXR0b24gaWQ9XCJibmtkZWxldGVtb2RhbGJ0blwiIFtoaWRkZW5dPVwidHJ1ZVwiIGRhdGEtdG9nZ2xlPVwibW9kYWxcIiBkYXRhLXRhcmdldD1cIiNibmtkZWxldGVtb2RhbFwiPjwvYnV0dG9uPlxyXG5cclxuICAgIDxidXR0b24gaWQ9XCJkb2NkZWxldGVidG5cIiBbaGlkZGVuXT1cInRydWVcIiBkYXRhLXRvZ2dsZT1cIm1vZGFsXCIgZGF0YS10YXJnZXQ9XCIjZG9jZGVsZXRlbW9kYWxcIj48L2J1dHRvbj5cclxuICAgIDxidXR0b24gaWQ9XCJkZWxldGVidG5cIiBbaGlkZGVuXT1cInRydWVcIiBkYXRhLXRvZ2dsZT1cIm1vZGFsXCIgZGF0YS10YXJnZXQ9XCIjZGVsZXRlbW9kYWxcIj48L2J1dHRvbj5cclxuICAgIDxidXR0b24gaWQ9XCJkZWxldGVUZXJtc1wiIFtoaWRkZW5dPVwidHJ1ZVwiIGRhdGEtdG9nZ2xlPVwibW9kYWxcIiBkYXRhLXRhcmdldD1cIiNkZWxldGVUZXJtc21vZGFsXCI+PC9idXR0b24+XHJcblxyXG4gICAgPGJ1dHRvbiBpZD1cImRhdGFtZGJ0blwiIFtoaWRkZW5dPVwidHJ1ZVwiIGRhdGEtdG9nZ2xlPVwibW9kYWxcIiBkYXRhLXRhcmdldD1cIiNkYXRhbW9kYWxcIj48L2J1dHRvbj5cclxuICAgIDxidXR0b24gaWQ9XCJjbHNNZFwiIFtoaWRkZW5dPVwidHJ1ZVwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCIgZGF0YS10YXJnZXQ9XCIjZGF0YW1vZGFsXCI+PC9idXR0b24+XHJcbiAgICA8YnV0dG9uIGlkPVwic3lzbWRcIiBbaGlkZGVuXT1cInRydWVcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiIGRhdGEtdGFyZ2V0PVwiI21vZGFsX3N5c1wiPjwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvbiBpZD1cImJ0bnByb2R1Y3REZXRhaWxNYXBNRFwiIFtoaWRkZW5dPVwidHJ1ZVwiIGRhdGEtdG9nZ2xlPVwibW9kYWxcIiBkYXRhLXRhcmdldD1cIiNwcm9kdWN0RGV0YWlsTWFwTURcIj48L2J1dHRvbj5cclxuXHJcbiAgICA8YnV0dG9uIGlkPVwicm93R3JwYnRuXCIgW2hpZGRlbl09XCJ0cnVlXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIiBkYXRhLXRvZ2dsZT1cIm1vZGFsXCIgZGF0YS10YXJnZXQ9XCIjcm93R3JwbW9kYWxcIj48L2J1dHRvbj5cclxuICA8L2Rpdj4iXX0=
|