@croeminc/croem-card-widget 0.6.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Constants.d.ts +8 -0
- package/README.md +125 -0
- package/esm2020/Constants.mjs +9 -0
- package/esm2020/croeminc-croem-card-widget.mjs +5 -0
- package/esm2020/lib/card-widget/Add-card-widget/add-card-widget/add-card-widget.component.mjs +195 -0
- package/esm2020/lib/card-widget/Pay-card-widget/payment-card-widget/payment-card-widget.component.mjs +149 -0
- package/esm2020/lib/card-widget/Update-card-widget/update-card-widget/update-card-widget.component.mjs +267 -0
- package/esm2020/lib/croem-card-widget.component.mjs +77 -0
- package/esm2020/lib/croem-card-widget.module.mjs +48 -0
- package/esm2020/lib/croem-card-widget.service.mjs +62 -0
- package/esm2020/lib/dynamic-form-builder/dynamic-form-fields/dropdown.mjs +32 -0
- package/esm2020/lib/dynamic-form-builder/dynamic-form-fields/textbox.mjs +21 -0
- package/esm2020/lib/dynamic-form-builder/field-builder.component.mjs +24 -0
- package/esm2020/lib/dynamic-form-builder/interfaces/CardModeEnum.mjs +7 -0
- package/esm2020/lib/dynamic-form-builder/interfaces/FormFields.Interface.mjs +2 -0
- package/esm2020/lib/dynamic-form-builder/interfaces/InputParams.Interface.mjs +2 -0
- package/esm2020/lib/dynamic-form-builder/interfaces/apiResponse.Interface.mjs +2 -0
- package/esm2020/lib/localizations/en.mjs +16 -0
- package/esm2020/lib/localizations/es.mjs +16 -0
- package/esm2020/lib/localizations/language.interface.mjs +2 -0
- package/esm2020/public-api.mjs +11 -0
- package/fesm2015/croeminc-croem-card-widget.mjs +876 -0
- package/fesm2015/croeminc-croem-card-widget.mjs.map +1 -0
- package/fesm2020/croeminc-croem-card-widget.mjs +868 -0
- package/fesm2020/croeminc-croem-card-widget.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/card-widget/Add-card-widget/add-card-widget/add-card-widget.component.d.ts +61 -0
- package/lib/card-widget/Pay-card-widget/payment-card-widget/payment-card-widget.component.d.ts +43 -0
- package/lib/card-widget/Update-card-widget/update-card-widget/update-card-widget.component.d.ts +64 -0
- package/lib/croem-card-widget.component.d.ts +49 -0
- package/lib/croem-card-widget.module.d.ts +16 -0
- package/lib/croem-card-widget.service.d.ts +11 -0
- package/lib/dynamic-form-builder/dynamic-form-fields/dropdown.d.ts +19 -0
- package/lib/dynamic-form-builder/dynamic-form-fields/textbox.d.ts +12 -0
- package/lib/dynamic-form-builder/field-builder.component.d.ts +14 -0
- package/lib/dynamic-form-builder/interfaces/CardModeEnum.d.ts +5 -0
- package/lib/dynamic-form-builder/interfaces/FormFields.Interface.d.ts +14 -0
- package/lib/dynamic-form-builder/interfaces/InputParams.Interface.d.ts +17 -0
- package/lib/dynamic-form-builder/interfaces/apiResponse.Interface.d.ts +24 -0
- package/lib/localizations/en.d.ts +2 -0
- package/lib/localizations/es.d.ts +2 -0
- package/lib/localizations/language.interface.d.ts +15 -0
- package/package.json +48 -0
- package/public-api.d.ts +7 -0
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
+
import * as cardValidator from "card-validator";
|
|
3
|
+
import { FormControl, FormGroup, Validators } from '@angular/forms';
|
|
4
|
+
import { LANG_EN } from '../../../localizations/en';
|
|
5
|
+
import { LANG_ES } from '../../../localizations/es';
|
|
6
|
+
import { constants } from '../../../../Constants';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
import * as i1 from "@angular/forms";
|
|
9
|
+
import * as i2 from "../../../croem-card-widget.service";
|
|
10
|
+
import * as i3 from "@angular/common";
|
|
11
|
+
import * as i4 from "../../../dynamic-form-builder/field-builder.component";
|
|
12
|
+
export class PaymentCardWidgetComponent {
|
|
13
|
+
constructor(formBuilder, croemCardService) {
|
|
14
|
+
this.formBuilder = formBuilder;
|
|
15
|
+
this.croemCardService = croemCardService;
|
|
16
|
+
this.widgetResponseEmitter = new EventEmitter();
|
|
17
|
+
this.fieldResponseEmitter = new EventEmitter();
|
|
18
|
+
this.loader = new EventEmitter();
|
|
19
|
+
this.HandleError = new EventEmitter();
|
|
20
|
+
this.fields = [];
|
|
21
|
+
this.dynamicFields = {};
|
|
22
|
+
this.showCVVPrepend = false;
|
|
23
|
+
this.showInputError = true;
|
|
24
|
+
}
|
|
25
|
+
ngOnInit() {
|
|
26
|
+
this.switchLanguage(this.inputParamsForWidgetForPayment.Culture);
|
|
27
|
+
//---Dynamic Form creation innitializing form group(i.e cardForm) to pass onto the dynamic form builder component ------
|
|
28
|
+
for (const field of this.fields) {
|
|
29
|
+
const validators = [];
|
|
30
|
+
if (field.required) {
|
|
31
|
+
validators.push(Validators.required);
|
|
32
|
+
}
|
|
33
|
+
this.dynamicFields[field.name] = [field.value || null, validators];
|
|
34
|
+
}
|
|
35
|
+
const predefinedControls = {
|
|
36
|
+
cvv: ['', [Validators.required, Validators.maxLength(4)]]
|
|
37
|
+
};
|
|
38
|
+
this.cardForm = this.formBuilder.group({
|
|
39
|
+
...predefinedControls,
|
|
40
|
+
...this.dynamicFields
|
|
41
|
+
});
|
|
42
|
+
let fieldsContrls = {};
|
|
43
|
+
for (let f of this.fields) {
|
|
44
|
+
if (f.type !== 'checkbox') {
|
|
45
|
+
fieldsContrls[f.name] = new FormControl(f.value || '', Validators.required);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
let opts = {};
|
|
49
|
+
if (f.options) {
|
|
50
|
+
for (let opt of f.options) {
|
|
51
|
+
opts[opt.key] = new FormControl(opt.label);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
fieldsContrls[f.name] = new FormGroup(opts);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
makePayment() {
|
|
59
|
+
this.makeTransactionWithToken();
|
|
60
|
+
}
|
|
61
|
+
switchLanguage(language) {
|
|
62
|
+
if (language === 'en') {
|
|
63
|
+
this.currentLang = LANG_EN;
|
|
64
|
+
}
|
|
65
|
+
else if (language === 'es') {
|
|
66
|
+
this.currentLang = LANG_ES;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
async makeTransactionWithToken() {
|
|
70
|
+
try {
|
|
71
|
+
this.showLoader = true;
|
|
72
|
+
this.loader.emit(this.showLoader);
|
|
73
|
+
const apiUrl = this.inputParamsForWidgetForPayment.DtrUrl + constants.urls.paymentDTRUrl;
|
|
74
|
+
//----encryption-------
|
|
75
|
+
var encode = this.encoding(); //--encoding parameters
|
|
76
|
+
this.encryptedString = this.innitializeKey(encode); //--innitializing DSA key
|
|
77
|
+
//-----request--------
|
|
78
|
+
this.paidCardResponse = await this.croemCardService.CardPayment(this.inputParamsForWidgetForPayment, this.inputParamsForWidgetForPayment.Culture, apiUrl, this.encryptedString); //--API Call to make sale through cardToken in DTR
|
|
79
|
+
this.showLoader = false;
|
|
80
|
+
this.fieldResponseEmitter.emit(this.cardForm.controls); //emmiting controls
|
|
81
|
+
this.widgetResponseEmitter.emit(this.paidCardResponse); // emitting response
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
console.log(error);
|
|
85
|
+
this.showLoader = false;
|
|
86
|
+
this.widgetResponseEmitter.emit(this.paidCardResponse);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
encoding() {
|
|
90
|
+
return "" + "\\" +
|
|
91
|
+
"" + "\\" +
|
|
92
|
+
"" + "\\" +
|
|
93
|
+
"" + "\\" +
|
|
94
|
+
this.inputParamsForWidgetForPayment.Token + "\\" +
|
|
95
|
+
"" + "\\" +
|
|
96
|
+
this.inputParamsForWidgetForPayment.APIKey + "\\" +
|
|
97
|
+
this.inputParamsForWidgetForPayment.Culture + "\\" +
|
|
98
|
+
this.cardForm.value.cvv + "\\" +
|
|
99
|
+
this.inputParamsForWidgetForPayment.IsSale + "\\" +
|
|
100
|
+
this.inputParamsForWidgetForPayment.Amount + "\\" +
|
|
101
|
+
this.inputParamsForWidgetForPayment.ProductDetails + "\\" +
|
|
102
|
+
"" + "\\" +
|
|
103
|
+
"" + "\\" +
|
|
104
|
+
this.inputParamsForWidgetForPayment.Itbms + "\\" +
|
|
105
|
+
"";
|
|
106
|
+
}
|
|
107
|
+
innitializeKey(encode) {
|
|
108
|
+
var key = initializeKey(this.inputParamsForWidgetForPayment.Keys.EncKey1, this.inputParamsForWidgetForPayment.Keys.EncKey2);
|
|
109
|
+
return encryptedString(key, encode);
|
|
110
|
+
}
|
|
111
|
+
bindCVV(event) {
|
|
112
|
+
const inputElement = event.target;
|
|
113
|
+
const numericValue = inputElement.value.replace(/\D/g, ''); // Remove non-numeric characters
|
|
114
|
+
this.cvv = numericValue; // Update form control value
|
|
115
|
+
inputElement.value = numericValue; // Update input value to remove non-numeric characters
|
|
116
|
+
this.validateCvv();
|
|
117
|
+
}
|
|
118
|
+
validateCvv() {
|
|
119
|
+
this.showCVVPrepend = false;
|
|
120
|
+
if (cardValidator.cvv(this.cvv, 4).isValid || cardValidator.cvv(this.cvv).isValid) {
|
|
121
|
+
this.showInputError = true;
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
this.showInputError = false;
|
|
125
|
+
}
|
|
126
|
+
if (this.cvv) {
|
|
127
|
+
this.showCVVPrepend = true;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
PaymentCardWidgetComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: PaymentCardWidgetComponent, deps: [{ token: i1.FormBuilder }, { token: i2.CroemCardWidgetService }], target: i0.ɵɵFactoryTarget.Component });
|
|
132
|
+
PaymentCardWidgetComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: PaymentCardWidgetComponent, selector: "lib-payment-card-widget", inputs: { inputParamsForWidgetForPayment: "inputParamsForWidgetForPayment", fields: "fields" }, outputs: { widgetResponseEmitter: "widgetResponseEmitter", fieldResponseEmitter: "fieldResponseEmitter", loader: "loader", HandleError: "HandleError" }, ngImport: i0, template: "<form class=\"container-fluid py-3\" [formGroup]=\"cardForm\" *ngIf=\"(inputParamsForWidgetForPayment.APIKey)\">\r\n <div class=\"p-0\">\r\n <!-- Dynamic Form Fields -->\r\n <div class=\"dynamic-fields-container mb-3\">\r\n <div *ngFor=\"let field of fields\" class=\"mb-3\">\r\n <field-builder [field]=\"field\" [form]=\"cardForm\"></field-builder>\r\n </div>\r\n </div>\r\n\r\n <!-- CVV and Proceed Fields -->\r\n <div class=\"payment-fields-custom\">\r\n <div class=\"row align-items-end\">\r\n <div class=\"col-12 mb-3 mb-md-0\">\r\n <div class=\"form-group-custom\">\r\n <label for=\"cvv\" class=\"form-label-custom\">\r\n {{currentLang[\"CVV\"]}} <span class=\"text-danger\">*</span>\r\n </label>\r\n <div class=\"input-wrapper cvv-wrapper\">\r\n <input class=\"form-control-custom\" type=\"password\" id=\"cvv\" [class.inputError]=\"!showInputError\"\r\n placeholder=\"CVV\" pattern=\"[0-9]*\" formControlName=\"cvv\" (input)=\"bindCVV($event)\" minlength=\"3\"\r\n maxlength=\"4\" />\r\n <span *ngIf=\"!showCVVPrepend\" class=\"cvv-icon\"></span>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-12\">\r\n <button class=\"btn-submit-custom w-100 py-3\" type=\"submit\" [disabled]=\"!cardForm.valid\" (click)=\"makePayment()\">\r\n <span class=\"btn-text\">{{currentLang[\"Proceed\"]}}</span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</form>\r\n", styles: [".form-group-custom{display:flex;flex-direction:column;margin-bottom:12px}.form-label-custom{font-size:13px;font-weight:600;color:#374151;margin-bottom:6px;letter-spacing:.2px}.input-wrapper{position:relative;width:100%}.form-control-custom{width:100%;background-color:#f9fafb;border:1px solid #d1d5db;border-radius:8px;padding:10px 14px;font-size:14px;color:#1f2937;transition:all .2s ease-in-out;box-shadow:inset 0 1px 2px #00000005}.form-control-custom:focus{background-color:#fff;border-color:#4f46e5;box-shadow:0 0 0 3px #4f46e51f;outline:none}.inputError,.inputError:focus{border-color:#ef4444!important;box-shadow:0 0 0 3px #ef44441f!important}.cvv-wrapper{display:flex;align-items:center}.cvv-icon{width:20px;height:20px;position:absolute;right:12px;pointer-events:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='%239ca3af'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z'/%3E%3C/svg%3E\");background-repeat:no-repeat;background-size:contain}.btn-submit-custom{background:#5A75B6;border:solid 2px #5A75B6;color:#fff;padding:10px 20px;font-weight:600;font-size:14px;border-radius:8px;transition:all .2s ease-in-out;box-shadow:0 4px 10px #5a75b640;cursor:pointer;display:inline-flex;align-items:center;justify-content:center}.btn-submit-custom:hover:not(:disabled){transform:translateY(-1px);box-shadow:0 6px 14px #5a75b659;background:#3E578E;border-color:#3e578e}.btn-submit-custom:active:not(:disabled){transform:translateY(0)}.btn-submit-custom:disabled{background:#ecebeb!important;border:solid 2px #ecebeb!important;color:#9c9c9c!important;cursor:not-allowed;box-shadow:none}\n"], dependencies: [{ kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.MinLengthValidator, selector: "[minlength][formControlName],[minlength][formControl],[minlength][ngModel]", inputs: ["minlength"] }, { kind: "directive", type: i1.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i1.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.FieldBuilderComponent, selector: "field-builder", inputs: ["field", "form"] }] });
|
|
133
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: PaymentCardWidgetComponent, decorators: [{
|
|
134
|
+
type: Component,
|
|
135
|
+
args: [{ selector: 'lib-payment-card-widget', template: "<form class=\"container-fluid py-3\" [formGroup]=\"cardForm\" *ngIf=\"(inputParamsForWidgetForPayment.APIKey)\">\r\n <div class=\"p-0\">\r\n <!-- Dynamic Form Fields -->\r\n <div class=\"dynamic-fields-container mb-3\">\r\n <div *ngFor=\"let field of fields\" class=\"mb-3\">\r\n <field-builder [field]=\"field\" [form]=\"cardForm\"></field-builder>\r\n </div>\r\n </div>\r\n\r\n <!-- CVV and Proceed Fields -->\r\n <div class=\"payment-fields-custom\">\r\n <div class=\"row align-items-end\">\r\n <div class=\"col-12 mb-3 mb-md-0\">\r\n <div class=\"form-group-custom\">\r\n <label for=\"cvv\" class=\"form-label-custom\">\r\n {{currentLang[\"CVV\"]}} <span class=\"text-danger\">*</span>\r\n </label>\r\n <div class=\"input-wrapper cvv-wrapper\">\r\n <input class=\"form-control-custom\" type=\"password\" id=\"cvv\" [class.inputError]=\"!showInputError\"\r\n placeholder=\"CVV\" pattern=\"[0-9]*\" formControlName=\"cvv\" (input)=\"bindCVV($event)\" minlength=\"3\"\r\n maxlength=\"4\" />\r\n <span *ngIf=\"!showCVVPrepend\" class=\"cvv-icon\"></span>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-12\">\r\n <button class=\"btn-submit-custom w-100 py-3\" type=\"submit\" [disabled]=\"!cardForm.valid\" (click)=\"makePayment()\">\r\n <span class=\"btn-text\">{{currentLang[\"Proceed\"]}}</span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</form>\r\n", styles: [".form-group-custom{display:flex;flex-direction:column;margin-bottom:12px}.form-label-custom{font-size:13px;font-weight:600;color:#374151;margin-bottom:6px;letter-spacing:.2px}.input-wrapper{position:relative;width:100%}.form-control-custom{width:100%;background-color:#f9fafb;border:1px solid #d1d5db;border-radius:8px;padding:10px 14px;font-size:14px;color:#1f2937;transition:all .2s ease-in-out;box-shadow:inset 0 1px 2px #00000005}.form-control-custom:focus{background-color:#fff;border-color:#4f46e5;box-shadow:0 0 0 3px #4f46e51f;outline:none}.inputError,.inputError:focus{border-color:#ef4444!important;box-shadow:0 0 0 3px #ef44441f!important}.cvv-wrapper{display:flex;align-items:center}.cvv-icon{width:20px;height:20px;position:absolute;right:12px;pointer-events:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='%239ca3af'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z'/%3E%3C/svg%3E\");background-repeat:no-repeat;background-size:contain}.btn-submit-custom{background:#5A75B6;border:solid 2px #5A75B6;color:#fff;padding:10px 20px;font-weight:600;font-size:14px;border-radius:8px;transition:all .2s ease-in-out;box-shadow:0 4px 10px #5a75b640;cursor:pointer;display:inline-flex;align-items:center;justify-content:center}.btn-submit-custom:hover:not(:disabled){transform:translateY(-1px);box-shadow:0 6px 14px #5a75b659;background:#3E578E;border-color:#3e578e}.btn-submit-custom:active:not(:disabled){transform:translateY(0)}.btn-submit-custom:disabled{background:#ecebeb!important;border:solid 2px #ecebeb!important;color:#9c9c9c!important;cursor:not-allowed;box-shadow:none}\n"] }]
|
|
136
|
+
}], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i2.CroemCardWidgetService }]; }, propDecorators: { inputParamsForWidgetForPayment: [{
|
|
137
|
+
type: Input
|
|
138
|
+
}], widgetResponseEmitter: [{
|
|
139
|
+
type: Output
|
|
140
|
+
}], fieldResponseEmitter: [{
|
|
141
|
+
type: Output
|
|
142
|
+
}], loader: [{
|
|
143
|
+
type: Output
|
|
144
|
+
}], HandleError: [{
|
|
145
|
+
type: Output
|
|
146
|
+
}], fields: [{
|
|
147
|
+
type: Input
|
|
148
|
+
}] } });
|
|
149
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF5bWVudC1jYXJkLXdpZGdldC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jcm9lbS1jYXJkLXdpZGdldC9zcmMvbGliL2NhcmQtd2lkZ2V0L1BheS1jYXJkLXdpZGdldC9wYXltZW50LWNhcmQtd2lkZ2V0L3BheW1lbnQtY2FyZC13aWRnZXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY3JvZW0tY2FyZC13aWRnZXQvc3JjL2xpYi9jYXJkLXdpZGdldC9QYXktY2FyZC13aWRnZXQvcGF5bWVudC1jYXJkLXdpZGdldC9wYXltZW50LWNhcmQtd2lkZ2V0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkUsT0FBTyxLQUFLLGFBQWEsTUFBTSxnQkFBZ0IsQ0FBQztBQUVoRCxPQUFPLEVBQWdDLFdBQVcsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJbEcsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUVwRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7Ozs7OztBQVNsRCxNQUFNLE9BQU8sMEJBQTBCO0lBb0JyQyxZQUFvQixXQUF3QixFQUFVLGdCQUF3QztRQUExRSxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUFVLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBd0I7UUFsQnBGLDBCQUFxQixHQUFHLElBQUksWUFBWSxFQUF3QixDQUFDO1FBQ2pFLHlCQUFvQixHQUFHLElBQUksWUFBWSxFQUErQyxDQUFDO1FBQ3ZGLFdBQU0sR0FBRyxJ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QWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRTtZQUNqRixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQTtTQUMzQjthQUNJO1lBQ0gsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUE7U0FDNUI7UUFDRCxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDWixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQTtTQUMzQjtJQUNILENBQUM7O3dIQWhKVSwwQkFBMEI7NEdBQTFCLDBCQUEwQix3VENuQnZDLHcxREFrQ0E7NEZEZmEsMEJBQTBCO2tCQUx0QyxTQUFTOytCQUNFLHlCQUF5Qjt1SUFLMUIsOEJBQThCO3NCQUF0QyxLQUFLO2dCQUNJLHFCQUFxQjtzQkFBOUIsTUFBTTtnQkFDRyxvQkFBb0I7c0JBQTdCLE1BQU07Z0JBQ0csTUFBTTtzQkFBZixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0UsTUFBTTtzQkFBZCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0ICogYXMgY2FyZFZhbGlkYXRvciBmcm9tIFwiY2FyZC12YWxpZGF0b3JcIjtcclxuaW1wb3J0IHsgQ3JvZW1DYXJkV2lkZ2V0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2Nyb2VtLWNhcmQtd2lkZ2V0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIEZvcm1CdWlsZGVyLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBGaWVsZHMgfSBmcm9tICcuLi8uLi8uLi9keW5hbWljLWZvcm0tYnVpbGRlci9pbnRlcmZhY2VzL0Zvcm1GaWVsZHMuSW50ZXJmYWNlJztcclxuaW1wb3J0IHsgSW5wdXRQYXJhbXNGb3JXaWRnZXQgfSBmcm9tICcuLi8uLi8uLi9keW5hbWljLWZvcm0tYnVpbGRlci9pbnRlcmZhY2VzL0lucHV0UGFyYW1zLkludGVyZmFjZSc7XHJcbmltcG9ydCB7IGFwaVJlc3BvbnNlSW50ZXJmYWNlIH0gZnJvbSAnLi4vLi4vLi4vZHluYW1pYy1mb3JtLWJ1aWxkZXIvaW50ZXJmYWNlcy9hcGlSZXNwb25zZS5JbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBMQU5HX0VOIH0gZnJvbSAnLi4vLi4vLi4vbG9jYWxpemF0aW9ucy9lbic7XHJcbmltcG9ydCB7IExBTkdfRVMgfSBmcm9tICcuLi8uLi8uLi9sb2NhbGl6YXRpb25zL2VzJztcclxuaW1wb3J0IHsgTGFuZ3VhZ2UgfSBmcm9tICcuLi8uLi8uLi9sb2NhbGl6YXRpb25zL2xhbmd1YWdlLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IGNvbnN0YW50cyB9IGZyb20gJy4uLy4uLy4uLy4uL0NvbnN0YW50cyc7XHJcblxyXG5kZWNsYXJlIGZ1bmN0aW9uIGVuY3J5cHRlZFN0cmluZyhrZXk6IGFueSwgczogYW55KTogc3RyaW5nO1xyXG5kZWNsYXJlIGZ1bmN0aW9uIGluaXRpYWxpemVLZXkoZXhwb25lbnQ6IGFueSwgbW9kdWx1czogYW55KTogYW55O1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1wYXltZW50LWNhcmQtd2lkZ2V0JyxcclxuICB0ZW1wbGF0ZVVybDogJy4vcGF5bWVudC1jYXJkLXdpZGdldC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vcGF5bWVudC1jYXJkLXdpZGdldC5jb21wb25lbnQuY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIFBheW1lbnRDYXJkV2lkZ2V0Q29tcG9uZW50IHtcclxuICBASW5wdXQoKSBpbnB1dFBhcmFtc0ZvcldpZGdldEZvclBheW1lbnQhOiBJbnB1dFBhcmFtc0ZvcldpZGdldDtcclxuICBAT3V0cHV0KCkgd2lkZ2V0UmVzcG9uc2VFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcjxhcGlSZXNwb25zZUludGVyZmFjZT4oKTtcclxuICBAT3V0cHV0KCkgZmllbGRSZXNwb25zZUVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPHsgW3g6IHN0cmluZ106IEFic3RyYWN0Q29udHJvbDxhbnksIGFueT47IH0+KCk7XHJcbiAgQE91dHB1dCgpIGxvYWRlciA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcclxuICBAT3V0cHV0KCkgSGFuZGxlRXJyb3IgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuICBASW5wdXQoKSBmaWVsZHM6IEZpZWxkc1tdID0gW107XHJcblxyXG4gIHBhaWRDYXJkUmVzcG9uc2UhOiBhcGlSZXNwb25zZUludGVyZmFjZTtcclxuICBDcm9lbUNhcmRXaWRnZXRTZXJ2aWNlITogQ3JvZW1DYXJkV2lkZ2V0U2VydmljZTtcclxuICBjYXJkRm9ybSE6IEZvcm1Hcm91cDtcclxuICBkeW5hbWljRmllbGRzOiB7IFtrZXk6IHN0cmluZ106IFthbnksIGFueVtdXSB9ID0ge307XHJcbiAgY3VycmVudExhbmchOiBMYW5ndWFnZTtcclxuXHJcbiAgZW5jcnlwdGVkU3RyaW5nITogc3RyaW5nXHJcbiAgc2hvd0xvYWRlciE6IGJvb2xlYW47XHJcbiAgc2hvd0NWVlByZXBlbmQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBjdnYhOiBzdHJpbmc7XHJcbiAgc2hvd0lucHV0RXJyb3I6IGJvb2xlYW4gPSB0cnVlXHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLCBwcml2YXRlIGNyb2VtQ2FyZFNlcnZpY2U6IENyb2VtQ2FyZFdpZGdldFNlcnZpY2UpIHtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5zd2l0Y2hMYW5ndWFnZSh0aGlzLmlucHV0UGFyYW1zRm9yV2lkZ2V0Rm9yUGF5bWVudC5DdWx0dXJlKTtcclxuXHJcbiAgICAvLy0tLUR5bmFtaWMgRm9ybSBjcmVhdGlvbiBpbm5pdGlhbGl6aW5nIGZvcm0gZ3JvdXAoaS5lIGNhcmRGb3JtKSB0byBwYXNzIG9udG8gdGhlIGR5bmFtaWMgZm9ybSBidWlsZGVyIGNvbXBvbmVudCAtLS0tLS1cclxuICAgIGZvciAoY29uc3QgZmllbGQgb2YgdGhpcy5maWVsZHMpIHtcclxuICAgICAgY29uc3QgdmFsaWRhdG9ycyA9IFtdO1xyXG4gICAgICBpZiAoZmllbGQucmVxdWlyZWQpIHtcclxuICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5keW5hbWljRmllbGRzW2ZpZWxkLm5hbWVdID0gW2ZpZWxkLnZhbHVlIHx8IG51bGwsIHZhbGlkYXRvcnNdO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHByZWRlZmluZWRDb250cm9scyA9IHtcclxuICAgICAgY3Z2OiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1heExlbmd0aCg0KV1dXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuY2FyZEZvcm0gPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcclxuICAgICAgLi4ucHJlZGVmaW5lZENvbnRyb2xzLFxyXG4gICAgICAuLi50aGlzLmR5bmFtaWNGaWVsZHNcclxuICAgIH0pO1xyXG5cclxuICAgIGxldCBmaWVsZHNDb250cmxzOiB7IFtrZXk6IHN0cmluZ106IEZvcm1Db250cm9sIHwgRm9ybUdyb3VwIH0gPSB7fTtcclxuXHJcbiAgICBmb3IgKGxldCBmIG9mIHRoaXMuZmllbGRzKSB7XHJcbiAgICAgIGlmIChmLnR5cGUgIT09ICdjaGVja2JveCcpIHtcclxuICAgICAgICBmaWVsZHNDb250cmxzW2YubmFtZV0gPSBuZXcgRm9ybUNvbnRyb2woZi52YWx1ZSB8fCAnJywgVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbGV0IG9wdHM6IHsgW2tleTogc3RyaW5nXTogRm9ybUNvbnRyb2wgfSA9IHt9O1xyXG4gICAgICAgIGlmIChmLm9wdGlvbnMpIHtcclxuXHJcbiAgICAgICAgICBmb3IgKGxldCBvcHQgb2YgZi5vcHRpb25zKSB7XHJcbiAgICAgICAgICAgIG9wdHNbb3B0LmtleV0gPSBuZXcgRm9ybUNvbnRyb2wob3B0LmxhYmVsKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZmllbGRzQ29udHJsc1tmLm5hbWVdID0gbmV3IEZvcm1Hcm91cChvcHRzKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbWFrZVBheW1lbnQoKSB7XHJcblxyXG4gICAgdGhpcy5tYWtlVHJhbnNhY3Rpb25XaXRoVG9rZW4oKVxyXG4gIH1cclxuXHJcbiAgc3dpdGNoTGFuZ3VhZ2UobGFuZ3VhZ2U6IHN0cmluZykge1xyXG4gICAgaWYgKGxhbmd1YWdlID09PSAnZW4nKSB7XHJcbiAgICAgIHRoaXMuY3VycmVudExhbmcgPSBMQU5HX0VOO1xyXG4gICAgfSBlbHNlIGlmIChsYW5ndWFnZSA9PT0gJ2VzJykge1xyXG4gICAgICB0aGlzLmN1cnJlbnRMYW5nID0gTEFOR19FUztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIG1ha2VUcmFuc2FjdGlvbldpdGhUb2tlbigpIHtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLnNob3dMb2FkZXIgPSB0cnVlO1xyXG4gICAgICB0aGlzLmxvYWRlci5lbWl0KHRoaXMuc2hvd0xvYWRlcilcclxuICAgICAgY29uc3QgYXBpVXJsID0gdGhpcy5pbnB1dFBhcmFtc0ZvcldpZGdldEZvclBheW1lbnQuRHRyVXJsICsgY29uc3RhbnRzLnVybHMucGF5bWVudERUUlVybDtcclxuXHJcblxyXG4gICAgICAvLy0tLS1lbmNyeXB0aW9uLS0tLS0tLVxyXG4gICAgICB2YXIgZW5jb2RlID0gdGhpcy5lbmNvZGluZygpOyAgICAvLy0tZW5jb2RpbmcgcGFyYW1ldGVycyBcclxuICAgICAgdGhpcy5lbmNyeXB0ZWRTdHJpbmcgPSB0aGlzLmlubml0aWFsaXplS2V5KGVuY29kZSk7ICAgICAvLy0taW5uaXRpYWxpemluZyBEU0Ega2V5XHJcbiAgICAgIC8vLS0tLS1yZXF1ZXN0LS0tLS0tLS0gXHJcbiAgICAgIHRoaXMucGFpZENhcmRSZXNwb25zZSA9IGF3YWl0IHRoaXMuY3JvZW1DYXJkU2VydmljZS5DYXJkUGF5bWVudCh0aGlzLmlucHV0UGFyYW1zRm9yV2lkZ2V0Rm9yUGF5bWVudCwgdGhpcy5pbnB1dFBhcmFtc0ZvcldpZGdldEZvclBheW1lbnQuQ3VsdHVyZSwgYXBpVXJsLCB0aGlzLmVuY3J5cHRlZFN0cmluZyk7IC8vLS1BUEkgQ2FsbCB0byBtYWtlIHNhbGUgdGhyb3VnaCBjYXJkVG9rZW4gaW4gRFRSXHJcblxyXG5cclxuICAgICAgdGhpcy5zaG93TG9hZGVyID0gZmFsc2U7XHJcblxyXG4gICAgICB0aGlzLmZpZWxkUmVzcG9uc2VFbWl0dGVyLmVtaXQodGhpcy5jYXJkRm9ybS5jb250cm9scyk7Ly9lbW1pdGluZyBjb250cm9sc1xyXG4gICAgICB0aGlzLndpZGdldFJlc3BvbnNlRW1pdHRlci5lbWl0KHRoaXMucGFpZENhcmRSZXNwb25zZSk7IC8vIGVtaXR0aW5nIHJlc3BvbnNlXHJcblxyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgICAgdGhpcy5zaG93TG9hZGVyID0gZmFsc2U7XHJcbiAgICAgIHRoaXMud2lkZ2V0UmVzcG9uc2VFbWl0dGVyLmVtaXQodGhpcy5wYWlkQ2FyZFJlc3BvbnNlKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZW5jb2RpbmcoKSB7XHJcbiAgICByZXR1cm4gXCJcIiArIFwiXFxcXFwiICtcclxuICAgICAgXCJcIiArIFwiXFxcXFwiICtcclxuICAgICAgXCJcIiArIFwiXFxcXFwiICtcclxuICAgICAgXCJcIiArIFwiXFxcXFwiICtcclxuICAgICAgdGhpcy5pbnB1dFBhcmFtc0ZvcldpZGdldEZvclBheW1lbnQuVG9rZW4gKyBcIlxcXFxcIiArXHJcbiAgICAgIFwiXCIgKyBcIlxcXFxcIiArXHJcbiAgICAgIHRoaXMuaW5wdXRQYXJhbXNGb3JXaWRnZXRGb3JQYXltZW50LkFQSUtleSArIFwiXFxcXFwiICtcclxuICAgICAgdGhpcy5pbnB1dFBhcmFtc0ZvcldpZGdldEZvclBheW1lbnQuQ3VsdHVyZSArIFwiXFxcXFwiICtcclxuICAgICAgdGhpcy5jYXJkRm9ybS52YWx1ZS5jdnYgKyBcIlxcXFxcIiArXHJcbiAgICAgIHRoaXMuaW5wdXRQYXJhbXNGb3JXaWRnZXRGb3JQYXltZW50LklzU2FsZSArIFwiXFxcXFwiICtcclxuICAgICAgdGhpcy5pbnB1dFBhcmFtc0ZvcldpZGdldEZvclBheW1lbnQuQW1vdW50ICsgXCJcXFxcXCIgK1xyXG4gICAgICB0aGlzLmlucHV0UGFyYW1zRm9yV2lkZ2V0Rm9yUGF5bWVudC5Qcm9kdWN0RGV0YWlscyArIFwiXFxcXFwiICtcclxuICAgICAgXCJcIiArIFwiXFxcXFwiICtcclxuICAgICAgXCJcIiArIFwiXFxcXFwiICtcclxuICAgICAgdGhpcy5pbnB1dFBhcmFtc0ZvcldpZGdldEZvclBheW1lbnQuSXRibXMgKyBcIlxcXFxcIiArXHJcbiAgICAgIFwiXCJcclxuICB9XHJcbiAgaW5uaXRpYWxpemVLZXkoZW5jb2RlOiBzdHJpbmcpIHtcclxuICAgIHZhciBrZXkgPSBpbml0aWFsaXplS2V5KHRoaXMuaW5wdXRQYXJhbXNGb3JXaWRnZXRGb3JQYXltZW50LktleXMuRW5jS2V5MSwgdGhpcy5pbnB1dFBhcmFtc0ZvcldpZGdldEZvclBheW1lbnQuS2V5cy5FbmNLZXkyKTtcclxuICAgIHJldHVybiBlbmNyeXB0ZWRTdHJpbmcoa2V5LCBlbmNvZGUpXHJcbiAgfVxyXG5cclxuICBiaW5kQ1ZWKGV2ZW50OiBFdmVudCkge1xyXG4gICAgY29uc3QgaW5wdXRFbGVtZW50ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICBjb25zdCBudW1lcmljVmFsdWUgPSBpbnB1dEVsZW1lbnQudmFsdWUucmVwbGFjZSgvXFxEL2csICcnKTsgLy8gUmVtb3ZlIG5vbi1udW1lcmljIGNoYXJhY3RlcnNcclxuICAgIHRoaXMuY3Z2ID0gbnVtZXJpY1ZhbHVlOyAvLyBVcGRhdGUgZm9ybSBjb250cm9sIHZhbHVlXHJcbiAgICBpbnB1dEVsZW1lbnQudmFsdWUgPSBudW1lcmljVmFsdWU7IC8vIFVwZGF0ZSBpbnB1dCB2YWx1ZSB0byByZW1vdmUgbm9uLW51bWVyaWMgY2hhcmFjdGVyc1xyXG4gICAgdGhpcy52YWxpZGF0ZUN2digpXHJcbiAgfVxyXG4gIHZhbGlkYXRlQ3Z2KCkge1xyXG4gICAgdGhpcy5zaG93Q1ZWUHJlcGVuZCA9IGZhbHNlXHJcbiAgICBpZiAoY2FyZFZhbGlkYXRvci5jdnYodGhpcy5jdnYsIDQpLmlzVmFsaWQgfHwgY2FyZFZhbGlkYXRvci5jdnYodGhpcy5jdnYpLmlzVmFsaWQpIHtcclxuICAgICAgdGhpcy5zaG93SW5wdXRFcnJvciA9IHRydWVcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLnNob3dJbnB1dEVycm9yID0gZmFsc2VcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmN2dikge1xyXG4gICAgICB0aGlzLnNob3dDVlZQcmVwZW5kID0gdHJ1ZVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCI8Zm9ybSBjbGFzcz1cImNvbnRhaW5lci1mbHVpZCBweS0zXCIgW2Zvcm1Hcm91cF09XCJjYXJkRm9ybVwiICpuZ0lmPVwiKGlucHV0UGFyYW1zRm9yV2lkZ2V0Rm9yUGF5bWVudC5BUElLZXkpXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwicC0wXCI+XHJcbiAgICAgICAgPCEtLSBEeW5hbWljIEZvcm0gRmllbGRzIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLWZpZWxkcy1jb250YWluZXIgbWItM1wiPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBmaWVsZCBvZiBmaWVsZHNcIiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgICAgICAgIDxmaWVsZC1idWlsZGVyIFtmaWVsZF09XCJmaWVsZFwiIFtmb3JtXT1cImNhcmRGb3JtXCI+PC9maWVsZC1idWlsZGVyPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBDVlYgYW5kIFByb2NlZWQgRmllbGRzIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYXltZW50LWZpZWxkcy1jdXN0b21cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbGlnbi1pdGVtcy1lbmRcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItMyBtYi1tZC0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAtY3VzdG9tXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJjdnZcIiBjbGFzcz1cImZvcm0tbGFiZWwtY3VzdG9tXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2N1cnJlbnRMYW5nW1wiQ1ZWXCJdfX0gPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPio8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC13cmFwcGVyIGN2di13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2wtY3VzdG9tXCIgdHlwZT1cInBhc3N3b3JkXCIgaWQ9XCJjdnZcIiBbY2xhc3MuaW5wdXRFcnJvcl09XCIhc2hvd0lucHV0RXJyb3JcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQ1ZWXCIgcGF0dGVybj1cIlswLTldKlwiIGZvcm1Db250cm9sTmFtZT1cImN2dlwiIChpbnB1dCk9XCJiaW5kQ1ZWKCRldmVudClcIiBtaW5sZW5ndGg9XCIzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhsZW5ndGg9XCI0XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIXNob3dDVlZQcmVwZW5kXCIgY2xhc3M9XCJjdnYtaWNvblwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLXN1Ym1pdC1jdXN0b20gdy0xMDAgcHktM1wiIHR5cGU9XCJzdWJtaXRcIiBbZGlzYWJsZWRdPVwiIWNhcmRGb3JtLnZhbGlkXCIgKGNsaWNrKT1cIm1ha2VQYXltZW50KClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJidG4tdGV4dFwiPnt7Y3VycmVudExhbmdbXCJQcm9jZWVkXCJdfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9mb3JtPlxyXG4iXX0=
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
+
import { FormGroup, Validators, FormControl } from '@angular/forms';
|
|
3
|
+
import * as cardValidator from "card-validator";
|
|
4
|
+
import { LANG_EN } from '../../../localizations/en';
|
|
5
|
+
import { LANG_ES } from '../../../localizations/es';
|
|
6
|
+
import { constants } from '../../../../Constants';
|
|
7
|
+
import { CardMode } from '../../../dynamic-form-builder/interfaces/CardModeEnum';
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
import * as i1 from "@angular/forms";
|
|
10
|
+
import * as i2 from "../../../croem-card-widget.service";
|
|
11
|
+
import * as i3 from "@angular/common";
|
|
12
|
+
import * as i4 from "../../../dynamic-form-builder/field-builder.component";
|
|
13
|
+
export class UpdateCardWidgetComponent {
|
|
14
|
+
constructor(formBuilder, croemCardService) {
|
|
15
|
+
this.formBuilder = formBuilder;
|
|
16
|
+
this.croemCardService = croemCardService;
|
|
17
|
+
this.widgetResponseEmitter = new EventEmitter();
|
|
18
|
+
this.getWidgetDataResponseEmitter = new EventEmitter();
|
|
19
|
+
this.fieldResponseEmitter = new EventEmitter();
|
|
20
|
+
this.loader = new EventEmitter();
|
|
21
|
+
this.fields = [];
|
|
22
|
+
this.dynamicFields = {};
|
|
23
|
+
this.showLoader = false;
|
|
24
|
+
this.showInputErrorDate = true;
|
|
25
|
+
this.showInputErrorName = true;
|
|
26
|
+
this.CardMode = CardMode;
|
|
27
|
+
this.maxLength = 19;
|
|
28
|
+
this.maxExpYear = 28;
|
|
29
|
+
}
|
|
30
|
+
ngOnInit() {
|
|
31
|
+
this.switchLanguage(this.inputParamsForWidgetForUpdate.Culture);
|
|
32
|
+
this.getCardDetails();
|
|
33
|
+
//---Dynamic Form creation innitializing form group(i.e cardForm) to pass onto the dynamic form builder component ------
|
|
34
|
+
for (const field of this.fields) {
|
|
35
|
+
const validators = [];
|
|
36
|
+
if (field.required) {
|
|
37
|
+
validators.push(Validators.required);
|
|
38
|
+
}
|
|
39
|
+
this.dynamicFields[field.name] = [field.value || null, validators];
|
|
40
|
+
}
|
|
41
|
+
const predefinedControls = {
|
|
42
|
+
name: ['', [Validators.required]],
|
|
43
|
+
validityDate: ['', [Validators.required, Validators.minLength(5)]],
|
|
44
|
+
};
|
|
45
|
+
this.cardForm = this.formBuilder.group({
|
|
46
|
+
...predefinedControls,
|
|
47
|
+
...this.dynamicFields
|
|
48
|
+
});
|
|
49
|
+
let fieldsContrls = {};
|
|
50
|
+
for (let f of this.fields) {
|
|
51
|
+
if (f.type !== 'checkbox') {
|
|
52
|
+
fieldsContrls[f.name] = new FormControl(f.value || '', Validators.required);
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
let opts = {};
|
|
56
|
+
if (f.options) {
|
|
57
|
+
for (let opt of f.options) {
|
|
58
|
+
opts[opt.key] = new FormControl(opt.label);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
fieldsContrls[f.name] = new FormGroup(opts);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
ngOnChanges(changes) {
|
|
66
|
+
for (const field of this.fields) {
|
|
67
|
+
const validators = [];
|
|
68
|
+
if (field.required) {
|
|
69
|
+
validators.push(Validators.required);
|
|
70
|
+
}
|
|
71
|
+
this.dynamicFields[field.name] = [field.value || null, validators];
|
|
72
|
+
}
|
|
73
|
+
let fieldsContrls = {};
|
|
74
|
+
for (let f of this.fields) {
|
|
75
|
+
if (f.type !== 'checkbox') {
|
|
76
|
+
fieldsContrls[f.name] = new FormControl(f.value || '', Validators.required);
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
let opts = {};
|
|
80
|
+
if (f.options) {
|
|
81
|
+
for (let opt of f.options) {
|
|
82
|
+
opts[opt.key] = new FormControl(opt.label);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
fieldsContrls[f.name] = new FormGroup(opts);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
//---localization To add a new property to this go localization dir and add your property insdei en.ts and es.ts ------
|
|
90
|
+
switchLanguage(language) {
|
|
91
|
+
if (language === 'en') {
|
|
92
|
+
this.currentLang = LANG_EN;
|
|
93
|
+
}
|
|
94
|
+
else if (language === 'es') {
|
|
95
|
+
this.currentLang = LANG_ES;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
UpdateCardDetails() {
|
|
99
|
+
this.EditCardDetails();
|
|
100
|
+
}
|
|
101
|
+
async getCardDetails() {
|
|
102
|
+
this.showLoader = true;
|
|
103
|
+
this.loader.emit(this.showLoader);
|
|
104
|
+
try {
|
|
105
|
+
const apiUrl = this.inputParamsForWidgetForUpdate.DtrUrl + constants.urls.getCardInfoByToken;
|
|
106
|
+
//----encryption-------
|
|
107
|
+
var encode = this.encodingForGet(); //--encoding parameters
|
|
108
|
+
this.encryptedString = this.innitializeKey(encode); //--innitializing DSA key
|
|
109
|
+
var getCardResponse = await this.croemCardService.addUpdateCardAPICall(apiUrl, this.encryptedString); //--API Call to add card in DTR
|
|
110
|
+
this.showLoader = false;
|
|
111
|
+
this.updateCardResponse = getCardResponse;
|
|
112
|
+
this.updateName(getCardResponse.ResponseData.CardHolderName || getCardResponse.ResponseData.CardholderName, getCardResponse.ResponseData.ExpirationDate, getCardResponse.ResponseData.Number);
|
|
113
|
+
this.getWidgetDataResponseEmitter.emit(this.updateCardResponse);
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
console.log(error);
|
|
117
|
+
this.showLoader = false;
|
|
118
|
+
this.getWidgetDataResponseEmitter.emit(this.updateCardResponse);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
async EditCardDetails() {
|
|
122
|
+
try {
|
|
123
|
+
this.showLoader = true;
|
|
124
|
+
this.loader.emit(this.showLoader);
|
|
125
|
+
const apiUrl = this.inputParamsForWidgetForUpdate.DtrUrl + constants.urls.updateDTRUrl;
|
|
126
|
+
//----encryption-------
|
|
127
|
+
var encode = this.encoding(); //--encoding parameters
|
|
128
|
+
this.encryptedString = this.innitializeKey(encode); //--innitializing DSA key
|
|
129
|
+
this.updateCardResponse = await this.croemCardService.addUpdateCardAPICall(apiUrl, this.encryptedString); //--API Call to add card in DTR
|
|
130
|
+
this.showLoader = false;
|
|
131
|
+
this.fieldResponseEmitter.emit(this.cardForm.controls);
|
|
132
|
+
this.widgetResponseEmitter.emit(this.updateCardResponse);
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
console.log(error);
|
|
136
|
+
this.showLoader = false;
|
|
137
|
+
this.widgetResponseEmitter.emit(this.updateCardResponse);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
updateName(newName, newDate, newNumber = '') {
|
|
141
|
+
if (newDate.length === 4) {
|
|
142
|
+
newDate = newDate.substring(0, 2) + '/' + newDate.substring(2);
|
|
143
|
+
}
|
|
144
|
+
this.cardForm.patchValue({
|
|
145
|
+
name: newName,
|
|
146
|
+
validityDate: newDate
|
|
147
|
+
});
|
|
148
|
+
this.name = newName;
|
|
149
|
+
this.validityDate = newDate;
|
|
150
|
+
if (newNumber) {
|
|
151
|
+
this.cardNumber = newNumber;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
maskCardNumber() {
|
|
155
|
+
if (this.cardNumber && this.cardNumber.length > 0) {
|
|
156
|
+
const maskedNumber = '•'.repeat(Math.max(0, this.cardNumber.length - 4)) + this.cardNumber.slice(-4);
|
|
157
|
+
return maskedNumber.replace(/(•{4})/g, '$1 ');
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
return '•••• •••• •••• ••••';
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
encodingForGet() {
|
|
164
|
+
return "" + "\\" +
|
|
165
|
+
"" + "\\" +
|
|
166
|
+
"" + "\\" +
|
|
167
|
+
"" + "\\" +
|
|
168
|
+
this.inputParamsForWidgetForUpdate.Token + "\\" +
|
|
169
|
+
"" + "\\" +
|
|
170
|
+
this.inputParamsForWidgetForUpdate.APIKey + "\\" +
|
|
171
|
+
this.inputParamsForWidgetForUpdate.Culture + "\\" +
|
|
172
|
+
"" + "\\" +
|
|
173
|
+
this.inputParamsForWidgetForUpdate.IsSale + "\\" +
|
|
174
|
+
this.inputParamsForWidgetForUpdate.Amount + "\\" +
|
|
175
|
+
this.inputParamsForWidgetForUpdate.ProductDetails + "\\" +
|
|
176
|
+
"" + "\\" +
|
|
177
|
+
"" + "\\" +
|
|
178
|
+
this.inputParamsForWidgetForUpdate.Itbms + "\\" +
|
|
179
|
+
this.inputParamsForWidgetForUpdate.Mode;
|
|
180
|
+
}
|
|
181
|
+
encoding() {
|
|
182
|
+
return "" + "\\" +
|
|
183
|
+
this.cardForm.value.name + "\\" +
|
|
184
|
+
this.cardForm.value.validityDate.substring(0, 2) + "\\" +
|
|
185
|
+
this.cardForm.value.validityDate.substring(3) + "\\" +
|
|
186
|
+
this.inputParamsForWidgetForUpdate.Token + "\\" +
|
|
187
|
+
"" + "\\" +
|
|
188
|
+
this.inputParamsForWidgetForUpdate.APIKey + "\\" +
|
|
189
|
+
this.inputParamsForWidgetForUpdate.Culture + "\\" +
|
|
190
|
+
"" + "\\" +
|
|
191
|
+
(this.inputParamsForWidgetForUpdate.IsSale ?? false) + "\\" +
|
|
192
|
+
(this.inputParamsForWidgetForUpdate.Amount ?? "0") + "\\" +
|
|
193
|
+
(this.inputParamsForWidgetForUpdate.ProductDetails ?? "0") + "\\" +
|
|
194
|
+
"" + "\\" +
|
|
195
|
+
"" + "\\" +
|
|
196
|
+
(this.inputParamsForWidgetForUpdate.Itbms ?? "0") + "\\" +
|
|
197
|
+
this.inputParamsForWidgetForUpdate.Mode;
|
|
198
|
+
}
|
|
199
|
+
innitializeKey(encode) {
|
|
200
|
+
var key = initializeKey(this.inputParamsForWidgetForUpdate.Keys.EncKey1, this.inputParamsForWidgetForUpdate.Keys.EncKey2);
|
|
201
|
+
return encryptedString(key, encode);
|
|
202
|
+
}
|
|
203
|
+
formatDate(event) {
|
|
204
|
+
let input = event.target.value;
|
|
205
|
+
input = input.replace(/\D/g, '');
|
|
206
|
+
const month = this.formatMonth(input.substring(0, 2));
|
|
207
|
+
const year = input.substring(2, 4);
|
|
208
|
+
const formattedDate = month + (year ? '/' + year : '');
|
|
209
|
+
event.target.value = formattedDate;
|
|
210
|
+
this.cardForm.controls['validityDate'].setValue(formattedDate);
|
|
211
|
+
this.validityDate = this.cardForm.controls['validityDate'].value;
|
|
212
|
+
this.validateDate();
|
|
213
|
+
}
|
|
214
|
+
formatMonth(month) {
|
|
215
|
+
const validMonth = parseInt(month, 10);
|
|
216
|
+
return (validMonth > 1 && validMonth <= 9) ? '0' + validMonth : month;
|
|
217
|
+
}
|
|
218
|
+
maskName() {
|
|
219
|
+
return this.name ? this.name : 'Your Name';
|
|
220
|
+
}
|
|
221
|
+
maskDate() {
|
|
222
|
+
return this.validityDate ? this.validityDate : '••/••';
|
|
223
|
+
}
|
|
224
|
+
validateDate() {
|
|
225
|
+
if (!this.inputParamsForWidgetForUpdate.IsSale) {
|
|
226
|
+
this.showInputErrorDate = cardValidator.expirationDate(this.validityDate, this.maxExpYear).isValid;
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
this.showInputErrorDate = true;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
bindName(event) {
|
|
233
|
+
this.name = event.target.value;
|
|
234
|
+
this.validateName();
|
|
235
|
+
}
|
|
236
|
+
bindDate(event) {
|
|
237
|
+
this.validityDate = event.target.value;
|
|
238
|
+
;
|
|
239
|
+
}
|
|
240
|
+
validateName() {
|
|
241
|
+
if (this.name.length > 4) {
|
|
242
|
+
this.showInputErrorName = true;
|
|
243
|
+
}
|
|
244
|
+
else {
|
|
245
|
+
this.showInputErrorName = false;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
UpdateCardWidgetComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UpdateCardWidgetComponent, deps: [{ token: i1.FormBuilder }, { token: i2.CroemCardWidgetService }], target: i0.ɵɵFactoryTarget.Component });
|
|
250
|
+
UpdateCardWidgetComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: UpdateCardWidgetComponent, selector: "lib-update-card-widget", inputs: { inputParamsForWidgetForUpdate: "inputParamsForWidgetForUpdate", fields: "fields" }, outputs: { widgetResponseEmitter: "widgetResponseEmitter", getWidgetDataResponseEmitter: "getWidgetDataResponseEmitter", fieldResponseEmitter: "fieldResponseEmitter", loader: "loader" }, usesOnChanges: true, ngImport: i0, template: "<form class=\"container-fluid py-3\" [formGroup]=\"cardForm\" *ngIf=\"(inputParamsForWidgetForUpdate.APIKey)\">\r\n <div class=\"p-0\">\r\n <div class=\"d-flex justify-content-center mb-4\">\r\n <div class=\"card\">\r\n <div class=\"card-inner\">\r\n <div class=\"front\">\r\n <!-- Top Bar: Chip & Brand Logo -->\r\n <div class=\"card-top-bar\">\r\n <div class=\"chip\"></div>\r\n <div class=\"card-brand\">\r\n <span class=\"brand-text\">SECURE CARD</span>\r\n </div>\r\n </div>\r\n \r\n <!-- Middle Bar: Card Number (Masked) -->\r\n <div class=\"card-number-display\">\r\n <span>{{maskCardNumber()}}</span>\r\n </div>\r\n \r\n <!-- Bottom Bar: Cardholder Name & Expiration Date -->\r\n <div class=\"card-bottom-bar\">\r\n <div class=\"card-holder-info\">\r\n <label class=\"card-label\">CARDHOLDER</label>\r\n <span class=\"card-value\">{{maskName()}}</span>\r\n </div>\r\n <div class=\"card-expiry-info\">\r\n <label class=\"card-label\">{{currentLang[\"ValidThru\"]}}</label>\r\n <span class=\"card-value\">{{maskDate()}}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Dynamic Form Fields -->\r\n <div class=\"dynamic-fields-container mb-3\">\r\n <div *ngFor=\"let field of fields\" class=\"mb-3\">\r\n <field-builder [field]=\"field\" [form]=\"cardForm\"></field-builder>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Static Form Fields -->\r\n <div class=\"card-form-fields\">\r\n <div class=\"row mb-3\">\r\n <div class=\"col-12\">\r\n <div class=\"form-group-custom\">\r\n <label for=\"name\" class=\"form-label-custom\">\r\n {{currentLang[\"CardHolderName\"]}} <span class=\"text-danger\">*</span>\r\n </label>\r\n <div class=\"input-wrapper\">\r\n <input class=\"form-control-custom\" type=\"text\" id=\"name\" [placeholder]=\"currentLang['CardHolderName']\"\r\n [class.inputError]=\"!showInputErrorName\" (input)=\"bindName($event)\" formControlName=\"name\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row mb-4\">\r\n <div class=\"col-6\">\r\n <div class=\"form-group-custom\">\r\n <label for=\"validity-date\" class=\"form-label-custom\">\r\n {{currentLang[\"ExpiryDate\"]}} <span class=\"text-danger\">*</span>\r\n </label>\r\n <div class=\"input-wrapper date-wrapper\">\r\n <input class=\"form-control-custom\" type=\"text\" id=\"validity-date\"\r\n [class.inputError]=\"!showInputErrorDate\" placeholder=\"MM/YY\"\r\n formControlName=\"validityDate\" (input)=\"formatDate($event)\" />\r\n <span class=\"calendar-icon\"></span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-actions-custom\">\r\n <button class=\"btn-submit\" *ngIf=\"(inputParamsForWidgetForUpdate.Mode==CardMode.Edit)\" type=\"submit\" [disabled]=\"!cardForm.valid\"\r\n (click)=\"UpdateCardDetails()\">\r\n <span class=\"btn-text\">{{currentLang[\"Update\"]}}</span>\r\n </button>\r\n </div>\r\n</form>\r\n", styles: [".card{width:100%;max-width:400px;height:230px;color:#fff;perspective:1000px;border:none;background:transparent;margin:0 auto}.card-inner{width:100%;height:100%;position:relative;transition:transform .8s cubic-bezier(.175,.885,.32,1.275);transform-style:preserve-3d}.front{width:100%;height:100%;position:absolute;top:0;left:0;padding:24px 28px;border-radius:20px;overflow:hidden;z-index:1;backface-visibility:hidden;background:linear-gradient(135deg,rgba(17,24,39,.95) 0%,rgba(31,41,55,.95) 100%);box-shadow:0 20px 35px #00000040,inset 0 1px #ffffff26;border:1px solid rgba(255,255,255,.1);display:flex;flex-direction:column;justify-content:space-between;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif;transition:all .3s ease}.front:before{content:\"\";position:absolute;top:-50%;left:-50%;width:200%;height:200%;background:radial-gradient(circle,rgba(99,102,241,.12) 0%,transparent 70%);pointer-events:none}.card-top-bar{display:flex;justify-content:space-between;align-items:center}.chip{width:48px;height:35px;background:linear-gradient(135deg,#f59e0b 0%,#d97706 100%);border-radius:6px;position:relative;box-shadow:inset 0 1px 2px #ffffff4d}.chip:before{content:\"\";position:absolute;inset:0;border:1px solid rgba(0,0,0,.15);border-radius:6px;background-image:linear-gradient(90deg,transparent 50%,rgba(0,0,0,.1) 50%),linear-gradient(0deg,transparent 50%,rgba(0,0,0,.1) 50%);background-size:10px 10px}.brand-text{font-size:10px;letter-spacing:2px;color:#ffffffb3;font-weight:700;text-shadow:0 2px 4px rgba(0,0,0,.2)}.card-number-display{font-family:Courier New,Courier,monospace;font-size:20px;letter-spacing:3px;color:#fff;text-shadow:0 2px 4px rgba(0,0,0,.3);margin:18px 0;text-align:center;-webkit-user-select:none;user-select:none}.card-bottom-bar{display:flex;justify-content:space-between;align-items:flex-end}.card-label{display:block;font-size:8px;color:#fff6;letter-spacing:1.5px;margin-bottom:2px;text-transform:uppercase}.card-value{display:block;font-size:13px;color:#fff;letter-spacing:.5px;font-weight:600;max-width:230px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.form-group-custom{display:flex;flex-direction:column;margin-bottom:12px}.form-label-custom{font-size:13px;font-weight:600;color:#374151;margin-bottom:6px;letter-spacing:.2px}.input-wrapper{position:relative;width:100%}.form-control-custom{width:100%;background-color:#f9fafb;border:1px solid #d1d5db;border-radius:8px;padding:10px 14px;font-size:14px;color:#1f2937;transition:all .2s ease-in-out;box-shadow:inset 0 1px 2px #00000005}.form-control-custom:focus{background-color:#fff;border-color:#4f46e5;box-shadow:0 0 0 3px #4f46e51f;outline:none}.inputError,.inputError:focus{border-color:#ef4444!important;box-shadow:0 0 0 3px #ef44441f!important}.date-wrapper{display:flex;align-items:center}.calendar-icon{width:18px;height:18px;position:absolute;right:12px;pointer-events:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='%239ca3af'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z'/%3E%3C/svg%3E\");background-repeat:no-repeat;background-size:contain}.form-actions-custom{display:flex;justify-content:flex-end;margin-top:20px;border-top:1px solid #f3f4f6;padding-top:16px}.btn-submit{color:#fff;background-color:#5a75b6;border:solid 2px #5A75B6;border-radius:8px;padding:8px;min-width:120px;margin-right:10px}.btn-submit:hover{background-color:#3e578e;color:#fff}.btn-submit:disabled,.btn-previous:disabled,.btn-next:disabled{background-color:#ecebeb!important;border:solid 2px #ecebeb!important;color:#9c9c9c!important;cursor:not-allowed}.breathing-overlay{display:none;position:fixed;top:0;left:0;width:100%;height:100%;background-color:#0f172a99;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);z-index:9999}.show{display:block}\n"], dependencies: [{ kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.FieldBuilderComponent, selector: "field-builder", inputs: ["field", "form"] }] });
|
|
251
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UpdateCardWidgetComponent, decorators: [{
|
|
252
|
+
type: Component,
|
|
253
|
+
args: [{ selector: 'lib-update-card-widget', template: "<form class=\"container-fluid py-3\" [formGroup]=\"cardForm\" *ngIf=\"(inputParamsForWidgetForUpdate.APIKey)\">\r\n <div class=\"p-0\">\r\n <div class=\"d-flex justify-content-center mb-4\">\r\n <div class=\"card\">\r\n <div class=\"card-inner\">\r\n <div class=\"front\">\r\n <!-- Top Bar: Chip & Brand Logo -->\r\n <div class=\"card-top-bar\">\r\n <div class=\"chip\"></div>\r\n <div class=\"card-brand\">\r\n <span class=\"brand-text\">SECURE CARD</span>\r\n </div>\r\n </div>\r\n \r\n <!-- Middle Bar: Card Number (Masked) -->\r\n <div class=\"card-number-display\">\r\n <span>{{maskCardNumber()}}</span>\r\n </div>\r\n \r\n <!-- Bottom Bar: Cardholder Name & Expiration Date -->\r\n <div class=\"card-bottom-bar\">\r\n <div class=\"card-holder-info\">\r\n <label class=\"card-label\">CARDHOLDER</label>\r\n <span class=\"card-value\">{{maskName()}}</span>\r\n </div>\r\n <div class=\"card-expiry-info\">\r\n <label class=\"card-label\">{{currentLang[\"ValidThru\"]}}</label>\r\n <span class=\"card-value\">{{maskDate()}}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Dynamic Form Fields -->\r\n <div class=\"dynamic-fields-container mb-3\">\r\n <div *ngFor=\"let field of fields\" class=\"mb-3\">\r\n <field-builder [field]=\"field\" [form]=\"cardForm\"></field-builder>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Static Form Fields -->\r\n <div class=\"card-form-fields\">\r\n <div class=\"row mb-3\">\r\n <div class=\"col-12\">\r\n <div class=\"form-group-custom\">\r\n <label for=\"name\" class=\"form-label-custom\">\r\n {{currentLang[\"CardHolderName\"]}} <span class=\"text-danger\">*</span>\r\n </label>\r\n <div class=\"input-wrapper\">\r\n <input class=\"form-control-custom\" type=\"text\" id=\"name\" [placeholder]=\"currentLang['CardHolderName']\"\r\n [class.inputError]=\"!showInputErrorName\" (input)=\"bindName($event)\" formControlName=\"name\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row mb-4\">\r\n <div class=\"col-6\">\r\n <div class=\"form-group-custom\">\r\n <label for=\"validity-date\" class=\"form-label-custom\">\r\n {{currentLang[\"ExpiryDate\"]}} <span class=\"text-danger\">*</span>\r\n </label>\r\n <div class=\"input-wrapper date-wrapper\">\r\n <input class=\"form-control-custom\" type=\"text\" id=\"validity-date\"\r\n [class.inputError]=\"!showInputErrorDate\" placeholder=\"MM/YY\"\r\n formControlName=\"validityDate\" (input)=\"formatDate($event)\" />\r\n <span class=\"calendar-icon\"></span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-actions-custom\">\r\n <button class=\"btn-submit\" *ngIf=\"(inputParamsForWidgetForUpdate.Mode==CardMode.Edit)\" type=\"submit\" [disabled]=\"!cardForm.valid\"\r\n (click)=\"UpdateCardDetails()\">\r\n <span class=\"btn-text\">{{currentLang[\"Update\"]}}</span>\r\n </button>\r\n </div>\r\n</form>\r\n", styles: [".card{width:100%;max-width:400px;height:230px;color:#fff;perspective:1000px;border:none;background:transparent;margin:0 auto}.card-inner{width:100%;height:100%;position:relative;transition:transform .8s cubic-bezier(.175,.885,.32,1.275);transform-style:preserve-3d}.front{width:100%;height:100%;position:absolute;top:0;left:0;padding:24px 28px;border-radius:20px;overflow:hidden;z-index:1;backface-visibility:hidden;background:linear-gradient(135deg,rgba(17,24,39,.95) 0%,rgba(31,41,55,.95) 100%);box-shadow:0 20px 35px #00000040,inset 0 1px #ffffff26;border:1px solid rgba(255,255,255,.1);display:flex;flex-direction:column;justify-content:space-between;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif;transition:all .3s ease}.front:before{content:\"\";position:absolute;top:-50%;left:-50%;width:200%;height:200%;background:radial-gradient(circle,rgba(99,102,241,.12) 0%,transparent 70%);pointer-events:none}.card-top-bar{display:flex;justify-content:space-between;align-items:center}.chip{width:48px;height:35px;background:linear-gradient(135deg,#f59e0b 0%,#d97706 100%);border-radius:6px;position:relative;box-shadow:inset 0 1px 2px #ffffff4d}.chip:before{content:\"\";position:absolute;inset:0;border:1px solid rgba(0,0,0,.15);border-radius:6px;background-image:linear-gradient(90deg,transparent 50%,rgba(0,0,0,.1) 50%),linear-gradient(0deg,transparent 50%,rgba(0,0,0,.1) 50%);background-size:10px 10px}.brand-text{font-size:10px;letter-spacing:2px;color:#ffffffb3;font-weight:700;text-shadow:0 2px 4px rgba(0,0,0,.2)}.card-number-display{font-family:Courier New,Courier,monospace;font-size:20px;letter-spacing:3px;color:#fff;text-shadow:0 2px 4px rgba(0,0,0,.3);margin:18px 0;text-align:center;-webkit-user-select:none;user-select:none}.card-bottom-bar{display:flex;justify-content:space-between;align-items:flex-end}.card-label{display:block;font-size:8px;color:#fff6;letter-spacing:1.5px;margin-bottom:2px;text-transform:uppercase}.card-value{display:block;font-size:13px;color:#fff;letter-spacing:.5px;font-weight:600;max-width:230px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.form-group-custom{display:flex;flex-direction:column;margin-bottom:12px}.form-label-custom{font-size:13px;font-weight:600;color:#374151;margin-bottom:6px;letter-spacing:.2px}.input-wrapper{position:relative;width:100%}.form-control-custom{width:100%;background-color:#f9fafb;border:1px solid #d1d5db;border-radius:8px;padding:10px 14px;font-size:14px;color:#1f2937;transition:all .2s ease-in-out;box-shadow:inset 0 1px 2px #00000005}.form-control-custom:focus{background-color:#fff;border-color:#4f46e5;box-shadow:0 0 0 3px #4f46e51f;outline:none}.inputError,.inputError:focus{border-color:#ef4444!important;box-shadow:0 0 0 3px #ef44441f!important}.date-wrapper{display:flex;align-items:center}.calendar-icon{width:18px;height:18px;position:absolute;right:12px;pointer-events:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='%239ca3af'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z'/%3E%3C/svg%3E\");background-repeat:no-repeat;background-size:contain}.form-actions-custom{display:flex;justify-content:flex-end;margin-top:20px;border-top:1px solid #f3f4f6;padding-top:16px}.btn-submit{color:#fff;background-color:#5a75b6;border:solid 2px #5A75B6;border-radius:8px;padding:8px;min-width:120px;margin-right:10px}.btn-submit:hover{background-color:#3e578e;color:#fff}.btn-submit:disabled,.btn-previous:disabled,.btn-next:disabled{background-color:#ecebeb!important;border:solid 2px #ecebeb!important;color:#9c9c9c!important;cursor:not-allowed}.breathing-overlay{display:none;position:fixed;top:0;left:0;width:100%;height:100%;background-color:#0f172a99;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);z-index:9999}.show{display:block}\n"] }]
|
|
254
|
+
}], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i2.CroemCardWidgetService }]; }, propDecorators: { inputParamsForWidgetForUpdate: [{
|
|
255
|
+
type: Input
|
|
256
|
+
}], widgetResponseEmitter: [{
|
|
257
|
+
type: Output
|
|
258
|
+
}], getWidgetDataResponseEmitter: [{
|
|
259
|
+
type: Output
|
|
260
|
+
}], fieldResponseEmitter: [{
|
|
261
|
+
type: Output
|
|
262
|
+
}], loader: [{
|
|
263
|
+
type: Output
|
|
264
|
+
}], fields: [{
|
|
265
|
+
type: Input
|
|
266
|
+
}] } });
|
|
267
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlLWNhcmQtd2lkZ2V0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Nyb2VtLWNhcmQtd2lkZ2V0L3NyYy9saWIvY2FyZC13aWRnZXQvVXBkYXRlLWNhcmQtd2lkZ2V0L3VwZGF0ZS1jYXJkLXdpZGdldC91cGRhdGUtY2FyZC13aWRnZXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY3JvZW0tY2FyZC13aWRnZXQvc3JjL2xpYi9jYXJkLXdpZGdldC9VcGRhdGUtY2FyZC13aWRnZXQvdXBkYXRlLWNhcmQtd2lkZ2V0L3VwZGF0ZS1jYXJkLXdpZGdldC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUN0RixPQUFPLEVBQUUsU0FBUyxFQUFlLFVBQVUsRUFBRSxXQUFXLEVBQW1CLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEcsT0FBTyxLQUFLLGFBQWEsTUFBTSxnQkFBZ0IsQ0FBQztBQUtoRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDcEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRXBELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sdURBQXVELENBQUM7Ozs7OztBQVNqRixNQUFNLE9BQU8seUJBQXlCO0lBNkJwQyxZQUFvQixXQUF3QixFQUFVLGdCQUF3QztRQUExRSxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUFVLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBd0I7UUExQnBGLDBCQUFxQixHQUFHLElBQUksWUFBWSxFQUF3QixDQUFDO1FBQ2pFLGlDQUE0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LFlBQVksR0FBSSxLQUFLLENBQUMsTUFBMkIsQ0FBQyxLQUFLLENBQUM7UUFBQSxDQUFDO0lBQ2hFLENBQUM7SUFDRCxZQUFZO1FBQ1YsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDeEIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQztTQUNoQzthQUNJO1lBQ0gsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQztTQUNqQztJQUNILENBQUM7O3VIQXRSVSx5QkFBeUI7MkdBQXpCLHlCQUF5Qiw0V0NwQnRDLG9uSUFtRkE7NEZEL0RhLHlCQUF5QjtrQkFMckMsU0FBUzsrQkFDRSx3QkFBd0I7dUlBTXpCLDZCQUE2QjtzQkFBckMsS0FBSztnQkFDSSxxQkFBcUI7c0JBQTlCLE1BQU07Z0JBQ0csNEJBQTRCO3NCQUFyQyxNQUFNO2dCQUNHLG9CQUFvQjtzQkFBN0IsTUFBTTtnQkFDRyxNQUFNO3NCQUFmLE1BQU07Z0JBQ0UsTUFBTTtzQkFBZCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUdyb3VwLCBGb3JtQnVpbGRlciwgVmFsaWRhdG9ycywgRm9ybUNvbnRyb2wsIEFic3RyYWN0Q29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0ICogYXMgY2FyZFZhbGlkYXRvciBmcm9tIFwiY2FyZC12YWxpZGF0b3JcIjtcclxuaW1wb3J0IHsgQ3JvZW1DYXJkV2lkZ2V0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2Nyb2VtLWNhcmQtd2lkZ2V0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBGaWVsZHMgfSBmcm9tICcuLi8uLi8uLi9keW5hbWljLWZvcm0tYnVpbGRlci9pbnRlcmZhY2VzL0Zvcm1GaWVsZHMuSW50ZXJmYWNlJztcclxuaW1wb3J0IHsgSW5wdXRQYXJhbXNGb3JXaWRnZXQgfSBmcm9tICcuLi8uLi8uLi9keW5hbWljLWZvcm0tYnVpbGRlci9pbnRlcmZhY2VzL0lucHV0UGFyYW1zLkludGVyZmFjZSc7XHJcbmltcG9ydCB7IGFwaVJlc3BvbnNlSW50ZXJmYWNlIH0gZnJvbSAnLi4vLi4vLi4vZHluYW1pYy1mb3JtLWJ1aWxkZXIvaW50ZXJmYWNlcy9hcGlSZXNwb25zZS5JbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBMQU5HX0VOIH0gZnJvbSAnLi4vLi4vLi4vbG9jYWxpemF0aW9ucy9lbic7XHJcbmltcG9ydCB7IExBTkdfRVMgfSBmcm9tICcuLi8uLi8uLi9sb2NhbGl6YXRpb25zL2VzJztcclxuaW1wb3J0IHsgTGFuZ3VhZ2UgfSBmcm9tICcuLi8uLi8uLi9sb2NhbGl6YXRpb25zL2xhbmd1YWdlLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IGNvbnN0YW50cyB9IGZyb20gJy4uLy4uLy4uLy4uL0NvbnN0YW50cyc7XHJcbmltcG9ydCB7IENhcmRNb2RlIH0gZnJvbSAnLi4vLi4vLi4vZHluYW1pYy1mb3JtLWJ1aWxkZXIvaW50ZXJmYWNlcy9DYXJkTW9kZUVudW0nO1xyXG5cclxuZGVjbGFyZSBmdW5jdGlvbiBlbmNyeXB0ZWRTdHJpbmcoa2V5OiBhbnksIHM6IGFueSk6IHN0cmluZztcclxuZGVjbGFyZSBmdW5jdGlvbiBpbml0aWFsaXplS2V5KGV4cG9uZW50OiBhbnksIG1vZHVsdXM6IGFueSk6IGFueTtcclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItdXBkYXRlLWNhcmQtd2lkZ2V0JyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdXBkYXRlLWNhcmQtd2lkZ2V0LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi91cGRhdGUtY2FyZC13aWRnZXQuY29tcG9uZW50LmNzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBVcGRhdGVDYXJkV2lkZ2V0Q29tcG9uZW50IHtcclxuXHJcbiAgQElucHV0KCkgaW5wdXRQYXJhbXNGb3JXaWRnZXRGb3JVcGRhdGUhOiBJbnB1dFBhcmFtc0ZvcldpZGdldDtcclxuICBAT3V0cHV0KCkgd2lkZ2V0UmVzcG9uc2VFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcjxhcGlSZXNwb25zZUludGVyZmFjZT4oKTtcclxuICBAT3V0cHV0KCkgZ2V0V2lkZ2V0RGF0YVJlc3BvbnNlRW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXI8YXBpUmVzcG9uc2VJbnRlcmZhY2U+KCk7XHJcbiAgQE91dHB1dCgpIGZpZWxkUmVzcG9uc2VFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcjx7IFt4OiBzdHJpbmddOiBBYnN0cmFjdENvbnRyb2w8YW55LCBhbnk+OyB9PigpO1xyXG4gIEBPdXRwdXQoKSBsb2FkZXIgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XHJcbiAgQElucHV0KCkgZmllbGRzOiBGaWVsZHNbXSA9IFtdO1xyXG5cclxuICBkeW5hbWljRmllbGRzOiB7IFtrZXk6IHN0cmluZ106IFthbnksIGFueVtdXSB9ID0ge307XHJcbiAgZW5jcnlwdGVkU3RyaW5nITogc3RyaW5nXHJcbiAgdXBkYXRlQ2FyZFJlc3BvbnNlITogYXBpUmVzcG9uc2VJbnRlcmZhY2U7XHJcbiAgc2hvd0xvYWRlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGNhcmRJbmZvUmVzcG9uc2UhOiBhcGlSZXNwb25zZUludGVyZmFjZVxyXG4gIGNhcmROdW1iZXIhOiBzdHJpbmc7XHJcbiAgdmFsaWRpdHlEYXRlITogc3RyaW5nO1xyXG4gIG5hbWUhOiBzdHJpbmc7XHJcbiAgc2hvd0lucHV0RXJyb3JEYXRlOiBib29sZWFuID0gdHJ1ZVxyXG4gIHNob3dJbnB1dEVycm9yTmFtZTogYm9vbGVhbiA9IHRydWVcclxuICBjdXJyZW50TGFuZyE6IExhbmd1YWdlO1xyXG4gIENhcmRNb2RlID0gQ2FyZE1vZGU7XHJcbiAgcHVibGljIG1vbnRoITogc3RyaW5nXHJcbiAgcHVibGljIHllYXIhOiBzdHJpbmdcclxuICBwdWJsaWMgdmFsaWQhOiBib29sZWFuXHJcbiAgcHVibGljIG1heExlbmd0aCE6IG51bWJlcjtcclxuICBwdWJsaWMgbWF4RXhwWWVhciE6IG51bWJlcjtcclxuICBjYXJkRm9ybSE6IEZvcm1Hcm91cDtcclxuICBDcm9lbUNhcmRXaWRnZXRTZXJ2aWNlITogQ3JvZW1DYXJkV2lkZ2V0U2VydmljZTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXIsIHByaXZhdGUgY3JvZW1DYXJkU2VydmljZTogQ3JvZW1DYXJkV2lkZ2V0U2VydmljZSkge1xyXG4gICAgdGhpcy5tYXhMZW5ndGggPSAxOTtcclxuICAgIHRoaXMubWF4RXhwWWVhciA9IDI4O1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcblxyXG4gICAgdGhpcy5zd2l0Y2hMYW5ndWFnZSh0aGlzLmlucHV0UGFyYW1zRm9yV2lkZ2V0Rm9yVXBkYXRlLkN1bHR1cmUpO1xyXG4gICAgdGhpcy5nZXRDYXJkRGV0YWlscygpXHJcbiAgICAvLy0tLUR5bmFtaWMgRm9ybSBjcmVhdGlvbiBpbm5pdGlhbGl6aW5nIGZvcm0gZ3JvdXAoaS5lIGNhcmRGb3JtKSB0byBwYXNzIG9udG8gdGhlIGR5bmFtaWMgZm9ybSBidWlsZGVyIGNvbXBvbmVudCAtLS0tLS1cclxuICAgIGZvciAoY29uc3QgZmllbGQgb2YgdGhpcy5maWVsZHMpIHtcclxuICAgICAgY29uc3QgdmFsaWRhdG9ycyA9IFtdO1xyXG4gICAgICBpZiAoZmllbGQucmVxdWlyZWQpIHtcclxuICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5keW5hbWljRmllbGRzW2ZpZWxkLm5hbWVdID0gW2ZpZWxkLnZhbHVlIHx8IG51bGwsIHZhbGlkYXRvcnNdO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHByZWRlZmluZWRDb250cm9scyA9IHtcclxuICAgICAgbmFtZTogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxyXG4gICAgICB2YWxpZGl0eURhdGU6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluTGVuZ3RoKDUpXV0sXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuY2FyZEZvcm0gPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcclxuICAgICAgLi4ucHJlZGVmaW5lZENvbnRyb2xzLFxyXG4gICAgICAuLi50aGlzLmR5bmFtaWNGaWVsZHNcclxuICAgIH0pO1xyXG5cclxuICAgIGxldCBmaWVsZHNDb250cmxzOiB7IFtrZXk6IHN0cmluZ106IEZvcm1Db250cm9sIHwgRm9ybUdyb3VwIH0gPSB7fTtcclxuXHJcbiAgICBmb3IgKGxldCBmIG9mIHRoaXMuZmllbGRzKSB7XHJcbiAgICAgIGlmIChmLnR5cGUgIT09ICdjaGVja2JveCcpIHtcclxuICAgICAgICBmaWVsZHNDb250cmxzW2YubmFtZV0gPSBuZXcgRm9ybUNvbnRyb2woZi52YWx1ZSB8fCAnJywgVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbGV0IG9wdHM6IHsgW2tleTogc3RyaW5nXTogRm9ybUNvbnRyb2wgfSA9IHt9O1xyXG4gICAgICAgIGlmIChmLm9wdGlvbnMpIHtcclxuXHJcbiAgICAgICAgICBmb3IgKGxldCBvcHQgb2YgZi5vcHRpb25zKSB7XHJcbiAgICAgICAgICAgIG9wdHNbb3B0LmtleV0gPSBuZXcgRm9ybUNvbnRyb2wob3B0LmxhYmVsKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZmllbGRzQ29udHJsc1tmLm5hbWVdID0gbmV3IEZvcm1Hcm91cChvcHRzKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIHRoaXMuZmllbGRzKSB7XHJcbiAgICAgIGNvbnN0IHZhbGlkYXRvcnMgPSBbXTtcclxuICAgICAgaWYgKGZpZWxkLnJlcXVpcmVkKSB7XHJcbiAgICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZHluYW1pY0ZpZWxkc1tmaWVsZC5uYW1lXSA9IFtmaWVsZC52YWx1ZSB8fCBudWxsLCB2YWxpZGF0b3JzXTtcclxuICAgIH1cclxuICAgIGxldCBmaWVsZHNDb250cmxzOiB7IFtrZXk6IHN0cmluZ106IEZvcm1Db250cm9sIHwgRm9ybUdyb3VwIH0gPSB7fTtcclxuXHJcbiAgICBmb3IgKGxldCBmIG9mIHRoaXMuZmllbGRzKSB7XHJcbiAgICAgIGlmIChmLnR5cGUgIT09ICdjaGVja2JveCcpIHtcclxuICAgICAgICBmaWVsZHNDb250cmxzW2YubmFtZV0gPSBuZXcgRm9ybUNvbnRyb2woZi52YWx1ZSB8fCAnJywgVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbGV0IG9wdHM6IHsgW2tleTogc3RyaW5nXTogRm9ybUNvbnRyb2wgfSA9IHt9O1xyXG4gICAgICAgIGlmIChmLm9wdGlvbnMpIHtcclxuXHJcbiAgICAgICAgICBmb3IgKGxldCBvcHQgb2YgZi5vcHRpb25zKSB7XHJcbiAgICAgICAgICAgIG9wdHNbb3B0LmtleV0gPSBuZXcgRm9ybUNvbnRyb2wob3B0LmxhYmVsKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZmllbGRzQ29udHJsc1tmLm5hbWVdID0gbmV3IEZvcm1Hcm91cChvcHRzKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICB9XHJcbiAgLy8tLS1sb2NhbGl6YXRpb24gIFRvIGFkZCBhIG5ldyBwcm9wZXJ0eSB0byB0aGlzIGdvIGxvY2FsaXphdGlvbiBkaXIgYW5kIGFkZCB5b3VyIHByb3BlcnR5IGluc2RlaSBlbi50cyBhbmQgZXMudHMgLS0tLS0tXHJcbiAgc3dpdGNoTGFuZ3VhZ2UobGFuZ3VhZ2U6IHN0cmluZykge1xyXG4gICAgaWYgKGxhbmd1YWdlID09PSAnZW4nKSB7XHJcbiAgICAgIHRoaXMuY3VycmVudExhbmcgPSBMQU5HX0VOO1xyXG4gICAgfSBlbHNlIGlmIChsYW5ndWFnZSA9PT0gJ2VzJykge1xyXG4gICAgICB0aGlzLmN1cnJlbnRMYW5nID0gTEFOR19FUztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIFVwZGF0ZUNhcmREZXRhaWxzKCkge1xyXG4gICAgdGhpcy5FZGl0Q2FyZERldGFpbHMoKVxyXG4gIH1cclxuICBhc3luYyBnZXRDYXJkRGV0YWlscygpIHtcclxuICAgIHRoaXMuc2hvd0xvYWRlciA9IHRydWU7XHJcbiAgICB0aGlzLmxvYWRlci5lbWl0KHRoaXMuc2hvd0xvYWRlcilcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGFwaVVybCA9IHRoaXMuaW5wdXRQYXJhbXNGb3JXaWRnZXRGb3JVcGRhdGUuRHRyVXJsICsgY29uc3RhbnRzLnVybHMuZ2V0Q2FyZEluZm9CeVRva2VuO1xyXG5cclxuICAgICAgLy8tLS0tZW5jcnlwdGlvbi0tLS0tLS1cclxuICAgICAgdmFyIGVuY29kZSA9IHRoaXMuZW5jb2RpbmdGb3JHZXQoKTsgICAgLy8tLWVuY29kaW5nIHBhcmFtZXRlcnMgXHJcbiAgICAgIHRoaXMuZW5jcnlwdGVkU3RyaW5nID0gdGhpcy5pbm5pdGlhbGl6ZUtleShlbmNvZGUpOyAgICAgLy8tLWlubml0aWFsaXppbmcgRFNBIGtleVxyXG5cclxuICAgICAgdmFyIGdldENhcmRSZXNwb25zZSA9IGF3YWl0IHRoaXMuY3JvZW1DYXJkU2VydmljZS5hZGRVcGRhdGVDYXJkQVBJQ2FsbChhcGlVcmwsIHRoaXMuZW5jcnlwdGVkU3RyaW5nKTsgICAvLy0tQVBJIENhbGwgdG8gYWRkIGNhcmQgaW4gRFRSXHJcbiAgICAgIHRoaXMuc2hvd0xvYWRlciA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnVwZGF0ZUNhcmRSZXNwb25zZSA9IGdldENhcmRSZXNwb25zZTtcclxuICAgICAgdGhpcy51cGRhdGVOYW1lKFxyXG4gICAgICAgIGdldENhcmRSZXNwb25zZS5SZXNwb25zZURhdGEuQ2FyZEhvbGRlck5hbWUgfHwgZ2V0Q2FyZFJlc3BvbnNlLlJlc3BvbnNlRGF0YS5DYXJkaG9sZGVyTmFtZSxcclxuICAgICAgICBnZXRDYXJkUmVzcG9uc2UuUmVzcG9uc2VEYXRhLkV4cGlyYXRpb25EYXRlLFxyXG4gICAgICAgIGdldENhcmRSZXNwb25zZS5SZXNwb25zZURhdGEuTnVtYmVyXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMuZ2V0V2lkZ2V0RGF0YVJlc3BvbnNlRW1pdHRlci5lbWl0KHRoaXMudXBkYXRlQ2FyZFJlc3BvbnNlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgIHRoaXMuc2hvd0xvYWRlciA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmdldFdpZGdldERhdGFSZXNwb25zZUVtaXR0ZXIuZW1pdCh0aGlzLnVwZGF0ZUNhcmRSZXNwb25zZSlcclxuICAgIH1cclxuICB9XHJcbiAgYXN5bmMgRWRpdENhcmREZXRhaWxzKCkge1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMuc2hvd0xvYWRlciA9IHRydWU7XHJcbiAgICAgIHRoaXMubG9hZGVyLmVtaXQodGhpcy5zaG93TG9hZGVyKVxyXG5cclxuICAgICAgY29uc3QgYXBpVXJsID0gdGhpcy5pbnB1dFBhcmFtc0ZvcldpZGdldEZvclVwZGF0ZS5EdHJVcmwgKyBjb25zdGFudHMudXJscy51cGRhdGVEVFJVcmw7XHJcblxyXG4gICAgICAvLy0tLS1lbmNyeXB0aW9uLS0tLS0tLVxyXG4gICAgICB2YXIgZW5jb2RlID0gdGhpcy5lbmNvZGluZygpOyAgICAvLy0tZW5jb2RpbmcgcGFyYW1ldGVycyBcclxuICAgICAgdGhpcy5lbmNyeXB0ZWRTdHJpbmcgPSB0aGlzLmlubml0aWFsaXplS2V5KGVuY29kZSk7ICAgICAvLy0taW5uaXRpYWxpemluZyBEU0Ega2V5XHJcblxyXG4gICAgICB0aGlzLnVwZGF0ZUNhcmRSZXNwb25zZSA9IGF3YWl0IHRoaXMuY3JvZW1DYXJkU2VydmljZS5hZGRVcGRhdGVDYXJkQVBJQ2FsbChhcGlVcmwsIHRoaXMuZW5jcnlwdGVkU3RyaW5nKTsgICAvLy0tQVBJIENhbGwgdG8gYWRkIGNhcmQgaW4gRFRSXHJcblxyXG4gICAgICB0aGlzLnNob3dMb2FkZXIgPSBmYWxzZTtcclxuXHJcbiAgICAgIHRoaXMuZmllbGRSZXNwb25zZUVtaXR0ZXIuZW1pdCh0aGlzLmNhcmRGb3JtLmNvbnRyb2xzKTtcclxuICAgICAgdGhpcy53aWRnZXRSZXNwb25zZUVtaXR0ZXIuZW1pdCh0aGlzLnVwZGF0ZUNhcmRSZXNwb25zZSk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICB0aGlzLnNob3dMb2FkZXIgPSBmYWxzZTtcclxuICAgICAgdGhpcy53aWRnZXRSZXNwb25zZUVtaXR0ZXIuZW1pdCh0aGlzLnVwZGF0ZUNhcmRSZXNwb25zZSlcclxuICAgIH1cclxuICB9XHJcbiAgdXBkYXRlTmFtZShuZXdOYW1lOiBzdHJpbmcsIG5ld0RhdGU6IHN0cmluZywgbmV3TnVtYmVyOiBzdHJpbmcgPSAnJykge1xyXG4gICAgaWYgKG5ld0RhdGUubGVuZ3RoID09PSA0KSB7XHJcbiAgICAgIG5ld0RhdGUgPSBuZXdEYXRlLnN1YnN0cmluZygwLCAyKSArICcvJyArIG5ld0RhdGUuc3Vic3RyaW5nKDIpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jYXJkRm9ybS5wYXRjaFZhbHVlKHtcclxuICAgICAgbmFtZTogbmV3TmFtZSxcclxuICAgICAgdmFsaWRpdHlEYXRlOiBuZXdEYXRlXHJcbiAgICB9KTtcclxuICAgIHRoaXMubmFtZSA9IG5ld05hbWU7XHJcbiAgICB0aGlzLnZhbGlkaXR5RGF0ZSA9IG5ld0RhdGU7XHJcbiAgICBpZiAobmV3TnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuY2FyZE51bWJlciA9IG5ld051bWJlcjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG1hc2tDYXJkTnVtYmVyKCk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5jYXJkTnVtYmVyICYmIHRoaXMuY2FyZE51bWJlci5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbnN0IG1hc2tlZE51bWJlciA9ICfigKInLnJlcGVhdChNYXRoLm1heCgwLCB0aGlzLmNhcmROdW1iZXIubGVuZ3RoIC0gNCkpICsgdGhpcy5jYXJkTnVtYmVyLnNsaWNlKC00KTtcclxuICAgICAgcmV0dXJuIG1hc2tlZE51bWJlci5yZXBsYWNlKC8o4oCiezR9KS9nLCAnJDEgJyk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmV0dXJuICfigKLigKLigKLigKIg4oCi4oCi4oCi4oCiIOKAouKAouKAouKAoiDigKLigKLigKLigKInO1xyXG4gICAgfVxyXG4gIH1cclxuICBlbmNvZGluZ0ZvckdldCgpIHtcclxuICAgIHJldHVybiBcIlwiICsgXCJcXFxcXCIgK1xyXG4gICAgICBcIlwiICsgXCJcXFxcXCIgK1xyXG4gICAgICBcIlwiICsgXCJcXFxcXCIgK1xyXG4gICAgICBcIlwiICsgXCJcXFxcXCIgK1xyXG4gICAgICB0aGlzLmlucHV0UGFyYW1zRm9yV2lkZ2V0Rm9yVXBkYXRlLlRva2VuICsgXCJcXFxcXCIgK1xyXG4gICAgICBcIlwiICsgXCJcXFxcXCIgK1xyXG4gICAgICB0aGlzLmlucHV0UGFyYW1zRm9yV2lkZ2V0Rm9yVXBkYXRlLkFQSUtleSArIFwiXFxcXFwiICtcclxuICAgICAgdGhpcy5pbnB1dFBhcmFtc0ZvcldpZGdldEZvclVwZGF0ZS5DdWx0dXJlICsgXCJcXFxcXCIgK1xyXG4gICAgICBcIlwiICsgXCJcXFxcXCIgK1xyXG4gICAgICB0aGlzLmlucHV0UGFyYW1zRm9yV2lkZ2V0Rm9yVXBkYXRlLklzU2FsZSArIFwiXFxcXFwiICtcclxuICAgICAgdGhpcy5pbnB1dFBhcmFtc0ZvcldpZGdldEZvclVwZGF0ZS5BbW91bnQgKyBcIlxcXFxcIiArXHJcbiAgICAgIHRoaXMuaW5wdXRQYXJhbXNGb3JXaWRnZXRGb3JVcGRhdGUuUHJvZHVjdERldGFpbHMgKyBcIlxcXFxcIiArXHJcbiAgICAgIFwiXCIgKyBcIlxcXFxcIiArXHJcbiAgICAgIFwiXCIgKyBcIlxcXFxcIiArXHJcbiAgICAgIHRoaXMuaW5wdXRQYXJhbXNGb3JXaWRnZXRGb3JVcGRhdGUuSXRibXMgKyBcIlxcXFxcIiArXHJcbiAgICAgIHRoaXMuaW5wdXRQYXJhbXNGb3JXaWRnZXRGb3JVcGRhdGUuTW9kZVxyXG4gIH1cclxuICBlbmNvZGluZygpIHtcclxuICAgIHJldHVybiBcIlwiICsgXCJcXFxcXCIgK1xyXG4gICAgICB0aGlzLmNhcmRGb3JtLnZhbHVlLm5hbWUgKyBcIlxcXFxcIiArXHJcbiAgICAgIHRoaXMuY2FyZEZvcm0udmFsdWUudmFsaWRpdHlEYXRlLnN1YnN0cmluZygwLCAyKSArIFwiXFxcXFwiICtcclxuICAgICAgdGhpcy5jYXJkRm9ybS52YWx1ZS52YWxpZGl0eURhdGUuc3Vic3RyaW5nKDMpICsgXCJcXFxcXCIgK1xyXG4gICAgICB0aGlzLmlucHV0UGFyYW1zRm9yV2lkZ2V0Rm9yVXBkYXRlLlRva2VuICsgXCJcXFxcXCIgK1xyXG4gICAgICBcIlwiICsgXCJcXFxcXCIgK1xyXG4gICAgICB0aGlzLmlucHV0UGFyYW1zRm9yV2lkZ2V0Rm9yVXBkYXRlLkFQSUtleSArIFwiXFxcXFwiICtcclxuICAgICAgdGhpcy5pbnB1dFBhcmFtc0ZvcldpZGdldEZvclVwZGF0ZS5DdWx0dXJlICsgXCJcXFxcXCIgK1xyXG4gICAgICBcIlwiICsgXCJcXFxcXCIgK1xyXG4gICAgICAodGhpcy5pbnB1dFBhcmFtc0ZvcldpZGdldEZvclVwZGF0ZS5Jc1NhbGUgPz8gZmFsc2UpICsgXCJcXFxcXCIgK1xyXG4gICAgICAodGhpcy5pbnB1dFBhcmFtc0ZvcldpZGdldEZvclVwZGF0ZS5BbW91bnQgPz8gXCIwXCIpICsgXCJcXFxcXCIgK1xyXG4gICAgICAodGhpcy5pbnB1dFBhcmFtc0ZvcldpZGdldEZvclVwZGF0ZS5Qcm9kdWN0RGV0YWlscyA/PyBcIjBcIikgKyBcIlxcXFxcIiArXHJcbiAgICAgIFwiXCIgKyBcIlxcXFxcIiArXHJcbiAgICAgIFwiXCIgKyBcIlxcXFxcIiArXHJcbiAgICAgICh0aGlzLmlucHV0UGFyYW1zRm9yV2lkZ2V0Rm9yVXBkYXRlLkl0Ym1zID8/IFwiMFwiKSArIFwiXFxcXFwiICtcclxuICAgICAgdGhpcy5pbnB1dFBhcmFtc0ZvcldpZGdldEZvclVwZGF0ZS5Nb2RlXHJcbiAgfVxyXG4gIGlubml0aWFsaXplS2V5KGVuY29kZTogc3RyaW5nKSB7XHJcbiAgICB2YXIga2V5ID0gaW5pdGlhbGl6ZUtleSh0aGlzLmlucHV0UGFyYW1zRm9yV2lkZ2V0Rm9yVXBkYXRlLktleXMuRW5jS2V5MSwgdGhpcy5pbnB1dFBhcmFtc0ZvcldpZGdldEZvclVwZGF0ZS5LZXlzLkVuY0tleTIpO1xyXG4gICAgcmV0dXJuIGVuY3J5cHRlZFN0cmluZyhrZXksIGVuY29kZSlcclxuICB9XHJcblxyXG4gIGZvcm1hdERhdGUoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBsZXQgaW5wdXQgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlO1xyXG4gICAgaW5wdXQgPSBpbnB1dC5yZXBsYWNlKC9cXEQvZywgJycpO1xyXG5cclxuICAgIGNvbnN0IG1vbnRoID0gdGhpcy5mb3JtYXRNb250aChpbnB1dC5zdWJzdHJpbmcoMCwgMikpO1xyXG4gICAgY29uc3QgeWVhciA9IGlucHV0LnN1YnN0cmluZygyLCA0KTtcclxuXHJcbiAgICBjb25zdCBmb3JtYXR0ZWREYXRlID0gbW9udGggKyAoeWVhciA/ICcvJyArIHllYXIgOiAnJyk7XHJcbiAgICAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlID0gZm9ybWF0dGVkRGF0ZTtcclxuXHJcbiAgICB0aGlzLmNhcmRGb3JtLmNvbnRyb2xzWyd2YWxpZGl0eURhdGUnXS5zZXRWYWx1ZShmb3JtYXR0ZWREYXRlKTtcclxuICAgIHRoaXMudmFsaWRpdHlEYXRlID0gdGhpcy5jYXJkRm9ybS5jb250cm9sc1sndmFsaWRpdHlEYXRlJ10udmFsdWU7XHJcbiAgICB0aGlzLnZhbGlkYXRlRGF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmb3JtYXRNb250aChtb250aDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHZhbGlkTW9udGggPSBwYXJzZUludChtb250aCwgMTApO1xyXG4gICAgcmV0dXJuICh2YWxpZE1vbnRoID4gMSAmJiB2YWxpZE1vbnRoIDw9IDkpID8gJzAnICsgdmFsaWRNb250aCA6IG1vbnRoO1xyXG4gIH1cclxuXHJcbiAgbWFza05hbWUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLm5hbWUgPyB0aGlzLm5hbWUgOiAnWW91ciBOYW1lJztcclxuICB9XHJcbiAgbWFza0RhdGUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy52YWxpZGl0eURhdGUgPyB0aGlzLnZhbGlkaXR5RGF0ZSA6ICfigKLigKIv4oCi4oCiJztcclxuICB9XHJcblxyXG4gIHZhbGlkYXRlRGF0ZSgpIHtcclxuICAgIGlmICghdGhpcy5pbnB1dFBhcmFtc0ZvcldpZGdldEZvclVwZGF0ZS5Jc1NhbGUpIHtcclxuICAgICAgdGhpcy5zaG93SW5wdXRFcnJvckRhdGUgPSBjYXJkVmFsaWRhdG9yLmV4cGlyYXRpb25EYXRlKHRoaXMudmFsaWRpdHlEYXRlLCB0aGlzLm1heEV4cFllYXIpLmlzVmFsaWQ7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5zaG93SW5wdXRFcnJvckRhdGUgPSB0cnVlXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBiaW5kTmFtZShldmVudDogRXZlbnQpIHtcclxuICAgIHRoaXMubmFtZSA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XHJcbiAgICB0aGlzLnZhbGlkYXRlTmFtZSgpXHJcbiAgfVxyXG4gIGJpbmREYXRlKGV2ZW50OiBFdmVudCkge1xyXG4gICAgdGhpcy52YWxpZGl0eURhdGUgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlOztcclxuICB9XHJcbiAgdmFsaWRhdGVOYW1lKCkge1xyXG4gICAgaWYgKHRoaXMubmFtZS5sZW5ndGggPiA0KSB7XHJcbiAgICAgIHRoaXMuc2hvd0lucHV0RXJyb3JOYW1lID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLnNob3dJbnB1dEVycm9yTmFtZSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCI8Zm9ybSBjbGFzcz1cImNvbnRhaW5lci1mbHVpZCBweS0zXCIgW2Zvcm1Hcm91cF09XCJjYXJkRm9ybVwiICpuZ0lmPVwiKGlucHV0UGFyYW1zRm9yV2lkZ2V0Rm9yVXBkYXRlLkFQSUtleSlcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJwLTBcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgbWItNFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaW5uZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnJvbnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBUb3AgQmFyOiBDaGlwICYgQnJhbmQgTG9nbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtdG9wLWJhclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoaXBcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJyYW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJicmFuZC10ZXh0XCI+U0VDVVJFIENBUkQ8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE1pZGRsZSBCYXI6IENhcmQgTnVtYmVyIChNYXNrZWQpIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1udW1iZXItZGlzcGxheVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3ttYXNrQ2FyZE51bWJlcigpfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBCb3R0b20gQmFyOiBDYXJkaG9sZGVyIE5hbWUgJiBFeHBpcmF0aW9uIERhdGUgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvdHRvbS1iYXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhvbGRlci1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2FyZC1sYWJlbFwiPkNBUkRIT0xERVI8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2FyZC12YWx1ZVwiPnt7bWFza05hbWUoKX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1leHBpcnktaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNhcmQtbGFiZWxcIj57e2N1cnJlbnRMYW5nW1wiVmFsaWRUaHJ1XCJdfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2FyZC12YWx1ZVwiPnt7bWFza0RhdGUoKX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIER5bmFtaWMgRm9ybSBGaWVsZHMgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtZmllbGRzLWNvbnRhaW5lciBtYi0zXCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGZpZWxkIG9mIGZpZWxkc1wiIGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICAgICAgPGZpZWxkLWJ1aWxkZXIgW2ZpZWxkXT1cImZpZWxkXCIgW2Zvcm1dPVwiY2FyZEZvcm1cIj48L2ZpZWxkLWJ1aWxkZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBTdGF0aWMgRm9ybSBGaWVsZHMgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2FyZC1mb3JtLWZpZWxkc1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbWItM1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cC1jdXN0b21cIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwibmFtZVwiIGNsYXNzPVwiZm9ybS1sYWJlbC1jdXN0b21cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3tjdXJyZW50TGFuZ1tcIkNhcmRIb2xkZXJOYW1lXCJdfX0gPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPio8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtd3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2wtY3VzdG9tXCIgdHlwZT1cInRleHRcIiBpZD1cIm5hbWVcIiBbcGxhY2Vob2xkZXJdPVwiY3VycmVudExhbmdbJ0NhcmRIb2xkZXJOYW1lJ11cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmlucHV0RXJyb3JdPVwiIXNob3dJbnB1dEVycm9yTmFtZVwiIChpbnB1dCk9XCJiaW5kTmFtZSgkZXZlbnQpXCIgZm9ybUNvbnRyb2xOYW1lPVwibmFtZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbWItNFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwLWN1c3RvbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJ2YWxpZGl0eS1kYXRlXCIgY2xhc3M9XCJmb3JtLWxhYmVsLWN1c3RvbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7e2N1cnJlbnRMYW5nW1wiRXhwaXJ5RGF0ZVwiXX19IDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIj4qPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LXdyYXBwZXIgZGF0ZS13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbC1jdXN0b21cIiB0eXBlPVwidGV4dFwiIGlkPVwidmFsaWRpdHktZGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuaW5wdXRFcnJvcl09XCIhc2hvd0lucHV0RXJyb3JEYXRlXCIgcGxhY2Vob2xkZXI9XCJNTS9ZWVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ2YWxpZGl0eURhdGVcIiAoaW5wdXQpPVwiZm9ybWF0RGF0ZSgkZXZlbnQpXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYWxlbmRhci1pY29uXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImZvcm0tYWN0aW9ucy1jdXN0b21cIj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLXN1Ym1pdFwiICpuZ0lmPVwiKGlucHV0UGFyYW1zRm9yV2lkZ2V0Rm9yVXBkYXRlLk1vZGU9PUNhcmRNb2RlLkVkaXQpXCIgdHlwZT1cInN1Ym1pdFwiIFtkaXNhYmxlZF09XCIhY2FyZEZvcm0udmFsaWRcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiVXBkYXRlQ2FyZERldGFpbHMoKVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJ0bi10ZXh0XCI+e3tjdXJyZW50TGFuZ1tcIlVwZGF0ZVwiXX19PC9zcGFuPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbjwvZm9ybT5cclxuIl19
|