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.
Files changed (113) hide show
  1. package/esm2020/ezlibrary_v2.mjs +5 -0
  2. package/esm2020/lib/admin-service/admin-service.service.mjs +36 -0
  3. package/esm2020/lib/analysis-search/analysis-search.component.mjs +1083 -0
  4. package/esm2020/lib/assort-service/assort-service.service.mjs +31 -0
  5. package/esm2020/lib/attribute-definition/attribute-definition.component.mjs +231 -0
  6. package/esm2020/lib/auth/auth.guard.mjs +40 -0
  7. package/esm2020/lib/bi-service/bi.service.mjs +58 -0
  8. package/esm2020/lib/call-info/callinfo.component.mjs +126 -0
  9. package/esm2020/lib/comman-service/comman-service.service.mjs +679 -0
  10. package/esm2020/lib/comman-service/share-data-service.service.mjs +23 -0
  11. package/esm2020/lib/contact-search/contact-search.component.mjs +679 -0
  12. package/esm2020/lib/contact-service/contact-service.service.mjs +47 -0
  13. package/esm2020/lib/ezheader/header.component.mjs +383 -0
  14. package/esm2020/lib/ezlib.module.mjs +220 -0
  15. package/esm2020/lib/file-upload/fileupload.component.mjs +920 -0
  16. package/esm2020/lib/file-upload-log/file-upload-log.component.mjs +175 -0
  17. package/esm2020/lib/fileupload-module/fileupload-dashboard/fileupload-dashboard.component.mjs +14 -0
  18. package/esm2020/lib/fileupload-module/fileupload-routing.module.mjs +28 -0
  19. package/esm2020/lib/footer/footer.component.mjs +18 -0
  20. package/esm2020/lib/globle/common-pdf.service.mjs +28 -0
  21. package/esm2020/lib/globle/globle-env.service.mjs +45 -0
  22. package/esm2020/lib/globle/memo-report.service.mjs +2800 -0
  23. package/esm2020/lib/globle/pdf-service.service.mjs +18848 -0
  24. package/esm2020/lib/globle/shared-services.service.mjs +27 -0
  25. package/esm2020/lib/globle/upload-service.service.mjs +69 -0
  26. package/esm2020/lib/header/header.component.mjs +179 -0
  27. package/esm2020/lib/invalid/invalid.component.mjs +71 -0
  28. package/esm2020/lib/logout/logout.component.mjs +107 -0
  29. package/esm2020/lib/menu-right/menu-right.component.mjs +252 -0
  30. package/esm2020/lib/pipes/number-with-commas.pipe.mjs +24 -0
  31. package/esm2020/lib/pipes/order-by-pipe.pipe.mjs +17 -0
  32. package/esm2020/lib/pipes/selectedCount.mjs +19 -0
  33. package/esm2020/lib/pipes/sum.pipe.mjs +16 -0
  34. package/esm2020/lib/pkt-data/pkt-data.component.mjs +1107 -0
  35. package/esm2020/lib/pricing-service/pricing.service.mjs +58 -0
  36. package/esm2020/lib/qa-analysis/qa-analysis.component.mjs +1035 -0
  37. package/esm2020/lib/report-format/report-format.component.mjs +400 -0
  38. package/esm2020/lib/sessionend/session-end.guard.mjs +28 -0
  39. package/esm2020/lib/stock-service/lazyload.service.mjs +21 -0
  40. package/esm2020/lib/stock-service/stock-service.service.mjs +62 -0
  41. package/esm2020/lib/system-module/subform/subform.component.mjs +2481 -0
  42. package/esm2020/lib/system-module/system/system.component.mjs +959 -0
  43. package/esm2020/lib/system-module/system-service/system-service.service.mjs +85 -0
  44. package/esm2020/lib/system-module/system-service/upload-file.service.mjs +86 -0
  45. package/esm2020/lib/utility/app-no-dbl-click.directive.mjs +23 -0
  46. package/esm2020/lib/utility/constants.mjs +5 -0
  47. package/esm2020/lib/utility/contact-table-search.pipe.mjs +25 -0
  48. package/esm2020/lib/utility/formate-num-field.pipe.mjs +19 -0
  49. package/esm2020/lib/utility/search-pipe.pipe.mjs +26 -0
  50. package/esm2020/lib/utility/selective-preloading-strategy.mjs +23 -0
  51. package/esm2020/lib/utility/table-search.pipe.mjs +25 -0
  52. package/esm2020/lib/utility/tranform.directive.mjs +27 -0
  53. package/esm2020/lib/websearch-history/websearch-history.component.mjs +273 -0
  54. package/esm2020/public_api.mjs +57 -0
  55. package/ezlibrary_v2.d.ts +5 -0
  56. package/fesm2015/ezlibrary_v2.mjs +33543 -0
  57. package/fesm2015/ezlibrary_v2.mjs.map +1 -0
  58. package/fesm2020/ezlibrary_v2.mjs +33533 -0
  59. package/fesm2020/ezlibrary_v2.mjs.map +1 -0
  60. package/lib/admin-service/admin-service.service.d.ts +13 -0
  61. package/lib/analysis-search/analysis-search.component.d.ts +122 -0
  62. package/lib/assort-service/assort-service.service.d.ts +12 -0
  63. package/lib/attribute-definition/attribute-definition.component.d.ts +47 -0
  64. package/lib/auth/auth.guard.d.ts +16 -0
  65. package/lib/bi-service/bi.service.d.ts +20 -0
  66. package/lib/call-info/callinfo.component.d.ts +30 -0
  67. package/lib/comman-service/comman-service.service.d.ts +111 -0
  68. package/lib/comman-service/share-data-service.service.d.ts +10 -0
  69. package/lib/contact-search/contact-search.component.d.ts +115 -0
  70. package/lib/contact-service/contact-service.service.d.ts +15 -0
  71. package/lib/ezheader/header.component.d.ts +61 -0
  72. package/lib/ezlib.module.d.ts +47 -0
  73. package/lib/file-upload/fileupload.component.d.ts +131 -0
  74. package/lib/file-upload-log/file-upload-log.component.d.ts +53 -0
  75. package/lib/fileupload-module/fileupload-dashboard/fileupload-dashboard.component.d.ts +8 -0
  76. package/lib/fileupload-module/fileupload-routing.module.d.ts +7 -0
  77. package/lib/footer/footer.component.d.ts +9 -0
  78. package/lib/globle/common-pdf.service.d.ts +9 -0
  79. package/lib/globle/globle-env.service.d.ts +16 -0
  80. package/lib/globle/memo-report.service.d.ts +107 -0
  81. package/lib/globle/pdf-service.service.d.ts +459 -0
  82. package/lib/globle/shared-services.service.d.ts +12 -0
  83. package/lib/globle/upload-service.service.d.ts +20 -0
  84. package/lib/header/header.component.d.ts +45 -0
  85. package/lib/invalid/invalid.component.d.ts +12 -0
  86. package/lib/logout/logout.component.d.ts +21 -0
  87. package/lib/menu-right/menu-right.component.d.ts +47 -0
  88. package/lib/pipes/number-with-commas.pipe.d.ts +7 -0
  89. package/lib/pipes/order-by-pipe.pipe.d.ts +7 -0
  90. package/lib/pipes/selectedCount.d.ts +7 -0
  91. package/lib/pipes/sum.pipe.d.ts +7 -0
  92. package/lib/pkt-data/pkt-data.component.d.ts +189 -0
  93. package/lib/pricing-service/pricing.service.d.ts +20 -0
  94. package/lib/qa-analysis/qa-analysis.component.d.ts +99 -0
  95. package/lib/report-format/report-format.component.d.ts +74 -0
  96. package/lib/sessionend/session-end.guard.d.ts +10 -0
  97. package/lib/stock-service/lazyload.service.d.ts +7 -0
  98. package/lib/stock-service/stock-service.service.d.ts +19 -0
  99. package/lib/system-module/subform/subform.component.d.ts +227 -0
  100. package/lib/system-module/system/system.component.d.ts +113 -0
  101. package/lib/system-module/system-service/system-service.service.d.ts +23 -0
  102. package/lib/system-module/system-service/upload-file.service.d.ts +12 -0
  103. package/lib/utility/app-no-dbl-click.directive.d.ts +7 -0
  104. package/lib/utility/constants.d.ts +4 -0
  105. package/lib/utility/contact-table-search.pipe.d.ts +7 -0
  106. package/lib/utility/formate-num-field.pipe.d.ts +7 -0
  107. package/lib/utility/search-pipe.pipe.d.ts +7 -0
  108. package/lib/utility/selective-preloading-strategy.d.ts +9 -0
  109. package/lib/utility/table-search.pipe.d.ts +7 -0
  110. package/lib/utility/tranform.directive.d.ts +10 -0
  111. package/lib/websearch-history/websearch-history.component.d.ts +62 -0
  112. package/package.json +48 -0
  113. package/public_api.d.ts +52 -0
@@ -0,0 +1,126 @@
1
+ import { Component } from '@angular/core';
2
+ import { Router, ActivatedRoute } from '@angular/router';
3
+ import { HttpHeaders } from '@angular/common/http';
4
+ import { ToastrService } from 'ngx-toastr';
5
+ import { Cookie } from 'ng2-cookies/ng2-cookies';
6
+ import { CommanServiceService } from '../comman-service/comman-service.service';
7
+ import { GlobleEnvService } from '../globle/globle-env.service';
8
+ import { NgxSpinnerService } from "ngx-spinner";
9
+ import * as i0 from "@angular/core";
10
+ import * as i1 from "@angular/router";
11
+ import * as i2 from "../comman-service/comman-service.service";
12
+ import * as i3 from "ngx-toastr";
13
+ import * as i4 from "ngx-spinner";
14
+ import * as i5 from "../globle/globle-env.service";
15
+ import * as i6 from "@angular/forms";
16
+ import * as i7 from "@angular/common";
17
+ import * as i8 from "../utility/app-no-dbl-click.directive";
18
+ export class CallInfoComponent {
19
+ constructor(router, route, cs, toastr, spinnerService, globlEnv) {
20
+ this.router = router;
21
+ this.route = route;
22
+ this.cs = cs;
23
+ this.toastr = toastr;
24
+ this.spinnerService = spinnerService;
25
+ this.globlEnv = globlEnv;
26
+ this.communictionMode = [];
27
+ }
28
+ ngOnInit() {
29
+ let mdlk = JSON.parse(localStorage.getItem('mdlKey'));
30
+ let mdlKey = Object.keys(mdlk);
31
+ let cUrl = this.router.url;
32
+ this.header = {
33
+ 'Content-Type': 'application/json',
34
+ 'clientkey': Cookie.get('_ck'),
35
+ 'modulekey': mdlk[cUrl.split('/')[1]],
36
+ 'loginid': Cookie.get('_logid'),
37
+ 'source': 'qs'
38
+ };
39
+ this.route.params.subscribe((params) => {
40
+ this.loadCallInfo();
41
+ });
42
+ }
43
+ loadCallInfo() {
44
+ this.spinnerService.show();
45
+ let reqObj = {};
46
+ reqObj['formNme'] = this.route.snapshot.params['frmnme'];
47
+ this.header['method'] = 'loadCommunicationLogForm';
48
+ let options = ({ headers: new HttpHeaders(this.header) });
49
+ this.cs.load(reqObj, options, 'marketing/transaction').then((response) => {
50
+ if (response.status == 'SUCCESS') {
51
+ let result = response.result || {};
52
+ this.communictionMode = result.communicationMediumList || [];
53
+ this.spinnerService.hide();
54
+ }
55
+ else {
56
+ this.spinnerService.hide();
57
+ this.toastr.error(response.message);
58
+ }
59
+ }).catch((err) => {
60
+ this.spinnerService.hide();
61
+ this.toastr.error(err.message);
62
+ });
63
+ }
64
+ SaveCallInfo() {
65
+ this.contactDate = this.contactDate || '';
66
+ this.medium = this.medium || '';
67
+ this.subject = this.subject || '';
68
+ this.summary = this.summary || '';
69
+ this.detail = this.detail || '';
70
+ let isValid = true;
71
+ if (this.contactDate == '') {
72
+ this.toastr.error("Please specify ContactDate");
73
+ isValid = false;
74
+ }
75
+ if (this.medium == '') {
76
+ this.toastr.error("Please specify Medium");
77
+ isValid = false;
78
+ }
79
+ if (this.subject == '') {
80
+ this.toastr.error("Please specify subject");
81
+ isValid = false;
82
+ }
83
+ if (this.summary == '') {
84
+ this.toastr.error("Please specify summary");
85
+ isValid = false;
86
+ }
87
+ if (isValid) {
88
+ this.spinnerService.show();
89
+ let reqObj = {};
90
+ reqObj['formNme'] = this.route.snapshot.params['frmnme'];
91
+ reqObj['emp_idn'] = this.emp_idn;
92
+ reqObj['nme_idn'] = this.nme_idn;
93
+ reqObj['log_ts'] = this.cs.formatDate(this.contactDate);
94
+ reqObj['auto_yn'] = "0";
95
+ reqObj['channel'] = this.medium;
96
+ reqObj['subject'] = this.subject;
97
+ reqObj['summary'] = this.summary;
98
+ reqObj['details'] = this.detail;
99
+ reqObj['pvt'] = 0;
100
+ reqObj['attrMap'] = {};
101
+ reqObj['recipientListMap'] = {};
102
+ this.header['method'] = 'saveMailLogDetails';
103
+ let options = ({ headers: new HttpHeaders(this.header) });
104
+ this.cs.load(reqObj, options, 'marketing/transaction').then((response) => {
105
+ if (response.status == 'SUCCESS') {
106
+ let result = response.result || {};
107
+ this.spinnerService.hide();
108
+ }
109
+ else {
110
+ this.spinnerService.hide();
111
+ this.toastr.error(response.message);
112
+ }
113
+ }).catch((err) => {
114
+ this.spinnerService.hide();
115
+ this.toastr.error(err.message);
116
+ });
117
+ }
118
+ }
119
+ }
120
+ /** @nocollapse */ /** @nocollapse */ CallInfoComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: CallInfoComponent, deps: [{ token: i1.Router }, { token: i1.ActivatedRoute }, { token: i2.CommanServiceService }, { token: i3.ToastrService }, { token: i4.NgxSpinnerService }, { token: i5.GlobleEnvService }], target: i0.ɵɵFactoryTarget.Component });
121
+ /** @nocollapse */ /** @nocollapse */ CallInfoComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: CallInfoComponent, selector: "app-callinfo", ngImport: i0, template: "<div class=\"row\">\r\n <div class=\"form-group\" >\r\n <label class=\"col-md-4 control-label\" style=\"margin-top:10px;text-align: right\"><span style=\"color:red\">*</span> &nbsp;Contact Date\r\n </label>\r\n <div class=\"col-md-6\" style=\"margin-top:10px\">\r\n <div class=\"input-group input-group-sm w-100\">\r\n <input class=\"form-control\" type=\"date\" [(ngModel)]=\"contactDate\" name=\"contactDate\"/>\r\n \r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\" >\r\n <label class=\"col-md-4 control-label\" style=\"margin-top:10px;text-align: right\"><span style=\"color:red\">*</span>&nbsp;Channel / Medium\r\n </label>\r\n <div class=\"col-md-6\" style=\"margin-top:10px\">\r\n <div class=\"input-group input-group-sm w-100\">\r\n <select class=\"form-control\" name=\"medium\" [(ngModel)]=\"medium\" >\r\n <option value=\"\">Select Channel / Medium</option>\r\n <option *ngFor=\"let prp of communictionMode\" [ngValue]=\"prp.k\">{{prp.v}}</option>\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group\" >\r\n <label class=\"col-md-4 control-label\" style=\"margin-top:10px;text-align: right\"><span style=\"color:red\">*</span>&nbsp;Subject\r\n </label>\r\n <div class=\"col-md-6\" style=\"margin-top:10px\">\r\n <div class=\"input-group input-group-sm w-100\">\r\n <input type=\"text\" class=\"form-control\" name=\"subject\" [(ngModel)]=\"subject\">\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"form-group\">\r\n <label class=\"col-md-4 control-label\" style=\"margin-top:10px;text-align: right\"><span style=\"color:red\">*</span>&nbsp;Summary / Topic\r\n </label>\r\n <div class=\"col-md-6\" style=\"margin-top:10px\">\r\n <div class=\"input-group input-group-sm w-100\">\r\n <input type=\"text\" class=\"form-control\" name=\"summary\" [(ngModel)]=\"summary\">\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <label class=\"col-md-4 control-label\" style=\"margin-top:10px;text-align: right\">Detail\r\n </label>\r\n <div class=\"col-md-6\" style=\"margin-top:10px\">\r\n <div class=\"input-group input-group-sm w-100\">\r\n <textarea class=\"form-control\" name=\"detail\" [(ngModel)]=\"detail\">\r\n </textarea>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n\r\n <div class=\"form-group\"><div class=\"col-md-12\" style=\"margin-top:10px;;text-align: center\">\r\n <button class=\"btn btn-success\" \r\n appAppNoDblClick (click)=\"SaveCallInfo()\">Save Changes</button>\r\n </div></div>\r\n</div>\r\n", styles: [""], directives: [{ type: i6.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: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i6.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i6.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i6.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i8.AppNoDblClickDirective, selector: "[appAppNoDblClick]" }] });
122
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: CallInfoComponent, decorators: [{
123
+ type: Component,
124
+ args: [{ selector: 'app-callinfo', template: "<div class=\"row\">\r\n <div class=\"form-group\" >\r\n <label class=\"col-md-4 control-label\" style=\"margin-top:10px;text-align: right\"><span style=\"color:red\">*</span> &nbsp;Contact Date\r\n </label>\r\n <div class=\"col-md-6\" style=\"margin-top:10px\">\r\n <div class=\"input-group input-group-sm w-100\">\r\n <input class=\"form-control\" type=\"date\" [(ngModel)]=\"contactDate\" name=\"contactDate\"/>\r\n \r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\" >\r\n <label class=\"col-md-4 control-label\" style=\"margin-top:10px;text-align: right\"><span style=\"color:red\">*</span>&nbsp;Channel / Medium\r\n </label>\r\n <div class=\"col-md-6\" style=\"margin-top:10px\">\r\n <div class=\"input-group input-group-sm w-100\">\r\n <select class=\"form-control\" name=\"medium\" [(ngModel)]=\"medium\" >\r\n <option value=\"\">Select Channel / Medium</option>\r\n <option *ngFor=\"let prp of communictionMode\" [ngValue]=\"prp.k\">{{prp.v}}</option>\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group\" >\r\n <label class=\"col-md-4 control-label\" style=\"margin-top:10px;text-align: right\"><span style=\"color:red\">*</span>&nbsp;Subject\r\n </label>\r\n <div class=\"col-md-6\" style=\"margin-top:10px\">\r\n <div class=\"input-group input-group-sm w-100\">\r\n <input type=\"text\" class=\"form-control\" name=\"subject\" [(ngModel)]=\"subject\">\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"form-group\">\r\n <label class=\"col-md-4 control-label\" style=\"margin-top:10px;text-align: right\"><span style=\"color:red\">*</span>&nbsp;Summary / Topic\r\n </label>\r\n <div class=\"col-md-6\" style=\"margin-top:10px\">\r\n <div class=\"input-group input-group-sm w-100\">\r\n <input type=\"text\" class=\"form-control\" name=\"summary\" [(ngModel)]=\"summary\">\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <label class=\"col-md-4 control-label\" style=\"margin-top:10px;text-align: right\">Detail\r\n </label>\r\n <div class=\"col-md-6\" style=\"margin-top:10px\">\r\n <div class=\"input-group input-group-sm w-100\">\r\n <textarea class=\"form-control\" name=\"detail\" [(ngModel)]=\"detail\">\r\n </textarea>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n\r\n <div class=\"form-group\"><div class=\"col-md-12\" style=\"margin-top:10px;;text-align: center\">\r\n <button class=\"btn btn-success\" \r\n appAppNoDblClick (click)=\"SaveCallInfo()\">Save Changes</button>\r\n </div></div>\r\n</div>\r\n", styles: [""] }]
125
+ }], ctorParameters: function () { return [{ type: i1.Router }, { type: i1.ActivatedRoute }, { type: i2.CommanServiceService }, { type: i3.ToastrService }, { type: i4.NgxSpinnerService }, { type: i5.GlobleEnvService }]; } });
126
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsbGluZm8uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXpsaWIvc3JjL2xpYi9jYWxsLWluZm8vY2FsbGluZm8uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXpsaWIvc3JjL2xpYi9jYWxsLWluZm8vY2FsbGluZm8uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBVSxNQUFNLGlCQUFpQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxXQUFXLEVBQUcsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNoRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxhQUFhLENBQUM7Ozs7Ozs7Ozs7QUFPaEQsTUFBTSxPQUFPLGlCQUFpQjtJQUU1QixZQUNTLE1BQWMsRUFDYixLQUFxQixFQUNyQixFQUF3QixFQUN4QixNQUFxQixFQUNyQixjQUFpQyxFQUNqQyxRQUEwQjtRQUwzQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2IsVUFBSyxHQUFMLEtBQUssQ0FBZ0I7UUFDckIsT0FBRSxHQUFGLEVBQUUsQ0FBc0I7UUFDeEIsV0FBTSxHQUFOLE1BQU0sQ0FBZTtRQUNyQixtQkFBYyxHQUFkLGNBQWMsQ0FBbUI7UUFDakMsYUFBUSxHQUFSLFFBQVEsQ0FBa0I7UUFJcEMscUJBQWdCLEdBQUMsRUFBRSxDQUFDO0lBSGhCLENBQUM7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Q3BCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNqQyxDQUFDLENBQUMsQ0FBQztTQUNGO0lBQ0QsQ0FBQzs7b0pBdEhVLGlCQUFpQjt3SUFBakIsaUJBQWlCLG9EQ2Q5Qix3M0ZBK0RBOzJGRGpEYSxpQkFBaUI7a0JBTDdCLFNBQVM7K0JBQ0UsY0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFJvdXRlciwgQWN0aXZhdGVkUm91dGUsIFBhcmFtcyB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IEh0dHBIZWFkZXJzICB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgVG9hc3RyU2VydmljZSB9IGZyb20gJ25neC10b2FzdHInO1xyXG5pbXBvcnQgeyBDb29raWUgfSBmcm9tICduZzItY29va2llcy9uZzItY29va2llcyc7XHJcbmltcG9ydCB7IENvbW1hblNlcnZpY2VTZXJ2aWNlIH0gZnJvbSAnLi4vY29tbWFuLXNlcnZpY2UvY29tbWFuLXNlcnZpY2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IEdsb2JsZUVudlNlcnZpY2UgfSBmcm9tICcuLi9nbG9ibGUvZ2xvYmxlLWVudi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTmd4U3Bpbm5lclNlcnZpY2UgfSBmcm9tIFwibmd4LXNwaW5uZXJcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLWNhbGxpbmZvJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vY2FsbGluZm8uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2NhbGxpbmZvLmNvbXBvbmVudC5jc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ2FsbEluZm9Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgcHJpdmF0ZSBjczogQ29tbWFuU2VydmljZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRvYXN0cjogVG9hc3RyU2VydmljZSxcclxuICAgIHByaXZhdGUgc3Bpbm5lclNlcnZpY2U6IE5neFNwaW5uZXJTZXJ2aWNlICxcclxuICAgIHByaXZhdGUgZ2xvYmxFbnY6IEdsb2JsZUVudlNlcnZpY2VcclxuICApIHsgfVxyXG5cclxuICBoZWFkZXI7XHJcbiAgY29tbXVuaWN0aW9uTW9kZT1bXTtcclxuICBjb250YWN0RGF0ZTtcclxuICBtZWRpdW07XHJcbiAgc3ViamVjdDtcclxuICBzdW1tYXJ5O1xyXG4gIGRldGFpbDtcclxuICBlbXBfaWRuO1xyXG4gIG5tZV9pZG47XHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICBsZXQgbWRsayA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ21kbEtleScpKTtcclxuICAgIGxldCBtZGxLZXkgPSBPYmplY3Qua2V5cyhtZGxrKTtcclxuICAgIGxldCBjVXJsID0gdGhpcy5yb3V0ZXIudXJsO1xyXG4gICAgdGhpcy5oZWFkZXIgPSB7XHJcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICdjbGllbnRrZXknOiBDb29raWUuZ2V0KCdfY2snKSxcclxuICAgICAgJ21vZHVsZWtleSc6bWRsa1tjVXJsLnNwbGl0KCcvJylbMV1dLFxyXG4gICAgICAnbG9naW5pZCc6IENvb2tpZS5nZXQoJ19sb2dpZCcpLFxyXG4gICAgICAnc291cmNlJzogJ3FzJ1xyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLnJvdXRlLnBhcmFtcy5zdWJzY3JpYmUoKHBhcmFtczogUGFyYW1zKSA9PiB7XHJcbiAgICAgICAgIHRoaXMubG9hZENhbGxJbmZvKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGxvYWRDYWxsSW5mbygpe1xyXG4gICAgdGhpcy5zcGlubmVyU2VydmljZS5zaG93KCk7XHJcbiAgICBsZXQgcmVxT2JqID0ge307XHJcbiAgICByZXFPYmpbJ2Zvcm1ObWUnXSA9IHRoaXMucm91dGUuc25hcHNob3QucGFyYW1zWydmcm1ubWUnXTtcclxuICAgIHRoaXMuaGVhZGVyWydtZXRob2QnXSA9ICdsb2FkQ29tbXVuaWNhdGlvbkxvZ0Zvcm0nO1xyXG4gICAgbGV0IG9wdGlvbnMgPSAoeyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnModGhpcy5oZWFkZXIpIH0pO1xyXG4gICAgdGhpcy5jcy5sb2FkKHJlcU9iaiwgb3B0aW9ucywgJ21hcmtldGluZy90cmFuc2FjdGlvbicpLnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgIGlmKHJlc3BvbnNlLnN0YXR1cyA9PSAnU1VDQ0VTUycpIHtcclxuICAgICAgbGV0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdHx8e307XHJcbiAgICAgIHRoaXMuY29tbXVuaWN0aW9uTW9kZT1yZXN1bHQuY29tbXVuaWNhdGlvbk1lZGl1bUxpc3R8fFtdO1xyXG4gICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICB0aGlzLnRvYXN0ci5lcnJvcihyZXNwb25zZS5tZXNzYWdlKTtcclxuICAgIH1cclxuICB9KS5jYXRjaCgoZXJyOiBhbnkpID0+IHtcclxuICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgdGhpcy50b2FzdHIuZXJyb3IoZXJyLm1lc3NhZ2UpO1xyXG4gIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIFNhdmVDYWxsSW5mbygpe1xyXG4gICAgdGhpcy5jb250YWN0RGF0ZT10aGlzLmNvbnRhY3REYXRlfHwnJztcclxuICAgIHRoaXMubWVkaXVtID0gIHRoaXMubWVkaXVtfHwnJztcclxuICAgIHRoaXMuc3ViamVjdD10aGlzLnN1YmplY3R8fCcnO1xyXG4gICAgdGhpcy5zdW1tYXJ5PXRoaXMuc3VtbWFyeXx8Jyc7XHJcbiAgICB0aGlzLmRldGFpbD10aGlzLmRldGFpbHx8Jyc7XHJcbiAgICBsZXQgaXNWYWxpZCA9IHRydWU7XHJcbiAgICBpZih0aGlzLmNvbnRhY3REYXRlPT0nJyl7XHJcbiAgICAgIHRoaXMudG9hc3RyLmVycm9yKFwiUGxlYXNlIHNwZWNpZnkgQ29udGFjdERhdGVcIik7XHJcbiAgICAgICBpc1ZhbGlkID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYodGhpcy5tZWRpdW09PScnKXtcclxuICAgICAgdGhpcy50b2FzdHIuZXJyb3IoXCJQbGVhc2Ugc3BlY2lmeSBNZWRpdW1cIik7XHJcbiAgICAgICBpc1ZhbGlkID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYodGhpcy5zdWJqZWN0PT0nJyl7XHJcbiAgICAgIHRoaXMudG9hc3RyLmVycm9yKFwiUGxlYXNlIHNwZWNpZnkgc3ViamVjdFwiKTtcclxuICAgICAgIGlzVmFsaWQgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIGlmKHRoaXMuc3VtbWFyeT09Jycpe1xyXG4gICAgICB0aGlzLnRvYXN0ci5lcnJvcihcIlBsZWFzZSBzcGVjaWZ5IHN1bW1hcnlcIik7XHJcbiAgICAgICBpc1ZhbGlkID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBpZihpc1ZhbGlkKXtcclxuXHJcbiAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLnNob3coKTtcclxuICAgIGxldCByZXFPYmogPSB7fTtcclxuICAgIHJlcU9ialsnZm9ybU5tZSddID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5wYXJhbXNbJ2ZybW5tZSddO1xyXG4gICAgcmVxT2JqWydlbXBfaWRuJ10gPSB0aGlzLmVtcF9pZG47XHJcbiAgICByZXFPYmpbJ25tZV9pZG4nXSA9IHRoaXMubm1lX2lkbjtcclxuICAgIHJlcU9ialsnbG9nX3RzJ10gPSB0aGlzLmNzLmZvcm1hdERhdGUodGhpcy5jb250YWN0RGF0ZSk7XHJcbiAgICByZXFPYmpbJ2F1dG9feW4nXSA9XCIwXCJcclxuICAgIHJlcU9ialsnY2hhbm5lbCddID0gdGhpcy5tZWRpdW07XHJcbiAgICByZXFPYmpbJ3N1YmplY3QnXSA9IHRoaXMuc3ViamVjdDtcclxuICAgIHJlcU9ialsnc3VtbWFyeSddID0gdGhpcy5zdW1tYXJ5O1xyXG4gICAgcmVxT2JqWydkZXRhaWxzJ10gPSB0aGlzLmRldGFpbDtcclxuICAgIHJlcU9ialsncHZ0J109MDtcclxuICAgIHJlcU9ialsnYXR0ck1hcCddPXt9O1xyXG4gICAgcmVxT2JqWydyZWNpcGllbnRMaXN0TWFwJ109e307XHJcblxyXG4gICAgdGhpcy5oZWFkZXJbJ21ldGhvZCddID0gJ3NhdmVNYWlsTG9nRGV0YWlscyc7XHJcblxyXG4gICAgbGV0IG9wdGlvbnMgPSAoeyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnModGhpcy5oZWFkZXIpIH0pO1xyXG4gICAgdGhpcy5jcy5sb2FkKHJlcU9iaiwgb3B0aW9ucywgJ21hcmtldGluZy90cmFuc2FjdGlvbicpLnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgIGlmKHJlc3BvbnNlLnN0YXR1cyA9PSAnU1VDQ0VTUycpIHtcclxuICAgICAgbGV0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdHx8e307XHJcblxyXG4gICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICB0aGlzLnRvYXN0ci5lcnJvcihyZXNwb25zZS5tZXNzYWdlKTtcclxuICAgIH1cclxuICB9KS5jYXRjaCgoZXJyOiBhbnkpID0+IHtcclxuICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgdGhpcy50b2FzdHIuZXJyb3IoZXJyLm1lc3NhZ2UpO1xyXG4gIH0pO1xyXG4gIH1cclxuICB9XHJcblxyXG5cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiID5cclxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtbWQtNCBjb250cm9sLWxhYmVsXCIgc3R5bGU9XCJtYXJnaW4tdG9wOjEwcHg7dGV4dC1hbGlnbjogcmlnaHRcIj48c3BhbiBzdHlsZT1cImNvbG9yOnJlZFwiPio8L3NwYW4+ICZuYnNwO0NvbnRhY3QgRGF0ZVxyXG4gICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCIgc3R5bGU9XCJtYXJnaW4tdG9wOjEwcHhcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCBpbnB1dC1ncm91cC1zbSAgdy0xMDBcIj5cclxuICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiB0eXBlPVwiZGF0ZVwiIFsobmdNb2RlbCldPVwiY29udGFjdERhdGVcIiBuYW1lPVwiY29udGFjdERhdGVcIi8+XHJcbiAgICAgICAgICAgICAgXHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiID5cclxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1tZC00IGNvbnRyb2wtbGFiZWxcIiBzdHlsZT1cIm1hcmdpbi10b3A6MTBweDt0ZXh0LWFsaWduOiByaWdodFwiPjxzcGFuIHN0eWxlPVwiY29sb3I6cmVkXCI+Kjwvc3Bhbj4mbmJzcDtDaGFubmVsIC8gTWVkaXVtXHJcbiAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCIgc3R5bGU9XCJtYXJnaW4tdG9wOjEwcHhcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIGlucHV0LWdyb3VwLXNtICB3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tY29udHJvbFwiIG5hbWU9XCJtZWRpdW1cIiBbKG5nTW9kZWwpXT1cIm1lZGl1bVwiID5cclxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+U2VsZWN0IENoYW5uZWwgLyBNZWRpdW08L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBwcnAgb2YgY29tbXVuaWN0aW9uTW9kZVwiIFtuZ1ZhbHVlXT1cInBycC5rXCI+e3twcnAudn19PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICA8L2Rpdj5cclxuXHJcbiAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIiA+XHJcbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLW1kLTQgY29udHJvbC1sYWJlbFwiIHN0eWxlPVwibWFyZ2luLXRvcDoxMHB4O3RleHQtYWxpZ246IHJpZ2h0XCI+PHNwYW4gc3R5bGU9XCJjb2xvcjpyZWRcIj4qPC9zcGFuPiZuYnNwO1N1YmplY3RcclxuICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiIHN0eWxlPVwibWFyZ2luLXRvcDoxMHB4XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgaW5wdXQtZ3JvdXAtc20gIHctMTAwXCI+XHJcbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBuYW1lPVwic3ViamVjdFwiIFsobmdNb2RlbCldPVwic3ViamVjdFwiPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cclxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtbWQtNCBjb250cm9sLWxhYmVsXCIgc3R5bGU9XCJtYXJnaW4tdG9wOjEwcHg7dGV4dC1hbGlnbjogcmlnaHRcIj48c3BhbiBzdHlsZT1cImNvbG9yOnJlZFwiPio8L3NwYW4+Jm5ic3A7U3VtbWFyeSAvIFRvcGljXHJcbiAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIiBzdHlsZT1cIm1hcmdpbi10b3A6MTBweFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIGlucHV0LWdyb3VwLXNtICB3LTEwMFwiPlxyXG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgbmFtZT1cInN1bW1hcnlcIiBbKG5nTW9kZWwpXT1cInN1bW1hcnlcIj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cclxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtbWQtNCBjb250cm9sLWxhYmVsXCIgc3R5bGU9XCJtYXJnaW4tdG9wOjEwcHg7dGV4dC1hbGlnbjogcmlnaHRcIj5EZXRhaWxcclxuICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiIHN0eWxlPVwibWFyZ2luLXRvcDoxMHB4XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgaW5wdXQtZ3JvdXAtc20gIHctMTAwXCI+XHJcbiAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgbmFtZT1cImRldGFpbFwiIFsobmdNb2RlbCldPVwiZGV0YWlsXCI+XHJcbiAgICAgICAgICAgICAgICA8L3RleHRhcmVhPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcblxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+PGRpdiAgY2xhc3M9XCJjb2wtbWQtMTJcIiBzdHlsZT1cIm1hcmdpbi10b3A6MTBweDs7dGV4dC1hbGlnbjogY2VudGVyXCI+XHJcbiAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zdWNjZXNzXCIgXHJcbiAgICBhcHBBcHBOb0RibENsaWNrIChjbGljayk9XCJTYXZlQ2FsbEluZm8oKVwiPlNhdmUgQ2hhbmdlczwvYnV0dG9uPlxyXG4gICAgPC9kaXY+PC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=