simpo-component-library 2.0.93 → 2.0.95
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/esm2022/lib/components/payment-details/payment-details.component.mjs +151 -0
- package/esm2022/lib/sections/registration-form/registration-form.component.mjs +87 -3
- package/esm2022/lib/services/events.service.mjs +2 -1
- package/esm2022/lib/services/rest.service.mjs +8 -1
- package/fesm2022/simpo-component-library.mjs +94 -2
- package/fesm2022/simpo-component-library.mjs.map +1 -1
- package/lib/components/payment-details/payment-details.component.d.ts +18 -0
- package/lib/directive/background-directive.d.ts +1 -1
- package/lib/directive/button-directive.directive.d.ts +1 -1
- package/lib/directive/color.directive.d.ts +1 -1
- package/lib/sections/pricing-section/pricing-section.component.d.ts +1 -1
- package/lib/sections/registration-form/registration-form.component.d.ts +14 -2
- package/lib/services/events.service.d.ts +1 -0
- package/lib/services/rest.service.d.ts +2 -0
- package/package.json +1 -1
- package/simpo-component-library-2.0.95.tgz +0 -0
- package/simpo-component-library-2.0.93.tgz +0 -0
@@ -0,0 +1,151 @@
|
|
1
|
+
import { CommonModule } from '@angular/common';
|
2
|
+
import { Component, Input } from '@angular/core';
|
3
|
+
import { FormsModule } from '@angular/forms';
|
4
|
+
import * as i0 from "@angular/core";
|
5
|
+
import * as i1 from "@angular/common";
|
6
|
+
import * as i2 from "@angular/forms";
|
7
|
+
export class PaymentDetailsComponent {
|
8
|
+
constructor() {
|
9
|
+
this.subscriptionsData = [];
|
10
|
+
this.Object = Object;
|
11
|
+
this.feeStructure = {
|
12
|
+
"id": '1234',
|
13
|
+
"businessDetails": {
|
14
|
+
"id": '1234'
|
15
|
+
},
|
16
|
+
"grades": [
|
17
|
+
{
|
18
|
+
"_id": "1234",
|
19
|
+
"name": "Grade II"
|
20
|
+
},
|
21
|
+
{
|
22
|
+
"_id": "1234",
|
23
|
+
"name": "Grade IV"
|
24
|
+
}
|
25
|
+
],
|
26
|
+
"board": "STATE",
|
27
|
+
"academicYearStart": 2024,
|
28
|
+
"academicYearEnd": 2025,
|
29
|
+
"feeConfigs": [
|
30
|
+
{
|
31
|
+
"feeTypeId": '12324',
|
32
|
+
"feeHeadId": '1234',
|
33
|
+
"feeType": "Tution fee",
|
34
|
+
"feeHead": "exam fee",
|
35
|
+
"amount": 300,
|
36
|
+
"discountAmount": 0,
|
37
|
+
"isFixed": false
|
38
|
+
}
|
39
|
+
],
|
40
|
+
"subscriptionPlans": [],
|
41
|
+
"totalAmount": 300,
|
42
|
+
"createdTimestamp": {
|
43
|
+
"$date": "2024-12-15T07:10:54.889Z"
|
44
|
+
},
|
45
|
+
"updatedTimestamp": {
|
46
|
+
"$date": "2024-12-15T07:10:54.889Z"
|
47
|
+
},
|
48
|
+
"active": true,
|
49
|
+
};
|
50
|
+
this.defaultImage = 'https://prod-simpo.s3.ap-south-1.amazonaws.com/prod-images/917067c1734337280303cancel.png';
|
51
|
+
this.subscriptions = {
|
52
|
+
"Food Fee": [
|
53
|
+
{
|
54
|
+
subscriptionTitle: 'Breakfast',
|
55
|
+
pricing: {
|
56
|
+
"WEEKLY": 2000,
|
57
|
+
"MONTHLY": 3000,
|
58
|
+
"YEARLY": 4000
|
59
|
+
}
|
60
|
+
},
|
61
|
+
{
|
62
|
+
subscriptionTitle: 'Lunch',
|
63
|
+
pricing: {
|
64
|
+
"WEEKLY": 2000,
|
65
|
+
"MONTHLY": 3000,
|
66
|
+
"YEARLY": 4000
|
67
|
+
}
|
68
|
+
},
|
69
|
+
{
|
70
|
+
subscriptionTitle: 'Snacks',
|
71
|
+
pricing: {
|
72
|
+
"WEEKLY": 2000,
|
73
|
+
"MONTHLY": 3000,
|
74
|
+
"YEARLY": 4000
|
75
|
+
}
|
76
|
+
}
|
77
|
+
]
|
78
|
+
};
|
79
|
+
}
|
80
|
+
ngOnInit() {
|
81
|
+
this.feeStructure = this.admissionData.studentFeeStructure;
|
82
|
+
this.subscriptions = this.arrangeSubscriptionForAdmission(this.subscriptionsData);
|
83
|
+
this.feeConfig = this.arrangeFeeConfig(this.feeStructure.feeConfigs);
|
84
|
+
this.calculateTotalAmount();
|
85
|
+
}
|
86
|
+
toggleSelection(subscription, frequency) {
|
87
|
+
if (!this.feeStructure.subscriptionPlans)
|
88
|
+
this.feeStructure.subscriptionPlans = [];
|
89
|
+
let removeIndex = -1;
|
90
|
+
for (let i = 0; i < this.feeStructure.subscriptionPlans.length; i++) {
|
91
|
+
let sub = this.feeStructure.subscriptionPlans[i];
|
92
|
+
if (sub.subId === subscription.subId) {
|
93
|
+
removeIndex = i;
|
94
|
+
break;
|
95
|
+
}
|
96
|
+
}
|
97
|
+
if (removeIndex == -1) {
|
98
|
+
this.feeStructure.subscriptionPlans.push({ ...subscription, frequency: frequency });
|
99
|
+
this.calculateTotalAmount();
|
100
|
+
return;
|
101
|
+
}
|
102
|
+
this.feeStructure.subscriptionPlans.splice(removeIndex, 1);
|
103
|
+
if (subscription.selectedOption === frequency) {
|
104
|
+
subscription.selectedOption = null;
|
105
|
+
}
|
106
|
+
else {
|
107
|
+
subscription.selectedOption = frequency;
|
108
|
+
this.feeStructure.subscriptionPlans.push({ ...subscription, frequency: frequency });
|
109
|
+
}
|
110
|
+
this.calculateTotalAmount();
|
111
|
+
}
|
112
|
+
calculateTotalAmount() {
|
113
|
+
this.feeStructure.totalAmount = 0;
|
114
|
+
for (let config of this.feeStructure.feeConfigs) {
|
115
|
+
this.feeStructure.totalAmount += config.amount;
|
116
|
+
}
|
117
|
+
for (let subscription of this.feeStructure.subscriptionPlans) {
|
118
|
+
this.feeStructure.totalAmount += subscription.pricing[subscription.frequency];
|
119
|
+
}
|
120
|
+
}
|
121
|
+
arrangeSubscriptionForAdmission(subscriptionList) {
|
122
|
+
let response = {};
|
123
|
+
for (let subscription of subscriptionList) {
|
124
|
+
if (!response[subscription.subscriptionType]) {
|
125
|
+
response[subscription.subscriptionType] = [];
|
126
|
+
}
|
127
|
+
response[subscription.subscriptionType].push(subscription);
|
128
|
+
}
|
129
|
+
return response;
|
130
|
+
}
|
131
|
+
arrangeFeeConfig(feeConfigList) {
|
132
|
+
let response = {};
|
133
|
+
for (let config of feeConfigList) {
|
134
|
+
if (!response[config.feeType])
|
135
|
+
response[config.feeType] = [];
|
136
|
+
response[config.feeType].push(config);
|
137
|
+
}
|
138
|
+
return response;
|
139
|
+
}
|
140
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.4", ngImport: i0, type: PaymentDetailsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
141
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.4", type: PaymentDetailsComponent, isStandalone: true, selector: "simpo-payment-details", inputs: { admissionData: "admissionData", subscriptionsData: "subscriptionsData" }, ngImport: i0, template: "<section class=\"main-section\">\r\n <div class=\"row\">\r\n <div class=\"col-md-6\">\r\n <div class=\"heading left-side\">\r\n Admission Fee\r\n </div>\r\n\r\n <div class=\"left-side mt-10\" *ngFor=\"let configList of Object.keys(feeConfig)\">\r\n <div class=\"heading mb-20\">{{configList}}</div>\r\n\r\n <div class=\"d-flex justify-space mt-10 mb-15\" *ngFor=\"let config of feeConfig[configList]\">\r\n <p class=\"sub-heading mb-0\">{{config.feeHead}}</p>\r\n <p class=\"amount mb-0\">\u20B9 {{config.amount}}</p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"left-side mt-10\" *ngFor=\"let type of Object.keys(subscriptions)\">\r\n <p class=\"heading\">{{type}}</p>\r\n\r\n <table class=\"subscription-table w-100\">\r\n <thead>\r\n <th>Subscription Title</th>\r\n <th>Monthly</th>\r\n <th>Quaterly</th>\r\n <th>Yearly</th>\r\n <th>On Demand</th>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let data of subscriptions[type];let i = index\">\r\n <td>{{data.subName}}</td>\r\n <td>\r\n <div class=\"form-check\" *ngIf=\"data.pricing['QUARTERLY']\">\r\n <input class=\"form-check-input\" type=\"radio\" name=\"subscription{{i}}\" [value]=\"'MONTHLY'\" (click)=\"toggleSelection(data, 'MONTHLY')\" [checked]=\"data.selectedOption === 'MONTHLY'\" [(ngModel)]=\"data.selectedOption\" id=\"flexRadioDefault2\">\r\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\r\n \u20B9 {{data.pricing['MONTHLY']}}\r\n </label>\r\n </div>\r\n <img class=\"defaultImage\" *ngIf=\"!data.pricing['QUARTERLY']\" [src]=\"defaultImage\" alt=\"\">\r\n </td>\r\n <td>\r\n <div class=\"form-check\" *ngIf=\"data.pricing['MONTHLY']\">\r\n <input class=\"form-check-input\" type=\"radio\" name=\"subscription{{i}}\" [value]=\"'QUARTERLY'\" (click)=\"toggleSelection(data, 'QUARTERLY')\" [checked]=\"data.selectedOption === 'QUARTERLY'\" [(ngModel)]=\"data.selectedOption\" id=\"flexCheckChecked\">\r\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\r\n \u20B9 {{data.pricing['QUARTERLY']}}\r\n </label>\r\n <img class=\"defaultImage\" *ngIf=\"!data.pricing['MONTHLY']\" [src]=\"defaultImage\" alt=\"\">\r\n </div>\r\n </td>\r\n <td>\r\n <div class=\"form-check\" *ngIf=\"data.pricing['ANNUALLY']\">\r\n <input class=\"form-check-input\" type=\"radio\" name=\"subscription{{i}}\" [value]=\"'ANNUALLY'\" (click)=\"toggleSelection(data, 'ANNUALLY')\" [checked]=\"data.selectedOption === 'ANNUALLY'\" [(ngModel)]=\"data.selectedOption\" id=\"flexCheckChecked\">\r\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\r\n \u20B9 {{data.pricing['ANNUALLY']}}\r\n </label>\r\n </div>\r\n <img class=\"defaultImage\" *ngIf=\"!data.pricing['ANNUALLY']\" [src]=\"defaultImage\" alt=\"\">\r\n </td>\r\n <td>\r\n <div class=\"form-check\" *ngIf=\"data.pricing['ONDEMAND']\">\r\n <input class=\"form-check-input\" type=\"radio\" name=\"subscription{{i}}\" [value]=\"'ONDEMAND'\" (click)=\"toggleSelection(data, 'ONDEMAND')\" [checked]=\"data.selectedOption === 'ONDEMAND'\" [(ngModel)]=\"data.selectedOption\" id=\"flexCheckChecked\">\r\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\r\n \u20B9 {{data.pricing['ONDEMAND']}}\r\n </label>\r\n </div>\r\n <img class=\"defaultImage\" *ngIf=\"!data.pricing['ONDEMAND']\" [src]=\"defaultImage\" alt=\"\">\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n <div class=\"col-md-6 right-side\">\r\n <div class=\"heading mb-20\">\r\n Fee Calculation\r\n </div>\r\n <div class=\"d-flex justify-space mt-10 mb-15\" *ngFor=\"let config of feeStructure.feeConfigs\">\r\n <p class=\"sub-heading mb-0\">{{config.feeHead}}</p>\r\n <p class=\"amount mb-0\">\u20B9 {{config.amount}}</p>\r\n </div>\r\n\r\n <div class=\"d-flex justify-space mt-10 mb-15\" *ngFor=\"let subscripition of feeStructure.subscriptionPlans\">\r\n <p class=\"sub-heading mb-0\">{{subscripition.subName}}</p>\r\n <p class=\"amount mb-0\">\u20B9 {{subscripition.pricing[subscripition.frequency]}}</p>\r\n </div>\r\n\r\n <div class=\"total-fee\">\r\n <div class=\"heading mb-5\">\r\n Total Fee\r\n </div>\r\n <div class=\"amount\">\r\n \u20B9 {{feeStructure.totalAmount}}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n", styles: [".heading{font-size:18px;font-weight:500}.left-side{background:#fafcff99;padding:2rem}.mt-10{margin-top:10px}.justify-space{justify-content:space-between}.sub-heading,.amount{font-size:16px;font-weight:500}.mb-0{margin-bottom:0}.mb-20{margin-bottom:20px}.mb-15{margin-bottom:15px}.subscription-table{width:50%}.subscription-table th{color:#434443;font-weight:400;font-size:16px;font-family:DM SANS}.subscription-table td{font-weight:500;color:#000;font-size:16px;margin-top:67px;padding-top:10px}.right-side{background-color:#fdfbfa;padding:2rem;position:relative}.right-side .sub-heading{font-size:18px}.right-side .amount{font-size:16px}.right-side .heading{font-weight:400}.mb-5{margin-bottom:5px}.total-fee{position:absolute;bottom:20px;width:90%}.total-fee .amount{background:#fff;height:87px;display:flex;align-items:center;justify-content:center;font-size:32px;border-radius:8px}.defaultImage{height:15px;width:15px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.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: i2.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] }); }
|
142
|
+
}
|
143
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.4", ngImport: i0, type: PaymentDetailsComponent, decorators: [{
|
144
|
+
type: Component,
|
145
|
+
args: [{ selector: 'simpo-payment-details', standalone: true, imports: [CommonModule, FormsModule], template: "<section class=\"main-section\">\r\n <div class=\"row\">\r\n <div class=\"col-md-6\">\r\n <div class=\"heading left-side\">\r\n Admission Fee\r\n </div>\r\n\r\n <div class=\"left-side mt-10\" *ngFor=\"let configList of Object.keys(feeConfig)\">\r\n <div class=\"heading mb-20\">{{configList}}</div>\r\n\r\n <div class=\"d-flex justify-space mt-10 mb-15\" *ngFor=\"let config of feeConfig[configList]\">\r\n <p class=\"sub-heading mb-0\">{{config.feeHead}}</p>\r\n <p class=\"amount mb-0\">\u20B9 {{config.amount}}</p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"left-side mt-10\" *ngFor=\"let type of Object.keys(subscriptions)\">\r\n <p class=\"heading\">{{type}}</p>\r\n\r\n <table class=\"subscription-table w-100\">\r\n <thead>\r\n <th>Subscription Title</th>\r\n <th>Monthly</th>\r\n <th>Quaterly</th>\r\n <th>Yearly</th>\r\n <th>On Demand</th>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let data of subscriptions[type];let i = index\">\r\n <td>{{data.subName}}</td>\r\n <td>\r\n <div class=\"form-check\" *ngIf=\"data.pricing['QUARTERLY']\">\r\n <input class=\"form-check-input\" type=\"radio\" name=\"subscription{{i}}\" [value]=\"'MONTHLY'\" (click)=\"toggleSelection(data, 'MONTHLY')\" [checked]=\"data.selectedOption === 'MONTHLY'\" [(ngModel)]=\"data.selectedOption\" id=\"flexRadioDefault2\">\r\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\r\n \u20B9 {{data.pricing['MONTHLY']}}\r\n </label>\r\n </div>\r\n <img class=\"defaultImage\" *ngIf=\"!data.pricing['QUARTERLY']\" [src]=\"defaultImage\" alt=\"\">\r\n </td>\r\n <td>\r\n <div class=\"form-check\" *ngIf=\"data.pricing['MONTHLY']\">\r\n <input class=\"form-check-input\" type=\"radio\" name=\"subscription{{i}}\" [value]=\"'QUARTERLY'\" (click)=\"toggleSelection(data, 'QUARTERLY')\" [checked]=\"data.selectedOption === 'QUARTERLY'\" [(ngModel)]=\"data.selectedOption\" id=\"flexCheckChecked\">\r\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\r\n \u20B9 {{data.pricing['QUARTERLY']}}\r\n </label>\r\n <img class=\"defaultImage\" *ngIf=\"!data.pricing['MONTHLY']\" [src]=\"defaultImage\" alt=\"\">\r\n </div>\r\n </td>\r\n <td>\r\n <div class=\"form-check\" *ngIf=\"data.pricing['ANNUALLY']\">\r\n <input class=\"form-check-input\" type=\"radio\" name=\"subscription{{i}}\" [value]=\"'ANNUALLY'\" (click)=\"toggleSelection(data, 'ANNUALLY')\" [checked]=\"data.selectedOption === 'ANNUALLY'\" [(ngModel)]=\"data.selectedOption\" id=\"flexCheckChecked\">\r\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\r\n \u20B9 {{data.pricing['ANNUALLY']}}\r\n </label>\r\n </div>\r\n <img class=\"defaultImage\" *ngIf=\"!data.pricing['ANNUALLY']\" [src]=\"defaultImage\" alt=\"\">\r\n </td>\r\n <td>\r\n <div class=\"form-check\" *ngIf=\"data.pricing['ONDEMAND']\">\r\n <input class=\"form-check-input\" type=\"radio\" name=\"subscription{{i}}\" [value]=\"'ONDEMAND'\" (click)=\"toggleSelection(data, 'ONDEMAND')\" [checked]=\"data.selectedOption === 'ONDEMAND'\" [(ngModel)]=\"data.selectedOption\" id=\"flexCheckChecked\">\r\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\r\n \u20B9 {{data.pricing['ONDEMAND']}}\r\n </label>\r\n </div>\r\n <img class=\"defaultImage\" *ngIf=\"!data.pricing['ONDEMAND']\" [src]=\"defaultImage\" alt=\"\">\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n <div class=\"col-md-6 right-side\">\r\n <div class=\"heading mb-20\">\r\n Fee Calculation\r\n </div>\r\n <div class=\"d-flex justify-space mt-10 mb-15\" *ngFor=\"let config of feeStructure.feeConfigs\">\r\n <p class=\"sub-heading mb-0\">{{config.feeHead}}</p>\r\n <p class=\"amount mb-0\">\u20B9 {{config.amount}}</p>\r\n </div>\r\n\r\n <div class=\"d-flex justify-space mt-10 mb-15\" *ngFor=\"let subscripition of feeStructure.subscriptionPlans\">\r\n <p class=\"sub-heading mb-0\">{{subscripition.subName}}</p>\r\n <p class=\"amount mb-0\">\u20B9 {{subscripition.pricing[subscripition.frequency]}}</p>\r\n </div>\r\n\r\n <div class=\"total-fee\">\r\n <div class=\"heading mb-5\">\r\n Total Fee\r\n </div>\r\n <div class=\"amount\">\r\n \u20B9 {{feeStructure.totalAmount}}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n", styles: [".heading{font-size:18px;font-weight:500}.left-side{background:#fafcff99;padding:2rem}.mt-10{margin-top:10px}.justify-space{justify-content:space-between}.sub-heading,.amount{font-size:16px;font-weight:500}.mb-0{margin-bottom:0}.mb-20{margin-bottom:20px}.mb-15{margin-bottom:15px}.subscription-table{width:50%}.subscription-table th{color:#434443;font-weight:400;font-size:16px;font-family:DM SANS}.subscription-table td{font-weight:500;color:#000;font-size:16px;margin-top:67px;padding-top:10px}.right-side{background-color:#fdfbfa;padding:2rem;position:relative}.right-side .sub-heading{font-size:18px}.right-side .amount{font-size:16px}.right-side .heading{font-weight:400}.mb-5{margin-bottom:5px}.total-fee{position:absolute;bottom:20px;width:90%}.total-fee .amount{background:#fff;height:87px;display:flex;align-items:center;justify-content:center;font-size:32px;border-radius:8px}.defaultImage{height:15px;width:15px}\n"] }]
|
146
|
+
}], ctorParameters: () => [], propDecorators: { admissionData: [{
|
147
|
+
type: Input
|
148
|
+
}], subscriptionsData: [{
|
149
|
+
type: Input
|
150
|
+
}] } });
|
151
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF5bWVudC1kZXRhaWxzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NpbXBvLXVpL3NyYy9saWIvY29tcG9uZW50cy9wYXltZW50LWRldGFpbHMvcGF5bWVudC1kZXRhaWxzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NpbXBvLXVpL3NyYy9saWIvY29tcG9uZW50cy9wYXltZW50LWRldGFpbHMvcGF5bWVudC1kZXRhaWxzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7QUFTN0MsTUFBTSxPQUFPLHVCQUF1QjtJQUtsQztRQUhTLHNCQUFpQixHQUFVLEVBQUUsQ0FBQTtRQUN0QyxXQUFNLEdBQUcsTUFBTSxDQUFBO1FBSWYsaUJBQVksR0FBUTtZQUNsQixJQUFJLEVBQUUsTUFBTTtZQUNaLGlCQUFpQixFQUFFO2dCQUNqQixJQUFJLEVBQUUsTUFBTTthQUNiO1lBQ0QsUUFBUSxFQUFFO2dCQUNSO29CQUNFLEtBQUssRUFBRSxNQUFNO29CQUNiLE1BQU0sRUFBRSxVQUFVO2lCQUNuQjtnQkFDRDtvQkFDRSxLQUFLLEVBQUUsTUFBTTtvQkFDYixNQUFNLEVBQUUsVUFBVTtpQkFDbkI7YUFDRjtZQUNELE9BQU8sRUFBRSxPQUFPO1lBQ2hCLG1CQUFtQixFQUFFLElBQUk7WUFDekIsaUJBQWlCLEVBQUUsSUFBSTtZQUN2QixZQUFZLEVBQUU7Z0JBQ1o7b0JBQ0UsV0FBVyxFQUFFLE9BQU87b0JBQ3BCLFdBQVcsRUFBRSxNQUFNO29CQUNuQixTQUFTLEVBQUUsWUFBWTtvQkFDdkIsU0FBUyxFQUFFLFVBQVU7b0JBQ3JCLFFBQVEsRUFBRSxHQUFHO29CQUNiLGdCQUFnQixFQUFFLENBQUM7b0JBQ25CLFNBQVMsRUFBRSxLQUFLO2lCQUNqQjthQUNGO1lBQ0QsbUJBQW1CLEVBQUUsRUFBRTtZQUN2QixhQUFhLEVBQUUsR0FBRztZQUNsQixrQkFBa0IsRUFBRTtnQkFDbEIsT0FBTyxFQUFFLDBCQUEwQjthQUNwQztZQUNELGtCQUFrQixFQUFFO2dCQUNsQixPQUFPLEVBQUUsMEJBQTBCO2FBQ3BDO1lBQ0QsUUFBUSxFQUFFLElBQUk7U0FDZixDQUFBO1FBV0QsaUJBQVksR0FBVywyRkFBMkYsQ0FBQztRQUNuSCxrQkFBYSxHQUFRO1lBQ25CLFVBQVUsRUFBRztnQkFDWDtvQkFDRSxpQkFBaUIsRUFBRyxXQUFXO29CQUMvQixPQUFPLEVBQUk7d0JBQ1QsUUFBUSxFQUFHLElBQUk7d0JBQ2YsU0FBUyxFQUFJLElBQUk7d0JBQ2pCLFFBQVEsRUFBRyxJQUFJO3FCQUNoQjtpQkFDRjtnQkFDRDtvQkFDRSxpQkFBaUIsRUFBRyxPQUFPO29CQUMzQixPQUFPLEVBQUk7d0JBQ1QsUUFBUSxFQUFHLElBQUk7d0JBQ2YsU0FBUyxFQUFJLElBQUk7d0JBQ2pCLFFBQVEsRUFBRyxJQUFJO3FCQUNoQjtpQkFDRjtnQkFDRDtvQkFDRSxpQkFBaUIsRUFBRyxRQUFRO29CQUM1QixPQUFPLEVBQUk7d0JBQ1QsUUFBUSxFQUFHLElBQUk7d0JBQ2YsU0FBUyxFQUFJLElBQUk7d0JBQ2pCLFFBQVEsRUFBRyxJQUFJO3FCQUNoQjtpQkFDRjthQUNGO1NBQ0YsQ0FBQTtJQS9FYyxDQUFDO0lBNENoQixRQUFRO1FBQ04sSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLG1CQUFtQixDQUFDO1FBQzNELElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLCtCQUErQixDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ2xGLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDckUsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDOUIsQ0FBQztJQWdDRCxlQUFlLENBQUMsWUFBaUIsRUFBRSxTQUFpQjtRQUNsRCxJQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxpQkFBaUI7WUFDckMsSUFBSSxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsR0FBRyxFQUFFLENBQUM7UUFFM0MsSUFBSSxXQUFXLEdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDN0IsS0FBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUMsQ0FBQyxHQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDL0QsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUVqRCxJQUFHLEdBQUcsQ0FBQyxLQUFLLEtBQUssWUFBWSxDQUFDLEtBQUssRUFBQyxDQUFDO2dCQUNuQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO2dCQUNoQixNQUFNO1lBQ1IsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFHLFdBQVcsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQUMsR0FBRyxZQUFZLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBQyxDQUFDLENBQUE7WUFDakYsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDNUIsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFM0QsSUFBSSxZQUFZLENBQUMsY0FBYyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzlDLFlBQVksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1FBQ3JDLENBQUM7YUFBTSxDQUFDO1lBQ04sWUFBWSxDQUFDLGNBQWMsR0FBRyxTQUFTLENBQUM7WUFDeEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBQyxHQUFHLFlBQVksRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFDLENBQUMsQ0FBQTtRQUNuRixDQUFDO1FBRUQsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVELG9CQUFvQjtRQUNsQixJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7UUFFbEMsS0FBSSxJQUFJLE1BQU0sSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQy9DLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDakQsQ0FBQztRQUVELEtBQUksSUFBSSxZQUFZLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQzVELElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2hGLENBQUM7SUFDSCxDQUFDO0lBRUQsK0JBQStCLENBQUMsZ0JBQXVCO1FBQ3JELElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUV2QixLQUFJLElBQUksWUFBWSxJQUFJLGdCQUFnQixFQUFFLENBQUM7WUFDekMsSUFBRyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO2dCQUM1QyxRQUFRLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQy9DLENBQUM7WUFDRCxRQUFRLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzdELENBQUM7UUFFRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsYUFBb0I7UUFDbkMsSUFBSSxRQUFRLEdBQVEsRUFBRSxDQUFDO1FBRXZCLEtBQUksSUFBSSxNQUFNLElBQUksYUFBYSxFQUFFLENBQUM7WUFDaEMsSUFBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO2dCQUMxQixRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUVoQyxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN4QyxDQUFDO1FBRUQsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQzs4R0ExSlUsdUJBQXVCO2tHQUF2Qix1QkFBdUIscUtDWHBDLGsrSkFnR0EscTlCRHpGWSxZQUFZLCtQQUFFLFdBQVc7OzJGQUl4Qix1QkFBdUI7a0JBUG5DLFNBQVM7K0JBQ0UsdUJBQXVCLGNBQ3JCLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxXQUFXLENBQUM7d0RBSzNCLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnc2ltcG8tcGF5bWVudC1kZXRhaWxzJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlXSxcclxuICB0ZW1wbGF0ZVVybDogJy4vcGF5bWVudC1kZXRhaWxzLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vcGF5bWVudC1kZXRhaWxzLmNvbXBvbmVudC5jc3MnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQYXltZW50RGV0YWlsc0NvbXBvbmVudCB7XHJcbiAgQElucHV0KCkgYWRtaXNzaW9uRGF0YTogYW55O1xyXG4gIEBJbnB1dCgpIHN1YnNjcmlwdGlvbnNEYXRhOiBhbnlbXSA9IFtdXHJcbiAgT2JqZWN0ID0gT2JqZWN0XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge31cclxuXHJcbiAgZmVlU3RydWN0dXJlOiBhbnkgPSB7XHJcbiAgICBcImlkXCI6ICcxMjM0JyxcclxuICAgIFwiYnVzaW5lc3NEZXRhaWxzXCI6IHtcclxuICAgICAgXCJpZFwiOiAnMTIzNCdcclxuICAgIH0sXHJcbiAgICBcImdyYWRlc1wiOiBbXHJcbiAgICAgIHtcclxuICAgICAgICBcIl9pZFwiOiBcIjEyMzRcIixcclxuICAgICAgICBcIm5hbWVcIjogXCJHcmFkZSBJSVwiXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBcIl9pZFwiOiBcIjEyMzRcIixcclxuICAgICAgICBcIm5hbWVcIjogXCJHcmFkZSBJVlwiXHJcbiAgICAgIH1cclxuICAgIF0sXHJcbiAgICBcImJvYXJkXCI6IFwiU1RBVEVcIixcclxuICAgIFwiYWNhZGVtaWNZZWFyU3RhcnRcIjogMjAyNCxcclxuICAgIFwiYWNhZGVtaWNZZWFyRW5kXCI6IDIwMjUsXHJcbiAgICBcImZlZUNvbmZpZ3NcIjogW1xyXG4gICAgICB7XHJcbiAgICAgICAgXCJmZWVUeXBlSWRcIjogJzEyMzI0JyxcclxuICAgICAgICBcImZlZUhlYWRJZFwiOiAnMTIzNCcsXHJcbiAgICAgICAgXCJmZWVUeXBlXCI6IFwiVHV0aW9uIGZlZVwiLFxyXG4gICAgICAgIFwiZmVlSGVhZFwiOiBcImV4YW0gZmVlXCIsXHJcbiAgICAgICAgXCJhbW91bnRcIjogMzAwLFxyXG4gICAgICAgIFwiZGlzY291bnRBbW91bnRcIjogMCxcclxuICAgICAgICBcImlzRml4ZWRcIjogZmFsc2VcclxuICAgICAgfVxyXG4gICAgXSxcclxuICAgIFwic3Vic2NyaXB0aW9uUGxhbnNcIjogW10sXHJcbiAgICBcInRvdGFsQW1vdW50XCI6IDMwMCxcclxuICAgIFwiY3JlYXRlZFRpbWVzdGFtcFwiOiB7XHJcbiAgICAgIFwiJGRhdGVcIjogXCIyMDI0LTEyLTE1VDA3OjEwOjU0Ljg4OVpcIlxyXG4gICAgfSxcclxuICAgIFwidXBkYXRlZFRpbWVzdGFtcFwiOiB7XHJcbiAgICAgIFwiJGRhdGVcIjogXCIyMDI0LTEyLTE1VDA3OjEwOjU0Ljg4OVpcIlxyXG4gICAgfSxcclxuICAgIFwiYWN0aXZlXCI6IHRydWUsXHJcbiAgfVxyXG5cclxuXHJcbiAgZmVlQ29uZmlnOiBhbnk7XHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLmZlZVN0cnVjdHVyZSA9IHRoaXMuYWRtaXNzaW9uRGF0YS5zdHVkZW50RmVlU3RydWN0dXJlO1xyXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zID0gdGhpcy5hcnJhbmdlU3Vic2NyaXB0aW9uRm9yQWRtaXNzaW9uKHRoaXMuc3Vic2NyaXB0aW9uc0RhdGEpO1xyXG4gICAgdGhpcy5mZWVDb25maWcgPSB0aGlzLmFycmFuZ2VGZWVDb25maWcodGhpcy5mZWVTdHJ1Y3R1cmUuZmVlQ29uZmlncyk7XHJcbiAgICB0aGlzLmNhbGN1bGF0ZVRvdGFsQW1vdW50KCk7XHJcbiAgfVxyXG5cclxuICBkZWZhdWx0SW1hZ2U6IHN0cmluZyA9ICdodHRwczovL3Byb2Qtc2ltcG8uczMuYXAtc291dGgtMS5hbWF6b25hd3MuY29tL3Byb2QtaW1hZ2VzLzkxNzA2N2MxNzM0MzM3MjgwMzAzY2FuY2VsLnBuZyc7XHJcbiAgc3Vic2NyaXB0aW9uczogYW55ID0ge1xyXG4gICAgXCJGb29kIEZlZVwiIDogW1xyXG4gICAgICB7XHJcbiAgICAgICAgc3Vic2NyaXB0aW9uVGl0bGUgOiAnQnJlYWtmYXN0JyxcclxuICAgICAgICBwcmljaW5nICA6IHtcclxuICAgICAgICAgIFwiV0VFS0xZXCIgOiAyMDAwLFxyXG4gICAgICAgICAgXCJNT05USExZXCIgIDogMzAwMCxcclxuICAgICAgICAgIFwiWUVBUkxZXCIgOiA0MDAwXHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgc3Vic2NyaXB0aW9uVGl0bGUgOiAnTHVuY2gnLFxyXG4gICAgICAgIHByaWNpbmcgIDoge1xyXG4gICAgICAgICAgXCJXRUVLTFlcIiA6IDIwMDAsXHJcbiAgICAgICAgICBcIk1PTlRITFlcIiAgOiAzMDAwLFxyXG4gICAgICAgICAgXCJZRUFSTFlcIiA6IDQwMDBcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBzdWJzY3JpcHRpb25UaXRsZSA6ICdTbmFja3MnLFxyXG4gICAgICAgIHByaWNpbmcgIDoge1xyXG4gICAgICAgICAgXCJXRUVLTFlcIiA6IDIwMDAsXHJcbiAgICAgICAgICBcIk1PTlRITFlcIiAgOiAzMDAwLFxyXG4gICAgICAgICAgXCJZRUFSTFlcIiA6IDQwMDBcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIF1cclxuICB9XHJcblxyXG4gIHRvZ2dsZVNlbGVjdGlvbihzdWJzY3JpcHRpb246IGFueSwgZnJlcXVlbmN5OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmKCF0aGlzLmZlZVN0cnVjdHVyZS5zdWJzY3JpcHRpb25QbGFucylcclxuICAgICAgdGhpcy5mZWVTdHJ1Y3R1cmUuc3Vic2NyaXB0aW9uUGxhbnMgPSBbXTtcclxuXHJcbiAgICBsZXQgcmVtb3ZlSW5kZXg6IG51bWJlciA9IC0xO1xyXG4gICAgZm9yKGxldCBpID0gMDtpPHRoaXMuZmVlU3RydWN0dXJlLnN1YnNjcmlwdGlvblBsYW5zLmxlbmd0aDtpKyspIHtcclxuICAgICAgbGV0IHN1YiA9IHRoaXMuZmVlU3RydWN0dXJlLnN1YnNjcmlwdGlvblBsYW5zW2ldO1xyXG5cclxuICAgICAgaWYoc3ViLnN1YklkID09PSBzdWJzY3JpcHRpb24uc3ViSWQpe1xyXG4gICAgICAgIHJlbW92ZUluZGV4ID0gaTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmKHJlbW92ZUluZGV4ID09IC0xKSB7XHJcbiAgICAgIHRoaXMuZmVlU3RydWN0dXJlLnN1YnNjcmlwdGlvblBsYW5zLnB1c2goey4uLnN1YnNjcmlwdGlvbiwgZnJlcXVlbmN5OiBmcmVxdWVuY3l9KVxyXG4gICAgICB0aGlzLmNhbGN1bGF0ZVRvdGFsQW1vdW50KCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmZlZVN0cnVjdHVyZS5zdWJzY3JpcHRpb25QbGFucy5zcGxpY2UocmVtb3ZlSW5kZXgsIDEpO1xyXG5cclxuICAgIGlmIChzdWJzY3JpcHRpb24uc2VsZWN0ZWRPcHRpb24gPT09IGZyZXF1ZW5jeSkge1xyXG4gICAgICBzdWJzY3JpcHRpb24uc2VsZWN0ZWRPcHRpb24gPSBudWxsO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgc3Vic2NyaXB0aW9uLnNlbGVjdGVkT3B0aW9uID0gZnJlcXVlbmN5O1xyXG4gICAgICB0aGlzLmZlZVN0cnVjdHVyZS5zdWJzY3JpcHRpb25QbGFucy5wdXNoKHsuLi5zdWJzY3JpcHRpb24sIGZyZXF1ZW5jeTogZnJlcXVlbmN5fSlcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNhbGN1bGF0ZVRvdGFsQW1vdW50KCk7XHJcbiAgfVxyXG5cclxuICBjYWxjdWxhdGVUb3RhbEFtb3VudCgpIHtcclxuICAgIHRoaXMuZmVlU3RydWN0dXJlLnRvdGFsQW1vdW50ID0gMDtcclxuXHJcbiAgICBmb3IobGV0IGNvbmZpZyBvZiB0aGlzLmZlZVN0cnVjdHVyZS5mZWVDb25maWdzKSB7XHJcbiAgICAgIHRoaXMuZmVlU3RydWN0dXJlLnRvdGFsQW1vdW50ICs9IGNvbmZpZy5hbW91bnQ7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yKGxldCBzdWJzY3JpcHRpb24gb2YgdGhpcy5mZWVTdHJ1Y3R1cmUuc3Vic2NyaXB0aW9uUGxhbnMpIHtcclxuICAgICAgdGhpcy5mZWVTdHJ1Y3R1cmUudG90YWxBbW91bnQgKz0gc3Vic2NyaXB0aW9uLnByaWNpbmdbc3Vic2NyaXB0aW9uLmZyZXF1ZW5jeV07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhcnJhbmdlU3Vic2NyaXB0aW9uRm9yQWRtaXNzaW9uKHN1YnNjcmlwdGlvbkxpc3Q6IGFueVtdKSB7XHJcbiAgICBsZXQgcmVzcG9uc2U6IGFueSA9IHt9O1xyXG5cclxuICAgIGZvcihsZXQgc3Vic2NyaXB0aW9uIG9mIHN1YnNjcmlwdGlvbkxpc3QpIHtcclxuICAgICAgaWYoIXJlc3BvbnNlW3N1YnNjcmlwdGlvbi5zdWJzY3JpcHRpb25UeXBlXSkge1xyXG4gICAgICAgIHJlc3BvbnNlW3N1YnNjcmlwdGlvbi5zdWJzY3JpcHRpb25UeXBlXSA9IFtdO1xyXG4gICAgICB9XHJcbiAgICAgIHJlc3BvbnNlW3N1YnNjcmlwdGlvbi5zdWJzY3JpcHRpb25UeXBlXS5wdXNoKHN1YnNjcmlwdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gIH1cclxuXHJcbiAgYXJyYW5nZUZlZUNvbmZpZyhmZWVDb25maWdMaXN0OiBhbnlbXSkge1xyXG4gICAgbGV0IHJlc3BvbnNlOiBhbnkgPSB7fTtcclxuXHJcbiAgICBmb3IobGV0IGNvbmZpZyBvZiBmZWVDb25maWdMaXN0KSB7XHJcbiAgICAgIGlmKCFyZXNwb25zZVtjb25maWcuZmVlVHlwZV0pXHJcbiAgICAgICAgcmVzcG9uc2VbY29uZmlnLmZlZVR5cGVdID0gW107XHJcblxyXG4gICAgICByZXNwb25zZVtjb25maWcuZmVlVHlwZV0ucHVzaChjb25maWcpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXNwb25zZTtcclxuICB9XHJcbn1cclxuIiwiPHNlY3Rpb24gY2xhc3M9XCJtYWluLXNlY3Rpb25cIj5cclxuICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImhlYWRpbmcgbGVmdC1zaWRlXCI+XHJcbiAgICAgICAgQWRtaXNzaW9uIEZlZVxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJsZWZ0LXNpZGUgbXQtMTBcIiAqbmdGb3I9XCJsZXQgY29uZmlnTGlzdCBvZiBPYmplY3Qua2V5cyhmZWVDb25maWcpXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRpbmcgbWItMjBcIj57e2NvbmZpZ0xpc3R9fTwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktc3BhY2UgbXQtMTAgbWItMTVcIiAqbmdGb3I9XCJsZXQgY29uZmlnIG9mIGZlZUNvbmZpZ1tjb25maWdMaXN0XVwiPlxyXG4gICAgICAgICAgPHAgY2xhc3M9XCJzdWItaGVhZGluZyBtYi0wXCI+e3tjb25maWcuZmVlSGVhZH19PC9wPlxyXG4gICAgICAgICAgPHAgY2xhc3M9XCJhbW91bnQgbWItMFwiPuKCuSB7e2NvbmZpZy5hbW91bnR9fTwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwibGVmdC1zaWRlIG10LTEwXCIgKm5nRm9yPVwibGV0IHR5cGUgb2YgT2JqZWN0LmtleXMoc3Vic2NyaXB0aW9ucylcIj5cclxuICAgICAgICA8cCBjbGFzcz1cImhlYWRpbmdcIj57e3R5cGV9fTwvcD5cclxuXHJcbiAgICAgICAgPHRhYmxlIGNsYXNzPVwic3Vic2NyaXB0aW9uLXRhYmxlIHctMTAwXCI+XHJcbiAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgIDx0aD5TdWJzY3JpcHRpb24gVGl0bGU8L3RoPlxyXG4gICAgICAgICAgICA8dGg+TW9udGhseTwvdGg+XHJcbiAgICAgICAgICAgIDx0aD5RdWF0ZXJseTwvdGg+XHJcbiAgICAgICAgICAgIDx0aD5ZZWFybHk8L3RoPlxyXG4gICAgICAgICAgICA8dGg+T24gRGVtYW5kPC90aD5cclxuICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgZGF0YSBvZiBzdWJzY3JpcHRpb25zW3R5cGVdO2xldCBpID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICA8dGQ+e3tkYXRhLnN1Yk5hbWV9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2tcIiAqbmdJZj1cImRhdGEucHJpY2luZ1snUVVBUlRFUkxZJ11cIj5cclxuICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJzdWJzY3JpcHRpb257e2l9fVwiICBbdmFsdWVdPVwiJ01PTlRITFknXCIgKGNsaWNrKT1cInRvZ2dsZVNlbGVjdGlvbihkYXRhLCAnTU9OVEhMWScpXCIgIFtjaGVja2VkXT1cImRhdGEuc2VsZWN0ZWRPcHRpb24gPT09ICdNT05USExZJ1wiICBbKG5nTW9kZWwpXT1cImRhdGEuc2VsZWN0ZWRPcHRpb25cIiBpZD1cImZsZXhSYWRpb0RlZmF1bHQyXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJmbGV4Q2hlY2tDaGVja2VkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAg4oK5IHt7ZGF0YS5wcmljaW5nWydNT05USExZJ119fVxyXG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiZGVmYXVsdEltYWdlXCIgKm5nSWY9XCIhZGF0YS5wcmljaW5nWydRVUFSVEVSTFknXVwiIFtzcmNdPVwiZGVmYXVsdEltYWdlXCIgYWx0PVwiXCI+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2tcIiAqbmdJZj1cImRhdGEucHJpY2luZ1snTU9OVEhMWSddXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwicmFkaW9cIiBuYW1lPVwic3Vic2NyaXB0aW9ue3tpfX1cIiBbdmFsdWVdPVwiJ1FVQVJURVJMWSdcIiAoY2xpY2spPVwidG9nZ2xlU2VsZWN0aW9uKGRhdGEsICdRVUFSVEVSTFknKVwiICBbY2hlY2tlZF09XCJkYXRhLnNlbGVjdGVkT3B0aW9uID09PSAnUVVBUlRFUkxZJ1wiIFsobmdNb2RlbCldPVwiZGF0YS5zZWxlY3RlZE9wdGlvblwiIGlkPVwiZmxleENoZWNrQ2hlY2tlZFwiPlxyXG4gICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCIgZm9yPVwiZmxleENoZWNrQ2hlY2tlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIOKCuSB7e2RhdGEucHJpY2luZ1snUVVBUlRFUkxZJ119fVxyXG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiZGVmYXVsdEltYWdlXCIgKm5nSWY9XCIhZGF0YS5wcmljaW5nWydNT05USExZJ11cIiBbc3JjXT1cImRlZmF1bHRJbWFnZVwiIGFsdD1cIlwiPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVja1wiICpuZ0lmPVwiZGF0YS5wcmljaW5nWydBTk5VQUxMWSddXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwicmFkaW9cIiBuYW1lPVwic3Vic2NyaXB0aW9ue3tpfX1cIiBbdmFsdWVdPVwiJ0FOTlVBTExZJ1wiIChjbGljayk9XCJ0b2dnbGVTZWxlY3Rpb24oZGF0YSwgJ0FOTlVBTExZJylcIiAgW2NoZWNrZWRdPVwiZGF0YS5zZWxlY3RlZE9wdGlvbiA9PT0gJ0FOTlVBTExZJ1wiIFsobmdNb2RlbCldPVwiZGF0YS5zZWxlY3RlZE9wdGlvblwiIGlkPVwiZmxleENoZWNrQ2hlY2tlZFwiPlxyXG4gICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCIgZm9yPVwiZmxleENoZWNrQ2hlY2tlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIOKCuSB7e2RhdGEucHJpY2luZ1snQU5OVUFMTFknXX19XHJcbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJkZWZhdWx0SW1hZ2VcIiAqbmdJZj1cIiFkYXRhLnByaWNpbmdbJ0FOTlVBTExZJ11cIiBbc3JjXT1cImRlZmF1bHRJbWFnZVwiIGFsdD1cIlwiPlxyXG4gICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2tcIiAqbmdJZj1cImRhdGEucHJpY2luZ1snT05ERU1BTkQnXVwiPlxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cInJhZGlvXCIgbmFtZT1cInN1YnNjcmlwdGlvbnt7aX19XCIgW3ZhbHVlXT1cIidPTkRFTUFORCdcIiAoY2xpY2spPVwidG9nZ2xlU2VsZWN0aW9uKGRhdGEsICdPTkRFTUFORCcpXCIgIFtjaGVja2VkXT1cImRhdGEuc2VsZWN0ZWRPcHRpb24gPT09ICdPTkRFTUFORCdcIiBbKG5nTW9kZWwpXT1cImRhdGEuc2VsZWN0ZWRPcHRpb25cIiBpZD1cImZsZXhDaGVja0NoZWNrZWRcIj5cclxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIGZvcj1cImZsZXhDaGVja0NoZWNrZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICDigrkge3tkYXRhLnByaWNpbmdbJ09OREVNQU5EJ119fVxyXG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiZGVmYXVsdEltYWdlXCIgKm5nSWY9XCIhZGF0YS5wcmljaW5nWydPTkRFTUFORCddXCIgW3NyY109XCJkZWZhdWx0SW1hZ2VcIiBhbHQ9XCJcIj5cclxuICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICA8L3RhYmxlPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbC1tZC02IHJpZ2h0LXNpZGVcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImhlYWRpbmcgbWItMjBcIj5cclxuICAgICAgICBGZWUgQ2FsY3VsYXRpb25cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1zcGFjZSBtdC0xMCBtYi0xNVwiICpuZ0Zvcj1cImxldCBjb25maWcgb2YgZmVlU3RydWN0dXJlLmZlZUNvbmZpZ3NcIj5cclxuICAgICAgICA8cCBjbGFzcz1cInN1Yi1oZWFkaW5nIG1iLTBcIj57e2NvbmZpZy5mZWVIZWFkfX08L3A+XHJcbiAgICAgICAgPHAgY2xhc3M9XCJhbW91bnQgbWItMFwiPuKCuSB7e2NvbmZpZy5hbW91bnR9fTwvcD5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktc3BhY2UgbXQtMTAgbWItMTVcIiAqbmdGb3I9XCJsZXQgc3Vic2NyaXBpdGlvbiBvZiBmZWVTdHJ1Y3R1cmUuc3Vic2NyaXB0aW9uUGxhbnNcIj5cclxuICAgICAgICA8cCBjbGFzcz1cInN1Yi1oZWFkaW5nIG1iLTBcIj57e3N1YnNjcmlwaXRpb24uc3ViTmFtZX19PC9wPlxyXG4gICAgICAgIDxwIGNsYXNzPVwiYW1vdW50IG1iLTBcIj7igrkge3tzdWJzY3JpcGl0aW9uLnByaWNpbmdbc3Vic2NyaXBpdGlvbi5mcmVxdWVuY3ldfX08L3A+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cInRvdGFsLWZlZVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkaW5nIG1iLTVcIj5cclxuICAgICAgICAgIFRvdGFsIEZlZVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbW91bnRcIj5cclxuICAgICAgICAgIOKCuSB7e2ZlZVN0cnVjdHVyZS50b3RhbEFtb3VudH19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvc2VjdGlvbj5cclxuIl19
|