@qbs-origin/origin-form 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/README.md +24 -0
  2. package/esm2022/lib/action-step-handler.mjs +163 -0
  3. package/esm2022/lib/auth-client.service.mjs +69 -0
  4. package/esm2022/lib/enums/label.keys.mjs +721 -0
  5. package/esm2022/lib/form-css.helper.mjs +367 -0
  6. package/esm2022/lib/formly/baseFormlyControlComponent.mjs +52 -0
  7. package/esm2022/lib/formly/baseFormlyStepComponent.mjs +59 -0
  8. package/esm2022/lib/formly/custom-section-separator.component.mjs +32 -0
  9. package/esm2022/lib/formly/form-section-separator.component.mjs +36 -0
  10. package/esm2022/lib/formly/formly-action.mjs +56 -0
  11. package/esm2022/lib/formly/formly-checkbox/formly-checkbox.component.mjs +52 -0
  12. package/esm2022/lib/formly/formly-dictionary-dropdown-tree/formly-dictionary-dropdown-tree.component.mjs +261 -0
  13. package/esm2022/lib/formly/formly-download-documents/formly-download-documents.component.mjs +126 -0
  14. package/esm2022/lib/formly/formly-enrol-card/formly-enrol-card.component.mjs +120 -0
  15. package/esm2022/lib/formly/formly-field-stepper/formly-field-stepper.component.mjs +762 -0
  16. package/esm2022/lib/formly/formly-generate-documents/formly-generate-documents.component.mjs +57 -0
  17. package/esm2022/lib/formly/formly-identification.component.mjs +84 -0
  18. package/esm2022/lib/formly/formly-open-banking/formly-open-banking.component.mjs +590 -0
  19. package/esm2022/lib/formly/formly-paragraph/formly-paragraph.component.mjs +35 -0
  20. package/esm2022/lib/formly/formly-radio/formly-radio-component.mjs +49 -0
  21. package/esm2022/lib/formly/formly-row-fille.mjs +12 -0
  22. package/esm2022/lib/formly/formly-scan-id/formly-scan-id.component.mjs +284 -0
  23. package/esm2022/lib/formly/formly-sign/formly-sign.component.mjs +173 -0
  24. package/esm2022/lib/formly/formly-upload-documents/formly-upload-documents.component.mjs +198 -0
  25. package/esm2022/lib/formly/formly-validate-contact-info/formly-validate-contact-info.component.mjs +124 -0
  26. package/esm2022/lib/formly/formly-view-documents/formly-view-documents.component.mjs +245 -0
  27. package/esm2022/lib/formly/formly-view-offers/formly-view-offers.component.mjs +160 -0
  28. package/esm2022/lib/model-population.helper.mjs +265 -0
  29. package/esm2022/lib/models/application-type.model.mjs +12 -0
  30. package/esm2022/lib/models/application.model.mjs +30 -0
  31. package/esm2022/lib/models/auth/users.model.mjs +2 -0
  32. package/esm2022/lib/models/dictionary.model.mjs +20 -0
  33. package/esm2022/lib/models/flux.model.mjs +105 -0
  34. package/esm2022/lib/models/forms.model.mjs +572 -0
  35. package/esm2022/lib/models/label-info.model.mjs +2 -0
  36. package/esm2022/lib/models/label.model.mjs +2 -0
  37. package/esm2022/lib/models/language.model.mjs +3 -0
  38. package/esm2022/lib/models/list.model.mjs +2 -0
  39. package/esm2022/lib/models/partner.model.mjs +3 -0
  40. package/esm2022/lib/models/treeview.model.mjs +15 -0
  41. package/esm2022/lib/origin-form-auth.service.mjs +40 -0
  42. package/esm2022/lib/origin-form-config.model.mjs +2 -0
  43. package/esm2022/lib/origin-form-token.interceptor.mjs +35 -0
  44. package/esm2022/lib/origin-form.component.mjs +2391 -0
  45. package/esm2022/lib/origin-form.module.mjs +479 -0
  46. package/esm2022/lib/origin-form.service.mjs +14 -0
  47. package/esm2022/lib/others/check-list.database.mjs +55 -0
  48. package/esm2022/lib/others/config-service.mjs +42 -0
  49. package/esm2022/lib/others/dictionary-label-info.mjs +3 -0
  50. package/esm2022/lib/others/environment-type.mjs +21 -0
  51. package/esm2022/lib/others/external-link.directive.mjs +49 -0
  52. package/esm2022/lib/others/flux-helper.mjs +1397 -0
  53. package/esm2022/lib/others/picker.component.mjs +119 -0
  54. package/esm2022/lib/others/translation.pipe.mjs +21 -0
  55. package/esm2022/lib/others/translations-helper.mjs +258 -0
  56. package/esm2022/lib/others/utils.mjs +272 -0
  57. package/esm2022/lib/services/applicationData.service.mjs +145 -0
  58. package/esm2022/lib/services/auth-http.service.mjs +80 -0
  59. package/esm2022/lib/services/dialog.service.mjs +56 -0
  60. package/esm2022/lib/services/dictionary.service.mjs +198 -0
  61. package/esm2022/lib/services/forms.service.mjs +47 -0
  62. package/esm2022/lib/services/labels.service.mjs +29 -0
  63. package/esm2022/lib/services/language.service.mjs +24 -0
  64. package/esm2022/lib/services/open-banking.service.mjs +194 -0
  65. package/esm2022/lib/services/origin-form-signalr-handler.service.mjs +107 -0
  66. package/esm2022/lib/services/origin-form-signalr.service.mjs +105 -0
  67. package/esm2022/lib/services/otp.service.mjs +28 -0
  68. package/esm2022/lib/services/proxy.service.mjs +79 -0
  69. package/esm2022/lib/services/scroll-to-error.service.mjs +369 -0
  70. package/esm2022/lib/services/translation.service.mjs +27 -0
  71. package/esm2022/lib/shared-components/confirmation.component.mjs +34 -0
  72. package/esm2022/lib/shared-components/dictionaries-tree.component.mjs +301 -0
  73. package/esm2022/lib/shared-components/grid.component.mjs +241 -0
  74. package/esm2022/lib/shared-components/treeview/treeview.component.mjs +224 -0
  75. package/esm2022/lib/theme-css.mjs +2254 -0
  76. package/esm2022/lib/theme-injector.service.mjs +26 -0
  77. package/esm2022/public-api.mjs +4 -0
  78. package/esm2022/qbs-origin-origin-form.mjs +5 -0
  79. package/fesm2022/qbs-origin-origin-form.mjs +15215 -0
  80. package/fesm2022/qbs-origin-origin-form.mjs.map +1 -0
  81. package/index.d.ts +5 -0
  82. package/lib/action-step-handler.d.ts +49 -0
  83. package/lib/auth-client.service.d.ts +17 -0
  84. package/lib/enums/label.keys.d.ts +720 -0
  85. package/lib/form-css.helper.d.ts +28 -0
  86. package/lib/formly/baseFormlyControlComponent.d.ts +25 -0
  87. package/lib/formly/baseFormlyStepComponent.d.ts +29 -0
  88. package/lib/formly/custom-section-separator.component.d.ts +6 -0
  89. package/lib/formly/form-section-separator.component.d.ts +10 -0
  90. package/lib/formly/formly-action.d.ts +13 -0
  91. package/lib/formly/formly-checkbox/formly-checkbox.component.d.ts +15 -0
  92. package/lib/formly/formly-dictionary-dropdown-tree/formly-dictionary-dropdown-tree.component.d.ts +45 -0
  93. package/lib/formly/formly-download-documents/formly-download-documents.component.d.ts +22 -0
  94. package/lib/formly/formly-enrol-card/formly-enrol-card.component.d.ts +114 -0
  95. package/lib/formly/formly-field-stepper/formly-field-stepper.component.d.ts +79 -0
  96. package/lib/formly/formly-generate-documents/formly-generate-documents.component.d.ts +17 -0
  97. package/lib/formly/formly-identification.component.d.ts +19 -0
  98. package/lib/formly/formly-open-banking/formly-open-banking.component.d.ts +119 -0
  99. package/lib/formly/formly-paragraph/formly-paragraph.component.d.ts +10 -0
  100. package/lib/formly/formly-radio/formly-radio-component.d.ts +15 -0
  101. package/lib/formly/formly-row-fille.d.ts +6 -0
  102. package/lib/formly/formly-scan-id/formly-scan-id.component.d.ts +41 -0
  103. package/lib/formly/formly-sign/formly-sign.component.d.ts +36 -0
  104. package/lib/formly/formly-upload-documents/formly-upload-documents.component.d.ts +25 -0
  105. package/lib/formly/formly-validate-contact-info/formly-validate-contact-info.component.d.ts +79 -0
  106. package/lib/formly/formly-view-documents/formly-view-documents.component.d.ts +33 -0
  107. package/lib/formly/formly-view-offers/formly-view-offers.component.d.ts +23 -0
  108. package/lib/model-population.helper.d.ts +8 -0
  109. package/lib/models/application-type.model.d.ts +27 -0
  110. package/lib/models/application.model.d.ts +107 -0
  111. package/lib/models/auth/users.model.d.ts +20 -0
  112. package/lib/models/dictionary.model.d.ts +77 -0
  113. package/lib/models/flux.model.d.ts +101 -0
  114. package/lib/models/forms.model.d.ts +504 -0
  115. package/lib/models/label-info.model.d.ts +10 -0
  116. package/lib/models/label.model.d.ts +4 -0
  117. package/lib/models/language.model.d.ts +5 -0
  118. package/lib/models/list.model.d.ts +8 -0
  119. package/lib/models/partner.model.d.ts +12 -0
  120. package/lib/models/treeview.model.d.ts +17 -0
  121. package/lib/origin-form-auth.service.d.ts +15 -0
  122. package/lib/origin-form-config.model.d.ts +12 -0
  123. package/lib/origin-form-token.interceptor.d.ts +12 -0
  124. package/lib/origin-form.component.d.ts +231 -0
  125. package/lib/origin-form.module.d.ts +84 -0
  126. package/lib/origin-form.service.d.ts +6 -0
  127. package/lib/others/check-list.database.d.ts +16 -0
  128. package/lib/others/config-service.d.ts +22 -0
  129. package/lib/others/dictionary-label-info.d.ts +6 -0
  130. package/lib/others/environment-type.d.ts +8 -0
  131. package/lib/others/external-link.directive.d.ts +12 -0
  132. package/lib/others/flux-helper.d.ts +115 -0
  133. package/lib/others/picker.component.d.ts +36 -0
  134. package/lib/others/translation.pipe.d.ts +10 -0
  135. package/lib/others/translations-helper.d.ts +31 -0
  136. package/lib/others/utils.d.ts +37 -0
  137. package/lib/services/applicationData.service.d.ts +35 -0
  138. package/lib/services/auth-http.service.d.ts +21 -0
  139. package/lib/services/dialog.service.d.ts +20 -0
  140. package/lib/services/dictionary.service.d.ts +89 -0
  141. package/lib/services/forms.service.d.ts +17 -0
  142. package/lib/services/labels.service.d.ts +13 -0
  143. package/lib/services/language.service.d.ts +14 -0
  144. package/lib/services/open-banking.service.d.ts +137 -0
  145. package/lib/services/origin-form-signalr-handler.service.d.ts +29 -0
  146. package/lib/services/origin-form-signalr.service.d.ts +24 -0
  147. package/lib/services/otp.service.d.ts +22 -0
  148. package/lib/services/proxy.service.d.ts +29 -0
  149. package/lib/services/scroll-to-error.service.d.ts +54 -0
  150. package/lib/services/translation.service.d.ts +10 -0
  151. package/lib/shared-components/confirmation.component.d.ts +77 -0
  152. package/lib/shared-components/dictionaries-tree.component.d.ts +51 -0
  153. package/lib/shared-components/grid.component.d.ts +138 -0
  154. package/lib/shared-components/treeview/treeview.component.d.ts +121 -0
  155. package/lib/theme-css.d.ts +2 -0
  156. package/lib/theme-injector.service.d.ts +8 -0
  157. package/package.json +42 -0
  158. package/public-api.d.ts +3 -0
  159. package/schematics-compiled/collection.json +10 -0
  160. package/schematics-compiled/ng-add/index.d.ts +2 -0
  161. package/schematics-compiled/ng-add/index.js +67 -0
  162. package/schematics-compiled/ng-add/index.js.map +1 -0
  163. package/schematics-compiled/ng-add/schema.json +8 -0
  164. package/src/lib/assets/fonts/Figtree-Bold.ttf +0 -0
  165. package/src/lib/assets/fonts/Figtree-Light.ttf +0 -0
  166. package/src/lib/assets/fonts/Figtree-Regular.ttf +0 -0
  167. package/src/lib/assets/fonts/Sora-ExtraBold.ttf +0 -0
  168. package/src/lib/assets/fonts/Sora-Light.ttf +0 -0
  169. package/src/lib/assets/fonts/Sora-Regular.ttf +0 -0
  170. package/src/lib/assets/fonts/ttrounds-bold-webfont.woff +0 -0
  171. package/src/lib/assets/fonts/ttrounds-bold-webfont.woff2 +0 -0
  172. package/src/lib/assets/fonts/ttrounds-regular-webfont.woff +0 -0
  173. package/src/lib/assets/fonts/ttrounds-regular-webfont.woff2 +0 -0
  174. package/src/lib/assets/fonts/ttrounds-thin-webfont.woff +0 -0
  175. package/src/lib/assets/fonts/ttrounds-thin-webfont.woff2 +0 -0
  176. package/src/lib/assets/images/flag/icon-flag-de.svg +10 -0
  177. package/src/lib/assets/images/flag/icon-flag-en.svg +1 -0
  178. package/src/lib/assets/images/flag/icon-flag-es.svg +11 -0
  179. package/src/lib/assets/images/flag/icon-flag-fr.svg +1 -0
  180. package/src/lib/assets/images/flag/icon-flag-ro.svg +11 -0
  181. package/src/lib/assets/images/flag/origin-form/new-id-card.png +0 -0
  182. package/src/lib/assets/images/flag/origin-form/old-id-card.png +0 -0
@@ -0,0 +1,120 @@
1
+ import { Component, Inject } from '@angular/core';
2
+ import { DOCUMENT } from '@angular/common';
3
+ import { LabelKeys } from '../../enums/label.keys';
4
+ import { firstValueFrom } from 'rxjs';
5
+ import { Utils } from '../../others/utils';
6
+ import { BaseFormlyStepComponent } from '../baseFormlyStepComponent';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "../../services/applicationData.service";
9
+ import * as i2 from "@angular/router";
10
+ import * as i3 from "@angular/common";
11
+ import * as i4 from "@angular/material/button";
12
+ import * as i5 from "@angular/material/progress-spinner";
13
+ export class FormlyEnrolCardComponent extends BaseFormlyStepComponent {
14
+ constructor(appDataService, route, cdr, document) {
15
+ super(cdr);
16
+ this.appDataService = appDataService;
17
+ this.route = route;
18
+ this.document = document;
19
+ this.hasErrors = false;
20
+ this.isAlreadyEnroled = false;
21
+ this.paymentError = false;
22
+ this.cardenrolKeys = LabelKeys.cardEnrolKeys;
23
+ this.fluxKeys = LabelKeys.flux;
24
+ this.isEuPlatesc = false;
25
+ this.isNetopia = false;
26
+ }
27
+ onPageSelected() {
28
+ this.route.queryParams.subscribe(async (queryParams) => {
29
+ if (queryParams['originpaymenterror']) {
30
+ var finished = false;
31
+ while (!finished) {
32
+ this.isLoading = true;
33
+ var result = await firstValueFrom(this.appDataService.getEnrolmentStatus(this.dataUrlId));
34
+ if (result) {
35
+ if (result.status === 'Approved') {
36
+ finished = true;
37
+ this.paymentError = false;
38
+ this.isAlreadyEnroled = true;
39
+ this.isLoading = false;
40
+ this.cdr.detectChanges();
41
+ }
42
+ else if (result.status === 'Declined') {
43
+ finished = true;
44
+ this.paymentError = true;
45
+ this.isAlreadyEnroled = false;
46
+ this.isLoading = false;
47
+ this.cdr.detectChanges();
48
+ this.enrolCard(); //we can retry
49
+ }
50
+ }
51
+ await new Promise((f) => setTimeout(f, 200));
52
+ }
53
+ }
54
+ else
55
+ this.enrolCard();
56
+ });
57
+ }
58
+ goToUrl() {
59
+ this.document.location.href = this.enrolUrl;
60
+ }
61
+ enrolCard() {
62
+ this.isLoading = true;
63
+ const command = {
64
+ appId: this.appId,
65
+ appDataId: this.appDataId,
66
+ stepId: this.stepData.identifier,
67
+ };
68
+ if (!this.isAlreadyEnroled) {
69
+ this.appDataService.enrolCard(command).subscribe({
70
+ next: (result) => {
71
+ this.hasErrors = false;
72
+ this.enrolUrl = result.submitUrl;
73
+ this.isLoading = false;
74
+ this.cdr.detectChanges();
75
+ },
76
+ error: (err) => {
77
+ this.hasErrors = true;
78
+ this.isLoading = false;
79
+ this.cdr.detectChanges();
80
+ },
81
+ });
82
+ }
83
+ this.cdr.detectChanges();
84
+ }
85
+ getTranslatedLabel(translations) {
86
+ const langIso = this.props?.['langIso'] || 'en';
87
+ return Utils.findTranslation(translations ?? [], langIso) || '';
88
+ }
89
+ getSeparatorStyles() {
90
+ const separatorConfig = this.props?.['appModel']?.['design']?.['components']?.find((c) => c?.['name'] === 'Separator Sectiune');
91
+ if (!separatorConfig) {
92
+ return {
93
+ 'border-top': '1px solid #ccc',
94
+ margin: '10px 0',
95
+ };
96
+ }
97
+ return {
98
+ 'border-top': `${separatorConfig?.['weight'] || '1px'} solid ${separatorConfig?.['color'] || '#ccc'}`,
99
+ 'border-radius': separatorConfig?.['borderRadius'] || '0px',
100
+ 'background-color': separatorConfig?.['backgroundColor'] || 'transparent',
101
+ margin: '10px 0',
102
+ };
103
+ }
104
+ canAdvance() {
105
+ if (this.isLoading || this.hasErrors) {
106
+ return false;
107
+ }
108
+ return true;
109
+ }
110
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormlyEnrolCardComponent, deps: [{ token: i1.ApplicationDataService }, { token: i2.ActivatedRoute }, { token: i0.ChangeDetectorRef }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component }); }
111
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FormlyEnrolCardComponent, selector: "app-enrol-card", usesInheritance: true, ngImport: i0, template: "<p *ngIf=\"this.isAlreadyEnroled\">\n {{ props[\"labels\"].cardenrolSuccessLabel }}\n</p>\n<p *ngIf=\"this.paymentError\">{{ props[\"labels\"].cardenrolFailureLabel }}</p>\n<mat-spinner *ngIf=\"isLoading\" class=\"m-x-auto upload-spinner\"></mat-spinner>\n\n<div>\n <div *ngFor=\"let section of stepData?.sections\">\n <div *ngFor=\"let control of section.presentationControls\">\n <p class=\"font-paragraph\">\n {{ getTranslatedLabel(control.translations) }}\n </p>\n <p class=\"font-paragraph\">\n {{\n getTranslatedLabel(\n control.specificControlData?.descriptionTranslations\n )\n }}\n </p>\n </div>\n </div>\n</div>\n\n<button\n mat-flat-button\n type=\"button\"\n (click)=\"goToUrl()\"\n [disabled]=\"isLoading || isAlreadyEnroled\"\n class=\"btn btn-primary m-t-20 m-b-20 w-100\"\n>\n {{ props[\"labels\"].cardenrolButtonLabel }}\n</button>\n", styles: [""], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i5.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }] }); }
112
+ }
113
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormlyEnrolCardComponent, decorators: [{
114
+ type: Component,
115
+ args: [{ selector: 'app-enrol-card', template: "<p *ngIf=\"this.isAlreadyEnroled\">\n {{ props[\"labels\"].cardenrolSuccessLabel }}\n</p>\n<p *ngIf=\"this.paymentError\">{{ props[\"labels\"].cardenrolFailureLabel }}</p>\n<mat-spinner *ngIf=\"isLoading\" class=\"m-x-auto upload-spinner\"></mat-spinner>\n\n<div>\n <div *ngFor=\"let section of stepData?.sections\">\n <div *ngFor=\"let control of section.presentationControls\">\n <p class=\"font-paragraph\">\n {{ getTranslatedLabel(control.translations) }}\n </p>\n <p class=\"font-paragraph\">\n {{\n getTranslatedLabel(\n control.specificControlData?.descriptionTranslations\n )\n }}\n </p>\n </div>\n </div>\n</div>\n\n<button\n mat-flat-button\n type=\"button\"\n (click)=\"goToUrl()\"\n [disabled]=\"isLoading || isAlreadyEnroled\"\n class=\"btn btn-primary m-t-20 m-b-20 w-100\"\n>\n {{ props[\"labels\"].cardenrolButtonLabel }}\n</button>\n" }]
116
+ }], ctorParameters: () => [{ type: i1.ApplicationDataService }, { type: i2.ActivatedRoute }, { type: i0.ChangeDetectorRef }, { type: Document, decorators: [{
117
+ type: Inject,
118
+ args: [DOCUMENT]
119
+ }] }] });
120
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWx5LWVucm9sLWNhcmQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb3JpZ2luLWZvcm0vc3JjL2xpYi9mb3JtbHkvZm9ybWx5LWVucm9sLWNhcmQvZm9ybWx5LWVucm9sLWNhcmQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb3JpZ2luLWZvcm0vc3JjL2xpYi9mb3JtbHkvZm9ybWx5LWVucm9sLWNhcmQvZm9ybWx5LWVucm9sLWNhcmQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQixTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBS3JFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUzQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDbkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDM0MsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7Ozs7Ozs7QUFPckUsTUFBTSxPQUFPLHdCQUF5QixTQUFRLHVCQUF1QjtJQVVuRSxZQUNVLGNBQXNDLEVBQ3RDLEtBQXFCLEVBQzdCLEdBQXNCLEVBQ0ksUUFBa0I7UUFFNUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBTEgsbUJBQWMsR0FBZCxjQUFjLENBQXdCO1FBQ3RDLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBRUgsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQWJ2QyxjQUFTLEdBQVksS0FBSyxDQUFDO1FBQzNCLHFCQUFnQixHQUFZLEtBQUssQ0FBQztRQUV6QyxpQkFBWSxHQUFZLEtBQUssQ0FBQztRQUM5QixrQkFBYSxHQUFHLFNBQVMsQ0FBQyxhQUFhLENB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RSxRQUFRO1NBQ2pCLENBQUM7SUFDSixDQUFDO0lBRVEsVUFBVTtRQUNqQixJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3JDLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQzsrR0E5R1Usd0JBQXdCLHVIQWN6QixRQUFRO21HQWRQLHdCQUF3Qiw2RUNqQnJDLHk2QkFnQ0E7OzRGRGZhLHdCQUF3QjtrQkFMcEMsU0FBUzsrQkFDRSxnQkFBZ0I7OzBCQWtCdkIsTUFBTTsyQkFBQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgSW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBcHBsaWNhdGlvbkRhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYXBwbGljYXRpb25EYXRhLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgQXBwbGljYXRpb25FbnJvbENhcmREdG8sXG59IGZyb20gJy4uLy4uL21vZGVscy9hcHBsaWNhdGlvbi5tb2RlbCc7XG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBMYWJlbEtleXMgfSBmcm9tICcuLi8uLi9lbnVtcy9sYWJlbC5rZXlzJztcbmltcG9ydCB7IGZpcnN0VmFsdWVGcm9tIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBVdGlscyB9IGZyb20gJy4uLy4uL290aGVycy91dGlscyc7XG5pbXBvcnQgeyBCYXNlRm9ybWx5U3RlcENvbXBvbmVudCB9IGZyb20gJy4uL2Jhc2VGb3JtbHlTdGVwQ29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWVucm9sLWNhcmQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZm9ybWx5LWVucm9sLWNhcmQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vZm9ybWx5LWVucm9sLWNhcmQuY29tcG9uZW50LnNjc3MnLFxufSlcbmV4cG9ydCBjbGFzcyBGb3JtbHlFbnJvbENhcmRDb21wb25lbnQgZXh0ZW5kcyBCYXNlRm9ybWx5U3RlcENvbXBvbmVudCB7XG4gIHB1YmxpYyBoYXNFcnJvcnM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGlzQWxyZWFkeUVucm9sZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgZW5yb2xVcmw6IHN0cmluZztcbiAgcGF5bWVudEVycm9yOiBib29sZWFuID0gZmFsc2U7XG4gIGNhcmRlbnJvbEtleXMgPSBMYWJlbEtleXMuY2FyZEVucm9sS2V5cztcbiAgZmx1eEtleXMgPSBMYWJlbEtleXMuZmx1eDtcbiAgaXNFdVBsYXRlc2M6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNOZXRvcGlhOiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBhcHBEYXRhU2VydmljZTogQXBwbGljYXRpb25EYXRhU2VydmljZSxcbiAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jdW1lbnQ6IERvY3VtZW50XG4gICkge1xuICAgIHN1cGVyKGNkcik7XG4gIH1cblxuICBvdmVycmlkZSBvblBhZ2VTZWxlY3RlZCgpIHtcbiAgICB0aGlzLnJvdXRlLnF1ZXJ5UGFyYW1zLnN1YnNjcmliZShhc3luYyAocXVlcnlQYXJhbXMpID0+IHtcbiAgICAgIGlmIChxdWVyeVBhcmFtc1snb3JpZ2lucGF5bWVudGVycm9yJ10pIHtcbiAgICAgICAgdmFyIGZpbmlzaGVkOiBib29sZWFuID0gZmFsc2U7XG4gICAgICAgIHdoaWxlICghZmluaXNoZWQpIHtcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG4gICAgICAgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxuICAgICAgICAgICAgdGhpcy5hcHBEYXRhU2VydmljZS5nZXRFbnJvbG1lbnRTdGF0dXModGhpcy5kYXRhVXJsSWQpXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gJ0FwcHJvdmVkJykge1xuICAgICAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7XG4gICAgICAgICAgICAgIHRoaXMucGF5bWVudEVycm9yID0gZmFsc2U7XG4gICAgICAgICAgICAgIHRoaXMuaXNBbHJlYWR5RW5yb2xlZCA9IHRydWU7XG4gICAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0LnN0YXR1cyA9PT0gJ0RlY2xpbmVkJykge1xuICAgICAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7XG4gICAgICAgICAgICAgIHRoaXMucGF5bWVudEVycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgdGhpcy5pc0FscmVhZHlFbnJvbGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgICAgdGhpcy5lbnJvbENhcmQoKTsgLy93ZSBjYW4gcmV0cnlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKGYpID0+IHNldFRpbWVvdXQoZiwgMjAwKSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB0aGlzLmVucm9sQ2FyZCgpO1xuICAgIH0pO1xuICB9XG4gIGdvVG9VcmwoKTogdm9pZCB7XG4gICAgdGhpcy5kb2N1bWVudC5sb2NhdGlvbi5ocmVmID0gdGhpcy5lbnJvbFVybDtcbiAgfVxuICBlbnJvbENhcmQoKSB7XG4gICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuICAgIGNvbnN0IGNvbW1hbmQ6IEFwcGxpY2F0aW9uRW5yb2xDYXJkRHRvID0ge1xuICAgICAgYXBwSWQ6IHRoaXMuYXBwSWQsXG4gICAgICBhcHBEYXRhSWQ6IHRoaXMuYXBwRGF0YUlkLFxuICAgICAgc3RlcElkOiB0aGlzLnN0ZXBEYXRhLmlkZW50aWZpZXIsXG4gICAgfTtcbiAgICBpZiAoIXRoaXMuaXNBbHJlYWR5RW5yb2xlZCkge1xuICAgICAgdGhpcy5hcHBEYXRhU2VydmljZS5lbnJvbENhcmQoY29tbWFuZCkuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHJlc3VsdCkgPT4ge1xuICAgICAgICAgIHRoaXMuaGFzRXJyb3JzID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5lbnJvbFVybCA9IHJlc3VsdC5zdWJtaXRVcmw7XG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcblxuICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgICB0aGlzLmhhc0Vycm9ycyA9IHRydWU7XG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgZ2V0VHJhbnNsYXRlZExhYmVsKHRyYW5zbGF0aW9uczogYW55W10gfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxhbmdJc28gPSB0aGlzLnByb3BzPy5bJ2xhbmdJc28nXSB8fCAnZW4nO1xuICAgIHJldHVybiBVdGlscy5maW5kVHJhbnNsYXRpb24odHJhbnNsYXRpb25zID8/IFtdLCBsYW5nSXNvKSB8fCAnJztcbiAgfVxuXG4gIGdldFNlcGFyYXRvclN0eWxlcygpOiBhbnkge1xuICAgIGNvbnN0IHNlcGFyYXRvckNvbmZpZyA9IHRoaXMucHJvcHM/LlsnYXBwTW9kZWwnXT8uWydkZXNpZ24nXT8uW1xuICAgICAgJ2NvbXBvbmVudHMnXG4gICAgXT8uZmluZCgoYzogYW55KSA9PiBjPy5bJ25hbWUnXSA9PT0gJ1NlcGFyYXRvciBTZWN0aXVuZScpO1xuXG4gICAgaWYgKCFzZXBhcmF0b3JDb25maWcpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgICdib3JkZXItdG9wJzogJzFweCBzb2xpZCAjY2NjJyxcbiAgICAgICAgbWFyZ2luOiAnMTBweCAwJyxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICdib3JkZXItdG9wJzogYCR7c2VwYXJhdG9yQ29uZmlnPy5bJ3dlaWdodCddIHx8ICcxcHgnfSBzb2xpZCAke1xuICAgICAgICBzZXBhcmF0b3JDb25maWc/LlsnY29sb3InXSB8fCAnI2NjYydcbiAgICAgIH1gLFxuICAgICAgJ2JvcmRlci1yYWRpdXMnOiBzZXBhcmF0b3JDb25maWc/LlsnYm9yZGVyUmFkaXVzJ10gfHwgJzBweCcsXG4gICAgICAnYmFja2dyb3VuZC1jb2xvcic6IHNlcGFyYXRvckNvbmZpZz8uWydiYWNrZ3JvdW5kQ29sb3InXSB8fCAndHJhbnNwYXJlbnQnLFxuICAgICAgbWFyZ2luOiAnMTBweCAwJyxcbiAgICB9O1xuICB9XG5cbiAgb3ZlcnJpZGUgY2FuQWR2YW5jZSgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pc0xvYWRpbmcgfHwgdGhpcy5oYXNFcnJvcnMpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cbiIsIjxwICpuZ0lmPVwidGhpcy5pc0FscmVhZHlFbnJvbGVkXCI+XG4gIHt7IHByb3BzW1wibGFiZWxzXCJdLmNhcmRlbnJvbFN1Y2Nlc3NMYWJlbCB9fVxuPC9wPlxuPHAgKm5nSWY9XCJ0aGlzLnBheW1lbnRFcnJvclwiPnt7IHByb3BzW1wibGFiZWxzXCJdLmNhcmRlbnJvbEZhaWx1cmVMYWJlbCB9fTwvcD5cbjxtYXQtc3Bpbm5lciAqbmdJZj1cImlzTG9hZGluZ1wiIGNsYXNzPVwibS14LWF1dG8gdXBsb2FkLXNwaW5uZXJcIj48L21hdC1zcGlubmVyPlxuXG48ZGl2PlxuICA8ZGl2ICpuZ0Zvcj1cImxldCBzZWN0aW9uIG9mIHN0ZXBEYXRhPy5zZWN0aW9uc1wiPlxuICAgIDxkaXYgKm5nRm9yPVwibGV0IGNvbnRyb2wgb2Ygc2VjdGlvbi5wcmVzZW50YXRpb25Db250cm9sc1wiPlxuICAgICAgPHAgY2xhc3M9XCJmb250LXBhcmFncmFwaFwiPlxuICAgICAgICB7eyBnZXRUcmFuc2xhdGVkTGFiZWwoY29udHJvbC50cmFuc2xhdGlvbnMpIH19XG4gICAgICA8L3A+XG4gICAgICA8cCBjbGFzcz1cImZvbnQtcGFyYWdyYXBoXCI+XG4gICAgICAgIHt7XG4gICAgICAgICAgZ2V0VHJhbnNsYXRlZExhYmVsKFxuICAgICAgICAgICAgY29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhPy5kZXNjcmlwdGlvblRyYW5zbGF0aW9uc1xuICAgICAgICAgIClcbiAgICAgICAgfX1cbiAgICAgIDwvcD5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPGJ1dHRvblxuICBtYXQtZmxhdC1idXR0b25cbiAgdHlwZT1cImJ1dHRvblwiXG4gIChjbGljayk9XCJnb1RvVXJsKClcIlxuICBbZGlzYWJsZWRdPVwiaXNMb2FkaW5nIHx8IGlzQWxyZWFkeUVucm9sZWRcIlxuICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBtLXQtMjAgbS1iLTIwIHctMTAwXCJcbj5cbiAge3sgcHJvcHNbXCJsYWJlbHNcIl0uY2FyZGVucm9sQnV0dG9uTGFiZWwgfX1cbjwvYnV0dG9uPlxuIl19