ng-pli-commons 1.0.135 → 1.0.137
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/backoffice.commons.component.mjs +41 -0
- package/esm2022/lib/components/common.lists.component.mjs +177 -0
- package/esm2022/lib/components/configuration-token/configuration-token-subject.service.mjs +23 -0
- package/esm2022/lib/components/configuration-token/configuration-token.component.mjs +665 -0
- package/esm2022/lib/components/configuration-token/guarantee-token/guarantee-token.component.mjs +103 -0
- package/esm2022/lib/components/configuration-token/snapshot-token/snapshot-token.component.mjs +108 -0
- package/esm2022/lib/components/configuration.commons.component.mjs +41 -0
- package/esm2022/lib/components/dashboard.commons.component.mjs +85 -0
- package/esm2022/lib/components/dynamic-filter/dynamic-filter.component.mjs +131 -0
- package/esm2022/lib/components/excel-to-json/excel-to-json.component.mjs +54 -0
- package/esm2022/lib/components/frontoffice.commons.component.mjs +89 -0
- package/esm2022/lib/components/pdf-analyzer/pdf-analyzer.component.mjs +162 -0
- package/esm2022/lib/components/pdf-config/pdf-config.component.mjs +170 -0
- package/esm2022/lib/components/pdf-generator/pdf-generator.component.mjs +207 -0
- package/esm2022/lib/components/pdf-merge-visualizer/pdf-merge-visualizer.component.mjs +307 -0
- package/esm2022/lib/components/pdf-visualizer/pdf-visualizer.component.mjs +387 -0
- package/esm2022/lib/components/progress-bar/progress-bar.component.mjs +92 -0
- package/esm2022/lib/components/segmentation-tokens/segmentation-tokens.component.mjs +199 -0
- package/esm2022/lib/components/select-ppp/select-ppp.component.mjs +200 -0
- package/esm2022/lib/components/show-hide-columns/show-hide-columns-table.component.mjs +116 -0
- package/esm2022/lib/components/token/token.component.mjs +1047 -0
- package/esm2022/lib/components/tokens-calculator/tokens-calculator.component.mjs +128 -0
- package/esm2022/lib/directives/currency-colfuturo-formatter.directive.mjs +48 -0
- package/esm2022/lib/directives/currency-decimal-colfuturo-formatter.directive.mjs +35 -0
- package/esm2022/lib/ng-pli-commons.module.mjs +385 -0
- package/esm2022/lib/ng-pli-commons.service.mjs +14 -0
- package/esm2022/lib/pipes/currency-colfuturo.pipe.mjs +36 -0
- package/esm2022/lib/pipes/currency-decimal-colfuturo.pipe.mjs +39 -0
- package/esm2022/lib/pipes/currency-print-colfuturo.pipe.mjs +34 -0
- package/esm2022/lib/pipes/thousands.pipe.mjs +61 -0
- package/esm2022/lib/services/application-fill-percentage.service.mjs +30 -0
- package/esm2022/lib/services/application-pdf-form.service.mjs +27 -0
- package/esm2022/lib/services/application-tag.service.mjs +56 -0
- package/esm2022/lib/services/application.service.mjs +253 -0
- package/esm2022/lib/services/assign-task.service.mjs +30 -0
- package/esm2022/lib/services/authentication.service.mjs +133 -0
- package/esm2022/lib/services/blocked-beneficiary.service.mjs +42 -0
- package/esm2022/lib/services/budget-application.service.mjs +265 -0
- package/esm2022/lib/services/budget-setup.service.mjs +26 -0
- package/esm2022/lib/services/budget-simulation.service.mjs +65 -0
- package/esm2022/lib/services/budget.service.mjs +205 -0
- package/esm2022/lib/services/closure-wallet.service.mjs +39 -0
- package/esm2022/lib/services/cnf-correspondence-document-manager.service.mjs +39 -0
- package/esm2022/lib/services/codebtors.service.mjs +28 -0
- package/esm2022/lib/services/committee-assistant.service.mjs +55 -0
- package/esm2022/lib/services/committee-money.service.mjs +44 -0
- package/esm2022/lib/services/committee-pdf.service.mjs +27 -0
- package/esm2022/lib/services/committee-snapshot.service.mjs +60 -0
- package/esm2022/lib/services/common-info.service.mjs +51 -0
- package/esm2022/lib/services/common.service.mjs +285 -0
- package/esm2022/lib/services/configuration-document.service.mjs +297 -0
- package/esm2022/lib/services/configuration-minisite.service.mjs +26 -0
- package/esm2022/lib/services/configuration.service.mjs +53 -0
- package/esm2022/lib/services/correspondence-document-category.service.mjs +31 -0
- package/esm2022/lib/services/correspondence-manager.service.mjs +74 -0
- package/esm2022/lib/services/credit-score.service.mjs +48 -0
- package/esm2022/lib/services/credit-study.service.mjs +292 -0
- package/esm2022/lib/services/cube.service.mjs +27 -0
- package/esm2022/lib/services/data-form-history.service.mjs +25 -0
- package/esm2022/lib/services/data-form.service.mjs +176 -0
- package/esm2022/lib/services/data-letter-segmentation.service.mjs +64 -0
- package/esm2022/lib/services/document-analysis-auto.service.mjs +27 -0
- package/esm2022/lib/services/document-history.service.mjs +43 -0
- package/esm2022/lib/services/document-management.service.mjs +57 -0
- package/esm2022/lib/services/document-process.service.mjs +27 -0
- package/esm2022/lib/services/document-validation-attempt.service.mjs +32 -0
- package/esm2022/lib/services/document.service.mjs +144 -0
- package/esm2022/lib/services/documentary.type.service.mjs +69 -0
- package/esm2022/lib/services/email.service.mjs +30 -0
- package/esm2022/lib/services/evaluation.service.mjs +181 -0
- package/esm2022/lib/services/export-excel.service.mjs +32 -0
- package/esm2022/lib/services/file.service.mjs +153 -0
- package/esm2022/lib/services/form.service.mjs +112 -0
- package/esm2022/lib/services/gic-client-disbursement-metadata.service.mjs +31 -0
- package/esm2022/lib/services/gic-client.service.mjs +49 -0
- package/esm2022/lib/services/gic-cnf-bankvision-transaction.service.mjs +31 -0
- package/esm2022/lib/services/gic-cnf-closing-date.service.mjs +34 -0
- package/esm2022/lib/services/gic-cnf-maintenance.service.mjs +30 -0
- package/esm2022/lib/services/gic-collection.service.mjs +53 -0
- package/esm2022/lib/services/gic-disbursement.service.mjs +39 -0
- package/esm2022/lib/services/gic-extract.service.mjs +41 -0
- package/esm2022/lib/services/gic-log.service.mjs +41 -0
- package/esm2022/lib/services/gic-payment-application.service.mjs +35 -0
- package/esm2022/lib/services/gic-payment-plan-cube.service.mjs +27 -0
- package/esm2022/lib/services/gic-payment-plan.service.mjs +32 -0
- package/esm2022/lib/services/gic-trm.service.mjs +27 -0
- package/esm2022/lib/services/global.show.task.service.mjs +37 -0
- package/esm2022/lib/services/guarantee-document.service.mjs +52 -0
- package/esm2022/lib/services/guarantee-enrollment.service.mjs +37 -0
- package/esm2022/lib/services/guarantee.service.mjs +128 -0
- package/esm2022/lib/services/guarantees-summary-service.mjs +26 -0
- package/esm2022/lib/services/hash.service.mjs +36 -0
- package/esm2022/lib/services/import-data.service.mjs +27 -0
- package/esm2022/lib/services/import-excel-gic.service.mjs +53 -0
- package/esm2022/lib/services/initial-configuration-gic-parameters.service.mjs +51 -0
- package/esm2022/lib/services/initial-record.service.mjs +51 -0
- package/esm2022/lib/services/integration-ado.service.mjs +54 -0
- package/esm2022/lib/services/interaction-application-user.service.mjs +81 -0
- package/esm2022/lib/services/interest-adjustment.service.mjs +34 -0
- package/esm2022/lib/services/keys-assignation.service.mjs +127 -0
- package/esm2022/lib/services/legalization.service.mjs +150 -0
- package/esm2022/lib/services/letter-campaing.service.mjs +49 -0
- package/esm2022/lib/services/letter-task-mapping.service.mjs +40 -0
- package/esm2022/lib/services/log.service.mjs +41 -0
- package/esm2022/lib/services/maintenance.service.mjs +86 -0
- package/esm2022/lib/services/master-category.service.mjs +66 -0
- package/esm2022/lib/services/master-program.service.mjs +78 -0
- package/esm2022/lib/services/master-university.service.mjs +79 -0
- package/esm2022/lib/services/migration-plis.service.mjs +27 -0
- package/esm2022/lib/services/migration-survey-queue.service.mjs +24 -0
- package/esm2022/lib/services/openkm-document.service.mjs +27 -0
- package/esm2022/lib/services/page.service.mjs +38 -0
- package/esm2022/lib/services/partner-system.service.mjs +30 -0
- package/esm2022/lib/services/partner.service.mjs +34 -0
- package/esm2022/lib/services/pdf-analyzer.service.mjs +33 -0
- package/esm2022/lib/services/people-master.service.mjs +42 -0
- package/esm2022/lib/services/permission.service.mjs +29 -0
- package/esm2022/lib/services/pli-cnf-acuity-fields.service.mjs +34 -0
- package/esm2022/lib/services/pli-cnf-app-card-filter.service.mjs +40 -0
- package/esm2022/lib/services/pli-cnf-appointment-type.service.mjs +41 -0
- package/esm2022/lib/services/pli-cnf-budget-program-type.service.mjs +54 -0
- package/esm2022/lib/services/pli-cnf-budget.service.mjs +31 -0
- package/esm2022/lib/services/pli-cnf-cloning.service.mjs +27 -0
- package/esm2022/lib/services/pli-cnf-committee-pdf-config-table-config.service.mjs +47 -0
- package/esm2022/lib/services/pli-cnf-committee-pdf-gen-status.service.mjs +30 -0
- package/esm2022/lib/services/pli-cnf-committee-valpro-columns.service.mjs +42 -0
- package/esm2022/lib/services/pli-cnf-committee-visualization-mode.service.mjs +42 -0
- package/esm2022/lib/services/pli-cnf-committee.service.mjs +66 -0
- package/esm2022/lib/services/pli-cnf-config-minisite.service.mjs +90 -0
- package/esm2022/lib/services/pli-cnf-configuration-credit-study.service.mjs +41 -0
- package/esm2022/lib/services/pli-cnf-document-management.service.mjs +40 -0
- package/esm2022/lib/services/pli-cnf-dynamic-keys-assign.service.mjs +52 -0
- package/esm2022/lib/services/pli-cnf-evaluation-task-mailing.service.mjs +31 -0
- package/esm2022/lib/services/pli-cnf-evaluation-task-template.service.mjs +39 -0
- package/esm2022/lib/services/pli-cnf-evaluation-task.service.mjs +112 -0
- package/esm2022/lib/services/pli-cnf-evaluation-template.service.mjs +95 -0
- package/esm2022/lib/services/pli-cnf-form-edit.service.mjs +68 -0
- package/esm2022/lib/services/pli-cnf-form-multiaplicacion.service.mjs +46 -0
- package/esm2022/lib/services/pli-cnf-guarantee-documents-template.service.mjs +40 -0
- package/esm2022/lib/services/pli-cnf-guarantee-token.service.mjs +42 -0
- package/esm2022/lib/services/pli-cnf-header.service.mjs +39 -0
- package/esm2022/lib/services/pli-cnf-indicator.service.mjs +39 -0
- package/esm2022/lib/services/pli-cnf-information-system.service.mjs +24 -0
- package/esm2022/lib/services/pli-cnf-interaction.service.mjs +78 -0
- package/esm2022/lib/services/pli-cnf-letter-template-type.service.mjs +29 -0
- package/esm2022/lib/services/pli-cnf-letter-template.service.mjs +48 -0
- package/esm2022/lib/services/pli-cnf-look-and-feel.service.mjs +28 -0
- package/esm2022/lib/services/pli-cnf-mail.service.mjs +30 -0
- package/esm2022/lib/services/pli-cnf-menu-form.service.mjs +34 -0
- package/esm2022/lib/services/pli-cnf-migration-plis-field-budget.service.mjs +34 -0
- package/esm2022/lib/services/pli-cnf-migration-plis-field.service.mjs +47 -0
- package/esm2022/lib/services/pli-cnf-migration-status-plis.service.mjs +44 -0
- package/esm2022/lib/services/pli-cnf-page-section-form.service.mjs +66 -0
- package/esm2022/lib/services/pli-cnf-page-sub-process.service.mjs +25 -0
- package/esm2022/lib/services/pli-cnf-pdfs.service.mjs +31 -0
- package/esm2022/lib/services/pli-cnf-profile-form.service.mjs +40 -0
- package/esm2022/lib/services/pli-cnf-profile-user.service.mjs +49 -0
- package/esm2022/lib/services/pli-cnf-project-summary.service.mjs +39 -0
- package/esm2022/lib/services/pli-cnf-scenario.service.mjs +47 -0
- package/esm2022/lib/services/pli-cnf-segmentation.service.mjs +72 -0
- package/esm2022/lib/services/pli-cnf-snapshot-token.service.mjs +42 -0
- package/esm2022/lib/services/pli-cnf-status-flow-interaction.service.mjs +74 -0
- package/esm2022/lib/services/pli-cnf-status-flow.service.mjs +56 -0
- package/esm2022/lib/services/pli-cnf-support-document-category.service.mjs +47 -0
- package/esm2022/lib/services/pli-cnf-support-document.service.mjs +56 -0
- package/esm2022/lib/services/pli-cnf-survey-document.service.mjs +37 -0
- package/esm2022/lib/services/pli-cnf-survey-pdf.service.mjs +34 -0
- package/esm2022/lib/services/pli-cnf-survey.service.mjs +46 -0
- package/esm2022/lib/services/pli-cnf-task-group.service.mjs +33 -0
- package/esm2022/lib/services/pli-cnf-text-category.service.mjs +38 -0
- package/esm2022/lib/services/pli-cnf-text-option.service.mjs +39 -0
- package/esm2022/lib/services/pli-cnf-text.service.mjs +62 -0
- package/esm2022/lib/services/pli-cnf-type-text.service.mjs +45 -0
- package/esm2022/lib/services/pli-cnf-university-article.service.mjs +39 -0
- package/esm2022/lib/services/pli-cnf-user-calendar.service.mjs +36 -0
- package/esm2022/lib/services/pli-cnf-user-workspace.service.mjs +35 -0
- package/esm2022/lib/services/pli-cnf-valpro-keys.service.mjs +35 -0
- package/esm2022/lib/services/pli-cnf-workspace-segmentation.service.mjs +31 -0
- package/esm2022/lib/services/pli-message-type.service.mjs +40 -0
- package/esm2022/lib/services/pli-multiple-value-filter.service.mjs +39 -0
- package/esm2022/lib/services/pli-promocion-username.service.mjs +57 -0
- package/esm2022/lib/services/pli-seg-action-user.service.mjs +37 -0
- package/esm2022/lib/services/pli-segmentation.service.mjs +130 -0
- package/esm2022/lib/services/pli-tag-assignment.service.mjs +36 -0
- package/esm2022/lib/services/pli-tag.service.mjs +55 -0
- package/esm2022/lib/services/pli-user.service.mjs +51 -0
- package/esm2022/lib/services/plis-beneficiario.service.mjs +29 -0
- package/esm2022/lib/services/plis-estatus-change.service.mjs +30 -0
- package/esm2022/lib/services/post-selection.service.mjs +25 -0
- package/esm2022/lib/services/ppp.service.mjs +360 -0
- package/esm2022/lib/services/profile.service.mjs +60 -0
- package/esm2022/lib/services/progress-bar.service.mjs +40 -0
- package/esm2022/lib/services/promotion-score.service.mjs +44 -0
- package/esm2022/lib/services/registry-identifier.service.mjs +49 -0
- package/esm2022/lib/services/return-refund.service.mjs +53 -0
- package/esm2022/lib/services/segmentation-tokens.service.mjs +43 -0
- package/esm2022/lib/services/segmentation-user-service.service.mjs +94 -0
- package/esm2022/lib/services/segmentation.service.mjs +31 -0
- package/esm2022/lib/services/send-application.service.mjs +541 -0
- package/esm2022/lib/services/sesion-form.service.mjs +31 -0
- package/esm2022/lib/services/sesion.service.mjs +48 -0
- package/esm2022/lib/services/spinner.service.mjs +16 -0
- package/esm2022/lib/services/sponsorship-letter.service.mjs +68 -0
- package/esm2022/lib/services/status.service.mjs +104 -0
- package/esm2022/lib/services/summary-budget.service.mjs +24 -0
- package/esm2022/lib/services/survey-metadata.service.mjs +28 -0
- package/esm2022/lib/services/survey-queue.service.mjs +24 -0
- package/esm2022/lib/services/survey.service.mjs +52 -0
- package/esm2022/lib/services/tag-management.service.mjs +58 -0
- package/esm2022/lib/services/tasa.cambio.service.mjs +35 -0
- package/esm2022/lib/services/token-transformation.service.mjs +62 -0
- package/esm2022/lib/services/token.service.mjs +1477 -0
- package/esm2022/lib/services/university.service.mjs +50 -0
- package/esm2022/lib/services/upload-documents.service.mjs +60 -0
- package/esm2022/lib/services/user.service.mjs +28 -0
- package/esm2022/lib/services/visualization-committee.service.mjs +91 -0
- package/esm2022/lib/utils/custom-validator.mjs +95 -0
- package/esm2022/lib/utils/form-util.mjs +35 -0
- package/esm2022/lib/utils/formio-util.mjs +582 -0
- package/esm2022/lib/utils/version-commons.mjs +10 -0
- package/esm2022/ng-pli-commons.mjs +5 -0
- package/esm2022/public-api.mjs +226 -0
- package/esm2022/version.mjs +29 -0
- package/fesm2022/ng-pli-commons.mjs +657 -657
- package/fesm2022/ng-pli-commons.mjs.map +1 -1
- package/package.json +3 -1
|
@@ -0,0 +1,582 @@
|
|
|
1
|
+
// import * as utils_ from 'formiojs-proyectoscolfuturo/utils/utils';
|
|
2
|
+
import * as utils_ from 'formiojs-colfuturo/utils';
|
|
3
|
+
import { TokenService } from '../services/token.service';
|
|
4
|
+
import { EFormioKey } from 'ng-pli-util';
|
|
5
|
+
const utils = utils_;
|
|
6
|
+
export class FormioUtil {
|
|
7
|
+
/**
|
|
8
|
+
* It returns the components formated by panel
|
|
9
|
+
* @param components
|
|
10
|
+
* @return the object is [{panel: , items: [{ value: , label: }]}]
|
|
11
|
+
*/
|
|
12
|
+
static getFormattedComponentsByPanel(components) {
|
|
13
|
+
let result = [];
|
|
14
|
+
if (components) {
|
|
15
|
+
let group = null;
|
|
16
|
+
let object = null;
|
|
17
|
+
for (const component of components) {
|
|
18
|
+
if (component[EFormioKey.TITLE_PANEL] !== group) {
|
|
19
|
+
if (group !== null) {
|
|
20
|
+
result.push(object);
|
|
21
|
+
}
|
|
22
|
+
object = { label: component[EFormioKey.TITLE_PANEL], items: [], toggle: false };
|
|
23
|
+
group = component[EFormioKey.TITLE_PANEL];
|
|
24
|
+
}
|
|
25
|
+
object.items.push({
|
|
26
|
+
label: component[EFormioKey.LABEL],
|
|
27
|
+
value: component[EFormioKey.KEY]
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
if (group !== null)
|
|
31
|
+
result.push(object);
|
|
32
|
+
}
|
|
33
|
+
return result;
|
|
34
|
+
}
|
|
35
|
+
static getSelectBoxes(selectBoxe) {
|
|
36
|
+
var istrue = false;
|
|
37
|
+
if (selectBoxe != undefined && selectBoxe != null && typeof selectBoxe === 'object') {
|
|
38
|
+
let dataHasTrue = Object.values(selectBoxe);
|
|
39
|
+
dataHasTrue.forEach(function (value) {
|
|
40
|
+
if (typeof value === 'boolean' && value) {
|
|
41
|
+
istrue = value;
|
|
42
|
+
return value;
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
// Expected output: Array ["somestring", 42, false]
|
|
47
|
+
return istrue;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* It returns the components are required according with data
|
|
51
|
+
* @param components array of components
|
|
52
|
+
* @param data
|
|
53
|
+
*/
|
|
54
|
+
static getRequiredComponentsByData(components, data) {
|
|
55
|
+
// get the required components
|
|
56
|
+
let array = FormioUtil.getRequiredComponents(components);
|
|
57
|
+
// if not data then return components
|
|
58
|
+
if (data && array) {
|
|
59
|
+
for (let i = 0; i < array.length; i++) {
|
|
60
|
+
const component = array[i];
|
|
61
|
+
// use formio to check condition according with data
|
|
62
|
+
if (utils.Utils.checkCondition(component, null, data, null, null)) {
|
|
63
|
+
const key = component[EFormioKey.KEY];
|
|
64
|
+
if (Array.isArray(data[key]) && data[key].length > 0) {
|
|
65
|
+
// remove item from array
|
|
66
|
+
array.splice(i, 1);
|
|
67
|
+
i--;
|
|
68
|
+
}
|
|
69
|
+
else if (typeof data[key] === 'object' &&
|
|
70
|
+
!Object.prototype.hasOwnProperty.call(data[key], 'formatted_address') &&
|
|
71
|
+
!Object.prototype.hasOwnProperty.call(data[key], 'callingCodes') &&
|
|
72
|
+
!Object.prototype.hasOwnProperty.call(data[key], 'nativeName') &&
|
|
73
|
+
!Object.prototype.hasOwnProperty.call(data[key], 'original_name') &&
|
|
74
|
+
!Object.prototype.hasOwnProperty.call(data[key], 'fullName') &&
|
|
75
|
+
!Object.prototype.hasOwnProperty.call(data[key], 'fullname') &&
|
|
76
|
+
FormioUtil.getSelectBoxes(data[key])) {
|
|
77
|
+
// remove item from array
|
|
78
|
+
array.splice(i, 1);
|
|
79
|
+
i--;
|
|
80
|
+
}
|
|
81
|
+
else if (typeof data[key] === 'object' &&
|
|
82
|
+
!Object.prototype.hasOwnProperty.call(data[key], 'formatted_address') &&
|
|
83
|
+
!Object.prototype.hasOwnProperty.call(data[key], 'callingCodes') &&
|
|
84
|
+
!Object.prototype.hasOwnProperty.call(data[key], 'nativeName') &&
|
|
85
|
+
!Object.prototype.hasOwnProperty.call(data[key], 'original_name') &&
|
|
86
|
+
!Object.prototype.hasOwnProperty.call(data[key], 'fullName') &&
|
|
87
|
+
!Object.prototype.hasOwnProperty.call(data[key], 'fullname') &&
|
|
88
|
+
!FormioUtil.getSelectBoxes(data[key])) {
|
|
89
|
+
}
|
|
90
|
+
else if (data[key] != undefined && data[key] != null && data[key] != '') {
|
|
91
|
+
// remove item from array
|
|
92
|
+
array.splice(i, 1);
|
|
93
|
+
i--;
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
if (component.customConditional &&
|
|
97
|
+
component.customConditional.includes('show')) {
|
|
98
|
+
// remove item from array
|
|
99
|
+
array.splice(i, 1);
|
|
100
|
+
i--;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
// remove item from array
|
|
106
|
+
array.splice(i, 1);
|
|
107
|
+
i--;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return array;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* It returns the components that are required
|
|
115
|
+
* @param components array of components
|
|
116
|
+
*/
|
|
117
|
+
static getUniqueComponents(components) {
|
|
118
|
+
return FormioUtil.getComponentsByFeature(components, [EFormioKey.UNIQUE], true);
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* It returns the components that are required
|
|
122
|
+
* @param components array of components
|
|
123
|
+
*/
|
|
124
|
+
static getRequiredComponents(components) {
|
|
125
|
+
return FormioUtil.getComponentsByFeature(components, [EFormioKey.VALIDATE, EFormioKey.REQUIRED], true);
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* It returns the components that have a specific feature defined by properties and value
|
|
129
|
+
* @param components array of components
|
|
130
|
+
* @param properties path of properties example [validate, required] or [unique]
|
|
131
|
+
* @param value the value that should have the property
|
|
132
|
+
*/
|
|
133
|
+
static getComponentsByFeature(components, properties, value) {
|
|
134
|
+
let result = [];
|
|
135
|
+
if (properties && properties.length > 0) {
|
|
136
|
+
// get components
|
|
137
|
+
const fields = FormioUtil.getComponents(components);
|
|
138
|
+
// get first and last property
|
|
139
|
+
const firstProperty = properties[0];
|
|
140
|
+
const lastProperty = properties[properties.length - 1];
|
|
141
|
+
if (fields) {
|
|
142
|
+
// iterate the fields
|
|
143
|
+
for (let i = 0; i < fields.length; i++) {
|
|
144
|
+
// it contains the entire object field
|
|
145
|
+
const field = fields[i];
|
|
146
|
+
// it contains the current component and it is gonna be the component of every property
|
|
147
|
+
let component = field;
|
|
148
|
+
if (field[firstProperty]) {
|
|
149
|
+
for (let j = 0; j < properties.length; j++) {
|
|
150
|
+
const property = properties[j];
|
|
151
|
+
// if component.property doesnt exist then break
|
|
152
|
+
if (!component[property])
|
|
153
|
+
break;
|
|
154
|
+
if (property === lastProperty) {
|
|
155
|
+
// it is the last property so if the value is equals to component.lastproperty then it is added to result
|
|
156
|
+
if (component[property] == value)
|
|
157
|
+
result.push(field);
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
// otherwise component will be equal to the component.property
|
|
161
|
+
component = component[property];
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return result;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* It returns the components
|
|
172
|
+
* @param components
|
|
173
|
+
*/
|
|
174
|
+
static getComponents(components) {
|
|
175
|
+
return FormioUtil.getComponentsByRecursion(components, '', null);
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* It returns the components array of the form by recursion
|
|
179
|
+
* @param components array of components
|
|
180
|
+
* @param titlePanel name of parent panel, so children components will inherit the panelName
|
|
181
|
+
* @param conditionalObject conditional object it will be inherited from panel {conditional: { eq: , value: , when: , json: }, customConditional: }
|
|
182
|
+
*/
|
|
183
|
+
static getComponentsByRecursion(components, titlePanel, conditionalParent) {
|
|
184
|
+
// it contains the result array
|
|
185
|
+
let result = [];
|
|
186
|
+
if (components) {
|
|
187
|
+
// iterate over components
|
|
188
|
+
for (const component of components) {
|
|
189
|
+
// avoid the editgrid component ot if it has a different behavior it should have an else statement
|
|
190
|
+
if (component[EFormioKey.TYPE] !== EFormioKey.EDITGRID) {
|
|
191
|
+
// if component is panel then titlePanel variable is changed, and it is gonna be inherited
|
|
192
|
+
if (component[EFormioKey.TYPE] === EFormioKey.PANEL) {
|
|
193
|
+
titlePanel = component[EFormioKey.TITLE];
|
|
194
|
+
}
|
|
195
|
+
if ((typeof component[EFormioKey.COMPONENTS] !== 'undefined' ||
|
|
196
|
+
typeof component[EFormioKey.COLUMNS] !== 'undefined') &&
|
|
197
|
+
(typeof component[EFormioKey.TYPE] == 'undefined' ||
|
|
198
|
+
component[EFormioKey.TYPE] !== EFormioKey.TYPE_ADDRESS)) {
|
|
199
|
+
if (component['type'] !== 'address') {
|
|
200
|
+
// resolve conditional parent conditional
|
|
201
|
+
const conditional = this.resolveInheritanceConditional(conditionalParent, component[EFormioKey.CONDITIONAL], component[EFormioKey.CUSTOM_CONDITIONAL], component[EFormioKey.ID]);
|
|
202
|
+
// change condition
|
|
203
|
+
if (conditional)
|
|
204
|
+
conditionalParent = conditional;
|
|
205
|
+
// it contains the subcomponents depending on the value of component if it has components or columns
|
|
206
|
+
let subComponents = typeof component[EFormioKey.COMPONENTS] !== 'undefined'
|
|
207
|
+
? component[EFormioKey.COMPONENTS]
|
|
208
|
+
: component[EFormioKey.COLUMNS];
|
|
209
|
+
// if component has subComponents, then execute the recursion function to get the recursionnResult
|
|
210
|
+
const recursionResult = FormioUtil.getComponentsByRecursion(subComponents, titlePanel, conditionalParent);
|
|
211
|
+
// if recursion result then result concats the recursionResult
|
|
212
|
+
if (recursionResult)
|
|
213
|
+
result = result.concat(recursionResult);
|
|
214
|
+
// reset conditional Parent
|
|
215
|
+
if (component[EFormioKey.ID] == conditionalParent.id)
|
|
216
|
+
conditionalParent = undefined;
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
result.push(component);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
// avoid the component type button
|
|
224
|
+
if (component[EFormioKey.TYPE] !== EFormioKey.BUTTON &&
|
|
225
|
+
component[EFormioKey.KEY] &&
|
|
226
|
+
component[EFormioKey.LABEL]) {
|
|
227
|
+
// resolve conditional conditional object
|
|
228
|
+
let conditional = this.resolveInheritanceConditional(conditionalParent, component[EFormioKey.CONDITIONAL], component[EFormioKey.CUSTOM_CONDITIONAL], component[EFormioKey.ID]);
|
|
229
|
+
if (!conditional)
|
|
230
|
+
conditional = conditionalParent;
|
|
231
|
+
component[EFormioKey.CONDITIONAL] = conditional[EFormioKey.CONDITIONAL];
|
|
232
|
+
component[EFormioKey.CUSTOM_CONDITIONAL] =
|
|
233
|
+
conditional[EFormioKey.CUSTOM_CONDITIONAL];
|
|
234
|
+
// add namPanel as property
|
|
235
|
+
component[EFormioKey.TITLE_PANEL] = titlePanel;
|
|
236
|
+
// add component to the result
|
|
237
|
+
result.push(component);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
else if (component[EFormioKey.TYPE] === EFormioKey.EDITGRID) {
|
|
242
|
+
if (component.validate.required) {
|
|
243
|
+
result.push(component);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
return result;
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* It returns the components
|
|
252
|
+
* @param components
|
|
253
|
+
* @param keepEditGrids
|
|
254
|
+
*/
|
|
255
|
+
static getComponentsWithEditGrids(components) {
|
|
256
|
+
return FormioUtil.getComponentsByRecursionWithEditGrids(components, '', null);
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* It returns the components array of the form by recursion
|
|
260
|
+
* @param components array of components
|
|
261
|
+
* @param titlePanel name of parent panel, so children components will inherit the panelName
|
|
262
|
+
* @param conditionalObject conditional object it will be inherited from panel {conditional: { eq: , value: , when: , json: }, customConditional: }
|
|
263
|
+
*/
|
|
264
|
+
static getComponentsByRecursionWithEditGrids(components, titlePanel, conditionalParent) {
|
|
265
|
+
// it contains the result array
|
|
266
|
+
let result = [];
|
|
267
|
+
if (components) {
|
|
268
|
+
// iterate over components
|
|
269
|
+
for (const component of components) {
|
|
270
|
+
// avoid the editgrid component ot if it has a different behavior it should have an else statement
|
|
271
|
+
// if component is panel then titlePanel variable is changed, and it is gonna be inherited
|
|
272
|
+
if (component[EFormioKey.TYPE] === EFormioKey.PANEL) {
|
|
273
|
+
titlePanel = component[EFormioKey.TITLE];
|
|
274
|
+
}
|
|
275
|
+
if ((typeof component[EFormioKey.COMPONENTS] !== 'undefined' ||
|
|
276
|
+
typeof component[EFormioKey.COLUMNS] !== 'undefined') &&
|
|
277
|
+
(typeof component[EFormioKey.TYPE] == 'undefined' ||
|
|
278
|
+
component[EFormioKey.TYPE] !== EFormioKey.TYPE_ADDRESS)) {
|
|
279
|
+
// resolve conditional parent conditional
|
|
280
|
+
const conditional = this.resolveInheritanceConditional(conditionalParent, component[EFormioKey.CONDITIONAL], component[EFormioKey.CUSTOM_CONDITIONAL], component[EFormioKey.ID]);
|
|
281
|
+
// change condition
|
|
282
|
+
if (conditional)
|
|
283
|
+
conditionalParent = conditional;
|
|
284
|
+
// it contains the subcomponents depending on the value of component if it has components or columns
|
|
285
|
+
let subComponents = typeof component[EFormioKey.COMPONENTS] !== 'undefined'
|
|
286
|
+
? component[EFormioKey.COMPONENTS]
|
|
287
|
+
: component[EFormioKey.COLUMNS];
|
|
288
|
+
if (component[EFormioKey.TYPE] === EFormioKey.EDITGRID) {
|
|
289
|
+
component[EFormioKey.TITLE_PANEL] = titlePanel;
|
|
290
|
+
result.push(component);
|
|
291
|
+
}
|
|
292
|
+
// if component has subComponents, then execute the recursion function to get the recursionnResult
|
|
293
|
+
const recursionResult = FormioUtil.getComponentsByRecursionWithEditGrids(subComponents, titlePanel, conditionalParent);
|
|
294
|
+
// if recursion result then result concats the recursionResult
|
|
295
|
+
if (recursionResult)
|
|
296
|
+
result = result.concat(recursionResult);
|
|
297
|
+
// reset conditional Parent
|
|
298
|
+
if (component[EFormioKey.ID] == conditionalParent.id)
|
|
299
|
+
conditionalParent = undefined;
|
|
300
|
+
}
|
|
301
|
+
else {
|
|
302
|
+
// avoid the component type button
|
|
303
|
+
if (component[EFormioKey.TYPE] !== EFormioKey.BUTTON &&
|
|
304
|
+
component[EFormioKey.KEY] &&
|
|
305
|
+
component[EFormioKey.LABEL]) {
|
|
306
|
+
// resolve conditional conditional object
|
|
307
|
+
let conditional = this.resolveInheritanceConditional(conditionalParent, component[EFormioKey.CONDITIONAL], component[EFormioKey.CUSTOM_CONDITIONAL], component[EFormioKey.ID]);
|
|
308
|
+
if (!conditional)
|
|
309
|
+
conditional = conditionalParent;
|
|
310
|
+
component[EFormioKey.CONDITIONAL] = conditional[EFormioKey.CONDITIONAL];
|
|
311
|
+
component[EFormioKey.CUSTOM_CONDITIONAL] =
|
|
312
|
+
conditional[EFormioKey.CUSTOM_CONDITIONAL];
|
|
313
|
+
// add namPanel as property
|
|
314
|
+
component[EFormioKey.TITLE_PANEL] = titlePanel;
|
|
315
|
+
// add component to the result
|
|
316
|
+
result.push(component);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
return result;
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* It resolve the inheritance conditional
|
|
325
|
+
* @param conditionalObject
|
|
326
|
+
* @param conditional
|
|
327
|
+
* @param customConditional
|
|
328
|
+
*/
|
|
329
|
+
static resolveInheritanceConditional(conditionalObject, conditional, customConditional, parentId) {
|
|
330
|
+
// validate if there is a condition with the new fields
|
|
331
|
+
if (!conditionalObject ||
|
|
332
|
+
customConditional ||
|
|
333
|
+
(conditional && conditional[EFormioKey.WHEN] && conditional[EFormioKey.EQ]) ||
|
|
334
|
+
(conditional && conditional[EFormioKey.JSON])) {
|
|
335
|
+
return { conditional: conditional, customConditional: customConditional, id: parentId };
|
|
336
|
+
}
|
|
337
|
+
return null;
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* It returns the edit grid components
|
|
341
|
+
* @param components
|
|
342
|
+
*/
|
|
343
|
+
static getEditGridKeyLabels(components) {
|
|
344
|
+
return FormioUtil.getEditGridKeyLabelsByRecursion(components, '', null);
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* It returns the components edit grid array of the form by recursion
|
|
348
|
+
* @param components array of components
|
|
349
|
+
* @param titlePanel name of parent panel, so children components will inherit the panelName
|
|
350
|
+
* @param conditionalObject conditional object it will be inherited from panel {conditional: { eq: , value: , when: , json: }, customConditional: }
|
|
351
|
+
*/
|
|
352
|
+
static getEditGridKeyLabelsByRecursion(components, titlePanel, conditionalParent) {
|
|
353
|
+
// it contains the result array
|
|
354
|
+
let result = [];
|
|
355
|
+
if (components) {
|
|
356
|
+
// iterate over components
|
|
357
|
+
for (const component of components) {
|
|
358
|
+
// if component is panel then titlePanel variable is changed, and it is gonna be inherited
|
|
359
|
+
if (component[EFormioKey.TYPE] === EFormioKey.PANEL) {
|
|
360
|
+
titlePanel = component[EFormioKey.TITLE];
|
|
361
|
+
}
|
|
362
|
+
if ((typeof component[EFormioKey.COMPONENTS] !== 'undefined' ||
|
|
363
|
+
typeof component[EFormioKey.COLUMNS] !== 'undefined') &&
|
|
364
|
+
(typeof component[EFormioKey.TYPE] == 'undefined' ||
|
|
365
|
+
component[EFormioKey.TYPE] !== EFormioKey.TYPE_ADDRESS)) {
|
|
366
|
+
// resolve conditional parent conditional
|
|
367
|
+
const conditional = this.resolveInheritanceConditional(conditionalParent, component[EFormioKey.CONDITIONAL], component[EFormioKey.CUSTOM_CONDITIONAL], component[EFormioKey.ID]);
|
|
368
|
+
// change condition
|
|
369
|
+
if (conditional)
|
|
370
|
+
conditionalParent = conditional;
|
|
371
|
+
// it contains the subcomponents depending on the value of component if it has components or columns
|
|
372
|
+
let subComponents = typeof component[EFormioKey.COMPONENTS] !== 'undefined'
|
|
373
|
+
? component[EFormioKey.COMPONENTS]
|
|
374
|
+
: component[EFormioKey.COLUMNS];
|
|
375
|
+
if (component[EFormioKey.TYPE] == EFormioKey.EDITGRID) {
|
|
376
|
+
// add namPanel as property
|
|
377
|
+
component[EFormioKey.TITLE_PANEL] = titlePanel;
|
|
378
|
+
// add component to the result
|
|
379
|
+
result.push(component);
|
|
380
|
+
}
|
|
381
|
+
else {
|
|
382
|
+
// if component has subComponents, then execute the recursion function to get the recursionnResult
|
|
383
|
+
const recursionResult = FormioUtil.getEditGridKeyLabelsByRecursion(subComponents, titlePanel, conditionalParent);
|
|
384
|
+
// if recursion result then result concats the recursionResult
|
|
385
|
+
if (recursionResult)
|
|
386
|
+
result = result.concat(recursionResult);
|
|
387
|
+
// reset conditional Parent
|
|
388
|
+
if (component[EFormioKey.ID] == conditionalParent.id)
|
|
389
|
+
conditionalParent = undefined;
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
else {
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
return result;
|
|
397
|
+
}
|
|
398
|
+
/**
|
|
399
|
+
* It returns the components
|
|
400
|
+
* @param components
|
|
401
|
+
* @param keepEditGrids
|
|
402
|
+
*/
|
|
403
|
+
static getComponentsIntoEditGrids(components, editGridName) {
|
|
404
|
+
return FormioUtil.getComponentsByRecursionIntoEditGrids(components, '', null, editGridName, false);
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* It returns the components array of the form by recursion
|
|
408
|
+
* @param components array of components
|
|
409
|
+
* @param titlePanel name of parent panel, so children components will inherit the panelName
|
|
410
|
+
* @param conditionalObject conditional object it will be inherited from panel {conditional: { eq: , value: , when: , json: }, customConditional: }
|
|
411
|
+
*/
|
|
412
|
+
static getComponentsByRecursionIntoEditGrids(components, titlePanel, conditionalParent, editGridName, existEditGrid) {
|
|
413
|
+
// it contains the result array
|
|
414
|
+
let result = [];
|
|
415
|
+
if (components) {
|
|
416
|
+
// iterate over components
|
|
417
|
+
for (const component of components) {
|
|
418
|
+
// avoid the editgrid component ot if it has a different behavior it should have an else statement
|
|
419
|
+
// if component is panel then titlePanel variable is changed, and it is gonna be inherited
|
|
420
|
+
if (component[EFormioKey.TYPE] === EFormioKey.PANEL) {
|
|
421
|
+
titlePanel = component[EFormioKey.TITLE];
|
|
422
|
+
}
|
|
423
|
+
if ((typeof component[EFormioKey.COMPONENTS] !== 'undefined' ||
|
|
424
|
+
typeof component[EFormioKey.COLUMNS] !== 'undefined') &&
|
|
425
|
+
(typeof component[EFormioKey.TYPE] == 'undefined' ||
|
|
426
|
+
component[EFormioKey.TYPE] !== EFormioKey.TYPE_ADDRESS)) {
|
|
427
|
+
// resolve conditional parent conditional
|
|
428
|
+
const conditional = this.resolveInheritanceConditional(conditionalParent, component[EFormioKey.CONDITIONAL], component[EFormioKey.CUSTOM_CONDITIONAL], component[EFormioKey.ID]);
|
|
429
|
+
// change condition
|
|
430
|
+
if (conditional)
|
|
431
|
+
conditionalParent = conditional;
|
|
432
|
+
// it contains the subcomponents depending on the value of component if it has components or columns
|
|
433
|
+
let subComponents = typeof component[EFormioKey.COMPONENTS] !== 'undefined'
|
|
434
|
+
? component[EFormioKey.COMPONENTS]
|
|
435
|
+
: component[EFormioKey.COLUMNS];
|
|
436
|
+
if (component[EFormioKey.TYPE] === EFormioKey.EDITGRID &&
|
|
437
|
+
component['key'] == editGridName) {
|
|
438
|
+
existEditGrid = true;
|
|
439
|
+
if ((typeof component[EFormioKey.COMPONENTS] !== 'undefined' ||
|
|
440
|
+
typeof component[EFormioKey.COLUMNS] !== 'undefined') &&
|
|
441
|
+
(typeof component[EFormioKey.TYPE] == 'undefined' ||
|
|
442
|
+
component[EFormioKey.TYPE] !== EFormioKey.TYPE_ADDRESS)) {
|
|
443
|
+
// resolve conditional parent conditional
|
|
444
|
+
const conditional = this.resolveInheritanceConditional(conditionalParent, component[EFormioKey.CONDITIONAL], component[EFormioKey.CUSTOM_CONDITIONAL], component[EFormioKey.ID]);
|
|
445
|
+
// change condition
|
|
446
|
+
if (conditional)
|
|
447
|
+
conditionalParent = conditional;
|
|
448
|
+
// it contains the subcomponents depending on the value of component if it has components or columns
|
|
449
|
+
let subComponents = typeof component[EFormioKey.COMPONENTS] !== 'undefined'
|
|
450
|
+
? component[EFormioKey.COMPONENTS]
|
|
451
|
+
: component[EFormioKey.COLUMNS];
|
|
452
|
+
// if component has subComponents, then execute the recursion function to get the recursionnResult
|
|
453
|
+
const recursionResult = FormioUtil.getComponentsByRecursionIntoEditGrids(subComponents, titlePanel, conditionalParent, editGridName, existEditGrid);
|
|
454
|
+
// if recursion result then result concats the recursionResult
|
|
455
|
+
if (recursionResult)
|
|
456
|
+
result = result.concat(recursionResult);
|
|
457
|
+
// reset conditional Parent
|
|
458
|
+
if (component && conditionalParent) {
|
|
459
|
+
if (component[EFormioKey.ID] == conditionalParent.id)
|
|
460
|
+
conditionalParent = undefined;
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
else {
|
|
464
|
+
// avoid the component type button
|
|
465
|
+
if (component[EFormioKey.TYPE] !== EFormioKey.BUTTON &&
|
|
466
|
+
component[EFormioKey.KEY] &&
|
|
467
|
+
component[EFormioKey.LABEL] &&
|
|
468
|
+
existEditGrid) {
|
|
469
|
+
// resolve conditional conditional object
|
|
470
|
+
let conditional = this.resolveInheritanceConditional(conditionalParent, component[EFormioKey.CONDITIONAL], component[EFormioKey.CUSTOM_CONDITIONAL], component[EFormioKey.ID]);
|
|
471
|
+
if (!conditional)
|
|
472
|
+
conditional = conditionalParent;
|
|
473
|
+
component[EFormioKey.CONDITIONAL] =
|
|
474
|
+
conditional[EFormioKey.CONDITIONAL];
|
|
475
|
+
component[EFormioKey.CUSTOM_CONDITIONAL] =
|
|
476
|
+
conditional[EFormioKey.CUSTOM_CONDITIONAL];
|
|
477
|
+
// add namPanel as property
|
|
478
|
+
component[EFormioKey.TITLE_PANEL] = titlePanel;
|
|
479
|
+
// add component to the result
|
|
480
|
+
result.push(component);
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
// if component has subComponents, then execute the recursion function to get the recursionnResult
|
|
485
|
+
const recursionResult = FormioUtil.getComponentsByRecursionIntoEditGrids(subComponents, titlePanel, conditionalParent, editGridName, existEditGrid);
|
|
486
|
+
// if recursion result then result concats the recursionResult
|
|
487
|
+
if (recursionResult)
|
|
488
|
+
result = result.concat(recursionResult);
|
|
489
|
+
// reset conditional Parent
|
|
490
|
+
if (component && conditionalParent) {
|
|
491
|
+
if (component[EFormioKey.ID] == conditionalParent.id)
|
|
492
|
+
conditionalParent = undefined;
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
else {
|
|
496
|
+
// avoid the component type button
|
|
497
|
+
if (component[EFormioKey.TYPE] !== EFormioKey.BUTTON &&
|
|
498
|
+
component[EFormioKey.KEY] &&
|
|
499
|
+
component[EFormioKey.LABEL] &&
|
|
500
|
+
existEditGrid) {
|
|
501
|
+
// resolve conditional conditional object
|
|
502
|
+
let conditional = this.resolveInheritanceConditional(conditionalParent, component[EFormioKey.CONDITIONAL], component[EFormioKey.CUSTOM_CONDITIONAL], component[EFormioKey.ID]);
|
|
503
|
+
if (!conditional)
|
|
504
|
+
conditional = conditionalParent;
|
|
505
|
+
component[EFormioKey.CONDITIONAL] = conditional[EFormioKey.CONDITIONAL];
|
|
506
|
+
component[EFormioKey.CUSTOM_CONDITIONAL] =
|
|
507
|
+
conditional[EFormioKey.CUSTOM_CONDITIONAL];
|
|
508
|
+
// add namPanel as property
|
|
509
|
+
component[EFormioKey.TITLE_PANEL] = titlePanel;
|
|
510
|
+
// add component to the result
|
|
511
|
+
result.push(component);
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
return result;
|
|
517
|
+
}
|
|
518
|
+
/**
|
|
519
|
+
* Create 2 jason objects of data form by component key and other by component key and title form key
|
|
520
|
+
* @param dataForm dataForm model object
|
|
521
|
+
* @returns Object of 2 element
|
|
522
|
+
*/
|
|
523
|
+
static createListDataByDataFormList(dataForm, listForm) {
|
|
524
|
+
let listData = {};
|
|
525
|
+
let listDataByForm = {};
|
|
526
|
+
if (dataForm && dataForm.length > 0) {
|
|
527
|
+
listData = {};
|
|
528
|
+
listDataByForm = {};
|
|
529
|
+
let dForm;
|
|
530
|
+
for (dForm of dataForm) {
|
|
531
|
+
if (!dForm.data) {
|
|
532
|
+
continue;
|
|
533
|
+
}
|
|
534
|
+
const form = listForm.find(function (formTmp) {
|
|
535
|
+
return formTmp.id == dForm.formId;
|
|
536
|
+
});
|
|
537
|
+
if (!form) {
|
|
538
|
+
//console.error('No se encontró el formulario con id ' + dForm.formId);
|
|
539
|
+
continue;
|
|
540
|
+
}
|
|
541
|
+
const keyFormTitle = TokenService.getKeyFormulario(form.title) + '_';
|
|
542
|
+
for (const key in dForm.data) {
|
|
543
|
+
listData[key] = dForm.data[key];
|
|
544
|
+
listDataByForm[keyFormTitle + key] = dForm.data[key];
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
return {
|
|
549
|
+
listData: listData,
|
|
550
|
+
listDataByForm: listDataByForm
|
|
551
|
+
};
|
|
552
|
+
}
|
|
553
|
+
/**
|
|
554
|
+
* It returns the components
|
|
555
|
+
* @param components
|
|
556
|
+
*/
|
|
557
|
+
static getPanelComponents(components) {
|
|
558
|
+
return FormioUtil.getComponentsByPanel(components);
|
|
559
|
+
}
|
|
560
|
+
/**
|
|
561
|
+
* It returns the components array of the form
|
|
562
|
+
* @param components array of components
|
|
563
|
+
*/
|
|
564
|
+
static getComponentsByPanel(components) {
|
|
565
|
+
// it contains the result array
|
|
566
|
+
let result = [];
|
|
567
|
+
if (components) {
|
|
568
|
+
// iterate over components
|
|
569
|
+
for (const component of components) {
|
|
570
|
+
// avoid the editgrid component ot if it has a different behavior it should have an else statement
|
|
571
|
+
if (component[EFormioKey.TYPE] !== EFormioKey.EDITGRID) {
|
|
572
|
+
// if component is panel then titlePanel variable is changed, and it is gonna be inherited
|
|
573
|
+
if (component[EFormioKey.TYPE] === EFormioKey.PANEL) {
|
|
574
|
+
result.push(component);
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
return result;
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWlvLXV0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1wbGktY29tbW9ucy9zcmMvbGliL3V0aWxzL2Zvcm1pby11dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHFFQUFxRTtBQUNyRSxPQUFPLEtBQUssTUFBTSxNQUFNLDBCQUEwQixDQUFDO0FBRW5ELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQztBQUVyQixNQUFNLE9BQU8sVUFBVTtJQUN0Qjs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLDZCQUE2QixDQUFDLFVBQVU7UUFDOUMsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLElBQUksVUFBVSxFQUFFLENBQUM7WUFDaEIsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDO1lBQ2pCLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQztZQUNsQixLQUFLLE1BQU0sU0FBUyxJQUFJLFVBQVUsRUFBRSxDQUFDO2dCQUNwQyxJQUFJLFNBQVMsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEtBQUssS0FBSyxFQUFFLENBQUM7b0JBQ2pELElBQUksS0FBSyxLQUFLLElBQUksRUFBRSxDQUFDO3dCQUNwQixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUNyQixDQUFDO29CQUNELE1BQU0sR0FBRyxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDO29CQUNoRixLQUFLLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDM0MsQ0FBQztnQkFDRCxNQUFNLENBQUMsS0FBSyxD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QUVEOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxVQUFpQjtRQUMxQyxPQUFPLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssTUFBTSxDQUFDLG9CQUFvQixDQUFDLFVBQWlCO1FBQ3BELCtCQUErQjtRQUMvQixJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDaEIsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNoQiwwQkFBMEI7WUFDMUIsS0FBSyxNQUFNLFNBQVMsSUFBSSxVQUFVLEVBQUUsQ0FBQztnQkFDcEMsa0dBQWtHO2dCQUNsRyxJQUFJLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUN4RCwwRkFBMEY7b0JBQzFGLElBQUksU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7d0JBQ3JELE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7b0JBQ3hCLENBQUM7Z0JBQ0YsQ0FBQztZQUNGLENBQUM7UUFDRixDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDZixDQUFDO0NBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBpbXBvcnQgKiBhcyB1dGlsc18gZnJvbSAnZm9ybWlvanMtcHJveWVjdG9zY29sZnV0dXJvL3V0aWxzL3V0aWxzJztcclxuaW1wb3J0ICogYXMgdXRpbHNfIGZyb20gJ2Zvcm1pb2pzLWNvbGZ1dHVyby91dGlscyc7XHJcbmltcG9ydCB7IElmU3RtdCB9IGZyb20gJ0Bhbmd1bGFyL2NvbXBpbGVyJztcclxuaW1wb3J0IHsgVG9rZW5TZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvdG9rZW4uc2VydmljZSc7XHJcbmltcG9ydCB7IEVGb3JtaW9LZXkgfSBmcm9tICduZy1wbGktdXRpbCc7XHJcbmNvbnN0IHV0aWxzID0gdXRpbHNfO1xyXG5cclxuZXhwb3J0IGNsYXNzIEZvcm1pb1V0aWwge1xyXG5cdC8qKlxyXG5cdCAqIEl0IHJldHVybnMgdGhlIGNvbXBvbmVudHMgZm9ybWF0ZWQgYnkgcGFuZWxcclxuXHQgKiBAcGFyYW0gY29tcG9uZW50c1xyXG5cdCAqIEByZXR1cm4gdGhlIG9iamVjdCBpcyBbe3BhbmVsOiAsIGl0ZW1zOiBbeyB2YWx1ZTogLCBsYWJlbDogfV19XVxyXG5cdCAqL1xyXG5cdHN0YXRpYyBnZXRGb3JtYXR0ZWRDb21wb25lbnRzQnlQYW5lbChjb21wb25lbnRzKTogYW55W10ge1xyXG5cdFx0bGV0IHJlc3VsdCA9IFtdO1xyXG5cdFx0aWYgKGNvbXBvbmVudHMpIHtcclxuXHRcdFx0bGV0IGdyb3VwID0gbnVsbDtcclxuXHRcdFx0bGV0IG9iamVjdCA9IG51bGw7XHJcblx0XHRcdGZvciAoY29uc3QgY29tcG9uZW50IG9mIGNvbXBvbmVudHMpIHtcclxuXHRcdFx0XHRpZiAoY29tcG9uZW50W0VGb3JtaW9LZXkuVElUTEVfUEFORUxdICE9PSBncm91cCkge1xyXG5cdFx0XHRcdFx0aWYgKGdyb3VwICE9PSBudWxsKSB7XHJcblx0XHRcdFx0XHRcdHJlc3VsdC5wdXNoKG9iamVjdCk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRvYmplY3QgPSB7IGxhYmVsOiBjb21wb25lbnRbRUZvcm1pb0tleS5USVRMRV9QQU5FTF0sIGl0ZW1zOiBbXSwgdG9nZ2xlOiBmYWxzZSB9O1xyXG5cdFx0XHRcdFx0Z3JvdXAgPSBjb21wb25lbnRbRUZvcm1pb0tleS5USVRMRV9QQU5FTF07XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdG9iamVjdC5pdGVtcy5wdXNoKHtcclxuXHRcdFx0XHRcdGxhYmVsOiBjb21wb25lbnRbRUZvcm1pb0tleS5MQUJFTF0sXHJcblx0XHRcdFx0XHR2YWx1ZTogY29tcG9uZW50W0VGb3JtaW9LZXkuS0VZXVxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmIChncm91cCAhPT0gbnVsbCkgcmVzdWx0LnB1c2gob2JqZWN0KTtcclxuXHRcdH1cclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cdHN0YXRpYyBnZXRTZWxlY3RCb3hlcyhzZWxlY3RCb3hlKSB7XHJcblx0XHR2YXIgaXN0cnVlID0gZmFsc2U7XHJcblxyXG5cdFx0aWYgKHNlbGVjdEJveGUgIT0gdW5kZWZpbmVkICYmIHNlbGVjdEJveGUgIT0gbnVsbCAmJiB0eXBlb2Ygc2VsZWN0Qm94ZSA9PT0gJ29iamVjdCcpIHtcclxuXHRcdFx0bGV0IGRhdGFIYXNUcnVlID0gT2JqZWN0LnZhbHVlcyhzZWxlY3RCb3hlKTtcclxuXHJcblx0XHRcdGRhdGFIYXNUcnVlLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlKSB7XHJcblx0XHRcdFx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nICYmIHZhbHVlKSB7XHJcblx0XHRcdFx0XHRpc3RydWUgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdHJldHVybiB2YWx1ZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIEV4cGVjdGVkIG91dHB1dDogQXJyYXkgW1wic29tZXN0cmluZ1wiLCA0MiwgZmFsc2VdXHJcblxyXG5cdFx0cmV0dXJuIGlzdHJ1ZTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEl0IHJldHVybnMgdGhlIGNvbXBvbmVudHMgYXJlIHJlcXVpcmVkIGFjY29yZGluZyB3aXRoIGRhdGFcclxuXHQgKiBAcGFyYW0gY29tcG9uZW50cyBhcnJheSBvZiBjb21wb25lbnRzXHJcblx0ICogQHBhcmFtIGRhdGFcclxuXHQgKi9cclxuXHRzdGF0aWMgZ2V0UmVxdWlyZWRDb21wb25lbnRzQnlEYXRhKGNvbXBvbmVudHMsIGRhdGEpIHtcclxuXHRcdC8vIGdldCB0aGUgcmVxdWlyZWQgY29tcG9uZW50c1xyXG5cclxuXHRcdGxldCBhcnJheSA9IEZvcm1pb1V0aWwuZ2V0UmVxdWlyZWRDb21wb25lbnRzKGNvbXBvbmVudHMpO1xyXG5cclxuXHRcdC8vIGlmIG5vdCBkYXRhIHRoZW4gcmV0dXJuIGNvbXBvbmVudHNcclxuXHRcdGlmIChkYXRhICYmIGFycmF5KSB7XHJcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRjb25zdCBjb21wb25lbnQgPSBhcnJheVtpXTtcclxuXHRcdFx0XHQvLyB1c2UgZm9ybWlvIHRvIGNoZWNrIGNvbmRpdGlvbiBhY2NvcmRpbmcgd2l0aCBkYXRhXHJcblx0XHRcdFx0aWYgKHV0aWxzLlV0aWxzLmNoZWNrQ29uZGl0aW9uKGNvbXBvbmVudCwgbnVsbCwgZGF0YSwgbnVsbCwgbnVsbCkpIHtcclxuXHRcdFx0XHRcdGNvbnN0IGtleSA9IGNvbXBvbmVudFtFRm9ybWlvS2V5LktFWV07XHJcblxyXG5cdFx0XHRcdFx0aWYgKEFycmF5LmlzQXJyYXkoZGF0YVtrZXldKSAmJiBkYXRhW2tleV0ubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdFx0XHQvLyByZW1vdmUgaXRlbSBmcm9tIGFycmF5XHJcblx0XHRcdFx0XHRcdGFycmF5LnNwbGljZShpLCAxKTtcclxuXHRcdFx0XHRcdFx0aS0tO1xyXG5cdFx0XHRcdFx0fSBlbHNlIGlmIChcclxuXHRcdFx0XHRcdFx0dHlwZW9mIGRhdGFba2V5XSA9PT0gJ29iamVjdCcgJiZcclxuXHRcdFx0XHRcdFx0IU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhW2tleV0sICdmb3JtYXR0ZWRfYWRkcmVzcycpICYmXHJcblx0XHRcdFx0XHRcdCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGF0YVtrZXldLCAnY2FsbGluZ0NvZGVzJykgJiZcclxuXHRcdFx0XHRcdFx0IU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhW2tleV0sICduYXRpdmVOYW1lJykgJiZcclxuXHRcdFx0XHRcdFx0IU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhW2tleV0sICdvcmlnaW5hbF9uYW1lJykgJiZcclxuXHRcdFx0XHRcdFx0IU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhW2tleV0sICdmdWxsTmFtZScpICYmIFxyXG5cdFx0XHRcdFx0XHQhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGFba2V5XSwgJ2Z1bGxuYW1lJykgJiZcclxuXHRcdFx0XHRcdFx0Rm9ybWlvVXRpbC5nZXRTZWxlY3RCb3hlcyhkYXRhW2tleV0pXHJcblx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0Ly8gcmVtb3ZlIGl0ZW0gZnJvbSBhcnJheVxyXG5cdFx0XHRcdFx0XHRhcnJheS5zcGxpY2UoaSwgMSk7XHJcblx0XHRcdFx0XHRcdGktLTtcclxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoXHJcblx0XHRcdFx0XHRcdHR5cGVvZiBkYXRhW2tleV0gPT09ICdvYmplY3QnICYmXHJcblx0XHRcdFx0XHRcdCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGF0YVtrZXldLCAnZm9ybWF0dGVkX2FkZHJlc3MnKSAmJlxyXG5cdFx0XHRcdFx0XHQhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGFba2V5XSwgJ2NhbGxpbmdDb2RlcycpICYmXHJcblx0XHRcdFx0XHRcdCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGF0YVtrZXldLCAnbmF0aXZlTmFtZScpICYmXHJcblx0XHRcdFx0XHRcdCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGF0YVtrZXldLCAnb3JpZ2luYWxfbmFtZScpICYmXHJcblx0XHRcdFx0XHRcdCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGF0YVtrZXldLCAnZnVsbE5hbWUnKSAmJiBcclxuXHRcdFx0XHRcdFx0IU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhW2tleV0sICdmdWxsbmFtZScpICYmXHJcblx0XHRcdFx0XHRcdCFGb3JtaW9VdGlsLmdldFNlbGVjdEJveGVzKGRhdGFba2V5XSlcclxuXHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0fSBlbHNlIGlmIChkYXRhW2tleV0gIT0gdW5kZWZpbmVkICYmIGRhdGFba2V5XSAhPSBudWxsICYmIGRhdGFba2V5XSAhPSAnJykge1xyXG5cdFx0XHRcdFx0XHQvLyByZW1vdmUgaXRlbSBmcm9tIGFycmF5XHJcblx0XHRcdFx0XHRcdGFycmF5LnNwbGljZShpLCAxKTtcclxuXHRcdFx0XHRcdFx0aS0tO1xyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0XHRcdGNvbXBvbmVudC5jdXN0b21Db25kaXRpb25hbCAmJlxyXG5cdFx0XHRcdFx0XHRcdGNvbXBvbmVudC5jdXN0b21Db25kaXRpb25hbC5pbmNsdWRlcygnc2hvdycpXHJcblx0XHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHRcdC8vIHJlbW92ZSBpdGVtIGZyb20gYXJyYXlcclxuXHRcdFx0XHRcdFx0XHRhcnJheS5zcGxpY2UoaSwgMSk7XHJcblx0XHRcdFx0XHRcdFx0aS0tO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdC8vIHJlbW92ZSBpdGVtIGZyb20gYXJyYXlcclxuXHRcdFx0XHRcdGFycmF5LnNwbGljZShpLCAxKTtcclxuXHRcdFx0XHRcdGktLTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiBhcnJheTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEl0IHJldHVybnMgdGhlIGNvbXBvbmVudHMgdGhhdCBhcmUgcmVxdWlyZWRcclxuXHQgKiBAcGFyYW0gY29tcG9uZW50cyBhcnJheSBvZiBjb21wb25lbnRzXHJcblx0ICovXHJcblx0c3RhdGljIGdldFVuaXF1ZUNvbXBvbmVudHMoY29tcG9uZW50cykge1xyXG5cdFx0cmV0dXJuIEZvcm1pb1V0aWwuZ2V0Q29tcG9uZW50c0J5RmVhdHVyZShjb21wb25lbnRzLCBbRUZvcm1pb0tleS5VTklRVUVdLCB0cnVlKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEl0IHJldHVybnMgdGhlIGNvbXBvbmVudHMgdGhhdCBhcmUgcmVxdWlyZWRcclxuXHQgKiBAcGFyYW0gY29tcG9uZW50cyBhcnJheSBvZiBjb21wb25lbnRzXHJcblx0ICovXHJcblx0c3RhdGljIGdldFJlcXVpcmVkQ29tcG9uZW50cyhjb21wb25lbnRzKSB7XHJcblx0XHRyZXR1cm4gRm9ybWlvVXRpbC5nZXRDb21wb25lbnRzQnlGZWF0dXJlKFxyXG5cdFx0XHRjb21wb25lbnRzLFxyXG5cdFx0XHRbRUZvcm1pb0tleS5WQUxJREFURSwgRUZvcm1pb0tleS5SRVFVSVJFRF0sXHJcblx0XHRcdHRydWVcclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJdCByZXR1cm5zIHRoZSBjb21wb25lbnRzIHRoYXQgaGF2ZSBhIHNwZWNpZmljIGZlYXR1cmUgZGVmaW5lZCBieSBwcm9wZXJ0aWVzIGFuZCB2YWx1ZVxyXG5cdCAqIEBwYXJhbSBjb21wb25lbnRzIGFycmF5IG9mIGNvbXBvbmVudHNcclxuXHQgKiBAcGFyYW0gcHJvcGVydGllcyBwYXRoIG9mIHByb3BlcnRpZXMgZXhhbXBsZSBbdmFsaWRhdGUsIHJlcXVpcmVkXSBvciBbdW5pcXVlXVxyXG5cdCAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdGhhdCBzaG91bGQgaGF2ZSB0aGUgcHJvcGVydHlcclxuXHQgKi9cclxuXHRwcml2YXRlIHN0YXRpYyBnZXRDb21wb25lbnRzQnlGZWF0dXJlKGNvbXBvbmVudHM6IGFueVtdLCBwcm9wZXJ0aWVzOiBzdHJpbmdbXSwgdmFsdWU6IGFueSkge1xyXG5cdFx0bGV0IHJlc3VsdCA9IFtdO1xyXG5cdFx0aWYgKHByb3BlcnRpZXMgJiYgcHJvcGVydGllcy5sZW5ndGggPiAwKSB7XHJcblx0XHRcdC8vIGdldCBjb21wb25lbnRzXHJcblx0XHRcdGNvbnN0IGZpZWxkczogYW55W10gPSBGb3JtaW9VdGlsLmdldENvbXBvbmVudHMoY29tcG9uZW50cyk7XHJcblxyXG5cdFx0XHQvLyBnZXQgZmlyc3QgYW5kIGxhc3QgcHJvcGVydHlcclxuXHRcdFx0Y29uc3QgZmlyc3RQcm9wZXJ0eSA9IHByb3BlcnRpZXNbMF07XHJcblx0XHRcdGNvbnN0IGxhc3RQcm9wZXJ0eSA9IHByb3BlcnRpZXNbcHJvcGVydGllcy5sZW5ndGggLSAxXTtcclxuXHJcblx0XHRcdGlmIChmaWVsZHMpIHtcclxuXHRcdFx0XHQvLyBpdGVyYXRlIHRoZSBmaWVsZHNcclxuXHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdFx0Ly8gaXQgY29udGFpbnMgdGhlIGVudGlyZSBvYmplY3QgZmllbGRcclxuXHRcdFx0XHRcdGNvbnN0IGZpZWxkID0gZmllbGRzW2ldO1xyXG5cdFx0XHRcdFx0Ly8gaXQgY29udGFpbnMgdGhlIGN1cnJlbnQgY29tcG9uZW50IGFuZCBpdCBpcyBnb25uYSBiZSB0aGUgY29tcG9uZW50IG9mIGV2ZXJ5IHByb3BlcnR5XHJcblx0XHRcdFx0XHRsZXQgY29tcG9uZW50ID0gZmllbGQ7XHJcblx0XHRcdFx0XHRpZiAoZmllbGRbZmlyc3RQcm9wZXJ0eV0pIHtcclxuXHRcdFx0XHRcdFx0Zm9yIChsZXQgaiA9IDA7IGogPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaisrKSB7XHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgcHJvcGVydHkgPSBwcm9wZXJ0aWVzW2pdO1xyXG5cdFx0XHRcdFx0XHRcdC8vIGlmIGNvbXBvbmVudC5wcm9wZXJ0eSBkb2VzbnQgZXhpc3QgdGhlbiBicmVha1xyXG5cdFx0XHRcdFx0XHRcdGlmICghY29tcG9uZW50W3Byb3BlcnR5XSkgYnJlYWs7XHJcblx0XHRcdFx0XHRcdFx0aWYgKHByb3BlcnR5ID09PSBsYXN0UHJvcGVydHkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdC8vIGl0IGlzIHRoZSBsYXN0IHByb3BlcnR5IHNvIGlmIHRoZSB2YWx1ZSBpcyBlcXVhbHMgdG8gY29tcG9uZW50Lmxhc3Rwcm9wZXJ0eSB0aGVuIGl0IGlzIGFkZGVkIHRvIHJlc3VsdFxyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKGNvbXBvbmVudFtwcm9wZXJ0eV0gPT0gdmFsdWUpIHJlc3VsdC5wdXNoKGZpZWxkKTtcclxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0Ly8gb3RoZXJ3aXNlIGNvbXBvbmVudCB3aWxsIGJlIGVxdWFsIHRvIHRoZSBjb21wb25lbnQucHJvcGVydHlcclxuXHRcdFx0XHRcdFx0XHRcdGNvbXBvbmVudCA9IGNvbXBvbmVudFtwcm9wZXJ0eV07XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSXQgcmV0dXJucyB0aGUgY29tcG9uZW50c1xyXG5cdCAqIEBwYXJhbSBjb21wb25lbnRzXHJcblx0ICovXHJcblx0c3RhdGljIGdldENvbXBvbmVudHMoY29tcG9uZW50czogYW55W10pOiBhbnlbXSB7XHJcblx0XHRyZXR1cm4gRm9ybWlvVXRpbC5nZXRDb21wb25lbnRzQnlSZWN1cnNpb24oY29tcG9uZW50cywgJycsIG51bGwpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSXQgcmV0dXJucyB0aGUgY29tcG9uZW50cyBhcnJheSBvZiB0aGUgZm9ybSBieSByZWN1cnNpb25cclxuXHQgKiBAcGFyYW0gY29tcG9uZW50cyBhcnJheSBvZiBjb21wb25lbnRzXHJcblx0ICogQHBhcmFtIHRpdGxlUGFuZWwgbmFtZSBvZiBwYXJlbnQgcGFuZWwsIHNvIGNoaWxkcmVuIGNvbXBvbmVudHMgd2lsbCBpbmhlcml0IHRoZSBwYW5lbE5hbWVcclxuXHQgKiBAcGFyYW0gY29uZGl0aW9uYWxPYmplY3QgY29uZGl0aW9uYWwgb2JqZWN0IGl0IHdpbGwgYmUgaW5oZXJpdGVkIGZyb20gcGFuZWwge2NvbmRpdGlvbmFsOiB7IGVxOiAsIHZhbHVlOiAsIHdoZW46ICwganNvbjogfSwgY3VzdG9tQ29uZGl0aW9uYWw6IH1cclxuXHQgKi9cclxuXHRwcml2YXRlIHN0YXRpYyBnZXRDb21wb25lbnRzQnlSZWN1cnNpb24oXHJcblx0XHRjb21wb25lbnRzOiBhbnlbXSxcclxuXHRcdHRpdGxlUGFuZWw6IHN0cmluZyxcclxuXHRcdGNvbmRpdGlvbmFsUGFyZW50OiBhbnlcclxuXHQpOiBhbnlbXSB7XHJcblx0XHQvLyBpdCBjb250YWlucyB0aGUgcmVzdWx0IGFycmF5XHJcblx0XHRsZXQgcmVzdWx0ID0gW107XHJcblx0XHRpZiAoY29tcG9uZW50cykge1xyXG5cdFx0XHQvLyBpdGVyYXRlIG92ZXIgY29tcG9uZW50c1xyXG5cdFx0XHRmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiBjb21wb25lbnRzKSB7XHJcblx0XHRcdFx0Ly8gYXZvaWQgdGhlIGVkaXRncmlkIGNvbXBvbmVudCBvdCBpZiBpdCBoYXMgYSBkaWZmZXJlbnQgYmVoYXZpb3IgaXQgc2hvdWxkIGhhdmUgYW4gZWxzZSBzdGF0ZW1lbnRcclxuXHRcdFx0XHRpZiAoY29tcG9uZW50W0VGb3JtaW9LZXkuVFlQRV0gIT09IEVGb3JtaW9LZXkuRURJVEdSSUQpIHtcclxuXHRcdFx0XHRcdC8vIGlmIGNvbXBvbmVudCBpcyBwYW5lbCB0aGVuIHRpdGxlUGFuZWwgdmFyaWFibGUgaXMgY2hhbmdlZCwgYW5kIGl0IGlzIGdvbm5hIGJlIGluaGVyaXRlZFxyXG5cdFx0XHRcdFx0aWYgKGNvbXBvbmVudFtFRm9ybWlvS2V5LlRZUEVdID09PSBFRm9ybWlvS2V5LlBBTkVMKSB7XHJcblx0XHRcdFx0XHRcdHRpdGxlUGFuZWwgPSBjb21wb25lbnRbRUZvcm1pb0tleS5USVRMRV07XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0XHQodHlwZW9mIGNvbXBvbmVudFtFRm9ybWlvS2V5LkNPTVBPTkVOVFNdICE9PSAndW5kZWZpbmVkJyB8fFxyXG5cdFx0XHRcdFx0XHRcdHR5cGVvZiBjb21wb25lbnRbRUZvcm1pb0tleS5DT0xVTU5TXSAhPT0gJ3VuZGVmaW5lZCcpICYmXHJcblx0XHRcdFx0XHRcdCh0eXBlb2YgY29tcG9uZW50W0VGb3JtaW9LZXkuVFlQRV0gPT0gJ3VuZGVmaW5lZCcgfHxcclxuXHRcdFx0XHRcdFx0XHRjb21wb25lbnRbRUZvcm1pb0tleS5UWVBFXSAhPT0gRUZvcm1pb0tleS5UWVBFX0FERFJFU1MpXHJcblx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0aWYgKGNvbXBvbmVudFsndHlwZSddICE9PSAnYWRkcmVzcycpIHtcclxuXHRcdFx0XHRcdFx0XHQvLyByZXNvbHZlIGNvbmRpdGlvbmFsIHBhcmVudCBjb25kaXRpb25hbFxyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IGNvbmRpdGlvbmFsID0gdGhpcy5yZXNvbHZlSW5oZXJpdGFuY2VDb25kaXRpb25hbChcclxuXHRcdFx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsUGFyZW50LFxyXG5cdFx0XHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuQ09ORElUSU9OQUxdLFxyXG5cdFx0XHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuQ1VTVE9NX0NPTkRJVElPTkFMXSxcclxuXHRcdFx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LklEXVxyXG5cdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdFx0Ly8gY2hhbmdlIGNvbmRpdGlvblxyXG5cdFx0XHRcdFx0XHRcdGlmIChjb25kaXRpb25hbCkgY29uZGl0aW9uYWxQYXJlbnQgPSBjb25kaXRpb25hbDtcclxuXHRcdFx0XHRcdFx0XHQvLyBpdCBjb250YWlucyB0aGUgc3ViY29tcG9uZW50cyBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIGNvbXBvbmVudCBpZiBpdCBoYXMgY29tcG9uZW50cyBvciBjb2x1bW5zXHJcblx0XHRcdFx0XHRcdFx0bGV0IHN1YkNvbXBvbmVudHMgPVxyXG5cdFx0XHRcdFx0XHRcdFx0dHlwZW9mIGNvbXBvbmVudFtFRm9ybWlvS2V5LkNPTVBPTkVOVFNdICE9PSAndW5kZWZpbmVkJ1xyXG5cdFx0XHRcdFx0XHRcdFx0XHQ/IGNvbXBvbmVudFtFRm9ybWlvS2V5LkNPTVBPTkVOVFNdXHJcblx0XHRcdFx0XHRcdFx0XHRcdDogY29tcG9uZW50W0VGb3JtaW9LZXkuQ09MVU1OU107XHJcblx0XHRcdFx0XHRcdFx0Ly8gaWYgY29tcG9uZW50IGhhcyBzdWJDb21wb25lbnRzLCB0aGVuIGV4ZWN1dGUgdGhlIHJlY3Vyc2lvbiBmdW5jdGlvbiB0byBnZXQgdGhlIHJlY3Vyc2lvbm5SZXN1bHRcclxuXHRcdFx0XHRcdFx0XHRjb25zdCByZWN1cnNpb25SZXN1bHQgPSBGb3JtaW9VdGlsLmdldENvbXBvbmVudHNCeVJlY3Vyc2lvbihcclxuXHRcdFx0XHRcdFx0XHRcdHN1YkNvbXBvbmVudHMsXHJcblx0XHRcdFx0XHRcdFx0XHR0aXRsZVBhbmVsLFxyXG5cdFx0XHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxQYXJlbnRcclxuXHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRcdC8vIGlmIHJlY3Vyc2lvbiByZXN1bHQgdGhlbiByZXN1bHQgY29uY2F0cyB0aGUgcmVjdXJzaW9uUmVzdWx0XHJcblx0XHRcdFx0XHRcdFx0aWYgKHJlY3Vyc2lvblJlc3VsdCkgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdChyZWN1cnNpb25SZXN1bHQpO1xyXG5cdFx0XHRcdFx0XHRcdC8vIHJlc2V0IGNvbmRpdGlvbmFsIFBhcmVudFxyXG5cdFx0XHRcdFx0XHRcdGlmIChjb21wb25lbnRbRUZvcm1pb0tleS5JRF0gPT0gY29uZGl0aW9uYWxQYXJlbnQuaWQpXHJcblx0XHRcdFx0XHRcdFx0XHRjb25kaXRpb25hbFBhcmVudCA9IHVuZGVmaW5lZDtcclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRyZXN1bHQucHVzaChjb21wb25lbnQpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHQvLyBhdm9pZCB0aGUgY29tcG9uZW50IHR5cGUgYnV0dG9uXHJcblx0XHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0XHRjb21wb25lbnRbRUZvcm1pb0tleS5UWVBFXSAhPT0gRUZvcm1pb0tleS5CVVRUT04gJiZcclxuXHRcdFx0XHRcdFx0XHRjb21wb25lbnRbRUZvcm1pb0tleS5LRVldICYmXHJcblx0XHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuTEFCRUxdXHJcblx0XHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHRcdC8vIHJlc29sdmUgY29uZGl0aW9uYWwgY29uZGl0aW9uYWwgb2JqZWN0XHJcblx0XHRcdFx0XHRcdFx0bGV0IGNvbmRpdGlvbmFsID0gdGhpcy5yZXNvbHZlSW5oZXJpdGFuY2VDb25kaXRpb25hbChcclxuXHRcdFx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsUGFyZW50LFxyXG5cdFx0XHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuQ09ORElUSU9OQUxdLFxyXG5cdFx0XHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuQ1VTVE9NX0NPTkRJVElPTkFMXSxcclxuXHRcdFx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LklEXVxyXG5cdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdFx0aWYgKCFjb25kaXRpb25hbCkgY29uZGl0aW9uYWwgPSBjb25kaXRpb25hbFBhcmVudDtcclxuXHRcdFx0XHRcdFx0XHRjb21wb25lbnRbRUZvcm1pb0tleS5DT05ESVRJT05BTF0gPSBjb25kaXRpb25hbFtFRm9ybWlvS2V5LkNPTkRJVElPTkFMXTtcclxuXHRcdFx0XHRcdFx0XHRjb21wb25lbnRbRUZvcm1pb0tleS5DVVNUT01fQ09ORElUSU9OQUxdID1cclxuXHRcdFx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsW0VGb3JtaW9LZXkuQ1VTVE9NX0NPTkRJVElPTkFMXTtcclxuXHRcdFx0XHRcdFx0XHQvLyBhZGQgbmFtUGFuZWwgYXMgcHJvcGVydHlcclxuXHRcdFx0XHRcdFx0XHRjb21wb25lbnRbRUZvcm1pb0tleS5USVRMRV9QQU5FTF0gPSB0aXRsZVBhbmVsO1xyXG5cdFx0XHRcdFx0XHRcdC8vIGFkZCBjb21wb25lbnQgdG8gdGhlIHJlc3VsdFxyXG5cdFx0XHRcdFx0XHRcdHJlc3VsdC5wdXNoKGNvbXBvbmVudCk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9IGVsc2UgaWYgKGNvbXBvbmVudFtFRm9ybWlvS2V5LlRZUEVdID09PSBFRm9ybWlvS2V5LkVESVRHUklEKSB7XHJcblx0XHRcdFx0XHRpZiAoY29tcG9uZW50LnZhbGlkYXRlLnJlcXVpcmVkKSB7XHJcblx0XHRcdFx0XHRcdHJlc3VsdC5wdXNoKGNvbXBvbmVudCk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSXQgcmV0dXJucyB0aGUgY29tcG9uZW50c1xyXG5cdCAqIEBwYXJhbSBjb21wb25lbnRzXHJcblx0ICogQHBhcmFtIGtlZXBFZGl0R3JpZHNcclxuXHQgKi9cclxuXHRzdGF0aWMgZ2V0Q29tcG9uZW50c1dpdGhFZGl0R3JpZHMoY29tcG9uZW50czogYW55W10pOiBhbnlbXSB7XHJcblx0XHRyZXR1cm4gRm9ybWlvVXRpbC5nZXRDb21wb25lbnRzQnlSZWN1cnNpb25XaXRoRWRpdEdyaWRzKGNvbXBvbmVudHMsICcnLCBudWxsKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEl0IHJldHVybnMgdGhlIGNvbXBvbmVudHMgYXJyYXkgb2YgdGhlIGZvcm0gYnkgcmVjdXJzaW9uXHJcblx0ICogQHBhcmFtIGNvbXBvbmVudHMgYXJyYXkgb2YgY29tcG9uZW50c1xyXG5cdCAqIEBwYXJhbSB0aXRsZVBhbmVsIG5hbWUgb2YgcGFyZW50IHBhbmVsLCBzbyBjaGlsZHJlbiBjb21wb25lbnRzIHdpbGwgaW5oZXJpdCB0aGUgcGFuZWxOYW1lXHJcblx0ICogQHBhcmFtIGNvbmRpdGlvbmFsT2JqZWN0IGNvbmRpdGlvbmFsIG9iamVjdCBpdCB3aWxsIGJlIGluaGVyaXRlZCBmcm9tIHBhbmVsIHtjb25kaXRpb25hbDogeyBlcTogLCB2YWx1ZTogLCB3aGVuOiAsIGpzb246IH0sIGN1c3RvbUNvbmRpdGlvbmFsOiB9XHJcblx0ICovXHJcblx0cHJpdmF0ZSBzdGF0aWMgZ2V0Q29tcG9uZW50c0J5UmVjdXJzaW9uV2l0aEVkaXRHcmlkcyhcclxuXHRcdGNvbXBvbmVudHM6IGFueVtdLFxyXG5cdFx0dGl0bGVQYW5lbDogc3RyaW5nLFxyXG5cdFx0Y29uZGl0aW9uYWxQYXJlbnQ6IGFueVxyXG5cdCk6IGFueVtdIHtcclxuXHRcdC8vIGl0IGNvbnRhaW5zIHRoZSByZXN1bHQgYXJyYXlcclxuXHRcdGxldCByZXN1bHQgPSBbXTtcclxuXHRcdGlmIChjb21wb25lbnRzKSB7XHJcblx0XHRcdC8vIGl0ZXJhdGUgb3ZlciBjb21wb25lbnRzXHJcblx0XHRcdGZvciAoY29uc3QgY29tcG9uZW50IG9mIGNvbXBvbmVudHMpIHtcclxuXHRcdFx0XHQvLyBhdm9pZCB0aGUgZWRpdGdyaWQgY29tcG9uZW50IG90IGlmIGl0IGhhcyBhIGRpZmZlcmVudCBiZWhhdmlvciBpdCBzaG91bGQgaGF2ZSBhbiBlbHNlIHN0YXRlbWVudFxyXG5cclxuXHRcdFx0XHQvLyBpZiBjb21wb25lbnQgaXMgcGFuZWwgdGhlbiB0aXRsZVBhbmVsIHZhcmlhYmxlIGlzIGNoYW5nZWQsIGFuZCBpdCBpcyBnb25uYSBiZSBpbmhlcml0ZWRcclxuXHRcdFx0XHRpZiAoY29tcG9uZW50W0VGb3JtaW9LZXkuVFlQRV0gPT09IEVGb3JtaW9LZXkuUEFORUwpIHtcclxuXHRcdFx0XHRcdHRpdGxlUGFuZWwgPSBjb21wb25lbnRbRUZvcm1pb0tleS5USVRMRV07XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHQodHlwZW9mIGNvbXBvbmVudFtFRm9ybWlvS2V5LkNPTVBPTkVOVFNdICE9PSAndW5kZWZpbmVkJyB8fFxyXG5cdFx0XHRcdFx0XHR0eXBlb2YgY29tcG9uZW50W0VGb3JtaW9LZXkuQ09MVU1OU10gIT09ICd1bmRlZmluZWQnKSAmJlxyXG5cdFx0XHRcdFx0KHR5cGVvZiBjb21wb25lbnRbRUZvcm1pb0tleS5UWVBFXSA9PSAndW5kZWZpbmVkJyB8fFxyXG5cdFx0XHRcdFx0XHRjb21wb25lbnRbRUZvcm1pb0tleS5UWVBFXSAhPT0gRUZvcm1pb0tleS5UWVBFX0FERFJFU1MpXHJcblx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHQvLyByZXNvbHZlIGNvbmRpdGlvbmFsIHBhcmVudCBjb25kaXRpb25hbFxyXG5cdFx0XHRcdFx0Y29uc3QgY29uZGl0aW9uYWwgPSB0aGlzLnJlc29sdmVJbmhlcml0YW5jZUNvbmRpdGlvbmFsKFxyXG5cdFx0XHRcdFx0XHRjb25kaXRpb25hbFBhcmVudCxcclxuXHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuQ09ORElUSU9OQUxdLFxyXG5cdFx0XHRcdFx0XHRjb21wb25lbnRbRUZvcm1pb0tleS5DVVNUT01fQ09ORElUSU9OQUxdLFxyXG5cdFx0XHRcdFx0XHRjb21wb25lbnRbRUZvcm1pb0tleS5JRF1cclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHQvLyBjaGFuZ2UgY29uZGl0aW9uXHJcblx0XHRcdFx0XHRpZiAoY29uZGl0aW9uYWwpIGNvbmRpdGlvbmFsUGFyZW50ID0gY29uZGl0aW9uYWw7XHJcblx0XHRcdFx0XHQvLyBpdCBjb250YWlucyB0aGUgc3ViY29tcG9uZW50cyBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIGNvbXBvbmVudCBpZiBpdCBoYXMgY29tcG9uZW50cyBvciBjb2x1bW5zXHJcblx0XHRcdFx0XHRsZXQgc3ViQ29tcG9uZW50cyA9XHJcblx0XHRcdFx0XHRcdHR5cGVvZiBjb21wb25lbnRbRUZvcm1pb0tleS5DT01QT05FTlRTXSAhPT0gJ3VuZGVmaW5lZCdcclxuXHRcdFx0XHRcdFx0XHQ/IGNvbXBvbmVudFtFRm9ybWlvS2V5LkNPTVBPTkVOVFNdXHJcblx0XHRcdFx0XHRcdFx0OiBjb21wb25lbnRbRUZvcm1pb0tleS5DT0xVTU5TXTtcclxuXHJcblx0XHRcdFx0XHRpZiAoY29tcG9uZW50W0VGb3JtaW9LZXkuVFlQRV0gPT09IEVGb3JtaW9LZXkuRURJVEdSSUQpIHtcclxuXHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuVElUTEVfUEFORUxdID0gdGl0bGVQYW5lbDtcclxuXHRcdFx0XHRcdFx0cmVzdWx0LnB1c2goY29tcG9uZW50KTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdC8vIGlmIGNvbXBvbmVudCBoYXMgc3ViQ29tcG9uZW50cywgdGhlbiBleGVjdXRlIHRoZSByZWN1cnNpb24gZnVuY3Rpb24gdG8gZ2V0IHRoZSByZWN1cnNpb25uUmVzdWx0XHJcblx0XHRcdFx0XHRjb25zdCByZWN1cnNpb25SZXN1bHQgPSBGb3JtaW9VdGlsLmdldENvbXBvbmVudHNCeVJlY3Vyc2lvbldpdGhFZGl0R3JpZHMoXHJcblx0XHRcdFx0XHRcdHN1YkNvbXBvbmVudHMsXHJcblx0XHRcdFx0XHRcdHRpdGxlUGFuZWwsXHJcblx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsUGFyZW50XHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0Ly8gaWYgcmVjdXJzaW9uIHJlc3VsdCB0aGVuIHJlc3VsdCBjb25jYXRzIHRoZSByZWN1cnNpb25SZXN1bHRcclxuXHRcdFx0XHRcdGlmIChyZWN1cnNpb25SZXN1bHQpIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQocmVjdXJzaW9uUmVzdWx0KTtcclxuXHRcdFx0XHRcdC8vIHJlc2V0IGNvbmRpdGlvbmFsIFBhcmVudFxyXG5cdFx0XHRcdFx0aWYgKGNvbXBvbmVudFtFRm9ybWlvS2V5LklEXSA9PSBjb25kaXRpb25hbFBhcmVudC5pZClcclxuXHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxQYXJlbnQgPSB1bmRlZmluZWQ7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdC8vIGF2b2lkIHRoZSBjb21wb25lbnQgdHlwZSBidXR0b25cclxuXHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuVFlQRV0gIT09IEVGb3JtaW9LZXkuQlVUVE9OICYmXHJcblx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LktFWV0gJiZcclxuXHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuTEFCRUxdXHJcblx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0Ly8gcmVzb2x2ZSBjb25kaXRpb25hbCBjb25kaXRpb25hbCBvYmplY3RcclxuXHRcdFx0XHRcdFx0bGV0IGNvbmRpdGlvbmFsID0gdGhpcy5yZXNvbHZlSW5oZXJpdGFuY2VDb25kaXRpb25hbChcclxuXHRcdFx0XHRcdFx0XHRjb25kaXRpb25hbFBhcmVudCxcclxuXHRcdFx0XHRcdFx0XHRjb21wb25lbnRbRUZvcm1pb0tleS5DT05ESVRJT05BTF0sXHJcblx0XHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuQ1VTVE9NX0NPTkRJVElPTkFMXSxcclxuXHRcdFx0XHRcdFx0XHRjb21wb25lbnRbRUZvcm1pb0tleS5JRF1cclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0aWYgKCFjb25kaXRpb25hbCkgY29uZGl0aW9uYWwgPSBjb25kaXRpb25hbFBhcmVudDtcclxuXHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuQ09ORElUSU9OQUxdID0gY29uZGl0aW9uYWxbRUZvcm1pb0tleS5DT05ESVRJT05BTF07XHJcblx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LkNVU1RPTV9DT05ESVRJT05BTF0gPVxyXG5cdFx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsW0VGb3JtaW9LZXkuQ1VTVE9NX0NPTkRJVElPTkFMXTtcclxuXHRcdFx0XHRcdFx0Ly8gYWRkIG5hbVBhbmVsIGFzIHByb3BlcnR5XHJcblx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LlRJVExFX1BBTkVMXSA9IHRpdGxlUGFuZWw7XHJcblx0XHRcdFx0XHRcdC8vIGFkZCBjb21wb25lbnQgdG8gdGhlIHJlc3VsdFxyXG5cdFx0XHRcdFx0XHRyZXN1bHQucHVzaChjb21wb25lbnQpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEl0IHJlc29sdmUgdGhlIGluaGVyaXRhbmNlIGNvbmRpdGlvbmFsXHJcblx0ICogQHBhcmFtIGNvbmRpdGlvbmFsT2JqZWN0XHJcblx0ICogQHBhcmFtIGNvbmRpdGlvbmFsXHJcblx0ICogQHBhcmFtIGN1c3RvbUNvbmRpdGlvbmFsXHJcblx0ICovXHJcblx0cHJpdmF0ZSBzdGF0aWMgcmVzb2x2ZUluaGVyaXRhbmNlQ29uZGl0aW9uYWwoXHJcblx0XHRjb25kaXRpb25hbE9iamVjdCxcclxuXHRcdGNvbmRpdGlvbmFsLFxyXG5cdFx0Y3VzdG9tQ29uZGl0aW9uYWwsXHJcblx0XHRwYXJlbnRJZFxyXG5cdCk6IGFueSB7XHJcblx0XHQvLyB2YWxpZGF0ZSBpZiB0aGVyZSBpcyBhIGNvbmRpdGlvbiB3aXRoIHRoZSBuZXcgZmllbGRzXHJcblx0XHRpZiAoXHJcblx0XHRcdCFjb25kaXRpb25hbE9iamVjdCB8fFxyXG5cdFx0XHRjdXN0b21Db25kaXRpb25hbCB8fFxyXG5cdFx0XHQoY29uZGl0aW9uYWwgJiYgY29uZGl0aW9uYWxbRUZvcm1pb0tleS5XSEVOXSAmJiBjb25kaXRpb25hbFtFRm9ybWlvS2V5LkVRXSkgfHxcclxuXHRcdFx0KGNvbmRpdGlvbmFsICYmIGNvbmRpdGlvbmFsW0VGb3JtaW9LZXkuSlNPTl0pXHJcblx0XHQpIHtcclxuXHRcdFx0cmV0dXJuIHsgY29uZGl0aW9uYWw6IGNvbmRpdGlvbmFsLCBjdXN0b21Db25kaXRpb25hbDogY3VzdG9tQ29uZGl0aW9uYWwsIGlkOiBwYXJlbnRJZCB9O1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIG51bGw7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJdCByZXR1cm5zIHRoZSBlZGl0IGdyaWQgY29tcG9uZW50c1xyXG5cdCAqIEBwYXJhbSBjb21wb25lbnRzXHJcblx0ICovXHJcblx0c3RhdGljIGdldEVkaXRHcmlkS2V5TGFiZWxzKGNvbXBvbmVudHM6IGFueVtdKTogYW55W10ge1xyXG5cdFx0cmV0dXJuIEZvcm1pb1V0aWwuZ2V0RWRpdEdyaWRLZXlMYWJlbHNCeVJlY3Vyc2lvbihjb21wb25lbnRzLCAnJywgbnVsbCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJdCByZXR1cm5zIHRoZSBjb21wb25lbnRzIGVkaXQgZ3JpZCBhcnJheSBvZiB0aGUgZm9ybSBieSByZWN1cnNpb25cclxuXHQgKiBAcGFyYW0gY29tcG9uZW50cyBhcnJheSBvZiBjb21wb25lbnRzXHJcblx0ICogQHBhcmFtIHRpdGxlUGFuZWwgbmFtZSBvZiBwYXJlbnQgcGFuZWwsIHNvIGNoaWxkcmVuIGNvbXBvbmVudHMgd2lsbCBpbmhlcml0IHRoZSBwYW5lbE5hbWVcclxuXHQgKiBAcGFyYW0gY29uZGl0aW9uYWxPYmplY3QgY29uZGl0aW9uYWwgb2JqZWN0IGl0IHdpbGwgYmUgaW5oZXJpdGVkIGZyb20gcGFuZWwge2NvbmRpdGlvbmFsOiB7IGVxOiAsIHZhbHVlOiAsIHdoZW46ICwganNvbjogfSwgY3VzdG9tQ29uZGl0aW9uYWw6IH1cclxuXHQgKi9cclxuXHRwcml2YXRlIHN0YXRpYyBnZXRFZGl0R3JpZEtleUxhYmVsc0J5UmVjdXJzaW9uKFxyXG5cdFx0Y29tcG9uZW50czogYW55W10sXHJcblx0XHR0aXRsZVBhbmVsOiBzdHJpbmcsXHJcblx0XHRjb25kaXRpb25hbFBhcmVudDogYW55XHJcblx0KTogYW55W10ge1xyXG5cdFx0Ly8gaXQgY29udGFpbnMgdGhlIHJlc3VsdCBhcnJheVxyXG5cdFx0bGV0IHJlc3VsdCA9IFtdO1xyXG5cdFx0aWYgKGNvbXBvbmVudHMpIHtcclxuXHRcdFx0Ly8gaXRlcmF0ZSBvdmVyIGNvbXBvbmVudHNcclxuXHRcdFx0Zm9yIChjb25zdCBjb21wb25lbnQgb2YgY29tcG9uZW50cykge1xyXG5cdFx0XHRcdC8vIGlmIGNvbXBvbmVudCBpcyBwYW5lbCB0aGVuIHRpdGxlUGFuZWwgdmFyaWFibGUgaXMgY2hhbmdlZCwgYW5kIGl0IGlzIGdvbm5hIGJlIGluaGVyaXRlZFxyXG5cdFx0XHRcdGlmIChjb21wb25lbnRbRUZvcm1pb0tleS5UWVBFXSA9PT0gRUZvcm1pb0tleS5QQU5FTCkge1xyXG5cdFx0XHRcdFx0dGl0bGVQYW5lbCA9IGNvbXBvbmVudFtFRm9ybWlvS2V5LlRJVExFXTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdCh0eXBlb2YgY29tcG9uZW50W0VGb3JtaW9LZXkuQ09NUE9ORU5UU10gIT09ICd1bmRlZmluZWQnIHx8XHJcblx0XHRcdFx0XHRcdHR5cGVvZiBjb21wb25lbnRbRUZvcm1pb0tleS5DT0xVTU5TXSAhPT0gJ3VuZGVmaW5lZCcpICYmXHJcblx0XHRcdFx0XHQodHlwZW9mIGNvbXBvbmVudFtFRm9ybWlvS2V5LlRZUEVdID09ICd1bmRlZmluZWQnIHx8XHJcblx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LlRZUEVdICE9PSBFRm9ybWlvS2V5LlRZUEVfQUREUkVTUylcclxuXHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdC8vIHJlc29sdmUgY29uZGl0aW9uYWwgcGFyZW50IGNvbmRpdGlvbmFsXHJcblx0XHRcdFx0XHRjb25zdCBjb25kaXRpb25hbCA9IHRoaXMucmVzb2x2ZUluaGVyaXRhbmNlQ29uZGl0aW9uYWwoXHJcblx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsUGFyZW50LFxyXG5cdFx0XHRcdFx0XHRjb21wb25lbnRbRUZvcm1pb0tleS5DT05ESVRJT05BTF0sXHJcblx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LkNVU1RPTV9DT05ESVRJT05BTF0sXHJcblx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LklEXVxyXG5cdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdC8vIGNoYW5nZSBjb25kaXRpb25cclxuXHRcdFx0XHRcdGlmIChjb25kaXRpb25hbCkgY29uZGl0aW9uYWxQYXJlbnQgPSBjb25kaXRpb25hbDtcclxuXHRcdFx0XHRcdC8vIGl0IGNvbnRhaW5zIHRoZSBzdWJjb21wb25lbnRzIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgY29tcG9uZW50IGlmIGl0IGhhcyBjb21wb25lbnRzIG9yIGNvbHVtbnNcclxuXHRcdFx0XHRcdGxldCBzdWJDb21wb25lbnRzID1cclxuXHRcdFx0XHRcdFx0dHlwZW9mIGNvbXBvbmVudFtFRm9ybWlvS2V5LkNPTVBPTkVOVFNdICE9PSAndW5kZWZpbmVkJ1xyXG5cdFx0XHRcdFx0XHRcdD8gY29tcG9uZW50W0VGb3JtaW9LZXkuQ09NUE9ORU5UU11cclxuXHRcdFx0XHRcdFx0XHQ6IGNvbXBvbmVudFtFRm9ybWlvS2V5LkNPTFVNTlNdO1xyXG5cdFx0XHRcdFx0aWYgKGNvbXBvbmVudFtFRm9ybWlvS2V5LlRZUEVdID09IEVGb3JtaW9LZXkuRURJVEdSSUQpIHtcclxuXHRcdFx0XHRcdFx0Ly8gYWRkIG5hbVBhbmVsIGFzIHByb3BlcnR5XHJcblx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LlRJVExFX1BBTkVMXSA9IHRpdGxlUGFuZWw7XHJcblx0XHRcdFx0XHRcdC8vIGFkZCBjb21wb25lbnQgdG8gdGhlIHJlc3VsdFxyXG5cdFx0XHRcdFx0XHRyZXN1bHQucHVzaChjb21wb25lbnQpO1xyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0Ly8gaWYgY29tcG9uZW50IGhhcyBzdWJDb21wb25lbnRzLCB0aGVuIGV4ZWN1dGUgdGhlIHJlY3Vyc2lvbiBmdW5jdGlvbiB0byBnZXQgdGhlIHJlY3Vyc2lvbm5SZXN1bHRcclxuXHRcdFx0XHRcdFx0Y29uc3QgcmVjdXJzaW9uUmVzdWx0ID0gRm9ybWlvVXRpbC5nZXRFZGl0R3JpZEtleUxhYmVsc0J5UmVjdXJzaW9uKFxyXG5cdFx0XHRcdFx0XHRcdHN1YkNvbXBvbmVudHMsXHJcblx0XHRcdFx0XHRcdFx0dGl0bGVQYW5lbCxcclxuXHRcdFx0XHRcdFx0XHRjb25kaXRpb25hbFBhcmVudFxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHQvLyBpZiByZWN1cnNpb24gcmVzdWx0IHRoZW4gcmVzdWx0IGNvbmNhdHMgdGhlIHJlY3Vyc2lvblJlc3VsdFxyXG5cdFx0XHRcdFx0XHRpZiAocmVjdXJzaW9uUmVzdWx0KSByZXN1bHQgPSByZXN1bHQuY29uY2F0KHJlY3Vyc2lvblJlc3VsdCk7XHJcblx0XHRcdFx0XHRcdC8vIHJlc2V0IGNvbmRpdGlvbmFsIFBhcmVudFxyXG5cdFx0XHRcdFx0XHRpZiAoY29tcG9uZW50W0VGb3JtaW9LZXkuSURdID09IGNvbmRpdGlvbmFsUGFyZW50LmlkKVxyXG5cdFx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsUGFyZW50ID0gdW5kZWZpbmVkO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSXQgcmV0dXJucyB0aGUgY29tcG9uZW50c1xyXG5cdCAqIEBwYXJhbSBjb21wb25lbnRzXHJcblx0ICogQHBhcmFtIGtlZXBFZGl0R3JpZHNcclxuXHQgKi9cclxuXHRzdGF0aWMgZ2V0Q29tcG9uZW50c0ludG9FZGl0R3JpZHMoY29tcG9uZW50czogYW55W10sIGVkaXRHcmlkTmFtZTogc3RyaW5nKTogYW55W10ge1xyXG5cdFx0cmV0dXJuIEZvcm1pb1V0aWwuZ2V0Q29tcG9uZW50c0J5UmVjdXJzaW9uSW50b0VkaXRHcmlkcyhcclxuXHRcdFx0Y29tcG9uZW50cyxcclxuXHRcdFx0JycsXHJcblx0XHRcdG51bGwsXHJcblx0XHRcdGVkaXRHcmlkTmFtZSxcclxuXHRcdFx0ZmFsc2VcclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJdCByZXR1cm5zIHRoZSBjb21wb25lbnRzIGFycmF5IG9mIHRoZSBmb3JtIGJ5IHJlY3Vyc2lvblxyXG5cdCAqIEBwYXJhbSBjb21wb25lbnRzIGFycmF5IG9mIGNvbXBvbmVudHNcclxuXHQgKiBAcGFyYW0gdGl0bGVQYW5lbCBuYW1lIG9mIHBhcmVudCBwYW5lbCwgc28gY2hpbGRyZW4gY29tcG9uZW50cyB3aWxsIGluaGVyaXQgdGhlIHBhbmVsTmFtZVxyXG5cdCAqIEBwYXJhbSBjb25kaXRpb25hbE9iamVjdCBjb25kaXRpb25hbCBvYmplY3QgaXQgd2lsbCBiZSBpbmhlcml0ZWQgZnJvbSBwYW5lbCB7Y29uZGl0aW9uYWw6IHsgZXE6ICwgdmFsdWU6ICwgd2hlbjogLCBqc29uOiB9LCBjdXN0b21Db25kaXRpb25hbDogfVxyXG5cdCAqL1xyXG5cdHByaXZhdGUgc3RhdGljIGdldENvbXBvbmVudHNCeVJlY3Vyc2lvbkludG9FZGl0R3JpZHMoXHJcblx0XHRjb21wb25lbnRzOiBhbnlbXSxcclxuXHRcdHRpdGxlUGFuZWw6IHN0cmluZyxcclxuXHRcdGNvbmRpdGlvbmFsUGFyZW50OiBhbnksXHJcblx0XHRlZGl0R3JpZE5hbWU6IHN0cmluZyxcclxuXHRcdGV4aXN0RWRpdEdyaWQ6IGJvb2xlYW5cclxuXHQpOiBhbnlbXSB7XHJcblx0XHQvLyBpdCBjb250YWlucyB0aGUgcmVzdWx0IGFycmF5XHJcblx0XHRsZXQgcmVzdWx0ID0gW107XHJcblx0XHRpZiAoY29tcG9uZW50cykge1xyXG5cdFx0XHQvLyBpdGVyYXRlIG92ZXIgY29tcG9uZW50c1xyXG5cdFx0XHRmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiBjb21wb25lbnRzKSB7XHJcblx0XHRcdFx0Ly8gYXZvaWQgdGhlIGVkaXRncmlkIGNvbXBvbmVudCBvdCBpZiBpdCBoYXMgYSBkaWZmZXJlbnQgYmVoYXZpb3IgaXQgc2hvdWxkIGhhdmUgYW4gZWxzZSBzdGF0ZW1lbnRcclxuXHJcblx0XHRcdFx0Ly8gaWYgY29tcG9uZW50IGlzIHBhbmVsIHRoZW4gdGl0bGVQYW5lbCB2YXJpYWJsZSBpcyBjaGFuZ2VkLCBhbmQgaXQgaXMgZ29ubmEgYmUgaW5oZXJpdGVkXHJcblx0XHRcdFx0aWYgKGNvbXBvbmVudFtFRm9ybWlvS2V5LlRZUEVdID09PSBFRm9ybWlvS2V5LlBBTkVMKSB7XHJcblx0XHRcdFx0XHR0aXRsZVBhbmVsID0gY29tcG9uZW50W0VGb3JtaW9LZXkuVElUTEVdO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0KHR5cGVvZiBjb21wb25lbnRbRUZvcm1pb0tleS5DT01QT05FTlRTXSAhPT0gJ3VuZGVmaW5lZCcgfHxcclxuXHRcdFx0XHRcdFx0dHlwZW9mIGNvbXBvbmVudFtFRm9ybWlvS2V5LkNPTFVNTlNdICE9PSAndW5kZWZpbmVkJykgJiZcclxuXHRcdFx0XHRcdCh0eXBlb2YgY29tcG9uZW50W0VGb3JtaW9LZXkuVFlQRV0gPT0gJ3VuZGVmaW5lZCcgfHxcclxuXHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuVFlQRV0gIT09IEVGb3JtaW9LZXkuVFlQRV9BRERSRVNTKVxyXG5cdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0Ly8gcmVzb2x2ZSBjb25kaXRpb25hbCBwYXJlbnQgY29uZGl0aW9uYWxcclxuXHRcdFx0XHRcdGNvbnN0IGNvbmRpdGlvbmFsID0gdGhpcy5yZXNvbHZlSW5oZXJpdGFuY2VDb25kaXRpb25hbChcclxuXHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxQYXJlbnQsXHJcblx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LkNPTkRJVElPTkFMXSxcclxuXHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuQ1VTVE9NX0NPTkRJVElPTkFMXSxcclxuXHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuSURdXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0Ly8gY2hhbmdlIGNvbmRpdGlvblxyXG5cdFx0XHRcdFx0aWYgKGNvbmRpdGlvbmFsKSBjb25kaXRpb25hbFBhcmVudCA9IGNvbmRpdGlvbmFsO1xyXG5cdFx0XHRcdFx0Ly8gaXQgY29udGFpbnMgdGhlIHN1YmNvbXBvbmVudHMgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiBjb21wb25lbnQgaWYgaXQgaGFzIGNvbXBvbmVudHMgb3IgY29sdW1uc1xyXG5cdFx0XHRcdFx0bGV0IHN1YkNvbXBvbmVudHMgPVxyXG5cdFx0XHRcdFx0XHR0eXBlb2YgY29tcG9uZW50W0VGb3JtaW9LZXkuQ09NUE9ORU5UU10gIT09ICd1bmRlZmluZWQnXHJcblx0XHRcdFx0XHRcdFx0PyBjb21wb25lbnRbRUZvcm1pb0tleS5DT01QT05FTlRTXVxyXG5cdFx0XHRcdFx0XHRcdDogY29tcG9uZW50W0VGb3JtaW9LZXkuQ09MVU1OU107XHJcblxyXG5cdFx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0XHRjb21wb25lbnRbRUZvcm1pb0tleS5UWVBFXSA9PT0gRUZvcm1pb0tleS5FRElUR1JJRCAmJlxyXG5cdFx0XHRcdFx0XHRjb21wb25lbnRbJ2tleSddID09IGVkaXRHcmlkTmFtZVxyXG5cdFx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRcdGV4aXN0RWRpdEdyaWQgPSB0cnVlO1xyXG5cdFx0XHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRcdFx0KHR5cGVvZiBjb21wb25lbnRbRUZvcm1pb0tleS5DT01QT05FTlRTXSAhPT0gJ3VuZGVmaW5lZCcgfHxcclxuXHRcdFx0XHRcdFx0XHRcdHR5cGVvZiBjb21wb25lbnRbRUZvcm1pb0tleS5DT0xVTU5TXSAhPT0gJ3VuZGVmaW5lZCcpICYmXHJcblx0XHRcdFx0XHRcdFx0KHR5cGVvZiBjb21wb25lbnRbRUZvcm1pb0tleS5UWVBFXSA9PSAndW5kZWZpbmVkJyB8fFxyXG5cdFx0XHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuVFlQRV0gIT09IEVGb3JtaW9LZXkuVFlQRV9BRERSRVNTKVxyXG5cdFx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0XHQvLyByZXNvbHZlIGNvbmRpdGlvbmFsIHBhcmVudCBjb25kaXRpb25hbFxyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IGNvbmRpdGlvbmFsID0gdGhpcy5yZXNvbHZlSW5oZXJpdGFuY2VDb25kaXRpb25hbChcclxuXHRcdFx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsUGFyZW50LFxyXG5cdFx0XHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuQ09ORElUSU9OQUxdLFxyXG5cdFx0XHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuQ1VTVE9NX0NPTkRJVElPTkFMXSxcclxuXHRcdFx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LklEXVxyXG5cdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdFx0Ly8gY2hhbmdlIGNvbmRpdGlvblxyXG5cdFx0XHRcdFx0XHRcdGlmIChjb25kaXRpb25hbCkgY29uZGl0aW9uYWxQYXJlbnQgPSBjb25kaXRpb25hbDtcclxuXHRcdFx0XHRcdFx0XHQvLyBpdCBjb250YWlucyB0aGUgc3ViY29tcG9uZW50cyBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIGNvbXBvbmVudCBpZiBpdCBoYXMgY29tcG9uZW50cyBvciBjb2x1bW5zXHJcblx0XHRcdFx0XHRcdFx0bGV0IHN1YkNvbXBvbmVudHMgPVxyXG5cdFx0XHRcdFx0XHRcdFx0dHlwZW9mIGNvbXBvbmVudFtFRm9ybWlvS2V5LkNPTVBPTkVOVFNdICE9PSAndW5kZWZpbmVkJ1xyXG5cdFx0XHRcdFx0XHRcdFx0XHQ/IGNvbXBvbmVudFtFRm9ybWlvS2V5LkNPTVBPTkVOVFNdXHJcblx0XHRcdFx0XHRcdFx0XHRcdDogY29tcG9uZW50W0VGb3JtaW9LZXkuQ09MVU1OU107XHJcblxyXG5cdFx0XHRcdFx0XHRcdC8vIGlmIGNvbXBvbmVudCBoYXMgc3ViQ29tcG9uZW50cywgdGhlbiBleGVjdXRlIHRoZSByZWN1cnNpb24gZnVuY3Rpb24gdG8gZ2V0IHRoZSByZWN1cnNpb25uUmVzdWx0XHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgcmVjdXJzaW9uUmVzdWx0ID1cclxuXHRcdFx0XHRcdFx0XHRcdEZvcm1pb1V0aWwuZ2V0Q29tcG9uZW50c0J5UmVjdXJzaW9uSW50b0VkaXRHcmlkcyhcclxuXHRcdFx0XHRcdFx0XHRcdFx0c3ViQ29tcG9uZW50cyxcclxuXHRcdFx0XHRcdFx0XHRcdFx0dGl0bGVQYW5lbCxcclxuXHRcdFx0XHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxQYXJlbnQsXHJcblx0XHRcdFx0XHRcdFx0XHRcdGVkaXRHcmlkTmFtZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZXhpc3RFZGl0R3JpZFxyXG5cdFx0XHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0XHQvLyBpZiByZWN1cnNpb24gcmVzdWx0IHRoZW4gcmVzdWx0IGNvbmNhdHMgdGhlIHJlY3Vyc2lvblJlc3VsdFxyXG5cdFx0XHRcdFx0XHRcdGlmIChyZWN1cnNpb25SZXN1bHQpIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQocmVjdXJzaW9uUmVzdWx0KTtcclxuXHRcdFx0XHRcdFx0XHQvLyByZXNldCBjb25kaXRpb25hbCBQYXJlbnRcclxuXHRcdFx0XHRcdFx0XHRpZiAoY29tcG9uZW50ICYmIGNvbmRpdGlvbmFsUGFyZW50KSB7XHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoY29tcG9uZW50W0VGb3JtaW9LZXkuSURdID09IGNvbmRpdGlvbmFsUGFyZW50LmlkKVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRjb25kaXRpb25hbFBhcmVudCA9IHVuZGVmaW5lZDtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0Ly8gYXZvaWQgdGhlIGNvbXBvbmVudCB0eXBlIGJ1dHRvblxyXG5cdFx0XHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LlRZUEVdICE9PSBFRm9ybWlvS2V5LkJVVFRPTiAmJlxyXG5cdFx0XHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuS0VZXSAmJlxyXG5cdFx0XHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuTEFCRUxdICYmXHJcblx0XHRcdFx0XHRcdFx0XHRleGlzdEVkaXRHcmlkXHJcblx0XHRcdFx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRcdFx0XHQvLyByZXNvbHZlIGNvbmRpdGlvbmFsIGNvbmRpdGlvbmFsIG9iamVjdFxyXG5cdFx0XHRcdFx0XHRcdFx0bGV0IGNvbmRpdGlvbmFsID0gdGhpcy5yZXNvbHZlSW5oZXJpdGFuY2VDb25kaXRpb25hbChcclxuXHRcdFx0XHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxQYXJlbnQsXHJcblx0XHRcdFx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LkNPTkRJVElPTkFMXSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuQ1VTVE9NX0NPTkRJVElPTkFMXSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuSURdXHJcblx0XHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCFjb25kaXRpb25hbCkgY29uZGl0aW9uYWwgPSBjb25kaXRpb25hbFBhcmVudDtcclxuXHRcdFx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LkNPTkRJVElPTkFMXSA9XHJcblx0XHRcdFx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsW0VGb3JtaW9LZXkuQ09ORElUSU9OQUxdO1xyXG5cdFx0XHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuQ1VTVE9NX0NPTkRJVElPTkFMXSA9XHJcblx0XHRcdFx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsW0VGb3JtaW9LZXkuQ1VTVE9NX0NPTkRJVElPTkFMXTtcclxuXHRcdFx0XHRcdFx0XHRcdC8vIGFkZCBuYW1QYW5lbCBhcyBwcm9wZXJ0eVxyXG5cdFx0XHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuVElUTEVfUEFORUxdID0gdGl0bGVQYW5lbDtcclxuXHRcdFx0XHRcdFx0XHRcdC8vIGFkZCBjb21wb25lbnQgdG8gdGhlIHJlc3VsdFxyXG5cdFx0XHRcdFx0XHRcdFx0cmVzdWx0LnB1c2goY29tcG9uZW50KTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdC8vIGlmIGNvbXBvbmVudCBoYXMgc3ViQ29tcG9uZW50cywgdGhlbiBleGVjdXRlIHRoZSByZWN1cnNpb24gZnVuY3Rpb24gdG8gZ2V0IHRoZSByZWN1cnNpb25uUmVzdWx0XHJcblx0XHRcdFx0XHRjb25zdCByZWN1cnNpb25SZXN1bHQgPSBGb3JtaW9VdGlsLmdldENvbXBvbmVudHNCeVJlY3Vyc2lvbkludG9FZGl0R3JpZHMoXHJcblx0XHRcdFx0XHRcdHN1YkNvbXBvbmVudHMsXHJcblx0XHRcdFx0XHRcdHRpdGxlUGFuZWwsXHJcblx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsUGFyZW50LFxyXG5cdFx0XHRcdFx0XHRlZGl0R3JpZE5hbWUsXHJcblx0XHRcdFx0XHRcdGV4aXN0RWRpdEdyaWRcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHQvLyBpZiByZWN1cnNpb24gcmVzdWx0IHRoZW4gcmVzdWx0IGNvbmNhdHMgdGhlIHJlY3Vyc2lvblJlc3VsdFxyXG5cdFx0XHRcdFx0aWYgKHJlY3Vyc2lvblJlc3VsdCkgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdChyZWN1cnNpb25SZXN1bHQpO1xyXG5cdFx0XHRcdFx0Ly8gcmVzZXQgY29uZGl0aW9uYWwgUGFyZW50XHJcblx0XHRcdFx0XHRpZiAoY29tcG9uZW50ICYmIGNvbmRpdGlvbmFsUGFyZW50KSB7XHJcblx0XHRcdFx0XHRcdGlmIChjb21wb25lbnRbRUZvcm1pb0tleS5JRF0gPT0gY29uZGl0aW9uYWxQYXJlbnQuaWQpXHJcblx0XHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxQYXJlbnQgPSB1bmRlZmluZWQ7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdC8vIGF2b2lkIHRoZSBjb21wb25lbnQgdHlwZSBidXR0b25cclxuXHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuVFlQRV0gIT09IEVGb3JtaW9LZXkuQlVUVE9OICYmXHJcblx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LktFWV0gJiZcclxuXHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuTEFCRUxdICYmXHJcblx0XHRcdFx0XHRcdGV4aXN0RWRpdEdyaWRcclxuXHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHQvLyByZXNvbHZlIGNvbmRpdGlvbmFsIGNvbmRpdGlvbmFsIG9iamVjdFxyXG5cdFx0XHRcdFx0XHRsZXQgY29uZGl0aW9uYWwgPSB0aGlzLnJlc29sdmVJbmhlcml0YW5jZUNvbmRpdGlvbmFsKFxyXG5cdFx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsUGFyZW50LFxyXG5cdFx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LkNPTkRJVElPTkFMXSxcclxuXHRcdFx0XHRcdFx0XHRjb21wb25lbnRbRUZvcm1pb0tleS5DVVNUT01fQ09ORElUSU9OQUxdLFxyXG5cdFx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LklEXVxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRpZiAoIWNvbmRpdGlvbmFsKSBjb25kaXRpb25hbCA9IGNvbmRpdGlvbmFsUGFyZW50O1xyXG5cdFx0XHRcdFx0XHRjb21wb25lbnRbRUZvcm1pb0tleS5DT05ESVRJT05BTF0gPSBjb25kaXRpb25hbFtFRm9ybWlvS2V5LkNPTkRJVElPTkFMXTtcclxuXHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuQ1VTVE9NX0NPTkRJVElPTkFMXSA9XHJcblx0XHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxbRUZvcm1pb0tleS5DVVNUT01fQ09ORElUSU9OQUxdO1xyXG5cdFx0XHRcdFx0XHQvLyBhZGQgbmFtUGFuZWwgYXMgcHJvcGVydHlcclxuXHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuVElUTEVfUEFORUxdID0gdGl0bGVQYW5lbDtcclxuXHRcdFx0XHRcdFx0Ly8gYWRkIGNvbXBvbmVudCB0byB0aGUgcmVzdWx0XHJcblx0XHRcdFx0XHRcdHJlc3VsdC5wdXNoKGNvbXBvbmVudCk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlIDIgamFzb24gb2JqZWN0cyBvZiBkYXRhIGZvcm0gYnkgY29tcG9uZW50IGtleSBhbmQgb3RoZXIgYnkgY29tcG9uZW50IGtleSBhbmQgdGl0bGUgZm9ybSBrZXlcclxuXHQgKiBAcGFyYW0gZGF0YUZvcm0gZGF0YUZvcm0gbW9kZWwgb2JqZWN0XHJcblx0ICogQHJldHVybnMgT2JqZWN0IG9mIDIgZWxlbWVudFxyXG5cdCAqL1xyXG5cdHN0YXRpYyBjcmVhdGVMaXN0RGF0YUJ5RGF0YUZvcm1MaXN0KGRhdGFGb3JtOiBhbnksIGxpc3RGb3JtOiBhbnlbXSk6IGFueSB7XHJcblx0XHRsZXQgbGlzdERhdGE6IGFueSA9IHt9O1xyXG5cdFx0bGV0IGxpc3REYXRhQnlGb3JtOiBhbnkgPSB7fTtcclxuXHRcdGlmIChkYXRhRm9ybSAmJiBkYXRhRm9ybS5sZW5ndGggPiAwKSB7XHJcblx0XHRcdGxpc3REYXRhID0ge307XHJcblx0XHRcdGxpc3REYXRhQnlGb3JtID0ge307XHJcblx0XHRcdGxldCBkRm9ybTogYW55O1xyXG5cdFx0XHRmb3IgKGRGb3JtIG9mIGRhdGFGb3JtKSB7XHJcblx0XHRcdFx0aWYgKCFkRm9ybS5kYXRhKSB7XHJcblx0XHRcdFx0XHRjb250aW51ZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Y29uc3QgZm9ybSA9IGxpc3RGb3JtLmZpbmQoZnVuY3Rpb24gKGZvcm1UbXApIHtcclxuXHRcdFx0XHRcdHJldHVybiBmb3JtVG1wLmlkID09IGRGb3JtLmZvcm1JZDtcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0XHRpZiAoIWZvcm0pIHtcclxuXHRcdFx0XHRcdC8vY29uc29sZS5lcnJvcignTm8gc2UgZW5jb250csOzIGVsIGZvcm11bGFyaW8gY29uIGlkICcgKyBkRm9ybS5mb3JtSWQpO1xyXG5cdFx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGNvbnN0IGtleUZvcm1UaXRsZSA9IFRva2VuU2VydmljZS5nZXRLZXlGb3JtdWxhcmlvKGZvcm0udGl0bGUpICsgJ18nO1xyXG5cdFx0XHRcdGZvciAoY29uc3Qga2V5IGluIGRGb3JtLmRhdGEpIHtcclxuXHRcdFx0XHRcdGxpc3REYXRhW2tleV0gPSBkRm9ybS5kYXRhW2tleV07XHJcblx0XHRcdFx0XHRsaXN0RGF0YUJ5Rm9ybVtrZXlGb3JtVGl0bGUgKyBrZXldID0gZEZvcm0uZGF0YVtrZXldO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHtcclxuXHRcdFx0bGlzdERhdGE6IGxpc3REYXRhLFxyXG5cdFx0XHRsaXN0RGF0YUJ5Rm9ybTogbGlzdERhdGFCeUZvcm1cclxuXHRcdH07XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJdCByZXR1cm5zIHRoZSBjb21wb25lbnRzXHJcblx0ICogQHBhcmFtIGNvbXBvbmVudHNcclxuXHQgKi9cclxuXHRzdGF0aWMgZ2V0UGFuZWxDb21wb25lbnRzKGNvbXBvbmVudHM6IGFueVtdKTogYW55W10ge1xyXG5cdFx0cmV0dXJuIEZvcm1pb1V0aWwuZ2V0Q29tcG9uZW50c0J5UGFuZWwoY29tcG9uZW50cyk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJdCByZXR1cm5zIHRoZSBjb21wb25lbnRzIGFycmF5IG9mIHRoZSBmb3JtXHJcblx0ICogQHBhcmFtIGNvbXBvbmVudHMgYXJyYXkgb2YgY29tcG9uZW50c1xyXG5cdCAqL1xyXG5cdHByaXZhdGUgc3RhdGljIGdldENvbXBvbmVudHNCeVBhbmVsKGNvbXBvbmVudHM6IGFueVtdKTogYW55W10ge1xyXG5cdFx0Ly8gaXQgY29udGFpbnMgdGhlIHJlc3VsdCBhcnJheVxyXG5cdFx0bGV0IHJlc3VsdCA9IFtdO1xyXG5cdFx0aWYgKGNvbXBvbmVudHMpIHtcclxuXHRcdFx0Ly8gaXRlcmF0ZSBvdmVyIGNvbXBvbmVudHNcclxuXHRcdFx0Zm9yIChjb25zdCBjb21wb25lbnQgb2YgY29tcG9uZW50cykge1xyXG5cdFx0XHRcdC8vIGF2b2lkIHRoZSBlZGl0Z3JpZCBjb21wb25lbnQgb3QgaWYgaXQgaGFzIGEgZGlmZmVyZW50IGJlaGF2aW9yIGl0IHNob3VsZCBoYXZlIGFuIGVsc2Ugc3RhdGVtZW50XHJcblx0XHRcdFx0aWYgKGNvbXBvbmVudFtFRm9ybWlvS2V5LlRZUEVdICE9PSBFRm9ybWlvS2V5LkVESVRHUklEKSB7XHJcblx0XHRcdFx0XHQvLyBpZiBjb21wb25lbnQgaXMgcGFuZWwgdGhlbiB0aXRsZVBhbmVsIHZhcmlhYmxlIGlzIGNoYW5nZWQsIGFuZCBpdCBpcyBnb25uYSBiZSBpbmhlcml0ZWRcclxuXHRcdFx0XHRcdGlmIChjb21wb25lbnRbRUZvcm1pb0tleS5UWVBFXSA9PT0gRUZvcm1pb0tleS5QQU5FTCkge1xyXG5cdFx0XHRcdFx0XHRyZXN1bHQucHVzaChjb21wb25lbnQpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcbn1cclxuIl19
|