@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,2391 @@
1
+ import { Component, EventEmitter, Input, Output, ViewChildren, } from '@angular/core';
2
+ import { FormControl, FormGroup } from '@angular/forms';
3
+ import { FormlyField, } from '@ngx-formly/core';
4
+ import { Subject, firstValueFrom, startWith, pairwise, debounceTime, switchMap, catchError, of, takeUntil, map, Subscription, } from 'rxjs';
5
+ import { LabelKeys } from './enums/label.keys';
6
+ import { FluxType, DimensionType, StepControlType, ManualInputControlType, } from './models/forms.model';
7
+ import { EnvironmentType } from './others/environment-type';
8
+ import { Utils } from './others/utils';
9
+ import { ModelPopulationHelper } from './model-population.helper';
10
+ import { FormCssHelper } from './form-css.helper';
11
+ import { PresentationControlType } from './models/flux.model';
12
+ import * as i0 from "@angular/core";
13
+ import * as i1 from "./services/dictionary.service";
14
+ import * as i2 from "./services/proxy.service";
15
+ import * as i3 from "./services/labels.service";
16
+ import * as i4 from "./services/applicationData.service";
17
+ import * as i5 from "./services/language.service";
18
+ import * as i6 from "./origin-form-auth.service";
19
+ import * as i7 from "./services/forms.service";
20
+ import * as i8 from "./others/config-service";
21
+ import * as i9 from "./services/translation.service";
22
+ import * as i10 from "./services/origin-form-signalr-handler.service";
23
+ import * as i11 from "./action-step-handler";
24
+ import * as i12 from "./services/scroll-to-error.service";
25
+ import * as i13 from "@angular/common";
26
+ import * as i14 from "@angular/forms";
27
+ import * as i15 from "@angular/material/menu";
28
+ import * as i16 from "@angular/material/button";
29
+ import * as i17 from "@angular/material/progress-spinner";
30
+ import * as i18 from "@ngx-formly/core";
31
+ export class CollectorFormComponent {
32
+ constructor(service, cdRef, renderer, proxy, labelService, applicationDataService, langService, authService, formsService, configService, translationService, originFormSignalrHandlerService, actionStepHandler, scrollToErrorService) {
33
+ this.service = service;
34
+ this.cdRef = cdRef;
35
+ this.renderer = renderer;
36
+ this.labelService = labelService;
37
+ this.applicationDataService = applicationDataService;
38
+ this.langService = langService;
39
+ this.authService = authService;
40
+ this.formsService = formsService;
41
+ this.configService = configService;
42
+ this.translationService = translationService;
43
+ this.originFormSignalrHandlerService = originFormSignalrHandlerService;
44
+ this.actionStepHandler = actionStepHandler;
45
+ this.scrollToErrorService = scrollToErrorService;
46
+ this.showDisplayMode = false;
47
+ this.showLanguageSelector = true;
48
+ this.isDemoMode = false;
49
+ this.isDebug = false;
50
+ this.noButtonsInView = false;
51
+ this.formlyConfigUpdated = new EventEmitter();
52
+ this.visibleFieldsUpdated = new EventEmitter();
53
+ this.formlyUpdateAndGoNext = new EventEmitter();
54
+ this.formlyGoNext = new EventEmitter();
55
+ this.completionEvent = new EventEmitter();
56
+ this.form = new FormGroup({});
57
+ this.formlyConfig = [];
58
+ this.formlyAllSteps = [];
59
+ this.activeStep = 0;
60
+ this.options = {};
61
+ this.isLoading = true;
62
+ this.dictionaryMap = new Map();
63
+ this.dictionaryIdToUuidMap = new Map();
64
+ this.generalDataKeys = LabelKeys.appConfigEdit.generalData;
65
+ this.fieldUnsubscribeSubjects = [];
66
+ this.collectorHandlerSubscriptions = new Subscription();
67
+ // Action step execution state
68
+ this.isExecutingActions = false;
69
+ this.actionStepSubscriptions = new Subscription();
70
+ this.isSavingAfterActions = false; // Make this public so stepper can access it
71
+ this.kycPhoneNumber = '';
72
+ this.kycLangIso = '';
73
+ this.kycShowCitizenship = false;
74
+ this.kycScrollMode = false;
75
+ // end identification kyc component
76
+ this.languageFlags = [
77
+ {
78
+ language: 'English',
79
+ code: 'en',
80
+ type: 'US',
81
+ icon: '/assets/images/flag/icon-flag-en.svg',
82
+ },
83
+ {
84
+ language: 'Romana',
85
+ code: 'ro',
86
+ icon: '/assets/images/flag/icon-flag-ro.svg',
87
+ },
88
+ {
89
+ language: 'Deutsch',
90
+ code: 'de',
91
+ icon: '/assets/images/flag/icon-flag-de.svg',
92
+ },
93
+ {
94
+ language: 'Français',
95
+ code: 'fr',
96
+ icon: '/assets/images/flag/icon-flag-fr.svg',
97
+ },
98
+ {
99
+ language: 'Italiano',
100
+ code: 'it',
101
+ icon: '/assets/images/flag/icon-flag-it.svg',
102
+ },
103
+ {
104
+ language: 'Español',
105
+ code: 'es',
106
+ icon: '/assets/images/flag/icon-flag-es.svg',
107
+ },
108
+ ];
109
+ this._self = this;
110
+ this.loadingMessage = null;
111
+ this.kycApiUrl = proxy.apiURL;
112
+ this.kycOrderId = proxy.orderID;
113
+ this.kycToken = proxy.token;
114
+ this.kycEnv = proxy.env;
115
+ this.kycLangIso = proxy.langIso;
116
+ const isLoadingSub = this.originFormSignalrHandlerService.isLoading$.subscribe((loading) => {
117
+ if (this.isLoading !== loading) {
118
+ this.isLoading = loading;
119
+ }
120
+ });
121
+ this.collectorHandlerSubscriptions.add(isLoadingSub);
122
+ const operationCompletedSub = this.originFormSignalrHandlerService.operationCompleted$.subscribe(async (result) => {
123
+ if (result.operationIdentifier === 'KYC_PROCESSING') {
124
+ if (result.success) {
125
+ console.log('KYC Processing successfully completed (via Handler Service):', result.data);
126
+ if (result.data) {
127
+ this.fillData = JSON.parse(result.data.fillData);
128
+ this.populateModelWithFillData(this.fillData);
129
+ }
130
+ this.formlyUpdateAndGoNext.emit({});
131
+ }
132
+ else {
133
+ console.error('KYC Processing failed (via Handler Service):', result.error);
134
+ }
135
+ }
136
+ });
137
+ this.collectorHandlerSubscriptions.add(operationCompletedSub);
138
+ // Subscribe to action step execution events
139
+ const actionExecutingSub = this.actionStepHandler.actionExecuting$.subscribe((executing) => {
140
+ this.isExecutingActions = executing;
141
+ this.isLoading = executing;
142
+ this.cdRef.detectChanges();
143
+ });
144
+ this.actionStepSubscriptions.add(actionExecutingSub);
145
+ const actionCompletedSub = this.actionStepHandler.actionCompleted$.subscribe((result) => {
146
+ console.log('🎬 Action step completed:', result);
147
+ if (!result.success) {
148
+ console.error('❌ Action step failed:', result.error);
149
+ }
150
+ // Note: We don't auto-progress here as it's handled in executeActionStepsBeforeMoving
151
+ });
152
+ this.actionStepSubscriptions.add(actionCompletedSub);
153
+ }
154
+ async ngOnInit() {
155
+ if (this.dataUrlId) {
156
+ var result = await firstValueFrom(this.applicationDataService.getDataUrl(this.dataUrlId));
157
+ if (result) {
158
+ this.configUuid = result.appId;
159
+ this.appDataUuid = result.appDataId;
160
+ this.env = result.env;
161
+ }
162
+ }
163
+ if (this.appDataUuid && this.currentStepId) {
164
+ this.applicationDataService.setCurrentStep(this.appDataUuid, this.currentStepId);
165
+ }
166
+ if (!this.appDataUuid) {
167
+ this.appDataUuid = Utils.generateUUID();
168
+ }
169
+ if (this.configComponent &&
170
+ this.configComponent.Token &&
171
+ this.configComponent.RefreshToken) {
172
+ this.configService.updateConfigFromInput(this.configComponent);
173
+ await this.authService.setTokens(this.configComponent.Token, this.configComponent.RefreshToken);
174
+ }
175
+ if (!this.availableLanguages || this.availableLanguages.length === 0) {
176
+ await firstValueFrom(this.langService.getLanguages()).then((list) => {
177
+ if (list && list.items?.length > 0) {
178
+ this.availableLanguages = list.items;
179
+ }
180
+ });
181
+ }
182
+ await this.loadAppData();
183
+ if (!this.currentLanguageIso && this.appModel) {
184
+ this.currentLanguageIso = this.appModel.generalData.defaultLanguage;
185
+ }
186
+ if (this.appModel) {
187
+ await this.initAsync();
188
+ }
189
+ }
190
+ async ngOnChanges(changes) {
191
+ if (changes['configComponent'] && !changes['configComponent'].firstChange) {
192
+ if (this.configComponent &&
193
+ this.configComponent.Token &&
194
+ this.configComponent.RefreshToken) {
195
+ this.configService.updateConfigFromInput(this.configComponent);
196
+ await this.authService.setTokens(this.configComponent.Token, this.configComponent.RefreshToken);
197
+ }
198
+ }
199
+ if (changes['currentLanguageIso'] &&
200
+ !changes['currentLanguageIso'].firstChange) {
201
+ this.isLoading = true;
202
+ try {
203
+ if (!this.availableLanguages) {
204
+ await firstValueFrom(this.langService.getLanguages()).then((list) => {
205
+ if (list && list.items?.length > 0) {
206
+ this.availableLanguages = list.items;
207
+ }
208
+ });
209
+ }
210
+ if (this.appDataUuid) {
211
+ try {
212
+ const appData = await this.applicationDataService.getSteps(this.appDataUuid);
213
+ if (appData && appData.fillData) {
214
+ this.fillData = JSON.parse(appData.fillData);
215
+ this.blockPreviousStep = appData.blockPreviousStep;
216
+ if (this.fillData.metadata.language) {
217
+ this.currentLanguageIso = this.fillData.metadata.language;
218
+ }
219
+ }
220
+ }
221
+ catch (error) {
222
+ console.error('Error retrieving app data', error);
223
+ }
224
+ }
225
+ await this.initAsync();
226
+ }
227
+ catch (error) {
228
+ }
229
+ finally {
230
+ this.isLoading = false;
231
+ }
232
+ }
233
+ }
234
+ async loadAppData() {
235
+ this.isLoading = true;
236
+ try {
237
+ const response = await firstValueFrom(this.formsService.loadFormByUuid(this.configUuid, this.env));
238
+ this.appModel = JSON.parse(response.configuration);
239
+ this.fillData = response.fillData ? JSON.parse(response.fillData) : null;
240
+ }
241
+ catch (error) {
242
+ console.error('Error loading form data', error);
243
+ }
244
+ finally {
245
+ this.isLoading = false;
246
+ }
247
+ }
248
+ async initAsync() {
249
+ this.unsubscribeFromAllFields();
250
+ await this.buildFormlyAsync();
251
+ await this.initializeReferenceFields(this.formlyConfig);
252
+ this.updateFormlyConfig();
253
+ this.formlyConfigUpdated.emit();
254
+ this.cdRef.detectChanges();
255
+ }
256
+ applicationLanguages() {
257
+ return this.availableLanguages?.filter((a) => {
258
+ return this.appModel?.generalData?.languages?.indexOf(a.iso) >= 0;
259
+ });
260
+ }
261
+ returnFLag(language) {
262
+ return this.languageFlags.find((l) => l.code == language)?.icon;
263
+ }
264
+ changeLanguage($event) {
265
+ this.currentLanguageIso = $event;
266
+ this.applicationDataService
267
+ .changeLanguage(this.appDataUuid, this.currentLanguageIso)
268
+ .subscribe();
269
+ this.initAsync();
270
+ }
271
+ getLanguageName(languageIso) {
272
+ const language = this.availableLanguages.find((lang) => lang.iso === languageIso);
273
+ return language ? language.name : '';
274
+ }
275
+ async buildFormlyAsync() {
276
+ if (this.currentLanguageIso) {
277
+ await this.getLabels();
278
+ }
279
+ // STEP 1: Initialize flux and other properties first
280
+ this.flux = this.appModel.flux;
281
+ this.display = this.appModel.display;
282
+ this.design = this.appModel.generatedCss;
283
+ this.generalData = this.appModel.generalData;
284
+ this.addRenderedCss();
285
+ // STEP 2: Load ALL dictionaries upfront (now that flux is initialized)
286
+ await this.loadAllRequiredDictionaries();
287
+ // STEP 3: Continue with existing form building logic
288
+ this.formlyConfig = [];
289
+ this.formlyCollectingFields = [];
290
+ this.formlyPresentationFields = [];
291
+ this.model = {};
292
+ this.form = new FormGroup({});
293
+ if (this.fillData) {
294
+ this.populateControlIdsWithValueDictionary();
295
+ }
296
+ // Initialize model with default values if no fillData
297
+ if (!this.fillData) {
298
+ this.model = ModelPopulationHelper.applyDefaultsToModel(this.flux, this.dictionaryMap, this.availableLanguages);
299
+ }
300
+ else {
301
+ this.populateModelWithFillData(this.fillData);
302
+ this.populateControlIdsWithValueDictionary();
303
+ }
304
+ this.form.patchValue(this.model);
305
+ await this.buildFormlyConfigAsync();
306
+ // Initialize references for default values
307
+ if (!this.fillData) {
308
+ await this.initializeReferenceFields(this.formlyConfig);
309
+ }
310
+ this.form.valueChanges
311
+ .pipe(startWith(null), pairwise())
312
+ .subscribe(([prev, next]) => this.handleFormValueChange([prev, next]));
313
+ }
314
+ handleFormValueChange([prev, next]) {
315
+ const currentLanguageId = Utils.findLanguageIdByIso(this.availableLanguages, this.currentLanguageIso);
316
+ for (const key in next) {
317
+ if (next[key]?.valueTranslations) {
318
+ var s = JSON.stringify(next[key]);
319
+ var replaced = s.replace(/"valueTranslations":/g, '"translations":');
320
+ next[key] = JSON.parse(replaced);
321
+ }
322
+ const fields = this.formlyPresentationFields.filter((i) => i.props && i.props['collectionControlIdentifier'] === key);
323
+ if (fields && fields.length > 0) {
324
+ fields.forEach((field) => {
325
+ let value = '';
326
+ switch (typeof next[key]) {
327
+ case 'boolean':
328
+ value = next[key] ? '✓' : '✗';
329
+ break;
330
+ default:
331
+ if (next[key]?.translations) {
332
+ const translation = next[key].translations.find((translation) => translation.languageId === currentLanguageId);
333
+ value = translation ? translation.value : null;
334
+ }
335
+ else {
336
+ value = next[key];
337
+ }
338
+ break;
339
+ }
340
+ field.defaultValue = value;
341
+ });
342
+ }
343
+ if (this.stepDictionaryDependentIds.find((a) => a == key)) {
344
+ if (next[key]?.id &&
345
+ (prev == null || prev[key]?.id !== next[key]?.id)) {
346
+ this.formlyConfig[0].fieldGroup = this.getFormlyFilteredSteps();
347
+ var filteredStepsIdentifiers = this.formlyConfig[0].fieldGroup.map((f) => f.props?.['stepId']);
348
+ const visibleSteps = this.actionStepHandler.filterVisibleSteps(this.flux, filteredStepsIdentifiers);
349
+ this.updateFormlyConfig();
350
+ this.visibleFieldsUpdated.emit(visibleSteps);
351
+ this.formlyConfigUpdated.emit();
352
+ }
353
+ }
354
+ }
355
+ }
356
+ getLabels() {
357
+ return new Promise((resolve) => {
358
+ this.labelService
359
+ .getLabels(this.currentLanguageIso, false)
360
+ .subscribe((l) => {
361
+ this.labels = l;
362
+ resolve();
363
+ });
364
+ });
365
+ }
366
+ populateControlIdsWithValueDictionary() {
367
+ var currentLanguageId = this.getCurrentLanguageId();
368
+ const controlIdsWithValues = this.fillData.flux
369
+ .flatMap((step) => step.sections.flatMap((section) => section.controls
370
+ .filter((control) => control.controlId && control.fillValue)
371
+ .map((control) => ({
372
+ controlId: control.controlId,
373
+ fillValue: control.fillValue,
374
+ fillValueId: control.fillValueId,
375
+ }))))
376
+ .reduce((dictionary, { controlId, fillValue, fillValueId }) => {
377
+ if (fillValueId) {
378
+ for (const [key, dict] of this.dictionaryMap.entries()) {
379
+ const value = dict.values?.find((v) => v.id == fillValueId);
380
+ if (value) {
381
+ const translation = value.valueTranslations.find((t) => t.languageId == currentLanguageId);
382
+ if (translation) {
383
+ dictionary[controlId] = translation.value;
384
+ break;
385
+ }
386
+ }
387
+ }
388
+ }
389
+ else {
390
+ dictionary[controlId] = fillValue;
391
+ }
392
+ return dictionary;
393
+ }, {});
394
+ this.controlIdsWithValues = controlIdsWithValues;
395
+ }
396
+ getCurrentLanguageId() {
397
+ const currentLanguageId = Utils.findLanguageIdByIso(this.availableLanguages, this.currentLanguageIso);
398
+ return currentLanguageId;
399
+ }
400
+ async buildFormlyConfigAsync() {
401
+ this.stepsSettings = {
402
+ showCounter: this.showDisplayMode
403
+ ? false
404
+ : this.generalData.showCounterStep,
405
+ showLabels: this.showDisplayMode ? false : this.generalData.showNameStep,
406
+ showAllSteps: this.showDisplayMode
407
+ ? false
408
+ : this.generalData.showAllSteps,
409
+ showProgressBar: this.generalData.showProgressBar &&
410
+ this.generalData.showAllSteps == false
411
+ ? true
412
+ : false,
413
+ };
414
+ this.formlyAllSteps = await this.buildFormlyFieldGroupAsync();
415
+ var hasDictionaryDependentSteps = this.formlyAllSteps.some((f) => f.props?.['dependentDictionary']?.isDictionaryDependent);
416
+ var formlyFilteredSteps = this.getFormlyFilteredSteps();
417
+ var filteredStepsIdentifiers = formlyFilteredSteps.map((f) => f.props?.['stepId']);
418
+ // Get visible steps for accurate step counting
419
+ const visibleSteps = this.actionStepHandler.filterVisibleSteps(this.flux);
420
+ const filteredVisibleSteps = this.actionStepHandler.filterVisibleSteps(this.flux, filteredStepsIdentifiers);
421
+ this.formlyConfig = [
422
+ {
423
+ type: 'stepper',
424
+ props: {
425
+ appDataId: this.fillData
426
+ ? this.fillData?.metadata?.appDataId
427
+ : this.appDataUuid,
428
+ design: this.design,
429
+ applicationId: this.appModel.applicationUuid,
430
+ flux: visibleSteps, // Pass only visible steps to stepper
431
+ filteredFlux: filteredVisibleSteps,
432
+ isDisplayMode: this.showDisplayMode,
433
+ fillData: this.fillData,
434
+ defaultLanguage: this.appModel.generalData.defaultLanguage,
435
+ display: this.display,
436
+ designConfig: {
437
+ buttonsVerticalPosition: this.appModel.design.buttonsVerticalPosition,
438
+ buttonsHorizontalPosition: this.appModel.design.buttonsHorizontalPosition,
439
+ },
440
+ stepsSettings: this.stepsSettings,
441
+ metaData: this.fillData?.metadata,
442
+ demoMode: this.isDemoMode,
443
+ isDebug: this.isDebug,
444
+ noButtonsInView: this.noButtonsInView,
445
+ blockPreviousStep: this.blockPreviousStep,
446
+ env: this.env,
447
+ hasDictionaryDependentSteps: hasDictionaryDependentSteps,
448
+ hasActionSteps: this.flux.some((step) => this.actionStepHandler.isActionStep(step)), // Indicate if there are action steps
449
+ completionEvent: () => this.onCompletion(),
450
+ onSelectedPageChanging: (index) => this.onSelectedPageChanging(index),
451
+ onSelectedPageChanged: (index) => this.onSelectedPageChanged(index),
452
+ },
453
+ fieldGroup: formlyFilteredSteps,
454
+ },
455
+ ];
456
+ }
457
+ async onSelectedPageChanging(stepTransition) {
458
+ let fromIndex;
459
+ let toIndex;
460
+ let callback = () => { };
461
+ if (typeof stepTransition === 'number') {
462
+ toIndex = stepTransition;
463
+ fromIndex = this.activeStep;
464
+ }
465
+ else {
466
+ fromIndex = stepTransition.from;
467
+ toIndex = stepTransition.to;
468
+ callback = stepTransition.callback || (() => { });
469
+ }
470
+ let actionsExecuted = false;
471
+ if (toIndex > fromIndex) {
472
+ console.log('➡️ Moving forward - executing action steps after current step');
473
+ actionsExecuted = await this.executeActionStepsAfterCurrentStep(fromIndex);
474
+ }
475
+ else if (toIndex < fromIndex) {
476
+ console.log('⬅️ Moving backward - no action execution needed');
477
+ }
478
+ else {
479
+ console.log('🔄 Staying on same step - no action execution needed');
480
+ }
481
+ this.activeStep = toIndex;
482
+ if (callback) {
483
+ callback();
484
+ }
485
+ return actionsExecuted;
486
+ }
487
+ async executeActionStepsAfterCurrentStep(currentStepIndex) {
488
+ if (this.actionStepHandler.isExecutingActions) {
489
+ return false;
490
+ }
491
+ let filteredSteps = this.flux.filter((s) => {
492
+ if (s.dependentDictionary &&
493
+ s.dependentDictionary.isDictionaryDependent) {
494
+ const selectedValue = this.model[s.dependentDictionary.dictionaryControlIdentifier]?.id;
495
+ if (selectedValue &&
496
+ s.dependentDictionary.dependentValueIds.includes(selectedValue)) {
497
+ return true;
498
+ }
499
+ return false;
500
+ }
501
+ return true;
502
+ });
503
+ const actionSteps = this.actionStepHandler.getActionStepsAtIndex(filteredSteps, currentStepIndex);
504
+ if (actionSteps.length === 0) {
505
+ return false;
506
+ }
507
+ try {
508
+ if (!this.appDataUuid) {
509
+ return false;
510
+ }
511
+ // Set the saving flag before starting actions
512
+ this.isSavingAfterActions = true;
513
+ this.isLoading = true;
514
+ const result = await this.actionStepHandler.executeActionSteps(actionSteps, this.appDataUuid, (step) => {
515
+ const loadingMessage = Utils.findTranslationInfo('loadingMessageTranslations', step.translations, this.currentLanguageIso);
516
+ this.loadingMessage = loadingMessage || null;
517
+ });
518
+ if (result.success) {
519
+ console.log('✅ Action steps executed successfully');
520
+ // Keep loading state true - it will be cleared after saveAppDataStep completes
521
+ return true;
522
+ }
523
+ else {
524
+ console.error('❌ Action steps execution failed:', result.error);
525
+ this.isSavingAfterActions = false;
526
+ this.isLoading = false;
527
+ return false;
528
+ }
529
+ }
530
+ catch (error) {
531
+ console.error('❌ Error executing action steps:', error);
532
+ this.isSavingAfterActions = false;
533
+ this.isLoading = false;
534
+ return false;
535
+ }
536
+ }
537
+ onSelectedPageChanged(index) {
538
+ if (this.formlyConfig[0].fieldGroup) {
539
+ var selectedPage = this.formlyConfig[0].fieldGroup[index];
540
+ this.setPresentationControlValuesRecursively(selectedPage);
541
+ }
542
+ }
543
+ setPresentationControlValuesRecursively(fc) {
544
+ fc?.fieldGroup?.forEach((fg) => {
545
+ if (fg.props && fg.props['isDisplayMode'] === true) {
546
+ var methodFieldId = fg.props['apiMethodFieldId'];
547
+ if (methodFieldId) {
548
+ const val = this.findInApiCallsResponses(methodFieldId);
549
+ fg.defaultValue = val;
550
+ }
551
+ else {
552
+ var associatedControlId = fg.props['collectionControlIdentifier'];
553
+ if (associatedControlId) {
554
+ const found = this.findControlInFillDataControls(associatedControlId);
555
+ if (found) {
556
+ if (found.fillValueId) {
557
+ const currentLanguageId = this.getCurrentLanguageId();
558
+ for (const [key, dict] of this.dictionaryMap.entries()) {
559
+ const value = dict.values?.find((v) => v.id == found.fillValueId);
560
+ if (value) {
561
+ const translation = value.valueTranslations.find((t) => t.languageId == currentLanguageId);
562
+ if (translation) {
563
+ fg.defaultValue = translation.value;
564
+ break;
565
+ }
566
+ }
567
+ }
568
+ }
569
+ else {
570
+ fg.defaultValue = found.fillValue;
571
+ }
572
+ }
573
+ else {
574
+ const val = this.findInApiCallsResponses(associatedControlId);
575
+ fg.defaultValue = val;
576
+ }
577
+ }
578
+ }
579
+ }
580
+ else {
581
+ this.setPresentationControlValuesRecursively(fg);
582
+ }
583
+ if (fg.props['cdr']) {
584
+ fg.props['cdr'].detectChanges();
585
+ }
586
+ });
587
+ }
588
+ findControlInFillDataControls(controlId) {
589
+ let controlData = undefined;
590
+ if (this.fillData) {
591
+ this.fillData.flux?.forEach((f) => {
592
+ if (!controlData) {
593
+ f.sections?.forEach((s) => {
594
+ if (!controlData) {
595
+ controlData = s.controls?.find((c) => c.controlId === controlId);
596
+ if (controlData) {
597
+ return controlData;
598
+ }
599
+ }
600
+ });
601
+ }
602
+ });
603
+ }
604
+ return controlData;
605
+ }
606
+ findInApiCallsResponses(fieldId) {
607
+ let foundValue = undefined;
608
+ if (this.fillData) {
609
+ this.fillData.APICalls?.forEach((api) => {
610
+ if (!foundValue) {
611
+ api.Methods?.forEach((m) => {
612
+ if (!foundValue) {
613
+ const found = m.Fields?.[fieldId];
614
+ if (found) {
615
+ foundValue = found;
616
+ }
617
+ }
618
+ });
619
+ }
620
+ });
621
+ }
622
+ return foundValue;
623
+ }
624
+ getFormlyFilteredSteps() {
625
+ let steps = this.formlyAllSteps.filter((s) => {
626
+ if (s.props && s.props['dependentDictionary']) {
627
+ const depDict = s.props['dependentDictionary'];
628
+ if (depDict && depDict.isDictionaryDependent) {
629
+ const selectedValue = this.model[depDict.dictionaryControlIdentifier]?.id;
630
+ if (selectedValue &&
631
+ depDict.dependentValueIds.includes(selectedValue)) {
632
+ return true;
633
+ }
634
+ return false;
635
+ }
636
+ }
637
+ return true;
638
+ });
639
+ return steps;
640
+ }
641
+ async buildFormlyFieldGroupAsync() {
642
+ this.stepDictionaryDependentIds = [];
643
+ if (this.showDisplayMode) {
644
+ const step = await this.buidDisplayStep();
645
+ return Promise.resolve([step]);
646
+ }
647
+ else {
648
+ // Filter out action steps from visible steps
649
+ const visibleSteps = this.actionStepHandler.filterVisibleSteps(this.flux);
650
+ return await Promise.all(visibleSteps.map((step) => {
651
+ return this.buildFormlyFieldConfigAsync(step);
652
+ }) ?? []);
653
+ }
654
+ }
655
+ async buildFormlyFieldConfigAsync(step) {
656
+ let stepFormlyConfig = {};
657
+ if (step.type !== FluxType.Custom && step.type !== FluxType.Final) {
658
+ stepFormlyConfig = await this.buildSystemFieldFormlyConfig(step);
659
+ }
660
+ else {
661
+ stepFormlyConfig = {
662
+ props: {
663
+ label: step.name,
664
+ description: step.name,
665
+ buttons: this.constructButtons(step.buttons),
666
+ dependentDictionary: step.dependentDictionary,
667
+ stepId: step.identifier,
668
+ },
669
+ fieldGroup: await this.buildSectionsFieldGroupAsync(step, step.sections),
670
+ };
671
+ if (step.translations) {
672
+ stepFormlyConfig.props['label'] = Utils.findTranslationInfo('name', step.translations, this.currentLanguageIso);
673
+ stepFormlyConfig.props['description'] = Utils.findTranslationInfo('description', step.translations, this.currentLanguageIso);
674
+ }
675
+ }
676
+ if (stepFormlyConfig && stepFormlyConfig.props) {
677
+ this.setStepBaseProps(step, stepFormlyConfig);
678
+ }
679
+ if (step.dependentDictionary?.isDictionaryDependent) {
680
+ this.stepDictionaryDependentIds.push(step.dependentDictionary.dictionaryControlIdentifier);
681
+ }
682
+ return stepFormlyConfig;
683
+ }
684
+ triggerComponentUpdate(controlId, value) {
685
+ this.setFormlyFieldValue(this.formlyAllSteps, controlId, value);
686
+ }
687
+ setFormlyFieldValue(fields, key, value) {
688
+ if (!fields)
689
+ return false;
690
+ for (const field of fields) {
691
+ if (field.key === key) {
692
+ if (field.formControl) {
693
+ field.formControl.setValue(value, { emitEvent: true });
694
+ return true;
695
+ }
696
+ }
697
+ if (field.fieldGroup && Array.isArray(field.fieldGroup)) {
698
+ const found = this.setFormlyFieldValue(field.fieldGroup, key, value);
699
+ if (found)
700
+ return true;
701
+ }
702
+ }
703
+ return false;
704
+ }
705
+ async buildSystemFieldFormlyConfig(step) {
706
+ const formlyConfig = {
707
+ props: {
708
+ label: step.name,
709
+ buttons: this.constructButtons(step.buttons),
710
+ fluxType: step.type,
711
+ },
712
+ fieldGroup: [],
713
+ };
714
+ this.setStepBaseProps(step, formlyConfig);
715
+ var fieldConfig = this.createFormlySystemFieldConfig(step);
716
+ if (fieldConfig) {
717
+ if (step.translations) {
718
+ let labels = {};
719
+ step.translations.forEach((tr) => {
720
+ labels[tr.name] = Utils.findTranslation(tr.values, this.currentLanguageIso);
721
+ });
722
+ fieldConfig.props['labels'] = labels;
723
+ fieldConfig.props['name'] = Utils.findTranslationInfo('name', step.translations, this.currentLanguageIso);
724
+ fieldConfig.props['description'] = Utils.findTranslationInfo('description', step.translations, this.currentLanguageIso);
725
+ formlyConfig.props['label'] = Utils.findTranslationInfo('name', step.translations, this.currentLanguageIso);
726
+ formlyConfig.props['description'] = Utils.findTranslationInfo('description', step.translations, this.currentLanguageIso);
727
+ }
728
+ fieldConfig.props['stepsSettings'] = this.stepsSettings;
729
+ formlyConfig.fieldGroup.push(fieldConfig);
730
+ }
731
+ return formlyConfig;
732
+ }
733
+ setStepBaseProps(step, formlyConfig) {
734
+ if (formlyConfig.props) {
735
+ formlyConfig.props['name'] = step.name;
736
+ formlyConfig.props['fluxType'] = step.type;
737
+ formlyConfig.props['stepId'] = step.identifier;
738
+ formlyConfig.props['isVisible'] = step.isVisible;
739
+ formlyConfig.props['dependentDictionary'] = step.dependentDictionary;
740
+ }
741
+ }
742
+ CreateSignFieldConfig(step) {
743
+ return {
744
+ type: 'formly-sign-component',
745
+ props: {
746
+ appDataId: this.appDataUuid,
747
+ stepData: step,
748
+ design: this.design,
749
+ env: this.env,
750
+ flux: this.flux,
751
+ parentForm: this.form,
752
+ getModel: () => this.model,
753
+ event: async (event) => {
754
+ if (event === 'success') {
755
+ await this.stepperGoNextAsync();
756
+ }
757
+ },
758
+ },
759
+ };
760
+ }
761
+ CreateDownloadDocsFieldConfig(controlData) {
762
+ return {
763
+ type: 'formly-download-documents-component',
764
+ props: {
765
+ appId: this.appModel.applicationUuid,
766
+ appDataId: this.appDataUuid,
767
+ controlData: controlData,
768
+ env: this.env,
769
+ documentsData: this.appModel.documents,
770
+ langIso: this.currentLanguageIso,
771
+ },
772
+ };
773
+ }
774
+ CreateViewDocsFieldConfig(controlData) {
775
+ return {
776
+ type: 'formly-view-documents-component',
777
+ props: {
778
+ appId: this.appModel.applicationUuid,
779
+ appDataId: this.appDataUuid,
780
+ controlData: controlData,
781
+ env: this.env,
782
+ documentsData: this.appModel.documents,
783
+ langIso: this.currentLanguageIso,
784
+ },
785
+ };
786
+ }
787
+ CreateUploadDocsFieldConfig(controlData) {
788
+ return {
789
+ type: 'formly-upload-documents-component',
790
+ props: {
791
+ appId: this.appModel.applicationUuid,
792
+ appDataId: this.appDataUuid,
793
+ controlData: controlData,
794
+ env: this.env,
795
+ documentsData: this.appModel.documents,
796
+ langIso: this.currentLanguageIso,
797
+ },
798
+ };
799
+ }
800
+ CreateGenerateDocsFieldConfig(step) {
801
+ return {
802
+ type: 'formly-generate-documents-component',
803
+ props: {
804
+ appId: this.appModel.applicationUuid,
805
+ appDataId: this.appDataUuid,
806
+ stepData: step,
807
+ documentsData: this.appModel.documents,
808
+ langIso: this.currentLanguageIso,
809
+ event: async (event) => {
810
+ if (event === 'success') {
811
+ await this.stepperGoNextAsync();
812
+ }
813
+ },
814
+ },
815
+ };
816
+ }
817
+ async stepperGoNextAsync() {
818
+ const stepperComponent = this.formlyConfig[0].props['component'];
819
+ if (stepperComponent && stepperComponent.navigateNextAsync) {
820
+ await stepperComponent.navigateNextAsync();
821
+ }
822
+ }
823
+ CreateEnrollCardFieldConfig(step) {
824
+ let labels = {};
825
+ Object.keys(step.config).forEach((key) => {
826
+ if (key.endsWith('Label')) {
827
+ labels[key] =
828
+ step?.config[key]?.find((i) => i.languageIso === this.currentLanguageIso)?.value ?? '';
829
+ }
830
+ });
831
+ return {
832
+ type: 'formly-enrol-card-component',
833
+ props: {
834
+ appId: this.appModel.applicationUuid,
835
+ appDataId: this.appDataUuid,
836
+ dataUrlId: this.dataUrlId,
837
+ stepData: step,
838
+ labels: labels,
839
+ langIso: this.currentLanguageIso,
840
+ },
841
+ };
842
+ }
843
+ CreateIdScanFieldConfig(step) {
844
+ let errorMessages = {};
845
+ if (step.errorsTranslations) {
846
+ step.errorsTranslations.forEach((error) => {
847
+ errorMessages[error.code] = Utils.findTranslation(error.translations, this.currentLanguageIso);
848
+ });
849
+ }
850
+ return {
851
+ type: 'formly-scan-id',
852
+ props: {
853
+ config: step.config,
854
+ stepType: step.type,
855
+ stepId: step.identifier,
856
+ appDataId: this.appDataUuid || Utils.generateUUID(),
857
+ appId: this.appModel.applicationUuid,
858
+ errorMessages: errorMessages,
859
+ event: (event) => this.onIdScanCompleted(event, step),
860
+ },
861
+ };
862
+ }
863
+ CreateKycFieldConfig(step) {
864
+ const loadingMsgTranslations = step.translations?.find((t) => t.name === 'loadingMessageTranslations');
865
+ const translatedLoadingMessage = loadingMsgTranslations?.values?.find((v) => v.languageIso === this.currentLanguageIso)?.value || '';
866
+ return {
867
+ type: 'formly-identification-component',
868
+ props: {
869
+ token: this.kycToken,
870
+ api_url: this.kycApiUrl,
871
+ appDataId: this.appDataUuid,
872
+ env: 'QA', // Consider making this dynamic if needed
873
+ redirect_id: this.kycRedirectId,
874
+ phone_number: '',
875
+ lang_iso: this.kycLangIso,
876
+ show_citizenship_selector: this.kycShowCitizenship,
877
+ scroll_mode: this.kycScrollMode,
878
+ maxRetries: step.config?.maxKycRetries ?? 3,
879
+ loadingMessage: translatedLoadingMessage,
880
+ ectCompleted: async () => {
881
+ this.loadingMessage = translatedLoadingMessage;
882
+ await this.originFormSignalrHandlerService.initiateKycProcessing(this.appDataUuid);
883
+ },
884
+ },
885
+ };
886
+ }
887
+ CreatePhoneEmailFieldConfig(step) {
888
+ return {
889
+ type: 'formly-validate-contact-info',
890
+ props: {
891
+ stepData: step,
892
+ appDataId: this.appDataUuid,
893
+ design: this.design,
894
+ event: async (event) => {
895
+ if (event === 'success') {
896
+ await this.stepperGoNextAsync();
897
+ }
898
+ },
899
+ },
900
+ };
901
+ }
902
+ CreateViewOfferFieldConfig(step) {
903
+ return {
904
+ type: 'formly-view-offers',
905
+ props: {
906
+ appDataId: this.appDataUuid,
907
+ stepData: step,
908
+ env: this.env,
909
+ appModel: this.appModel,
910
+ langIso: this.currentLanguageIso,
911
+ event: (event) => this.onOfferSelected(event, step),
912
+ },
913
+ };
914
+ }
915
+ CreatePauseFieldConfig(step) {
916
+ return {
917
+ type: 'formly-field-pause',
918
+ props: {
919
+ identifier: step.identifier,
920
+ config: step.config,
921
+ appDataId: this.appDataUuid,
922
+ stepData: step,
923
+ env: this.env,
924
+ appModel: this.appModel,
925
+ langIso: this.currentLanguageIso,
926
+ },
927
+ };
928
+ }
929
+ CreateOpenBankingFieldConfig(step) {
930
+ // Pass the full step data which includes all translations
931
+ // The component will extract what it needs based on current language
932
+ return {
933
+ type: 'formly-open-banking',
934
+ props: {
935
+ identifier: step.identifier,
936
+ config: step.config,
937
+ appDataId: this.appDataUuid,
938
+ stepData: step, // This contains the full translations array
939
+ env: this.env,
940
+ appModel: this.appModel,
941
+ langIso: this.currentLanguageIso,
942
+ labels: {
943
+ initialMessage: Utils.findTranslation(step.config?.initialMessageTranslations || [], this.currentLanguageIso),
944
+ waitingMessage: Utils.findTranslation(step.config?.waitingMessageTranslations || [], this.currentLanguageIso),
945
+ consentErrorMessage: Utils.findTranslation(step.config?.consentErrorMessageTranslations || [], this.currentLanguageIso),
946
+ completionMessage: Utils.findTranslation(step.config?.completionMessageTranslations || [], this.currentLanguageIso),
947
+ retryButtonLabel: Utils.findTranslation(step.config?.retryButtonLabelTranslations || [], this.currentLanguageIso),
948
+ },
949
+ event: (event) => this.onOpenBankingEvent(event, step),
950
+ },
951
+ };
952
+ }
953
+ CreateStatusFieldConfig(step) {
954
+ return {
955
+ type: 'formly-status',
956
+ props: {
957
+ config: step.config,
958
+ stepData: step,
959
+ appDataId: this.appDataUuid,
960
+ appId: this.appModel.applicationUuid,
961
+ },
962
+ };
963
+ }
964
+ createFormlySystemFieldConfig(step) {
965
+ switch (step.type) {
966
+ case FluxType.Kyc:
967
+ {
968
+ return this.CreateKycFieldConfig(step);
969
+ }
970
+ break;
971
+ case FluxType.Email:
972
+ case FluxType.Phone: {
973
+ return this.CreatePhoneEmailFieldConfig(step);
974
+ }
975
+ case FluxType.Action: {
976
+ // Action steps are now handled automatically by ActionStepHandler
977
+ // They should not appear as visible formly components
978
+ return undefined;
979
+ }
980
+ case FluxType.IdScan: {
981
+ return this.CreateIdScanFieldConfig(step);
982
+ }
983
+ case FluxType.GenerateDocument: {
984
+ return this.CreateGenerateDocsFieldConfig(step);
985
+ }
986
+ case FluxType.Sign: {
987
+ return this.CreateSignFieldConfig(step);
988
+ }
989
+ case FluxType.ViewOffer: {
990
+ return this.CreateViewOfferFieldConfig(step);
991
+ }
992
+ case FluxType.Status: {
993
+ return this.CreateStatusFieldConfig(step);
994
+ }
995
+ case FluxType.EUPLATESC: {
996
+ return this.CreateEnrollCardFieldConfig(step);
997
+ }
998
+ case FluxType.NETOPIA: {
999
+ return this.CreateEnrollCardFieldConfig(step);
1000
+ }
1001
+ case FluxType.Pause: {
1002
+ return this.CreatePauseFieldConfig(step);
1003
+ }
1004
+ case FluxType.OpenBanking: {
1005
+ return this.CreateOpenBankingFieldConfig(step);
1006
+ }
1007
+ }
1008
+ return undefined;
1009
+ }
1010
+ onOfferSelected(offerId, step) {
1011
+ this.formlyUpdateAndGoNext.emit({ selectedOfferId: offerId });
1012
+ }
1013
+ onSignEvent(event, step) {
1014
+ console.log('Sign event received:', event);
1015
+ this.updateStepButtonState(step);
1016
+ }
1017
+ onOpenBankingEvent(event, step) {
1018
+ console.log('OpenBanking event received:', event);
1019
+ if (event === 'success') {
1020
+ // Open Banking flow completed successfully
1021
+ this.updateStepButtonState(step);
1022
+ // Auto-proceed to next step
1023
+ this.formlyUpdateAndGoNext.emit({});
1024
+ }
1025
+ }
1026
+ onIdScanCompleted(event, step) {
1027
+ console.log('Sign event received:', event);
1028
+ const fillData = JSON.parse(event.fillData);
1029
+ const stepFillData = fillData.flux.find((s) => s.stepId == step.identifier);
1030
+ stepFillData.sections.forEach((s) => {
1031
+ s.controls.forEach((c) => {
1032
+ if (c.controlId) {
1033
+ const value = {
1034
+ [c.controlId]: {
1035
+ value: c.fillValue,
1036
+ },
1037
+ };
1038
+ if (this.form.contains(c.controlId)) {
1039
+ this.form.patchValue(value);
1040
+ }
1041
+ else {
1042
+ this.form.addControl(c.controlId, new FormControl(c.fillValue));
1043
+ }
1044
+ }
1045
+ });
1046
+ });
1047
+ this.updateStepButtonState(step);
1048
+ }
1049
+ updateStepButtonState(step) {
1050
+ let formlyStepField = this.formlyConfig[0].fieldGroup?.find((field) => field.fieldGroup?.find((f) => f.props?.['stepId'] === step.identifier));
1051
+ if (!formlyStepField) {
1052
+ formlyStepField = this.formlyConfig[0].fieldGroup?.find((field) => field.props?.['stepId'] === step.identifier);
1053
+ }
1054
+ if (formlyStepField) {
1055
+ formlyStepField.props = {
1056
+ ...formlyStepField.props,
1057
+ buttonsDisabled: false,
1058
+ };
1059
+ this.updateFormlyConfig();
1060
+ this.formlyConfigUpdated.emit();
1061
+ }
1062
+ }
1063
+ addRenderedCss() {
1064
+ const styleString = FormCssHelper.convertToStyleString(this.design, this.showDisplayMode);
1065
+ const styleElement = this.renderer.createElement('style');
1066
+ styleElement.id = 'rendered-css';
1067
+ const rendEl = document.getElementById('rendered-css');
1068
+ if (rendEl) {
1069
+ this.renderer.removeChild(document.body, rendEl);
1070
+ }
1071
+ this.renderer.appendChild(styleElement, this.renderer.createText(Utils.removeNewLines(styleString)));
1072
+ this.renderer.appendChild(document.body, styleElement);
1073
+ }
1074
+ async buildSectionsFieldGroupAsync(step, sections) {
1075
+ const stepSections = [];
1076
+ for (let index = 0; sections && index < sections.length; index++) {
1077
+ const section = sections[index];
1078
+ let separatorFormlyConfig = {};
1079
+ if (section.showSectionTitle) {
1080
+ separatorFormlyConfig = {
1081
+ type: 'separator',
1082
+ props: {
1083
+ title: section.translations?.find((t) => t.languageIso === this.currentLanguageIso)?.value ?? '',
1084
+ design: this.design,
1085
+ },
1086
+ };
1087
+ }
1088
+ if (section.showSectionSeparator) {
1089
+ separatorFormlyConfig = {
1090
+ ...separatorFormlyConfig,
1091
+ type: 'separator',
1092
+ props: {
1093
+ ...separatorFormlyConfig.props,
1094
+ showSeparator: section.showSectionSeparator,
1095
+ },
1096
+ };
1097
+ }
1098
+ if (section.dependentDictionary) {
1099
+ this.attachToDependentDictionaryIfNecessary(section.dependentDictionary, separatorFormlyConfig);
1100
+ }
1101
+ stepSections.push(separatorFormlyConfig);
1102
+ const sectionFormlyConfig = {
1103
+ type: 'custom-section',
1104
+ props: {
1105
+ label: section.title,
1106
+ description: section.translations?.find((t) => t.languageIso === this.currentLanguageIso)?.value ?? '',
1107
+ design: this.design,
1108
+ },
1109
+ fieldGroup: await this.buildControlsFieldGroupAsync(step, section.controls || [], section.presentationControls || []),
1110
+ fieldGroupClassName: 'display-flex',
1111
+ };
1112
+ if (section.dependentDictionary) {
1113
+ this.attachToDependentDictionaryIfNecessary(section.dependentDictionary, sectionFormlyConfig);
1114
+ }
1115
+ stepSections.push(sectionFormlyConfig);
1116
+ }
1117
+ return stepSections;
1118
+ }
1119
+ async buidDisplayStep() {
1120
+ let stepFormlyConfig = {};
1121
+ if (this.display?.sections?.length > 0) {
1122
+ stepFormlyConfig = {
1123
+ props: {
1124
+ // label: step.name,
1125
+ // buttons: this.constructButtons(step.buttons),
1126
+ // dependentDictionary: step.dependentDictionary,
1127
+ },
1128
+ fieldGroup: await this.buildSectionsFieldGroupAsync(undefined, this.display.sections),
1129
+ };
1130
+ }
1131
+ return stepFormlyConfig;
1132
+ }
1133
+ addNewRowToFormFieldsIfNecessary(fieldGroup, newRow) {
1134
+ if (newRow.fieldGroup && newRow.fieldGroup.length > 0) {
1135
+ this.calculateFormFieldsWidth(newRow.fieldGroup);
1136
+ fieldGroup.push(newRow);
1137
+ }
1138
+ }
1139
+ calculateFormFieldsWidth(formFields) {
1140
+ const colWidthPerItem = 12 / formFields.length;
1141
+ formFields.forEach((f) => {
1142
+ f.className = 'col-' + colWidthPerItem;
1143
+ });
1144
+ }
1145
+ getPercentageClassName(percentageDimension) {
1146
+ const totalColumns = 12; // 12-column grid
1147
+ const span = Math.round((percentageDimension / 100) * totalColumns);
1148
+ const className = `percentage-width-${span}`;
1149
+ if (!document.getElementById(className)) {
1150
+ const style = document.createElement('style');
1151
+ style.type = 'text/css';
1152
+ style.id = className;
1153
+ style.innerHTML = `
1154
+ .${className} {
1155
+ grid-column: span ${span};
1156
+ }
1157
+ `;
1158
+ document.head.appendChild(style);
1159
+ }
1160
+ return className;
1161
+ }
1162
+ createFillerControl(span) {
1163
+ return {
1164
+ type: 'row-filler',
1165
+ className: `percentage-width-${span}`,
1166
+ props: {
1167
+ label: '',
1168
+ disabled: true,
1169
+ hide: true,
1170
+ },
1171
+ };
1172
+ }
1173
+ async buildControlsFieldGroupAsync(step, controls, presentationControls) {
1174
+ const result = [];
1175
+ let rowItems = [];
1176
+ controls = controls.filter((c) => !c.isOnlyForConfig);
1177
+ // Filter out controls that are incomplete
1178
+ controls = controls.filter((c) => {
1179
+ // Skip controls that are missing essential data
1180
+ if (c.type === StepControlType.Dictionary &&
1181
+ !c.specificControlData?.dictionaryUUID)
1182
+ return false;
1183
+ return true;
1184
+ });
1185
+ const processRow = async (items) => {
1186
+ const fields = [];
1187
+ const total = 12;
1188
+ const built = [];
1189
+ const auto = [];
1190
+ let used = 0;
1191
+ for (const i of items) {
1192
+ if ('collectionControlIdentifier' in i === true) {
1193
+ built.push(await this.buildPresentationFormFieldAsync(step, i));
1194
+ }
1195
+ else if ('apiMethodId' in i === true) {
1196
+ built.push(await this.buildApiMethodFormFieldAsync(step, i));
1197
+ }
1198
+ else {
1199
+ built.push(await this.buildFormFieldAsync(step, i));
1200
+ }
1201
+ }
1202
+ for (let i = 0; i < items.length; i++) {
1203
+ const c = items[i];
1204
+ const f = built[i];
1205
+ if (c.dimensionType === DimensionType.Percentage) {
1206
+ if (c.autoDimension) {
1207
+ auto.push({ c, f });
1208
+ }
1209
+ else {
1210
+ const s = Math.round((c.dimension / 100) * total);
1211
+ used += s;
1212
+ const percentageClass = this.getPercentageClassName(c.dimension);
1213
+ f.className = `${f.className} ${percentageClass}`;
1214
+ }
1215
+ }
1216
+ else if (c.dimensionType === DimensionType.Pixels) {
1217
+ const s = Math.round((c.dimension / window.innerWidth) * total);
1218
+ used += s;
1219
+ const percentageClass = this.getPercentageClassName((s / total) * 100);
1220
+ f.className = `${f.className} ${percentageClass}`;
1221
+ }
1222
+ else if (c.autoDimension) {
1223
+ auto.push({ c, f });
1224
+ }
1225
+ else {
1226
+ used += 1;
1227
+ const percentageClass = this.getPercentageClassName((1 / total) * 100);
1228
+ f.className = `${f.className} ${percentageClass}`;
1229
+ }
1230
+ }
1231
+ const rem = total - used;
1232
+ if (auto.length > 0) {
1233
+ const share = Math.max(Math.floor(rem / auto.length), 1);
1234
+ for (const a of auto) {
1235
+ const percentageClass = this.getPercentageClassName((share / total) * 100);
1236
+ a.f.className = `${a.f.className} ${percentageClass}`;
1237
+ }
1238
+ }
1239
+ fields.push(...built);
1240
+ return fields;
1241
+ };
1242
+ for (const c of [...controls, ...presentationControls]) {
1243
+ if (('type' in c && c.type === StepControlType.NewRow) ||
1244
+ c.type == PresentationControlType.NewRow) {
1245
+ if (rowItems.length > 0) {
1246
+ result.push(...(await processRow(rowItems)));
1247
+ rowItems = [];
1248
+ }
1249
+ }
1250
+ else {
1251
+ rowItems.push(c);
1252
+ }
1253
+ }
1254
+ if (rowItems.length > 0) {
1255
+ result.push(...(await processRow(rowItems)));
1256
+ }
1257
+ return result;
1258
+ }
1259
+ getPixelClassName(pixelDimension) {
1260
+ const className = `pixel-width-${pixelDimension}`;
1261
+ if (!document.getElementById(className)) {
1262
+ const style = document.createElement('style');
1263
+ style.type = 'text/css';
1264
+ style.id = className;
1265
+ style.innerHTML = `
1266
+ .${className} {
1267
+ width: ${pixelDimension}px;
1268
+ }
1269
+ `;
1270
+ document.head.appendChild(style);
1271
+ }
1272
+ return className;
1273
+ }
1274
+ async buildFormFieldAsync(step, control) {
1275
+ let initialType = 'input'; // Default type
1276
+ let componentStyleKey = `.component-text-field`; // Default style for text input
1277
+ const baseStyle = this.design[`.font-${initialType}`] || {};
1278
+ const controlStyleString = this.styleObjectToStringExceptBackground(baseStyle);
1279
+ let pattern = '';
1280
+ if (control.specificControlData?.allowedCharacters) {
1281
+ try {
1282
+ pattern = new RegExp(control.specificControlData.allowedCharacters)
1283
+ .source;
1284
+ }
1285
+ catch (e) {
1286
+ console.error('incorrect regex pattern', e);
1287
+ }
1288
+ }
1289
+ const componentsToExcludeFromStyle = [
1290
+ '.component-text-field',
1291
+ '.component-checkbox',
1292
+ '.component-radio',
1293
+ '.component-date',
1294
+ '.component-data',
1295
+ ];
1296
+ let formlyConfig = this.getDefaultFormlyFieldConfig(control, initialType, pattern, componentStyleKey, componentsToExcludeFromStyle);
1297
+ //control.specificControlData.type === 3 is email
1298
+ if (control.specificControlData?.type === 3) {
1299
+ this.addValidators(formlyConfig, control);
1300
+ }
1301
+ if (control.specificControlData?.isApiValidation) {
1302
+ this.addApiValidators(formlyConfig, control);
1303
+ }
1304
+ switch (control.type) {
1305
+ case StepControlType.ManualInput: // Text
1306
+ var subType = control.specificControlData
1307
+ ?.type;
1308
+ switch (subType) {
1309
+ case ManualInputControlType.Numeric:
1310
+ formlyConfig.type = 'number';
1311
+ break;
1312
+ case ManualInputControlType.Email:
1313
+ case ManualInputControlType.Text:
1314
+ case ManualInputControlType.Phone:
1315
+ formlyConfig.type = 'input';
1316
+ break;
1317
+ case ManualInputControlType.TextArea:
1318
+ formlyConfig.type = 'input';
1319
+ formlyConfig.props['autosize'] = false;
1320
+ componentStyleKey = '.component-text-field';
1321
+ break;
1322
+ case ManualInputControlType.DateTime:
1323
+ formlyConfig.type = 'datepicker';
1324
+ formlyConfig.props = {
1325
+ readonly: true,
1326
+ };
1327
+ componentStyleKey = '.component-date';
1328
+ break;
1329
+ default:
1330
+ formlyConfig.type = 'input';
1331
+ componentStyleKey = '.component-text-field';
1332
+ break;
1333
+ }
1334
+ break;
1335
+ case StepControlType.Paragraph: // Paragraph
1336
+ formlyConfig.type = 'formly-paragraph';
1337
+ componentStyleKey = '.component-text-field';
1338
+ const translatedDescription = control.specificControlData?.descriptionTranslations?.find((d) => d.languageIso === this.currentLanguageIso)?.value || '';
1339
+ formlyConfig.defaultValue = translatedDescription;
1340
+ break;
1341
+ case StepControlType.CheckBox: // Checkbox
1342
+ formlyConfig.type = 'formly-checkbox';
1343
+ componentStyleKey = '.component-checkbox';
1344
+ var checked = control.specificControlData?.checked ?? false;
1345
+ formlyConfig.props['checked'] = checked;
1346
+ break;
1347
+ case StepControlType.Dictionary: // Dictionary (dropdown)
1348
+ componentStyleKey =
1349
+ control.specificControlData.showAsRadioButtonsList === true
1350
+ ? '.component-radio'
1351
+ : '.component-data';
1352
+ await this.constructDictionary(control, formlyConfig);
1353
+ break;
1354
+ case StepControlType.Buttons:
1355
+ formlyConfig.type = '';
1356
+ break;
1357
+ case StepControlType.FluxInfo:
1358
+ formlyConfig.type = '';
1359
+ break;
1360
+ case StepControlType.DownloadDocuments:
1361
+ formlyConfig = this.CreateDownloadDocsFieldConfig(control);
1362
+ break;
1363
+ case StepControlType.ViewDocuments:
1364
+ formlyConfig = this.CreateViewDocsFieldConfig(control);
1365
+ break;
1366
+ case StepControlType.UploadDocuments:
1367
+ formlyConfig = this.CreateUploadDocsFieldConfig(control);
1368
+ break;
1369
+ case StepControlType.NewRow: // New Row
1370
+ formlyConfig.type = '';
1371
+ break;
1372
+ default:
1373
+ formlyConfig.type = 'input';
1374
+ componentStyleKey = '.component-text-field';
1375
+ }
1376
+ formlyConfig.className = componentStyleKey.substring(1);
1377
+ if (!componentsToExcludeFromStyle.find((c) => c === componentStyleKey)) {
1378
+ if (this.design[componentStyleKey]) {
1379
+ formlyConfig.props.attributes['style'] +=
1380
+ ';' +
1381
+ this.styleObjectToStringExceptBackground(this.design[componentStyleKey]);
1382
+ }
1383
+ // Apply label styles
1384
+ const labelStyleKey = `${componentStyleKey}-label`;
1385
+ if (this.design[labelStyleKey]) {
1386
+ formlyConfig.props.attributes['style'] +=
1387
+ ';' +
1388
+ this.styleObjectToStringExceptBackground(this.design[componentStyleKey]);
1389
+ }
1390
+ }
1391
+ if (control.dependentDictionary) {
1392
+ this.attachToDependentDictionaryIfNecessary(control.dependentDictionary, formlyConfig);
1393
+ }
1394
+ let translatedTitle = control.translations?.find((d) => d.languageIso === this.currentLanguageIso)?.value;
1395
+ if (!translatedTitle) {
1396
+ translatedTitle = control.title;
1397
+ }
1398
+ formlyConfig.props['label'] = translatedTitle;
1399
+ this.formlyCollectingFields.push(formlyConfig);
1400
+ return formlyConfig;
1401
+ }
1402
+ addValidators(formlyConfig, control) {
1403
+ var emailErrorLabel = this.flux?.find((f) => f?.config?.componentCollected === control?.identifier)?.config?.emailErrorLabel;
1404
+ var emailErrorLabelValue = '';
1405
+ if (emailErrorLabel != null && Array.isArray(emailErrorLabel)) {
1406
+ emailErrorLabelValue =
1407
+ emailErrorLabel.find((l) => l.languageIso === this.currentLanguageIso)?.value ?? '';
1408
+ }
1409
+ formlyConfig.validators = {
1410
+ emailValid: {
1411
+ expression: (cont) => {
1412
+ const value = cont.value;
1413
+ const emailPattern = new RegExp('^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$');
1414
+ if (value && !emailPattern.test(value)) {
1415
+ cont.setErrors({ invalidEmail: true });
1416
+ return false;
1417
+ }
1418
+ return true;
1419
+ },
1420
+ message: emailErrorLabelValue,
1421
+ },
1422
+ };
1423
+ }
1424
+ addApiValidators(formlyConfig, control) {
1425
+ formlyConfig.asyncValidators = {
1426
+ validateThroughApi: {
1427
+ expression: (cont) => {
1428
+ return (cont.valueChanges.pipe(debounceTime(500), switchMap(() => {
1429
+ const apiValidationMethod = control.specificControlData.apiValidationMethod;
1430
+ const bodyValue = this.appModel.partners
1431
+ .flatMap((p) => p.partnerSettings.partnerMethodsApi)
1432
+ .find((p) => p.methodId === apiValidationMethod)
1433
+ ?.bodyConfiguration.bodyMapFields;
1434
+ const fieldMap = bodyValue?.reduce((acc, f) => {
1435
+ if (f.fluxFieldId === control.identifier) {
1436
+ acc[f.partnerField] = cont.value || '';
1437
+ }
1438
+ else {
1439
+ acc[f.partnerField] = '';
1440
+ }
1441
+ return acc;
1442
+ }, {}) || {};
1443
+ const dataRequest = {
1444
+ appId: this.appModel.applicationId,
1445
+ apiId: apiValidationMethod,
1446
+ data: JSON.stringify(fieldMap),
1447
+ };
1448
+ return this.validateMethodApi(dataRequest).pipe(catchError(() => of(false)));
1449
+ })) || 'ssssssssssssssss');
1450
+ },
1451
+ message: 'Validation failed.',
1452
+ },
1453
+ };
1454
+ }
1455
+ getDefaultFormlyFieldConfig(control, type, pattern, componentStyleKey, componentsToExcludeFromStyle) {
1456
+ const currentLanguageId = Utils.findLanguageIdByIso(this.availableLanguages, this.currentLanguageIso);
1457
+ let formlyConfig = {
1458
+ key: control.identifier || control.title,
1459
+ type: type,
1460
+ props: {
1461
+ currentLanguageIso: this.currentLanguageIso,
1462
+ currentLanguageId: currentLanguageId,
1463
+ label: control.translations?.find((t) => t.languageIso === this.currentLanguageIso)?.value || '',
1464
+ title: control.translations?.find((t) => t.languageIso === this.currentLanguageIso)?.value || '',
1465
+ design: this.design,
1466
+ required: control.isMandatory,
1467
+ attributes: {
1468
+ style: componentsToExcludeFromStyle.find((c) => c === componentStyleKey)
1469
+ ? ''
1470
+ : componentStyleKey,
1471
+ },
1472
+ autosize: true,
1473
+ options: [{}],
1474
+ fieldGroup: [],
1475
+ autoDimension: control.autoDimension,
1476
+ },
1477
+ expressions: {},
1478
+ hooks: {},
1479
+ validators: {},
1480
+ };
1481
+ formlyConfig.validation = {};
1482
+ if (control.specificControlData?.isMandatory && formlyConfig.props) {
1483
+ var requiredMessage = Utils.findErrorTranslationValueOrDefault(control.errorsTranslations, this.currentLanguageIso, 'isMandatoryValidation');
1484
+ formlyConfig.props.required = control.specificControlData?.isMandatory;
1485
+ formlyConfig.validation.messages = {
1486
+ ...formlyConfig.validation?.messages,
1487
+ required: requiredMessage,
1488
+ };
1489
+ }
1490
+ if (control.type === StepControlType.Dictionary &&
1491
+ control.specificControlData?.isMandatory &&
1492
+ control.errorsTranslations &&
1493
+ formlyConfig.props) {
1494
+ var requiredMessage = Utils.findErrorTranslationValueOrDefault(control.errorsTranslations, this.currentLanguageIso, 'isMandatory');
1495
+ formlyConfig.props.required = control.specificControlData?.isMandatory;
1496
+ formlyConfig.validation.messages = {
1497
+ ...formlyConfig.validation?.messages,
1498
+ required: requiredMessage,
1499
+ };
1500
+ }
1501
+ let simpleValidationMessage = '';
1502
+ if (control.specificControlData?.isSimpleValidation && formlyConfig.props) {
1503
+ if (control.specificControlData?.isSimpleValidation &&
1504
+ formlyConfig.props) {
1505
+ simpleValidationMessage = Utils.findErrorTranslationValueOrDefault(control.errorsTranslations, this.currentLanguageIso, 'simpleValidation');
1506
+ if (control.specificControlData?.minValue?.toString()) {
1507
+ formlyConfig.props.min = control.specificControlData.minValue;
1508
+ formlyConfig.validation.messages = {
1509
+ ...formlyConfig.validation?.messages,
1510
+ min: simpleValidationMessage,
1511
+ };
1512
+ }
1513
+ if (control.specificControlData?.maxValue?.toString()) {
1514
+ formlyConfig.props.max = control.specificControlData.maxValue;
1515
+ formlyConfig.validation.messages = {
1516
+ ...formlyConfig.validation?.messages,
1517
+ max: simpleValidationMessage,
1518
+ };
1519
+ }
1520
+ }
1521
+ // Apply pattern validation if allowedCharacters is defined
1522
+ if (control.specificControlData?.allowedCharacters) {
1523
+ simpleValidationMessage = simpleValidationMessage =
1524
+ Utils.findErrorTranslationValueOrDefault(control.errorsTranslations, this.currentLanguageIso, 'simpleValidation');
1525
+ formlyConfig.validators = {
1526
+ ...formlyConfig.validators,
1527
+ customPattern: {
1528
+ expression: (c) => {
1529
+ if (!c.value)
1530
+ return true;
1531
+ try {
1532
+ const regex = new RegExp(pattern);
1533
+ return regex.test(c.value);
1534
+ }
1535
+ catch {
1536
+ return false;
1537
+ }
1538
+ },
1539
+ message: simpleValidationMessage ||
1540
+ 'Value does not match the required pattern',
1541
+ },
1542
+ };
1543
+ formlyConfig.validation.messages = {
1544
+ ...formlyConfig.validation?.messages,
1545
+ pattern: simpleValidationMessage,
1546
+ };
1547
+ }
1548
+ // Apply maxLength validation if maxCharacters is defined
1549
+ if (control.specificControlData?.maxCharacters) {
1550
+ formlyConfig.props.maxLength =
1551
+ control.specificControlData?.maxCharacters;
1552
+ formlyConfig.validation.messages = {
1553
+ ...formlyConfig.validation?.messages,
1554
+ maxLength: simpleValidationMessage,
1555
+ };
1556
+ }
1557
+ if (control.specificControlData?.allowOnlyFuture ||
1558
+ control.specificControlData?.allowOnlyPast) {
1559
+ formlyConfig.type = 'datepicker';
1560
+ const checkDateValidation = {
1561
+ checkDate: {
1562
+ expression: (c, field) => {
1563
+ simpleValidationMessage =
1564
+ Utils.findErrorTranslationValueOrDefault(control.errorsTranslations, this.currentLanguageIso, 'simpleValidation');
1565
+ const currentDate = new Date();
1566
+ currentDate.setHours(0, 0, 0, 0);
1567
+ if (control.specificControlData?.allowOnlyFuture) {
1568
+ if (!c.value || c.value === '')
1569
+ return true;
1570
+ return c.value > currentDate;
1571
+ }
1572
+ if (control.specificControlData?.allowOnlyPast) {
1573
+ if (!c.value || c.value === '')
1574
+ return true;
1575
+ return c.value < currentDate;
1576
+ }
1577
+ return true;
1578
+ },
1579
+ message: (error, field) => {
1580
+ return simpleValidationMessage;
1581
+ },
1582
+ },
1583
+ };
1584
+ formlyConfig.validators = {
1585
+ ...formlyConfig.validators,
1586
+ ...checkDateValidation,
1587
+ };
1588
+ }
1589
+ }
1590
+ //control.specificControlData.type === 4 is phone
1591
+ if (control.specificControlData?.type === 4) {
1592
+ var phoneErrorLabel = this.flux?.find((f) => f?.config?.componentCollected === control?.identifier)?.config?.phoneErrorLabel;
1593
+ var phoneErrorLabelValue = '';
1594
+ if (phoneErrorLabel != null && Array.isArray(phoneErrorLabel)) {
1595
+ phoneErrorLabelValue =
1596
+ phoneErrorLabel.find((l) => l.languageIso === this.currentLanguageIso)?.value ?? '';
1597
+ }
1598
+ formlyConfig.validators = {
1599
+ phoneValid: {
1600
+ expression: (cont) => {
1601
+ const value = cont.value;
1602
+ const phonePattern = new RegExp('^(\\+4|)?(07[0-8]{1}[0-9]{1}|02[0-9]{2}|03[0-9]{2}){1}?(\\s|\\.|-)?([0-9]{3}(\\s|\\.|-|)){2}$');
1603
+ if (value && !phonePattern.test(value)) {
1604
+ cont.setErrors({ invalidPhoneNumber: true });
1605
+ return false;
1606
+ }
1607
+ return true;
1608
+ },
1609
+ message: phoneErrorLabelValue,
1610
+ },
1611
+ };
1612
+ }
1613
+ if (control.specificControlData?.type === 2) {
1614
+ const checkDate2Validation = {
1615
+ checkDate2: {
1616
+ expression: (c, field) => {
1617
+ var dateValue = c.value;
1618
+ if (!dateValue && control.specificControlData?.isMandatory) {
1619
+ simpleValidationMessage =
1620
+ Utils.findErrorTranslationValueOrDefault(control.errorsTranslations, this.currentLanguageIso, 'isMandatoryValidation');
1621
+ return false;
1622
+ }
1623
+ if (isNaN(Date.parse(dateValue)) &&
1624
+ control.specificControlData?.isMandatory)
1625
+ return false;
1626
+ return true;
1627
+ },
1628
+ message: (error, field) => {
1629
+ if (simpleValidationMessage === '')
1630
+ return 'Please enter a valid date';
1631
+ return simpleValidationMessage;
1632
+ },
1633
+ },
1634
+ };
1635
+ formlyConfig.validators = {
1636
+ ...formlyConfig.validators,
1637
+ ...checkDate2Validation,
1638
+ };
1639
+ }
1640
+ return formlyConfig;
1641
+ }
1642
+ async buildPresentationFormFieldAsync(step, control) {
1643
+ let formlyConfig = { props: {} };
1644
+ formlyConfig.type = 'formly-paragraph';
1645
+ formlyConfig.className = 'component-text-field';
1646
+ formlyConfig.props['design'] = this.appModel.generatedCss;
1647
+ var translatedTitle = control.translations.find((d) => d.languageIso == this.currentLanguageIso)
1648
+ ?.value ??
1649
+ control.title ??
1650
+ '';
1651
+ if (control.type == PresentationControlType.Paragraph) {
1652
+ const paragraphControl = control;
1653
+ var translatedDescription = paragraphControl.specificControlData.descriptionTranslations.find((d) => d.languageIso == this.currentLanguageIso)?.value ?? '';
1654
+ var translatedParagraphTitle = paragraphControl.specificControlData.text.find((d) => d.languageIso == this.currentLanguageIso)?.value ?? '';
1655
+ formlyConfig.defaultValue = translatedDescription;
1656
+ formlyConfig.props['translatedDescription'] = translatedDescription;
1657
+ formlyConfig.props['translatedParagraphTitle'] =
1658
+ translatedParagraphTitle;
1659
+ formlyConfig.type = 'formly-paragraph';
1660
+ formlyConfig.className = 'component-text-field';
1661
+ }
1662
+ else if (control.type == PresentationControlType.Download) {
1663
+ formlyConfig = this.CreateDownloadDocsFieldConfig(control);
1664
+ }
1665
+ else if (control.type == PresentationControlType.View) {
1666
+ formlyConfig = this.CreateViewDocsFieldConfig(control);
1667
+ }
1668
+ else if (control.type == PresentationControlType.Status) {
1669
+ let statusName = this.appModel.statuses.find((s) => s.id === this.fillData?.metadata.statusId)?.name || 'no status name';
1670
+ formlyConfig.defaultValue = statusName;
1671
+ formlyConfig.type = 'formly-paragraph';
1672
+ formlyConfig.className = 'component-text-field';
1673
+ }
1674
+ else {
1675
+ if (control.type == PresentationControlType.FluxComponent &&
1676
+ this.controlIdsWithValues &&
1677
+ control.collectionControlIdentifier) {
1678
+ const fillValue = this.controlIdsWithValues[control.collectionControlIdentifier];
1679
+ if (fillValue) {
1680
+ switch (typeof fillValue) {
1681
+ case 'boolean':
1682
+ formlyConfig.defaultValue = fillValue ? '&check;' : '&cross;';
1683
+ break;
1684
+ default:
1685
+ if (fillValue?.name) {
1686
+ formlyConfig.defaultValue = fillValue.name;
1687
+ }
1688
+ else {
1689
+ formlyConfig.defaultValue = fillValue;
1690
+ }
1691
+ break;
1692
+ }
1693
+ }
1694
+ }
1695
+ }
1696
+ formlyConfig.id = control.identifier;
1697
+ formlyConfig.props['isDisplayMode'] = true;
1698
+ formlyConfig.props['collectionControlIdentifier'] =
1699
+ control.collectionControlIdentifier;
1700
+ formlyConfig.props['label'] = translatedTitle;
1701
+ formlyConfig.props['langIso'] = this.currentLanguageIso;
1702
+ this.formlyPresentationFields.push(formlyConfig);
1703
+ return formlyConfig;
1704
+ }
1705
+ async buildApiMethodFormFieldAsync(step, control) {
1706
+ let formlyConfig = { props: {} };
1707
+ formlyConfig.type = 'formly-paragraph';
1708
+ formlyConfig.className = 'component-text-field';
1709
+ formlyConfig.props['design'] = this.appModel.generatedCss;
1710
+ var translatedTitle = control.translations.find((d) => d.languageIso == this.currentLanguageIso)
1711
+ ?.value ??
1712
+ control.title ??
1713
+ '';
1714
+ formlyConfig.id = control.identifier;
1715
+ formlyConfig.props['isDisplayMode'] = true;
1716
+ formlyConfig.props['apiMethodId'] = control.apiMethodId;
1717
+ formlyConfig.props['apiMethodFieldId'] = control.apiMethodFieldId;
1718
+ formlyConfig.props['label'] = translatedTitle;
1719
+ if (control.apiMethodFieldId) {
1720
+ const val = this.findInApiCallsResponses(control.apiMethodFieldId);
1721
+ formlyConfig.defaultValue = val;
1722
+ }
1723
+ this.formlyPresentationFields.push(formlyConfig);
1724
+ return formlyConfig;
1725
+ }
1726
+ attachToDependentDictionaryIfNecessary(dependentDictionary, formlyConfig) {
1727
+ // Handle dictionary dependencies
1728
+ if (dependentDictionary &&
1729
+ dependentDictionary.dictionaryControlIdentifier) {
1730
+ const parentKey = dependentDictionary.dictionaryControlIdentifier;
1731
+ const dependentValueIds = dependentDictionary.dependentValueIds || [];
1732
+ formlyConfig.expressions = {
1733
+ hide: (field) => {
1734
+ const shouldShow = this.shouldShowDependentField(parentKey, dependentValueIds, this.model);
1735
+ return !shouldShow;
1736
+ },
1737
+ };
1738
+ }
1739
+ }
1740
+ attachToValueChanges(controlId, options) {
1741
+ options.props['onSelectedValueChanged'] = async (val) => {
1742
+ this.model[controlId] = val;
1743
+ var referenceDictionaries = Array.from(this.dictionaryMap.values()).filter((d) => d.referenceId == val.dictionaryId);
1744
+ if (referenceDictionaries?.length > 0) {
1745
+ this.removeReferenceFields(options);
1746
+ var referenceDictionariesWithFilteredValues = this.createReferenceDictionariesFromSelectedValue(referenceDictionaries, val);
1747
+ const parentSpecificData = options.props?.['specificData'];
1748
+ await this.addReferenceDictionaryFieldsIfNecessary(referenceDictionariesWithFilteredValues, options, options.type, parentSpecificData?.relatedDictionariesTranslations || []);
1749
+ }
1750
+ else {
1751
+ this.removeReferenceFields(options);
1752
+ }
1753
+ this.updateFormlyConfig();
1754
+ };
1755
+ }
1756
+ createReferenceDictionariesFromSelectedValue(allDictionaries, selectedValue) {
1757
+ const newDictionaries = [];
1758
+ allDictionaries.forEach((dictionary) => {
1759
+ const filteredValues = dictionary.values?.filter((value) => value.referenceValues.some((refValue) => refValue.id === selectedValue.id)) || [];
1760
+ if (filteredValues.length > 0) {
1761
+ const newDictionary = {
1762
+ ...dictionary,
1763
+ values: filteredValues,
1764
+ };
1765
+ newDictionaries.push(newDictionary);
1766
+ }
1767
+ });
1768
+ return newDictionaries;
1769
+ }
1770
+ shouldShowDependentField(parentKey, dependentValueIds, model = {}) {
1771
+ // Retrieve the value of the parent dictionary control
1772
+ const parentValue = this.getNestedValue(model, parentKey);
1773
+ const idValue = parentValue?.id
1774
+ ? parentValue.id
1775
+ : parentValue;
1776
+ // Check if the parent value is in the dependentValueIds
1777
+ if (parentValue && dependentValueIds.includes(idValue)) {
1778
+ return true;
1779
+ }
1780
+ return false;
1781
+ }
1782
+ getNestedValue(obj, path) {
1783
+ const keys = path.split('.');
1784
+ let value = obj;
1785
+ for (const key of keys) {
1786
+ value = value[key];
1787
+ if (value === undefined) {
1788
+ return undefined;
1789
+ }
1790
+ }
1791
+ return value;
1792
+ }
1793
+ submit() {
1794
+ console.log('Form Data:', this.form.value);
1795
+ if (this.form.invalid) {
1796
+ console.log('Form data has validation errors.');
1797
+ this.scrollToErrorService.scrollToFirstError(this.form);
1798
+ }
1799
+ }
1800
+ /**
1801
+ * Public method to trigger scroll to first error - can be called from other components
1802
+ */
1803
+ scrollToFirstValidationError() {
1804
+ this.scrollToErrorService.scrollToFirstError(this.form);
1805
+ }
1806
+ /**
1807
+ * Public method to scroll to a specific field by name
1808
+ */
1809
+ scrollToField(fieldName) {
1810
+ this.scrollToErrorService.scrollToField(fieldName);
1811
+ }
1812
+ /**
1813
+ * Debug method to help troubleshoot scroll issues
1814
+ */
1815
+ debugFormElements() {
1816
+ this.scrollToErrorService.debugLogFormElements();
1817
+ }
1818
+ async constructDictionary(control, options) {
1819
+ const specificData = control.specificControlData;
1820
+ options.type =
1821
+ specificData.showAsRadioButtonsList === true
1822
+ ? `formly-radio`
1823
+ : `formly-dictionary-dropdown-tree`;
1824
+ options.props['specificData'] = specificData;
1825
+ const dictionaryUuid = specificData.dictionaryUUID;
1826
+ if (dictionaryUuid) {
1827
+ const dictionary = this.dictionaryMap.get(dictionaryUuid);
1828
+ if (dictionary) {
1829
+ if (dictionary.referenceId) {
1830
+ options.props['dictionaryId'] = dictionaryUuid;
1831
+ this.constructDictionaryWithReferences(dictionary, options, specificData);
1832
+ this.attachToValueChanges(control.identifier, options);
1833
+ }
1834
+ else {
1835
+ options.type =
1836
+ specificData.showAsRadioButtonsList === true
1837
+ ? 'formly-radio'
1838
+ : 'formly-dictionary-dropdown-tree';
1839
+ options.props['dictionaryId'] = dictionaryUuid;
1840
+ this.constructDictionaryWithReferences(dictionary, options, specificData);
1841
+ this.attachToValueChanges(control.identifier, options);
1842
+ }
1843
+ }
1844
+ else {
1845
+ console.warn(`Dictionary not found for UUID ${dictionaryUuid}`);
1846
+ }
1847
+ }
1848
+ else {
1849
+ console.warn(`UUID not found for dictionary ID ${specificData.dictionaryId}`);
1850
+ }
1851
+ }
1852
+ findDictionaryValueObject(dictionary, value) {
1853
+ if (!dictionary ||
1854
+ !dictionary.values ||
1855
+ value === null ||
1856
+ value === undefined) {
1857
+ return undefined;
1858
+ }
1859
+ if (typeof value === 'object' && value?.id != null) {
1860
+ return dictionary.values.find((v) => v.id === value.id);
1861
+ }
1862
+ else if (typeof value === 'number' || typeof value === 'string') {
1863
+ const valueId = Number(value);
1864
+ if (!isNaN(valueId)) {
1865
+ return dictionary.values.find((v) => v.id === valueId);
1866
+ }
1867
+ }
1868
+ return undefined;
1869
+ }
1870
+ async initializeReferenceFields(fields, rootConfig = this.formlyConfig) {
1871
+ if (!fields)
1872
+ return;
1873
+ const fieldsToProcess = [...fields];
1874
+ for (const field of fieldsToProcess) {
1875
+ const fieldKey = field.key;
1876
+ if (fieldKey &&
1877
+ field.props?.['dictionaryId'] &&
1878
+ field.props?.['specificData']) {
1879
+ const control = this.form.get(fieldKey);
1880
+ const specificData = field.props['specificData'];
1881
+ const dictionaryUuid = field.props['dictionaryId'];
1882
+ const mainDictionary = this.dictionaryMap.get(dictionaryUuid);
1883
+ let valueToUse = null;
1884
+ if (control && control.value !== null && control.value !== undefined) {
1885
+ valueToUse = control.value;
1886
+ }
1887
+ else if (field.defaultValue !== null &&
1888
+ field.defaultValue !== undefined) {
1889
+ valueToUse = field.defaultValue;
1890
+ }
1891
+ else if (this.model &&
1892
+ this.model[fieldKey] !== null &&
1893
+ this.model[fieldKey] !== undefined) {
1894
+ valueToUse = this.model[fieldKey];
1895
+ }
1896
+ let selectedValueObject = null;
1897
+ if (valueToUse !== null && mainDictionary?.id != null) {
1898
+ selectedValueObject = this.findDictionaryValueObject(mainDictionary, valueToUse);
1899
+ }
1900
+ const fieldConfigInTree = this.findFieldByKey(rootConfig, fieldKey);
1901
+ if (!fieldConfigInTree) {
1902
+ continue;
1903
+ }
1904
+ this.removeReferenceFields(fieldConfigInTree);
1905
+ if (selectedValueObject &&
1906
+ selectedValueObject.id != null &&
1907
+ mainDictionary?.id != null) {
1908
+ const potentialReferenceDictionaries = Array.from(this.dictionaryMap.values()).filter((dict) => dict.referenceId === mainDictionary.id);
1909
+ if (potentialReferenceDictionaries.length > 0) {
1910
+ const referenceDictionariesToShow = this.createReferenceDictionariesFromSelectedValue(potentialReferenceDictionaries, selectedValueObject);
1911
+ if (referenceDictionariesToShow.length > 0) {
1912
+ await this.addReferenceDictionaryFieldsIfNecessary(referenceDictionariesToShow, fieldConfigInTree, fieldConfigInTree.type, specificData?.relatedDictionariesTranslations || []);
1913
+ }
1914
+ }
1915
+ }
1916
+ }
1917
+ if (field.fieldGroup && field.fieldGroup.length > 0) {
1918
+ await this.initializeReferenceFields(field.fieldGroup, rootConfig);
1919
+ }
1920
+ }
1921
+ if (fields === this.formlyConfig ||
1922
+ fields === this.formlyConfig[0]?.fieldGroup) {
1923
+ this.updateFormlyConfig();
1924
+ this.formlyConfigUpdated.emit();
1925
+ this.cdRef.detectChanges();
1926
+ }
1927
+ }
1928
+ constructDictionaryWithReferences(dictionary, options, dictionaryControlData) {
1929
+ if (options.props) {
1930
+ var currentLanguageId = Utils.findLanguageIdByIso(this.availableLanguages, this.currentLanguageIso);
1931
+ // Pass preloaded dictionary data to formly component
1932
+ options.props['dictionaryData'] = dictionary;
1933
+ options.props['languages'] = this.availableLanguages;
1934
+ options.props['preloadedDictionaries'] = this.dictionaryMap;
1935
+ options.props['usePreloadedData'] = true;
1936
+ options.props.options = dictionary.values?.map((value) => ({
1937
+ value: value,
1938
+ label: Utils.findValueTranslation(value.valueTranslations, currentLanguageId) || value.name,
1939
+ currentLanguageIso: this.currentLanguageIso,
1940
+ relatedDictionariesTranslations: dictionaryControlData.relatedDictionariesTranslations,
1941
+ }));
1942
+ options.props['selectedRelatedDictionaries'] =
1943
+ dictionaryControlData.selectedRelatedDictionaries || [];
1944
+ let initialValueObject = null;
1945
+ const controlKey = options.key;
1946
+ const dictionaryDefaultValueId = dictionaryControlData.dictionaryDefaultValueId;
1947
+ if (!(this.model && this.model[controlKey] != null) &&
1948
+ dictionaryDefaultValueId != null) {
1949
+ initialValueObject = this.findAndMapDefaultValue(dictionary, dictionaryDefaultValueId);
1950
+ }
1951
+ options.defaultValue = initialValueObject;
1952
+ // Pass default value ID to formly component
1953
+ options.props['dictionaryDefaultValueId'] = dictionaryDefaultValueId;
1954
+ const controlId = options.key;
1955
+ if (this.fillData && this.fillData.flux) {
1956
+ for (const step of this.fillData.flux) {
1957
+ for (const section of step.sections) {
1958
+ const control = section.controls.find((ctrl) => ctrl.controlId === controlId);
1959
+ if (control && control.fillValue && control.fillValue.name) {
1960
+ options.props['value'] = control.fillValue.name;
1961
+ break;
1962
+ }
1963
+ }
1964
+ }
1965
+ }
1966
+ }
1967
+ this.updateFormlyConfig();
1968
+ }
1969
+ async addReferenceDictionaryFieldsIfNecessary(referrencedDictionaries, parentDictionaryField, type, relatedDictionariesTranslations) {
1970
+ if (referrencedDictionaries.length > 0) {
1971
+ const selectedRelatedDictionaries = parentDictionaryField.props?.['selectedRelatedDictionaries'] || [];
1972
+ const selectedDictionaries = referrencedDictionaries.filter((dict) => selectedRelatedDictionaries.includes(dict.uuid));
1973
+ selectedDictionaries.forEach((referenceDictionary) => {
1974
+ const referenceDictionaryUuid = referenceDictionary.uuid;
1975
+ const componentOnlyForConfig = this.flux
1976
+ .flatMap((s) => s.sections)
1977
+ .flatMap((sec) => sec.controls)
1978
+ .find((ctrl) => ctrl?.specificControlData?.dictionaryUUID ===
1979
+ referenceDictionaryUuid && ctrl?.isOnlyForConfig === true);
1980
+ const newFieldKey = componentOnlyForConfig?.identifier ??
1981
+ `extra_${referenceDictionaryUuid}`;
1982
+ let referenceDictionaryLabel = referenceDictionary.name;
1983
+ const specificTranslationValue = relatedDictionariesTranslations
1984
+ .find((d) => d.dictionaryUUID == referenceDictionaryUuid)
1985
+ ?.translations?.find((t) => t.languageIso == this.currentLanguageIso)?.value;
1986
+ if (specificTranslationValue &&
1987
+ specificTranslationValue.trim() !== '') {
1988
+ referenceDictionaryLabel = specificTranslationValue;
1989
+ }
1990
+ else {
1991
+ referenceDictionaryLabel = '';
1992
+ }
1993
+ const currentLanguageId = Utils.findLanguageIdByIso(this.availableLanguages, this.currentLanguageIso);
1994
+ const newField = {
1995
+ key: newFieldKey,
1996
+ type: type,
1997
+ props: {
1998
+ label: referenceDictionaryLabel,
1999
+ design: this.design,
2000
+ dictionaryId: referenceDictionaryUuid,
2001
+ dictionaryData: referenceDictionary,
2002
+ languages: this.availableLanguages,
2003
+ preloadedDictionaries: this.dictionaryMap,
2004
+ usePreloadedData: true,
2005
+ currentLanguageIso: this.currentLanguageIso,
2006
+ currentLanguageId: currentLanguageId,
2007
+ required: true,
2008
+ attributes: {
2009
+ style: this.styleObjectToStringExceptBackground(this.design[`.font-list`] || {}),
2010
+ },
2011
+ options: referenceDictionary.values?.map((value) => ({
2012
+ value: value,
2013
+ label: Utils.findValueTranslation(value.valueTranslations, currentLanguageId) || value.name,
2014
+ currentLanguageIso: this.currentLanguageIso,
2015
+ })),
2016
+ },
2017
+ };
2018
+ if (referenceDictionary.defaultValueId) {
2019
+ const defaultVal = this.findAndMapDefaultValue(referenceDictionary, referenceDictionary.defaultValueId);
2020
+ if (defaultVal) {
2021
+ newField.defaultValue = defaultVal;
2022
+ }
2023
+ }
2024
+ const parentFieldGroup = parentDictionaryField.parent
2025
+ ? parentDictionaryField.parent.fieldGroup
2026
+ : null;
2027
+ if (parentFieldGroup) {
2028
+ const parentIndex = parentFieldGroup.findIndex((field) => field.key === parentDictionaryField.key);
2029
+ if (parentIndex !== -1) {
2030
+ const endIndex = this.findLastChildIndex(parentFieldGroup, parentIndex);
2031
+ const percentageToAdd = this.getExistingPercentage(parentFieldGroup, parentIndex);
2032
+ newField.className = percentageToAdd === 0
2033
+ ? parentDictionaryField.className
2034
+ : this.getPercentageClassName(percentageToAdd);
2035
+ parentFieldGroup.splice(endIndex + 1, 0, newField);
2036
+ const classNameToAdd = type === 'radio' ? ` component-radio` : ` component-data`;
2037
+ newField.className += classNameToAdd;
2038
+ this.attachToValueChanges(newFieldKey, newField);
2039
+ this.updateFormlyConfig();
2040
+ }
2041
+ }
2042
+ });
2043
+ }
2044
+ }
2045
+ getExistingPercentage(fields, index) {
2046
+ let percentage = 0;
2047
+ const field = fields[index];
2048
+ const className = field.className;
2049
+ if (field.type?.toString() !== StepControlType.NewRow.toString()) {
2050
+ if (className && className.startsWith('percentage-width-')) {
2051
+ percentage =
2052
+ (parseInt(className.replace('percentage-width-', ''), 10) * 100) / 12;
2053
+ }
2054
+ else if (className && className.startsWith('pixel-width-')) {
2055
+ const pixels = parseInt(className.replace('pixel-width-', ''), 10);
2056
+ percentage = (pixels / 1000) * 100;
2057
+ }
2058
+ }
2059
+ return percentage;
2060
+ }
2061
+ calculateRemainingPercentageForRange(fields, startIndex, endIndex) {
2062
+ let remainingPercentage = 100;
2063
+ for (let i = startIndex; i <= endIndex; i++) {
2064
+ const percentage = this.getExistingPercentage(fields, i);
2065
+ remainingPercentage -= percentage;
2066
+ }
2067
+ return Math.max(remainingPercentage, 0);
2068
+ }
2069
+ removeReferenceFields(currentFormlyFieldConfig) {
2070
+ const referredInDictionariesUUIds = currentFormlyFieldConfig.props?.['dictionaryData']
2071
+ ?.referredInDictionariesUUIds;
2072
+ if (Array.isArray(referredInDictionariesUUIds)) {
2073
+ const parentFieldGroup = currentFormlyFieldConfig.parent
2074
+ ? currentFormlyFieldConfig.parent.fieldGroup
2075
+ : null;
2076
+ if (parentFieldGroup) {
2077
+ const parentIndex = parentFieldGroup.findIndex((field) => field.key === currentFormlyFieldConfig.key);
2078
+ if (parentIndex !== -1) {
2079
+ for (const item of referredInDictionariesUUIds) {
2080
+ const idToFind = 'extra_' + item;
2081
+ for (let i = parentFieldGroup.length - 1; i > parentIndex; i--) {
2082
+ const currentFieldKey = parentFieldGroup[i].key?.toString();
2083
+ if (currentFieldKey && currentFieldKey === idToFind) {
2084
+ this.clearFormControlValue(idToFind);
2085
+ parentFieldGroup.splice(i, 1);
2086
+ }
2087
+ }
2088
+ }
2089
+ }
2090
+ }
2091
+ }
2092
+ }
2093
+ async addChildDictionaryField(childDictionaryUuid, parentDictionaryField, type, relatedDictionariesTranslations) {
2094
+ if (childDictionaryUuid) {
2095
+ const childDictionary = this.dictionaryMap.get(childDictionaryUuid);
2096
+ if (childDictionary) {
2097
+ let childDictionaryLabel = childDictionary.name;
2098
+ const translation = relatedDictionariesTranslations
2099
+ .find((d) => d.dictionaryUUID == childDictionaryUuid)
2100
+ ?.translations.find((t) => t.languageIso == this.currentLanguageIso)
2101
+ ?.value || '';
2102
+ if (translation) {
2103
+ childDictionaryLabel = translation;
2104
+ }
2105
+ const newField = {
2106
+ key: `${parentDictionaryField.key}_child_${childDictionaryUuid}`,
2107
+ type: type,
2108
+ props: {
2109
+ label: childDictionaryLabel,
2110
+ dictionaryData: childDictionary,
2111
+ languages: this.availableLanguages,
2112
+ preloadedDictionaries: this.dictionaryMap,
2113
+ options: childDictionary.values?.map((value) => ({
2114
+ value: value.id,
2115
+ label: value.name,
2116
+ })),
2117
+ required: true,
2118
+ attributes: {
2119
+ style: this.styleObjectToStringExceptBackground(this.design[`.font-list`] || {}),
2120
+ },
2121
+ },
2122
+ hooks: {
2123
+ onInit: (field) => {
2124
+ const unsubscribe$ = new Subject();
2125
+ this.fieldUnsubscribeSubjects.push(unsubscribe$);
2126
+ field.formControl?.valueChanges
2127
+ .pipe(takeUntil(unsubscribe$))
2128
+ .subscribe(async (selectedValue) => {
2129
+ const selectedOption = childDictionary.values?.find((val) => val.id === selectedValue);
2130
+ if (selectedOption && selectedOption.childDictionaryUUID) {
2131
+ await this.addChildDictionaryField(selectedOption.childDictionaryUUID, field, type, relatedDictionariesTranslations);
2132
+ }
2133
+ else {
2134
+ this.removeChildFields(field);
2135
+ this.updateFormlyConfig();
2136
+ }
2137
+ });
2138
+ field.hooks.onDestroy = () => {
2139
+ unsubscribe$.next();
2140
+ unsubscribe$.complete();
2141
+ };
2142
+ },
2143
+ },
2144
+ };
2145
+ const parentFieldGroup = parentDictionaryField.parent
2146
+ ? parentDictionaryField.parent.fieldGroup
2147
+ : null;
2148
+ if (parentFieldGroup) {
2149
+ const parentIndex = parentFieldGroup.findIndex((field) => field.key === parentDictionaryField.key);
2150
+ if (parentIndex !== -1) {
2151
+ const endIndex = this.findLastChildIndex(parentFieldGroup, parentIndex);
2152
+ const percentageToAdd = this.getExistingPercentage(parentFieldGroup, parentIndex);
2153
+ newField.className = this.getPercentageClassName(percentageToAdd);
2154
+ parentFieldGroup.splice(endIndex + 1, 0, newField);
2155
+ const classNameToAdd = type === 'radio' ? ` component-radio` : ` component-data`;
2156
+ newField.className += classNameToAdd;
2157
+ //this.attachToValueChanges(newFieldKey, newField);
2158
+ this.updateFormlyConfig();
2159
+ }
2160
+ }
2161
+ }
2162
+ else {
2163
+ console.warn(`Child dictionary not found for UUID ${childDictionaryUuid}`);
2164
+ }
2165
+ }
2166
+ }
2167
+ onCompletion() {
2168
+ console.log('Origin form completed successfully');
2169
+ this.completionEvent.emit();
2170
+ }
2171
+ findLastChildIndex(fields, parentIndex) {
2172
+ const parentKeyPrefix = `${fields[parentIndex].key}_`;
2173
+ let lastIndex = parentIndex;
2174
+ for (let i = parentIndex + 1; i < fields.length; i++) {
2175
+ if (fields[i].key?.toString().startsWith(parentKeyPrefix)) {
2176
+ lastIndex = i;
2177
+ }
2178
+ else {
2179
+ break;
2180
+ }
2181
+ }
2182
+ return lastIndex;
2183
+ }
2184
+ findFieldByKey(fields, key) {
2185
+ if (!fields)
2186
+ return null;
2187
+ for (const field of fields) {
2188
+ if (field.type === 'stepper' && field.fieldGroup) {
2189
+ const foundInStepper = this.findFieldByKey(field.fieldGroup, key);
2190
+ if (foundInStepper)
2191
+ return foundInStepper;
2192
+ }
2193
+ if (field.key === key) {
2194
+ return field;
2195
+ }
2196
+ if (field.fieldGroup) {
2197
+ const found = this.findFieldByKey(field.fieldGroup, key);
2198
+ if (found)
2199
+ return found;
2200
+ }
2201
+ }
2202
+ return null;
2203
+ }
2204
+ removeChildFields(parentField) {
2205
+ const parentFieldGroup = parentField.parent
2206
+ ? parentField.parent.fieldGroup
2207
+ : null;
2208
+ if (parentFieldGroup) {
2209
+ const parentIndex = parentFieldGroup.findIndex((field) => field.key === parentField.key);
2210
+ if (parentIndex !== -1) {
2211
+ const parentKeyPrefix = `${parentField.key}_child_`;
2212
+ // Remove only the relevant child fields
2213
+ for (let i = parentFieldGroup.length - 1; i > parentIndex; i--) {
2214
+ const currentFieldKey = parentFieldGroup[i].key?.toString();
2215
+ if (currentFieldKey && currentFieldKey.startsWith(parentKeyPrefix)) {
2216
+ this.clearFormControlValue(currentFieldKey);
2217
+ parentFieldGroup.splice(i, 1);
2218
+ }
2219
+ }
2220
+ }
2221
+ }
2222
+ }
2223
+ /**
2224
+ * NEW: Load ALL dictionaries needed for this app using the new app-based endpoint
2225
+ */
2226
+ async loadAllRequiredDictionaries() {
2227
+ if (!this.appModel?.applicationUuid) {
2228
+ console.warn('No app UUID available for dictionary loading');
2229
+ return;
2230
+ }
2231
+ try {
2232
+ const response = await firstValueFrom(this.service.loadAppDictionaries(this.appModel.applicationUuid, EnvironmentType.Config));
2233
+ if (!response.success) {
2234
+ console.error('❌ Backend failed to load dictionaries:', response.errors);
2235
+ return;
2236
+ }
2237
+ // Simple assignment - ALL dictionaries and dependencies already loaded by backend
2238
+ Object.entries(response.dictionaries).forEach(([uuid, dict]) => {
2239
+ this.dictionaryMap.set(uuid, dict);
2240
+ });
2241
+ }
2242
+ catch (error) {
2243
+ console.error('❌ Failed to load app dictionaries:', error);
2244
+ }
2245
+ }
2246
+ clearFormControlValue(fieldKey) {
2247
+ const keys = fieldKey.split('.');
2248
+ let control = this.form;
2249
+ let model = this.model;
2250
+ for (let i = 0; i < keys.length - 1; i++) {
2251
+ control = control.get(keys[i]);
2252
+ model = model[keys[i]];
2253
+ }
2254
+ const finalKey = keys[keys.length - 1];
2255
+ if (control && control.get(finalKey)) {
2256
+ control.removeControl(finalKey);
2257
+ }
2258
+ if (model && model[finalKey] !== undefined) {
2259
+ delete model[finalKey];
2260
+ }
2261
+ }
2262
+ findField(fields, key) {
2263
+ for (const field of fields) {
2264
+ if (field.key === key) {
2265
+ return field;
2266
+ }
2267
+ if (field.fieldGroup) {
2268
+ const nestedField = this.findField(field.fieldGroup, key);
2269
+ if (nestedField) {
2270
+ return nestedField;
2271
+ }
2272
+ }
2273
+ }
2274
+ return null;
2275
+ }
2276
+ populateModelWithFillData(fillData) {
2277
+ if (fillData) {
2278
+ let auxModel = ModelPopulationHelper.populateModelWithFillData(fillData, this.flux, this.dictionaryMap, this.availableLanguages);
2279
+ this.model = { ...auxModel };
2280
+ this.cdRef.detectChanges();
2281
+ }
2282
+ }
2283
+ findAndMapDefaultValue(dictionary, defaultValueId) {
2284
+ return ModelPopulationHelper.findAndMapDefaultValue(dictionary, defaultValueId, this.availableLanguages);
2285
+ }
2286
+ updateFormlyConfig() {
2287
+ this.formlyConfig = [...this.formlyConfig];
2288
+ }
2289
+ unsubscribeFromAllFields() {
2290
+ for (const subject of this.fieldUnsubscribeSubjects) {
2291
+ subject.next();
2292
+ subject.complete();
2293
+ }
2294
+ this.fieldUnsubscribeSubjects = [];
2295
+ }
2296
+ ngOnDestroy() {
2297
+ this.unsubscribeFromAllFields();
2298
+ if (this.collectorHandlerSubscriptions) {
2299
+ this.collectorHandlerSubscriptions.unsubscribe();
2300
+ }
2301
+ if (this.actionStepSubscriptions) {
2302
+ this.actionStepSubscriptions.unsubscribe();
2303
+ }
2304
+ if (this.actionStepHandler) {
2305
+ this.actionStepHandler.destroy();
2306
+ }
2307
+ }
2308
+ constructButtons(buttonsConfig) {
2309
+ if (!buttonsConfig || buttonsConfig.length === 0) {
2310
+ return [];
2311
+ }
2312
+ return buttonsConfig.map((button) => ({
2313
+ type: button.value.toLowerCase(),
2314
+ label: button.translations?.[this.currentLanguageIso] || button.value,
2315
+ styleKey: `.button-${button.value.toLowerCase()}`,
2316
+ }));
2317
+ }
2318
+ styleObjectToStringExceptBackground(styleObj) {
2319
+ return Object.entries(styleObj)
2320
+ .filter(([key, value]) => key !== 'background-color')
2321
+ .map(([key, value]) => `${key}: ${value}`)
2322
+ .join('; ');
2323
+ }
2324
+ validateMethodApi(data) {
2325
+ if (data.apiId === undefined || data.appId === undefined) {
2326
+ return of(false);
2327
+ }
2328
+ return this.applicationDataService.validateApi(data).pipe(map((response) => {
2329
+ console.log('API validation response:', response);
2330
+ return !!response;
2331
+ }), catchError((error) => {
2332
+ console.error('Error validating ' + data.data, error);
2333
+ return of(false);
2334
+ }));
2335
+ }
2336
+ /**
2337
+ * Public method to clear the saving after actions state
2338
+ * Called by stepper component after saveAppDataStep completes
2339
+ */
2340
+ clearSavingAfterActionsState() {
2341
+ if (this.isSavingAfterActions) {
2342
+ this.isSavingAfterActions = false;
2343
+ this.isLoading = false;
2344
+ this.cdRef.detectChanges();
2345
+ }
2346
+ }
2347
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CollectorFormComponent, deps: [{ token: i1.DictionaryService }, { token: i0.ChangeDetectorRef }, { token: i0.Renderer2 }, { token: i2.ProxyService }, { token: i3.LabelService }, { token: i4.ApplicationDataService }, { token: i5.LanguageService }, { token: i6.OriginFormAuthService }, { token: i7.FormsService }, { token: i8.ConfigService }, { token: i9.TranslationService }, { token: i10.OriginFormSignalrHandlerService }, { token: i11.ActionStepHandler }, { token: i12.ScrollToErrorService }], target: i0.ɵɵFactoryTarget.Component }); }
2348
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CollectorFormComponent, selector: "app-origin-form", inputs: { configComponent: "configComponent", configUuid: "configUuid", currentStepId: "currentStepId", appModel: "appModel", signBaseUrl: "signBaseUrl", currentLanguageIso: "currentLanguageIso", fillData: "fillData", env: "env", showDisplayMode: "showDisplayMode", showLanguageSelector: "showLanguageSelector", isDemoMode: "isDemoMode", isDebug: "isDebug", appDataUuid: "appDataUuid", blockPreviousStep: "blockPreviousStep", dataUrlId: "dataUrlId", noButtonsInView: "noButtonsInView" }, outputs: { completionEvent: "completionEvent" }, viewQueries: [{ propertyName: "formlyFields", predicate: FormlyField, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"isLoading\" class=\"loading-overlay\">\n <mat-spinner></mat-spinner>\n</div>\n<div [hidden]=\"isLoading\">\n <div *ngIf=\"showLanguageSelector\" appearance=\"outline\" class=\"right-aligned\">\n <button [matMenuTriggerFor]=\"flags\" mat-icon-button class=\"m-r-5\">\n <img\n [src]=\"returnFLag(currentLanguageIso)\"\n class=\"rounded-circle object-cover icon-20\"\n />\n </button>\n <mat-menu #flags=\"matMenu\" class=\"cardWithShadow\">\n <button\n mat-menu-item\n *ngFor=\"let lang of applicationLanguages()\"\n (click)=\"changeLanguage(lang.iso)\"\n >\n <div class=\"d-flex align-items-center\">\n <img\n [src]=\"returnFLag(lang.iso)\"\n class=\"rounded-circle object-cover icon-20\"\n />\n <span class=\"mat-subtitle-1 f-s-14\">{{ lang.name }}</span>\n </div>\n </button>\n </mat-menu>\n </div>\n\n <br />\n <div class=\"form-container\">\n <form [formGroup]=\"form\" (ngSubmit)=\"submit()\">\n <formly-form\n [model]=\"model\"\n [fields]=\"formlyConfig\"\n [options]=\"options\"\n [form]=\"form\"\n ></formly-form>\n </form>\n </div>\n</div>\n", styles: ["@import\"https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@300;400;500;600;700&display=swap\";@import\"https://fonts.googleapis.com/icon?family=Material+Icons\";@font-face{font-family:ttrounds;src:url(/assets/fonts/ttrounds-bold-webfont.woff2) format(\"woff2\"),url(/assets/fonts/ttrounds-bold-webfont.woff) format(\"woff\");font-weight:700;font-style:normal}@font-face{font-family:ttrounds;src:url(/assets/fonts/ttrounds-regular-webfont.woff2) format(\"woff2\"),url(/assets/fonts/ttrounds-regular-webfont.woff) format(\"woff\");font-weight:400;font-style:normal}@font-face{font-family:ttrounds;src:url(/assets/fonts/ttrounds-thin-webfont.woff2) format(\"woff2\"),url(/assets/fonts/ttrounds-thin-webfont.woff) format(\"woff\");font-weight:200;font-style:normal}@font-face{font-family:Sora Light;src:url(/assets/fonts/Sora-Light.ttf) format(\"truetype\");font-weight:400;font-style:normal}@font-face{font-family:Sora Regular;src:url(/assets/fonts/Sora-Regular.ttf) format(\"truetype\");font-weight:400;font-style:normal}@font-face{font-family:Sora ExtraBold;src:url(/assets/fonts/Sora-ExtraBold.ttf) format(\"truetype\");font-weight:400;font-style:normal}@font-face{font-family:Figtree Light;src:url(/assets/fonts/Figtree-Light.ttf) format(\"truetype\");font-weight:400;font-style:normal}@font-face{font-family:Figtree Regular;src:url(/assets/fonts/Figtree-Regular.ttf) format(\"truetype\");font-weight:400;font-style:normal}@font-face{font-family:Figtree Bold;src:url(/assets/fonts/Figtree-Bold.ttf) format(\"truetype\");font-weight:400;font-style:normal}.loader{border-top:16px solid blue;border-right:16px solid green;border-bottom:16px solid red;border-left:16px solid pink}:host ::ng-deep .mat-mdc-text-field-wrapper .mdc-line-ripple{display:none!important}.right-aligned{display:flex;justify-content:flex-end!important}.flag-icon{width:20px;height:20px;margin-right:8px;vertical-align:middle}.rounded-circle{border-radius:50%}.object-cover{object-fit:cover}.m-r-8{margin-right:8px}.icon-20{width:20px;height:20px}.loading-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background:#ffffffb3;display:flex;justify-content:center;align-items:center;z-index:9999}\n"], dependencies: [{ kind: "directive", type: i13.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i13.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i14.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i14.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i14.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i15.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i15.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i15.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: i16.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i17.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i18.FormlyForm, selector: "formly-form", inputs: ["form", "model", "fields", "options"], outputs: ["modelChange"] }] }); }
2349
+ }
2350
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CollectorFormComponent, decorators: [{
2351
+ type: Component,
2352
+ args: [{ selector: 'app-origin-form', template: "<div *ngIf=\"isLoading\" class=\"loading-overlay\">\n <mat-spinner></mat-spinner>\n</div>\n<div [hidden]=\"isLoading\">\n <div *ngIf=\"showLanguageSelector\" appearance=\"outline\" class=\"right-aligned\">\n <button [matMenuTriggerFor]=\"flags\" mat-icon-button class=\"m-r-5\">\n <img\n [src]=\"returnFLag(currentLanguageIso)\"\n class=\"rounded-circle object-cover icon-20\"\n />\n </button>\n <mat-menu #flags=\"matMenu\" class=\"cardWithShadow\">\n <button\n mat-menu-item\n *ngFor=\"let lang of applicationLanguages()\"\n (click)=\"changeLanguage(lang.iso)\"\n >\n <div class=\"d-flex align-items-center\">\n <img\n [src]=\"returnFLag(lang.iso)\"\n class=\"rounded-circle object-cover icon-20\"\n />\n <span class=\"mat-subtitle-1 f-s-14\">{{ lang.name }}</span>\n </div>\n </button>\n </mat-menu>\n </div>\n\n <br />\n <div class=\"form-container\">\n <form [formGroup]=\"form\" (ngSubmit)=\"submit()\">\n <formly-form\n [model]=\"model\"\n [fields]=\"formlyConfig\"\n [options]=\"options\"\n [form]=\"form\"\n ></formly-form>\n </form>\n </div>\n</div>\n", styles: ["@import\"https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@300;400;500;600;700&display=swap\";@import\"https://fonts.googleapis.com/icon?family=Material+Icons\";@font-face{font-family:ttrounds;src:url(/assets/fonts/ttrounds-bold-webfont.woff2) format(\"woff2\"),url(/assets/fonts/ttrounds-bold-webfont.woff) format(\"woff\");font-weight:700;font-style:normal}@font-face{font-family:ttrounds;src:url(/assets/fonts/ttrounds-regular-webfont.woff2) format(\"woff2\"),url(/assets/fonts/ttrounds-regular-webfont.woff) format(\"woff\");font-weight:400;font-style:normal}@font-face{font-family:ttrounds;src:url(/assets/fonts/ttrounds-thin-webfont.woff2) format(\"woff2\"),url(/assets/fonts/ttrounds-thin-webfont.woff) format(\"woff\");font-weight:200;font-style:normal}@font-face{font-family:Sora Light;src:url(/assets/fonts/Sora-Light.ttf) format(\"truetype\");font-weight:400;font-style:normal}@font-face{font-family:Sora Regular;src:url(/assets/fonts/Sora-Regular.ttf) format(\"truetype\");font-weight:400;font-style:normal}@font-face{font-family:Sora ExtraBold;src:url(/assets/fonts/Sora-ExtraBold.ttf) format(\"truetype\");font-weight:400;font-style:normal}@font-face{font-family:Figtree Light;src:url(/assets/fonts/Figtree-Light.ttf) format(\"truetype\");font-weight:400;font-style:normal}@font-face{font-family:Figtree Regular;src:url(/assets/fonts/Figtree-Regular.ttf) format(\"truetype\");font-weight:400;font-style:normal}@font-face{font-family:Figtree Bold;src:url(/assets/fonts/Figtree-Bold.ttf) format(\"truetype\");font-weight:400;font-style:normal}.loader{border-top:16px solid blue;border-right:16px solid green;border-bottom:16px solid red;border-left:16px solid pink}:host ::ng-deep .mat-mdc-text-field-wrapper .mdc-line-ripple{display:none!important}.right-aligned{display:flex;justify-content:flex-end!important}.flag-icon{width:20px;height:20px;margin-right:8px;vertical-align:middle}.rounded-circle{border-radius:50%}.object-cover{object-fit:cover}.m-r-8{margin-right:8px}.icon-20{width:20px;height:20px}.loading-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background:#ffffffb3;display:flex;justify-content:center;align-items:center;z-index:9999}\n"] }]
2353
+ }], ctorParameters: () => [{ type: i1.DictionaryService }, { type: i0.ChangeDetectorRef }, { type: i0.Renderer2 }, { type: i2.ProxyService }, { type: i3.LabelService }, { type: i4.ApplicationDataService }, { type: i5.LanguageService }, { type: i6.OriginFormAuthService }, { type: i7.FormsService }, { type: i8.ConfigService }, { type: i9.TranslationService }, { type: i10.OriginFormSignalrHandlerService }, { type: i11.ActionStepHandler }, { type: i12.ScrollToErrorService }], propDecorators: { formlyFields: [{
2354
+ type: ViewChildren,
2355
+ args: [FormlyField]
2356
+ }], configComponent: [{
2357
+ type: Input
2358
+ }], configUuid: [{
2359
+ type: Input
2360
+ }], currentStepId: [{
2361
+ type: Input
2362
+ }], appModel: [{
2363
+ type: Input
2364
+ }], signBaseUrl: [{
2365
+ type: Input
2366
+ }], currentLanguageIso: [{
2367
+ type: Input
2368
+ }], fillData: [{
2369
+ type: Input
2370
+ }], env: [{
2371
+ type: Input
2372
+ }], showDisplayMode: [{
2373
+ type: Input
2374
+ }], showLanguageSelector: [{
2375
+ type: Input
2376
+ }], isDemoMode: [{
2377
+ type: Input
2378
+ }], isDebug: [{
2379
+ type: Input
2380
+ }], appDataUuid: [{
2381
+ type: Input
2382
+ }], blockPreviousStep: [{
2383
+ type: Input
2384
+ }], dataUrlId: [{
2385
+ type: Input
2386
+ }], noButtonsInView: [{
2387
+ type: Input
2388
+ }], completionEvent: [{
2389
+ type: Output
2390
+ }] } });
2391
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JpZ2luLWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvb3JpZ2luLWZvcm0vc3JjL2xpYi9vcmlnaW4tZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9vcmlnaW4tZm9ybS9zcmMvbGliL29yaWdpbi1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBSU4sWUFBWSxHQUNiLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBbUIsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFDTCxXQUFXLEdBR1osTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQ0wsT0FBTyxFQUNQLGNBQWMsRUFDZCxTQUFTLEVBQ1QsUUFBUSxFQUNSLFlBQVksRUFDWixTQUFTLEVBQ1QsVUFBVSxFQUNWLEVBQUUsRUFDRixTQUFTLEVBRVQsR0FBRyxFQUNILFlBQVksR0FDYixNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQU8vQyxPQUFPLEVBS0wsUUFBUSxFQUNSLGFBQWEsRUFDYixlQUFlLEVBQ2Ysc0JBQXNCLEdBR3ZCLE1BQU0sc0JBQXNCLENBQUM7QUFLOUIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzVELE9BQU8sRUFBWSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQVVqRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQVFsRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbEQsT0FBTyxFQUEwRSx1QkFBdUIsRUFBeUIsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFPN0osTUFBTSxPQUFPLHNCQUFzQjtJQTBHakMsWUFDVSxPQUEwQixFQUMxQixLQUF3QixFQUN4QixRQUFtQixFQUMzQixLQUFtQixFQUNYLFlBQTBCLEVBQzFCLHNCQUE4QyxFQUM5QyxXQUE0QixFQUM1QixXQUFrQyxFQUNsQyxZQUEwQixFQUMxQixhQUE0QixFQUM1QixrQkFBc0MsRUFDdEMsK0JBQWdFLEVBQ2hFLGlCQUFvQyxFQUNwQyxvQkFBMEM7UUFiMUMsWUFBTyxHQUFQLE9BQU8sQ0FBbUI7UUFDMUIsVUFBSyxHQUFMLEtBQUssQ0FBbUI7UUFDeEIsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUVuQixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQiwyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBQzlDLGdCQUFXLEdBQVgsV0FBVyxDQUFpQjtRQUM1QixnQkFBVyxHQUFYLFdBQVcsQ0FBdUI7UUFDbEMsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUN0QyxvQ0FBK0IsR0FBL0IsK0JBQStCLENBQWlDO1FBQ2hFLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDcEMseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFzQjtRQTFHM0Msb0JBQWUsR0FBWSxLQUFLLENBQUM7UUFDakMseUJBQW9CLEdBQVksSUFBSSxDQUFDO1FBQ3JDLGVBQVUsR0FBWSxLQUFLLENBQUM7UUFDNUIsWUFBTyxHQUFZLEtBQUssQ0FBQztRQUl6QixvQkFBZSxHQUFZLEtBQUssQ0FBQztRQVMxQyx3QkFBbUIsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQy9DLHlCQUFvQixHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDL0MsMEJBQXFCLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUNoRCxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFFOUIsb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBRXJELFNBQUksR0FBRyxJQUFJLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN6QixpQkFBWSxHQUF3QixFQUFFLENBQUM7UUFDdkMsbUJBQWMsR0FBd0IsRUFBRSxDQUFDO1FBQ3pDLGVBQVUsR0FBRyxDQUFDLENBQUM7UUFFZixZQUFPLEdBQXNCLEVBQUUsQ0FBQztRQUNoQyxjQUFTLEdBQVksSUFBSSxDQUFDO1FBRTFCLGtCQUFhLEdBQStCLElBQUksR0FBRyxFQUFFLENBQUM7UUFDdEQsMEJBQXFCLEdBQXdCLElBQUksR0FBRyxFQUFFLENBQUM7UUFDdkQsb0JBQWUsR0FBRyxTQUFTLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQztRQUM5Qyw2QkFBd0IsR0FBb0IsRUFBRSxDQUFDO1FBQy9DLGtDQUE2QixHQUFpQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBRXpFLDhCQUE4QjtRQUN0Qix1QkFBa0IsR0FBRyxLQUFLLENBQUM7UUFDM0IsNEJBQXVCLEdBQWlCLElBQUksWUFBWSxFQUFFLENBQUM7UUFDNUQseUJBQW9CLEdBQUcsS0FBSyxDQUFDLENBQUMsNENBQTRDO1FBUTFFLG1CQUFjLEdBQVcsRUFBRSxDQUFDO1FBQzVCLGVBQVUsR0FBVyxFQUFFLENBQUM7UUFDeEIsdUJBQWtCLEdBQVksS0FBSyxDQUFDO1FBQ3BDLGtCQUFhLEdBQVksS0FBSyxDQUFDO1FBQ3RDLG1DQUFtQztRQUM1QixrQkFBYSxHQUFVO1lBQzVCO2dCQUNFLFFBQVEsRUFBRSxTQUFTO2dCQUNuQixJQUFJLEVBQUUsSUFBSTtnQkFDVixJQUFJLEVBQUUsSUFBSTtnQkFDVixJQUFJLEVBQUUsc0NBQXNDO2FBQzdDO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLFFBQVE7Z0JBQ2xCLElBQUksRUFBRSxJQUFJO2dCQUNWLElBQUksRUFBRSxzQ0FBc0M7YUFDN0M7WUFDRDtnQkFDRSxRQUFRLEVBQUUsU0FBUztnQkFDbkIsSUFBSSxFQUFFLElBQUk7Z0JBQ1YsSUFBSSxFQUFFLHNDQUFzQzthQUM3QztZQUNEO2dCQUNFLFFBQVEsRUFBRSxVQUFVO2dCQUNwQixJQUFJLEVBQUUsSUFBSTtnQkFDVixJQUFJLEVBQUUsc0NBQXNDO2FBQzdDO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLFVBQVU7Z0JBQ3BCLElBQUksRUFBRSxJQUFJO2dCQUNWLElBQUksRUFBRSxzQ0FBc0M7YUFDN0M7WUFDRDtnQkFDRSxRQUFRLEVBQUUsU0FBUztnQkFDbkIsSUFBSSxFQUFFLElBQUk7Z0JBQ1YsSUFBSSxFQUFFLHNDQUFzQzthQUM3QztTQUNGLENBQUM7UUFJRixVQUFLLEdBQUcsSUFBSSxDQUFDO1FBMC9GYixtQkFBYyxHQUFrQixJQUFJLENBQUM7UUF2K0ZuQyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDOUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsT0FBUSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUM1QixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUM7UUFFeEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO1FBQ2hDLE1BQU0sWUFBWSxHQUNoQixJQUFJLENBQUMsK0JBQStCLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ3BFLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxPQUFPLEVBQUUsQ0FBQztnQkFDL0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUM7WUFDM0IsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsSUFBSSxDQUFDLDZCQUE2QixDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUVqRCxNQUFNLHFCQUFxQixHQUM3QixJQUFJLENBQUMsK0JBQStCLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUNoRSxLQUFLLEVBQUUsTUFBdUIsRUFBRSxFQUFFO1lBQ2hDLElBQUksTUFBTSxDQUFDLG1CQUFtQixLQUFLLGdCQUFnQixFQUFFLENBQUM7Z0JBQ3BELElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUNuQixPQUFPLENBQUMsR0FBRyxDQUNULDhEQUE4RCxFQUM5RCxNQUFNLENBQUMsSUFBSSxDQUNaLENBQUM7b0JBQ0YsSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7d0JBQ2hCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO3dCQUNqRCxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUNoRCxDQUFDO29CQUVELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3RDLENBQUM7cUJBQU0sQ0FBQztvQkFDTixPQUFPLENBQUMsS0FBSyxDQUNYLDhDQUE4QyxFQUM5QyxNQUFNLENBQUMsS0FBSyxDQUNiLENBQUM7Z0JBQ0osQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDLENBQ0YsQ0FBQztRQUNKLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUU5RCw0Q0FBNEM7UUFDNUMsTUFBTSxrQkFBa0IsR0FDdEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFO1lBQzlELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxTQUFTLENBQUM7WUFDcEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7WUFDM0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FBQztRQUNMLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUVyRCxNQUFNLGtCQUFrQixHQUN0QixJQUFJLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDM0QsT0FBTyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNqRCxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNwQixPQUFPLENBQUMsS0FBSyxDQUFDLHVCQUF1QixFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN2RCxDQUFDO1lBQ0Qsc0ZBQXNGO1FBQ3hGLENBQUMsQ0FBQyxDQUFDO1FBQ0wsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxLQUFLLENBQUMsUUFBUTtRQUNaLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ25CLElBQUksTUFBTSxHQUFHLE1BQU0sY0FBYyxDQUMvQixJQUFJLENBQUMsc0JBQXNCLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FDdkQsQ0FBQztZQUNGLElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQ1gsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO2dCQUMvQixJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUM7Z0JBQ3BDLElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQztZQUN4QixDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDM0MsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGNBQWMsQ0FDeEMsSUFBSSxDQUFDLFdBQVcsRUFDaEIsSUFBSSxDQUFDLGFBQWEsQ0FDbkIsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzFDLENBQUM7UUFFRCxJQUNFLElBQUksQ0FBQyxlQUFlO1lBQ3BCLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSztZQUMxQixJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksRUFDakMsQ0FBQztZQUNELElBQUksQ0FBQyxhQUFhLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQy9ELE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQzlCLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUMxQixJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FDbEMsQ0FBQztRQUNKLENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDckUsTUFBTSxjQUFjLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUNsRSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDbkMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7Z0JBQ3ZDLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRCxNQUFNLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUM5QyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDO1FBQ3RFLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNsQixNQUFNLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUN6QixDQUFDO0lBQ0gsQ0FBQztJQUVGLEtBQUssQ0FBQyxXQUFXLENBQUMsT0FBc0I7UUFDckMsSUFBSSxPQUFPLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQzFFLElBQ0UsSUFBSSxDQUFDLGVBQWU7Z0JBQ3BCLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSztnQkFDMUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLEVBQ2pDLENBQUM7Z0JBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBQy9ELE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQzlCLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUMxQixJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FDbEMsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFDRSxPQUFPLENBQUMsb0JBQW9CLENBQUM7WUFDN0IsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxXQUFXLEVBQzFDLENBQUM7WUFDRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztZQUV0QixJQUFJLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO29CQUM3QixNQUFNLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7d0JBQ2xFLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDOzRCQUNuQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQzt3QkFDdkMsQ0FBQztvQkFDSCxDQUFDLENBQUMsQ0FBQztnQkFDTCxDQUFDO2dCQUNELElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO29CQUNyQixJQUFJLENBQUM7d0JBQ0gsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQUMsUUFBUSxDQUN4RCxJQUFJLENBQUMsV0FBVyxDQUNqQixDQUFDO3dCQUNGLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQzs0QkFDaEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQzs0QkFDN0MsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQzs0QkFDbkQsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQ0FDcEMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQzs0QkFDNUQsQ0FBQzt3QkFDSCxDQUFDO29CQUNILENBQUM7b0JBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQzt3QkFDZixPQUFPLENBQUMsS0FBSyxDQUFDLDJCQUEyQixFQUFFLEtBQUssQ0FBQyxDQUFDO29CQUNwRCxDQUFDO2dCQUNILENBQUM7Z0JBQ0QsTUFBTSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDekIsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDakIsQ0FBQztvQkFBUyxDQUFDO2dCQUNULElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQ3pCLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxXQUFXO1FBQ2YsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDdEIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxRQUFRLEdBQ1osTUFBTSxjQUFjLENBQ2xCLElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUM1RCxDQUFDO1lBQ0osSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUNuRCxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDM0UsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixPQUFPLENBQUMsS0FBSyxDQUFDLHlCQUF5QixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2xELENBQUM7Z0JBQVMsQ0FBQztZQUNULElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLFNBQVM7UUFDYixJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUNoQyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzlCLE1BQU0sSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRU0sb0JBQW9CO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQzNDLE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLFVBQVUsQ0FBQyxRQUFnQjtRQUNoQyxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLFFBQVEsQ0FBQyxFQUFFLElBQUksQ0FBQztJQUNsRSxDQUFDO0lBRUQsY0FBYyxDQUFDLE1BQWM7UUFDM0IsSUFBSSxDQUFDLGtCQUFrQixHQUFHLE1BQU0sQ0FBQztRQUNqQyxJQUFJLENBQUMsc0JBQXNCO2FBQ3hCLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQzthQUN6RCxTQUFTLEVBQUUsQ0FBQztRQUNmLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNuQixDQUFDO0lBQ0QsZUFBZSxDQUFDLFdBQW1CO1FBQ2pDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQzNDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLFdBQVcsQ0FDbkMsQ0FBQztRQUNGLE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDdkMsQ0FBQztJQUVPLEtBQUssQ0FBQyxnQkFBZ0I7UUFDNUIsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUM1QixNQUFNLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUN6QixDQUFDO1FBRUQscURBQXFEO1FBQ3JELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFDL0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQztRQUNyQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7UUFDN0MsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBRXRCLHVFQUF1RTtRQUN2RSxNQUFNLElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFDO1FBRXpDLHFEQUFxRDtRQUNyRCxJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsc0JBQXNCLEdBQUcsRUFBRSxDQUFDO1FBQ2pDLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDaEIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUU5QixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMscUNBQXFDLEVBQUUsQ0FBQztRQUMvQyxDQUFDO1FBRUQsc0RBQXNEO1FBQ3RELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLEtBQUssR0FBRyxxQkFBcUIsQ0FBQyxvQkFBb0IsQ0FDckQsSUFBSSxDQUFDLElBQUksRUFDVCxJQUFJLENBQUMsYUFBYSxFQUNsQixJQUFJLENBQUMsa0JBQWtCLENBQ3hCLENBQUM7UUFDSixDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDOUMsSUFBSSxDQUFDLHFDQUFxQyxFQUFFLENBQUM7UUFDL0MsQ0FBQztRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQyxNQUFNLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBRXBDLDJDQUEyQztRQUMzQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ25CLE1BQU0sSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMxRCxDQUFDO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZO2FBQ25CLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUM7YUFDakMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFhLEVBQUUsRUFBRSxDQUN0QyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FDekMsQ0FBQztJQUNOLENBQUM7SUFFTyxxQkFBcUIsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQWE7UUFDcEQsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLENBQUMsbUJBQW1CLENBQ2pELElBQUksQ0FBQyxrQkFBa0IsRUFDdkIsSUFBSSxDQUFDLGtCQUFrQixDQUN4QixDQUFDO1FBQ0YsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUN2QixJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxpQkFBaUIsRUFBRSxDQUFDO2dCQUNqQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNsQyxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLHVCQUF1QixFQUFFLGlCQUFpQixDQUFDLENBQUM7Z0JBQ3JFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ25DLENBQUM7WUFFRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUNqRCxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLDZCQUE2QixDQUFDLEtBQUssR0FBRyxDQUNqRSxDQUFDO1lBQ0YsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDaEMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO29CQUN2QixJQUFJLEtBQUssR0FBRyxFQUFFLENBQUM7b0JBQ2YsUUFBUSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO3dCQUN6QixLQUFLLFNBQVM7NEJBQ1osS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7NEJBQzFDLE1BQU07d0JBRVI7NEJBQ0UsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUM7Z0NBQzVCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUM3QyxDQUFDLFdBQWdDLEVBQUUsRUFBRSxDQUNuQyxXQUFXLENBQUMsVUFBVSxLQUFLLGlCQUFpQixDQUMvQyxDQUFDO2dDQUNGLEtBQUssR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQzs0QkFDakQsQ0FBQztpQ0FBTSxDQUFDO2dDQUNOLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7NEJBQ3BCLENBQUM7NEJBQ0QsTUFBTTtvQkFDVixDQUFDO29CQUNELEtBQUssQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO2dCQUM3QixDQUFDLENBQUMsQ0FBQztZQUNMLENBQUM7WUFDRCxJQUFJLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUMxRCxJQUNFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFO29CQUNiLENBQUMsSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsRUFDakQsQ0FBQztvQkFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztvQkFDaEUsSUFBSSx3QkFBd0IsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQ2hFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQzNCLENBQUM7b0JBQ0YsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixDQUM1RCxJQUFJLENBQUMsSUFBSSxFQUNULHdCQUF3QixDQUN6QixDQUFDO29CQUNGLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO29CQUMxQixJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO29CQUM3QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ2xDLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFTyxTQUFTO1FBQ2YsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQzdCLElBQUksQ0FBQyxZQUFZO2lCQUNkLFNBQVMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxDQUFDO2lCQUN6QyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtnQkFDZixJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztnQkFDaEIsT0FBTyxFQUFFLENBQUM7WUFDWixDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLHFDQUFxQztRQUMzQyxJQUFJLGlCQUFpQixHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQ3BELE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJO2FBQzVDLE9BQU8sQ0FBQyxDQUFDLElBQXlDLEVBQUUsRUFBRSxDQUNyRCxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQTRCLEVBQUUsRUFBRSxDQUNyRCxPQUFPLENBQUMsUUFBUTthQUNiLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLFNBQVMsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDO2FBQzNELEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNqQixTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7WUFDNUIsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTO1lBQzVCLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVztTQUNqQyxDQUFDLENBQUMsQ0FDTixDQUNGO2FBQ0EsTUFBTSxDQUNMLENBQ0UsVUFBZ0MsRUFDaEMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBTyxFQUMxQyxFQUFFO1lBQ0YsSUFBSSxXQUFXLEVBQUUsQ0FBQztnQkFDaEIsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztvQkFDdkQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksV0FBVyxDQUFDLENBQUM7b0JBQzVELElBQUksS0FBSyxFQUFFLENBQUM7d0JBQ1YsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FDOUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLElBQUksaUJBQWlCLENBQ3pDLENBQUM7d0JBQ0YsSUFBSSxXQUFXLEVBQUUsQ0FBQzs0QkFDaEIsVUFBVSxDQUFDLFNBQVMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUM7NEJBQzFDLE1BQU07d0JBQ1IsQ0FBQztvQkFDSCxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sVUFBVSxDQUFDLFNBQVMsQ0FBQyxHQUFHLFNBQVMsQ0FBQztZQUNwQyxDQUFDO1lBQ0QsT0FBTyxVQUFVLENBQUM7UUFDcEIsQ0FBQyxFQUNELEVBQXlCLENBQzFCLENBQUM7UUFDSixJQUFJLENBQUMsb0JBQW9CLEdBQUcsb0JBQW9CLENBQUM7SUFDbkQsQ0FBQztJQUNPLG9CQUFvQjtRQUMxQixNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxtQkFBbUIsQ0FDakQsSUFBSSxDQUFDLGtCQUFrQixFQUN2QixJQUFJLENBQUMsa0JBQWtCLENBQ3hCLENBQUM7UUFDRixPQUFPLGlCQUFpQixDQUFDO0lBQzNCLENBQUM7SUFDTyxLQUFLLENBQUMsc0JBQXNCO1FBQ2xDLElBQUksQ0FBQyxhQUFhLEdBQUc7WUFDbkIsV0FBVyxFQUFFLElBQUksQ0FBQyxlQUFlO2dCQUMvQixDQUFDLENBQUMsS0FBSztnQkFDUCxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlO1lBQ3BDLFVBQVUsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWTtZQUN4RSxZQUFZLEVBQUUsSUFBSSxDQUFDLGVBQWU7Z0JBQ2hDLENBQUMsQ0FBQyxLQUFLO2dCQUNQLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVk7WUFDakMsZUFBZSxFQUNiLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZTtnQkFDOUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLElBQUksS0FBSztnQkFDdEMsQ0FBQyxDQUFDLElBQUk7Z0JBQ04sQ0FBQyxDQUFDLEtBQUs7U0FDWixDQUFDO1FBRUYsSUFBSSxDQUFDLGNBQWMsR0FBRyxNQUFNLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1FBQzlELElBQUksMkJBQTJCLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQ3hELENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMscUJBQXFCLENBQUMsRUFBRSxxQkFBcUIsQ0FDL0QsQ0FBQztRQUVGLElBQUksbUJBQW1CLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDeEQsSUFBSSx3QkFBd0IsR0FBRyxtQkFBbUIsQ0FBQyxHQUFHLENBQ3BELENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQzNCLENBQUM7UUFDRiwrQ0FBK0M7UUFDL0MsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxRSxNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FDcEUsSUFBSSxDQUFDLElBQUksRUFDVCx3QkFBd0IsQ0FDekIsQ0FBQztRQUVGLElBQUksQ0FBQyxZQUFZLEdBQUc7WUFDbEI7Z0JBQ0UsSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsS0FBSyxFQUFFO29CQUNMLFNBQVMsRUFBRSxJQUFJLENBQUMsUUFBUTt3QkFDdEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLFNBQVM7d0JBQ3BDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVztvQkFDcEIsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO29CQUNuQixhQUFhLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlO29CQUM1QyxJQUFJLEVBQUUsWUFBWSxFQUFFLHFDQUFxQztvQkFDekQsWUFBWSxFQUFFLG9CQUFvQjtvQkFDbEMsYUFBYSxFQUFFLElBQUksQ0FBQyxlQUFlO29CQUNuQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7b0JBQ3ZCLGVBQWUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxlQUFlO29CQUMxRCxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87b0JBQ3JCLFlBQVksRUFBRTt3QkFDWix1QkFBdUIsRUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsdUJBQXVCO3dCQUM5Qyx5QkFBeUIsRUFDdkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMseUJBQXlCO3FCQUNqRDtvQkFDRCxhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWE7b0JBQ2pDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLFFBQVE7b0JBQ2pDLFFBQVEsRUFBRSxJQUFJLENBQUMsVUFBVTtvQkFDekIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO29CQUNyQixlQUFlLEVBQUUsSUFBSSxDQUFDLGVBQWU7b0JBQ3JDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxpQkFBaUI7b0JBQ3pDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztvQkFDYiwyQkFBMkIsRUFBRSwyQkFBMkI7b0JBQ3hELGNBQWMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQ3RDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQzFDLEVBQUUscUNBQXFDO29CQUN4QyxlQUFlLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTtvQkFDMUMsc0JBQXNCLEVBQUUsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUN4QyxJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDO29CQUNwQyxxQkFBcUIsRUFBRSxDQUFDLEtBQWEsRUFBRSxFQUFFLENBQ3ZDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUM7aUJBQ3BDO2dCQUNELFVBQVUsRUFBRSxtQkFBbUI7YUFDaEM7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxjQUFtQjtRQUN0RCxJQUFJLFNBQWlCLENBQUM7UUFDdEIsSUFBSSxPQUFlLENBQUM7UUFDcEIsSUFBSSxRQUFRLEdBQWUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRXJDLElBQUksT0FBTyxjQUFjLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDdkMsT0FBTyxHQUFHLGNBQWMsQ0FBQztZQUN6QixTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUM5QixDQUFDO2FBQU0sQ0FBQztZQUNOLFNBQVMsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDO1lBQ2hDLE9BQU8sR0FBRyxjQUFjLENBQUMsRUFBRSxDQUFDO1lBQzVCLFFBQVEsR0FBRyxjQUFjLENBQUMsUUFBUSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDcEQsQ0FBQztRQUVELElBQUksZUFBZSxHQUFHLEtBQUssQ0FBQztRQUU1QixJQUFJLE9BQU8sR0FBRyxTQUFTLEVBQUUsQ0FBQztZQUN4QixPQUFPLENBQUMsR0FBRyxDQUNULCtEQUErRCxDQUNoRSxDQUFDO1lBQ0YsZUFBZSxHQUFHLE1BQU0sSUFBSSxDQUFDLGtDQUFrQyxDQUM3RCxTQUFTLENBQ1YsQ0FBQztRQUNKLENBQUM7YUFBTSxJQUFJLE9BQU8sR0FBRyxTQUFTLEVBQUUsQ0FBQztZQUMvQixPQUFPLENBQUMsR0FBRyxDQUFDLGlEQUFpRCxDQUFDLENBQUM7UUFDakUsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLENBQUMsR0FBRyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7UUFDdEUsQ0FBQztRQUVELElBQUksQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDO1FBRTFCLElBQUksUUFBUSxFQUFFLENBQUM7WUFDYixRQUFRLEVBQUUsQ0FBQztRQUNiLENBQUM7UUFFRCxPQUFPLGVBQWUsQ0FBQztJQUN6QixDQUFDO0lBRU8sS0FBSyxDQUFDLGtDQUFrQyxDQUM5QyxnQkFBd0I7UUFFeEIsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUM5QyxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFRCxJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ3pDLElBQ0UsQ0FBQyxDQUFDLG1CQUFtQjtnQkFDckIsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLHFCQUFxQixFQUMzQyxDQUFDO2dCQUNELE1BQU0sYUFBYSxHQUNqQixJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQywyQkFBMkIsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDcEUsSUFDRSxhQUFhO29CQUNiLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEVBQy9ELENBQUM7b0JBQ0QsT0FBTyxJQUFJLENBQUM7Z0JBQ2QsQ0FBQztnQkFDRCxPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLHFCQUFxQixDQUM5RCxhQUFhLEVBQ2IsZ0JBQWdCLENBQ2pCLENBQUM7UUFFRixJQUFJLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDN0IsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsSUFBSSxDQUFDO1lBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDdEIsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1lBRUQsOENBQThDO1lBQzlDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUM7WUFDakMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7WUFFdEIsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLENBQzVELFdBQVcsRUFDWCxJQUFJLENBQUMsV0FBVyxFQUNoQixDQUFDLElBQUksRUFBRSxFQUFFO2dCQUNQLE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxtQkFBbUIsQ0FDOUMsNEJBQTRCLEVBQzVCLElBQUksQ0FBQyxZQUFZLEVBQ2pCLElBQUksQ0FBQyxrQkFBa0IsQ0FDeEIsQ0FBQztnQkFDRixJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsSUFBSSxJQUFJLENBQUM7WUFDL0MsQ0FBQyxDQUNGLENBQUM7WUFFRixJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDbkIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO2dCQUNwRCwrRUFBK0U7Z0JBQy9FLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE9BQU8sQ0FBQyxLQUFLLENBQUMsa0NBQWtDLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNoRSxJQUFJLENBQUMsb0JBQW9CLEdBQUcsS0FBSyxDQUFDO2dCQUNsQyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztnQkFDdkIsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1FBQ0gsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixPQUFPLENBQUMsS0FBSyxDQUFDLGlDQUFpQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3hELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxLQUFLLENBQUM7WUFDbEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDdkIsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQztJQUVPLHFCQUFxQixDQUFDLEtBQWE7UUFDekMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3BDLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzFELElBQUksQ0FBQyx1Q0FBdUMsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM3RCxDQUFDO0lBQ0gsQ0FBQztJQUVPLHVDQUF1QyxDQUFDLEVBQVE7UUFDdEQsRUFBRSxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQyxFQUFPLEVBQUUsRUFBRTtZQUNsQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDbkQsSUFBSSxhQUFhLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO2dCQUNqRCxJQUFJLGFBQWEsRUFBRSxDQUFDO29CQUNsQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsYUFBYSxDQUFDLENBQUM7b0JBQ3hELEVBQUUsQ0FBQyxZQUFZLEdBQUcsR0FBRyxDQUFDO2dCQUN4QixDQUFDO3FCQUFNLENBQUM7b0JBQ04sSUFBSSxtQkFBbUIsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLDZCQUE2QixDQUFDLENBQUM7b0JBQ2xFLElBQUksbUJBQW1CLEVBQUUsQ0FBQzt3QkFDeEIsTUFBTSxLQUFLLEdBQ1QsSUFBSSxDQUFDLDZCQUE2QixDQUFDLG1CQUFtQixDQUFDLENBQUM7d0JBQzFELElBQUksS0FBSyxFQUFFLENBQUM7NEJBQ1YsSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7Z0NBQ3RCLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7Z0NBQ3RELEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7b0NBQ3ZELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUM3QixDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxLQUFLLENBQUMsV0FBVyxDQUNqQyxDQUFDO29DQUNGLElBQUksS0FBSyxFQUFFLENBQUM7d0NBQ1YsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FDOUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLElBQUksaUJBQWlCLENBQ3pDLENBQUM7d0NBQ0YsSUFBSSxXQUFXLEVBQUUsQ0FBQzs0Q0FDaEIsRUFBRSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDOzRDQUNwQyxNQUFNO3dDQUNSLENBQUM7b0NBQ0gsQ0FBQztnQ0FDSCxDQUFDOzRCQUNILENBQUM7aUNBQU0sQ0FBQztnQ0FDTixFQUFFLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUM7NEJBQ3BDLENBQUM7d0JBQ0gsQ0FBQzs2QkFBTSxDQUFDOzRCQUNOLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDOzRCQUM5RCxFQUFFLENBQUMsWUFBWSxHQUFHLEdBQUcsQ0FBQzt3QkFDeEIsQ0FBQztvQkFDSCxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLHVDQUF1QyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ25ELENBQUM7WUFDRCxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDcEIsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNsQyxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sNkJBQTZCLENBQUMsU0FBaUI7UUFDckQsSUFBSSxXQUFXLEdBQVEsU0FBUyxDQUFDO1FBQ2pDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFO2dCQUNyQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7b0JBQ2pCLENBQUMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUU7d0JBQzdCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQzs0QkFDakIsV0FBVyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUM1QixDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQ3RDLENBQUM7NEJBQ0YsSUFBSSxXQUFXLEVBQUUsQ0FBQztnQ0FDaEIsT0FBTyxXQUFXLENBQUM7NEJBQ3JCLENBQUM7d0JBQ0gsQ0FBQztvQkFDSCxDQUFDLENBQUMsQ0FBQztnQkFDTCxDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQztJQUVPLHVCQUF1QixDQUFDLE9BQWU7UUFDN0MsSUFBSSxVQUFVLEdBQVEsU0FBUyxDQUFDO1FBQ2hDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO2dCQUMzQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7b0JBQ2hCLEdBQUcsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUU7d0JBQzlCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQzs0QkFDaEIsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDOzRCQUNsQyxJQUFJLEtBQUssRUFBRSxDQUFDO2dDQUNWLFVBQVUsR0FBRyxLQUFLLENBQUM7NEJBQ3JCLENBQUM7d0JBQ0gsQ0FBQztvQkFDSCxDQUFDLENBQUMsQ0FBQztnQkFDTCxDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVPLHNCQUFzQjtRQUM1QixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQzNDLElBQUksQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUFDLEVBQUUsQ0FBQztnQkFDOUMsTUFBTSxPQUFPLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FDckIscUJBQXFCLENBQ0ssQ0FBQztnQkFDN0IsSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLHFCQUFxQixFQUFFLENBQUM7b0JBQzdDLE1BQU0sYUFBYSxHQUNqQixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQywyQkFBMkIsQ0FBQyxFQUFFLEVBQUUsQ0FBQztvQkFDdEQsSUFDRSxhQUFhO3dCQUNiLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEVBQ2pELENBQUM7d0JBQ0QsT0FBTyxJQUFJLENBQUM7b0JBQ2QsQ0FBQztvQkFDRCxPQUFPLEtBQUssQ0FBQztnQkFDZixDQUFDO1lBQ0gsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFTyxLQUFLLENBQUMsMEJBQTBCO1FBQ3RDLElBQUksQ0FBQywwQkFBMEIsR0FBRyxFQUFFLENBQUM7UUFDckMsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDekIsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDMUMsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNqQyxDQUFDO2FBQU0sQ0FBQztZQUNOLDZDQUE2QztZQUM3QyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzFFLE9BQU8sTUFBTSxPQUFPLENBQUMsR0FBRyxDQUN0QixZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQ3hCLE9BQU8sSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2hELENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FDVCxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFTyxLQUFLLENBQUMsMkJBQTJCLENBQ3ZDLElBQWM7UUFFZCxJQUFJLGdCQUFnQixHQUFzQixFQUFFLENBQUM7UUFFN0MsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbEUsZ0JBQWdCLEdBQUcsTUFBTSxJQUFJLENBQUMsNEJBQTRCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkUsQ0FBQzthQUFNLENBQUM7WUFDTixnQkFBZ0IsR0FBRztnQkFDakIsS0FBSyxFQUFFO29CQUNMLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSTtvQkFDaEIsV0FBVyxFQUFFLElBQUksQ0FBQyxJQUFJO29CQUN0QixPQUFPLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7b0JBQzVDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxtQkFBbUI7b0JBQzdDLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVTtpQkFDeEI7Z0JBQ0QsVUFBVSxFQUFFLE1BQU0sSUFBSSxDQUFDLDRCQUE0QixDQUNqRCxJQUFJLEVBQ0osSUFBSSxDQUFDLFFBQVEsQ0FDZDthQUNGLENBQUM7WUFFRixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDdEIsZ0JBQWdCLENBQUMsS0FBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEtBQUssQ0FBQyxtQkFBbUIsQ0FDMUQsTUFBTSxFQUNOLElBQUksQ0FBQyxZQUFZLEVBQ2pCLElBQUksQ0FBQyxrQkFBa0IsQ0FDeEIsQ0FBQztnQkFDRixnQkFBZ0IsQ0FBQyxLQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsS0FBSyxDQUFDLG1CQUFtQixDQUNoRSxhQUFhLEVBQ2IsSUFBSSxDQUFDLFlBQVksRUFDakIsSUFBSSxDQUFDLGtCQUFrQixDQUN4QixDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLGdCQUFnQixJQUFJLGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDO1lBQy9DLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUNoRCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUUscUJBQXFCLEVBQUUsQ0FBQztZQUNwRCxJQUFJLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUNsQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsMkJBQTJCLENBQ3JELENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxnQkFBZ0IsQ0FBQztJQUMxQixDQUFDO0lBRUQsc0JBQXNCLENBQUMsU0FBaUIsRUFBRSxLQUFVO1FBQ2xELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRUQsbUJBQW1CLENBQ2pCLE1BQXVDLEVBQ3ZDLEdBQVcsRUFDWCxLQUFVO1FBRVYsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPLEtBQUssQ0FBQztRQUUxQixLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQzNCLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxHQUFHLEVBQUUsQ0FBQztnQkFDdEIsSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7b0JBQ3RCLEtBQUssQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO29CQUN2RCxPQUFPLElBQUksQ0FBQztnQkFDZCxDQUFDO1lBQ0gsQ0FBQztZQUVELElBQUksS0FBSyxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO2dCQUN4RCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ3JFLElBQUksS0FBSztvQkFBRSxPQUFPLElBQUksQ0FBQztZQUN6QixDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVPLEtBQUssQ0FBQyw0QkFBNEIsQ0FDeEMsSUFBYztRQUVkLE1BQU0sWUFBWSxHQUFzQjtZQUN0QyxLQUFLLEVBQUU7Z0JBQ0wsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJO2dCQUNoQixPQUFPLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7Z0JBQzVDLFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSTthQUNwQjtZQUNELFVBQVUsRUFBRSxFQUFFO1NBQ2YsQ0FBQztRQUVGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDMUMsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTNELElBQUksV0FBVyxFQUFFLENBQUM7WUFDaEIsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ3RCLElBQUksTUFBTSxHQUFRLEVBQUUsQ0FBQztnQkFDckIsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFtQixFQUFFLEVBQUU7b0JBQ2hELE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLGVBQWUsQ0FDckMsRUFBRSxDQUFDLE1BQU0sRUFDVCxJQUFJLENBQUMsa0JBQWtCLENBQ3hCLENBQUM7Z0JBQ0osQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsV0FBVyxDQUFDLEtBQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxNQUFNLENBQUM7Z0JBQ3RDLFdBQVcsQ0FBQyxLQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLG1CQUFtQixDQUNwRCxNQUFNLEVBQ04sSUFBSSxDQUFDLFlBQVksRUFDakIsSUFBSSxDQUFDLGtCQUFrQixDQUN4QixDQUFDO2dCQUNGLFdBQVcsQ0FBQyxLQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsS0FBSyxDQUFDLG1CQUFtQixDQUMzRCxhQUFhLEVBQ2IsSUFBSSxDQUFDLFlBQVksRUFDakIsSUFBSSxDQUFDLGtCQUFrQixDQUN4QixDQUFDO2dCQUNGLFlBQVksQ0FBQyxLQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsS0FBSyxDQUFDLG1CQUFtQixDQUN0RCxNQUFNLEVBQ04sSUFBSSxDQUFDLFlBQVksRUFDakIsSUFBSSxDQUFDLGtCQUFrQixDQUN4QixDQUFDO2dCQUNGLFlBQVksQ0FBQyxLQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsS0FBSyxDQUFDLG1CQUFtQixDQUM1RCxhQUFhLEVBQ2IsSUFBSSxDQUFDLFlBQVksRUFDakIsSUFBSSxDQUFDLGtCQUFrQixDQUN4QixDQUFDO1lBQ0osQ0FBQztZQUNELFdBQVcsQ0FBQyxLQUFNLENBQUMsZUFBZSxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztZQUN6RCxZQUFZLENBQUMsVUFBVyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBRUQsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQztJQUVPLGdCQUFnQixDQUFDLElBQWMsRUFBRSxZQUErQjtRQUN0RSxJQUFJLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN2QixZQUFZLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDdkMsWUFBWSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQzNDLFlBQVksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUMvQyxZQUFZLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDakQsWUFBWSxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztRQUN2RSxDQUFDO0lBQ0gsQ0FBQztJQUVPLHFCQUFxQixDQUFDLElBQWM7UUFDMUMsT0FBTztZQUNMLElBQUksRUFBRSx1QkFBdUI7WUFDN0IsS0FBSyxFQUFFO2dCQUNMLFNBQVMsRUFBRSxJQUFJLENBQUMsV0FBVztnQkFDM0IsUUFBUSxFQUFFLElBQUk7Z0JBQ2QsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO2dCQUNuQixHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7Z0JBQ2IsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO2dCQUNmLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSTtnQkFDckIsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLO2dCQUMxQixLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQVUsRUFBRSxFQUFFO29CQUMxQixJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQzt3QkFDeEIsTUFBTSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztvQkFDbEMsQ0FBQztnQkFDSCxDQUFDO2FBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLDZCQUE2QixDQUNuQyxXQUF3QjtRQUV4QixPQUFPO1lBQ0wsSUFBSSxFQUFFLHFDQUFxQztZQUMzQyxLQUFLLEVBQUU7Z0JBQ0wsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZTtnQkFDcEMsU0FBUyxFQUFFLElBQUksQ0FBQyxXQUFXO2dCQUMzQixXQUFXLEVBQUUsV0FBVztnQkFDeEIsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO2dCQUNiLGFBQWEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVM7Z0JBQ3RDLE9BQU8sRUFBRSxJQUFJLENBQUMsa0JBQWtCO2FBQ2pDO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTyx5QkFBeUIsQ0FDL0IsV0FBd0I7UUFFeEIsT0FBTztZQUNMLElBQUksRUFBRSxpQ0FBaUM7WUFDdkMsS0FBSyxFQUFFO2dCQUNMLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWU7Z0JBQ3BDLFNBQVMsRUFBRSxJQUFJLENBQUMsV0FBVztnQkFDM0IsV0FBVyxFQUFFLFdBQVc7Z0JBQ3hCLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztnQkFDYixhQUFhLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTO2dCQUN0QyxPQUFPLEVBQUUsSUFBSSxDQUFDLGtCQUFrQjthQUNqQztTQUNGLENBQUM7SUFDSixDQUFDO0lBRU8sMkJBQTJCLENBQ2pDLFdBQXdCO1FBRXhCLE9BQU87WUFDTCxJQUFJLEVBQUUsbUNBQW1DO1lBQ3pDLEtBQUssRUFBRTtnQkFDTCxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlO2dCQUNwQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFdBQVc7Z0JBQzNCLFdBQVcsRUFBRSxXQUFXO2dCQUN4QixHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7Z0JBQ2IsYUFBYSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUztnQkFDdEMsT0FBTyxFQUFFLElBQUksQ0FBQyxrQkFBa0I7YUFDakM7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLDZCQUE2QixDQUFDLElBQWM7UUFDbEQsT0FBTztZQUNMLElBQUksRUFBRSxxQ0FBcUM7WUFDM0MsS0FBSyxFQUFFO2dCQUNMLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWU7Z0JBQ3BDLFNBQVMsRUFBRSxJQUFJLENBQUMsV0FBVztnQkFDM0IsUUFBUSxFQUFFLElBQUk7Z0JBQ2QsYUFBYSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUztnQkFDdEMsT0FBTyxFQUFFLElBQUksQ0FBQyxrQkFBa0I7Z0JBQ2hDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBVSxFQUFFLEVBQUU7b0JBQzFCLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO3dCQUN4QixNQUFNLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO29CQUNsQyxDQUFDO2dCQUNILENBQUM7YUFDRjtTQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsS0FBSyxDQUFDLGtCQUFrQjtRQUN0QixNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2xFLElBQUksZ0JBQWdCLElBQUksZ0JBQWdCLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUMzRCxNQUFNLGdCQUFnQixDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDN0MsQ0FBQztJQUNILENBQUM7SUFFTywyQkFBMkIsQ0FBQyxJQUFjO1FBQ2hELElBQUksTUFBTSxHQUFRLEVBQUUsQ0FBQztRQUNyQixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUN2QyxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDMUIsTUFBTSxDQUFDLEdBQUcsQ0FBQztvQkFDVCxJQUFJLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FDckIsQ0FBQyxDQUEwQixFQUFFLEVBQUUsQ0FDN0IsQ0FBQyxDQUFDLFdBQVcsS0FBSyxJQUFJLENBQUMsa0JBQWtCLENBQzVDLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNuQixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPO1lBQ0wsSUFBSSxFQUFFLDZCQUE2QjtZQUNuQyxLQUFLLEVBQUU7Z0JBQ0wsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZTtnQkFDcEMsU0FBUyxFQUFFLElBQUksQ0FBQyxXQUFXO2dCQUMzQixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7Z0JBQ3pCLFFBQVEsRUFBRSxJQUFJO2dCQUNkLE1BQU0sRUFBRSxNQUFNO2dCQUNkLE9BQU8sRUFBRSxJQUFJLENBQUMsa0JBQWtCO2FBQ2pDO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFDTyx1QkFBdUIsQ0FBQyxJQUFjO1FBQzVDLElBQUksYUFBYSxHQUFRLEVBQUUsQ0FBQztRQUU1QixJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFVLEVBQUUsRUFBRTtnQkFDN0MsYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsZUFBZSxDQUMvQyxLQUFLLENBQUMsWUFBWSxFQUNsQixJQUFJLENBQUMsa0JBQWtCLENBQ3hCLENBQUM7WUFDSixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCxPQUFPO1lBQ0wsSUFBSSxFQUFFLGdCQUFnQjtZQUN0QixLQUFLLEVBQUU7Z0JBQ0wsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO2dCQUNuQixRQUFRLEVBQUUsSUFBSSxDQUFDLElBQUk7Z0JBQ25CLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVTtnQkFDdkIsU0FBUyxFQUFFLElBQUksQ0FBQyxXQUFXLElBQUksS0FBSyxDQUFDLFlBQVksRUFBRTtnQkFDbkQsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZTtnQkFDcEMsYUFBYSxFQUFFLGFBQWE7Z0JBQzVCLEtBQUssRUFBRSxDQUFDLEtBQVUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUM7YUFDM0Q7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLG9CQUFvQixDQUFDLElBQWM7UUFDekMsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FDcEQsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssNEJBQTRCLENBQ3BELENBQUM7UUFFRixNQUFNLHdCQUF3QixHQUM1QixzQkFBc0IsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUNsQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsS0FBSyxJQUFJLENBQUMsa0JBQWtCLENBQ3RELEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUVqQixPQUFPO1lBQ0wsSUFBSSxFQUFFLGlDQUFpQztZQUN2QyxLQUFLLEVBQUU7Z0JBQ0wsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRO2dCQUNwQixPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVM7Z0JBQ3ZCLFNBQVMsRUFBRSxJQUFJLENBQUMsV0FBVztnQkFDM0IsR0FBRyxFQUFFLElBQUksRUFBRSx5Q0FBeUM7Z0JBQ3BELFdBQVcsRUFBRSxJQUFJLENBQUMsYUFBYTtnQkFDL0IsWUFBWSxFQUFFLEVBQUU7Z0JBQ2hCLFFBQVEsRUFBRSxJQUFJLENBQUMsVUFBVTtnQkFDekIseUJBQXlCLEVBQUUsSUFBSSxDQUFDLGtCQUFrQjtnQkFDbEQsV0FBVyxFQUFFLElBQUksQ0FBQyxhQUFhO2dCQUMvQixVQUFVLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxhQUFhLElBQUksQ0FBQztnQkFDM0MsY0FBYyxFQUFFLHdCQUF3QjtnQkFDeEMsWUFBWSxFQUFFLEtBQUssSUFBSSxFQUFFO29CQUN2QixJQUFJLENBQUMsY0FBYyxHQUFHLHdCQUF3QixDQUFDO29CQUMvQyxNQUFNLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxxQkFBcUIsQ0FDOUQsSUFBSSxDQUFDLFdBQVcsQ0FDakIsQ0FBQztnQkFDSixDQUFDO2FBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLDJCQUEyQixDQUFDLElBQWM7UUFDaEQsT0FBTztZQUNMLElBQUksRUFBRSw4QkFBOEI7WUFDcEMsS0FBSyxFQUFFO2dCQUNMLFFBQVEsRUFBRSxJQUFJO2dCQUNkLFNBQVMsRUFBRSxJQUFJLENBQUMsV0FBVztnQkFDM0IsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO2dCQUNuQixLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQVUsRUFBRSxFQUFFO29CQUMxQixJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQzt3QkFDeEIsTUFBTSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztvQkFDbEMsQ0FBQztnQkFDSCxDQUFDO2FBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLDBCQUEwQixDQUFDLElBQWM7UUFDL0MsT0FBTztZQUNMLElBQUksRUFBRSxvQkFBb0I7WUFDMUIsS0FBSyxFQUFFO2dCQUNMLFNBQVMsRUFBRSxJQUFJLENBQUMsV0FBVztnQkFDM0IsUUFBUSxFQUFFLElBQUk7Z0JBQ2QsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO2dCQUNiLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtnQkFDdkIsT0FBTyxFQUFFLElBQUksQ0FBQyxrQkFBa0I7Z0JBQ2hDLEtBQUssRUFBRSxDQUFDLEtBQVUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDO2FBQ3pEO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTyxzQkFBc0IsQ0FBQyxJQUFjO1FBQzNDLE9BQU87WUFDTCxJQUFJLEVBQUUsb0JBQW9CO1lBQzFCLEtBQUssRUFBRTtnQkFDTCxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7Z0JBQzNCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtnQkFDbkIsU0FBUyxFQUFFLElBQUksQ0FBQyxXQUFXO2dCQUMzQixRQUFRLEVBQUUsSUFBSTtnQkFDZCxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7Z0JBQ2IsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO2dCQUN2QixPQUFPLEVBQUUsSUFBSSxDQUFDLGtCQUFrQjthQUNqQztTQUNGLENBQUM7SUFDSixDQUFDO0lBRU8sNEJBQTRCLENBQUMsSUFBYztRQUNqRCwwREFBMEQ7UUFDMUQscUVBQXFFO1FBQ3JFLE9BQU87WUFDTCxJQUFJLEVBQUUscUJBQXFCO1lBQzNCLEtBQUssRUFBRTtnQkFDTCxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7Z0JBQzNCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtnQkFDbkIsU0FBUyxFQUFFLElBQUksQ0FBQyxXQUFXO2dCQUMzQixRQUFRLEVBQUUsSUFBSSxFQUFFLDRDQUE0QztnQkFDNUQsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO2dCQUNiLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtnQkFDdkIsT0FBTyxFQUFFLElBQUksQ0FBQyxrQkFBa0I7Z0JBQ2hDLE1BQU0sRUFBRTtvQkFDTixjQUFjLEVBQUUsS0FBSyxDQUFDLGVBQWUsQ0FDbkMsSUFBSSxDQUFDLE1BQU0sRUFBRSwwQkFBMEIsSUFBSSxFQUFFLEVBQzdDLElBQUksQ0FBQyxrQkFBa0IsQ0FDeEI7b0JBQ0QsY0FBYyxFQUFFLEtBQUssQ0FBQyxlQUFlLENBQ25DLElBQUksQ0FBQyxNQUFNLEVBQUUsMEJBQTBCLElBQUksRUFBRSxFQUM3QyxJQUFJLENBQUMsa0JBQWtCLENBQ3hCO29CQUNELG1CQUFtQixFQUFFLEtBQUssQ0FBQyxlQUFlLENBQ3hDLElBQUksQ0FBQyxNQUFNLEVBQUUsK0JBQStCLElBQUksRUFBRSxFQUNsRCxJQUFJLENBQUMsa0JBQWtCLENBQ3hCO29CQUNELGlCQUFpQixFQUFFLEtBQUssQ0FBQyxlQUFlLENBQ3RDLElBQUksQ0FBQyxNQUFNLEVBQUUsNkJBQTZCLElBQUksRUFBRSxFQUNoRCxJQUFJLENBQUMsa0JBQWtCLENBQ3hCO29CQUNELGdCQUFnQixFQUFFLEtBQUssQ0FBQyxlQUFlLENBQ3JDLElBQUksQ0FBQyxNQUFNLEVBQUUsNEJBQTRCLElBQUksRUFBRSxFQUMvQyxJQUFJLENBQUMsa0JBQWtCLENBQ3hCO2lCQUNGO2dCQUNELEtBQUssRUFBRSxDQUFDLEtBQVUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUM7YUFDNUQ7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLHVCQUF1QixDQUFDLElBQWM7UUFDNUMsT0FBTztZQUNMLElBQUksRUFBRSxlQUFlO1lBQ3JCLEtBQUssRUFBRTtnQkFDTCxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07Z0JBQ25CLFFBQVEsRUFBRSxJQUFJO2dCQUNkLFNBQVMsRUFBRSxJQUFJLENBQUMsV0FBVztnQkFDM0IsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZTthQUNyQztTQUNGLENBQUM7SUFDSixDQUFDO0lBRU8sNkJBQTZCLENBQ25DLElBQWM7UUFFZCxRQUFRLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNsQixLQUFLLFFBQVEsQ0FBQyxHQUFHO2dCQUNmLENBQUM7b0JBQ0MsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3pDLENBQUM7Z0JBQ0QsTUFBTTtZQUNSLEtBQUssUUFBUSxDQUFDLEtBQUssQ0FBQztZQUNwQixLQUFLLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUNwQixPQUFPLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNoRCxDQUFDO1lBQ0QsS0FBSyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDckIsa0VBQWtFO2dCQUNsRSxzREFBc0Q7Z0JBQ3RELE9BQU8sU0FBUyxDQUFDO1lBQ25CLENBQUM7WUFDRCxLQUFLLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNyQixPQUFPLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxDQUFDO1lBQ0QsS0FBSyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO2dCQUMvQixPQUFPLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsRCxDQUFDO1lBQ0QsS0FBSyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDbkIsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDMUMsQ0FBQztZQUNELEtBQUssUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hCLE9BQU8sSUFBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQy9DLENBQUM7WUFDRCxLQUFLLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNyQixPQUFPLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxDQUFDO1lBQ0QsS0FBSyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztnQkFDeEIsT0FBTyxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDaEQsQ0FBQztZQUNELEtBQUssUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQ3RCLE9BQU8sSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2hELENBQUM7WUFDRCxLQUFLLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUNwQixPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMzQyxDQUFDO1lBQ0QsS0FBSyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztnQkFDMUIsT0FBTyxJQUFJLENBQUMsNEJBQTRCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDakQsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsZUFBZSxDQUFDLE9BQVksRUFBRSxJQUFjO1FBQzFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRU8sV0FBVyxDQUFDLEtBQVUsRUFBRSxJQUFjO1FBQzVDLE9BQU8sQ0FBQyxHQUFHLENBQUMsc0JBQXNCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxLQUFVLEVBQUUsSUFBYztRQUNuRCxPQUFPLENBQUMsR0FBRyxDQUFDLDZCQUE2QixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2xELElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3hCLDJDQUEyQztZQUMzQyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDakMsNEJBQTRCO1lBQzVCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdEMsQ0FBQztJQUNILENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxLQUFVLEVBQUUsSUFBYztRQUNsRCxPQUFPLENBQUMsR0FBRyxDQUFDLHNCQUFzQixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzNDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzVDLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUNyQyxDQUFDLENBQXFCLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FDdkQsQ0FBQztRQUNGLFlBQVksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUMzQixDQUFDLENBS0EsRUFBRSxFQUFFO1lBQ0gsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQ2hCLENBQUMsQ0FHQSxFQUFFLEVBQUU7Z0JBQ0gsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7b0JBQ2hCLE1BQU0sS0FBSyxHQUFHO3dCQUNaLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFOzRCQUNiLEtBQUssRUFBRSxDQUFDLENBQUMsU0FBUzt5QkFDbkI7cUJBQ0YsQ0FBQztvQkFFRixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO3dCQUNwQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDOUIsQ0FBQzt5QkFBTSxDQUFDO3dCQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7b0JBQ2xFLENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUMsQ0FDRixDQUFDO1FBQ0osQ0FBQyxDQUNGLENBQUM7UUFFRixJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVELHFCQUFxQixDQUFDLElBQWM7UUFDbEMsSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDcEUsS0FBSyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQ3ZFLENBQUM7UUFFRixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDckIsZUFBZSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLElBQUksQ0FDckQsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxJQUFJLENBQUMsVUFBVSxDQUN2RCxDQUFDO1FBQ0osQ0FBQztRQUVELElBQUksZUFBZSxFQUFFLENBQUM7WUFDcEIsZUFBZSxDQUFDLEtBQUssR0FBRztnQkFDdEIsR0FBRyxlQUFlLENBQUMsS0FBSztnQkFDeEIsZUFBZSxFQUFFLEtBQUs7YUFDdkIsQ0FBQztZQUNGLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNsQyxDQUFDO0lBQ0gsQ0FBQztJQUVPLGNBQWM7UUFDcEIsTUFBTSxXQUFXLEdBQUcsYUFBYSxDQUFDLG9CQUFvQixDQUNwRCxJQUFJLENBQUMsTUFBTSxFQUNYLElBQUksQ0FBQyxlQUFlLENBQ3JCLENBQUM7UUFFRixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxRCxZQUFZLENBQUMsRUFBRSxHQUFHLGNBQWMsQ0FBQztRQUNqQyxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3ZELElBQUksTUFBTSxFQUFFLENBQUM7WUFDWCxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ25ELENBQUM7UUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FDdkIsWUFBWSxFQUNaLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FDNUQsQ0FBQztRQUNGLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVELEtBQUssQ0FBQyw0QkFBNEIsQ0FDaEMsSUFBMEIsRUFDMUIsUUFBdUI7UUFFdkIsTUFBTSxZQUFZLEdBQXdCLEVBQUUsQ0FBQztRQUU3QyxLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxRQUFRLElBQUksS0FBSyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUNqRSxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDaEMsSUFBSSxxQkFBcUIsR0FBUSxFQUFFLENBQUM7WUFDcEMsSUFBSSxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDN0IscUJBQXFCLEdBQUc7b0JBQ3RCLElBQUksRUFBRSxXQUFXO29CQUNqQixLQUFLLEVBQUU7d0JBQ0wsS0FBSyxFQUNILE9BQU8sQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUN4QixDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsS0FBSyxJQUFJLENBQUMsa0JBQWtCLENBQ3RELEVBQUUsS0FBSyxJQUFJLEVBQUU7d0JBRWhCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtxQkFDcEI7aUJBQ0YsQ0FBQztZQUNKLENBQUM7WUFFRCxJQUFJLE9BQU8sQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO2dCQUNqQyxxQkFBcUIsR0FBRztvQkFDdEIsR0FBRyxxQkFBcUI7b0JBQ3hCLElBQUksRUFBRSxXQUFXO29CQUNqQixLQUFLLEVBQUU7d0JBQ0wsR0FBRyxxQkFBcUIsQ0FBQyxLQUFLO3dCQUM5QixhQUFhLEVBQUUsT0FBTyxDQUFDLG9CQUFvQjtxQkFDNUM7aUJBQ0YsQ0FBQztZQUNKLENBQUM7WUFFRCxJQUFJLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO2dCQUNoQyxJQUFJLENBQUMsc0NBQXNDLENBQ3pDLE9BQU8sQ0FBQyxtQkFBbUIsRUFDM0IscUJBQXFCLENBQ3RCLENBQUM7WUFDSixDQUFDO1lBQ0QsWUFBWSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1lBRXpDLE1BQU0sbUJBQW1CLEdBQXNCO2dCQUM3QyxJQUFJLEVBQUUsZ0JBQWdCO2dCQUN0QixLQUFLLEVBQUU7b0JBQ0wsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO29CQUNwQixXQUFXLEVBQ1QsT0FBTyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQ3hCLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxLQUFLLElBQUksQ0FBQyxrQkFBa0IsQ0FDdEQsRUFBRSxLQUFLLElBQUksRUFBRTtvQkFDaEIsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO2lCQUNwQjtnQkFDRCxVQUFVLEVBQUUsTUFBTSxJQUFJLENBQUMsNEJBQTRCLENBQ2pELElBQUksRUFDSixPQUFPLENBQUMsUUFBUSxJQUFJLEVBQUUsRUFDdEIsT0FBTyxDQUFDLG9CQUFvQixJQUFJLEVBQUUsQ0FDbkM7Z0JBQ0QsbUJBQW1CLEVBQUUsY0FBYzthQUNwQyxDQUFDO1lBQ0YsSUFBSSxPQUFPLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztnQkFDaEMsSUFBSSxDQUFDLHNDQUFzQyxDQUN6QyxPQUFPLENBQUMsbUJBQW1CLEVBQzNCLG1CQUFtQixDQUNwQixDQUFDO1lBQ0osQ0FBQztZQUVELFlBQVksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUN6QyxDQUFDO1FBRUQsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQztJQUVELEtBQUssQ0FBQyxlQUFlO1FBQ25CLElBQUksZ0JBQWdCLEdBQXNCLEVBQUUsQ0FBQztRQUM3QyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN2QyxnQkFBZ0IsR0FBRztnQkFDakIsS0FBSyxFQUFFO2dCQUNMLG9CQUFvQjtnQkFDcEIsZ0RBQWdEO2dCQUNoRCxrREFBa0Q7aUJBQ25EO2dCQUNELFVBQVUsRUFBRSxNQUFNLElBQUksQ0FBQyw0QkFBNEIsQ0FDakQsU0FBUyxFQUNULElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUN0QjthQUNGLENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxnQkFBZ0IsQ0FBQztJQUMxQixDQUFDO0lBRUQsZ0NBQWdDLENBQzlCLFVBQStCLEVBQy9CLE1BQXlCO1FBRXpCLElBQUksTUFBTSxDQUFDLFVBQVUsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN0RCxJQUFJLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ2pELFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDMUIsQ0FBQztJQUNILENBQUM7SUFFRCx3QkFBd0IsQ0FBQyxVQUErQjtRQUN0RCxNQUFNLGVBQWUsR0FBRyxFQUFFLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQztRQUMvQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDdkIsQ0FBQyxDQUFDLFNBQVMsR0FBRyxNQUFNLEdBQUcsZUFBZSxDQUFDO1FBQ3pDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELHNCQUFzQixDQUFDLG1CQUEyQjtRQUNoRCxNQUFNLFlBQVksR0FBRyxFQUFFLENBQUMsQ0FBQyxpQkFBaUI7UUFDMUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLG1CQUFtQixHQUFHLEdBQUcsQ0FBQyxHQUFHLFlBQVksQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sU0FBUyxHQUFHLG9CQUFvQixJQUFJLEVBQUUsQ0FBQztRQUU3QyxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDOUMsS0FBSyxDQUFDLElBQUksR0FBRyxVQUFVLENBQUM7WUFDeEIsS0FBSyxDQUFDLEVBQUUsR0FBRyxTQUFTLENBQUM7WUFDckIsS0FBSyxDQUFDLFNBQVMsR0FBRztXQUNiLFNBQVM7OEJBQ1UsSUFBSTs7T0FFM0IsQ0FBQztZQUNGLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25DLENBQUM7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsbUJBQW1CLENBQUMsSUFBWTtRQUM5QixPQUFPO1lBQ0wsSUFBSSxFQUFFLFlBQVk7WUFDbEIsU0FBUyxFQUFFLG9CQUFvQixJQUFJLEVBQUU7WUFDckMsS0FBSyxFQUFFO2dCQUNMLEtBQUssRUFBRSxFQUFFO2dCQUNULFFBQVEsRUFBRSxJQUFJO2dCQUNkLElBQUksRUFBRSxJQUFJO2FBQ1g7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLEtBQUssQ0FBQyw0QkFBNEIsQ0FDeEMsSUFBMEIsRUFDMUIsUUFBdUIsRUFDdkIsb0JBQTJDO1FBRTNDLE1BQU0sTUFBTSxHQUF3QixFQUFFLENBQUM7UUFDdkMsSUFBSSxRQUFRLEdBQTBDLEVBQUUsQ0FBQztRQUN6RCxRQUFRLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUM7UUFFdEQsMENBQTBDO1FBQzFDLFFBQVEsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDL0IsZ0RBQWdEO1lBQ2hELElBQ0UsQ0FBQyxDQUFDLElBQUksS0FBSyxlQUFlLENBQUMsVUFBVTtnQkFDckMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLEVBQUUsY0FBYztnQkFFdEMsT0FBTyxLQUFLLENBQUM7WUFDZixPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxVQUFVLEdBQUcsS0FBSyxFQUN0QixLQUE0QyxFQUM1QyxFQUFFO1lBQ0YsTUFBTSxNQUFNLEdBQXdCLEVBQUUsQ0FBQztZQUN2QyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDakIsTUFBTSxLQUFLLEdBQXdCLEVBQUUsQ0FBQztZQUN0QyxNQUFNLElBQUksR0FHSixFQUFFLENBQUM7WUFDVCxJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7WUFDYixLQUFLLE1BQU0sQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUN0QixJQUFJLDZCQUE2QixJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztvQkFDaEQsS0FBSyxDQUFDLElBQUksQ0FDUixNQUFNLElBQUksQ0FBQywrQkFBK0IsQ0FDeEMsSUFBSSxFQUNKLENBQXdCLENBQ3pCLENBQ0YsQ0FBQztnQkFDSixDQUFDO3FCQUFNLElBQUksYUFBYSxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztvQkFDdkMsS0FBSyxDQUFDLElBQUksQ0FDUixNQUFNLElBQUksQ0FBQyw0QkFBNEIsQ0FDckMsSUFBSSxFQUNKLENBQXdCLENBQ3pCLENBQ0YsQ0FBQztnQkFDSixDQUFDO3FCQUFNLENBQUM7b0JBQ04sS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsQ0FBZ0IsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JFLENBQUM7WUFDSCxDQUFDO1lBQ0QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDdEMsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNuQixNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ25CLElBQUksQ0FBQyxDQUFDLGFBQWEsS0FBSyxhQUFhLENBQUMsVUFBVSxFQUFFLENBQUM7b0JBQ2pELElBQUksQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDO3dCQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQ3RCLENBQUM7eUJBQU0sQ0FBQzt3QkFDTixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQzt3QkFDbEQsSUFBSSxJQUFJLENBQUMsQ0FBQzt3QkFDVixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO3dCQUNqRSxDQUFDLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQyxDQUFDLFNBQVMsSUFBSSxlQUFlLEVBQUUsQ0FBQztvQkFDcEQsQ0FBQztnQkFDSCxDQUFDO3FCQUFNLElBQUksQ0FBQyxDQUFDLGFBQWEsS0FBSyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQ3BELE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztvQkFDaEUsSUFBSSxJQUFJLENBQUMsQ0FBQztvQkFDVixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQ2pELENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FDbEIsQ0FBQztvQkFDRixDQUFDLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQyxDQUFDLFNBQVMsSUFBSSxlQUFlLEVBQUUsQ0FBQztnQkFDcEQsQ0FBQztxQkFBTSxJQUFJLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztvQkFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUN0QixDQUFDO3FCQUFNLENBQUM7b0JBQ04sSUFBSSxJQUFJLENBQUMsQ0FBQztvQkFDVixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQ2pELENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FDbEIsQ0FBQztvQkFDRixDQUFDLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQyxDQUFDLFNBQVMsSUFBSSxlQUFlLEVBQUUsQ0FBQztnQkFDcEQsQ0FBQztZQUNILENBQUM7WUFDRCxNQUFNLEdBQUcsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDO1lBQ3pCLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDcEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pELEtBQUssTUFBTSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7b0JBQ3JCLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FDakQsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUN0QixDQUFDO29CQUNGLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLElBQUksZUFBZSxFQUFFLENBQUM7Z0JBQ3hELENBQUM7WUFDSCxDQUFDO1lBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDO1lBQ3RCLE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUMsQ0FBQztRQUNGLEtBQUssTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLFFBQVEsRUFBRSxHQUFHLG9CQUFvQixDQUFDLEVBQUUsQ0FBQztZQUN2RCxJQUNFLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLGVBQWUsQ0FBQyxNQUFNLENBQUM7Z0JBQ2xELENBQUMsQ0FBQyxJQUFJLElBQUksdUJBQXVCLENBQUMsTUFBTSxFQUN4QyxDQUFDO2dCQUNELElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDeEIsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUM3QyxRQUFRLEdBQUcsRUFBRSxDQUFDO2dCQUNoQixDQUFDO1lBQ0gsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkIsQ0FBQztRQUNILENBQUM7UUFDRCxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDeEIsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9DLENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsaUJBQWlCLENBQUMsY0FBc0I7UUFDdEMsTUFBTSxTQUFTLEdBQUcsZUFBZSxjQUFjLEVBQUUsQ0FBQztRQUNsRCxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDOUMsS0FBSyxDQUFDLElBQUksR0FBRyxVQUFVLENBQUM7WUFDeEIsS0FBSyxDQUFDLEVBQUUsR0FBRyxTQUFTLENBQUM7WUFDckIsS0FBSyxDQUFDLFNBQVMsR0FBRztXQUNiLFNBQVM7bUJBQ0QsY0FBYzs7T0FFMUIsQ0FBQztZQUNGLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25DLENBQUM7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsS0FBSyxDQUFDLG1CQUFtQixDQUN2QixJQUEwQixFQUMxQixPQUFvQjtRQUVwQixJQUFJLFdBQVcsR0FBRyxPQUFPLENBQUMsQ0FBQyxlQUFlO1FBQzFDLElBQUksaUJBQWlCLEdBQUcsdUJBQXVCLENBQUMsQ0FBQywrQkFBK0I7UUFDaEYsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzVELE1BQU0sa0JBQWtCLEdBQ3RCLElBQUksQ0FBQyxtQ0FBbUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN0RCxJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDakIsSUFBSSxPQUFPLENBQUMsbUJBQW1CLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQztZQUNuRCxJQUFJLENBQUM7Z0JBQ0gsT0FBTyxHQUFHLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxpQkFBaUIsQ0FBQztxQkFDaEUsTUFBTSxDQUFDO1lBQ1osQ0FBQztZQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ1gsT0FBTyxDQUFDLEtBQUssQ0FBQyx5QkFBeUIsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM5QyxDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sNEJBQTRCLEdBQUc7WUFDbkMsdUJBQXVCO1lBQ3ZCLHFCQUFxQjtZQUNyQixrQkFBa0I7WUFDbEIsaUJBQWlCO1lBQ2pCLGlCQUFpQjtTQUNsQixDQUFDO1FBQ0YsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUNqRCxPQUFPLEVBQ1AsV0FBVyxFQUNYLE9BQU8sRUFDUCxpQkFBaUIsRUFDakIsNEJBQTRCLENBQzdCLENBQUM7UUFDRixrREFBa0Q7UUFDbEQsSUFBSSxPQUFPLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzVDLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzVDLENBQUM7UUFFRCxJQUFJLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsQ0FBQztZQUNqRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQy9DLENBQUM7UUFFRCxRQUFRLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNyQixLQUFLLGVBQWUsQ0FBQyxXQUFXLEVBQUUsT0FBTztnQkFDdkMsSUFBSSxPQUFPLEdBQUcsT0FBTyxDQUFDLG1CQUFtQjtvQkFDdkMsRUFBRSxJQUE4QixDQUFDO2dCQUNuQyxRQUFRLE9BQU8sRUFBRSxDQUFDO29CQUNoQixLQUFLLHNCQUFzQixDQUFDLE9BQU87d0JBQ2pDLFlBQVksQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDO3dCQUU3QixNQUFNO29CQUNSLEtBQUssc0JBQXNCLENBQUMsS0FBSyxDQUFDO29CQUNsQyxLQUFLLHNCQUFzQixDQUFDLElBQUksQ0FBQztvQkFDakMsS0FBSyxzQkFBc0IsQ0FBQyxLQUFLO3dCQUMvQixZQUFZLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQzt3QkFDNUIsTUFBTTtvQkFDUixLQUFLLHNCQUFzQixDQUFDLFFBQVE7d0JBQ2xDLFlBQVksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDO3dCQUM1QixZQUFZLENBQUMsS0FBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEtBQUssQ0FBQzt3QkFDeEMsaUJBQWlCLEdBQUcsdUJBQXVCLENBQUM7d0JBQzVDLE1BQU07b0JBQ1IsS0FBSyxzQkFBc0IsQ0FBQyxRQUFRO3dCQUNsQyxZQUFZLENBQUMsSUFBSSxHQUFHLFlBQVksQ0FBQzt3QkFDakMsWUFBWSxDQUFDLEtBQUssR0FBRzs0QkFDbkIsUUFBUSxFQUFFLElBQUk7eUJBQ2YsQ0FBQzt3QkFDRixpQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQzt3QkFDdEMsTUFBTTtvQkFDUjt3QkFDRSxZQUFZLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQzt3QkFDNUIsaUJBQWlCLEdBQUcsdUJBQXVCLENBQUM7d0JBQzVDLE1BQU07Z0JBQ1YsQ0FBQztnQkFDRCxNQUFNO1lBQ1IsS0FBSyxlQUFlLENBQUMsU0FBUyxFQUFFLFlBQVk7Z0JBQzFDLFlBQVksQ0FBQyxJQUFJLEdBQUcsa0JBQWtCLENBQUM7Z0JBQ3ZDLGlCQUFpQixHQUFHLHVCQUF1QixDQUFDO2dCQUU1QyxNQUFNLHFCQUFxQixHQUN6QixPQUFPLENBQUMsbUJBQW1CLEVBQUUsdUJBQXVCLEVBQUUsSUFBSSxDQUN4RCxDQUFDLENBQTBCLEVBQUUsRUFBRSxDQUM3QixDQUFDLENBQUMsV0FBVyxLQUFLLElBQUksQ0FBQyxrQkFBa0IsQ0FDNUMsRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUNqQixZQUFZLENBQUMsWUFBWSxHQUFHLHFCQUFxQixDQUFDO2dCQUVsRCxNQUFNO1lBQ1IsS0FBSyxlQUFlLENBQUMsUUFBUSxFQUFFLFdBQVc7Z0JBQ3hDLFlBQVksQ0FBQyxJQUFJLEdBQUcsaUJBQWlCLENBQUM7Z0JBQ3RDLGlCQUFpQixHQUFHLHFCQUFxQixDQUFDO2dCQUMxQyxJQUFJLE9BQU8sR0FBRyxPQUFPLENBQUMsbUJBQW1CLEVBQUUsT0FBTyxJQUFJLEtBQUssQ0FBQztnQkFDNUQsWUFBWSxDQUFDLEtBQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxPQUFPLENBQUM7Z0JBQ3pDLE1BQU07WUFDUixLQUFLLGVBQWUsQ0FBQyxVQUFVLEVBQUUsd0JBQXdCO2dCQUN2RCxpQkFBaUI7b0JBQ2YsT0FBTyxDQUFDLG1CQUFtQixDQUFDLHNCQUFzQixLQUFLLElBQUk7d0JBQ3pELENBQUMsQ0FBQyxrQkFBa0I7d0JBQ3BCLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQztnQkFDeEIsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDO2dCQUN0RCxNQUFNO1lBQ1IsS0FBSyxlQUFlLENBQUMsT0FBTztnQkFDMUIsWUFBWSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7Z0JBQ3ZCLE1BQU07WUFDUixLQUFLLGVBQWUsQ0FBQyxRQUFRO2dCQUMzQixZQUFZLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDdkIsTUFBTTtZQUNSLEtBQUssZUFBZSxDQUFDLGlCQUFpQjtnQkFDcEMsWUFBWSxHQUFHLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDM0QsTUFBTTtZQUNSLEtBQUssZUFBZSxDQUFDLGFBQWE7Z0JBQ2hDLFlBQVksR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3ZELE1BQU07WUFDUixLQUFLLGVBQWUsQ0FBQyxlQUFlO2dCQUNsQyxZQUFZLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUN6RCxNQUFNO1lBQ1IsS0FBSyxlQUFlLENBQUMsTUFBTSxFQUFFLFVBQVU7Z0JBQ3JDLFlBQVksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUN2QixNQUFNO1lBQ1I7Z0JBQ0UsWUFBWSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUM7Z0JBQzVCLGlCQUFpQixHQUFHLHVCQUF1QixDQUFDO1FBQ2hELENBQUM7UUFDRCxZQUFZLENBQUMsU0FBUyxHQUFHLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV4RCxJQUFJLENBQUMsNEJBQTRCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssaUJBQWlCLENBQUMsRUFBRSxDQUFDO1lBQ3ZFLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUM7Z0JBQ25DLFlBQVksQ0FBQyxLQUFNLENBQUMsVUFBVyxDQUFDLE9BQU8sQ0FBQztvQkFDdEMsR0FBRzt3QkFDSCxJQUFJLENBQUMsbUNBQW1DLENBQ3RDLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FDL0IsQ0FBQztZQUNOLENBQUM7WUFFRCxxQkFBcUI7WUFDckIsTUFBTSxhQUFhLEdBQUcsR0FBRyxpQkFBaUIsUUFBUSxDQUFDO1lBQ25ELElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO2dCQUMvQixZQUFZLENBQUMsS0FBTSxDQUFDLFVBQVcsQ0FBQyxPQUFPLENBQUM7b0JBQ3RDLEdBQUc7d0JBQ0gsSUFBSSxDQUFDLG1DQUFtQyxDQUN0QyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQy9CLENBQUM7WUFDTixDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksT0FBTyxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLHNDQUFzQyxDQUN6QyxPQUFPLENBQUMsbUJBQW1CLEVBQzNCLFlBQVksQ0FDYixDQUFDO1FBQ0osQ0FBQztRQUVELElBQUksZUFBZSxHQUFHLE9BQU8sQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUM5QyxDQUFDLENBQTBCLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEtBQUssSUFBSSxDQUFDLGtCQUFrQixDQUMxRSxFQUFFLEtBQUssQ0FBQztRQUNULElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUNyQixlQUFlLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUNsQyxDQUFDO1FBQ0QsWUFBWSxDQUFDLEtBQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxlQUFlLENBQUM7UUFFL0MsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUUvQyxPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDO0lBRUQsYUFBYSxDQUFDLFlBQStCLEVBQUUsT0FBb0I7UUFDakUsSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQ25DLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLGtCQUFrQixLQUFLLE9BQU8sRUFBRSxVQUFVLENBQzdELEVBQUUsTUFBTSxFQUFFLGVBQWUsQ0FBQztRQUMzQixJQUFJLG9CQUFvQixHQUFHLEVBQUUsQ0FBQztRQUM5QixJQUFJLGVBQWUsSUFBSSxJQUFJLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDO1lBQzlELG9CQUFvQjtnQkFDakIsZUFBK0IsQ0FBQyxJQUFJLENBQ25DLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxLQUFLLElBQUksQ0FBQyxrQkFBa0IsQ0FDakQsRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ25CLENBQUM7UUFFRCxZQUFZLENBQUMsVUFBVSxHQUFHO1lBQ3hCLFVBQVUsRUFBRTtnQkFDVixVQUFVLEVBQUUsQ0FBQyxJQUFxQixFQUFFLEVBQUU7b0JBQ3BDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7b0JBQ3pCLE1BQU0sWUFBWSxHQUFHLElBQUksTUFBTSxDQUM3QixtREFBbUQsQ0FDcEQsQ0FBQztvQkFDRixJQUFJLEtBQUssSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQzt3QkFDdkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO3dCQUN2QyxPQUFPLEtBQUssQ0FBQztvQkFDZixDQUFDO29CQUNELE9BQU8sSUFBSSxDQUFDO2dCQUNkLENBQUM7Z0JBQ0QsT0FBTyxFQUFFLG9CQUFvQjthQUM5QjtTQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsWUFBK0IsRUFBRSxPQUFvQjtRQUNwRSxZQUFZLENBQUMsZUFBZSxHQUFHO1lBQzdCLGtCQUFrQixFQUFFO2dCQUNsQixVQUFVLEVBQUUsQ0FBQyxJQUFxQixFQUFFLEVBQUU7b0JBQ3BDLE9BQU8sQ0FDTCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FDcEIsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUNqQixTQUFTLENBQUMsR0FBRyxFQUFFO3dCQUNiLE1BQU0sbUJBQW1CLEdBQ3ZCLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQzt3QkFFbEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFROzZCQUNyQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUM7NkJBQ25ELElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsS0FBSyxtQkFBbUIsQ0FBQzs0QkFDaEQsRUFBRSxpQkFBaUIsQ0FBQyxhQUFhLENBQUM7d0JBRXBDLE1BQU0sUUFBUSxHQUNaLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQyxHQUE4QixFQUFFLENBQUMsRUFBRSxFQUFFOzRCQUN0RCxJQUFJLENBQUMsQ0FBQyxXQUFXLEtBQUssT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDO2dDQUN6QyxHQUFHLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDOzRCQUN6QyxDQUFDO2lDQUFNLENBQUM7Z0NBQ04sR0FBRyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUM7NEJBQzNCLENBQUM7NEJBQ0QsT0FBTyxHQUFHLENBQUM7d0JBQ2IsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQzt3QkFFZixNQUFNLFdBQVcsR0FBdUI7NEJBQ3RDLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWE7NEJBQ2xDLEtBQUssRUFBRSxtQkFBbUI7NEJBQzFCLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQzt5QkFDL0IsQ0FBQzt3QkFFRixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQzdDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FDNUIsQ0FBQztvQkFDSixDQUFDLENBQUMsQ0FDSCxJQUFJLGtCQUFrQixDQUN4QixDQUFDO2dCQUNKLENBQUM7Z0JBQ0QsT0FBTyxFQUFFLG9CQUFvQjthQUM5QjtTQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsMkJBQTJCLENBQ3pCLE9BQW9CLEVBQ3BCLElBQVksRUFDWixPQUFlLEVBQ2YsaUJBQXlCLEVBQ3pCLDRCQUFzQztRQUV0QyxNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxtQkFBbUIsQ0FDakQsSUFBSSxDQUFDLGtCQUFrQixFQUN2QixJQUFJLENBQUMsa0JBQWtCLENBQ3hCLENBQUM7UUFFRixJQUFJLFlBQVksR0FBc0I7WUFDcEMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxVQUFVLElBQUksT0FBTyxDQUFDLEtBQUs7WUFDeEMsSUFBSSxFQUFFLElBQUk7WUFDVixLQUFLLEVBQUU7Z0JBQ0wsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLGtCQUFrQjtnQkFDM0MsaUJBQWlCLEVBQUUsaUJBQWlCO2dCQUNwQyxLQUFLLEVBQ0gsT0FBTyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQ3hCLENBQUMsQ0FBMEIsRUFBRSxFQUFFLENBQzdCLENBQUMsQ0FBQyxXQUFXLEtBQUssSUFBSSxDQUFDLGtCQUFrQixDQUM1QyxFQUFFLEtBQUssSUFBSSxFQUFFO2dCQUVoQixLQUFLLEVBQ0gsT0FBTyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQ3hCLENBQUMsQ0FBMEIsRUFBRSxFQUFFLENBQzdCLENBQUMsQ0FBQyxXQUFXLEtBQUssSUFBSSxDQUFDLGtCQUFrQixDQUM1QyxFQUFFLEtBQUssSUFBSSxFQUFFO2dCQUNoQixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07Z0JBQ25CLFFBQVEsRUFBRSxPQUFPLENBQUMsV0FBVztnQkFDN0IsVUFBVSxFQUFFO29CQUNWLEtBQUssRUFBRSw0QkFBNEIsQ0FBQyxJQUFJLENBQ3RDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssaUJBQWlCLENBQy9CO3dCQUNDLENBQUMsQ0FBQyxFQUFFO3dCQUNKLENBQUMsQ0FBQyxpQkFBaUI7aUJBQ3RCO2dCQUNELFFBQVEsRUFBRSxJQUFJO2dCQUNkLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDYixVQUFVLEVBQUUsRUFBRTtnQkFDZCxhQUFhLEVBQUUsT0FBTyxDQUFDLGFBQWE7YUFDckM7WUFDRCxXQUFXLEVBQUUsRUFBRTtZQUNmLEtBQUssRUFBRSxFQUFFO1lBQ1QsVUFBVSxFQUFFLEVBQUU7U0FDZixDQUFDO1FBQ0YsWUFBWSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7UUFFN0IsSUFBSSxPQUFPLENBQUMsbUJBQW1CLEVBQUUsV0FBVyxJQUFJLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNuRSxJQUFJLGVBQWUsR0FBRyxLQUFLLENBQUMsa0NBQWtDLENBQzVELE9BQU8sQ0FBQyxrQkFBa0IsRUFDMUIsSUFBSSxDQUFDLGtCQUFrQixFQUN2Qix1QkFBdUIsQ0FDeEIsQ0FBQztZQUVGLFlBQVksQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxXQUFXLENBQUM7WUFDdkUsWUFBWSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEdBQUc7Z0JBQ2pDLEdBQUcsWUFBWSxDQUFDLFVBQVUsRUFBRSxRQUFRO2dCQUNwQyxRQUFRLEVBQUUsZUFBZTthQUMxQixDQUFDO1FBQ0osQ0FBQztRQUVELElBQ0UsT0FBTyxDQUFDLElBQUksS0FBSyxlQUFlLENBQUMsVUFBVTtZQUMzQyxPQUFPLENBQUMsbUJBQW1CLEVBQUUsV0FBVztZQUN4QyxPQUFPLENBQUMsa0JBQWtCO1lBQzFCLFlBQVksQ0FBQyxLQUFLLEVBQ2xCLENBQUM7WUFDRCxJQUFJLGVBQWUsR0FBRyxLQUFLLENBQUMsa0NBQWtDLENBQzVELE9BQU8sQ0FBQyxrQkFBa0IsRUFDMUIsSUFBSSxDQUFDLGtCQUFrQixFQUN2QixhQUFhLENBQ2QsQ0FBQztZQUVGLFlBQVksQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxXQUFXLENBQUM7WUFDdkUsWUFBWSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEdBQUc7Z0JBQ2pDLEdBQUcsWUFBWSxDQUFDLFVBQVUsRUFBRSxRQUFRO2dCQUNwQyxRQUFRLEVBQUUsZUFBZTthQUMxQixDQUFDO1FBQ0osQ0FBQztRQUVELElBQUksdUJBQXVCLEdBQUcsRUFBRSxDQUFDO1FBQ2pDLElBQUksT0FBTyxDQUFDLG1CQUFtQixFQUFFLGtCQUFrQixJQUFJLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUMxRSxJQUNFLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxrQkFBa0I7Z0JBQy9DLFlBQVksQ0FBQyxLQUFLLEVBQ2xCLENBQUM7Z0JBQ0QsdUJBQXVCLEdBQUcsS0FBSyxDQUFDLGtDQUFrQyxDQUNoRSxPQUFPLENBQUMsa0JBQWtCLEVBQzFCLElBQUksQ0FBQyxrQkFBa0IsRUFDdkIsa0JBQWtCLENBQ25CLENBQUM7Z0JBRUYsSUFBSSxPQUFPLENBQUMsbUJBQW1CLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUM7b0JBQ3RELFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUM7b0JBQzlELFlBQVksQ0FBQyxVQUFVLENBQUMsUUFBUSxHQUFHO3dCQUNqQyxHQUFHLFlBQVksQ0FBQyxVQUFVLEVBQUUsUUFBUTt3QkFDcEMsR0FBRyxFQUFFLHVCQUF1QjtxQkFDN0IsQ0FBQztnQkFDSixDQUFDO2dCQUVELElBQUksT0FBTyxDQUFDLG1CQUFtQixFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDO29CQUN0RCxZQUFZLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDO29CQUM5RCxZQUFZLENBQUMsVUFBVSxDQUFDLFFBQVEsR0FBRzt3QkFDakMsR0FBRyxZQUFZLENBQUMsVUFBVSxFQUFFLFFBQVE7d0JBQ3BDLEdBQUcsRUFBRSx1QkFBdUI7cUJBQzdCLENBQUM7Z0JBQ0osQ0FBQztZQUNILENBQUM7WUFFRCwyREFBMkQ7WUFDM0QsSUFBSSxPQUFPLENBQUMsbUJBQW1CLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQztnQkFDbkQsdUJBQXVCLEdBQUcsdUJBQXVCO29CQUMvQyxLQUFLLENBQUMsa0NBQWtDLENBQ3RDLE9BQU8sQ0FBQyxrQkFBa0IsRUFDMUIsSUFBSSxDQUFDLGtCQUFrQixFQUN2QixrQkFBa0IsQ0FDbkIsQ0FBQztnQkFFSixZQUFZLENBQUMsVUFBVSxHQUFHO29CQUN4QixHQUFHLFlBQVksQ0FBQyxVQUFVO29CQUMxQixhQUFhLEVBQUU7d0JBQ2IsVUFBVSxFQUFFLENBQUMsQ0FBa0IsRUFBRSxFQUFFOzRCQUNqQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUs7Z0NBQUUsT0FBTyxJQUFJLENBQUM7NEJBQzFCLElBQUksQ0FBQztnQ0FDSCxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztnQ0FDbEMsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQzs0QkFDN0IsQ0FBQzs0QkFBQyxNQUFNLENBQUM7Z0NBQ1AsT0FBTyxLQUFLLENBQUM7NEJBQ2YsQ0FBQzt3QkFDSCxDQUFDO3dCQUNELE9BQU8sRUFDTCx1QkFBdUI7NEJBQ3ZCLDJDQUEyQztxQkFDOUM7aUJBQ0YsQ0FBQztnQkFFRixZQUFZLENBQUMsVUFBVSxDQUFDLFFBQVEsR0FBRztvQkFDakMsR0FBRyxZQUFZLENBQUMsVUFBVSxFQUFFLFFBQVE7b0JBQ3BDLE9BQU8sRUFBRSx1QkFBdUI7aUJBQ2pDLENBQUM7WUFDSixDQUFDO1lBRUQseURBQXlEO1lBQ3pELElBQUksT0FBTyxDQUFDLG1CQUFtQixFQUFFLGFBQWEsRUFBRSxDQUFDO2dCQUMvQyxZQUFZLENBQUMsS0FBSyxDQUFDLFNBQVM7b0JBQzFCLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxhQUFhLENBQUM7Z0JBQzdDLFlBQVksQ0FBQyxVQUFVLENBQUMsUUFBUSxHQUFHO29CQUNqQyxHQUFHLFlBQVksQ0FBQyxVQUFVLEVBQUUsUUFBUTtvQkFDcEMsU0FBUyxFQUFFLHVCQUF1QjtpQkFDbkMsQ0FBQztZQUNKLENBQUM7WUFDRCxJQUNFLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxlQUFlO2dCQUM1QyxPQUFPLENBQUMsbUJBQW1CLEVBQUUsYUFBYSxFQUMxQyxDQUFDO2dCQUNELFlBQVksQ0FBQyxJQUFJLEdBQUcsWUFBWSxDQUFDO2dCQUNqQyxNQUFNLG1CQUFtQixHQUFHO29CQUMxQixTQUFTLEVBQUU7d0JBQ1QsVUFBVSxFQUFFLENBQUMsQ0FBa0IsRUFBRSxLQUF3QixFQUFFLEVBQUU7NEJBQzNELHVCQUF1QjtnQ0FDckIsS0FBSyxDQUFDLGtDQUFrQyxDQUN0QyxPQUFPLENBQUMsa0JBQWtCLEVBQzFCLElBQUksQ0FBQyxrQkFBa0IsRUFDdkIsa0JBQWtCLENBQ25CLENBQUM7NEJBRUosTUFBTSxXQUFXLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQzs0QkFDL0IsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzs0QkFFakMsSUFBSSxPQUFPLENBQUMsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLENBQUM7Z0NBQ2pELElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssRUFBRTtvQ0FBRSxPQUFPLElBQUksQ0FBQztnQ0FDNUMsT0FBTyxDQUFDLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQzs0QkFDL0IsQ0FBQzs0QkFDRCxJQUFJLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxhQUFhLEVBQUUsQ0FBQztnQ0FDL0MsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLEtBQUssS0FBSyxFQUFFO29DQUFFLE9BQU8sSUFBSSxDQUFDO2dDQUM1QyxPQUFPLENBQUMsQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDOzRCQUMvQixDQUFDOzRCQUNELE9BQU8sSUFBSSxDQUFDO3dCQUNkLENBQUM7d0JBQ0QsT0FBTyxFQUFFLENBQUMsS0FBVSxFQUFFLEtBQXdCLEVBQUUsRUFBRTs0QkFDaEQsT0FBTyx1QkFBdUIsQ0FBQzt3QkFDakMsQ0FBQztxQkFDRjtpQkFDRixDQUFDO2dCQUNGLFlBQVksQ0FBQyxVQUFVLEdBQUc7b0JBQ3hCLEdBQUcsWUFBWSxDQUFDLFVBQVU7b0JBQzFCLEdBQUcsbUJBQW1CO2lCQUN2QixDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7UUFFRCxrREFBa0Q7UUFDbEQsSUFBSSxPQUFPLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzVDLElBQUksZUFBZSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUNuQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxrQkFBa0IsS0FBSyxPQUFPLEVBQUUsVUFBVSxDQUM3RCxFQUFFLE1BQU0sRUFBRSxlQUFlLENBQUM7WUFDM0IsSUFBSSxvQkFBb0IsR0FBRyxFQUFFLENBQUM7WUFDOUIsSUFBSSxlQUFlLElBQUksSUFBSSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQztnQkFDOUQsb0JBQW9CO29CQUNqQixlQUErQixDQUFDLElBQUksQ0FDbkMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEtBQUssSUFBSSxDQUFDLGtCQUFrQixDQUNqRCxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDbkIsQ0FBQztZQUVELFlBQVksQ0FBQyxVQUFVLEdBQUc7Z0JBQ3hCLFVBQVUsRUFBRTtvQkFDVixVQUFVLEVBQUUsQ0FBQyxJQUFxQixFQUFFLEVBQUU7d0JBQ3BDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7d0JBQ3pCLE1BQU0sWUFBWSxHQUFHLElBQUksTUFBTSxDQUM3QiwrRkFBK0YsQ0FDaEcsQ0FBQzt3QkFDRixJQUFJLEtBQUssSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQzs0QkFDdkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLGtCQUFrQixFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7NEJBQzdDLE9BQU8sS0FBSyxDQUFDO3dCQUNmLENBQUM7d0JBQ0QsT0FBTyxJQUFJLENBQUM7b0JBQ2QsQ0FBQztvQkFDRCxPQUFPLEVBQUUsb0JBQW9CO2lCQUM5QjthQUNGLENBQUM7UUFDSixDQUFDO1FBRUQsSUFBSSxPQUFPLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzVDLE1BQU0sb0JBQW9CLEdBQUc7Z0JBQzNCLFVBQVUsRUFBRTtvQkFDVixVQUFVLEVBQUUsQ0FBQyxDQUFrQixFQUFFLEtBQXdCLEVBQUUsRUFBRTt3QkFDM0QsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQzt3QkFDeEIsSUFBSSxDQUFDLFNBQVMsSUFBSSxPQUFPLENBQUMsbUJBQW1CLEVBQUUsV0FBVyxFQUFFLENBQUM7NEJBQzNELHVCQUF1QjtnQ0FDckIsS0FBSyxDQUFDLGtDQUFrQyxDQUN0QyxPQUFPLENBQUMsa0JBQWtCLEVBQzFCLElBQUksQ0FBQyxrQkFBa0IsRUFDdkIsdUJBQXVCLENBQ3hCLENBQUM7NEJBQ0osT0FBTyxLQUFLLENBQUM7d0JBQ2YsQ0FBQzt3QkFDRCxJQUNFLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDOzRCQUM1QixPQUFPLENBQUMsbUJBQW1CLEVBQUUsV0FBVzs0QkFFeEMsT0FBTyxLQUFLLENBQUM7d0JBRWYsT0FBTyxJQUFJLENBQUM7b0JBQ2QsQ0FBQztvQkFDRCxPQUFPLEVBQUUsQ0FBQyxLQUFVLEVBQUUsS0FBd0IsRUFBRSxFQUFFO3dCQUNoRCxJQUFJLHVCQUF1QixLQUFLLEVBQUU7NEJBQ2hDLE9BQU8sMkJBQTJCLENBQUM7d0JBRXJDLE9BQU8sdUJBQXVCLENBQUM7b0JBQ2pDLENBQUM7aUJBQ0Y7YUFDRixDQUFDO1lBQ0YsWUFBWSxDQUFDLFVBQVUsR0FBRztnQkFDeEIsR0FBRyxZQUFZLENBQUMsVUFBVTtnQkFDMUIsR0FBRyxvQkFBb0I7YUFDeEIsQ0FBQztRQUNKLENBQUM7UUFFRCxPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDO0lBRUQsS0FBSyxDQUFDLCtCQUErQixDQUNuQyxJQUEwQixFQUMxQixPQUE0QjtRQUU1QixJQUFJLFlBQVksR0FBc0IsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUM7UUFFcEQsWUFBWSxDQUFDLElBQUksR0FBRyxrQkFBa0IsQ0FBQztRQUN2QyxZQUFZLENBQUMsU0FBUyxHQUFHLHNCQUFzQixDQUFDO1FBQ2hELFlBQVksQ0FBQyxLQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUM7UUFFM0QsSUFBSSxlQUFlLEdBQ2pCLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztZQUN4RSxFQUFFLEtBQUs7WUFDVCxPQUFPLENBQUMsS0FBSztZQUNiLEVBQUUsQ0FBQztRQUVMLElBQUksT0FBTyxDQUFDLElBQUksSUFBSSx1QkFBdUIsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN0RCxNQUFNLGdCQUFnQixHQUFHLE9BQXVDLENBQUM7WUFFakUsSUFBSSxxQkFBcUIsR0FDdkIsZ0JBQWdCLENBQUMsbUJBQW1CLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUMvRCxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQ3JELEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNqQixJQUFJLHdCQUF3QixHQUMxQixnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUM1QyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQ3JELEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUVqQixZQUFZLENBQUMsWUFBWSxHQUFHLHFCQUFxQixDQUFDO1lBQ2xELFlBQVksQ0FBQyxLQUFNLENBQUMsdUJBQXVCLENBQUMsR0FBRyxxQkFBcUIsQ0FBQztZQUNyRSxZQUFZLENBQUMsS0FBTSxDQUFDLDBCQUEwQixDQUFDO2dCQUM3Qyx3QkFBd0IsQ0FBQztZQUMzQixZQUFZLENBQUMsSUFBSSxHQUFHLGtCQUFrQixDQUFDO1lBQ3ZDLFlBQVksQ0FBQyxTQUFTLEdBQUcsc0JBQXNCLENBQUM7UUFDbEQsQ0FBQzthQUFNLElBQUksT0FBTyxDQUFDLElBQUksSUFBSSx1QkFBdUIsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUM1RCxZQUFZLEdBQUcsSUFBSSxDQUFDLDZCQUE2QixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzdELENBQUM7YUFBTSxJQUFJLE9BQU8sQ0FBQyxJQUFJLElBQUksdUJBQXVCLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDeEQsWUFBWSxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN6RCxDQUFDO2FBQU0sSUFBSSxPQUFPLENBQUMsSUFBSSxJQUFJLHVCQUF1QixDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzFELElBQUksVUFBVSxHQUNaLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FDekIsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUSxDQUNqRCxFQUFFLElBQUksSUFBSSxnQkFBZ0IsQ0FBQztZQUU5QixZQUFZLENBQUMsWUFBWSxHQUFHLFVBQVUsQ0FBQztZQUN2QyxZQUFZLENBQUMsSUFBSSxHQUFHLGtCQUFrQixDQUFDO1lBQ3ZDLFlBQVksQ0FBQyxTQUFTLEdBQUcsc0JBQXNCLENBQUM7UUFDbEQsQ0FBQzthQUFNLENBQUM7WUFDTixJQUNFLE9BQU8sQ0FBQyxJQUFJLElBQUksdUJBQXVCLENBQUMsYUFBYTtnQkFDckQsSUFBSSxDQUFDLG9CQUFvQjtnQkFDekIsT0FBTyxDQUFDLDJCQUEyQixFQUNuQyxDQUFDO2dCQUNELE1BQU0sU0FBUyxHQUNiLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsMkJBQTJCLENBQUMsQ0FBQztnQkFDakUsSUFBSSxTQUFTLEVBQUUsQ0FBQztvQkFDZCxRQUFRLE9BQU8sU0FBUyxFQUFFLENBQUM7d0JBQ3pCLEtBQUssU0FBUzs0QkFDWixZQUFZLENBQUMsWUFBWSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7NEJBQzlELE1BQU07d0JBRVI7NEJBQ0UsSUFBSSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUM7Z0NBQ3BCLFlBQVksQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQzs0QkFDN0MsQ0FBQztpQ0FBTSxDQUFDO2dDQUNOLFlBQVksQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFDOzRCQUN4QyxDQUFDOzRCQUNELE1BQU07b0JBQ1YsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFFRCxZQUFZLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUM7UUFDckMsWUFBWSxDQUFDLEtBQU0sQ0FBQyxlQUFlLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDNUMsWUFBWSxDQUFDLEtBQU0sQ0FBQyw2QkFBNkIsQ0FBQztZQUNoRCxPQUFPLENBQUMsMkJBQTJCLENBQUM7UUFDdEMsWUFBWSxDQUFDLEtBQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxlQUFlLENBQUM7UUFDL0MsWUFBWSxDQUFDLEtBQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUM7UUFFekQsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUVqRCxPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDO0lBRUQsS0FBSyxDQUFDLDRCQUE0QixDQUNoQyxJQUEwQixFQUMxQixPQUE0QjtRQUU1QixJQUFJLFlBQVksR0FBc0IsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUM7UUFFcEQsWUFBWSxDQUFDLElBQUksR0FBRyxrQkFBa0IsQ0FBQztRQUN2QyxZQUFZLENBQUMsU0FBUyxHQUFHLHNCQUFzQixDQUFDO1FBQ2hELFlBQVksQ0FBQyxLQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUM7UUFFM0QsSUFBSSxlQUFlLEdBQ2pCLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztZQUN4RSxFQUFFLEtBQUs7WUFDVCxPQUFPLENBQUMsS0FBSztZQUNiLEVBQUUsQ0FBQztRQUVMLFlBQVksQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQztRQUNyQyxZQUFZLENBQUMsS0FBTSxDQUFDLGVBQWUsQ0FBQyxHQUFHLElBQUksQ0FBQztRQUM1QyxZQUFZLENBQUMsS0FBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUM7UUFDekQsWUFBWSxDQUFDLEtBQU0sQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQztRQUNuRSxZQUFZLENBQUMsS0FBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLGVBQWUsQ0FBQztRQUUvQyxJQUFJLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQzdCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUNuRSxZQUFZLENBQUMsWUFBWSxHQUFHLEdBQUcsQ0FBQztRQUNsQyxDQUFDO1FBRUQsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUVqRCxPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDO0lBRU8sc0NBQXNDLENBQzVDLG1CQUE0QyxFQUM1QyxZQUErQjtRQUUvQixpQ0FBaUM7UUFDakMsSUFDRSxtQkFBbUI7WUFDbkIsbUJBQW1CLENBQUMsMkJBQTJCLEVBQy9DLENBQUM7WUFDRCxNQUFNLFNBQVMsR0FBRyxtQkFBbUIsQ0FBQywyQkFBMkIsQ0FBQztZQUNsRSxNQUFNLGlCQUFpQixHQUFHLG1CQUFtQixDQUFDLGlCQUFpQixJQUFJLEVBQUUsQ0FBQztZQUV0RSxZQUFZLENBQUMsV0FBVyxHQUFHO2dCQUN6QixJQUFJLEVBQUUsQ0FBQyxLQUF3QixFQUFFLEVBQUU7b0JBQ2pDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FDOUMsU0FBUyxFQUNULGlCQUFpQixFQUNqQixJQUFJLENBQUMsS0FBSyxDQUNYLENBQUM7b0JBQ0YsT0FBTyxDQUFDLFVBQVUsQ0FBQztnQkFDckIsQ0FBQzthQUNGLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVPLG9CQUFvQixDQUFDLFNBQWlCLEVBQUUsT0FBMEI7UUFDeEUsT0FBTyxDQUFDLEtBQU0sQ0FBQyx3QkFBd0IsQ0FBQyxHQUFHLEtBQUssRUFBRSxHQUFRLEVBQUUsRUFBRTtZQUM1RCxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztZQUM1QixJQUFJLHFCQUFxQixHQUFHLEtBQUssQ0FBQyxJQUFJLENBQ3BDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQzVCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxJQUFJLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNuRCxJQUFJLHFCQUFxQixFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDdEMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUVwQyxJQUFJLHVDQUF1QyxHQUN6QyxJQUFJLENBQUMsNENBQTRDLENBQy9DLHFCQUFxQixFQUNyQixHQUFHLENBQ0osQ0FBQztnQkFDSixNQUFNLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FDeEMsY0FBYyxDQUNVLENBQUM7Z0JBQzNCLE1BQU0sSUFBSSxDQUFDLHVDQUF1QyxDQUNoRCx1Q0FBdUMsRUFDdkMsT0FBTyxFQUNQLE9BQU8sQ0FBQyxJQUFJLEVBQ1osa0JBQWtCLEVBQUUsK0JBQStCLElBQUksRUFBRSxDQUMxRCxDQUFDO1lBQ0osQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN0QyxDQUFDO1lBQ0QsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDNUIsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVELDRDQUE0QyxDQUMxQyxlQUFnQyxFQUNoQyxhQUFrQjtRQUVsQixNQUFNLGVBQWUsR0FBb0IsRUFBRSxDQUFDO1FBRTVDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRTtZQUNyQyxNQUFNLGNBQWMsR0FDbEIsVUFBVSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUNsQyxLQUFLLENBQUMsZUFBZSxDQUFDLElBQUksQ0FDeEIsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEtBQUssYUFBYSxDQUFDLEVBQUUsQ0FDL0MsQ0FDRixJQUFJLEVBQUUsQ0FBQztZQUVWLElBQUksY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDOUIsTUFBTSxhQUFhLEdBQWtCO29CQUNuQyxHQUFHLFVBQVU7b0JBQ2IsTUFBTSxFQUFFLGNBQWM7aUJBQ3ZCLENBQUM7Z0JBRUYsZUFBZSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUN0QyxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLGVBQWUsQ0FBQztJQUN6QixDQUFDO0lBRUQsd0JBQXdCLENBQ3RCLFNBQWlCLEVBQ2pCLGlCQUEyQixFQUMzQixRQUFhLEVBQUU7UUFFZixzREFBc0Q7UUFDdEQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FDckMsS0FBSyxFQUNMLFNBQVMsQ0FDUyxDQUFDO1FBRXJCLE1BQU0sT0FBTyxHQUFHLFdBQVcsRUFBRSxFQUFFO1lBQzdCLENBQUMsQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUNoQixDQUFDLENBQUUsV0FBaUMsQ0FBQztRQUN2Qyx3REFBd0Q7UUFDeEQsSUFBSSxXQUFXLElBQUksaUJBQWlCLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDdkQsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsY0FBYyxDQUFDLEdBQVEsRUFBRSxJQUFZO1FBQ25DLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDN0IsSUFBSSxLQUFLLEdBQUcsR0FBRyxDQUFDO1FBQ2hCLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7WUFDdkIsS0FBSyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNuQixJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDeEIsT0FBTyxTQUFTLENBQUM7WUFDbkIsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxNQUFNO1FBQ0osT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDdEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO1lBQ2hELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUQsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNJLDRCQUE0QjtRQUNqQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRDs7T0FFRztJQUNJLGFBQWEsQ0FBQyxTQUFpQjtRQUNwQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRDs7T0FFRztJQUNJLGlCQUFpQjtRQUN0QixJQUFJLENBQUMsb0JBQW9CLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUNuRCxDQUFDO0lBRUQsS0FBSyxDQUFDLG1CQUFtQixDQUN2QixPQUFvQixFQUNwQixPQUEwQjtRQUUxQixNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsbUJBQW1CLENBQUM7UUFDakQsT0FBTyxDQUFDLElBQUk7WUFDVixZQUFZLENBQUMsc0JBQXNCLEtBQUssSUFBSTtnQkFDMUMsQ0FBQyxDQUFDLGNBQWM7Z0JBQ2hCLENBQUMsQ0FBQyxpQ0FBaUMsQ0FBQztRQUV4QyxPQUFPLENBQUMsS0FBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLFlBQVksQ0FBQztRQUU5QyxNQUFNLGNBQWMsR0FBRyxZQUFZLENBQUMsY0FBYyxDQUFDO1FBRW5ELElBQUksY0FBYyxFQUFFLENBQUM7WUFDbkIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDMUQsSUFBSSxVQUFVLEVBQUUsQ0FBQztnQkFDZixJQUFJLFVBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztvQkFDM0IsT0FBTyxDQUFDLEtBQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxjQUFjLENBQUM7b0JBQ2hELElBQUksQ0FBQyxpQ0FBaUMsQ0FDcEMsVUFBVSxFQUNWLE9BQU8sRUFDUCxZQUFZLENBQ2IsQ0FBQztvQkFDRixJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDekQsQ0FBQztxQkFBTSxDQUFDO29CQUNOLE9BQU8sQ0FBQyxJQUFJO3dCQUNWLFlBQVksQ0FBQyxzQkFBc0IsS0FBSyxJQUFJOzRCQUMxQyxDQUFDLENBQUMsY0FBYzs0QkFDaEIsQ0FBQyxDQUFDLGlDQUFpQyxDQUFDO29CQUN4QyxPQUFPLENBQUMsS0FBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLGNBQWMsQ0FBQztvQkFDaEQsSUFBSSxDQUFDLGlDQUFpQyxDQUNwQyxVQUFVLEVBQ1YsT0FBTyxFQUNQLFlBQVksQ0FDYixDQUFDO29CQUNGLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUN6RCxDQUFDO1lBQ0gsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE9BQU8sQ0FBQyxJQUFJLENBQUMsaUNBQWlDLGNBQWMsRUFBRSxDQUFDLENBQUM7WUFDbEUsQ0FBQztRQUNILENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxDQUFDLElBQUksQ0FDVixvQ0FBb0MsWUFBWSxDQUFDLFlBQVksRUFBRSxDQUNoRSxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFTyx5QkFBeUIsQ0FDL0IsVUFBcUMsRUFDckMsS0FBVTtRQUVWLElBQ0UsQ0FBQyxVQUFVO1lBQ1gsQ0FBQyxVQUFVLENBQUMsTUFBTTtZQUNsQixLQUFLLEtBQUssSUFBSTtZQUNkLEtBQUssS0FBSyxTQUFTLEVBQ25CLENBQUM7WUFDRCxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBQ0QsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxFQUFFLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNuRCxPQUFPLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMxRCxDQUFDO2FBQU0sSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDbEUsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzlCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDcEIsT0FBTyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxPQUFPLENBQUMsQ0FBQztZQUN6RCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFTyxLQUFLLENBQUMseUJBQXlCLENBQ3JDLE1BQTJCLEVBQzNCLGFBQWtDLElBQUksQ0FBQyxZQUFZO1FBRW5ELElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTztRQUNwQixNQUFNLGVBQWUsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUM7UUFFcEMsS0FBSyxNQUFNLEtBQUssSUFBSSxlQUFlLEVBQUUsQ0FBQztZQUNwQyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsR0FBYSxDQUFDO1lBQ3JDLElBQ0UsUUFBUTtnQkFDUixLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsY0FBYyxDQUFDO2dCQUM3QixLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsY0FBYyxDQUFDLEVBQzdCLENBQUM7Z0JBQ0QsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3hDLE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQzlCLGNBQWMsQ0FDVSxDQUFDO2dCQUMzQixNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBVyxDQUFDO2dCQUM3RCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFFOUQsSUFBSSxVQUFVLEdBQVEsSUFBSSxDQUFDO2dCQUUzQixJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsS0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLENBQUMsS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO29CQUNyRSxVQUFVLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztnQkFDN0IsQ0FBQztxQkFBTSxJQUNMLEtBQUssQ0FBQyxZQUFZLEtBQUssSUFBSTtvQkFDM0IsS0FBSyxDQUFDLFlBQVksS0FBSyxTQUFTLEVBQ2hDLENBQUM7b0JBQ0QsVUFBVSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUM7Z0JBQ2xDLENBQUM7cUJBQU0sSUFDTCxJQUFJLENBQUMsS0FBSztvQkFDVixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLElBQUk7b0JBQzdCLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssU0FBUyxFQUNsQyxDQUFDO29CQUNELFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNwQyxDQUFDO2dCQUVELElBQUksbUJBQW1CLEdBQTBDLElBQUksQ0FBQztnQkFDdEUsSUFBSSxVQUFVLEtBQUssSUFBSSxJQUFJLGNBQWMsRUFBRSxFQUFFLElBQUksSUFBSSxFQUFFLENBQUM7b0JBQ3RELG1CQUFtQixHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FDbEQsY0FBYyxFQUNkLFVBQVUsQ0FDWCxDQUFDO2dCQUNKLENBQUM7Z0JBRUQsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDcEUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7b0JBQ3ZCLFNBQVM7Z0JBQ1gsQ0FBQztnQkFFRCxJQUFJLENBQUMscUJBQXFCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztnQkFFOUMsSUFDRSxtQkFBbUI7b0JBQ25CLG1CQUFtQixDQUFDLEVBQUUsSUFBSSxJQUFJO29CQUM5QixjQUFjLEVBQUUsRUFBRSxJQUFJLElBQUksRUFDMUIsQ0FBQztvQkFDRCxNQUFNLDhCQUE4QixHQUFHLEtBQUssQ0FBQyxJQUFJLENBQy9DLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQzVCLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxLQUFLLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFFM0QsSUFBSSw4QkFBOEIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7d0JBQzlDLE1BQU0sMkJBQTJCLEdBQy9CLElBQUksQ0FBQyw0Q0FBNEMsQ0FDL0MsOEJBQThCLEVBQzlCLG1CQUFtQixDQUNwQixDQUFDO3dCQUVKLElBQUksMkJBQTJCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDOzRCQUMzQyxNQUFNLElBQUksQ0FBQyx1Q0FBdUMsQ0FDaEQsMkJBQTJCLEVBQzNCLGlCQUFpQixFQUNqQixpQkFBaUIsQ0FBQyxJQUFJLEVBQ3RCLFlBQVksRUFBRSwrQkFBK0IsSUFBSSxFQUFFLENBQ3BELENBQUM7d0JBQ0osQ0FBQztvQkFDSCxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1lBRUQsSUFBSSxLQUFLLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNwRCxNQUFNLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ3JFLENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFDRSxNQUFNLEtBQUssSUFBSSxDQUFDLFlBQVk7WUFDNUIsTUFBTSxLQUFLLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUMzQyxDQUFDO1lBQ0QsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDN0IsQ0FBQztJQUNILENBQUM7SUFFRCxpQ0FBaUMsQ0FDL0IsVUFBeUIsRUFDekIsT0FBMEIsRUFDMUIscUJBQTRDO1FBRTVDLElBQUksT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2xCLElBQUksaUJBQWlCLEdBQUcsS0FBSyxDQUFDLG1CQUFtQixDQUMvQyxJQUFJLENBQUMsa0JBQWtCLEVBQ3ZCLElBQUksQ0FBQyxrQkFBa0IsQ0FDeEIsQ0FBQztZQUVGLHFEQUFxRDtZQUNyRCxPQUFPLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsVUFBVSxDQUFDO1lBQzdDLE9BQU8sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDO1lBQ3JELE9BQU8sQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1lBQzVELE9BQU8sQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsR0FBRyxJQUFJLENBQUM7WUFFekMsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ3pELEtBQUssRUFBRSxLQUFLO2dCQUNaLEtBQUssRUFDSCxLQUFLLENBQUMsb0JBQW9CLENBQ3hCLEtBQUssQ0FBQyxpQkFBaUIsRUFDdkIsaUJBQWlCLENBQ2xCLElBQUksS0FBSyxDQUFDLElBQUk7Z0JBQ2pCLGtCQUFrQixFQUFFLElBQUksQ0FBQyxrQkFBa0I7Z0JBQzNDLCtCQUErQixFQUM3QixxQkFBcUIsQ0FBQywrQkFBK0I7YUFDeEQsQ0FBQyxDQUFDLENBQUM7WUFFSixPQUFPLENBQUMsS0FBSyxDQUFDLDZCQUE2QixDQUFDO2dCQUMxQyxxQkFBcUIsQ0FBQywyQkFBMkIsSUFBSSxFQUFFLENBQUM7WUFFMUQsSUFBSSxrQkFBa0IsR0FBMkIsSUFBSSxDQUFDO1lBQ3RELE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxHQUFhLENBQUM7WUFDekMsTUFBTSx3QkFBd0IsR0FDNUIscUJBQXFCLENBQUMsd0JBQXdCLENBQUM7WUFDakQsSUFDRSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQztnQkFDL0Msd0JBQXdCLElBQUksSUFBSSxFQUNoQyxDQUFDO2dCQUNELGtCQUFrQixHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FDOUMsVUFBVSxFQUNWLHdCQUF3QixDQUN6QixDQUFDO1lBQ0osQ0FBQztZQUVELE9BQU8sQ0FBQyxZQUFZLEdBQUcsa0JBQWtCLENBQUM7WUFFMUMsNENBQTRDO1lBQzVDLE9BQU8sQ0FBQyxLQUFLLENBQUMsMEJBQTBCLENBQUMsR0FBRyx3QkFBd0IsQ0FBQztZQUVyRSxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDO1lBQzlCLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUN4QyxLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQ3RDLEtBQUssTUFBTSxPQUFPLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO3dCQUNwQyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FDbkMsQ0FBQyxJQUVBLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLEtBQUssU0FBUyxDQUNuQyxDQUFDO3dCQUNGLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxTQUFTLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQzs0QkFDM0QsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQzs0QkFDaEQsTUFBTTt3QkFDUixDQUFDO29CQUNILENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELEtBQUssQ0FBQyx1Q0FBdUMsQ0FDM0MsdUJBQThCLEVBQzlCLHFCQUF3QyxFQUN4QyxJQUFTLEVBQ1QsK0JBQXNEO1FBRXRELElBQUksdUJBQXVCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sMkJBQTJCLEdBQy9CLHFCQUFxQixDQUFDLEtBQUssRUFBRSxDQUFDLDZCQUE2QixDQUFDLElBQUksRUFBRSxDQUFDO1lBRXJFLE1BQU0sb0JBQW9CLEdBQUcsdUJBQXVCLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FDbkUsMkJBQTJCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FDaEQsQ0FBQztZQUVGLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFDLG1CQUFtQixFQUFFLEVBQUU7Z0JBQ25ELE1BQU0sdUJBQXVCLEdBQUcsbUJBQW1CLENBQUMsSUFBSSxDQUFDO2dCQUV6RCxNQUFNLHNCQUFzQixHQUFHLElBQUksQ0FBQyxJQUFJO3FCQUNyQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7cUJBQzFCLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztxQkFDOUIsSUFBSSxDQUNILENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FDUCxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsY0FBYztvQkFDekMsdUJBQXVCLElBQUksSUFBSSxFQUFFLGVBQWUsS0FBSyxJQUFJLENBQzVELENBQUM7Z0JBRUosTUFBTSxXQUFXLEdBQ2Ysc0JBQXNCLEVBQUUsVUFBVTtvQkFDbEMsU0FBUyx1QkFBdUIsRUFBRSxDQUFDO2dCQUVyQyxJQUFJLHdCQUF3QixHQUFHLG1CQUFtQixDQUFDLElBQUksQ0FBQztnQkFFeEQsTUFBTSx3QkFBd0IsR0FBRywrQkFBK0I7cUJBQzdELElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLGNBQWMsSUFBSSx1QkFBdUIsQ0FBQztvQkFDekQsRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUNsQixDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQ2hELEVBQUUsS0FBSyxDQUFDO2dCQUVYLElBQ0Usd0JBQXdCO29CQUN4Qix3QkFBd0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQ3RDLENBQUM7b0JBQ0Qsd0JBQXdCLEdBQUcsd0JBQXdCLENBQUM7Z0JBQ3RELENBQUM7cUJBQU0sQ0FBQztvQkFDTix3QkFBd0IsR0FBRyxFQUFFLENBQUM7Z0JBQ2hDLENBQUM7Z0JBQ0QsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLENBQUMsbUJBQW1CLENBQ2pELElBQUksQ0FBQyxrQkFBa0IsRUFDdkIsSUFBSSxDQUFDLGtCQUFrQixDQUN4QixDQUFDO2dCQUVGLE1BQU0sUUFBUSxHQUFzQjtvQkFDbEMsR0FBRyxFQUFFLFdBQVc7b0JBQ2hCLElBQUksRUFBRSxJQUFJO29CQUNWLEtBQUssRUFBRTt3QkFDTCxLQUFLLEVBQUUsd0JBQXdCO3dCQUMvQixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07d0JBQ25CLFlBQVksRUFBRSx1QkFBdUI7d0JBQ3JDLGNBQWMsRUFBRSxtQkFBbUI7d0JBQ25DLFNBQVMsRUFBRSxJQUFJLENBQUMsa0JBQWtCO3dCQUNsQyxxQkFBcUIsRUFBRSxJQUFJLENBQUMsYUFBYTt3QkFDekMsZ0JBQWdCLEVBQUUsSUFBSTt3QkFDdEIsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLGtCQUFrQjt3QkFDM0MsaUJBQWlCLEVBQUUsaUJBQWlCO3dCQUNwQyxRQUFRLEVBQUUsSUFBSTt3QkFDZCxVQUFVLEVBQUU7NEJBQ1YsS0FBSyxFQUFFLElBQUksQ0FBQyxtQ0FBbUMsQ0FDN0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQ2hDO3lCQUNGO3dCQUNELE9BQU8sRUFBRSxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsS0FBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDOzRCQUN4RCxLQUFLLEVBQUUsS0FBSzs0QkFDWixLQUFLLEVBQ0gsS0FBSyxDQUFDLG9CQUFvQixDQUN4QixLQUFLLENBQUMsaUJBQWlCLEVBQ3ZCLGlCQUFpQixDQUNsQixJQUFJLEtBQUssQ0FBQyxJQUFJOzRCQUNqQixrQkFBa0IsRUFBRSxJQUFJLENBQUMsa0JBQWtCO3lCQUM1QyxDQUFDLENBQUM7cUJBQ0o7aUJBQ0YsQ0FBQztnQkFFRixJQUFJLG1CQUFtQixDQUFDLGNBQWMsRUFBRSxDQUFDO29CQUN2QyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQzVDLG1CQUFtQixFQUNuQixtQkFBbUIsQ0FBQyxjQUFjLENBQ25DLENBQUM7b0JBQ0YsSUFBSSxVQUFVLEVBQUUsQ0FBQzt3QkFDZixRQUFRLENBQUMsWUFBWSxHQUFHLFVBQVUsQ0FBQztvQkFDckMsQ0FBQztnQkFDSCxDQUFDO2dCQUVELE1BQU0sZ0JBQWdCLEdBQUcscUJBQXFCLENBQUMsTUFBTTtvQkFDbkQsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxVQUFVO29CQUN6QyxDQUFDLENBQUMsSUFBSSxDQUFDO2dCQUNULElBQUksZ0JBQWdCLEVBQUUsQ0FBQztvQkFDckIsTUFBTSxXQUFXLEdBQUcsZ0JBQWdCLENBQUMsU0FBUyxDQUM1QyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxxQkFBcUIsQ0FBQyxHQUFHLENBQ25ELENBQUM7b0JBQ0YsSUFBSSxXQUFXLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQzt3QkFDdkIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUN0QyxnQkFBZ0IsRUFDaEIsV0FBVyxDQUNaLENBQUM7d0JBRUYsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUNoRCxnQkFBZ0IsRUFDaEIsV0FBVyxDQUNaLENBQUM7d0JBQ0YsUUFBUSxDQUFDLFNBQVMsR0FBRyxlQUFlLEtBQUssQ0FBQzs0QkFDeEMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLFNBQVM7NEJBQ2pDLENBQUMsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsZUFBZSxDQUFDLENBQUM7d0JBRWpELGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQzt3QkFFbkQsTUFBTSxjQUFjLEdBQ2xCLElBQUksS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQzt3QkFDNUQsUUFBUSxDQUFDLFNBQVMsSUFBSSxjQUFjLENBQUM7d0JBQ3JDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUM7d0JBQ2pELElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO29CQUM1QixDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBRUQscUJBQXFCLENBQUMsTUFBMkIsRUFBRSxLQUFhO1FBQzlELElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQztRQUNuQixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUIsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQztRQUNsQyxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssZUFBZSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDO1lBQ2pFLElBQUksU0FBUyxJQUFJLFNBQVMsQ0FBQyxVQUFVLENBQUMsbUJBQW1CLENBQUMsRUFBRSxDQUFDO2dCQUMzRCxVQUFVO29CQUNSLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQzFFLENBQUM7aUJBQU0sSUFBSSxTQUFTLElBQUksU0FBUyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO2dCQUM3RCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ25FLFVBQVUsR0FBRyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUM7WUFDckMsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBRUQsb0NBQW9DLENBQ2xDLE1BQTJCLEVBQzNCLFVBQWtCLEVBQ2xCLFFBQWdCO1FBRWhCLElBQUksbUJBQW1CLEdBQUcsR0FBRyxDQUFDO1FBRTlCLEtBQUssSUFBSSxDQUFDLEdBQUcsVUFBVSxFQUFFLENBQUMsSUFBSSxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUM1QyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3pELG1CQUFtQixJQUFJLFVBQVUsQ0FBQztRQUNwQyxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLG1CQUFtQixFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyx3QkFBMkM7UUFDL0QsTUFBTSwyQkFBMkIsR0FDL0Isd0JBQXdCLENBQUMsS0FBSyxFQUFFLENBQUMsZ0JBQWdCLENBQUM7WUFDaEQsRUFBRSwyQkFBMkIsQ0FBQztRQUVsQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsMkJBQTJCLENBQUMsRUFBRSxDQUFDO1lBQy9DLE1BQU0sZ0JBQWdCLEdBQUcsd0JBQXdCLENBQUMsTUFBTTtnQkFDdEQsQ0FBQyxDQUFDLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxVQUFVO2dCQUM1QyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ1QsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO2dCQUNyQixNQUFNLFdBQVcsR0FBRyxnQkFBZ0IsQ0FBQyxTQUFTLENBQzVDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLHdCQUF3QixDQUFDLEdBQUcsQ0FDdEQsQ0FBQztnQkFFRixJQUFJLFdBQVcsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUN2QixLQUFLLE1BQU0sSUFBSSxJQUFJLDJCQUEyQixFQUFFLENBQUM7d0JBQy9DLE1BQU0sUUFBUSxHQUFHLFFBQVEsR0FBRyxJQUFJLENBQUM7d0JBRWpDLEtBQUssSUFBSSxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7NEJBQy9ELE1BQU0sZUFBZSxHQUFHLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsQ0FBQzs0QkFDNUQsSUFBSSxlQUFlLElBQUksZUFBZSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dDQUNwRCxJQUFJLENBQUMscUJBQXFCLENBQUMsUUFBUSxDQUFDLENBQUM7Z0NBQ3JDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7NEJBQ2hDLENBQUM7d0JBQ0gsQ0FBQztvQkFDSCxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsdUJBQXVCLENBQzNCLG1CQUEyQixFQUMzQixxQkFBd0MsRUFDeEMsSUFBUyxFQUNULCtCQUFzRDtRQUV0RCxJQUFJLG1CQUFtQixFQUFFLENBQUM7WUFDeEIsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUNwRSxJQUFJLGVBQWUsRUFBRSxDQUFDO2dCQUNwQixJQUFJLG9CQUFvQixHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUM7Z0JBQ2hELE1BQU0sV0FBVyxHQUNmLCtCQUErQjtxQkFDNUIsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsY0FBYyxJQUFJLG1CQUFtQixDQUFDO29CQUNyRCxFQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDO29CQUNwRSxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUM7Z0JBQ2xCLElBQUksV0FBVyxFQUFFLENBQUM7b0JBQ2hCLG9CQUFvQixHQUFHLFdBQVcsQ0FBQztnQkFDckMsQ0FBQztnQkFDRCxNQUFNLFFBQVEsR0FBc0I7b0JBQ2xDLEdBQUcsRUFBRSxHQUFHLHFCQUFxQixDQUFDLEdBQUcsVUFBVSxtQkFBbUIsRUFBRTtvQkFDaEUsSUFBSSxFQUFFLElBQUk7b0JBQ1YsS0FBSyxFQUFFO3dCQUNMLEtBQUssRUFBRSxvQkFBb0I7d0JBQzNCLGNBQWMsRUFBRSxlQUFlO3dCQUMvQixTQUFTLEVBQUUsSUFBSSxDQUFDLGtCQUFrQjt3QkFDbEMscUJBQXFCLEVBQUUsSUFBSSxDQUFDLGFBQWE7d0JBQ3pDLE9BQU8sRUFBRSxlQUFlLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQzs0QkFDL0MsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFOzRCQUNmLEtBQUssRUFBRSxLQUFLLENBQUMsSUFBSTt5QkFDbEIsQ0FBQyxDQUFDO3dCQUNILFFBQVEsRUFBRSxJQUFJO3dCQUNkLFVBQVUsRUFBRTs0QkFDVixLQUFLLEVBQUUsSUFBSSxDQUFDLG1DQUFtQyxDQUM3QyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FDaEM7eUJBQ0Y7cUJBQ0Y7b0JBQ0QsS0FBSyxFQUFFO3dCQUNMLE1BQU0sRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFOzRCQUNoQixNQUFNLFlBQVksR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDOzRCQUN6QyxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDOzRCQUVqRCxLQUFLLENBQUMsV0FBVyxFQUFFLFlBQVk7aUNBQzVCLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7aUNBQzdCLFNBQVMsQ0FBQyxLQUFLLEVBQUUsYUFBYSxFQUFFLEVBQUU7Z0NBQ2pDLE1BQU0sY0FBYyxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUNqRCxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxhQUFhLENBQ2xDLENBQUM7Z0NBQ0YsSUFBSSxjQUFjLElBQUksY0FBYyxDQUFDLG1CQUFtQixFQUFFLENBQUM7b0NBQ3pELE1BQU0sSUFBSSxDQUFDLHVCQUF1QixDQUNoQyxjQUFjLENBQUMsbUJBQW1CLEVBQ2xDLEtBQUssRUFDTCxJQUFJLEVBQ0osK0JBQStCLENBQ2hDLENBQUM7Z0NBQ0osQ0FBQztxQ0FBTSxDQUFDO29DQUNOLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQ0FDOUIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0NBQzVCLENBQUM7NEJBQ0gsQ0FBQyxDQUFDLENBQUM7NEJBRUwsS0FBSyxDQUFDLEtBQU0sQ0FBQyxTQUFTLEdBQUcsR0FBRyxFQUFFO2dDQUM1QixZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7Z0NBQ3BCLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQzs0QkFDMUIsQ0FBQyxDQUFDO3dCQUNKLENBQUM7cUJBQ0Y7aUJBQ0YsQ0FBQztnQkFFRixNQUFNLGdCQUFnQixHQUFHLHFCQUFxQixDQUFDLE1BQU07b0JBQ25ELENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsVUFBVTtvQkFDekMsQ0FBQyxDQUFDLElBQUksQ0FBQztnQkFDVCxJQUFJLGdCQUFnQixFQUFFLENBQUM7b0JBQ3JCLE1BQU0sV0FBVyxHQUFHLGdCQUFnQixDQUFDLFNBQVMsQ0FDNUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUsscUJBQXFCLENBQUMsR0FBRyxDQUNuRCxDQUFDO29CQUNGLElBQUksV0FBVyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7d0JBQ3ZCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FDdEMsZ0JBQWdCLEVBQ2hCLFdBQVcsQ0FDWixDQUFDO3dCQUVGLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FDaEQsZ0JBQWdCLEVBQ2hCLFdBQVcsQ0FDWixDQUFDO3dCQUNGLFFBQVEsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGVBQWUsQ0FBQyxDQUFDO3dCQUNsRSxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7d0JBRW5ELE1BQU0sY0FBYyxHQUNsQixJQUFJLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUM7d0JBQzVELFFBQVEsQ0FBQyxTQUFTLElBQUksY0FBYyxDQUFDO3dCQUNyQyxtREFBbUQ7d0JBQ25ELElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO29CQUM1QixDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sT0FBTyxDQUFDLElBQUksQ0FDVix1Q0FBdUMsbUJBQW1CLEVBQUUsQ0FDN0QsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELFlBQVk7UUFDVixPQUFPLENBQUMsR0FBRyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRUQsa0JBQWtCLENBQUMsTUFBMkIsRUFBRSxXQUFtQjtRQUNqRSxNQUFNLGVBQWUsR0FBRyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUN0RCxJQUFJLFNBQVMsR0FBRyxXQUFXLENBQUM7UUFFNUIsS0FBSyxJQUFJLENBQUMsR0FBRyxXQUFXLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDckQsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDO2dCQUMxRCxTQUFTLEdBQUcsQ0FBQyxDQUFDO1lBQ2hCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixNQUFNO1lBQ1IsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsY0FBYyxDQUNaLE1BQTJCLEVBQzNCLEdBQVc7UUFFWCxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3pCLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFLENBQUM7WUFDM0IsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ2pELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDbEUsSUFBSSxjQUFjO29CQUFFLE9BQU8sY0FBYyxDQUFDO1lBQzVDLENBQUM7WUFFRCxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssR0FBRyxFQUFFLENBQUM7Z0JBQ3RCLE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztZQUNELElBQUksS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNyQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ3pELElBQUksS0FBSztvQkFBRSxPQUFPLEtBQUssQ0FBQztZQUMxQixDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELGlCQUFpQixDQUFDLFdBQThCO1FBQzlDLE1BQU0sZ0JBQWdCLEdBQUcsV0FBVyxDQUFDLE1BQU07WUFDekMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsVUFBVTtZQUMvQixDQUFDLENBQUMsSUFBSSxDQUFDO1FBRVQsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3JCLE1BQU0sV0FBVyxHQUFHLGdCQUFnQixDQUFDLFNBQVMsQ0FDNUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssV0FBVyxDQUFDLEdBQUcsQ0FDekMsQ0FBQztZQUVGLElBQUksV0FBVyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZCLE1BQU0sZUFBZSxHQUFHLEdBQUcsV0FBVyxDQUFDLEdBQUcsU0FBUyxDQUFDO2dCQUVwRCx3Q0FBd0M7Z0JBQ3hDLEtBQUssSUFBSSxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7b0JBQy9ELE1BQU0sZUFBZSxHQUFHLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsQ0FBQztvQkFDNUQsSUFBSSxlQUFlLElBQUksZUFBZSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDO3dCQUNuRSxJQUFJLENBQUMscUJBQXFCLENBQUMsZUFBZSxDQUFDLENBQUM7d0JBQzVDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQ2hDLENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLDJCQUEyQjtRQUN2QyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxlQUFlLEVBQUUsQ0FBQztZQUNwQyxPQUFPLENBQUMsSUFBSSxDQUFDLDhDQUE4QyxDQUFDLENBQUM7WUFDN0QsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUM7WUFDSCxNQUFNLFFBQVEsR0FBRyxNQUFNLGNBQWMsQ0FDbkMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FDOUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQzdCLGVBQWUsQ0FBQyxNQUFNLENBQ3ZCLENBQ0YsQ0FBQztZQUVGLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ3RCLE9BQU8sQ0FBQyxLQUFLLENBQ1gsd0NBQXdDLEVBQ3hDLFFBQVEsQ0FBQyxNQUFNLENBQ2hCLENBQUM7Z0JBQ0YsT0FBTztZQUNULENBQUM7WUFFRCxrRkFBa0Y7WUFDbEYsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtnQkFDN0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3JDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixPQUFPLENBQUMsS0FBSyxDQUFDLG9DQUFvQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzdELENBQUM7SUFDSCxDQUFDO0lBRUQscUJBQXFCLENBQUMsUUFBZ0I7UUFDcEMsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNqQyxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3hCLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFFdkIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDekMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFjLENBQUM7WUFDNUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QixDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDdkMsSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ3JDLE9BQU8sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbEMsQ0FBQztRQUVELElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUMzQyxPQUFPLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN6QixDQUFDO0lBQ0gsQ0FBQztJQUVELFNBQVMsQ0FDUCxNQUEyQixFQUMzQixHQUFXO1FBRVgsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUMzQixJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssR0FBRyxFQUFFLENBQUM7Z0JBQ3RCLE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztZQUNELElBQUksS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNyQixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQzFELElBQUksV0FBVyxFQUFFLENBQUM7b0JBQ2hCLE9BQU8sV0FBVyxDQUFDO2dCQUNyQixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFTyx5QkFBeUIsQ0FBQyxRQUFhO1FBQzdDLElBQUksUUFBUSxFQUFFLENBQUM7WUFDYixJQUFJLFFBQVEsR0FBRyxxQkFBcUIsQ0FBQyx5QkFBeUIsQ0FDNUQsUUFBUSxFQUNSLElBQUksQ0FBQyxJQUFJLEVBQ1QsSUFBSSxDQUFDLGFBQWEsRUFDbEIsSUFBSSxDQUFDLGtCQUFrQixDQUN4QixDQUFDO1lBQ0YsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLEdBQUcsUUFBUSxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUM3QixDQUFDO0lBQ0gsQ0FBQztJQUVPLHNCQUFzQixDQUM1QixVQUFxQyxFQUNyQyxjQUFzQjtRQUV0QixPQUFPLHFCQUFxQixDQUFDLHNCQUFzQixDQUNqRCxVQUFVLEVBQ1YsY0FBYyxFQUNkLElBQUksQ0FBQyxrQkFBa0IsQ0FDeEIsQ0FBQztJQUNKLENBQUM7SUFFRCxrQkFBa0I7UUFDaEIsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFTyx3QkFBd0I7UUFDOUIsS0FBSyxNQUFNLE9BQU8sSUFBSSxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztZQUNwRCxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDZixPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDckIsQ0FBQztRQUNELElBQUksQ0FBQyx3QkFBd0IsR0FBRyxFQUFFLENBQUM7SUFDckMsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUNoQyxJQUFJLElBQUksQ0FBQyw2QkFBNkIsRUFBRSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuRCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztZQUNqQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDN0MsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ25DLENBQUM7SUFDSCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsYUFBb0I7UUFDbkMsSUFBSSxDQUFDLGFBQWEsSUFBSSxhQUFhLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2pELE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUNELE9BQU8sYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNwQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUU7WUFDaEMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxNQUFNLENBQUMsS0FBSztZQUNyRSxRQUFRLEVBQUUsV0FBVyxNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxFQUFFO1NBQ2xELENBQUMsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUVPLG1DQUFtQyxDQUFDLFFBQWE7UUFDdkQsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQzthQUM1QixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxLQUFLLGtCQUFrQixDQUFDO2FBQ3BELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsS0FBSyxLQUFLLEVBQUUsQ0FBQzthQUN6QyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEIsQ0FBQztJQUVELGlCQUFpQixDQUFDLElBQXdCO1FBQ3hDLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN6RCxPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuQixDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FDdkQsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDZixPQUFPLENBQUMsR0FBRyxDQUFDLDBCQUEwQixFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ2xELE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQztRQUNwQixDQUFDLENBQUMsRUFDRixVQUFVLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNuQixPQUFPLENBQUMsS0FBSyxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDdEQsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkIsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRDs7O09BR0c7SUFDSSw0QkFBNEI7UUFDakMsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsb0JBQW9CLEdBQUcsS0FBSyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDN0IsQ0FBQztJQUNILENBQUM7K0dBaG1HVSxzQkFBc0I7bUdBQXRCLHNCQUFzQixpbkJBQ25CLFdBQVcscUVDcEYzQixndUNBd0NBOzs0RkQyQ2Esc0JBQXNCO2tCQUxsQyxTQUFTOytCQUNFLGlCQUFpQjt1ZkFLQSxZQUFZO3NCQUF0QyxZQUFZO3VCQUFDLFdBQVc7Z0JBR2hCLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUdHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxHQUFHO3NCQUFYLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQWNJLGVBQWU7c0JBQXhCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3QsXG4gIFJlbmRlcmVyMixcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkcmVuLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gIEZvcm1seUZpZWxkLFxuICBGb3JtbHlGaWVsZENvbmZpZyxcbiAgRm9ybWx5Rm9ybU9wdGlvbnMsXG59IGZyb20gJ0BuZ3gtZm9ybWx5L2NvcmUnO1xuaW1wb3J0IHtcbiAgU3ViamVjdCxcbiAgZmlyc3RWYWx1ZUZyb20sXG4gIHN0YXJ0V2l0aCxcbiAgcGFpcndpc2UsXG4gIGRlYm91bmNlVGltZSxcbiAgc3dpdGNoTWFwLFxuICBjYXRjaEVycm9yLFxuICBvZixcbiAgdGFrZVVudGlsLFxuICBPYnNlcnZhYmxlLFxuICBtYXAsXG4gIFN1YnNjcmlwdGlvbixcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBMYWJlbEtleXMgfSBmcm9tICcuL2VudW1zL2xhYmVsLmtleXMnO1xuaW1wb3J0IHsgQXBpVmFsaWRhdGVSZXF1ZXN0IH0gZnJvbSAnLi9tb2RlbHMvYXBwbGljYXRpb24ubW9kZWwnO1xuaW1wb3J0IHtcbiAgRGljdGlvbmFyeUR0byxcbiAgRGljdGlvbmFyeVZhbHVlLFxuICBEaWN0aW9uYXJ5VmFsdWVEdG8sXG59IGZyb20gJy4vbW9kZWxzL2RpY3Rpb25hcnkubW9kZWwnO1xuaW1wb3J0IHtcbiAgRm9ybU1vZGVsLFxuICBEaXNwbGF5TW9kZWwsXG4gIEdlbmVyYWxEYXRhTW9kZWwsXG4gIFN0ZXBzU2V0dGluZ3MsXG4gIEZsdXhUeXBlLFxuICBEaW1lbnNpb25UeXBlLFxuICBTdGVwQ29udHJvbFR5cGUsXG4gIE1hbnVhbElucHV0Q29udHJvbFR5cGUsXG4gIFByZXNlbnRhdGlvblBhcmFncmFwaENvbnRyb2wsXG4gIERpY3Rpb25hcnlDb250cm9sRGF0YSxcbn0gZnJvbSAnLi9tb2RlbHMvZm9ybXMubW9kZWwnO1xuaW1wb3J0IHsgTGFiZWxJbmZvLCBUcmFuc2xhdGlvbkluZm8gfSBmcm9tICcuL21vZGVscy9sYWJlbC1pbmZvLm1vZGVsJztcbmltcG9ydCB7IExhYmVsIH0gZnJvbSAnLi9tb2RlbHMvbGFiZWwubW9kZWwnO1xuaW1wb3J0IHsgTGFuZ3VhZ2UgfSBmcm9tICcuL21vZGVscy9sYW5ndWFnZS5tb2RlbCc7XG5pbXBvcnQgeyBEaWN0aW9uYXJ5TGFiZWxJbmZvIH0gZnJvbSAnLi9vdGhlcnMvZGljdGlvbmFyeS1sYWJlbC1pbmZvJztcbmltcG9ydCB7IEVudmlyb25tZW50VHlwZSB9IGZyb20gJy4vb3RoZXJzL2Vudmlyb25tZW50LXR5cGUnO1xuaW1wb3J0IHsgQ3NzUnVsZXMsIFV0aWxzIH0gZnJvbSAnLi9vdGhlcnMvdXRpbHMnO1xuaW1wb3J0IHsgQXBwbGljYXRpb25EYXRhU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvYXBwbGljYXRpb25EYXRhLnNlcnZpY2UnO1xuaW1wb3J0IHsgTGFiZWxTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9sYWJlbHMuc2VydmljZSc7XG5pbXBvcnQgeyBQcm94eVNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL3Byb3h5LnNlcnZpY2UnO1xuaW1wb3J0IHsgRGljdGlvbmFyeVNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2RpY3Rpb25hcnkuc2VydmljZSc7XG5pbXBvcnQgeyBMYW5ndWFnZVNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2xhbmd1YWdlLnNlcnZpY2UnO1xuaW1wb3J0IHsgT3JpZ2luRm9ybUF1dGhTZXJ2aWNlIH0gZnJvbSAnLi9vcmlnaW4tZm9ybS1hdXRoLnNlcnZpY2UnO1xuaW1wb3J0IHsgRm9ybXNTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9mb3Jtcy5zZXJ2aWNlJztcbmltcG9ydCB7IElucHV0Q29uZmlnIH0gZnJvbSAnLi9vcmlnaW4tZm9ybS1jb25maWcubW9kZWwnO1xuaW1wb3J0IHsgQ29uZmlnU2VydmljZSB9IGZyb20gJy4vb3RoZXJzL2NvbmZpZy1zZXJ2aWNlJztcbmltcG9ydCB7IE1vZGVsUG9wdWxhdGlvbkhlbHBlciB9IGZyb20gJy4vbW9kZWwtcG9wdWxhdGlvbi5oZWxwZXInO1xuaW1wb3J0IHsgVHJhbnNsYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy90cmFuc2xhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIE9wZXJhdGlvblJlc3VsdCxcbiAgT3JpZ2luRm9ybVNpZ25hbHJIYW5kbGVyU2VydmljZSxcbn0gZnJvbSAnLi9zZXJ2aWNlcy9vcmlnaW4tZm9ybS1zaWduYWxyLWhhbmRsZXIuc2VydmljZSc7XG5pbXBvcnQgeyBBY3Rpb25TdGVwSGFuZGxlciB9IGZyb20gJy4vYWN0aW9uLXN0ZXAtaGFuZGxlcic7XG5pbXBvcnQgeyBTY3JvbGxUb0Vycm9yU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvc2Nyb2xsLXRvLWVycm9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgRm9ybUNzc0hlbHBlciB9IGZyb20gJy4vZm9ybS1jc3MuaGVscGVyJztcbmltcG9ydCB7IEJhc2VDb250cm9sLCBDb250cm9sRGF0YSwgRGVwZW5kZW50RGljdGlvbmFyeURhdGEsIFByZXNlbnRhdGlvbkNvbnRyb2wsIFByZXNlbnRhdGlvbkNvbnRyb2xUeXBlLCBTZWN0aW9uRGF0YSwgU3RlcERhdGEgfSBmcm9tICcuL21vZGVscy9mbHV4Lm1vZGVsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLW9yaWdpbi1mb3JtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL29yaWdpbi1mb3JtLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vb3JpZ2luLWZvcm0uY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgQ29sbGVjdG9yRm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgQFZpZXdDaGlsZHJlbihGb3JtbHlGaWVsZCkgZm9ybWx5RmllbGRzOiBRdWVyeUxpc3Q8Rm9ybWx5RmllbGQ+O1xuICBcbiAgLy90aGVzZSBhcmUgc3BlY2lmaWMgdG8gdGhlIGxpYlxuICBASW5wdXQoKSBjb25maWdDb21wb25lbnQ6IElucHV0Q29uZmlnIHwgdW5kZWZpbmVkO1xuICBASW5wdXQoKSBjb25maWdVdWlkITogc3RyaW5nO1xuICBASW5wdXQoKSBjdXJyZW50U3RlcElkOiBzdHJpbmc7XG4gIC8vZW5kIHNwZWNpZmljIHRvIGxpYlxuXG4gIEBJbnB1dCgpIGFwcE1vZGVsOiBGb3JtTW9kZWw7XG4gIEBJbnB1dCgpIHNpZ25CYXNlVXJsOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGN1cnJlbnRMYW5ndWFnZUlzbzogc3RyaW5nO1xuICBASW5wdXQoKSBmaWxsRGF0YTogYW55O1xuICBASW5wdXQoKSBlbnY6IHN0cmluZztcbiAgQElucHV0KCkgc2hvd0Rpc3BsYXlNb2RlOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHNob3dMYW5ndWFnZVNlbGVjdG9yOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgaXNEZW1vTW9kZTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBpc0RlYnVnOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGFwcERhdGFVdWlkOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGJsb2NrUHJldmlvdXNTdGVwOiBib29sZWFuO1xuICBASW5wdXQoKSBkYXRhVXJsSWQ6IHN0cmluZztcbiAgQElucHV0KCkgbm9CdXR0b25zSW5WaWV3OiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgZmx1eDogU3RlcERhdGFbXTtcbiAgcHJpdmF0ZSBkaXNwbGF5OiBEaXNwbGF5TW9kZWw7XG4gIHByaXZhdGUgZGVzaWduOiBDc3NSdWxlcztcbiAgcHJpdmF0ZSBnZW5lcmFsRGF0YTogR2VuZXJhbERhdGFNb2RlbDtcbiAgcHJpdmF0ZSBsYWJlbHM6IExhYmVsW107XG4gIHByaXZhdGUgc3RlcERpY3Rpb25hcnlEZXBlbmRlbnRJZHM6IHN0cmluZ1tdO1xuICBwcml2YXRlIGF2YWlsYWJsZUxhbmd1YWdlczogTGFuZ3VhZ2VbXTtcbiAgcHJpdmF0ZSBzdGVwc1NldHRpbmdzOiBTdGVwc1NldHRpbmdzO1xuICBmb3JtbHlDb25maWdVcGRhdGVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICB2aXNpYmxlRmllbGRzVXBkYXRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBmb3JtbHlVcGRhdGVBbmRHb05leHQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgZm9ybWx5R29OZXh0ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIEBPdXRwdXQoKSBjb21wbGV0aW9uRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgZm9ybSA9IG5ldyBGb3JtR3JvdXAoe30pO1xuICBmb3JtbHlDb25maWc6IEZvcm1seUZpZWxkQ29uZmlnW10gPSBbXTtcbiAgZm9ybWx5QWxsU3RlcHM6IEZvcm1seUZpZWxkQ29uZmlnW10gPSBbXTtcbiAgYWN0aXZlU3RlcCA9IDA7XG4gIG1vZGVsOiBhbnk7XG4gIG9wdGlvbnM6IEZvcm1seUZvcm1PcHRpb25zID0ge307XG4gIGlzTG9hZGluZzogYm9vbGVhbiA9IHRydWU7XG5cbiAgZGljdGlvbmFyeU1hcDogTWFwPHN0cmluZywgRGljdGlvbmFyeUR0bz4gPSBuZXcgTWFwKCk7XG4gIGRpY3Rpb25hcnlJZFRvVXVpZE1hcDogTWFwPG51bWJlciwgc3RyaW5nPiA9IG5ldyBNYXAoKTtcbiAgZ2VuZXJhbERhdGFLZXlzID0gTGFiZWxLZXlzLmFwcENvbmZpZ0VkaXQuZ2VuZXJhbERhdGE7XG4gIHByaXZhdGUgZmllbGRVbnN1YnNjcmliZVN1YmplY3RzOiBTdWJqZWN0PHZvaWQ+W10gPSBbXTtcbiAgcHJpdmF0ZSBjb2xsZWN0b3JIYW5kbGVyU3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gIC8vIEFjdGlvbiBzdGVwIGV4ZWN1dGlvbiBzdGF0ZVxuICBwcml2YXRlIGlzRXhlY3V0aW5nQWN0aW9ucyA9IGZhbHNlO1xuICBwcml2YXRlIGFjdGlvblN0ZXBTdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIHB1YmxpYyBpc1NhdmluZ0FmdGVyQWN0aW9ucyA9IGZhbHNlOyAvLyBNYWtlIHRoaXMgcHVibGljIHNvIHN0ZXBwZXIgY2FuIGFjY2VzcyBpdFxuXG4gIC8vIGlkZW50aWZpY2F0aW9uIGt5YyBjb21wb25lbnRcbiAgcHVibGljIGt5Y0FwaVVybDogc3RyaW5nO1xuICBwdWJsaWMga3ljT3JkZXJJZDogc3RyaW5nO1xuICBwdWJsaWMga3ljVG9rZW46IHN0cmluZztcbiAgcHVibGljIGt5Y0Vudjogc3RyaW5nO1xuICBwdWJsaWMga3ljUmVkaXJlY3RJZDogc3RyaW5nO1xuICBwdWJsaWMga3ljUGhvbmVOdW1iZXI6IHN0cmluZyA9ICcnO1xuICBwdWJsaWMga3ljTGFuZ0lzbzogc3RyaW5nID0gJyc7XG4gIHB1YmxpYyBreWNTaG93Q2l0aXplbnNoaXA6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGt5Y1Njcm9sbE1vZGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLy8gZW5kIGlkZW50aWZpY2F0aW9uIGt5YyBjb21wb25lbnRcbiAgcHVibGljIGxhbmd1YWdlRmxhZ3M6IGFueVtdID0gW1xuICAgIHtcbiAgICAgIGxhbmd1YWdlOiAnRW5nbGlzaCcsXG4gICAgICBjb2RlOiAnZW4nLFxuICAgICAgdHlwZTogJ1VTJyxcbiAgICAgIGljb246ICcvYXNzZXRzL2ltYWdlcy9mbGFnL2ljb24tZmxhZy1lbi5zdmcnLFxuICAgIH0sXG4gICAge1xuICAgICAgbGFuZ3VhZ2U6ICdSb21hbmEnLFxuICAgICAgY29kZTogJ3JvJyxcbiAgICAgIGljb246ICcvYXNzZXRzL2ltYWdlcy9mbGFnL2ljb24tZmxhZy1yby5zdmcnLFxuICAgIH0sXG4gICAge1xuICAgICAgbGFuZ3VhZ2U6ICdEZXV0c2NoJyxcbiAgICAgIGNvZGU6ICdkZScsXG4gICAgICBpY29uOiAnL2Fzc2V0cy9pbWFnZXMvZmxhZy9pY29uLWZsYWctZGUuc3ZnJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGxhbmd1YWdlOiAnRnJhbsOnYWlzJyxcbiAgICAgIGNvZGU6ICdmcicsXG4gICAgICBpY29uOiAnL2Fzc2V0cy9pbWFnZXMvZmxhZy9pY29uLWZsYWctZnIuc3ZnJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGxhbmd1YWdlOiAnSXRhbGlhbm8nLFxuICAgICAgY29kZTogJ2l0JyxcbiAgICAgIGljb246ICcvYXNzZXRzL2ltYWdlcy9mbGFnL2ljb24tZmxhZy1pdC5zdmcnLFxuICAgIH0sXG4gICAge1xuICAgICAgbGFuZ3VhZ2U6ICdFc3Bhw7FvbCcsXG4gICAgICBjb2RlOiAnZXMnLFxuICAgICAgaWNvbjogJy9hc3NldHMvaW1hZ2VzL2ZsYWcvaWNvbi1mbGFnLWVzLnN2ZycsXG4gICAgfSxcbiAgXTtcbiAgZm9ybWx5Q29sbGVjdGluZ0ZpZWxkczogRm9ybWx5RmllbGRDb25maWdbXTtcbiAgZm9ybWx5UHJlc2VudGF0aW9uRmllbGRzOiBGb3JtbHlGaWVsZENvbmZpZ1tdO1xuICBjb250cm9sSWRzV2l0aFZhbHVlczogYW55O1xuICBfc2VsZiA9IHRoaXM7XG5cbiAgXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgc2VydmljZTogRGljdGlvbmFyeVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByb3h5OiBQcm94eVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBsYWJlbFNlcnZpY2U6IExhYmVsU2VydmljZSxcbiAgICBwcml2YXRlIGFwcGxpY2F0aW9uRGF0YVNlcnZpY2U6IEFwcGxpY2F0aW9uRGF0YVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBsYW5nU2VydmljZTogTGFuZ3VhZ2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgYXV0aFNlcnZpY2U6IE9yaWdpbkZvcm1BdXRoU2VydmljZSxcbiAgICBwcml2YXRlIGZvcm1zU2VydmljZTogRm9ybXNTZXJ2aWNlLFxuICAgIHByaXZhdGUgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZSxcbiAgICBwcml2YXRlIHRyYW5zbGF0aW9uU2VydmljZTogVHJhbnNsYXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgb3JpZ2luRm9ybVNpZ25hbHJIYW5kbGVyU2VydmljZTogT3JpZ2luRm9ybVNpZ25hbHJIYW5kbGVyU2VydmljZSxcbiAgICBwcml2YXRlIGFjdGlvblN0ZXBIYW5kbGVyOiBBY3Rpb25TdGVwSGFuZGxlcixcbiAgICBwcml2YXRlIHNjcm9sbFRvRXJyb3JTZXJ2aWNlOiBTY3JvbGxUb0Vycm9yU2VydmljZVxuICApIHtcbiAgICB0aGlzLmt5Y0FwaVVybCA9IHByb3h5LmFwaVVSTDtcbiAgICB0aGlzLmt5Y09yZGVySWQgPSBwcm94eS5vcmRlcklEITtcbiAgICB0aGlzLmt5Y1Rva2VuID0gcHJveHkudG9rZW47XG4gICAgdGhpcy5reWNFbnYgPSBwcm94eS5lbnY7XG5cbiAgICB0aGlzLmt5Y0xhbmdJc28gPSBwcm94eS5sYW5nSXNvO1xuICAgIGNvbnN0IGlzTG9hZGluZ1N1YiA9XG4gICAgICB0aGlzLm9yaWdpbkZvcm1TaWduYWxySGFuZGxlclNlcnZpY2UuaXNMb2FkaW5nJC5zdWJzY3JpYmUoKGxvYWRpbmcpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNMb2FkaW5nICE9PSBsb2FkaW5nKSB7XG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBsb2FkaW5nO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB0aGlzLmNvbGxlY3RvckhhbmRsZXJTdWJzY3JpcHRpb25zLmFkZChpc0xvYWRpbmdTdWIpO1xuXG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbkNvbXBsZXRlZFN1YiA9XG4gICAgICB0aGlzLm9yaWdpbkZvcm1TaWduYWxySGFuZGxlclNlcnZpY2Uub3BlcmF0aW9uQ29tcGxldGVkJC5zdWJzY3JpYmUoXG4gICAgICAgIGFzeW5jIChyZXN1bHQ6IE9wZXJhdGlvblJlc3VsdCkgPT4ge1xuICAgICAgICAgIGlmIChyZXN1bHQub3BlcmF0aW9uSWRlbnRpZmllciA9PT0gJ0tZQ19QUk9DRVNTSU5HJykge1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICdLWUMgUHJvY2Vzc2luZyBzdWNjZXNzZnVsbHkgY29tcGxldGVkICh2aWEgSGFuZGxlciBTZXJ2aWNlKTonLFxuICAgICAgICAgICAgICAgIHJlc3VsdC5kYXRhXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGlmIChyZXN1bHQuZGF0YSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsbERhdGEgPSBKU09OLnBhcnNlKHJlc3VsdC5kYXRhLmZpbGxEYXRhKTtcbiAgICAgICAgICAgICAgICB0aGlzLnBvcHVsYXRlTW9kZWxXaXRoRmlsbERhdGEodGhpcy5maWxsRGF0YSk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB0aGlzLmZvcm1seVVwZGF0ZUFuZEdvTmV4dC5lbWl0KHt9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgJ0tZQyBQcm9jZXNzaW5nIGZhaWxlZCAodmlhIEhhbmRsZXIgU2VydmljZSk6JyxcbiAgICAgICAgICAgICAgICByZXN1bHQuZXJyb3JcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgdGhpcy5jb2xsZWN0b3JIYW5kbGVyU3Vic2NyaXB0aW9ucy5hZGQob3BlcmF0aW9uQ29tcGxldGVkU3ViKTtcblxuICAgIC8vIFN1YnNjcmliZSB0byBhY3Rpb24gc3RlcCBleGVjdXRpb24gZXZlbnRzXG4gICAgY29uc3QgYWN0aW9uRXhlY3V0aW5nU3ViID1cbiAgICAgIHRoaXMuYWN0aW9uU3RlcEhhbmRsZXIuYWN0aW9uRXhlY3V0aW5nJC5zdWJzY3JpYmUoKGV4ZWN1dGluZykgPT4ge1xuICAgICAgICB0aGlzLmlzRXhlY3V0aW5nQWN0aW9ucyA9IGV4ZWN1dGluZztcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBleGVjdXRpbmc7XG4gICAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSk7XG4gICAgdGhpcy5hY3Rpb25TdGVwU3Vic2NyaXB0aW9ucy5hZGQoYWN0aW9uRXhlY3V0aW5nU3ViKTtcblxuICAgIGNvbnN0IGFjdGlvbkNvbXBsZXRlZFN1YiA9XG4gICAgICB0aGlzLmFjdGlvblN0ZXBIYW5kbGVyLmFjdGlvbkNvbXBsZXRlZCQuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ/CfjqwgQWN0aW9uIHN0ZXAgY29tcGxldGVkOicsIHJlc3VsdCk7XG4gICAgICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCfinYwgQWN0aW9uIHN0ZXAgZmFpbGVkOicsIHJlc3VsdC5lcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm90ZTogV2UgZG9uJ3QgYXV0by1wcm9ncmVzcyBoZXJlIGFzIGl0J3MgaGFuZGxlZCBpbiBleGVjdXRlQWN0aW9uU3RlcHNCZWZvcmVNb3ZpbmdcbiAgICAgIH0pO1xuICAgIHRoaXMuYWN0aW9uU3RlcFN1YnNjcmlwdGlvbnMuYWRkKGFjdGlvbkNvbXBsZXRlZFN1Yik7XG4gIH1cblxuICBhc3luYyBuZ09uSW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5kYXRhVXJsSWQpIHtcbiAgICAgIHZhciByZXN1bHQgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShcbiAgICAgICAgdGhpcy5hcHBsaWNhdGlvbkRhdGFTZXJ2aWNlLmdldERhdGFVcmwodGhpcy5kYXRhVXJsSWQpXG4gICAgICApO1xuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICB0aGlzLmNvbmZpZ1V1aWQgPSByZXN1bHQuYXBwSWQ7XG4gICAgICAgIHRoaXMuYXBwRGF0YVV1aWQgPSByZXN1bHQuYXBwRGF0YUlkO1xuICAgICAgICB0aGlzLmVudiA9IHJlc3VsdC5lbnY7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYXBwRGF0YVV1aWQgJiYgdGhpcy5jdXJyZW50U3RlcElkKSB7XG4gICAgICB0aGlzLmFwcGxpY2F0aW9uRGF0YVNlcnZpY2Uuc2V0Q3VycmVudFN0ZXAoXG4gICAgICAgIHRoaXMuYXBwRGF0YVV1aWQsXG4gICAgICAgIHRoaXMuY3VycmVudFN0ZXBJZFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuYXBwRGF0YVV1aWQpIHtcbiAgICAgIHRoaXMuYXBwRGF0YVV1aWQgPSBVdGlscy5nZW5lcmF0ZVVVSUQoKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLmNvbmZpZ0NvbXBvbmVudCAmJlxuICAgICAgdGhpcy5jb25maWdDb21wb25lbnQuVG9rZW4gJiZcbiAgICAgIHRoaXMuY29uZmlnQ29tcG9uZW50LlJlZnJlc2hUb2tlblxuICAgICkge1xuICAgICAgdGhpcy5jb25maWdTZXJ2aWNlLnVwZGF0ZUNvbmZpZ0Zyb21JbnB1dCh0aGlzLmNvbmZpZ0NvbXBvbmVudCk7XG4gICAgICBhd2FpdCB0aGlzLmF1dGhTZXJ2aWNlLnNldFRva2VucyhcbiAgICAgICAgdGhpcy5jb25maWdDb21wb25lbnQuVG9rZW4sXG4gICAgICAgIHRoaXMuY29uZmlnQ29tcG9uZW50LlJlZnJlc2hUb2tlblxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmF2YWlsYWJsZUxhbmd1YWdlcyB8fCB0aGlzLmF2YWlsYWJsZUxhbmd1YWdlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMubGFuZ1NlcnZpY2UuZ2V0TGFuZ3VhZ2VzKCkpLnRoZW4oKGxpc3QpID0+IHtcbiAgICAgICAgaWYgKGxpc3QgJiYgbGlzdC5pdGVtcz8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMuYXZhaWxhYmxlTGFuZ3VhZ2VzID0gbGlzdC5pdGVtcztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMubG9hZEFwcERhdGEoKTtcbiAgICBpZiAoIXRoaXMuY3VycmVudExhbmd1YWdlSXNvICYmIHRoaXMuYXBwTW9kZWwpIHtcbiAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvID0gdGhpcy5hcHBNb2RlbC5nZW5lcmFsRGF0YS5kZWZhdWx0TGFuZ3VhZ2U7XG4gICAgfVxuICAgIGlmICh0aGlzLmFwcE1vZGVsKSB7XG4gICAgICBhd2FpdCB0aGlzLmluaXRBc3luYygpO1xuICAgIH1cbiAgfVxuXG4gYXN5bmMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChjaGFuZ2VzWydjb25maWdDb21wb25lbnQnXSAmJiAhY2hhbmdlc1snY29uZmlnQ29tcG9uZW50J10uZmlyc3RDaGFuZ2UpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5jb25maWdDb21wb25lbnQgJiZcbiAgICAgICAgdGhpcy5jb25maWdDb21wb25lbnQuVG9rZW4gJiZcbiAgICAgICAgdGhpcy5jb25maWdDb21wb25lbnQuUmVmcmVzaFRva2VuXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5jb25maWdTZXJ2aWNlLnVwZGF0ZUNvbmZpZ0Zyb21JbnB1dCh0aGlzLmNvbmZpZ0NvbXBvbmVudCk7XG4gICAgICAgIGF3YWl0IHRoaXMuYXV0aFNlcnZpY2Uuc2V0VG9rZW5zKFxuICAgICAgICAgIHRoaXMuY29uZmlnQ29tcG9uZW50LlRva2VuLFxuICAgICAgICAgIHRoaXMuY29uZmlnQ29tcG9uZW50LlJlZnJlc2hUb2tlblxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoXG4gICAgICBjaGFuZ2VzWydjdXJyZW50TGFuZ3VhZ2VJc28nXSAmJlxuICAgICAgIWNoYW5nZXNbJ2N1cnJlbnRMYW5ndWFnZUlzbyddLmZpcnN0Q2hhbmdlXG4gICAgKSB7XG4gICAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghdGhpcy5hdmFpbGFibGVMYW5ndWFnZXMpIHtcbiAgICAgICAgICBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLmxhbmdTZXJ2aWNlLmdldExhbmd1YWdlcygpKS50aGVuKChsaXN0KSA9PiB7XG4gICAgICAgICAgICBpZiAobGlzdCAmJiBsaXN0Lml0ZW1zPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHRoaXMuYXZhaWxhYmxlTGFuZ3VhZ2VzID0gbGlzdC5pdGVtcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hcHBEYXRhVXVpZCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBhcHBEYXRhID0gYXdhaXQgdGhpcy5hcHBsaWNhdGlvbkRhdGFTZXJ2aWNlLmdldFN0ZXBzKFxuICAgICAgICAgICAgICB0aGlzLmFwcERhdGFVdWlkXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGFwcERhdGEgJiYgYXBwRGF0YS5maWxsRGF0YSkge1xuICAgICAgICAgICAgICB0aGlzLmZpbGxEYXRhID0gSlNPTi5wYXJzZShhcHBEYXRhLmZpbGxEYXRhKTtcbiAgICAgICAgICAgICAgdGhpcy5ibG9ja1ByZXZpb3VzU3RlcCA9IGFwcERhdGEuYmxvY2tQcmV2aW91c1N0ZXA7XG4gICAgICAgICAgICAgIGlmICh0aGlzLmZpbGxEYXRhLm1ldGFkYXRhLmxhbmd1YWdlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc28gPSB0aGlzLmZpbGxEYXRhLm1ldGFkYXRhLmxhbmd1YWdlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHJldHJpZXZpbmcgYXBwIGRhdGEnLCBlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdEFzeW5jKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBsb2FkQXBwRGF0YSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlOiB7IGNvbmZpZ3VyYXRpb246IGFueTsgZmlsbERhdGE/OiBhbnkgfSA9XG4gICAgICAgIGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxuICAgICAgICAgIHRoaXMuZm9ybXNTZXJ2aWNlLmxvYWRGb3JtQnlVdWlkKHRoaXMuY29uZmlnVXVpZCwgdGhpcy5lbnYpXG4gICAgICAgICk7XG4gICAgICB0aGlzLmFwcE1vZGVsID0gSlNPTi5wYXJzZShyZXNwb25zZS5jb25maWd1cmF0aW9uKTtcbiAgICAgIHRoaXMuZmlsbERhdGEgPSByZXNwb25zZS5maWxsRGF0YSA/IEpTT04ucGFyc2UocmVzcG9uc2UuZmlsbERhdGEpIDogbnVsbDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgbG9hZGluZyBmb3JtIGRhdGEnLCBlcnJvcik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgaW5pdEFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMudW5zdWJzY3JpYmVGcm9tQWxsRmllbGRzKCk7XG4gICAgYXdhaXQgdGhpcy5idWlsZEZvcm1seUFzeW5jKCk7XG4gICAgYXdhaXQgdGhpcy5pbml0aWFsaXplUmVmZXJlbmNlRmllbGRzKHRoaXMuZm9ybWx5Q29uZmlnKTtcbiAgICB0aGlzLnVwZGF0ZUZvcm1seUNvbmZpZygpO1xuICAgIHRoaXMuZm9ybWx5Q29uZmlnVXBkYXRlZC5lbWl0KCk7XG4gICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBwdWJsaWMgYXBwbGljYXRpb25MYW5ndWFnZXMoKTogTGFuZ3VhZ2VbXSB7XG4gICAgcmV0dXJuIHRoaXMuYXZhaWxhYmxlTGFuZ3VhZ2VzPy5maWx0ZXIoKGEpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmFwcE1vZGVsPy5nZW5lcmFsRGF0YT8ubGFuZ3VhZ2VzPy5pbmRleE9mKGEuaXNvKSA+PSAwO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJldHVybkZMYWcobGFuZ3VhZ2U6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmxhbmd1YWdlRmxhZ3MuZmluZCgobCkgPT4gbC5jb2RlID09IGxhbmd1YWdlKT8uaWNvbjtcbiAgfVxuXG4gIGNoYW5nZUxhbmd1YWdlKCRldmVudDogc3RyaW5nKSB7XG4gICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc28gPSAkZXZlbnQ7XG4gICAgdGhpcy5hcHBsaWNhdGlvbkRhdGFTZXJ2aWNlXG4gICAgICAuY2hhbmdlTGFuZ3VhZ2UodGhpcy5hcHBEYXRhVXVpZCwgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc28pXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5pbml0QXN5bmMoKTtcbiAgfVxuICBnZXRMYW5ndWFnZU5hbWUobGFuZ3VhZ2VJc286IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgbGFuZ3VhZ2UgPSB0aGlzLmF2YWlsYWJsZUxhbmd1YWdlcy5maW5kKFxuICAgICAgKGxhbmcpID0+IGxhbmcuaXNvID09PSBsYW5ndWFnZUlzb1xuICAgICk7XG4gICAgcmV0dXJuIGxhbmd1YWdlID8gbGFuZ3VhZ2UubmFtZSA6ICcnO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBidWlsZEZvcm1seUFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmN1cnJlbnRMYW5ndWFnZUlzbykge1xuICAgICAgYXdhaXQgdGhpcy5nZXRMYWJlbHMoKTtcbiAgICB9XG5cbiAgICAvLyBTVEVQIDE6IEluaXRpYWxpemUgZmx1eCBhbmQgb3RoZXIgcHJvcGVydGllcyBmaXJzdFxuICAgIHRoaXMuZmx1eCA9IHRoaXMuYXBwTW9kZWwuZmx1eDtcbiAgICB0aGlzLmRpc3BsYXkgPSB0aGlzLmFwcE1vZGVsLmRpc3BsYXk7XG4gICAgdGhpcy5kZXNpZ24gPSB0aGlzLmFwcE1vZGVsLmdlbmVyYXRlZENzcztcbiAgICB0aGlzLmdlbmVyYWxEYXRhID0gdGhpcy5hcHBNb2RlbC5nZW5lcmFsRGF0YTtcbiAgICB0aGlzLmFkZFJlbmRlcmVkQ3NzKCk7XG5cbiAgICAvLyBTVEVQIDI6IExvYWQgQUxMIGRpY3Rpb25hcmllcyB1cGZyb250IChub3cgdGhhdCBmbHV4IGlzIGluaXRpYWxpemVkKVxuICAgIGF3YWl0IHRoaXMubG9hZEFsbFJlcXVpcmVkRGljdGlvbmFyaWVzKCk7XG5cbiAgICAvLyBTVEVQIDM6IENvbnRpbnVlIHdpdGggZXhpc3RpbmcgZm9ybSBidWlsZGluZyBsb2dpY1xuICAgIHRoaXMuZm9ybWx5Q29uZmlnID0gW107XG4gICAgdGhpcy5mb3JtbHlDb2xsZWN0aW5nRmllbGRzID0gW107XG4gICAgdGhpcy5mb3JtbHlQcmVzZW50YXRpb25GaWVsZHMgPSBbXTtcbiAgICB0aGlzLm1vZGVsID0ge307XG4gICAgdGhpcy5mb3JtID0gbmV3IEZvcm1Hcm91cCh7fSk7XG5cbiAgICBpZiAodGhpcy5maWxsRGF0YSkge1xuICAgICAgdGhpcy5wb3B1bGF0ZUNvbnRyb2xJZHNXaXRoVmFsdWVEaWN0aW9uYXJ5KCk7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBtb2RlbCB3aXRoIGRlZmF1bHQgdmFsdWVzIGlmIG5vIGZpbGxEYXRhXG4gICAgaWYgKCF0aGlzLmZpbGxEYXRhKSB7XG4gICAgICB0aGlzLm1vZGVsID0gTW9kZWxQb3B1bGF0aW9uSGVscGVyLmFwcGx5RGVmYXVsdHNUb01vZGVsKFxuICAgICAgICB0aGlzLmZsdXgsXG4gICAgICAgIHRoaXMuZGljdGlvbmFyeU1hcCxcbiAgICAgICAgdGhpcy5hdmFpbGFibGVMYW5ndWFnZXNcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucG9wdWxhdGVNb2RlbFdpdGhGaWxsRGF0YSh0aGlzLmZpbGxEYXRhKTtcbiAgICAgIHRoaXMucG9wdWxhdGVDb250cm9sSWRzV2l0aFZhbHVlRGljdGlvbmFyeSgpO1xuICAgIH1cblxuICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHRoaXMubW9kZWwpO1xuICAgIGF3YWl0IHRoaXMuYnVpbGRGb3JtbHlDb25maWdBc3luYygpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSByZWZlcmVuY2VzIGZvciBkZWZhdWx0IHZhbHVlc1xuICAgIGlmICghdGhpcy5maWxsRGF0YSkge1xuICAgICAgYXdhaXQgdGhpcy5pbml0aWFsaXplUmVmZXJlbmNlRmllbGRzKHRoaXMuZm9ybWx5Q29uZmlnKTtcbiAgICB9XG5cbiAgICB0aGlzLmZvcm0udmFsdWVDaGFuZ2VzXG4gICAgICAucGlwZShzdGFydFdpdGgobnVsbCksIHBhaXJ3aXNlKCkpXG4gICAgICAuc3Vic2NyaWJlKChbcHJldiwgbmV4dF06IFthbnksIGFueV0pID0+XG4gICAgICAgIHRoaXMuaGFuZGxlRm9ybVZhbHVlQ2hhbmdlKFtwcmV2LCBuZXh0XSlcbiAgICAgICk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUZvcm1WYWx1ZUNoYW5nZShbcHJldiwgbmV4dF06IFthbnksIGFueV0pIHtcbiAgICBjb25zdCBjdXJyZW50TGFuZ3VhZ2VJZCA9IFV0aWxzLmZpbmRMYW5ndWFnZUlkQnlJc28oXG4gICAgICB0aGlzLmF2YWlsYWJsZUxhbmd1YWdlcyxcbiAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgKTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBuZXh0KSB7XG4gICAgICBpZiAobmV4dFtrZXldPy52YWx1ZVRyYW5zbGF0aW9ucykge1xuICAgICAgICB2YXIgcyA9IEpTT04uc3RyaW5naWZ5KG5leHRba2V5XSk7XG4gICAgICAgIHZhciByZXBsYWNlZCA9IHMucmVwbGFjZSgvXCJ2YWx1ZVRyYW5zbGF0aW9uc1wiOi9nLCAnXCJ0cmFuc2xhdGlvbnNcIjonKTtcbiAgICAgICAgbmV4dFtrZXldID0gSlNPTi5wYXJzZShyZXBsYWNlZCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMuZm9ybWx5UHJlc2VudGF0aW9uRmllbGRzLmZpbHRlcihcbiAgICAgICAgKGkpID0+IGkucHJvcHMgJiYgaS5wcm9wc1snY29sbGVjdGlvbkNvbnRyb2xJZGVudGlmaWVyJ10gPT09IGtleVxuICAgICAgKTtcbiAgICAgIGlmIChmaWVsZHMgJiYgZmllbGRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICAgICAgbGV0IHZhbHVlID0gJyc7XG4gICAgICAgICAgc3dpdGNoICh0eXBlb2YgbmV4dFtrZXldKSB7XG4gICAgICAgICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgICAgICAgdmFsdWUgPSBuZXh0W2tleV0gPyAnJmNoZWNrOycgOiAnJmNyb3NzOyc7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICBpZiAobmV4dFtrZXldPy50cmFuc2xhdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2xhdGlvbiA9IG5leHRba2V5XS50cmFuc2xhdGlvbnMuZmluZChcbiAgICAgICAgICAgICAgICAgICh0cmFuc2xhdGlvbjogeyBsYW5ndWFnZUlkOiBhbnkgfSkgPT5cbiAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRpb24ubGFuZ3VhZ2VJZCA9PT0gY3VycmVudExhbmd1YWdlSWRcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdHJhbnNsYXRpb24gPyB0cmFuc2xhdGlvbi52YWx1ZSA6IG51bGw7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBuZXh0W2tleV07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZpZWxkLmRlZmF1bHRWYWx1ZSA9IHZhbHVlO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnN0ZXBEaWN0aW9uYXJ5RGVwZW5kZW50SWRzLmZpbmQoKGEpID0+IGEgPT0ga2V5KSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgbmV4dFtrZXldPy5pZCAmJlxuICAgICAgICAgIChwcmV2ID09IG51bGwgfHwgcHJldltrZXldPy5pZCAhPT0gbmV4dFtrZXldPy5pZClcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5mb3JtbHlDb25maWdbMF0uZmllbGRHcm91cCA9IHRoaXMuZ2V0Rm9ybWx5RmlsdGVyZWRTdGVwcygpO1xuICAgICAgICAgIHZhciBmaWx0ZXJlZFN0ZXBzSWRlbnRpZmllcnMgPSB0aGlzLmZvcm1seUNvbmZpZ1swXS5maWVsZEdyb3VwLm1hcChcbiAgICAgICAgICAgIChmKSA9PiBmLnByb3BzPy5bJ3N0ZXBJZCddXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCB2aXNpYmxlU3RlcHMgPSB0aGlzLmFjdGlvblN0ZXBIYW5kbGVyLmZpbHRlclZpc2libGVTdGVwcyhcbiAgICAgICAgICAgIHRoaXMuZmx1eCxcbiAgICAgICAgICAgIGZpbHRlcmVkU3RlcHNJZGVudGlmaWVyc1xuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy51cGRhdGVGb3JtbHlDb25maWcoKTtcbiAgICAgICAgICB0aGlzLnZpc2libGVGaWVsZHNVcGRhdGVkLmVtaXQodmlzaWJsZVN0ZXBzKTtcbiAgICAgICAgICB0aGlzLmZvcm1seUNvbmZpZ1VwZGF0ZWQuZW1pdCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRMYWJlbHMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICB0aGlzLmxhYmVsU2VydmljZVxuICAgICAgICAuZ2V0TGFiZWxzKHRoaXMuY3VycmVudExhbmd1YWdlSXNvLCBmYWxzZSlcbiAgICAgICAgLnN1YnNjcmliZSgobCkgPT4ge1xuICAgICAgICAgIHRoaXMubGFiZWxzID0gbDtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBwb3B1bGF0ZUNvbnRyb2xJZHNXaXRoVmFsdWVEaWN0aW9uYXJ5KCkge1xuICAgIHZhciBjdXJyZW50TGFuZ3VhZ2VJZCA9IHRoaXMuZ2V0Q3VycmVudExhbmd1YWdlSWQoKTtcbiAgICBjb25zdCBjb250cm9sSWRzV2l0aFZhbHVlcyA9IHRoaXMuZmlsbERhdGEuZmx1eFxuICAgICAgLmZsYXRNYXAoKHN0ZXA6IHsgc2VjdGlvbnM6IHsgY29udHJvbHM6IGFueVtdIH1bXSB9KSA9PlxuICAgICAgICBzdGVwLnNlY3Rpb25zLmZsYXRNYXAoKHNlY3Rpb246IHsgY29udHJvbHM6IGFueVtdIH0pID0+XG4gICAgICAgICAgc2VjdGlvbi5jb250cm9sc1xuICAgICAgICAgICAgLmZpbHRlcigoY29udHJvbCkgPT4gY29udHJvbC5jb250cm9sSWQgJiYgY29udHJvbC5maWxsVmFsdWUpXG4gICAgICAgICAgICAubWFwKChjb250cm9sKSA9PiAoe1xuICAgICAgICAgICAgICBjb250cm9sSWQ6IGNvbnRyb2wuY29udHJvbElkLFxuICAgICAgICAgICAgICBmaWxsVmFsdWU6IGNvbnRyb2wuZmlsbFZhbHVlLFxuICAgICAgICAgICAgICBmaWxsVmFsdWVJZDogY29udHJvbC5maWxsVmFsdWVJZCxcbiAgICAgICAgICAgIH0pKVxuICAgICAgICApXG4gICAgICApXG4gICAgICAucmVkdWNlKFxuICAgICAgICAoXG4gICAgICAgICAgZGljdGlvbmFyeTogeyBbeDogc3RyaW5nXTogYW55IH0sXG4gICAgICAgICAgeyBjb250cm9sSWQsIGZpbGxWYWx1ZSwgZmlsbFZhbHVlSWQgfTogYW55XG4gICAgICAgICkgPT4ge1xuICAgICAgICAgIGlmIChmaWxsVmFsdWVJZCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCBkaWN0XSBvZiB0aGlzLmRpY3Rpb25hcnlNYXAuZW50cmllcygpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZGljdC52YWx1ZXM/LmZpbmQoKHYpID0+IHYuaWQgPT0gZmlsbFZhbHVlSWQpO1xuICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2xhdGlvbiA9IHZhbHVlLnZhbHVlVHJhbnNsYXRpb25zLmZpbmQoXG4gICAgICAgICAgICAgICAgICAodCkgPT4gdC5sYW5ndWFnZUlkID09IGN1cnJlbnRMYW5ndWFnZUlkXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpZiAodHJhbnNsYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgIGRpY3Rpb25hcnlbY29udHJvbElkXSA9IHRyYW5zbGF0aW9uLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRpY3Rpb25hcnlbY29udHJvbElkXSA9IGZpbGxWYWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGRpY3Rpb25hcnk7XG4gICAgICAgIH0sXG4gICAgICAgIHt9IGFzIFJlY29yZDxzdHJpbmcsIGFueT5cbiAgICAgICk7XG4gICAgdGhpcy5jb250cm9sSWRzV2l0aFZhbHVlcyA9IGNvbnRyb2xJZHNXaXRoVmFsdWVzO1xuICB9XG4gIHByaXZhdGUgZ2V0Q3VycmVudExhbmd1YWdlSWQoKTogbnVtYmVyIHtcbiAgICBjb25zdCBjdXJyZW50TGFuZ3VhZ2VJZCA9IFV0aWxzLmZpbmRMYW5ndWFnZUlkQnlJc28oXG4gICAgICB0aGlzLmF2YWlsYWJsZUxhbmd1YWdlcyxcbiAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgKTtcbiAgICByZXR1cm4gY3VycmVudExhbmd1YWdlSWQ7XG4gIH1cbiAgcHJpdmF0ZSBhc3luYyBidWlsZEZvcm1seUNvbmZpZ0FzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc3RlcHNTZXR0aW5ncyA9IHtcbiAgICAgIHNob3dDb3VudGVyOiB0aGlzLnNob3dEaXNwbGF5TW9kZVxuICAgICAgICA/IGZhbHNlXG4gICAgICAgIDogdGhpcy5nZW5lcmFsRGF0YS5zaG93Q291bnRlclN0ZXAsXG4gICAgICBzaG93TGFiZWxzOiB0aGlzLnNob3dEaXNwbGF5TW9kZSA/IGZhbHNlIDogdGhpcy5nZW5lcmFsRGF0YS5zaG93TmFtZVN0ZXAsXG4gICAgICBzaG93QWxsU3RlcHM6IHRoaXMuc2hvd0Rpc3BsYXlNb2RlXG4gICAgICAgID8gZmFsc2VcbiAgICAgICAgOiB0aGlzLmdlbmVyYWxEYXRhLnNob3dBbGxTdGVwcyxcbiAgICAgIHNob3dQcm9ncmVzc0JhcjpcbiAgICAgICAgdGhpcy5nZW5lcmFsRGF0YS5zaG93UHJvZ3Jlc3NCYXIgJiZcbiAgICAgICAgICB0aGlzLmdlbmVyYWxEYXRhLnNob3dBbGxTdGVwcyA9PSBmYWxzZVxuICAgICAgICAgID8gdHJ1ZVxuICAgICAgICAgIDogZmFsc2UsXG4gICAgfTtcblxuICAgIHRoaXMuZm9ybWx5QWxsU3RlcHMgPSBhd2FpdCB0aGlzLmJ1aWxkRm9ybWx5RmllbGRHcm91cEFzeW5jKCk7XG4gICAgdmFyIGhhc0RpY3Rpb25hcnlEZXBlbmRlbnRTdGVwcyA9IHRoaXMuZm9ybWx5QWxsU3RlcHMuc29tZShcbiAgICAgIChmKSA9PiBmLnByb3BzPy5bJ2RlcGVuZGVudERpY3Rpb25hcnknXT8uaXNEaWN0aW9uYXJ5RGVwZW5kZW50XG4gICAgKTtcblxuICAgIHZhciBmb3JtbHlGaWx0ZXJlZFN0ZXBzID0gdGhpcy5nZXRGb3JtbHlGaWx0ZXJlZFN0ZXBzKCk7XG4gICAgdmFyIGZpbHRlcmVkU3RlcHNJZGVudGlmaWVycyA9IGZvcm1seUZpbHRlcmVkU3RlcHMubWFwKFxuICAgICAgKGYpID0+IGYucHJvcHM/Llsnc3RlcElkJ11cbiAgICApO1xuICAgIC8vIEdldCB2aXNpYmxlIHN0ZXBzIGZvciBhY2N1cmF0ZSBzdGVwIGNvdW50aW5nXG4gICAgY29uc3QgdmlzaWJsZVN0ZXBzID0gdGhpcy5hY3Rpb25TdGVwSGFuZGxlci5maWx0ZXJWaXNpYmxlU3RlcHModGhpcy5mbHV4KTtcbiAgICBjb25zdCBmaWx0ZXJlZFZpc2libGVTdGVwcyA9IHRoaXMuYWN0aW9uU3RlcEhhbmRsZXIuZmlsdGVyVmlzaWJsZVN0ZXBzKFxuICAgICAgdGhpcy5mbHV4LFxuICAgICAgZmlsdGVyZWRTdGVwc0lkZW50aWZpZXJzXG4gICAgKTtcblxuICAgIHRoaXMuZm9ybWx5Q29uZmlnID0gW1xuICAgICAge1xuICAgICAgICB0eXBlOiAnc3RlcHBlcicsXG4gICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgYXBwRGF0YUlkOiB0aGlzLmZpbGxEYXRhXG4gICAgICAgICAgICA/IHRoaXMuZmlsbERhdGE/Lm1ldGFkYXRhPy5hcHBEYXRhSWRcbiAgICAgICAgICAgIDogdGhpcy5hcHBEYXRhVXVpZCxcbiAgICAgICAgICBkZXNpZ246IHRoaXMuZGVzaWduLFxuICAgICAgICAgIGFwcGxpY2F0aW9uSWQ6IHRoaXMuYXBwTW9kZWwuYXBwbGljYXRpb25VdWlkLFxuICAgICAgICAgIGZsdXg6IHZpc2libGVTdGVwcywgLy8gUGFzcyBvbmx5IHZpc2libGUgc3RlcHMgdG8gc3RlcHBlclxuICAgICAgICAgIGZpbHRlcmVkRmx1eDogZmlsdGVyZWRWaXNpYmxlU3RlcHMsXG4gICAgICAgICAgaXNEaXNwbGF5TW9kZTogdGhpcy5zaG93RGlzcGxheU1vZGUsXG4gICAgICAgICAgZmlsbERhdGE6IHRoaXMuZmlsbERhdGEsXG4gICAgICAgICAgZGVmYXVsdExhbmd1YWdlOiB0aGlzLmFwcE1vZGVsLmdlbmVyYWxEYXRhLmRlZmF1bHRMYW5ndWFnZSxcbiAgICAgICAgICBkaXNwbGF5OiB0aGlzLmRpc3BsYXksXG4gICAgICAgICAgZGVzaWduQ29uZmlnOiB7XG4gICAgICAgICAgICBidXR0b25zVmVydGljYWxQb3NpdGlvbjpcbiAgICAgICAgICAgICAgdGhpcy5hcHBNb2RlbC5kZXNpZ24uYnV0dG9uc1ZlcnRpY2FsUG9zaXRpb24sXG4gICAgICAgICAgICBidXR0b25zSG9yaXpvbnRhbFBvc2l0aW9uOlxuICAgICAgICAgICAgICB0aGlzLmFwcE1vZGVsLmRlc2lnbi5idXR0b25zSG9yaXpvbnRhbFBvc2l0aW9uLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc3RlcHNTZXR0aW5nczogdGhpcy5zdGVwc1NldHRpbmdzLFxuICAgICAgICAgIG1ldGFEYXRhOiB0aGlzLmZpbGxEYXRhPy5tZXRhZGF0YSxcbiAgICAgICAgICBkZW1vTW9kZTogdGhpcy5pc0RlbW9Nb2RlLFxuICAgICAgICAgIGlzRGVidWc6IHRoaXMuaXNEZWJ1ZyxcbiAgICAgICAgICBub0J1dHRvbnNJblZpZXc6IHRoaXMubm9CdXR0b25zSW5WaWV3LFxuICAgICAgICAgIGJsb2NrUHJldmlvdXNTdGVwOiB0aGlzLmJsb2NrUHJldmlvdXNTdGVwLFxuICAgICAgICAgIGVudjogdGhpcy5lbnYsXG4gICAgICAgICAgaGFzRGljdGlvbmFyeURlcGVuZGVudFN0ZXBzOiBoYXNEaWN0aW9uYXJ5RGVwZW5kZW50U3RlcHMsXG4gICAgICAgICAgaGFzQWN0aW9uU3RlcHM6IHRoaXMuZmx1eC5zb21lKChzdGVwKSA9PlxuICAgICAgICAgICAgdGhpcy5hY3Rpb25TdGVwSGFuZGxlci5pc0FjdGlvblN0ZXAoc3RlcClcbiAgICAgICAgICApLCAvLyBJbmRpY2F0ZSBpZiB0aGVyZSBhcmUgYWN0aW9uIHN0ZXBzXG4gICAgICAgICAgY29tcGxldGlvbkV2ZW50OiAoKSA9PiB0aGlzLm9uQ29tcGxldGlvbigpLFxuICAgICAgICAgIG9uU2VsZWN0ZWRQYWdlQ2hhbmdpbmc6IChpbmRleDogbnVtYmVyKSA9PlxuICAgICAgICAgICAgdGhpcy5vblNlbGVjdGVkUGFnZUNoYW5naW5nKGluZGV4KSxcbiAgICAgICAgICBvblNlbGVjdGVkUGFnZUNoYW5nZWQ6IChpbmRleDogbnVtYmVyKSA9PlxuICAgICAgICAgICAgdGhpcy5vblNlbGVjdGVkUGFnZUNoYW5nZWQoaW5kZXgpLFxuICAgICAgICB9LFxuICAgICAgICBmaWVsZEdyb3VwOiBmb3JtbHlGaWx0ZXJlZFN0ZXBzLFxuICAgICAgfSxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBvblNlbGVjdGVkUGFnZUNoYW5naW5nKHN0ZXBUcmFuc2l0aW9uOiBhbnkpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBsZXQgZnJvbUluZGV4OiBudW1iZXI7XG4gICAgbGV0IHRvSW5kZXg6IG51bWJlcjtcbiAgICBsZXQgY2FsbGJhY2s6ICgpID0+IHZvaWQgPSAoKSA9PiB7IH07XG5cbiAgICBpZiAodHlwZW9mIHN0ZXBUcmFuc2l0aW9uID09PSAnbnVtYmVyJykge1xuICAgICAgdG9JbmRleCA9IHN0ZXBUcmFuc2l0aW9uO1xuICAgICAgZnJvbUluZGV4ID0gdGhpcy5hY3RpdmVTdGVwO1xuICAgIH0gZWxzZSB7XG4gICAgICBmcm9tSW5kZXggPSBzdGVwVHJhbnNpdGlvbi5mcm9tO1xuICAgICAgdG9JbmRleCA9IHN0ZXBUcmFuc2l0aW9uLnRvO1xuICAgICAgY2FsbGJhY2sgPSBzdGVwVHJhbnNpdGlvbi5jYWxsYmFjayB8fCAoKCkgPT4geyB9KTtcbiAgICB9XG5cbiAgICBsZXQgYWN0aW9uc0V4ZWN1dGVkID0gZmFsc2U7XG5cbiAgICBpZiAodG9JbmRleCA+IGZyb21JbmRleCkge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICfinqHvuI8gTW92aW5nIGZvcndhcmQgLSBleGVjdXRpbmcgYWN0aW9uIHN0ZXBzIGFmdGVyIGN1cnJlbnQgc3RlcCdcbiAgICAgICk7XG4gICAgICBhY3Rpb25zRXhlY3V0ZWQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVBY3Rpb25TdGVwc0FmdGVyQ3VycmVudFN0ZXAoXG4gICAgICAgIGZyb21JbmRleFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKHRvSW5kZXggPCBmcm9tSW5kZXgpIHtcbiAgICAgIGNvbnNvbGUubG9nKCfirIXvuI8gTW92aW5nIGJhY2t3YXJkIC0gbm8gYWN0aW9uIGV4ZWN1dGlvbiBuZWVkZWQnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coJ/CflIQgU3RheWluZyBvbiBzYW1lIHN0ZXAgLSBubyBhY3Rpb24gZXhlY3V0aW9uIG5lZWRlZCcpO1xuICAgIH1cblxuICAgIHRoaXMuYWN0aXZlU3RlcCA9IHRvSW5kZXg7XG5cbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFjdGlvbnNFeGVjdXRlZDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZUFjdGlvblN0ZXBzQWZ0ZXJDdXJyZW50U3RlcChcbiAgICBjdXJyZW50U3RlcEluZGV4OiBudW1iZXJcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKHRoaXMuYWN0aW9uU3RlcEhhbmRsZXIuaXNFeGVjdXRpbmdBY3Rpb25zKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgbGV0IGZpbHRlcmVkU3RlcHMgPSB0aGlzLmZsdXguZmlsdGVyKChzKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIHMuZGVwZW5kZW50RGljdGlvbmFyeSAmJlxuICAgICAgICBzLmRlcGVuZGVudERpY3Rpb25hcnkuaXNEaWN0aW9uYXJ5RGVwZW5kZW50XG4gICAgICApIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRWYWx1ZSA9XG4gICAgICAgICAgdGhpcy5tb2RlbFtzLmRlcGVuZGVudERpY3Rpb25hcnkuZGljdGlvbmFyeUNvbnRyb2xJZGVudGlmaWVyXT8uaWQ7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBzZWxlY3RlZFZhbHVlICYmXG4gICAgICAgICAgcy5kZXBlbmRlbnREaWN0aW9uYXJ5LmRlcGVuZGVudFZhbHVlSWRzLmluY2x1ZGVzKHNlbGVjdGVkVmFsdWUpXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuXG4gICAgY29uc3QgYWN0aW9uU3RlcHMgPSB0aGlzLmFjdGlvblN0ZXBIYW5kbGVyLmdldEFjdGlvblN0ZXBzQXRJbmRleChcbiAgICAgIGZpbHRlcmVkU3RlcHMsXG4gICAgICBjdXJyZW50U3RlcEluZGV4XG4gICAgKTtcblxuICAgIGlmIChhY3Rpb25TdGVwcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGlmICghdGhpcy5hcHBEYXRhVXVpZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCB0aGUgc2F2aW5nIGZsYWcgYmVmb3JlIHN0YXJ0aW5nIGFjdGlvbnNcbiAgICAgIHRoaXMuaXNTYXZpbmdBZnRlckFjdGlvbnMgPSB0cnVlO1xuICAgICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmFjdGlvblN0ZXBIYW5kbGVyLmV4ZWN1dGVBY3Rpb25TdGVwcyhcbiAgICAgICAgYWN0aW9uU3RlcHMsXG4gICAgICAgIHRoaXMuYXBwRGF0YVV1aWQsXG4gICAgICAgIChzdGVwKSA9PiB7XG4gICAgICAgICAgY29uc3QgbG9hZGluZ01lc3NhZ2UgPSBVdGlscy5maW5kVHJhbnNsYXRpb25JbmZvKFxuICAgICAgICAgICAgJ2xvYWRpbmdNZXNzYWdlVHJhbnNsYXRpb25zJyxcbiAgICAgICAgICAgIHN0ZXAudHJhbnNsYXRpb25zLFxuICAgICAgICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMubG9hZGluZ01lc3NhZ2UgPSBsb2FkaW5nTWVzc2FnZSB8fCBudWxsO1xuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ+KchSBBY3Rpb24gc3RlcHMgZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgICAgIC8vIEtlZXAgbG9hZGluZyBzdGF0ZSB0cnVlIC0gaXQgd2lsbCBiZSBjbGVhcmVkIGFmdGVyIHNhdmVBcHBEYXRhU3RlcCBjb21wbGV0ZXNcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKCfinYwgQWN0aW9uIHN0ZXBzIGV4ZWN1dGlvbiBmYWlsZWQ6JywgcmVzdWx0LmVycm9yKTtcbiAgICAgICAgdGhpcy5pc1NhdmluZ0FmdGVyQWN0aW9ucyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ+KdjCBFcnJvciBleGVjdXRpbmcgYWN0aW9uIHN0ZXBzOicsIGVycm9yKTtcbiAgICAgIHRoaXMuaXNTYXZpbmdBZnRlckFjdGlvbnMgPSBmYWxzZTtcbiAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvblNlbGVjdGVkUGFnZUNoYW5nZWQoaW5kZXg6IG51bWJlcikge1xuICAgIGlmICh0aGlzLmZvcm1seUNvbmZpZ1swXS5maWVsZEdyb3VwKSB7XG4gICAgICB2YXIgc2VsZWN0ZWRQYWdlID0gdGhpcy5mb3JtbHlDb25maWdbMF0uZmllbGRHcm91cFtpbmRleF07XG4gICAgICB0aGlzLnNldFByZXNlbnRhdGlvbkNvbnRyb2xWYWx1ZXNSZWN1cnNpdmVseShzZWxlY3RlZFBhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0UHJlc2VudGF0aW9uQ29udHJvbFZhbHVlc1JlY3Vyc2l2ZWx5KGZjPzogYW55KSB7XG4gICAgZmM/LmZpZWxkR3JvdXA/LmZvckVhY2goKGZnOiBhbnkpID0+IHtcbiAgICAgIGlmIChmZy5wcm9wcyAmJiBmZy5wcm9wc1snaXNEaXNwbGF5TW9kZSddID09PSB0cnVlKSB7XG4gICAgICAgIHZhciBtZXRob2RGaWVsZElkID0gZmcucHJvcHNbJ2FwaU1ldGhvZEZpZWxkSWQnXTtcbiAgICAgICAgaWYgKG1ldGhvZEZpZWxkSWQpIHtcbiAgICAgICAgICBjb25zdCB2YWwgPSB0aGlzLmZpbmRJbkFwaUNhbGxzUmVzcG9uc2VzKG1ldGhvZEZpZWxkSWQpO1xuICAgICAgICAgIGZnLmRlZmF1bHRWYWx1ZSA9IHZhbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgYXNzb2NpYXRlZENvbnRyb2xJZCA9IGZnLnByb3BzWydjb2xsZWN0aW9uQ29udHJvbElkZW50aWZpZXInXTtcbiAgICAgICAgICBpZiAoYXNzb2NpYXRlZENvbnRyb2xJZCkge1xuICAgICAgICAgICAgY29uc3QgZm91bmQgPVxuICAgICAgICAgICAgICB0aGlzLmZpbmRDb250cm9sSW5GaWxsRGF0YUNvbnRyb2xzKGFzc29jaWF0ZWRDb250cm9sSWQpO1xuICAgICAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgICAgIGlmIChmb3VuZC5maWxsVmFsdWVJZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRMYW5ndWFnZUlkID0gdGhpcy5nZXRDdXJyZW50TGFuZ3VhZ2VJZCgpO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgZGljdF0gb2YgdGhpcy5kaWN0aW9uYXJ5TWFwLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBkaWN0LnZhbHVlcz8uZmluZChcbiAgICAgICAgICAgICAgICAgICAgKHYpID0+IHYuaWQgPT0gZm91bmQuZmlsbFZhbHVlSWRcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHJhbnNsYXRpb24gPSB2YWx1ZS52YWx1ZVRyYW5zbGF0aW9ucy5maW5kKFxuICAgICAgICAgICAgICAgICAgICAgICh0KSA9PiB0Lmxhbmd1YWdlSWQgPT0gY3VycmVudExhbmd1YWdlSWRcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zbGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZmcuZGVmYXVsdFZhbHVlID0gdHJhbnNsYXRpb24udmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZmcuZGVmYXVsdFZhbHVlID0gZm91bmQuZmlsbFZhbHVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zdCB2YWwgPSB0aGlzLmZpbmRJbkFwaUNhbGxzUmVzcG9uc2VzKGFzc29jaWF0ZWRDb250cm9sSWQpO1xuICAgICAgICAgICAgICBmZy5kZWZhdWx0VmFsdWUgPSB2YWw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNldFByZXNlbnRhdGlvbkNvbnRyb2xWYWx1ZXNSZWN1cnNpdmVseShmZyk7XG4gICAgICB9XG4gICAgICBpZiAoZmcucHJvcHNbJ2NkciddKSB7XG4gICAgICAgIGZnLnByb3BzWydjZHInXS5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGZpbmRDb250cm9sSW5GaWxsRGF0YUNvbnRyb2xzKGNvbnRyb2xJZDogc3RyaW5nKTogYW55IHtcbiAgICBsZXQgY29udHJvbERhdGE6IGFueSA9IHVuZGVmaW5lZDtcbiAgICBpZiAodGhpcy5maWxsRGF0YSkge1xuICAgICAgdGhpcy5maWxsRGF0YS5mbHV4Py5mb3JFYWNoKChmOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKCFjb250cm9sRGF0YSkge1xuICAgICAgICAgIGYuc2VjdGlvbnM/LmZvckVhY2goKHM6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFjb250cm9sRGF0YSkge1xuICAgICAgICAgICAgICBjb250cm9sRGF0YSA9IHMuY29udHJvbHM/LmZpbmQoXG4gICAgICAgICAgICAgICAgKGM6IGFueSkgPT4gYy5jb250cm9sSWQgPT09IGNvbnRyb2xJZFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBpZiAoY29udHJvbERhdGEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udHJvbERhdGE7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBjb250cm9sRGF0YTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZEluQXBpQ2FsbHNSZXNwb25zZXMoZmllbGRJZDogc3RyaW5nKTogYW55IHtcbiAgICBsZXQgZm91bmRWYWx1ZTogYW55ID0gdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLmZpbGxEYXRhKSB7XG4gICAgICB0aGlzLmZpbGxEYXRhLkFQSUNhbGxzPy5mb3JFYWNoKChhcGk6IGFueSkgPT4ge1xuICAgICAgICBpZiAoIWZvdW5kVmFsdWUpIHtcbiAgICAgICAgICBhcGkuTWV0aG9kcz8uZm9yRWFjaCgobTogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAoIWZvdW5kVmFsdWUpIHtcbiAgICAgICAgICAgICAgY29uc3QgZm91bmQgPSBtLkZpZWxkcz8uW2ZpZWxkSWRdO1xuICAgICAgICAgICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgICAgICAgICBmb3VuZFZhbHVlID0gZm91bmQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBmb3VuZFZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRGb3JtbHlGaWx0ZXJlZFN0ZXBzKCkge1xuICAgIGxldCBzdGVwcyA9IHRoaXMuZm9ybWx5QWxsU3RlcHMuZmlsdGVyKChzKSA9PiB7XG4gICAgICBpZiAocy5wcm9wcyAmJiBzLnByb3BzWydkZXBlbmRlbnREaWN0aW9uYXJ5J10pIHtcbiAgICAgICAgY29uc3QgZGVwRGljdCA9IHMucHJvcHNbXG4gICAgICAgICAgJ2RlcGVuZGVudERpY3Rpb25hcnknXG4gICAgICAgIF0gYXMgRGVwZW5kZW50RGljdGlvbmFyeURhdGE7XG4gICAgICAgIGlmIChkZXBEaWN0ICYmIGRlcERpY3QuaXNEaWN0aW9uYXJ5RGVwZW5kZW50KSB7XG4gICAgICAgICAgY29uc3Qgc2VsZWN0ZWRWYWx1ZSA9XG4gICAgICAgICAgICB0aGlzLm1vZGVsW2RlcERpY3QuZGljdGlvbmFyeUNvbnRyb2xJZGVudGlmaWVyXT8uaWQ7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgc2VsZWN0ZWRWYWx1ZSAmJlxuICAgICAgICAgICAgZGVwRGljdC5kZXBlbmRlbnRWYWx1ZUlkcy5pbmNsdWRlcyhzZWxlY3RlZFZhbHVlKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc3RlcHM7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGJ1aWxkRm9ybWx5RmllbGRHcm91cEFzeW5jKCk6IFByb21pc2U8Rm9ybWx5RmllbGRDb25maWdbXT4ge1xuICAgIHRoaXMuc3RlcERpY3Rpb25hcnlEZXBlbmRlbnRJZHMgPSBbXTtcbiAgICBpZiAodGhpcy5zaG93RGlzcGxheU1vZGUpIHtcbiAgICAgIGNvbnN0IHN0ZXAgPSBhd2FpdCB0aGlzLmJ1aWREaXNwbGF5U3RlcCgpO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShbc3RlcF0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGaWx0ZXIgb3V0IGFjdGlvbiBzdGVwcyBmcm9tIHZpc2libGUgc3RlcHNcbiAgICAgIGNvbnN0IHZpc2libGVTdGVwcyA9IHRoaXMuYWN0aW9uU3RlcEhhbmRsZXIuZmlsdGVyVmlzaWJsZVN0ZXBzKHRoaXMuZmx1eCk7XG4gICAgICByZXR1cm4gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIHZpc2libGVTdGVwcy5tYXAoKHN0ZXApID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5idWlsZEZvcm1seUZpZWxkQ29uZmlnQXN5bmMoc3RlcCk7XG4gICAgICAgIH0pID8/IFtdXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYnVpbGRGb3JtbHlGaWVsZENvbmZpZ0FzeW5jKFxuICAgIHN0ZXA6IFN0ZXBEYXRhXG4gICk6IFByb21pc2U8Rm9ybWx5RmllbGRDb25maWc+IHtcbiAgICBsZXQgc3RlcEZvcm1seUNvbmZpZzogRm9ybWx5RmllbGRDb25maWcgPSB7fTtcblxuICAgIGlmIChzdGVwLnR5cGUgIT09IEZsdXhUeXBlLkN1c3RvbSAmJiBzdGVwLnR5cGUgIT09IEZsdXhUeXBlLkZpbmFsKSB7XG4gICAgICBzdGVwRm9ybWx5Q29uZmlnID0gYXdhaXQgdGhpcy5idWlsZFN5c3RlbUZpZWxkRm9ybWx5Q29uZmlnKHN0ZXApO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGVwRm9ybWx5Q29uZmlnID0ge1xuICAgICAgICBwcm9wczoge1xuICAgICAgICAgIGxhYmVsOiBzdGVwLm5hbWUsXG4gICAgICAgICAgZGVzY3JpcHRpb246IHN0ZXAubmFtZSxcbiAgICAgICAgICBidXR0b25zOiB0aGlzLmNvbnN0cnVjdEJ1dHRvbnMoc3RlcC5idXR0b25zKSxcbiAgICAgICAgICBkZXBlbmRlbnREaWN0aW9uYXJ5OiBzdGVwLmRlcGVuZGVudERpY3Rpb25hcnksXG4gICAgICAgICAgc3RlcElkOiBzdGVwLmlkZW50aWZpZXIsXG4gICAgICAgIH0sXG4gICAgICAgIGZpZWxkR3JvdXA6IGF3YWl0IHRoaXMuYnVpbGRTZWN0aW9uc0ZpZWxkR3JvdXBBc3luYyhcbiAgICAgICAgICBzdGVwLFxuICAgICAgICAgIHN0ZXAuc2VjdGlvbnNcbiAgICAgICAgKSxcbiAgICAgIH07XG5cbiAgICAgIGlmIChzdGVwLnRyYW5zbGF0aW9ucykge1xuICAgICAgICBzdGVwRm9ybWx5Q29uZmlnLnByb3BzIVsnbGFiZWwnXSA9IFV0aWxzLmZpbmRUcmFuc2xhdGlvbkluZm8oXG4gICAgICAgICAgJ25hbWUnLFxuICAgICAgICAgIHN0ZXAudHJhbnNsYXRpb25zLFxuICAgICAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICAgICk7XG4gICAgICAgIHN0ZXBGb3JtbHlDb25maWcucHJvcHMhWydkZXNjcmlwdGlvbiddID0gVXRpbHMuZmluZFRyYW5zbGF0aW9uSW5mbyhcbiAgICAgICAgICAnZGVzY3JpcHRpb24nLFxuICAgICAgICAgIHN0ZXAudHJhbnNsYXRpb25zLFxuICAgICAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHN0ZXBGb3JtbHlDb25maWcgJiYgc3RlcEZvcm1seUNvbmZpZy5wcm9wcykge1xuICAgICAgdGhpcy5zZXRTdGVwQmFzZVByb3BzKHN0ZXAsIHN0ZXBGb3JtbHlDb25maWcpO1xuICAgIH1cbiAgICBpZiAoc3RlcC5kZXBlbmRlbnREaWN0aW9uYXJ5Py5pc0RpY3Rpb25hcnlEZXBlbmRlbnQpIHtcbiAgICAgIHRoaXMuc3RlcERpY3Rpb25hcnlEZXBlbmRlbnRJZHMucHVzaChcbiAgICAgICAgc3RlcC5kZXBlbmRlbnREaWN0aW9uYXJ5LmRpY3Rpb25hcnlDb250cm9sSWRlbnRpZmllclxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0ZXBGb3JtbHlDb25maWc7XG4gIH1cblxuICB0cmlnZ2VyQ29tcG9uZW50VXBkYXRlKGNvbnRyb2xJZDogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy5zZXRGb3JtbHlGaWVsZFZhbHVlKHRoaXMuZm9ybWx5QWxsU3RlcHMsIGNvbnRyb2xJZCwgdmFsdWUpO1xuICB9XG5cbiAgc2V0Rm9ybWx5RmllbGRWYWx1ZShcbiAgICBmaWVsZHM6IEZvcm1seUZpZWxkQ29uZmlnW10gfCB1bmRlZmluZWQsXG4gICAga2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IGFueVxuICApOiBib29sZWFuIHtcbiAgICBpZiAoIWZpZWxkcykgcmV0dXJuIGZhbHNlO1xuXG4gICAgZm9yIChjb25zdCBmaWVsZCBvZiBmaWVsZHMpIHtcbiAgICAgIGlmIChmaWVsZC5rZXkgPT09IGtleSkge1xuICAgICAgICBpZiAoZmllbGQuZm9ybUNvbnRyb2wpIHtcbiAgICAgICAgICBmaWVsZC5mb3JtQ29udHJvbC5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IHRydWUgfSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGZpZWxkLmZpZWxkR3JvdXAgJiYgQXJyYXkuaXNBcnJheShmaWVsZC5maWVsZEdyb3VwKSkge1xuICAgICAgICBjb25zdCBmb3VuZCA9IHRoaXMuc2V0Rm9ybWx5RmllbGRWYWx1ZShmaWVsZC5maWVsZEdyb3VwLCBrZXksIHZhbHVlKTtcbiAgICAgICAgaWYgKGZvdW5kKSByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGJ1aWxkU3lzdGVtRmllbGRGb3JtbHlDb25maWcoXG4gICAgc3RlcDogU3RlcERhdGFcbiAgKTogUHJvbWlzZTxGb3JtbHlGaWVsZENvbmZpZz4ge1xuICAgIGNvbnN0IGZvcm1seUNvbmZpZzogRm9ybWx5RmllbGRDb25maWcgPSB7XG4gICAgICBwcm9wczoge1xuICAgICAgICBsYWJlbDogc3RlcC5uYW1lLFxuICAgICAgICBidXR0b25zOiB0aGlzLmNvbnN0cnVjdEJ1dHRvbnMoc3RlcC5idXR0b25zKSxcbiAgICAgICAgZmx1eFR5cGU6IHN0ZXAudHlwZSxcbiAgICAgIH0sXG4gICAgICBmaWVsZEdyb3VwOiBbXSxcbiAgICB9O1xuXG4gICAgdGhpcy5zZXRTdGVwQmFzZVByb3BzKHN0ZXAsIGZvcm1seUNvbmZpZyk7XG4gICAgdmFyIGZpZWxkQ29uZmlnID0gdGhpcy5jcmVhdGVGb3JtbHlTeXN0ZW1GaWVsZENvbmZpZyhzdGVwKTtcblxuICAgIGlmIChmaWVsZENvbmZpZykge1xuICAgICAgaWYgKHN0ZXAudHJhbnNsYXRpb25zKSB7XG4gICAgICAgIGxldCBsYWJlbHM6IGFueSA9IHt9O1xuICAgICAgICBzdGVwLnRyYW5zbGF0aW9ucy5mb3JFYWNoKCh0cjogVHJhbnNsYXRpb25JbmZvKSA9PiB7XG4gICAgICAgICAgbGFiZWxzW3RyLm5hbWVdID0gVXRpbHMuZmluZFRyYW5zbGF0aW9uKFxuICAgICAgICAgICAgdHIudmFsdWVzLFxuICAgICAgICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgICAgZmllbGRDb25maWcucHJvcHMhWydsYWJlbHMnXSA9IGxhYmVscztcbiAgICAgICAgZmllbGRDb25maWcucHJvcHMhWyduYW1lJ10gPSBVdGlscy5maW5kVHJhbnNsYXRpb25JbmZvKFxuICAgICAgICAgICduYW1lJyxcbiAgICAgICAgICBzdGVwLnRyYW5zbGF0aW9ucyxcbiAgICAgICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICApO1xuICAgICAgICBmaWVsZENvbmZpZy5wcm9wcyFbJ2Rlc2NyaXB0aW9uJ10gPSBVdGlscy5maW5kVHJhbnNsYXRpb25JbmZvKFxuICAgICAgICAgICdkZXNjcmlwdGlvbicsXG4gICAgICAgICAgc3RlcC50cmFuc2xhdGlvbnMsXG4gICAgICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICAgKTtcbiAgICAgICAgZm9ybWx5Q29uZmlnLnByb3BzIVsnbGFiZWwnXSA9IFV0aWxzLmZpbmRUcmFuc2xhdGlvbkluZm8oXG4gICAgICAgICAgJ25hbWUnLFxuICAgICAgICAgIHN0ZXAudHJhbnNsYXRpb25zLFxuICAgICAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICAgICk7XG4gICAgICAgIGZvcm1seUNvbmZpZy5wcm9wcyFbJ2Rlc2NyaXB0aW9uJ10gPSBVdGlscy5maW5kVHJhbnNsYXRpb25JbmZvKFxuICAgICAgICAgICdkZXNjcmlwdGlvbicsXG4gICAgICAgICAgc3RlcC50cmFuc2xhdGlvbnMsXG4gICAgICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGZpZWxkQ29uZmlnLnByb3BzIVsnc3RlcHNTZXR0aW5ncyddID0gdGhpcy5zdGVwc1NldHRpbmdzO1xuICAgICAgZm9ybWx5Q29uZmlnLmZpZWxkR3JvdXAhLnB1c2goZmllbGRDb25maWcpO1xuICAgIH1cblxuICAgIHJldHVybiBmb3JtbHlDb25maWc7XG4gIH1cblxuICBwcml2YXRlIHNldFN0ZXBCYXNlUHJvcHMoc3RlcDogU3RlcERhdGEsIGZvcm1seUNvbmZpZzogRm9ybWx5RmllbGRDb25maWcpIHtcbiAgICBpZiAoZm9ybWx5Q29uZmlnLnByb3BzKSB7XG4gICAgICBmb3JtbHlDb25maWcucHJvcHNbJ25hbWUnXSA9IHN0ZXAubmFtZTtcbiAgICAgIGZvcm1seUNvbmZpZy5wcm9wc1snZmx1eFR5cGUnXSA9IHN0ZXAudHlwZTtcbiAgICAgIGZvcm1seUNvbmZpZy5wcm9wc1snc3RlcElkJ10gPSBzdGVwLmlkZW50aWZpZXI7XG4gICAgICBmb3JtbHlDb25maWcucHJvcHNbJ2lzVmlzaWJsZSddID0gc3RlcC5pc1Zpc2libGU7XG4gICAgICBmb3JtbHlDb25maWcucHJvcHNbJ2RlcGVuZGVudERpY3Rpb25hcnknXSA9IHN0ZXAuZGVwZW5kZW50RGljdGlvbmFyeTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIENyZWF0ZVNpZ25GaWVsZENvbmZpZyhzdGVwOiBTdGVwRGF0YSk6IEZvcm1seUZpZWxkQ29uZmlnIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ2Zvcm1seS1zaWduLWNvbXBvbmVudCcsXG4gICAgICBwcm9wczoge1xuICAgICAgICBhcHBEYXRhSWQ6IHRoaXMuYXBwRGF0YVV1aWQsXG4gICAgICAgIHN0ZXBEYXRhOiBzdGVwLFxuICAgICAgICBkZXNpZ246IHRoaXMuZGVzaWduLFxuICAgICAgICBlbnY6IHRoaXMuZW52LFxuICAgICAgICBmbHV4OiB0aGlzLmZsdXgsXG4gICAgICAgIHBhcmVudEZvcm06IHRoaXMuZm9ybSxcbiAgICAgICAgZ2V0TW9kZWw6ICgpID0+IHRoaXMubW9kZWwsXG4gICAgICAgIGV2ZW50OiBhc3luYyAoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChldmVudCA9PT0gJ3N1Y2Nlc3MnKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnN0ZXBwZXJHb05leHRBc3luYygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgQ3JlYXRlRG93bmxvYWREb2NzRmllbGRDb25maWcoXG4gICAgY29udHJvbERhdGE6IEJhc2VDb250cm9sXG4gICk6IEZvcm1seUZpZWxkQ29uZmlnIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ2Zvcm1seS1kb3dubG9hZC1kb2N1bWVudHMtY29tcG9uZW50JyxcbiAgICAgIHByb3BzOiB7XG4gICAgICAgIGFwcElkOiB0aGlzLmFwcE1vZGVsLmFwcGxpY2F0aW9uVXVpZCxcbiAgICAgICAgYXBwRGF0YUlkOiB0aGlzLmFwcERhdGFVdWlkLFxuICAgICAgICBjb250cm9sRGF0YTogY29udHJvbERhdGEsXG4gICAgICAgIGVudjogdGhpcy5lbnYsXG4gICAgICAgIGRvY3VtZW50c0RhdGE6IHRoaXMuYXBwTW9kZWwuZG9jdW1lbnRzLFxuICAgICAgICBsYW5nSXNvOiB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzbyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgQ3JlYXRlVmlld0RvY3NGaWVsZENvbmZpZyhcbiAgICBjb250cm9sRGF0YTogQmFzZUNvbnRyb2xcbiAgKTogRm9ybWx5RmllbGRDb25maWcge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnZm9ybWx5LXZpZXctZG9jdW1lbnRzLWNvbXBvbmVudCcsXG4gICAgICBwcm9wczoge1xuICAgICAgICBhcHBJZDogdGhpcy5hcHBNb2RlbC5hcHBsaWNhdGlvblV1aWQsXG4gICAgICAgIGFwcERhdGFJZDogdGhpcy5hcHBEYXRhVXVpZCxcbiAgICAgICAgY29udHJvbERhdGE6IGNvbnRyb2xEYXRhLFxuICAgICAgICBlbnY6IHRoaXMuZW52LFxuICAgICAgICBkb2N1bWVudHNEYXRhOiB0aGlzLmFwcE1vZGVsLmRvY3VtZW50cyxcbiAgICAgICAgbGFuZ0lzbzogdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc28sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIENyZWF0ZVVwbG9hZERvY3NGaWVsZENvbmZpZyhcbiAgICBjb250cm9sRGF0YTogQmFzZUNvbnRyb2xcbiAgKTogRm9ybWx5RmllbGRDb25maWcge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnZm9ybWx5LXVwbG9hZC1kb2N1bWVudHMtY29tcG9uZW50JyxcbiAgICAgIHByb3BzOiB7XG4gICAgICAgIGFwcElkOiB0aGlzLmFwcE1vZGVsLmFwcGxpY2F0aW9uVXVpZCxcbiAgICAgICAgYXBwRGF0YUlkOiB0aGlzLmFwcERhdGFVdWlkLFxuICAgICAgICBjb250cm9sRGF0YTogY29udHJvbERhdGEsXG4gICAgICAgIGVudjogdGhpcy5lbnYsXG4gICAgICAgIGRvY3VtZW50c0RhdGE6IHRoaXMuYXBwTW9kZWwuZG9jdW1lbnRzLFxuICAgICAgICBsYW5nSXNvOiB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzbyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgQ3JlYXRlR2VuZXJhdGVEb2NzRmllbGRDb25maWcoc3RlcDogU3RlcERhdGEpOiBGb3JtbHlGaWVsZENvbmZpZyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdmb3JtbHktZ2VuZXJhdGUtZG9jdW1lbnRzLWNvbXBvbmVudCcsXG4gICAgICBwcm9wczoge1xuICAgICAgICBhcHBJZDogdGhpcy5hcHBNb2RlbC5hcHBsaWNhdGlvblV1aWQsXG4gICAgICAgIGFwcERhdGFJZDogdGhpcy5hcHBEYXRhVXVpZCxcbiAgICAgICAgc3RlcERhdGE6IHN0ZXAsXG4gICAgICAgIGRvY3VtZW50c0RhdGE6IHRoaXMuYXBwTW9kZWwuZG9jdW1lbnRzLFxuICAgICAgICBsYW5nSXNvOiB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzbyxcbiAgICAgICAgZXZlbnQ6IGFzeW5jIChldmVudDogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKGV2ZW50ID09PSAnc3VjY2VzcycpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc3RlcHBlckdvTmV4dEFzeW5jKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgc3RlcHBlckdvTmV4dEFzeW5jKCkge1xuICAgIGNvbnN0IHN0ZXBwZXJDb21wb25lbnQgPSB0aGlzLmZvcm1seUNvbmZpZ1swXS5wcm9wcyFbJ2NvbXBvbmVudCddO1xuICAgIGlmIChzdGVwcGVyQ29tcG9uZW50ICYmIHN0ZXBwZXJDb21wb25lbnQubmF2aWdhdGVOZXh0QXN5bmMpIHtcbiAgICAgIGF3YWl0IHN0ZXBwZXJDb21wb25lbnQubmF2aWdhdGVOZXh0QXN5bmMoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIENyZWF0ZUVucm9sbENhcmRGaWVsZENvbmZpZyhzdGVwOiBTdGVwRGF0YSk6IEZvcm1seUZpZWxkQ29uZmlnIHtcbiAgICBsZXQgbGFiZWxzOiBhbnkgPSB7fTtcbiAgICBPYmplY3Qua2V5cyhzdGVwLmNvbmZpZykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBpZiAoa2V5LmVuZHNXaXRoKCdMYWJlbCcpKSB7XG4gICAgICAgIGxhYmVsc1trZXldID1cbiAgICAgICAgICBzdGVwPy5jb25maWdba2V5XT8uZmluZChcbiAgICAgICAgICAgIChpOiB7IGxhbmd1YWdlSXNvOiBzdHJpbmcgfSkgPT5cbiAgICAgICAgICAgICAgaS5sYW5ndWFnZUlzbyA9PT0gdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICAgICApPy52YWx1ZSA/PyAnJztcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ2Zvcm1seS1lbnJvbC1jYXJkLWNvbXBvbmVudCcsXG4gICAgICBwcm9wczoge1xuICAgICAgICBhcHBJZDogdGhpcy5hcHBNb2RlbC5hcHBsaWNhdGlvblV1aWQsXG4gICAgICAgIGFwcERhdGFJZDogdGhpcy5hcHBEYXRhVXVpZCxcbiAgICAgICAgZGF0YVVybElkOiB0aGlzLmRhdGFVcmxJZCxcbiAgICAgICAgc3RlcERhdGE6IHN0ZXAsXG4gICAgICAgIGxhYmVsczogbGFiZWxzLFxuICAgICAgICBsYW5nSXNvOiB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzbyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuICBwcml2YXRlIENyZWF0ZUlkU2NhbkZpZWxkQ29uZmlnKHN0ZXA6IFN0ZXBEYXRhKTogRm9ybWx5RmllbGRDb25maWcge1xuICAgIGxldCBlcnJvck1lc3NhZ2VzOiBhbnkgPSB7fTtcblxuICAgIGlmIChzdGVwLmVycm9yc1RyYW5zbGF0aW9ucykge1xuICAgICAgc3RlcC5lcnJvcnNUcmFuc2xhdGlvbnMuZm9yRWFjaCgoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICBlcnJvck1lc3NhZ2VzW2Vycm9yLmNvZGVdID0gVXRpbHMuZmluZFRyYW5zbGF0aW9uKFxuICAgICAgICAgIGVycm9yLnRyYW5zbGF0aW9ucyxcbiAgICAgICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdmb3JtbHktc2Nhbi1pZCcsXG4gICAgICBwcm9wczoge1xuICAgICAgICBjb25maWc6IHN0ZXAuY29uZmlnLFxuICAgICAgICBzdGVwVHlwZTogc3RlcC50eXBlLFxuICAgICAgICBzdGVwSWQ6IHN0ZXAuaWRlbnRpZmllcixcbiAgICAgICAgYXBwRGF0YUlkOiB0aGlzLmFwcERhdGFVdWlkIHx8IFV0aWxzLmdlbmVyYXRlVVVJRCgpLFxuICAgICAgICBhcHBJZDogdGhpcy5hcHBNb2RlbC5hcHBsaWNhdGlvblV1aWQsXG4gICAgICAgIGVycm9yTWVzc2FnZXM6IGVycm9yTWVzc2FnZXMsXG4gICAgICAgIGV2ZW50OiAoZXZlbnQ6IGFueSkgPT4gdGhpcy5vbklkU2NhbkNvbXBsZXRlZChldmVudCwgc3RlcCksXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIENyZWF0ZUt5Y0ZpZWxkQ29uZmlnKHN0ZXA6IFN0ZXBEYXRhKTogRm9ybWx5RmllbGRDb25maWcge1xuICAgIGNvbnN0IGxvYWRpbmdNc2dUcmFuc2xhdGlvbnMgPSBzdGVwLnRyYW5zbGF0aW9ucz8uZmluZChcbiAgICAgICh0OiBhbnkpID0+IHQubmFtZSA9PT0gJ2xvYWRpbmdNZXNzYWdlVHJhbnNsYXRpb25zJ1xuICAgICk7XG5cbiAgICBjb25zdCB0cmFuc2xhdGVkTG9hZGluZ01lc3NhZ2UgPVxuICAgICAgbG9hZGluZ01zZ1RyYW5zbGF0aW9ucz8udmFsdWVzPy5maW5kKFxuICAgICAgICAodjogYW55KSA9PiB2Lmxhbmd1YWdlSXNvID09PSB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgKT8udmFsdWUgfHwgJyc7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ2Zvcm1seS1pZGVudGlmaWNhdGlvbi1jb21wb25lbnQnLFxuICAgICAgcHJvcHM6IHtcbiAgICAgICAgdG9rZW46IHRoaXMua3ljVG9rZW4sXG4gICAgICAgIGFwaV91cmw6IHRoaXMua3ljQXBpVXJsLFxuICAgICAgICBhcHBEYXRhSWQ6IHRoaXMuYXBwRGF0YVV1aWQsXG4gICAgICAgIGVudjogJ1FBJywgLy8gQ29uc2lkZXIgbWFraW5nIHRoaXMgZHluYW1pYyBpZiBuZWVkZWRcbiAgICAgICAgcmVkaXJlY3RfaWQ6IHRoaXMua3ljUmVkaXJlY3RJZCxcbiAgICAgICAgcGhvbmVfbnVtYmVyOiAnJyxcbiAgICAgICAgbGFuZ19pc286IHRoaXMua3ljTGFuZ0lzbyxcbiAgICAgICAgc2hvd19jaXRpemVuc2hpcF9zZWxlY3RvcjogdGhpcy5reWNTaG93Q2l0aXplbnNoaXAsXG4gICAgICAgIHNjcm9sbF9tb2RlOiB0aGlzLmt5Y1Njcm9sbE1vZGUsXG4gICAgICAgIG1heFJldHJpZXM6IHN0ZXAuY29uZmlnPy5tYXhLeWNSZXRyaWVzID8/IDMsXG4gICAgICAgIGxvYWRpbmdNZXNzYWdlOiB0cmFuc2xhdGVkTG9hZGluZ01lc3NhZ2UsXG4gICAgICAgIGVjdENvbXBsZXRlZDogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRoaXMubG9hZGluZ01lc3NhZ2UgPSB0cmFuc2xhdGVkTG9hZGluZ01lc3NhZ2U7XG4gICAgICAgICAgYXdhaXQgdGhpcy5vcmlnaW5Gb3JtU2lnbmFsckhhbmRsZXJTZXJ2aWNlLmluaXRpYXRlS3ljUHJvY2Vzc2luZyhcbiAgICAgICAgICAgIHRoaXMuYXBwRGF0YVV1aWRcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBDcmVhdGVQaG9uZUVtYWlsRmllbGRDb25maWcoc3RlcDogU3RlcERhdGEpOiBGb3JtbHlGaWVsZENvbmZpZyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdmb3JtbHktdmFsaWRhdGUtY29udGFjdC1pbmZvJyxcbiAgICAgIHByb3BzOiB7XG4gICAgICAgIHN0ZXBEYXRhOiBzdGVwLFxuICAgICAgICBhcHBEYXRhSWQ6IHRoaXMuYXBwRGF0YVV1aWQsXG4gICAgICAgIGRlc2lnbjogdGhpcy5kZXNpZ24sXG4gICAgICAgIGV2ZW50OiBhc3luYyAoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChldmVudCA9PT0gJ3N1Y2Nlc3MnKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnN0ZXBwZXJHb05leHRBc3luYygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgQ3JlYXRlVmlld09mZmVyRmllbGRDb25maWcoc3RlcDogU3RlcERhdGEpOiBGb3JtbHlGaWVsZENvbmZpZyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdmb3JtbHktdmlldy1vZmZlcnMnLFxuICAgICAgcHJvcHM6IHtcbiAgICAgICAgYXBwRGF0YUlkOiB0aGlzLmFwcERhdGFVdWlkLFxuICAgICAgICBzdGVwRGF0YTogc3RlcCxcbiAgICAgICAgZW52OiB0aGlzLmVudixcbiAgICAgICAgYXBwTW9kZWw6IHRoaXMuYXBwTW9kZWwsXG4gICAgICAgIGxhbmdJc286IHRoaXMuY3VycmVudExhbmd1YWdlSXNvLFxuICAgICAgICBldmVudDogKGV2ZW50OiBhbnkpID0+IHRoaXMub25PZmZlclNlbGVjdGVkKGV2ZW50LCBzdGVwKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgQ3JlYXRlUGF1c2VGaWVsZENvbmZpZyhzdGVwOiBTdGVwRGF0YSk6IEZvcm1seUZpZWxkQ29uZmlnIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ2Zvcm1seS1maWVsZC1wYXVzZScsXG4gICAgICBwcm9wczoge1xuICAgICAgICBpZGVudGlmaWVyOiBzdGVwLmlkZW50aWZpZXIsXG4gICAgICAgIGNvbmZpZzogc3RlcC5jb25maWcsXG4gICAgICAgIGFwcERhdGFJZDogdGhpcy5hcHBEYXRhVXVpZCxcbiAgICAgICAgc3RlcERhdGE6IHN0ZXAsXG4gICAgICAgIGVudjogdGhpcy5lbnYsXG4gICAgICAgIGFwcE1vZGVsOiB0aGlzLmFwcE1vZGVsLFxuICAgICAgICBsYW5nSXNvOiB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzbyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgQ3JlYXRlT3BlbkJhbmtpbmdGaWVsZENvbmZpZyhzdGVwOiBTdGVwRGF0YSk6IEZvcm1seUZpZWxkQ29uZmlnIHtcbiAgICAvLyBQYXNzIHRoZSBmdWxsIHN0ZXAgZGF0YSB3aGljaCBpbmNsdWRlcyBhbGwgdHJhbnNsYXRpb25zXG4gICAgLy8gVGhlIGNvbXBvbmVudCB3aWxsIGV4dHJhY3Qgd2hhdCBpdCBuZWVkcyBiYXNlZCBvbiBjdXJyZW50IGxhbmd1YWdlXG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdmb3JtbHktb3Blbi1iYW5raW5nJyxcbiAgICAgIHByb3BzOiB7XG4gICAgICAgIGlkZW50aWZpZXI6IHN0ZXAuaWRlbnRpZmllcixcbiAgICAgICAgY29uZmlnOiBzdGVwLmNvbmZpZyxcbiAgICAgICAgYXBwRGF0YUlkOiB0aGlzLmFwcERhdGFVdWlkLFxuICAgICAgICBzdGVwRGF0YTogc3RlcCwgLy8gVGhpcyBjb250YWlucyB0aGUgZnVsbCB0cmFuc2xhdGlvbnMgYXJyYXlcbiAgICAgICAgZW52OiB0aGlzLmVudixcbiAgICAgICAgYXBwTW9kZWw6IHRoaXMuYXBwTW9kZWwsXG4gICAgICAgIGxhbmdJc286IHRoaXMuY3VycmVudExhbmd1YWdlSXNvLFxuICAgICAgICBsYWJlbHM6IHtcbiAgICAgICAgICBpbml0aWFsTWVzc2FnZTogVXRpbHMuZmluZFRyYW5zbGF0aW9uKFxuICAgICAgICAgICAgc3RlcC5jb25maWc/LmluaXRpYWxNZXNzYWdlVHJhbnNsYXRpb25zIHx8IFtdLFxuICAgICAgICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICAgICApLFxuICAgICAgICAgIHdhaXRpbmdNZXNzYWdlOiBVdGlscy5maW5kVHJhbnNsYXRpb24oXG4gICAgICAgICAgICBzdGVwLmNvbmZpZz8ud2FpdGluZ01lc3NhZ2VUcmFuc2xhdGlvbnMgfHwgW10sXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICAgICksXG4gICAgICAgICAgY29uc2VudEVycm9yTWVzc2FnZTogVXRpbHMuZmluZFRyYW5zbGF0aW9uKFxuICAgICAgICAgICAgc3RlcC5jb25maWc/LmNvbnNlbnRFcnJvck1lc3NhZ2VUcmFuc2xhdGlvbnMgfHwgW10sXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICAgICksXG4gICAgICAgICAgY29tcGxldGlvbk1lc3NhZ2U6IFV0aWxzLmZpbmRUcmFuc2xhdGlvbihcbiAgICAgICAgICAgIHN0ZXAuY29uZmlnPy5jb21wbGV0aW9uTWVzc2FnZVRyYW5zbGF0aW9ucyB8fCBbXSxcbiAgICAgICAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICAgICAgKSxcbiAgICAgICAgICByZXRyeUJ1dHRvbkxhYmVsOiBVdGlscy5maW5kVHJhbnNsYXRpb24oXG4gICAgICAgICAgICBzdGVwLmNvbmZpZz8ucmV0cnlCdXR0b25MYWJlbFRyYW5zbGF0aW9ucyB8fCBbXSxcbiAgICAgICAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICAgICAgKSxcbiAgICAgICAgfSxcbiAgICAgICAgZXZlbnQ6IChldmVudDogYW55KSA9PiB0aGlzLm9uT3BlbkJhbmtpbmdFdmVudChldmVudCwgc3RlcCksXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIENyZWF0ZVN0YXR1c0ZpZWxkQ29uZmlnKHN0ZXA6IFN0ZXBEYXRhKTogRm9ybWx5RmllbGRDb25maWcge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnZm9ybWx5LXN0YXR1cycsXG4gICAgICBwcm9wczoge1xuICAgICAgICBjb25maWc6IHN0ZXAuY29uZmlnLFxuICAgICAgICBzdGVwRGF0YTogc3RlcCxcbiAgICAgICAgYXBwRGF0YUlkOiB0aGlzLmFwcERhdGFVdWlkLFxuICAgICAgICBhcHBJZDogdGhpcy5hcHBNb2RlbC5hcHBsaWNhdGlvblV1aWQsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUZvcm1seVN5c3RlbUZpZWxkQ29uZmlnKFxuICAgIHN0ZXA6IFN0ZXBEYXRhXG4gICk6IEZvcm1seUZpZWxkQ29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgICBzd2l0Y2ggKHN0ZXAudHlwZSkge1xuICAgICAgY2FzZSBGbHV4VHlwZS5LeWM6XG4gICAgICAgIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5DcmVhdGVLeWNGaWVsZENvbmZpZyhzdGVwKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRmx1eFR5cGUuRW1haWw6XG4gICAgICBjYXNlIEZsdXhUeXBlLlBob25lOiB7XG4gICAgICAgIHJldHVybiB0aGlzLkNyZWF0ZVBob25lRW1haWxGaWVsZENvbmZpZyhzdGVwKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgRmx1eFR5cGUuQWN0aW9uOiB7XG4gICAgICAgIC8vIEFjdGlvbiBzdGVwcyBhcmUgbm93IGhhbmRsZWQgYXV0b21hdGljYWxseSBieSBBY3Rpb25TdGVwSGFuZGxlclxuICAgICAgICAvLyBUaGV5IHNob3VsZCBub3QgYXBwZWFyIGFzIHZpc2libGUgZm9ybWx5IGNvbXBvbmVudHNcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGNhc2UgRmx1eFR5cGUuSWRTY2FuOiB7XG4gICAgICAgIHJldHVybiB0aGlzLkNyZWF0ZUlkU2NhbkZpZWxkQ29uZmlnKHN0ZXApO1xuICAgICAgfVxuICAgICAgY2FzZSBGbHV4VHlwZS5HZW5lcmF0ZURvY3VtZW50OiB7XG4gICAgICAgIHJldHVybiB0aGlzLkNyZWF0ZUdlbmVyYXRlRG9jc0ZpZWxkQ29uZmlnKHN0ZXApO1xuICAgICAgfVxuICAgICAgY2FzZSBGbHV4VHlwZS5TaWduOiB7XG4gICAgICAgIHJldHVybiB0aGlzLkNyZWF0ZVNpZ25GaWVsZENvbmZpZyhzdGVwKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgRmx1eFR5cGUuVmlld09mZmVyOiB7XG4gICAgICAgIHJldHVybiB0aGlzLkNyZWF0ZVZpZXdPZmZlckZpZWxkQ29uZmlnKHN0ZXApO1xuICAgICAgfVxuICAgICAgY2FzZSBGbHV4VHlwZS5TdGF0dXM6IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQ3JlYXRlU3RhdHVzRmllbGRDb25maWcoc3RlcCk7XG4gICAgICB9XG4gICAgICBjYXNlIEZsdXhUeXBlLkVVUExBVEVTQzoge1xuICAgICAgICByZXR1cm4gdGhpcy5DcmVhdGVFbnJvbGxDYXJkRmllbGRDb25maWcoc3RlcCk7XG4gICAgICB9XG4gICAgICBjYXNlIEZsdXhUeXBlLk5FVE9QSUE6IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQ3JlYXRlRW5yb2xsQ2FyZEZpZWxkQ29uZmlnKHN0ZXApO1xuICAgICAgfVxuICAgICAgY2FzZSBGbHV4VHlwZS5QYXVzZToge1xuICAgICAgICByZXR1cm4gdGhpcy5DcmVhdGVQYXVzZUZpZWxkQ29uZmlnKHN0ZXApO1xuICAgICAgfVxuICAgICAgY2FzZSBGbHV4VHlwZS5PcGVuQmFua2luZzoge1xuICAgICAgICByZXR1cm4gdGhpcy5DcmVhdGVPcGVuQmFua2luZ0ZpZWxkQ29uZmlnKHN0ZXApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgb25PZmZlclNlbGVjdGVkKG9mZmVySWQ6IGFueSwgc3RlcDogU3RlcERhdGEpIHtcbiAgICB0aGlzLmZvcm1seVVwZGF0ZUFuZEdvTmV4dC5lbWl0KHsgc2VsZWN0ZWRPZmZlcklkOiBvZmZlcklkIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBvblNpZ25FdmVudChldmVudDogYW55LCBzdGVwOiBTdGVwRGF0YSkge1xuICAgIGNvbnNvbGUubG9nKCdTaWduIGV2ZW50IHJlY2VpdmVkOicsIGV2ZW50KTtcbiAgICB0aGlzLnVwZGF0ZVN0ZXBCdXR0b25TdGF0ZShzdGVwKTtcbiAgfVxuXG4gIHByaXZhdGUgb25PcGVuQmFua2luZ0V2ZW50KGV2ZW50OiBhbnksIHN0ZXA6IFN0ZXBEYXRhKSB7XG4gICAgY29uc29sZS5sb2coJ09wZW5CYW5raW5nIGV2ZW50IHJlY2VpdmVkOicsIGV2ZW50KTtcbiAgICBpZiAoZXZlbnQgPT09ICdzdWNjZXNzJykge1xuICAgICAgLy8gT3BlbiBCYW5raW5nIGZsb3cgY29tcGxldGVkIHN1Y2Nlc3NmdWxseVxuICAgICAgdGhpcy51cGRhdGVTdGVwQnV0dG9uU3RhdGUoc3RlcCk7XG4gICAgICAvLyBBdXRvLXByb2NlZWQgdG8gbmV4dCBzdGVwXG4gICAgICB0aGlzLmZvcm1seVVwZGF0ZUFuZEdvTmV4dC5lbWl0KHt9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9uSWRTY2FuQ29tcGxldGVkKGV2ZW50OiBhbnksIHN0ZXA6IFN0ZXBEYXRhKSB7XG4gICAgY29uc29sZS5sb2coJ1NpZ24gZXZlbnQgcmVjZWl2ZWQ6JywgZXZlbnQpO1xuICAgIGNvbnN0IGZpbGxEYXRhID0gSlNPTi5wYXJzZShldmVudC5maWxsRGF0YSk7XG4gICAgY29uc3Qgc3RlcEZpbGxEYXRhID0gZmlsbERhdGEuZmx1eC5maW5kKFxuICAgICAgKHM6IHsgc3RlcElkOiBzdHJpbmcgfSkgPT4gcy5zdGVwSWQgPT0gc3RlcC5pZGVudGlmaWVyXG4gICAgKTtcbiAgICBzdGVwRmlsbERhdGEuc2VjdGlvbnMuZm9yRWFjaChcbiAgICAgIChzOiB7XG4gICAgICAgIGNvbnRyb2xzOiB7XG4gICAgICAgICAgY29udHJvbElkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgZmlsbFZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIH1bXTtcbiAgICAgIH0pID0+IHtcbiAgICAgICAgcy5jb250cm9scy5mb3JFYWNoKFxuICAgICAgICAgIChjOiB7XG4gICAgICAgICAgICBjb250cm9sSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGZpbGxWYWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAgIH0pID0+IHtcbiAgICAgICAgICAgIGlmIChjLmNvbnRyb2xJZCkge1xuICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHtcbiAgICAgICAgICAgICAgICBbYy5jb250cm9sSWRdOiB7XG4gICAgICAgICAgICAgICAgICB2YWx1ZTogYy5maWxsVmFsdWUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICBpZiAodGhpcy5mb3JtLmNvbnRhaW5zKGMuY29udHJvbElkKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHZhbHVlKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm0uYWRkQ29udHJvbChjLmNvbnRyb2xJZCwgbmV3IEZvcm1Db250cm9sKGMuZmlsbFZhbHVlKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgKTtcblxuICAgIHRoaXMudXBkYXRlU3RlcEJ1dHRvblN0YXRlKHN0ZXApO1xuICB9XG5cbiAgdXBkYXRlU3RlcEJ1dHRvblN0YXRlKHN0ZXA6IFN0ZXBEYXRhKSB7XG4gICAgbGV0IGZvcm1seVN0ZXBGaWVsZCA9IHRoaXMuZm9ybWx5Q29uZmlnWzBdLmZpZWxkR3JvdXA/LmZpbmQoKGZpZWxkKSA9PlxuICAgICAgZmllbGQuZmllbGRHcm91cD8uZmluZCgoZikgPT4gZi5wcm9wcz8uWydzdGVwSWQnXSA9PT0gc3RlcC5pZGVudGlmaWVyKVxuICAgICk7XG5cbiAgICBpZiAoIWZvcm1seVN0ZXBGaWVsZCkge1xuICAgICAgZm9ybWx5U3RlcEZpZWxkID0gdGhpcy5mb3JtbHlDb25maWdbMF0uZmllbGRHcm91cD8uZmluZChcbiAgICAgICAgKGZpZWxkKSA9PiBmaWVsZC5wcm9wcz8uWydzdGVwSWQnXSA9PT0gc3RlcC5pZGVudGlmaWVyXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChmb3JtbHlTdGVwRmllbGQpIHtcbiAgICAgIGZvcm1seVN0ZXBGaWVsZC5wcm9wcyA9IHtcbiAgICAgICAgLi4uZm9ybWx5U3RlcEZpZWxkLnByb3BzLFxuICAgICAgICBidXR0b25zRGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgfTtcbiAgICAgIHRoaXMudXBkYXRlRm9ybWx5Q29uZmlnKCk7XG4gICAgICB0aGlzLmZvcm1seUNvbmZpZ1VwZGF0ZWQuZW1pdCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkUmVuZGVyZWRDc3MoKSB7XG4gICAgY29uc3Qgc3R5bGVTdHJpbmcgPSBGb3JtQ3NzSGVscGVyLmNvbnZlcnRUb1N0eWxlU3RyaW5nKFxuICAgICAgdGhpcy5kZXNpZ24sXG4gICAgICB0aGlzLnNob3dEaXNwbGF5TW9kZVxuICAgICk7XG5cbiAgICBjb25zdCBzdHlsZUVsZW1lbnQgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgc3R5bGVFbGVtZW50LmlkID0gJ3JlbmRlcmVkLWNzcyc7XG4gICAgY29uc3QgcmVuZEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlbmRlcmVkLWNzcycpO1xuICAgIGlmIChyZW5kRWwpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2hpbGQoZG9jdW1lbnQuYm9keSwgcmVuZEVsKTtcbiAgICB9XG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChcbiAgICAgIHN0eWxlRWxlbWVudCxcbiAgICAgIHRoaXMucmVuZGVyZXIuY3JlYXRlVGV4dChVdGlscy5yZW1vdmVOZXdMaW5lcyhzdHlsZVN0cmluZykpXG4gICAgKTtcbiAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKGRvY3VtZW50LmJvZHksIHN0eWxlRWxlbWVudCk7XG4gIH1cblxuICBhc3luYyBidWlsZFNlY3Rpb25zRmllbGRHcm91cEFzeW5jKFxuICAgIHN0ZXA6IFN0ZXBEYXRhIHwgdW5kZWZpbmVkLFxuICAgIHNlY3Rpb25zOiBTZWN0aW9uRGF0YVtdXG4gICk6IFByb21pc2U8Rm9ybWx5RmllbGRDb25maWdbXT4ge1xuICAgIGNvbnN0IHN0ZXBTZWN0aW9uczogRm9ybWx5RmllbGRDb25maWdbXSA9IFtdO1xuXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBzZWN0aW9ucyAmJiBpbmRleCA8IHNlY3Rpb25zLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgY29uc3Qgc2VjdGlvbiA9IHNlY3Rpb25zW2luZGV4XTtcbiAgICAgIGxldCBzZXBhcmF0b3JGb3JtbHlDb25maWc6IGFueSA9IHt9O1xuICAgICAgaWYgKHNlY3Rpb24uc2hvd1NlY3Rpb25UaXRsZSkge1xuICAgICAgICBzZXBhcmF0b3JGb3JtbHlDb25maWcgPSB7XG4gICAgICAgICAgdHlwZTogJ3NlcGFyYXRvcicsXG4gICAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgIHRpdGxlOlxuICAgICAgICAgICAgICBzZWN0aW9uLnRyYW5zbGF0aW9ucz8uZmluZChcbiAgICAgICAgICAgICAgICAodDogYW55KSA9PiB0Lmxhbmd1YWdlSXNvID09PSB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICAgICAgICApPy52YWx1ZSA/PyAnJyxcblxuICAgICAgICAgICAgZGVzaWduOiB0aGlzLmRlc2lnbixcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoc2VjdGlvbi5zaG93U2VjdGlvblNlcGFyYXRvcikge1xuICAgICAgICBzZXBhcmF0b3JGb3JtbHlDb25maWcgPSB7XG4gICAgICAgICAgLi4uc2VwYXJhdG9yRm9ybWx5Q29uZmlnLFxuICAgICAgICAgIHR5cGU6ICdzZXBhcmF0b3InLFxuICAgICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICAuLi5zZXBhcmF0b3JGb3JtbHlDb25maWcucHJvcHMsXG4gICAgICAgICAgICBzaG93U2VwYXJhdG9yOiBzZWN0aW9uLnNob3dTZWN0aW9uU2VwYXJhdG9yLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChzZWN0aW9uLmRlcGVuZGVudERpY3Rpb25hcnkpIHtcbiAgICAgICAgdGhpcy5hdHRhY2hUb0RlcGVuZGVudERpY3Rpb25hcnlJZk5lY2Vzc2FyeShcbiAgICAgICAgICBzZWN0aW9uLmRlcGVuZGVudERpY3Rpb25hcnksXG4gICAgICAgICAgc2VwYXJhdG9yRm9ybWx5Q29uZmlnXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBzdGVwU2VjdGlvbnMucHVzaChzZXBhcmF0b3JGb3JtbHlDb25maWcpO1xuXG4gICAgICBjb25zdCBzZWN0aW9uRm9ybWx5Q29uZmlnOiBGb3JtbHlGaWVsZENvbmZpZyA9IHtcbiAgICAgICAgdHlwZTogJ2N1c3RvbS1zZWN0aW9uJyxcbiAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICBsYWJlbDogc2VjdGlvbi50aXRsZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgIHNlY3Rpb24udHJhbnNsYXRpb25zPy5maW5kKFxuICAgICAgICAgICAgICAodDogYW55KSA9PiB0Lmxhbmd1YWdlSXNvID09PSB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICAgICAgKT8udmFsdWUgPz8gJycsXG4gICAgICAgICAgZGVzaWduOiB0aGlzLmRlc2lnbixcbiAgICAgICAgfSxcbiAgICAgICAgZmllbGRHcm91cDogYXdhaXQgdGhpcy5idWlsZENvbnRyb2xzRmllbGRHcm91cEFzeW5jKFxuICAgICAgICAgIHN0ZXAsXG4gICAgICAgICAgc2VjdGlvbi5jb250cm9scyB8fCBbXSxcbiAgICAgICAgICBzZWN0aW9uLnByZXNlbnRhdGlvbkNvbnRyb2xzIHx8IFtdXG4gICAgICAgICksXG4gICAgICAgIGZpZWxkR3JvdXBDbGFzc05hbWU6ICdkaXNwbGF5LWZsZXgnLFxuICAgICAgfTtcbiAgICAgIGlmIChzZWN0aW9uLmRlcGVuZGVudERpY3Rpb25hcnkpIHtcbiAgICAgICAgdGhpcy5hdHRhY2hUb0RlcGVuZGVudERpY3Rpb25hcnlJZk5lY2Vzc2FyeShcbiAgICAgICAgICBzZWN0aW9uLmRlcGVuZGVudERpY3Rpb25hcnksXG4gICAgICAgICAgc2VjdGlvbkZvcm1seUNvbmZpZ1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBzdGVwU2VjdGlvbnMucHVzaChzZWN0aW9uRm9ybWx5Q29uZmlnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RlcFNlY3Rpb25zO1xuICB9XG5cbiAgYXN5bmMgYnVpZERpc3BsYXlTdGVwKCk6IFByb21pc2U8Rm9ybWx5RmllbGRDb25maWc+IHtcbiAgICBsZXQgc3RlcEZvcm1seUNvbmZpZzogRm9ybWx5RmllbGRDb25maWcgPSB7fTtcbiAgICBpZiAodGhpcy5kaXNwbGF5Py5zZWN0aW9ucz8ubGVuZ3RoID4gMCkge1xuICAgICAgc3RlcEZvcm1seUNvbmZpZyA9IHtcbiAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAvLyBsYWJlbDogc3RlcC5uYW1lLFxuICAgICAgICAgIC8vIGJ1dHRvbnM6IHRoaXMuY29uc3RydWN0QnV0dG9ucyhzdGVwLmJ1dHRvbnMpLFxuICAgICAgICAgIC8vICBkZXBlbmRlbnREaWN0aW9uYXJ5OiBzdGVwLmRlcGVuZGVudERpY3Rpb25hcnksXG4gICAgICAgIH0sXG4gICAgICAgIGZpZWxkR3JvdXA6IGF3YWl0IHRoaXMuYnVpbGRTZWN0aW9uc0ZpZWxkR3JvdXBBc3luYyhcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgdGhpcy5kaXNwbGF5LnNlY3Rpb25zXG4gICAgICAgICksXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gc3RlcEZvcm1seUNvbmZpZztcbiAgfVxuXG4gIGFkZE5ld1Jvd1RvRm9ybUZpZWxkc0lmTmVjZXNzYXJ5KFxuICAgIGZpZWxkR3JvdXA6IEZvcm1seUZpZWxkQ29uZmlnW10sXG4gICAgbmV3Um93OiBGb3JtbHlGaWVsZENvbmZpZ1xuICApIHtcbiAgICBpZiAobmV3Um93LmZpZWxkR3JvdXAgJiYgbmV3Um93LmZpZWxkR3JvdXAubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5jYWxjdWxhdGVGb3JtRmllbGRzV2lkdGgobmV3Um93LmZpZWxkR3JvdXApO1xuICAgICAgZmllbGRHcm91cC5wdXNoKG5ld1Jvdyk7XG4gICAgfVxuICB9XG5cbiAgY2FsY3VsYXRlRm9ybUZpZWxkc1dpZHRoKGZvcm1GaWVsZHM6IEZvcm1seUZpZWxkQ29uZmlnW10pIHtcbiAgICBjb25zdCBjb2xXaWR0aFBlckl0ZW0gPSAxMiAvIGZvcm1GaWVsZHMubGVuZ3RoO1xuICAgIGZvcm1GaWVsZHMuZm9yRWFjaCgoZikgPT4ge1xuICAgICAgZi5jbGFzc05hbWUgPSAnY29sLScgKyBjb2xXaWR0aFBlckl0ZW07XG4gICAgfSk7XG4gIH1cblxuICBnZXRQZXJjZW50YWdlQ2xhc3NOYW1lKHBlcmNlbnRhZ2VEaW1lbnNpb246IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgdG90YWxDb2x1bW5zID0gMTI7IC8vIDEyLWNvbHVtbiBncmlkXG4gICAgY29uc3Qgc3BhbiA9IE1hdGgucm91bmQoKHBlcmNlbnRhZ2VEaW1lbnNpb24gLyAxMDApICogdG90YWxDb2x1bW5zKTtcbiAgICBjb25zdCBjbGFzc05hbWUgPSBgcGVyY2VudGFnZS13aWR0aC0ke3NwYW59YDtcblxuICAgIGlmICghZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY2xhc3NOYW1lKSkge1xuICAgICAgY29uc3Qgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgc3R5bGUudHlwZSA9ICd0ZXh0L2Nzcyc7XG4gICAgICBzdHlsZS5pZCA9IGNsYXNzTmFtZTtcbiAgICAgIHN0eWxlLmlubmVySFRNTCA9IGBcbiAgICAgICAgLiR7Y2xhc3NOYW1lfSB7XG4gICAgICAgICAgZ3JpZC1jb2x1bW46IHNwYW4gJHtzcGFufTtcbiAgICAgICAgfVxuICAgICAgYDtcbiAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuICAgIH1cbiAgICByZXR1cm4gY2xhc3NOYW1lO1xuICB9XG5cbiAgY3JlYXRlRmlsbGVyQ29udHJvbChzcGFuOiBudW1iZXIpOiBGb3JtbHlGaWVsZENvbmZpZyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdyb3ctZmlsbGVyJyxcbiAgICAgIGNsYXNzTmFtZTogYHBlcmNlbnRhZ2Utd2lkdGgtJHtzcGFufWAsXG4gICAgICBwcm9wczoge1xuICAgICAgICBsYWJlbDogJycsXG4gICAgICAgIGRpc2FibGVkOiB0cnVlLFxuICAgICAgICBoaWRlOiB0cnVlLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBidWlsZENvbnRyb2xzRmllbGRHcm91cEFzeW5jKFxuICAgIHN0ZXA6IFN0ZXBEYXRhIHwgdW5kZWZpbmVkLFxuICAgIGNvbnRyb2xzOiBDb250cm9sRGF0YVtdLFxuICAgIHByZXNlbnRhdGlvbkNvbnRyb2xzOiBQcmVzZW50YXRpb25Db250cm9sW11cbiAgKTogUHJvbWlzZTxGb3JtbHlGaWVsZENvbmZpZ1tdPiB7XG4gICAgY29uc3QgcmVzdWx0OiBGb3JtbHlGaWVsZENvbmZpZ1tdID0gW107XG4gICAgbGV0IHJvd0l0ZW1zOiAoQ29udHJvbERhdGEgfCBQcmVzZW50YXRpb25Db250cm9sKVtdID0gW107XG4gICAgY29udHJvbHMgPSBjb250cm9scy5maWx0ZXIoKGMpID0+ICFjLmlzT25seUZvckNvbmZpZyk7XG5cbiAgICAvLyBGaWx0ZXIgb3V0IGNvbnRyb2xzIHRoYXQgYXJlIGluY29tcGxldGVcbiAgICBjb250cm9scyA9IGNvbnRyb2xzLmZpbHRlcigoYykgPT4ge1xuICAgICAgLy8gU2tpcCBjb250cm9scyB0aGF0IGFyZSBtaXNzaW5nIGVzc2VudGlhbCBkYXRhXG4gICAgICBpZiAoXG4gICAgICAgIGMudHlwZSA9PT0gU3RlcENvbnRyb2xUeXBlLkRpY3Rpb25hcnkgJiZcbiAgICAgICAgIWMuc3BlY2lmaWNDb250cm9sRGF0YT8uZGljdGlvbmFyeVVVSURcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG5cbiAgICBjb25zdCBwcm9jZXNzUm93ID0gYXN5bmMgKFxuICAgICAgaXRlbXM6IChDb250cm9sRGF0YSB8IFByZXNlbnRhdGlvbkNvbnRyb2wpW11cbiAgICApID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkczogRm9ybWx5RmllbGRDb25maWdbXSA9IFtdO1xuICAgICAgY29uc3QgdG90YWwgPSAxMjtcbiAgICAgIGNvbnN0IGJ1aWx0OiBGb3JtbHlGaWVsZENvbmZpZ1tdID0gW107XG4gICAgICBjb25zdCBhdXRvOiB7XG4gICAgICAgIGM6IENvbnRyb2xEYXRhIHwgUHJlc2VudGF0aW9uQ29udHJvbDtcbiAgICAgICAgZjogRm9ybWx5RmllbGRDb25maWc7XG4gICAgICB9W10gPSBbXTtcbiAgICAgIGxldCB1c2VkID0gMDtcbiAgICAgIGZvciAoY29uc3QgaSBvZiBpdGVtcykge1xuICAgICAgICBpZiAoJ2NvbGxlY3Rpb25Db250cm9sSWRlbnRpZmllcicgaW4gaSA9PT0gdHJ1ZSkge1xuICAgICAgICAgIGJ1aWx0LnB1c2goXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmJ1aWxkUHJlc2VudGF0aW9uRm9ybUZpZWxkQXN5bmMoXG4gICAgICAgICAgICAgIHN0ZXAsXG4gICAgICAgICAgICAgIGkgYXMgUHJlc2VudGF0aW9uQ29udHJvbFxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoJ2FwaU1ldGhvZElkJyBpbiBpID09PSB0cnVlKSB7XG4gICAgICAgICAgYnVpbHQucHVzaChcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYnVpbGRBcGlNZXRob2RGb3JtRmllbGRBc3luYyhcbiAgICAgICAgICAgICAgc3RlcCxcbiAgICAgICAgICAgICAgaSBhcyBQcmVzZW50YXRpb25Db250cm9sXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBidWlsdC5wdXNoKGF3YWl0IHRoaXMuYnVpbGRGb3JtRmllbGRBc3luYyhzdGVwLCBpIGFzIENvbnRyb2xEYXRhKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgYyA9IGl0ZW1zW2ldO1xuICAgICAgICBjb25zdCBmID0gYnVpbHRbaV07XG4gICAgICAgIGlmIChjLmRpbWVuc2lvblR5cGUgPT09IERpbWVuc2lvblR5cGUuUGVyY2VudGFnZSkge1xuICAgICAgICAgIGlmIChjLmF1dG9EaW1lbnNpb24pIHtcbiAgICAgICAgICAgIGF1dG8ucHVzaCh7IGMsIGYgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBNYXRoLnJvdW5kKChjLmRpbWVuc2lvbiAvIDEwMCkgKiB0b3RhbCk7XG4gICAgICAgICAgICB1c2VkICs9IHM7XG4gICAgICAgICAgICBjb25zdCBwZXJjZW50YWdlQ2xhc3MgPSB0aGlzLmdldFBlcmNlbnRhZ2VDbGFzc05hbWUoYy5kaW1lbnNpb24pO1xuICAgICAgICAgICAgZi5jbGFzc05hbWUgPSBgJHtmLmNsYXNzTmFtZX0gJHtwZXJjZW50YWdlQ2xhc3N9YDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoYy5kaW1lbnNpb25UeXBlID09PSBEaW1lbnNpb25UeXBlLlBpeGVscykge1xuICAgICAgICAgIGNvbnN0IHMgPSBNYXRoLnJvdW5kKChjLmRpbWVuc2lvbiAvIHdpbmRvdy5pbm5lcldpZHRoKSAqIHRvdGFsKTtcbiAgICAgICAgICB1c2VkICs9IHM7XG4gICAgICAgICAgY29uc3QgcGVyY2VudGFnZUNsYXNzID0gdGhpcy5nZXRQZXJjZW50YWdlQ2xhc3NOYW1lKFxuICAgICAgICAgICAgKHMgLyB0b3RhbCkgKiAxMDBcbiAgICAgICAgICApO1xuICAgICAgICAgIGYuY2xhc3NOYW1lID0gYCR7Zi5jbGFzc05hbWV9ICR7cGVyY2VudGFnZUNsYXNzfWA7XG4gICAgICAgIH0gZWxzZSBpZiAoYy5hdXRvRGltZW5zaW9uKSB7XG4gICAgICAgICAgYXV0by5wdXNoKHsgYywgZiB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1c2VkICs9IDE7XG4gICAgICAgICAgY29uc3QgcGVyY2VudGFnZUNsYXNzID0gdGhpcy5nZXRQZXJjZW50YWdlQ2xhc3NOYW1lKFxuICAgICAgICAgICAgKDEgLyB0b3RhbCkgKiAxMDBcbiAgICAgICAgICApO1xuICAgICAgICAgIGYuY2xhc3NOYW1lID0gYCR7Zi5jbGFzc05hbWV9ICR7cGVyY2VudGFnZUNsYXNzfWA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlbSA9IHRvdGFsIC0gdXNlZDtcbiAgICAgIGlmIChhdXRvLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3Qgc2hhcmUgPSBNYXRoLm1heChNYXRoLmZsb29yKHJlbSAvIGF1dG8ubGVuZ3RoKSwgMSk7XG4gICAgICAgIGZvciAoY29uc3QgYSBvZiBhdXRvKSB7XG4gICAgICAgICAgY29uc3QgcGVyY2VudGFnZUNsYXNzID0gdGhpcy5nZXRQZXJjZW50YWdlQ2xhc3NOYW1lKFxuICAgICAgICAgICAgKHNoYXJlIC8gdG90YWwpICogMTAwXG4gICAgICAgICAgKTtcbiAgICAgICAgICBhLmYuY2xhc3NOYW1lID0gYCR7YS5mLmNsYXNzTmFtZX0gJHtwZXJjZW50YWdlQ2xhc3N9YDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZmllbGRzLnB1c2goLi4uYnVpbHQpO1xuICAgICAgcmV0dXJuIGZpZWxkcztcbiAgICB9O1xuICAgIGZvciAoY29uc3QgYyBvZiBbLi4uY29udHJvbHMsIC4uLnByZXNlbnRhdGlvbkNvbnRyb2xzXSkge1xuICAgICAgaWYgKFxuICAgICAgICAoJ3R5cGUnIGluIGMgJiYgYy50eXBlID09PSBTdGVwQ29udHJvbFR5cGUuTmV3Um93KSB8fFxuICAgICAgICBjLnR5cGUgPT0gUHJlc2VudGF0aW9uQ29udHJvbFR5cGUuTmV3Um93XG4gICAgICApIHtcbiAgICAgICAgaWYgKHJvd0l0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICByZXN1bHQucHVzaCguLi4oYXdhaXQgcHJvY2Vzc1Jvdyhyb3dJdGVtcykpKTtcbiAgICAgICAgICByb3dJdGVtcyA9IFtdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByb3dJdGVtcy5wdXNoKGMpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocm93SXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgcmVzdWx0LnB1c2goLi4uKGF3YWl0IHByb2Nlc3NSb3cocm93SXRlbXMpKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBnZXRQaXhlbENsYXNzTmFtZShwaXhlbERpbWVuc2lvbjogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBjbGFzc05hbWUgPSBgcGl4ZWwtd2lkdGgtJHtwaXhlbERpbWVuc2lvbn1gO1xuICAgIGlmICghZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY2xhc3NOYW1lKSkge1xuICAgICAgY29uc3Qgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgc3R5bGUudHlwZSA9ICd0ZXh0L2Nzcyc7XG4gICAgICBzdHlsZS5pZCA9IGNsYXNzTmFtZTtcbiAgICAgIHN0eWxlLmlubmVySFRNTCA9IGBcbiAgICAgICAgLiR7Y2xhc3NOYW1lfSB7XG4gICAgICAgICAgd2lkdGg6ICR7cGl4ZWxEaW1lbnNpb259cHg7XG4gICAgICAgIH1cbiAgICAgIGA7XG4gICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlKTtcbiAgICB9XG4gICAgcmV0dXJuIGNsYXNzTmFtZTtcbiAgfVxuXG4gIGFzeW5jIGJ1aWxkRm9ybUZpZWxkQXN5bmMoXG4gICAgc3RlcDogU3RlcERhdGEgfCB1bmRlZmluZWQsXG4gICAgY29udHJvbDogQ29udHJvbERhdGFcbiAgKTogUHJvbWlzZTxGb3JtbHlGaWVsZENvbmZpZz4ge1xuICAgIGxldCBpbml0aWFsVHlwZSA9ICdpbnB1dCc7IC8vIERlZmF1bHQgdHlwZVxuICAgIGxldCBjb21wb25lbnRTdHlsZUtleSA9IGAuY29tcG9uZW50LXRleHQtZmllbGRgOyAvLyBEZWZhdWx0IHN0eWxlIGZvciB0ZXh0IGlucHV0XG4gICAgY29uc3QgYmFzZVN0eWxlID0gdGhpcy5kZXNpZ25bYC5mb250LSR7aW5pdGlhbFR5cGV9YF0gfHwge307XG4gICAgY29uc3QgY29udHJvbFN0eWxlU3RyaW5nID1cbiAgICAgIHRoaXMuc3R5bGVPYmplY3RUb1N0cmluZ0V4Y2VwdEJhY2tncm91bmQoYmFzZVN0eWxlKTtcbiAgICBsZXQgcGF0dGVybiA9ICcnO1xuICAgIGlmIChjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE/LmFsbG93ZWRDaGFyYWN0ZXJzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBwYXR0ZXJuID0gbmV3IFJlZ0V4cChjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGEuYWxsb3dlZENoYXJhY3RlcnMpXG4gICAgICAgICAgLnNvdXJjZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignaW5jb3JyZWN0IHJlZ2V4IHBhdHRlcm4nLCBlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb21wb25lbnRzVG9FeGNsdWRlRnJvbVN0eWxlID0gW1xuICAgICAgJy5jb21wb25lbnQtdGV4dC1maWVsZCcsXG4gICAgICAnLmNvbXBvbmVudC1jaGVja2JveCcsXG4gICAgICAnLmNvbXBvbmVudC1yYWRpbycsXG4gICAgICAnLmNvbXBvbmVudC1kYXRlJyxcbiAgICAgICcuY29tcG9uZW50LWRhdGEnLFxuICAgIF07XG4gICAgbGV0IGZvcm1seUNvbmZpZyA9IHRoaXMuZ2V0RGVmYXVsdEZvcm1seUZpZWxkQ29uZmlnKFxuICAgICAgY29udHJvbCxcbiAgICAgIGluaXRpYWxUeXBlLFxuICAgICAgcGF0dGVybixcbiAgICAgIGNvbXBvbmVudFN0eWxlS2V5LFxuICAgICAgY29tcG9uZW50c1RvRXhjbHVkZUZyb21TdHlsZVxuICAgICk7XG4gICAgLy9jb250cm9sLnNwZWNpZmljQ29udHJvbERhdGEudHlwZSA9PT0gMyAgaXMgZW1haWxcbiAgICBpZiAoY29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhPy50eXBlID09PSAzKSB7XG4gICAgICB0aGlzLmFkZFZhbGlkYXRvcnMoZm9ybWx5Q29uZmlnLCBjb250cm9sKTtcbiAgICB9XG5cbiAgICBpZiAoY29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhPy5pc0FwaVZhbGlkYXRpb24pIHtcbiAgICAgIHRoaXMuYWRkQXBpVmFsaWRhdG9ycyhmb3JtbHlDb25maWcsIGNvbnRyb2wpO1xuICAgIH1cblxuICAgIHN3aXRjaCAoY29udHJvbC50eXBlKSB7XG4gICAgICBjYXNlIFN0ZXBDb250cm9sVHlwZS5NYW51YWxJbnB1dDogLy8gVGV4dFxuICAgICAgICB2YXIgc3ViVHlwZSA9IGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YVxuICAgICAgICAgID8udHlwZSBhcyBNYW51YWxJbnB1dENvbnRyb2xUeXBlO1xuICAgICAgICBzd2l0Y2ggKHN1YlR5cGUpIHtcbiAgICAgICAgICBjYXNlIE1hbnVhbElucHV0Q29udHJvbFR5cGUuTnVtZXJpYzpcbiAgICAgICAgICAgIGZvcm1seUNvbmZpZy50eXBlID0gJ251bWJlcic7XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgTWFudWFsSW5wdXRDb250cm9sVHlwZS5FbWFpbDpcbiAgICAgICAgICBjYXNlIE1hbnVhbElucHV0Q29udHJvbFR5cGUuVGV4dDpcbiAgICAgICAgICBjYXNlIE1hbnVhbElucHV0Q29udHJvbFR5cGUuUGhvbmU6XG4gICAgICAgICAgICBmb3JtbHlDb25maWcudHlwZSA9ICdpbnB1dCc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE1hbnVhbElucHV0Q29udHJvbFR5cGUuVGV4dEFyZWE6XG4gICAgICAgICAgICBmb3JtbHlDb25maWcudHlwZSA9ICdpbnB1dCc7XG4gICAgICAgICAgICBmb3JtbHlDb25maWcucHJvcHMhWydhdXRvc2l6ZSddID0gZmFsc2U7XG4gICAgICAgICAgICBjb21wb25lbnRTdHlsZUtleSA9ICcuY29tcG9uZW50LXRleHQtZmllbGQnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBNYW51YWxJbnB1dENvbnRyb2xUeXBlLkRhdGVUaW1lOlxuICAgICAgICAgICAgZm9ybWx5Q29uZmlnLnR5cGUgPSAnZGF0ZXBpY2tlcic7XG4gICAgICAgICAgICBmb3JtbHlDb25maWcucHJvcHMgPSB7XG4gICAgICAgICAgICAgIHJlYWRvbmx5OiB0cnVlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbXBvbmVudFN0eWxlS2V5ID0gJy5jb21wb25lbnQtZGF0ZSc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgZm9ybWx5Q29uZmlnLnR5cGUgPSAnaW5wdXQnO1xuICAgICAgICAgICAgY29tcG9uZW50U3R5bGVLZXkgPSAnLmNvbXBvbmVudC10ZXh0LWZpZWxkJztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTdGVwQ29udHJvbFR5cGUuUGFyYWdyYXBoOiAvLyBQYXJhZ3JhcGhcbiAgICAgICAgZm9ybWx5Q29uZmlnLnR5cGUgPSAnZm9ybWx5LXBhcmFncmFwaCc7XG4gICAgICAgIGNvbXBvbmVudFN0eWxlS2V5ID0gJy5jb21wb25lbnQtdGV4dC1maWVsZCc7XG5cbiAgICAgICAgY29uc3QgdHJhbnNsYXRlZERlc2NyaXB0aW9uID1cbiAgICAgICAgICBjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE/LmRlc2NyaXB0aW9uVHJhbnNsYXRpb25zPy5maW5kKFxuICAgICAgICAgICAgKGQ6IHsgbGFuZ3VhZ2VJc286IHN0cmluZyB9KSA9PlxuICAgICAgICAgICAgICBkLmxhbmd1YWdlSXNvID09PSB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICAgICk/LnZhbHVlIHx8ICcnO1xuICAgICAgICBmb3JtbHlDb25maWcuZGVmYXVsdFZhbHVlID0gdHJhbnNsYXRlZERlc2NyaXB0aW9uO1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTdGVwQ29udHJvbFR5cGUuQ2hlY2tCb3g6IC8vIENoZWNrYm94XG4gICAgICAgIGZvcm1seUNvbmZpZy50eXBlID0gJ2Zvcm1seS1jaGVja2JveCc7XG4gICAgICAgIGNvbXBvbmVudFN0eWxlS2V5ID0gJy5jb21wb25lbnQtY2hlY2tib3gnO1xuICAgICAgICB2YXIgY2hlY2tlZCA9IGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YT8uY2hlY2tlZCA/PyBmYWxzZTtcbiAgICAgICAgZm9ybWx5Q29uZmlnLnByb3BzIVsnY2hlY2tlZCddID0gY2hlY2tlZDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFN0ZXBDb250cm9sVHlwZS5EaWN0aW9uYXJ5OiAvLyBEaWN0aW9uYXJ5IChkcm9wZG93bilcbiAgICAgICAgY29tcG9uZW50U3R5bGVLZXkgPVxuICAgICAgICAgIGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YS5zaG93QXNSYWRpb0J1dHRvbnNMaXN0ID09PSB0cnVlXG4gICAgICAgICAgICA/ICcuY29tcG9uZW50LXJhZGlvJ1xuICAgICAgICAgICAgOiAnLmNvbXBvbmVudC1kYXRhJztcbiAgICAgICAgYXdhaXQgdGhpcy5jb25zdHJ1Y3REaWN0aW9uYXJ5KGNvbnRyb2wsIGZvcm1seUNvbmZpZyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTdGVwQ29udHJvbFR5cGUuQnV0dG9uczpcbiAgICAgICAgZm9ybWx5Q29uZmlnLnR5cGUgPSAnJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFN0ZXBDb250cm9sVHlwZS5GbHV4SW5mbzpcbiAgICAgICAgZm9ybWx5Q29uZmlnLnR5cGUgPSAnJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFN0ZXBDb250cm9sVHlwZS5Eb3dubG9hZERvY3VtZW50czpcbiAgICAgICAgZm9ybWx5Q29uZmlnID0gdGhpcy5DcmVhdGVEb3dubG9hZERvY3NGaWVsZENvbmZpZyhjb250cm9sKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFN0ZXBDb250cm9sVHlwZS5WaWV3RG9jdW1lbnRzOlxuICAgICAgICBmb3JtbHlDb25maWcgPSB0aGlzLkNyZWF0ZVZpZXdEb2NzRmllbGRDb25maWcoY29udHJvbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTdGVwQ29udHJvbFR5cGUuVXBsb2FkRG9jdW1lbnRzOlxuICAgICAgICBmb3JtbHlDb25maWcgPSB0aGlzLkNyZWF0ZVVwbG9hZERvY3NGaWVsZENvbmZpZyhjb250cm9sKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFN0ZXBDb250cm9sVHlwZS5OZXdSb3c6IC8vIE5ldyBSb3dcbiAgICAgICAgZm9ybWx5Q29uZmlnLnR5cGUgPSAnJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBmb3JtbHlDb25maWcudHlwZSA9ICdpbnB1dCc7XG4gICAgICAgIGNvbXBvbmVudFN0eWxlS2V5ID0gJy5jb21wb25lbnQtdGV4dC1maWVsZCc7XG4gICAgfVxuICAgIGZvcm1seUNvbmZpZy5jbGFzc05hbWUgPSBjb21wb25lbnRTdHlsZUtleS5zdWJzdHJpbmcoMSk7XG5cbiAgICBpZiAoIWNvbXBvbmVudHNUb0V4Y2x1ZGVGcm9tU3R5bGUuZmluZCgoYykgPT4gYyA9PT0gY29tcG9uZW50U3R5bGVLZXkpKSB7XG4gICAgICBpZiAodGhpcy5kZXNpZ25bY29tcG9uZW50U3R5bGVLZXldKSB7XG4gICAgICAgIGZvcm1seUNvbmZpZy5wcm9wcyEuYXR0cmlidXRlcyFbJ3N0eWxlJ10gKz1cbiAgICAgICAgICAnOycgK1xuICAgICAgICAgIHRoaXMuc3R5bGVPYmplY3RUb1N0cmluZ0V4Y2VwdEJhY2tncm91bmQoXG4gICAgICAgICAgICB0aGlzLmRlc2lnbltjb21wb25lbnRTdHlsZUtleV1cbiAgICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBBcHBseSBsYWJlbCBzdHlsZXNcbiAgICAgIGNvbnN0IGxhYmVsU3R5bGVLZXkgPSBgJHtjb21wb25lbnRTdHlsZUtleX0tbGFiZWxgO1xuICAgICAgaWYgKHRoaXMuZGVzaWduW2xhYmVsU3R5bGVLZXldKSB7XG4gICAgICAgIGZvcm1seUNvbmZpZy5wcm9wcyEuYXR0cmlidXRlcyFbJ3N0eWxlJ10gKz1cbiAgICAgICAgICAnOycgK1xuICAgICAgICAgIHRoaXMuc3R5bGVPYmplY3RUb1N0cmluZ0V4Y2VwdEJhY2tncm91bmQoXG4gICAgICAgICAgICB0aGlzLmRlc2lnbltjb21wb25lbnRTdHlsZUtleV1cbiAgICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY29udHJvbC5kZXBlbmRlbnREaWN0aW9uYXJ5KSB7XG4gICAgICB0aGlzLmF0dGFjaFRvRGVwZW5kZW50RGljdGlvbmFyeUlmTmVjZXNzYXJ5KFxuICAgICAgICBjb250cm9sLmRlcGVuZGVudERpY3Rpb25hcnksXG4gICAgICAgIGZvcm1seUNvbmZpZ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBsZXQgdHJhbnNsYXRlZFRpdGxlID0gY29udHJvbC50cmFuc2xhdGlvbnM/LmZpbmQoXG4gICAgICAoZDogeyBsYW5ndWFnZUlzbzogc3RyaW5nIH0pID0+IGQubGFuZ3VhZ2VJc28gPT09IHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgKT8udmFsdWU7XG4gICAgaWYgKCF0cmFuc2xhdGVkVGl0bGUpIHtcbiAgICAgIHRyYW5zbGF0ZWRUaXRsZSA9IGNvbnRyb2wudGl0bGU7XG4gICAgfVxuICAgIGZvcm1seUNvbmZpZy5wcm9wcyFbJ2xhYmVsJ10gPSB0cmFuc2xhdGVkVGl0bGU7XG5cbiAgICB0aGlzLmZvcm1seUNvbGxlY3RpbmdGaWVsZHMucHVzaChmb3JtbHlDb25maWcpO1xuXG4gICAgcmV0dXJuIGZvcm1seUNvbmZpZztcbiAgfVxuXG4gIGFkZFZhbGlkYXRvcnMoZm9ybWx5Q29uZmlnOiBGb3JtbHlGaWVsZENvbmZpZywgY29udHJvbDogQ29udHJvbERhdGEpIHtcbiAgICB2YXIgZW1haWxFcnJvckxhYmVsID0gdGhpcy5mbHV4Py5maW5kKFxuICAgICAgKGYpID0+IGY/LmNvbmZpZz8uY29tcG9uZW50Q29sbGVjdGVkID09PSBjb250cm9sPy5pZGVudGlmaWVyXG4gICAgKT8uY29uZmlnPy5lbWFpbEVycm9yTGFiZWw7XG4gICAgdmFyIGVtYWlsRXJyb3JMYWJlbFZhbHVlID0gJyc7XG4gICAgaWYgKGVtYWlsRXJyb3JMYWJlbCAhPSBudWxsICYmIEFycmF5LmlzQXJyYXkoZW1haWxFcnJvckxhYmVsKSkge1xuICAgICAgZW1haWxFcnJvckxhYmVsVmFsdWUgPVxuICAgICAgICAoZW1haWxFcnJvckxhYmVsIGFzIExhYmVsSW5mb1tdKS5maW5kKFxuICAgICAgICAgIChsKSA9PiBsLmxhbmd1YWdlSXNvID09PSB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICApPy52YWx1ZSA/PyAnJztcbiAgICB9XG5cbiAgICBmb3JtbHlDb25maWcudmFsaWRhdG9ycyA9IHtcbiAgICAgIGVtYWlsVmFsaWQ6IHtcbiAgICAgICAgZXhwcmVzc2lvbjogKGNvbnQ6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gY29udC52YWx1ZTtcbiAgICAgICAgICBjb25zdCBlbWFpbFBhdHRlcm4gPSBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgJ15bYS16QS1aMC05Ll8lKy1dK0BbYS16QS1aMC05Li1dK1xcXFwuW2EtekEtWl17Mix9JCdcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICh2YWx1ZSAmJiAhZW1haWxQYXR0ZXJuLnRlc3QodmFsdWUpKSB7XG4gICAgICAgICAgICBjb250LnNldEVycm9ycyh7IGludmFsaWRFbWFpbDogdHJ1ZSB9KTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0sXG4gICAgICAgIG1lc3NhZ2U6IGVtYWlsRXJyb3JMYWJlbFZhbHVlLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgYWRkQXBpVmFsaWRhdG9ycyhmb3JtbHlDb25maWc6IEZvcm1seUZpZWxkQ29uZmlnLCBjb250cm9sOiBDb250cm9sRGF0YSkge1xuICAgIGZvcm1seUNvbmZpZy5hc3luY1ZhbGlkYXRvcnMgPSB7XG4gICAgICB2YWxpZGF0ZVRocm91Z2hBcGk6IHtcbiAgICAgICAgZXhwcmVzc2lvbjogKGNvbnQ6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBjb250LnZhbHVlQ2hhbmdlcy5waXBlKFxuICAgICAgICAgICAgICBkZWJvdW5jZVRpbWUoNTAwKSxcbiAgICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBhcGlWYWxpZGF0aW9uTWV0aG9kID1cbiAgICAgICAgICAgICAgICAgIGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YS5hcGlWYWxpZGF0aW9uTWV0aG9kO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgYm9keVZhbHVlID0gdGhpcy5hcHBNb2RlbC5wYXJ0bmVyc1xuICAgICAgICAgICAgICAgICAgLmZsYXRNYXAoKHApID0+IHAucGFydG5lclNldHRpbmdzLnBhcnRuZXJNZXRob2RzQXBpKVxuICAgICAgICAgICAgICAgICAgLmZpbmQoKHApID0+IHAubWV0aG9kSWQgPT09IGFwaVZhbGlkYXRpb25NZXRob2QpXG4gICAgICAgICAgICAgICAgICA/LmJvZHlDb25maWd1cmF0aW9uLmJvZHlNYXBGaWVsZHM7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBmaWVsZE1hcDogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9XG4gICAgICAgICAgICAgICAgICBib2R5VmFsdWU/LnJlZHVjZSgoYWNjOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9LCBmKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmLmZsdXhGaWVsZElkID09PSBjb250cm9sLmlkZW50aWZpZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICBhY2NbZi5wYXJ0bmVyRmllbGRdID0gY29udC52YWx1ZSB8fCAnJztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBhY2NbZi5wYXJ0bmVyRmllbGRdID0gJyc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICAgICAgICAgIH0sIHt9KSB8fCB7fTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFSZXF1ZXN0OiBBcGlWYWxpZGF0ZVJlcXVlc3QgPSB7XG4gICAgICAgICAgICAgICAgICBhcHBJZDogdGhpcy5hcHBNb2RlbC5hcHBsaWNhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgYXBpSWQ6IGFwaVZhbGlkYXRpb25NZXRob2QsXG4gICAgICAgICAgICAgICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShmaWVsZE1hcCksXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlTWV0aG9kQXBpKGRhdGFSZXF1ZXN0KS5waXBlKFxuICAgICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiBvZihmYWxzZSkpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICkgfHwgJ3Nzc3Nzc3Nzc3Nzc3Nzc3MnXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgbWVzc2FnZTogJ1ZhbGlkYXRpb24gZmFpbGVkLicsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBnZXREZWZhdWx0Rm9ybWx5RmllbGRDb25maWcoXG4gICAgY29udHJvbDogQ29udHJvbERhdGEsXG4gICAgdHlwZTogc3RyaW5nLFxuICAgIHBhdHRlcm46IHN0cmluZyxcbiAgICBjb21wb25lbnRTdHlsZUtleTogc3RyaW5nLFxuICAgIGNvbXBvbmVudHNUb0V4Y2x1ZGVGcm9tU3R5bGU6IHN0cmluZ1tdXG4gICk6IEZvcm1seUZpZWxkQ29uZmlnIHtcbiAgICBjb25zdCBjdXJyZW50TGFuZ3VhZ2VJZCA9IFV0aWxzLmZpbmRMYW5ndWFnZUlkQnlJc28oXG4gICAgICB0aGlzLmF2YWlsYWJsZUxhbmd1YWdlcyxcbiAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgKTtcblxuICAgIGxldCBmb3JtbHlDb25maWc6IEZvcm1seUZpZWxkQ29uZmlnID0ge1xuICAgICAga2V5OiBjb250cm9sLmlkZW50aWZpZXIgfHwgY29udHJvbC50aXRsZSxcbiAgICAgIHR5cGU6IHR5cGUsXG4gICAgICBwcm9wczoge1xuICAgICAgICBjdXJyZW50TGFuZ3VhZ2VJc286IHRoaXMuY3VycmVudExhbmd1YWdlSXNvLFxuICAgICAgICBjdXJyZW50TGFuZ3VhZ2VJZDogY3VycmVudExhbmd1YWdlSWQsXG4gICAgICAgIGxhYmVsOlxuICAgICAgICAgIGNvbnRyb2wudHJhbnNsYXRpb25zPy5maW5kKFxuICAgICAgICAgICAgKHQ6IHsgbGFuZ3VhZ2VJc286IHN0cmluZyB9KSA9PlxuICAgICAgICAgICAgICB0Lmxhbmd1YWdlSXNvID09PSB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICAgICk/LnZhbHVlIHx8ICcnLFxuXG4gICAgICAgIHRpdGxlOlxuICAgICAgICAgIGNvbnRyb2wudHJhbnNsYXRpb25zPy5maW5kKFxuICAgICAgICAgICAgKHQ6IHsgbGFuZ3VhZ2VJc286IHN0cmluZyB9KSA9PlxuICAgICAgICAgICAgICB0Lmxhbmd1YWdlSXNvID09PSB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICAgICk/LnZhbHVlIHx8ICcnLFxuICAgICAgICBkZXNpZ246IHRoaXMuZGVzaWduLFxuICAgICAgICByZXF1aXJlZDogY29udHJvbC5pc01hbmRhdG9yeSxcbiAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgIHN0eWxlOiBjb21wb25lbnRzVG9FeGNsdWRlRnJvbVN0eWxlLmZpbmQoXG4gICAgICAgICAgICAoYykgPT4gYyA9PT0gY29tcG9uZW50U3R5bGVLZXlcbiAgICAgICAgICApXG4gICAgICAgICAgICA/ICcnXG4gICAgICAgICAgICA6IGNvbXBvbmVudFN0eWxlS2V5LFxuICAgICAgICB9LFxuICAgICAgICBhdXRvc2l6ZTogdHJ1ZSxcbiAgICAgICAgb3B0aW9uczogW3t9XSxcbiAgICAgICAgZmllbGRHcm91cDogW10sXG4gICAgICAgIGF1dG9EaW1lbnNpb246IGNvbnRyb2wuYXV0b0RpbWVuc2lvbixcbiAgICAgIH0sXG4gICAgICBleHByZXNzaW9uczoge30sXG4gICAgICBob29rczoge30sXG4gICAgICB2YWxpZGF0b3JzOiB7fSxcbiAgICB9O1xuICAgIGZvcm1seUNvbmZpZy52YWxpZGF0aW9uID0ge307XG5cbiAgICBpZiAoY29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhPy5pc01hbmRhdG9yeSAmJiBmb3JtbHlDb25maWcucHJvcHMpIHtcbiAgICAgIHZhciByZXF1aXJlZE1lc3NhZ2UgPSBVdGlscy5maW5kRXJyb3JUcmFuc2xhdGlvblZhbHVlT3JEZWZhdWx0KFxuICAgICAgICBjb250cm9sLmVycm9yc1RyYW5zbGF0aW9ucyxcbiAgICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc28sXG4gICAgICAgICdpc01hbmRhdG9yeVZhbGlkYXRpb24nXG4gICAgICApO1xuXG4gICAgICBmb3JtbHlDb25maWcucHJvcHMucmVxdWlyZWQgPSBjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE/LmlzTWFuZGF0b3J5O1xuICAgICAgZm9ybWx5Q29uZmlnLnZhbGlkYXRpb24ubWVzc2FnZXMgPSB7XG4gICAgICAgIC4uLmZvcm1seUNvbmZpZy52YWxpZGF0aW9uPy5tZXNzYWdlcyxcbiAgICAgICAgcmVxdWlyZWQ6IHJlcXVpcmVkTWVzc2FnZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgY29udHJvbC50eXBlID09PSBTdGVwQ29udHJvbFR5cGUuRGljdGlvbmFyeSAmJlxuICAgICAgY29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhPy5pc01hbmRhdG9yeSAmJlxuICAgICAgY29udHJvbC5lcnJvcnNUcmFuc2xhdGlvbnMgJiZcbiAgICAgIGZvcm1seUNvbmZpZy5wcm9wc1xuICAgICkge1xuICAgICAgdmFyIHJlcXVpcmVkTWVzc2FnZSA9IFV0aWxzLmZpbmRFcnJvclRyYW5zbGF0aW9uVmFsdWVPckRlZmF1bHQoXG4gICAgICAgIGNvbnRyb2wuZXJyb3JzVHJhbnNsYXRpb25zLFxuICAgICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzbyxcbiAgICAgICAgJ2lzTWFuZGF0b3J5J1xuICAgICAgKTtcblxuICAgICAgZm9ybWx5Q29uZmlnLnByb3BzLnJlcXVpcmVkID0gY29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhPy5pc01hbmRhdG9yeTtcbiAgICAgIGZvcm1seUNvbmZpZy52YWxpZGF0aW9uLm1lc3NhZ2VzID0ge1xuICAgICAgICAuLi5mb3JtbHlDb25maWcudmFsaWRhdGlvbj8ubWVzc2FnZXMsXG4gICAgICAgIHJlcXVpcmVkOiByZXF1aXJlZE1lc3NhZ2UsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGxldCBzaW1wbGVWYWxpZGF0aW9uTWVzc2FnZSA9ICcnO1xuICAgIGlmIChjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE/LmlzU2ltcGxlVmFsaWRhdGlvbiAmJiBmb3JtbHlDb25maWcucHJvcHMpIHtcbiAgICAgIGlmIChcbiAgICAgICAgY29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhPy5pc1NpbXBsZVZhbGlkYXRpb24gJiZcbiAgICAgICAgZm9ybWx5Q29uZmlnLnByb3BzXG4gICAgICApIHtcbiAgICAgICAgc2ltcGxlVmFsaWRhdGlvbk1lc3NhZ2UgPSBVdGlscy5maW5kRXJyb3JUcmFuc2xhdGlvblZhbHVlT3JEZWZhdWx0KFxuICAgICAgICAgIGNvbnRyb2wuZXJyb3JzVHJhbnNsYXRpb25zLFxuICAgICAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvLFxuICAgICAgICAgICdzaW1wbGVWYWxpZGF0aW9uJ1xuICAgICAgICApO1xuXG4gICAgICAgIGlmIChjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE/Lm1pblZhbHVlPy50b1N0cmluZygpKSB7XG4gICAgICAgICAgZm9ybWx5Q29uZmlnLnByb3BzLm1pbiA9IGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YS5taW5WYWx1ZTtcbiAgICAgICAgICBmb3JtbHlDb25maWcudmFsaWRhdGlvbi5tZXNzYWdlcyA9IHtcbiAgICAgICAgICAgIC4uLmZvcm1seUNvbmZpZy52YWxpZGF0aW9uPy5tZXNzYWdlcyxcbiAgICAgICAgICAgIG1pbjogc2ltcGxlVmFsaWRhdGlvbk1lc3NhZ2UsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE/Lm1heFZhbHVlPy50b1N0cmluZygpKSB7XG4gICAgICAgICAgZm9ybWx5Q29uZmlnLnByb3BzLm1heCA9IGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YS5tYXhWYWx1ZTtcbiAgICAgICAgICBmb3JtbHlDb25maWcudmFsaWRhdGlvbi5tZXNzYWdlcyA9IHtcbiAgICAgICAgICAgIC4uLmZvcm1seUNvbmZpZy52YWxpZGF0aW9uPy5tZXNzYWdlcyxcbiAgICAgICAgICAgIG1heDogc2ltcGxlVmFsaWRhdGlvbk1lc3NhZ2UsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBBcHBseSBwYXR0ZXJuIHZhbGlkYXRpb24gaWYgYWxsb3dlZENoYXJhY3RlcnMgaXMgZGVmaW5lZFxuICAgICAgaWYgKGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YT8uYWxsb3dlZENoYXJhY3RlcnMpIHtcbiAgICAgICAgc2ltcGxlVmFsaWRhdGlvbk1lc3NhZ2UgPSBzaW1wbGVWYWxpZGF0aW9uTWVzc2FnZSA9XG4gICAgICAgICAgVXRpbHMuZmluZEVycm9yVHJhbnNsYXRpb25WYWx1ZU9yRGVmYXVsdChcbiAgICAgICAgICAgIGNvbnRyb2wuZXJyb3JzVHJhbnNsYXRpb25zLFxuICAgICAgICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc28sXG4gICAgICAgICAgICAnc2ltcGxlVmFsaWRhdGlvbidcbiAgICAgICAgICApO1xuXG4gICAgICAgIGZvcm1seUNvbmZpZy52YWxpZGF0b3JzID0ge1xuICAgICAgICAgIC4uLmZvcm1seUNvbmZpZy52YWxpZGF0b3JzLFxuICAgICAgICAgIGN1c3RvbVBhdHRlcm46IHtcbiAgICAgICAgICAgIGV4cHJlc3Npb246IChjOiBBYnN0cmFjdENvbnRyb2wpID0+IHtcbiAgICAgICAgICAgICAgaWYgKCFjLnZhbHVlKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAocGF0dGVybik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlZ2V4LnRlc3QoYy52YWx1ZSk7XG4gICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1lc3NhZ2U6XG4gICAgICAgICAgICAgIHNpbXBsZVZhbGlkYXRpb25NZXNzYWdlIHx8XG4gICAgICAgICAgICAgICdWYWx1ZSBkb2VzIG5vdCBtYXRjaCB0aGUgcmVxdWlyZWQgcGF0dGVybicsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcblxuICAgICAgICBmb3JtbHlDb25maWcudmFsaWRhdGlvbi5tZXNzYWdlcyA9IHtcbiAgICAgICAgICAuLi5mb3JtbHlDb25maWcudmFsaWRhdGlvbj8ubWVzc2FnZXMsXG4gICAgICAgICAgcGF0dGVybjogc2ltcGxlVmFsaWRhdGlvbk1lc3NhZ2UsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIEFwcGx5IG1heExlbmd0aCB2YWxpZGF0aW9uIGlmIG1heENoYXJhY3RlcnMgaXMgZGVmaW5lZFxuICAgICAgaWYgKGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YT8ubWF4Q2hhcmFjdGVycykge1xuICAgICAgICBmb3JtbHlDb25maWcucHJvcHMubWF4TGVuZ3RoID1cbiAgICAgICAgICBjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE/Lm1heENoYXJhY3RlcnM7XG4gICAgICAgIGZvcm1seUNvbmZpZy52YWxpZGF0aW9uLm1lc3NhZ2VzID0ge1xuICAgICAgICAgIC4uLmZvcm1seUNvbmZpZy52YWxpZGF0aW9uPy5tZXNzYWdlcyxcbiAgICAgICAgICBtYXhMZW5ndGg6IHNpbXBsZVZhbGlkYXRpb25NZXNzYWdlLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE/LmFsbG93T25seUZ1dHVyZSB8fFxuICAgICAgICBjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE/LmFsbG93T25seVBhc3RcbiAgICAgICkge1xuICAgICAgICBmb3JtbHlDb25maWcudHlwZSA9ICdkYXRlcGlja2VyJztcbiAgICAgICAgY29uc3QgY2hlY2tEYXRlVmFsaWRhdGlvbiA9IHtcbiAgICAgICAgICBjaGVja0RhdGU6IHtcbiAgICAgICAgICAgIGV4cHJlc3Npb246IChjOiBBYnN0cmFjdENvbnRyb2wsIGZpZWxkOiBGb3JtbHlGaWVsZENvbmZpZykgPT4ge1xuICAgICAgICAgICAgICBzaW1wbGVWYWxpZGF0aW9uTWVzc2FnZSA9XG4gICAgICAgICAgICAgICAgVXRpbHMuZmluZEVycm9yVHJhbnNsYXRpb25WYWx1ZU9yRGVmYXVsdChcbiAgICAgICAgICAgICAgICAgIGNvbnRyb2wuZXJyb3JzVHJhbnNsYXRpb25zLFxuICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc28sXG4gICAgICAgICAgICAgICAgICAnc2ltcGxlVmFsaWRhdGlvbidcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnREYXRlID0gbmV3IERhdGUoKTtcbiAgICAgICAgICAgICAgY3VycmVudERhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG5cbiAgICAgICAgICAgICAgaWYgKGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YT8uYWxsb3dPbmx5RnV0dXJlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjLnZhbHVlIHx8IGMudmFsdWUgPT09ICcnKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYy52YWx1ZSA+IGN1cnJlbnREYXRlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE/LmFsbG93T25seVBhc3QpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWMudmFsdWUgfHwgYy52YWx1ZSA9PT0gJycpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBjLnZhbHVlIDwgY3VycmVudERhdGU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWVzc2FnZTogKGVycm9yOiBhbnksIGZpZWxkOiBGb3JtbHlGaWVsZENvbmZpZykgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gc2ltcGxlVmFsaWRhdGlvbk1lc3NhZ2U7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGZvcm1seUNvbmZpZy52YWxpZGF0b3JzID0ge1xuICAgICAgICAgIC4uLmZvcm1seUNvbmZpZy52YWxpZGF0b3JzLFxuICAgICAgICAgIC4uLmNoZWNrRGF0ZVZhbGlkYXRpb24sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy9jb250cm9sLnNwZWNpZmljQ29udHJvbERhdGEudHlwZSA9PT0gNCAgaXMgcGhvbmVcbiAgICBpZiAoY29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhPy50eXBlID09PSA0KSB7XG4gICAgICB2YXIgcGhvbmVFcnJvckxhYmVsID0gdGhpcy5mbHV4Py5maW5kKFxuICAgICAgICAoZikgPT4gZj8uY29uZmlnPy5jb21wb25lbnRDb2xsZWN0ZWQgPT09IGNvbnRyb2w/LmlkZW50aWZpZXJcbiAgICAgICk/LmNvbmZpZz8ucGhvbmVFcnJvckxhYmVsO1xuICAgICAgdmFyIHBob25lRXJyb3JMYWJlbFZhbHVlID0gJyc7XG4gICAgICBpZiAocGhvbmVFcnJvckxhYmVsICE9IG51bGwgJiYgQXJyYXkuaXNBcnJheShwaG9uZUVycm9yTGFiZWwpKSB7XG4gICAgICAgIHBob25lRXJyb3JMYWJlbFZhbHVlID1cbiAgICAgICAgICAocGhvbmVFcnJvckxhYmVsIGFzIExhYmVsSW5mb1tdKS5maW5kKFxuICAgICAgICAgICAgKGwpID0+IGwubGFuZ3VhZ2VJc28gPT09IHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICAgICAgKT8udmFsdWUgPz8gJyc7XG4gICAgICB9XG5cbiAgICAgIGZvcm1seUNvbmZpZy52YWxpZGF0b3JzID0ge1xuICAgICAgICBwaG9uZVZhbGlkOiB7XG4gICAgICAgICAgZXhwcmVzc2lvbjogKGNvbnQ6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjb250LnZhbHVlO1xuICAgICAgICAgICAgY29uc3QgcGhvbmVQYXR0ZXJuID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICAgJ14oXFxcXCs0fCk/KDA3WzAtOF17MX1bMC05XXsxfXwwMlswLTldezJ9fDAzWzAtOV17Mn0pezF9PyhcXFxcc3xcXFxcLnwtKT8oWzAtOV17M30oXFxcXHN8XFxcXC58LXwpKXsyfSQnXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHZhbHVlICYmICFwaG9uZVBhdHRlcm4udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgY29udC5zZXRFcnJvcnMoeyBpbnZhbGlkUGhvbmVOdW1iZXI6IHRydWUgfSk7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgbWVzc2FnZTogcGhvbmVFcnJvckxhYmVsVmFsdWUsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE/LnR5cGUgPT09IDIpIHtcbiAgICAgIGNvbnN0IGNoZWNrRGF0ZTJWYWxpZGF0aW9uID0ge1xuICAgICAgICBjaGVja0RhdGUyOiB7XG4gICAgICAgICAgZXhwcmVzc2lvbjogKGM6IEFic3RyYWN0Q29udHJvbCwgZmllbGQ6IEZvcm1seUZpZWxkQ29uZmlnKSA9PiB7XG4gICAgICAgICAgICB2YXIgZGF0ZVZhbHVlID0gYy52YWx1ZTtcbiAgICAgICAgICAgIGlmICghZGF0ZVZhbHVlICYmIGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YT8uaXNNYW5kYXRvcnkpIHtcbiAgICAgICAgICAgICAgc2ltcGxlVmFsaWRhdGlvbk1lc3NhZ2UgPVxuICAgICAgICAgICAgICAgIFV0aWxzLmZpbmRFcnJvclRyYW5zbGF0aW9uVmFsdWVPckRlZmF1bHQoXG4gICAgICAgICAgICAgICAgICBjb250cm9sLmVycm9yc1RyYW5zbGF0aW9ucyxcbiAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvLFxuICAgICAgICAgICAgICAgICAgJ2lzTWFuZGF0b3J5VmFsaWRhdGlvbidcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGlzTmFOKERhdGUucGFyc2UoZGF0ZVZhbHVlKSkgJiZcbiAgICAgICAgICAgICAgY29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhPy5pc01hbmRhdG9yeVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgbWVzc2FnZTogKGVycm9yOiBhbnksIGZpZWxkOiBGb3JtbHlGaWVsZENvbmZpZykgPT4ge1xuICAgICAgICAgICAgaWYgKHNpbXBsZVZhbGlkYXRpb25NZXNzYWdlID09PSAnJylcbiAgICAgICAgICAgICAgcmV0dXJuICdQbGVhc2UgZW50ZXIgYSB2YWxpZCBkYXRlJztcblxuICAgICAgICAgICAgcmV0dXJuIHNpbXBsZVZhbGlkYXRpb25NZXNzYWdlO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgZm9ybWx5Q29uZmlnLnZhbGlkYXRvcnMgPSB7XG4gICAgICAgIC4uLmZvcm1seUNvbmZpZy52YWxpZGF0b3JzLFxuICAgICAgICAuLi5jaGVja0RhdGUyVmFsaWRhdGlvbixcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIGZvcm1seUNvbmZpZztcbiAgfVxuXG4gIGFzeW5jIGJ1aWxkUHJlc2VudGF0aW9uRm9ybUZpZWxkQXN5bmMoXG4gICAgc3RlcDogU3RlcERhdGEgfCB1bmRlZmluZWQsXG4gICAgY29udHJvbDogUHJlc2VudGF0aW9uQ29udHJvbFxuICApOiBQcm9taXNlPEZvcm1seUZpZWxkQ29uZmlnPiB7XG4gICAgbGV0IGZvcm1seUNvbmZpZzogRm9ybWx5RmllbGRDb25maWcgPSB7IHByb3BzOiB7fSB9O1xuXG4gICAgZm9ybWx5Q29uZmlnLnR5cGUgPSAnZm9ybWx5LXBhcmFncmFwaCc7XG4gICAgZm9ybWx5Q29uZmlnLmNsYXNzTmFtZSA9ICdjb21wb25lbnQtdGV4dC1maWVsZCc7XG4gICAgZm9ybWx5Q29uZmlnLnByb3BzIVsnZGVzaWduJ10gPSB0aGlzLmFwcE1vZGVsLmdlbmVyYXRlZENzcztcblxuICAgIHZhciB0cmFuc2xhdGVkVGl0bGUgPVxuICAgICAgY29udHJvbC50cmFuc2xhdGlvbnMuZmluZCgoZCkgPT4gZC5sYW5ndWFnZUlzbyA9PSB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzbylcbiAgICAgICAgPy52YWx1ZSA/P1xuICAgICAgY29udHJvbC50aXRsZSA/P1xuICAgICAgJyc7XG5cbiAgICBpZiAoY29udHJvbC50eXBlID09IFByZXNlbnRhdGlvbkNvbnRyb2xUeXBlLlBhcmFncmFwaCkge1xuICAgICAgY29uc3QgcGFyYWdyYXBoQ29udHJvbCA9IGNvbnRyb2wgYXMgUHJlc2VudGF0aW9uUGFyYWdyYXBoQ29udHJvbDtcblxuICAgICAgdmFyIHRyYW5zbGF0ZWREZXNjcmlwdGlvbiA9XG4gICAgICAgIHBhcmFncmFwaENvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YS5kZXNjcmlwdGlvblRyYW5zbGF0aW9ucy5maW5kKFxuICAgICAgICAgIChkOiBhbnkpID0+IGQubGFuZ3VhZ2VJc28gPT0gdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICAgKT8udmFsdWUgPz8gJyc7XG4gICAgICB2YXIgdHJhbnNsYXRlZFBhcmFncmFwaFRpdGxlID1cbiAgICAgICAgcGFyYWdyYXBoQ29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhLnRleHQuZmluZChcbiAgICAgICAgICAoZDogYW55KSA9PiBkLmxhbmd1YWdlSXNvID09IHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICAgICk/LnZhbHVlID8/ICcnO1xuXG4gICAgICBmb3JtbHlDb25maWcuZGVmYXVsdFZhbHVlID0gdHJhbnNsYXRlZERlc2NyaXB0aW9uO1xuICAgICAgZm9ybWx5Q29uZmlnLnByb3BzIVsndHJhbnNsYXRlZERlc2NyaXB0aW9uJ10gPSB0cmFuc2xhdGVkRGVzY3JpcHRpb247XG4gICAgICBmb3JtbHlDb25maWcucHJvcHMhWyd0cmFuc2xhdGVkUGFyYWdyYXBoVGl0bGUnXSA9XG4gICAgICAgIHRyYW5zbGF0ZWRQYXJhZ3JhcGhUaXRsZTtcbiAgICAgIGZvcm1seUNvbmZpZy50eXBlID0gJ2Zvcm1seS1wYXJhZ3JhcGgnO1xuICAgICAgZm9ybWx5Q29uZmlnLmNsYXNzTmFtZSA9ICdjb21wb25lbnQtdGV4dC1maWVsZCc7XG4gICAgfSBlbHNlIGlmIChjb250cm9sLnR5cGUgPT0gUHJlc2VudGF0aW9uQ29udHJvbFR5cGUuRG93bmxvYWQpIHtcbiAgICAgIGZvcm1seUNvbmZpZyA9IHRoaXMuQ3JlYXRlRG93bmxvYWREb2NzRmllbGRDb25maWcoY29udHJvbCk7XG4gICAgfSBlbHNlIGlmIChjb250cm9sLnR5cGUgPT0gUHJlc2VudGF0aW9uQ29udHJvbFR5cGUuVmlldykge1xuICAgICAgZm9ybWx5Q29uZmlnID0gdGhpcy5DcmVhdGVWaWV3RG9jc0ZpZWxkQ29uZmlnKGNvbnRyb2wpO1xuICAgIH0gZWxzZSBpZiAoY29udHJvbC50eXBlID09IFByZXNlbnRhdGlvbkNvbnRyb2xUeXBlLlN0YXR1cykge1xuICAgICAgbGV0IHN0YXR1c05hbWUgPVxuICAgICAgICB0aGlzLmFwcE1vZGVsLnN0YXR1c2VzLmZpbmQoXG4gICAgICAgICAgKHMpID0+IHMuaWQgPT09IHRoaXMuZmlsbERhdGE/Lm1ldGFkYXRhLnN0YXR1c0lkXG4gICAgICAgICk/Lm5hbWUgfHwgJ25vIHN0YXR1cyBuYW1lJztcblxuICAgICAgZm9ybWx5Q29uZmlnLmRlZmF1bHRWYWx1ZSA9IHN0YXR1c05hbWU7XG4gICAgICBmb3JtbHlDb25maWcudHlwZSA9ICdmb3JtbHktcGFyYWdyYXBoJztcbiAgICAgIGZvcm1seUNvbmZpZy5jbGFzc05hbWUgPSAnY29tcG9uZW50LXRleHQtZmllbGQnO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoXG4gICAgICAgIGNvbnRyb2wudHlwZSA9PSBQcmVzZW50YXRpb25Db250cm9sVHlwZS5GbHV4Q29tcG9uZW50ICYmXG4gICAgICAgIHRoaXMuY29udHJvbElkc1dpdGhWYWx1ZXMgJiZcbiAgICAgICAgY29udHJvbC5jb2xsZWN0aW9uQ29udHJvbElkZW50aWZpZXJcbiAgICAgICkge1xuICAgICAgICBjb25zdCBmaWxsVmFsdWUgPVxuICAgICAgICAgIHRoaXMuY29udHJvbElkc1dpdGhWYWx1ZXNbY29udHJvbC5jb2xsZWN0aW9uQ29udHJvbElkZW50aWZpZXJdO1xuICAgICAgICBpZiAoZmlsbFZhbHVlKSB7XG4gICAgICAgICAgc3dpdGNoICh0eXBlb2YgZmlsbFZhbHVlKSB7XG4gICAgICAgICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgICAgICAgZm9ybWx5Q29uZmlnLmRlZmF1bHRWYWx1ZSA9IGZpbGxWYWx1ZSA/ICcmY2hlY2s7JyA6ICcmY3Jvc3M7JztcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIGlmIChmaWxsVmFsdWU/Lm5hbWUpIHtcbiAgICAgICAgICAgICAgICBmb3JtbHlDb25maWcuZGVmYXVsdFZhbHVlID0gZmlsbFZhbHVlLm5hbWU7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9ybWx5Q29uZmlnLmRlZmF1bHRWYWx1ZSA9IGZpbGxWYWx1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3JtbHlDb25maWcuaWQgPSBjb250cm9sLmlkZW50aWZpZXI7XG4gICAgZm9ybWx5Q29uZmlnLnByb3BzIVsnaXNEaXNwbGF5TW9kZSddID0gdHJ1ZTtcbiAgICBmb3JtbHlDb25maWcucHJvcHMhWydjb2xsZWN0aW9uQ29udHJvbElkZW50aWZpZXInXSA9XG4gICAgICBjb250cm9sLmNvbGxlY3Rpb25Db250cm9sSWRlbnRpZmllcjtcbiAgICBmb3JtbHlDb25maWcucHJvcHMhWydsYWJlbCddID0gdHJhbnNsYXRlZFRpdGxlO1xuICAgIGZvcm1seUNvbmZpZy5wcm9wcyFbJ2xhbmdJc28nXSA9IHRoaXMuY3VycmVudExhbmd1YWdlSXNvO1xuXG4gICAgdGhpcy5mb3JtbHlQcmVzZW50YXRpb25GaWVsZHMucHVzaChmb3JtbHlDb25maWcpO1xuXG4gICAgcmV0dXJuIGZvcm1seUNvbmZpZztcbiAgfVxuXG4gIGFzeW5jIGJ1aWxkQXBpTWV0aG9kRm9ybUZpZWxkQXN5bmMoXG4gICAgc3RlcDogU3RlcERhdGEgfCB1bmRlZmluZWQsXG4gICAgY29udHJvbDogUHJlc2VudGF0aW9uQ29udHJvbFxuICApOiBQcm9taXNlPEZvcm1seUZpZWxkQ29uZmlnPiB7XG4gICAgbGV0IGZvcm1seUNvbmZpZzogRm9ybWx5RmllbGRDb25maWcgPSB7IHByb3BzOiB7fSB9O1xuXG4gICAgZm9ybWx5Q29uZmlnLnR5cGUgPSAnZm9ybWx5LXBhcmFncmFwaCc7XG4gICAgZm9ybWx5Q29uZmlnLmNsYXNzTmFtZSA9ICdjb21wb25lbnQtdGV4dC1maWVsZCc7XG4gICAgZm9ybWx5Q29uZmlnLnByb3BzIVsnZGVzaWduJ10gPSB0aGlzLmFwcE1vZGVsLmdlbmVyYXRlZENzcztcblxuICAgIHZhciB0cmFuc2xhdGVkVGl0bGUgPVxuICAgICAgY29udHJvbC50cmFuc2xhdGlvbnMuZmluZCgoZCkgPT4gZC5sYW5ndWFnZUlzbyA9PSB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzbylcbiAgICAgICAgPy52YWx1ZSA/P1xuICAgICAgY29udHJvbC50aXRsZSA/P1xuICAgICAgJyc7XG5cbiAgICBmb3JtbHlDb25maWcuaWQgPSBjb250cm9sLmlkZW50aWZpZXI7XG4gICAgZm9ybWx5Q29uZmlnLnByb3BzIVsnaXNEaXNwbGF5TW9kZSddID0gdHJ1ZTtcbiAgICBmb3JtbHlDb25maWcucHJvcHMhWydhcGlNZXRob2RJZCddID0gY29udHJvbC5hcGlNZXRob2RJZDtcbiAgICBmb3JtbHlDb25maWcucHJvcHMhWydhcGlNZXRob2RGaWVsZElkJ10gPSBjb250cm9sLmFwaU1ldGhvZEZpZWxkSWQ7XG4gICAgZm9ybWx5Q29uZmlnLnByb3BzIVsnbGFiZWwnXSA9IHRyYW5zbGF0ZWRUaXRsZTtcblxuICAgIGlmIChjb250cm9sLmFwaU1ldGhvZEZpZWxkSWQpIHtcbiAgICAgIGNvbnN0IHZhbCA9IHRoaXMuZmluZEluQXBpQ2FsbHNSZXNwb25zZXMoY29udHJvbC5hcGlNZXRob2RGaWVsZElkKTtcbiAgICAgIGZvcm1seUNvbmZpZy5kZWZhdWx0VmFsdWUgPSB2YWw7XG4gICAgfVxuXG4gICAgdGhpcy5mb3JtbHlQcmVzZW50YXRpb25GaWVsZHMucHVzaChmb3JtbHlDb25maWcpO1xuXG4gICAgcmV0dXJuIGZvcm1seUNvbmZpZztcbiAgfVxuXG4gIHByaXZhdGUgYXR0YWNoVG9EZXBlbmRlbnREaWN0aW9uYXJ5SWZOZWNlc3NhcnkoXG4gICAgZGVwZW5kZW50RGljdGlvbmFyeTogRGVwZW5kZW50RGljdGlvbmFyeURhdGEsXG4gICAgZm9ybWx5Q29uZmlnOiBGb3JtbHlGaWVsZENvbmZpZ1xuICApIHtcbiAgICAvLyBIYW5kbGUgZGljdGlvbmFyeSBkZXBlbmRlbmNpZXNcbiAgICBpZiAoXG4gICAgICBkZXBlbmRlbnREaWN0aW9uYXJ5ICYmXG4gICAgICBkZXBlbmRlbnREaWN0aW9uYXJ5LmRpY3Rpb25hcnlDb250cm9sSWRlbnRpZmllclxuICAgICkge1xuICAgICAgY29uc3QgcGFyZW50S2V5ID0gZGVwZW5kZW50RGljdGlvbmFyeS5kaWN0aW9uYXJ5Q29udHJvbElkZW50aWZpZXI7XG4gICAgICBjb25zdCBkZXBlbmRlbnRWYWx1ZUlkcyA9IGRlcGVuZGVudERpY3Rpb25hcnkuZGVwZW5kZW50VmFsdWVJZHMgfHwgW107XG5cbiAgICAgIGZvcm1seUNvbmZpZy5leHByZXNzaW9ucyA9IHtcbiAgICAgICAgaGlkZTogKGZpZWxkOiBGb3JtbHlGaWVsZENvbmZpZykgPT4ge1xuICAgICAgICAgIGNvbnN0IHNob3VsZFNob3cgPSB0aGlzLnNob3VsZFNob3dEZXBlbmRlbnRGaWVsZChcbiAgICAgICAgICAgIHBhcmVudEtleSxcbiAgICAgICAgICAgIGRlcGVuZGVudFZhbHVlSWRzLFxuICAgICAgICAgICAgdGhpcy5tb2RlbFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuICFzaG91bGRTaG93O1xuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGF0dGFjaFRvVmFsdWVDaGFuZ2VzKGNvbnRyb2xJZDogc3RyaW5nLCBvcHRpb25zOiBGb3JtbHlGaWVsZENvbmZpZykge1xuICAgIG9wdGlvbnMucHJvcHMhWydvblNlbGVjdGVkVmFsdWVDaGFuZ2VkJ10gPSBhc3luYyAodmFsOiBhbnkpID0+IHtcbiAgICAgIHRoaXMubW9kZWxbY29udHJvbElkXSA9IHZhbDtcbiAgICAgIHZhciByZWZlcmVuY2VEaWN0aW9uYXJpZXMgPSBBcnJheS5mcm9tKFxuICAgICAgICB0aGlzLmRpY3Rpb25hcnlNYXAudmFsdWVzKClcbiAgICAgICkuZmlsdGVyKChkKSA9PiBkLnJlZmVyZW5jZUlkID09IHZhbC5kaWN0aW9uYXJ5SWQpO1xuICAgICAgaWYgKHJlZmVyZW5jZURpY3Rpb25hcmllcz8ubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLnJlbW92ZVJlZmVyZW5jZUZpZWxkcyhvcHRpb25zKTtcblxuICAgICAgICB2YXIgcmVmZXJlbmNlRGljdGlvbmFyaWVzV2l0aEZpbHRlcmVkVmFsdWVzID1cbiAgICAgICAgICB0aGlzLmNyZWF0ZVJlZmVyZW5jZURpY3Rpb25hcmllc0Zyb21TZWxlY3RlZFZhbHVlKFxuICAgICAgICAgICAgcmVmZXJlbmNlRGljdGlvbmFyaWVzLFxuICAgICAgICAgICAgdmFsXG4gICAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcGFyZW50U3BlY2lmaWNEYXRhID0gb3B0aW9ucy5wcm9wcz8uW1xuICAgICAgICAgICdzcGVjaWZpY0RhdGEnXG4gICAgICAgIF0gYXMgRGljdGlvbmFyeUNvbnRyb2xEYXRhO1xuICAgICAgICBhd2FpdCB0aGlzLmFkZFJlZmVyZW5jZURpY3Rpb25hcnlGaWVsZHNJZk5lY2Vzc2FyeShcbiAgICAgICAgICByZWZlcmVuY2VEaWN0aW9uYXJpZXNXaXRoRmlsdGVyZWRWYWx1ZXMsXG4gICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICBvcHRpb25zLnR5cGUsXG4gICAgICAgICAgcGFyZW50U3BlY2lmaWNEYXRhPy5yZWxhdGVkRGljdGlvbmFyaWVzVHJhbnNsYXRpb25zIHx8IFtdXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlbW92ZVJlZmVyZW5jZUZpZWxkcyhvcHRpb25zKTtcbiAgICAgIH1cbiAgICAgIHRoaXMudXBkYXRlRm9ybWx5Q29uZmlnKCk7XG4gICAgfTtcbiAgfVxuXG4gIGNyZWF0ZVJlZmVyZW5jZURpY3Rpb25hcmllc0Zyb21TZWxlY3RlZFZhbHVlKFxuICAgIGFsbERpY3Rpb25hcmllczogRGljdGlvbmFyeUR0b1tdLFxuICAgIHNlbGVjdGVkVmFsdWU6IGFueVxuICApOiBEaWN0aW9uYXJ5RHRvW10ge1xuICAgIGNvbnN0IG5ld0RpY3Rpb25hcmllczogRGljdGlvbmFyeUR0b1tdID0gW107XG5cbiAgICBhbGxEaWN0aW9uYXJpZXMuZm9yRWFjaCgoZGljdGlvbmFyeSkgPT4ge1xuICAgICAgY29uc3QgZmlsdGVyZWRWYWx1ZXMgPVxuICAgICAgICBkaWN0aW9uYXJ5LnZhbHVlcz8uZmlsdGVyKCh2YWx1ZSkgPT5cbiAgICAgICAgICB2YWx1ZS5yZWZlcmVuY2VWYWx1ZXMuc29tZShcbiAgICAgICAgICAgIChyZWZWYWx1ZSkgPT4gcmVmVmFsdWUuaWQgPT09IHNlbGVjdGVkVmFsdWUuaWRcbiAgICAgICAgICApXG4gICAgICAgICkgfHwgW107XG5cbiAgICAgIGlmIChmaWx0ZXJlZFZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IG5ld0RpY3Rpb25hcnk6IERpY3Rpb25hcnlEdG8gPSB7XG4gICAgICAgICAgLi4uZGljdGlvbmFyeSxcbiAgICAgICAgICB2YWx1ZXM6IGZpbHRlcmVkVmFsdWVzLFxuICAgICAgICB9O1xuXG4gICAgICAgIG5ld0RpY3Rpb25hcmllcy5wdXNoKG5ld0RpY3Rpb25hcnkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ld0RpY3Rpb25hcmllcztcbiAgfVxuXG4gIHNob3VsZFNob3dEZXBlbmRlbnRGaWVsZChcbiAgICBwYXJlbnRLZXk6IHN0cmluZyxcbiAgICBkZXBlbmRlbnRWYWx1ZUlkczogbnVtYmVyW10sXG4gICAgbW9kZWw6IGFueSA9IHt9XG4gICk6IGJvb2xlYW4ge1xuICAgIC8vIFJldHJpZXZlIHRoZSB2YWx1ZSBvZiB0aGUgcGFyZW50IGRpY3Rpb25hcnkgY29udHJvbFxuICAgIGNvbnN0IHBhcmVudFZhbHVlID0gdGhpcy5nZXROZXN0ZWRWYWx1ZShcbiAgICAgIG1vZGVsLFxuICAgICAgcGFyZW50S2V5XG4gICAgKSBhcyBEaWN0aW9uYXJ5VmFsdWU7XG5cbiAgICBjb25zdCBpZFZhbHVlID0gcGFyZW50VmFsdWU/LmlkXG4gICAgICA/IHBhcmVudFZhbHVlLmlkXG4gICAgICA6IChwYXJlbnRWYWx1ZSBhcyB1bmtub3duIGFzIG51bWJlcik7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBhcmVudCB2YWx1ZSBpcyBpbiB0aGUgZGVwZW5kZW50VmFsdWVJZHNcbiAgICBpZiAocGFyZW50VmFsdWUgJiYgZGVwZW5kZW50VmFsdWVJZHMuaW5jbHVkZXMoaWRWYWx1ZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBnZXROZXN0ZWRWYWx1ZShvYmo6IGFueSwgcGF0aDogc3RyaW5nKTogYW55IHtcbiAgICBjb25zdCBrZXlzID0gcGF0aC5zcGxpdCgnLicpO1xuICAgIGxldCB2YWx1ZSA9IG9iajtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlW2tleV07XG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBzdWJtaXQoKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coJ0Zvcm0gRGF0YTonLCB0aGlzLmZvcm0udmFsdWUpO1xuICAgIGlmICh0aGlzLmZvcm0uaW52YWxpZCkge1xuICAgICAgY29uc29sZS5sb2coJ0Zvcm0gZGF0YSBoYXMgdmFsaWRhdGlvbiBlcnJvcnMuJyk7XG4gICAgICB0aGlzLnNjcm9sbFRvRXJyb3JTZXJ2aWNlLnNjcm9sbFRvRmlyc3RFcnJvcih0aGlzLmZvcm0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaWMgbWV0aG9kIHRvIHRyaWdnZXIgc2Nyb2xsIHRvIGZpcnN0IGVycm9yIC0gY2FuIGJlIGNhbGxlZCBmcm9tIG90aGVyIGNvbXBvbmVudHNcbiAgICovXG4gIHB1YmxpYyBzY3JvbGxUb0ZpcnN0VmFsaWRhdGlvbkVycm9yKCk6IHZvaWQge1xuICAgIHRoaXMuc2Nyb2xsVG9FcnJvclNlcnZpY2Uuc2Nyb2xsVG9GaXJzdEVycm9yKHRoaXMuZm9ybSk7XG4gIH1cblxuICAvKipcbiAgICogUHVibGljIG1ldGhvZCB0byBzY3JvbGwgdG8gYSBzcGVjaWZpYyBmaWVsZCBieSBuYW1lXG4gICAqL1xuICBwdWJsaWMgc2Nyb2xsVG9GaWVsZChmaWVsZE5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2Nyb2xsVG9FcnJvclNlcnZpY2Uuc2Nyb2xsVG9GaWVsZChmaWVsZE5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlYnVnIG1ldGhvZCB0byBoZWxwIHRyb3VibGVzaG9vdCBzY3JvbGwgaXNzdWVzXG4gICAqL1xuICBwdWJsaWMgZGVidWdGb3JtRWxlbWVudHMoKTogdm9pZCB7XG4gICAgdGhpcy5zY3JvbGxUb0Vycm9yU2VydmljZS5kZWJ1Z0xvZ0Zvcm1FbGVtZW50cygpO1xuICB9XG5cbiAgYXN5bmMgY29uc3RydWN0RGljdGlvbmFyeShcbiAgICBjb250cm9sOiBDb250cm9sRGF0YSxcbiAgICBvcHRpb25zOiBGb3JtbHlGaWVsZENvbmZpZ1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzcGVjaWZpY0RhdGEgPSBjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE7XG4gICAgb3B0aW9ucy50eXBlID1cbiAgICAgIHNwZWNpZmljRGF0YS5zaG93QXNSYWRpb0J1dHRvbnNMaXN0ID09PSB0cnVlXG4gICAgICAgID8gYGZvcm1seS1yYWRpb2BcbiAgICAgICAgOiBgZm9ybWx5LWRpY3Rpb25hcnktZHJvcGRvd24tdHJlZWA7XG5cbiAgICBvcHRpb25zLnByb3BzIVsnc3BlY2lmaWNEYXRhJ10gPSBzcGVjaWZpY0RhdGE7XG5cbiAgICBjb25zdCBkaWN0aW9uYXJ5VXVpZCA9IHNwZWNpZmljRGF0YS5kaWN0aW9uYXJ5VVVJRDtcblxuICAgIGlmIChkaWN0aW9uYXJ5VXVpZCkge1xuICAgICAgY29uc3QgZGljdGlvbmFyeSA9IHRoaXMuZGljdGlvbmFyeU1hcC5nZXQoZGljdGlvbmFyeVV1aWQpO1xuICAgICAgaWYgKGRpY3Rpb25hcnkpIHtcbiAgICAgICAgaWYgKGRpY3Rpb25hcnkucmVmZXJlbmNlSWQpIHtcbiAgICAgICAgICBvcHRpb25zLnByb3BzIVsnZGljdGlvbmFyeUlkJ10gPSBkaWN0aW9uYXJ5VXVpZDtcbiAgICAgICAgICB0aGlzLmNvbnN0cnVjdERpY3Rpb25hcnlXaXRoUmVmZXJlbmNlcyhcbiAgICAgICAgICAgIGRpY3Rpb25hcnksXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgc3BlY2lmaWNEYXRhXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLmF0dGFjaFRvVmFsdWVDaGFuZ2VzKGNvbnRyb2wuaWRlbnRpZmllciwgb3B0aW9ucyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3B0aW9ucy50eXBlID1cbiAgICAgICAgICAgIHNwZWNpZmljRGF0YS5zaG93QXNSYWRpb0J1dHRvbnNMaXN0ID09PSB0cnVlXG4gICAgICAgICAgICAgID8gJ2Zvcm1seS1yYWRpbydcbiAgICAgICAgICAgICAgOiAnZm9ybWx5LWRpY3Rpb25hcnktZHJvcGRvd24tdHJlZSc7XG4gICAgICAgICAgb3B0aW9ucy5wcm9wcyFbJ2RpY3Rpb25hcnlJZCddID0gZGljdGlvbmFyeVV1aWQ7XG4gICAgICAgICAgdGhpcy5jb25zdHJ1Y3REaWN0aW9uYXJ5V2l0aFJlZmVyZW5jZXMoXG4gICAgICAgICAgICBkaWN0aW9uYXJ5LFxuICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgIHNwZWNpZmljRGF0YVxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5hdHRhY2hUb1ZhbHVlQ2hhbmdlcyhjb250cm9sLmlkZW50aWZpZXIsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oYERpY3Rpb25hcnkgbm90IGZvdW5kIGZvciBVVUlEICR7ZGljdGlvbmFyeVV1aWR9YCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFVVSUQgbm90IGZvdW5kIGZvciBkaWN0aW9uYXJ5IElEICR7c3BlY2lmaWNEYXRhLmRpY3Rpb25hcnlJZH1gXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZmluZERpY3Rpb25hcnlWYWx1ZU9iamVjdChcbiAgICBkaWN0aW9uYXJ5OiBEaWN0aW9uYXJ5RHRvIHwgdW5kZWZpbmVkLFxuICAgIHZhbHVlOiBhbnlcbiAgKTogRGljdGlvbmFyeVZhbHVlRHRvIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoXG4gICAgICAhZGljdGlvbmFyeSB8fFxuICAgICAgIWRpY3Rpb25hcnkudmFsdWVzIHx8XG4gICAgICB2YWx1ZSA9PT0gbnVsbCB8fFxuICAgICAgdmFsdWUgPT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWU/LmlkICE9IG51bGwpIHtcbiAgICAgIHJldHVybiBkaWN0aW9uYXJ5LnZhbHVlcy5maW5kKCh2KSA9PiB2LmlkID09PSB2YWx1ZS5pZCk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IHZhbHVlSWQgPSBOdW1iZXIodmFsdWUpO1xuICAgICAgaWYgKCFpc05hTih2YWx1ZUlkKSkge1xuICAgICAgICByZXR1cm4gZGljdGlvbmFyeS52YWx1ZXMuZmluZCgodikgPT4gdi5pZCA9PT0gdmFsdWVJZCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGluaXRpYWxpemVSZWZlcmVuY2VGaWVsZHMoXG4gICAgZmllbGRzOiBGb3JtbHlGaWVsZENvbmZpZ1tdLFxuICAgIHJvb3RDb25maWc6IEZvcm1seUZpZWxkQ29uZmlnW10gPSB0aGlzLmZvcm1seUNvbmZpZ1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIWZpZWxkcykgcmV0dXJuO1xuICAgIGNvbnN0IGZpZWxkc1RvUHJvY2VzcyA9IFsuLi5maWVsZHNdO1xuXG4gICAgZm9yIChjb25zdCBmaWVsZCBvZiBmaWVsZHNUb1Byb2Nlc3MpIHtcbiAgICAgIGNvbnN0IGZpZWxkS2V5ID0gZmllbGQua2V5IGFzIHN0cmluZztcbiAgICAgIGlmIChcbiAgICAgICAgZmllbGRLZXkgJiZcbiAgICAgICAgZmllbGQucHJvcHM/LlsnZGljdGlvbmFyeUlkJ10gJiZcbiAgICAgICAgZmllbGQucHJvcHM/Llsnc3BlY2lmaWNEYXRhJ11cbiAgICAgICkge1xuICAgICAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtLmdldChmaWVsZEtleSk7XG4gICAgICAgIGNvbnN0IHNwZWNpZmljRGF0YSA9IGZpZWxkLnByb3BzW1xuICAgICAgICAgICdzcGVjaWZpY0RhdGEnXG4gICAgICAgIF0gYXMgRGljdGlvbmFyeUNvbnRyb2xEYXRhO1xuICAgICAgICBjb25zdCBkaWN0aW9uYXJ5VXVpZCA9IGZpZWxkLnByb3BzWydkaWN0aW9uYXJ5SWQnXSBhcyBzdHJpbmc7XG4gICAgICAgIGNvbnN0IG1haW5EaWN0aW9uYXJ5ID0gdGhpcy5kaWN0aW9uYXJ5TWFwLmdldChkaWN0aW9uYXJ5VXVpZCk7XG5cbiAgICAgICAgbGV0IHZhbHVlVG9Vc2U6IGFueSA9IG51bGw7XG5cbiAgICAgICAgaWYgKGNvbnRyb2wgJiYgY29udHJvbC52YWx1ZSAhPT0gbnVsbCAmJiBjb250cm9sLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB2YWx1ZVRvVXNlID0gY29udHJvbC52YWx1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICBmaWVsZC5kZWZhdWx0VmFsdWUgIT09IG51bGwgJiZcbiAgICAgICAgICBmaWVsZC5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZFxuICAgICAgICApIHtcbiAgICAgICAgICB2YWx1ZVRvVXNlID0gZmllbGQuZGVmYXVsdFZhbHVlO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIHRoaXMubW9kZWwgJiZcbiAgICAgICAgICB0aGlzLm1vZGVsW2ZpZWxkS2V5XSAhPT0gbnVsbCAmJlxuICAgICAgICAgIHRoaXMubW9kZWxbZmllbGRLZXldICE9PSB1bmRlZmluZWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdmFsdWVUb1VzZSA9IHRoaXMubW9kZWxbZmllbGRLZXldO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHNlbGVjdGVkVmFsdWVPYmplY3Q6IERpY3Rpb25hcnlWYWx1ZUR0byB8IHVuZGVmaW5lZCB8IG51bGwgPSBudWxsO1xuICAgICAgICBpZiAodmFsdWVUb1VzZSAhPT0gbnVsbCAmJiBtYWluRGljdGlvbmFyeT8uaWQgIT0gbnVsbCkge1xuICAgICAgICAgIHNlbGVjdGVkVmFsdWVPYmplY3QgPSB0aGlzLmZpbmREaWN0aW9uYXJ5VmFsdWVPYmplY3QoXG4gICAgICAgICAgICBtYWluRGljdGlvbmFyeSxcbiAgICAgICAgICAgIHZhbHVlVG9Vc2VcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmllbGRDb25maWdJblRyZWUgPSB0aGlzLmZpbmRGaWVsZEJ5S2V5KHJvb3RDb25maWcsIGZpZWxkS2V5KTtcbiAgICAgICAgaWYgKCFmaWVsZENvbmZpZ0luVHJlZSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZW1vdmVSZWZlcmVuY2VGaWVsZHMoZmllbGRDb25maWdJblRyZWUpO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBzZWxlY3RlZFZhbHVlT2JqZWN0ICYmXG4gICAgICAgICAgc2VsZWN0ZWRWYWx1ZU9iamVjdC5pZCAhPSBudWxsICYmXG4gICAgICAgICAgbWFpbkRpY3Rpb25hcnk/LmlkICE9IG51bGxcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgcG90ZW50aWFsUmVmZXJlbmNlRGljdGlvbmFyaWVzID0gQXJyYXkuZnJvbShcbiAgICAgICAgICAgIHRoaXMuZGljdGlvbmFyeU1hcC52YWx1ZXMoKVxuICAgICAgICAgICkuZmlsdGVyKChkaWN0KSA9PiBkaWN0LnJlZmVyZW5jZUlkID09PSBtYWluRGljdGlvbmFyeS5pZCk7XG5cbiAgICAgICAgICBpZiAocG90ZW50aWFsUmVmZXJlbmNlRGljdGlvbmFyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHJlZmVyZW5jZURpY3Rpb25hcmllc1RvU2hvdyA9XG4gICAgICAgICAgICAgIHRoaXMuY3JlYXRlUmVmZXJlbmNlRGljdGlvbmFyaWVzRnJvbVNlbGVjdGVkVmFsdWUoXG4gICAgICAgICAgICAgICAgcG90ZW50aWFsUmVmZXJlbmNlRGljdGlvbmFyaWVzLFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkVmFsdWVPYmplY3RcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKHJlZmVyZW5jZURpY3Rpb25hcmllc1RvU2hvdy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRkUmVmZXJlbmNlRGljdGlvbmFyeUZpZWxkc0lmTmVjZXNzYXJ5KFxuICAgICAgICAgICAgICAgIHJlZmVyZW5jZURpY3Rpb25hcmllc1RvU2hvdyxcbiAgICAgICAgICAgICAgICBmaWVsZENvbmZpZ0luVHJlZSxcbiAgICAgICAgICAgICAgICBmaWVsZENvbmZpZ0luVHJlZS50eXBlLFxuICAgICAgICAgICAgICAgIHNwZWNpZmljRGF0YT8ucmVsYXRlZERpY3Rpb25hcmllc1RyYW5zbGF0aW9ucyB8fCBbXVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZmllbGQuZmllbGRHcm91cCAmJiBmaWVsZC5maWVsZEdyb3VwLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0aWFsaXplUmVmZXJlbmNlRmllbGRzKGZpZWxkLmZpZWxkR3JvdXAsIHJvb3RDb25maWcpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoXG4gICAgICBmaWVsZHMgPT09IHRoaXMuZm9ybWx5Q29uZmlnIHx8XG4gICAgICBmaWVsZHMgPT09IHRoaXMuZm9ybWx5Q29uZmlnWzBdPy5maWVsZEdyb3VwXG4gICAgKSB7XG4gICAgICB0aGlzLnVwZGF0ZUZvcm1seUNvbmZpZygpO1xuICAgICAgdGhpcy5mb3JtbHlDb25maWdVcGRhdGVkLmVtaXQoKTtcbiAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdERpY3Rpb25hcnlXaXRoUmVmZXJlbmNlcyhcbiAgICBkaWN0aW9uYXJ5OiBEaWN0aW9uYXJ5RHRvLFxuICAgIG9wdGlvbnM6IEZvcm1seUZpZWxkQ29uZmlnLFxuICAgIGRpY3Rpb25hcnlDb250cm9sRGF0YTogRGljdGlvbmFyeUNvbnRyb2xEYXRhXG4gICkge1xuICAgIGlmIChvcHRpb25zLnByb3BzKSB7XG4gICAgICB2YXIgY3VycmVudExhbmd1YWdlSWQgPSBVdGlscy5maW5kTGFuZ3VhZ2VJZEJ5SXNvKFxuICAgICAgICB0aGlzLmF2YWlsYWJsZUxhbmd1YWdlcyxcbiAgICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICk7XG5cbiAgICAgIC8vIFBhc3MgcHJlbG9hZGVkIGRpY3Rpb25hcnkgZGF0YSB0byBmb3JtbHkgY29tcG9uZW50XG4gICAgICBvcHRpb25zLnByb3BzWydkaWN0aW9uYXJ5RGF0YSddID0gZGljdGlvbmFyeTtcbiAgICAgIG9wdGlvbnMucHJvcHNbJ2xhbmd1YWdlcyddID0gdGhpcy5hdmFpbGFibGVMYW5ndWFnZXM7XG4gICAgICBvcHRpb25zLnByb3BzWydwcmVsb2FkZWREaWN0aW9uYXJpZXMnXSA9IHRoaXMuZGljdGlvbmFyeU1hcDtcbiAgICAgIG9wdGlvbnMucHJvcHNbJ3VzZVByZWxvYWRlZERhdGEnXSA9IHRydWU7XG5cbiAgICAgIG9wdGlvbnMucHJvcHMub3B0aW9ucyA9IGRpY3Rpb25hcnkudmFsdWVzPy5tYXAoKHZhbHVlKSA9PiAoe1xuICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgIGxhYmVsOlxuICAgICAgICAgIFV0aWxzLmZpbmRWYWx1ZVRyYW5zbGF0aW9uKFxuICAgICAgICAgICAgdmFsdWUudmFsdWVUcmFuc2xhdGlvbnMsXG4gICAgICAgICAgICBjdXJyZW50TGFuZ3VhZ2VJZFxuICAgICAgICAgICkgfHwgdmFsdWUubmFtZSxcbiAgICAgICAgY3VycmVudExhbmd1YWdlSXNvOiB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzbyxcbiAgICAgICAgcmVsYXRlZERpY3Rpb25hcmllc1RyYW5zbGF0aW9uczpcbiAgICAgICAgICBkaWN0aW9uYXJ5Q29udHJvbERhdGEucmVsYXRlZERpY3Rpb25hcmllc1RyYW5zbGF0aW9ucyxcbiAgICAgIH0pKTtcblxuICAgICAgb3B0aW9ucy5wcm9wc1snc2VsZWN0ZWRSZWxhdGVkRGljdGlvbmFyaWVzJ10gPVxuICAgICAgICBkaWN0aW9uYXJ5Q29udHJvbERhdGEuc2VsZWN0ZWRSZWxhdGVkRGljdGlvbmFyaWVzIHx8IFtdO1xuXG4gICAgICBsZXQgaW5pdGlhbFZhbHVlT2JqZWN0OiBEaWN0aW9uYXJ5VmFsdWUgfCBudWxsID0gbnVsbDtcbiAgICAgIGNvbnN0IGNvbnRyb2xLZXkgPSBvcHRpb25zLmtleSBhcyBzdHJpbmc7XG4gICAgICBjb25zdCBkaWN0aW9uYXJ5RGVmYXVsdFZhbHVlSWQgPVxuICAgICAgICBkaWN0aW9uYXJ5Q29udHJvbERhdGEuZGljdGlvbmFyeURlZmF1bHRWYWx1ZUlkO1xuICAgICAgaWYgKFxuICAgICAgICAhKHRoaXMubW9kZWwgJiYgdGhpcy5tb2RlbFtjb250cm9sS2V5XSAhPSBudWxsKSAmJlxuICAgICAgICBkaWN0aW9uYXJ5RGVmYXVsdFZhbHVlSWQgIT0gbnVsbFxuICAgICAgKSB7XG4gICAgICAgIGluaXRpYWxWYWx1ZU9iamVjdCA9IHRoaXMuZmluZEFuZE1hcERlZmF1bHRWYWx1ZShcbiAgICAgICAgICBkaWN0aW9uYXJ5LFxuICAgICAgICAgIGRpY3Rpb25hcnlEZWZhdWx0VmFsdWVJZFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBvcHRpb25zLmRlZmF1bHRWYWx1ZSA9IGluaXRpYWxWYWx1ZU9iamVjdDtcblxuICAgICAgLy8gUGFzcyBkZWZhdWx0IHZhbHVlIElEIHRvIGZvcm1seSBjb21wb25lbnRcbiAgICAgIG9wdGlvbnMucHJvcHNbJ2RpY3Rpb25hcnlEZWZhdWx0VmFsdWVJZCddID0gZGljdGlvbmFyeURlZmF1bHRWYWx1ZUlkO1xuXG4gICAgICBjb25zdCBjb250cm9sSWQgPSBvcHRpb25zLmtleTtcbiAgICAgIGlmICh0aGlzLmZpbGxEYXRhICYmIHRoaXMuZmlsbERhdGEuZmx1eCkge1xuICAgICAgICBmb3IgKGNvbnN0IHN0ZXAgb2YgdGhpcy5maWxsRGF0YS5mbHV4KSB7XG4gICAgICAgICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIHN0ZXAuc2VjdGlvbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSBzZWN0aW9uLmNvbnRyb2xzLmZpbmQoXG4gICAgICAgICAgICAgIChjdHJsOiB7XG4gICAgICAgICAgICAgICAgY29udHJvbElkOiBzdHJpbmcgfCBudW1iZXIgfCAoc3RyaW5nIHwgbnVtYmVyKVtdIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICB9KSA9PiBjdHJsLmNvbnRyb2xJZCA9PT0gY29udHJvbElkXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGNvbnRyb2wgJiYgY29udHJvbC5maWxsVmFsdWUgJiYgY29udHJvbC5maWxsVmFsdWUubmFtZSkge1xuICAgICAgICAgICAgICBvcHRpb25zLnByb3BzWyd2YWx1ZSddID0gY29udHJvbC5maWxsVmFsdWUubmFtZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMudXBkYXRlRm9ybWx5Q29uZmlnKCk7XG4gIH1cblxuICBhc3luYyBhZGRSZWZlcmVuY2VEaWN0aW9uYXJ5RmllbGRzSWZOZWNlc3NhcnkoXG4gICAgcmVmZXJyZW5jZWREaWN0aW9uYXJpZXM6IGFueVtdLFxuICAgIHBhcmVudERpY3Rpb25hcnlGaWVsZDogRm9ybWx5RmllbGRDb25maWcsXG4gICAgdHlwZTogYW55LFxuICAgIHJlbGF0ZWREaWN0aW9uYXJpZXNUcmFuc2xhdGlvbnM6IERpY3Rpb25hcnlMYWJlbEluZm9bXVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAocmVmZXJyZW5jZWREaWN0aW9uYXJpZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRSZWxhdGVkRGljdGlvbmFyaWVzID1cbiAgICAgICAgcGFyZW50RGljdGlvbmFyeUZpZWxkLnByb3BzPy5bJ3NlbGVjdGVkUmVsYXRlZERpY3Rpb25hcmllcyddIHx8IFtdO1xuXG4gICAgICBjb25zdCBzZWxlY3RlZERpY3Rpb25hcmllcyA9IHJlZmVycmVuY2VkRGljdGlvbmFyaWVzLmZpbHRlcigoZGljdCkgPT5cbiAgICAgICAgc2VsZWN0ZWRSZWxhdGVkRGljdGlvbmFyaWVzLmluY2x1ZGVzKGRpY3QudXVpZClcbiAgICAgICk7XG5cbiAgICAgIHNlbGVjdGVkRGljdGlvbmFyaWVzLmZvckVhY2goKHJlZmVyZW5jZURpY3Rpb25hcnkpID0+IHtcbiAgICAgICAgY29uc3QgcmVmZXJlbmNlRGljdGlvbmFyeVV1aWQgPSByZWZlcmVuY2VEaWN0aW9uYXJ5LnV1aWQ7XG5cbiAgICAgICAgY29uc3QgY29tcG9uZW50T25seUZvckNvbmZpZyA9IHRoaXMuZmx1eFxuICAgICAgICAgIC5mbGF0TWFwKChzKSA9PiBzLnNlY3Rpb25zKVxuICAgICAgICAgIC5mbGF0TWFwKChzZWMpID0+IHNlYy5jb250cm9scylcbiAgICAgICAgICAuZmluZChcbiAgICAgICAgICAgIChjdHJsKSA9PlxuICAgICAgICAgICAgICBjdHJsPy5zcGVjaWZpY0NvbnRyb2xEYXRhPy5kaWN0aW9uYXJ5VVVJRCA9PT1cbiAgICAgICAgICAgICAgcmVmZXJlbmNlRGljdGlvbmFyeVV1aWQgJiYgY3RybD8uaXNPbmx5Rm9yQ29uZmlnID09PSB0cnVlXG4gICAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBuZXdGaWVsZEtleSA9XG4gICAgICAgICAgY29tcG9uZW50T25seUZvckNvbmZpZz8uaWRlbnRpZmllciA/P1xuICAgICAgICAgIGBleHRyYV8ke3JlZmVyZW5jZURpY3Rpb25hcnlVdWlkfWA7XG5cbiAgICAgICAgbGV0IHJlZmVyZW5jZURpY3Rpb25hcnlMYWJlbCA9IHJlZmVyZW5jZURpY3Rpb25hcnkubmFtZTtcblxuICAgICAgICBjb25zdCBzcGVjaWZpY1RyYW5zbGF0aW9uVmFsdWUgPSByZWxhdGVkRGljdGlvbmFyaWVzVHJhbnNsYXRpb25zXG4gICAgICAgICAgLmZpbmQoKGQpID0+IGQuZGljdGlvbmFyeVVVSUQgPT0gcmVmZXJlbmNlRGljdGlvbmFyeVV1aWQpXG4gICAgICAgICAgPy50cmFuc2xhdGlvbnM/LmZpbmQoXG4gICAgICAgICAgICAodCkgPT4gdC5sYW5ndWFnZUlzbyA9PSB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICAgICk/LnZhbHVlO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBzcGVjaWZpY1RyYW5zbGF0aW9uVmFsdWUgJiZcbiAgICAgICAgICBzcGVjaWZpY1RyYW5zbGF0aW9uVmFsdWUudHJpbSgpICE9PSAnJ1xuICAgICAgICApIHtcbiAgICAgICAgICByZWZlcmVuY2VEaWN0aW9uYXJ5TGFiZWwgPSBzcGVjaWZpY1RyYW5zbGF0aW9uVmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVmZXJlbmNlRGljdGlvbmFyeUxhYmVsID0gJyc7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY3VycmVudExhbmd1YWdlSWQgPSBVdGlscy5maW5kTGFuZ3VhZ2VJZEJ5SXNvKFxuICAgICAgICAgIHRoaXMuYXZhaWxhYmxlTGFuZ3VhZ2VzLFxuICAgICAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgbmV3RmllbGQ6IEZvcm1seUZpZWxkQ29uZmlnID0ge1xuICAgICAgICAgIGtleTogbmV3RmllbGRLZXksXG4gICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgbGFiZWw6IHJlZmVyZW5jZURpY3Rpb25hcnlMYWJlbCxcbiAgICAgICAgICAgIGRlc2lnbjogdGhpcy5kZXNpZ24sXG4gICAgICAgICAgICBkaWN0aW9uYXJ5SWQ6IHJlZmVyZW5jZURpY3Rpb25hcnlVdWlkLFxuICAgICAgICAgICAgZGljdGlvbmFyeURhdGE6IHJlZmVyZW5jZURpY3Rpb25hcnksXG4gICAgICAgICAgICBsYW5ndWFnZXM6IHRoaXMuYXZhaWxhYmxlTGFuZ3VhZ2VzLFxuICAgICAgICAgICAgcHJlbG9hZGVkRGljdGlvbmFyaWVzOiB0aGlzLmRpY3Rpb25hcnlNYXAsXG4gICAgICAgICAgICB1c2VQcmVsb2FkZWREYXRhOiB0cnVlLFxuICAgICAgICAgICAgY3VycmVudExhbmd1YWdlSXNvOiB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzbyxcbiAgICAgICAgICAgIGN1cnJlbnRMYW5ndWFnZUlkOiBjdXJyZW50TGFuZ3VhZ2VJZCxcbiAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICAgICBzdHlsZTogdGhpcy5zdHlsZU9iamVjdFRvU3RyaW5nRXhjZXB0QmFja2dyb3VuZChcbiAgICAgICAgICAgICAgICB0aGlzLmRlc2lnbltgLmZvbnQtbGlzdGBdIHx8IHt9XG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb3B0aW9uczogcmVmZXJlbmNlRGljdGlvbmFyeS52YWx1ZXM/Lm1hcCgodmFsdWU6IGFueSkgPT4gKHtcbiAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgICBsYWJlbDpcbiAgICAgICAgICAgICAgICBVdGlscy5maW5kVmFsdWVUcmFuc2xhdGlvbihcbiAgICAgICAgICAgICAgICAgIHZhbHVlLnZhbHVlVHJhbnNsYXRpb25zLFxuICAgICAgICAgICAgICAgICAgY3VycmVudExhbmd1YWdlSWRcbiAgICAgICAgICAgICAgICApIHx8IHZhbHVlLm5hbWUsXG4gICAgICAgICAgICAgIGN1cnJlbnRMYW5ndWFnZUlzbzogdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc28sXG4gICAgICAgICAgICB9KSksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAocmVmZXJlbmNlRGljdGlvbmFyeS5kZWZhdWx0VmFsdWVJZCkge1xuICAgICAgICAgIGNvbnN0IGRlZmF1bHRWYWwgPSB0aGlzLmZpbmRBbmRNYXBEZWZhdWx0VmFsdWUoXG4gICAgICAgICAgICByZWZlcmVuY2VEaWN0aW9uYXJ5LFxuICAgICAgICAgICAgcmVmZXJlbmNlRGljdGlvbmFyeS5kZWZhdWx0VmFsdWVJZFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGRlZmF1bHRWYWwpIHtcbiAgICAgICAgICAgIG5ld0ZpZWxkLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyZW50RmllbGRHcm91cCA9IHBhcmVudERpY3Rpb25hcnlGaWVsZC5wYXJlbnRcbiAgICAgICAgICA/IHBhcmVudERpY3Rpb25hcnlGaWVsZC5wYXJlbnQuZmllbGRHcm91cFxuICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgaWYgKHBhcmVudEZpZWxkR3JvdXApIHtcbiAgICAgICAgICBjb25zdCBwYXJlbnRJbmRleCA9IHBhcmVudEZpZWxkR3JvdXAuZmluZEluZGV4KFxuICAgICAgICAgICAgKGZpZWxkKSA9PiBmaWVsZC5rZXkgPT09IHBhcmVudERpY3Rpb25hcnlGaWVsZC5rZXlcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChwYXJlbnRJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIGNvbnN0IGVuZEluZGV4ID0gdGhpcy5maW5kTGFzdENoaWxkSW5kZXgoXG4gICAgICAgICAgICAgIHBhcmVudEZpZWxkR3JvdXAsXG4gICAgICAgICAgICAgIHBhcmVudEluZGV4XG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zdCBwZXJjZW50YWdlVG9BZGQgPSB0aGlzLmdldEV4aXN0aW5nUGVyY2VudGFnZShcbiAgICAgICAgICAgICAgcGFyZW50RmllbGRHcm91cCxcbiAgICAgICAgICAgICAgcGFyZW50SW5kZXhcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBuZXdGaWVsZC5jbGFzc05hbWUgPSBwZXJjZW50YWdlVG9BZGQgPT09IDBcbiAgICAgICAgICAgICAgPyBwYXJlbnREaWN0aW9uYXJ5RmllbGQuY2xhc3NOYW1lXG4gICAgICAgICAgICAgIDogdGhpcy5nZXRQZXJjZW50YWdlQ2xhc3NOYW1lKHBlcmNlbnRhZ2VUb0FkZCk7XG5cbiAgICAgICAgICAgIHBhcmVudEZpZWxkR3JvdXAuc3BsaWNlKGVuZEluZGV4ICsgMSwgMCwgbmV3RmllbGQpO1xuXG4gICAgICAgICAgICBjb25zdCBjbGFzc05hbWVUb0FkZCA9XG4gICAgICAgICAgICAgIHR5cGUgPT09ICdyYWRpbycgPyBgIGNvbXBvbmVudC1yYWRpb2AgOiBgIGNvbXBvbmVudC1kYXRhYDtcbiAgICAgICAgICAgIG5ld0ZpZWxkLmNsYXNzTmFtZSArPSBjbGFzc05hbWVUb0FkZDtcbiAgICAgICAgICAgIHRoaXMuYXR0YWNoVG9WYWx1ZUNoYW5nZXMobmV3RmllbGRLZXksIG5ld0ZpZWxkKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRm9ybWx5Q29uZmlnKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBnZXRFeGlzdGluZ1BlcmNlbnRhZ2UoZmllbGRzOiBGb3JtbHlGaWVsZENvbmZpZ1tdLCBpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBsZXQgcGVyY2VudGFnZSA9IDA7XG4gICAgY29uc3QgZmllbGQgPSBmaWVsZHNbaW5kZXhdO1xuICAgIGNvbnN0IGNsYXNzTmFtZSA9IGZpZWxkLmNsYXNzTmFtZTtcbiAgICBpZiAoZmllbGQudHlwZT8udG9TdHJpbmcoKSAhPT0gU3RlcENvbnRyb2xUeXBlLk5ld1Jvdy50b1N0cmluZygpKSB7XG4gICAgICBpZiAoY2xhc3NOYW1lICYmIGNsYXNzTmFtZS5zdGFydHNXaXRoKCdwZXJjZW50YWdlLXdpZHRoLScpKSB7XG4gICAgICAgIHBlcmNlbnRhZ2UgPVxuICAgICAgICAgIChwYXJzZUludChjbGFzc05hbWUucmVwbGFjZSgncGVyY2VudGFnZS13aWR0aC0nLCAnJyksIDEwKSAqIDEwMCkgLyAxMjtcbiAgICAgIH0gZWxzZSBpZiAoY2xhc3NOYW1lICYmIGNsYXNzTmFtZS5zdGFydHNXaXRoKCdwaXhlbC13aWR0aC0nKSkge1xuICAgICAgICBjb25zdCBwaXhlbHMgPSBwYXJzZUludChjbGFzc05hbWUucmVwbGFjZSgncGl4ZWwtd2lkdGgtJywgJycpLCAxMCk7XG4gICAgICAgIHBlcmNlbnRhZ2UgPSAocGl4ZWxzIC8gMTAwMCkgKiAxMDA7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwZXJjZW50YWdlO1xuICB9XG5cbiAgY2FsY3VsYXRlUmVtYWluaW5nUGVyY2VudGFnZUZvclJhbmdlKFxuICAgIGZpZWxkczogRm9ybWx5RmllbGRDb25maWdbXSxcbiAgICBzdGFydEluZGV4OiBudW1iZXIsXG4gICAgZW5kSW5kZXg6IG51bWJlclxuICApOiBudW1iZXIge1xuICAgIGxldCByZW1haW5pbmdQZXJjZW50YWdlID0gMTAwO1xuXG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0SW5kZXg7IGkgPD0gZW5kSW5kZXg7IGkrKykge1xuICAgICAgY29uc3QgcGVyY2VudGFnZSA9IHRoaXMuZ2V0RXhpc3RpbmdQZXJjZW50YWdlKGZpZWxkcywgaSk7XG4gICAgICByZW1haW5pbmdQZXJjZW50YWdlIC09IHBlcmNlbnRhZ2U7XG4gICAgfVxuICAgIHJldHVybiBNYXRoLm1heChyZW1haW5pbmdQZXJjZW50YWdlLCAwKTtcbiAgfVxuXG4gIHJlbW92ZVJlZmVyZW5jZUZpZWxkcyhjdXJyZW50Rm9ybWx5RmllbGRDb25maWc6IEZvcm1seUZpZWxkQ29uZmlnKSB7XG4gICAgY29uc3QgcmVmZXJyZWRJbkRpY3Rpb25hcmllc1VVSWRzID1cbiAgICAgIGN1cnJlbnRGb3JtbHlGaWVsZENvbmZpZy5wcm9wcz8uWydkaWN0aW9uYXJ5RGF0YSddXG4gICAgICAgID8ucmVmZXJyZWRJbkRpY3Rpb25hcmllc1VVSWRzO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmVmZXJyZWRJbkRpY3Rpb25hcmllc1VVSWRzKSkge1xuICAgICAgY29uc3QgcGFyZW50RmllbGRHcm91cCA9IGN1cnJlbnRGb3JtbHlGaWVsZENvbmZpZy5wYXJlbnRcbiAgICAgICAgPyBjdXJyZW50Rm9ybWx5RmllbGRDb25maWcucGFyZW50LmZpZWxkR3JvdXBcbiAgICAgICAgOiBudWxsO1xuICAgICAgaWYgKHBhcmVudEZpZWxkR3JvdXApIHtcbiAgICAgICAgY29uc3QgcGFyZW50SW5kZXggPSBwYXJlbnRGaWVsZEdyb3VwLmZpbmRJbmRleChcbiAgICAgICAgICAoZmllbGQpID0+IGZpZWxkLmtleSA9PT0gY3VycmVudEZvcm1seUZpZWxkQ29uZmlnLmtleVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChwYXJlbnRJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgcmVmZXJyZWRJbkRpY3Rpb25hcmllc1VVSWRzKSB7XG4gICAgICAgICAgICBjb25zdCBpZFRvRmluZCA9ICdleHRyYV8nICsgaXRlbTtcblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHBhcmVudEZpZWxkR3JvdXAubGVuZ3RoIC0gMTsgaSA+IHBhcmVudEluZGV4OyBpLS0pIHtcbiAgICAgICAgICAgICAgY29uc3QgY3VycmVudEZpZWxkS2V5ID0gcGFyZW50RmllbGRHcm91cFtpXS5rZXk/LnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgIGlmIChjdXJyZW50RmllbGRLZXkgJiYgY3VycmVudEZpZWxkS2V5ID09PSBpZFRvRmluZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJGb3JtQ29udHJvbFZhbHVlKGlkVG9GaW5kKTtcbiAgICAgICAgICAgICAgICBwYXJlbnRGaWVsZEdyb3VwLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGFkZENoaWxkRGljdGlvbmFyeUZpZWxkKFxuICAgIGNoaWxkRGljdGlvbmFyeVV1aWQ6IHN0cmluZyxcbiAgICBwYXJlbnREaWN0aW9uYXJ5RmllbGQ6IEZvcm1seUZpZWxkQ29uZmlnLFxuICAgIHR5cGU6IGFueSxcbiAgICByZWxhdGVkRGljdGlvbmFyaWVzVHJhbnNsYXRpb25zOiBEaWN0aW9uYXJ5TGFiZWxJbmZvW11cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKGNoaWxkRGljdGlvbmFyeVV1aWQpIHtcbiAgICAgIGNvbnN0IGNoaWxkRGljdGlvbmFyeSA9IHRoaXMuZGljdGlvbmFyeU1hcC5nZXQoY2hpbGREaWN0aW9uYXJ5VXVpZCk7XG4gICAgICBpZiAoY2hpbGREaWN0aW9uYXJ5KSB7XG4gICAgICAgIGxldCBjaGlsZERpY3Rpb25hcnlMYWJlbCA9IGNoaWxkRGljdGlvbmFyeS5uYW1lO1xuICAgICAgICBjb25zdCB0cmFuc2xhdGlvbiA9XG4gICAgICAgICAgcmVsYXRlZERpY3Rpb25hcmllc1RyYW5zbGF0aW9uc1xuICAgICAgICAgICAgLmZpbmQoKGQpID0+IGQuZGljdGlvbmFyeVVVSUQgPT0gY2hpbGREaWN0aW9uYXJ5VXVpZClcbiAgICAgICAgICAgID8udHJhbnNsYXRpb25zLmZpbmQoKHQpID0+IHQubGFuZ3VhZ2VJc28gPT0gdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc28pXG4gICAgICAgICAgICA/LnZhbHVlIHx8ICcnO1xuICAgICAgICBpZiAodHJhbnNsYXRpb24pIHtcbiAgICAgICAgICBjaGlsZERpY3Rpb25hcnlMYWJlbCA9IHRyYW5zbGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld0ZpZWxkOiBGb3JtbHlGaWVsZENvbmZpZyA9IHtcbiAgICAgICAgICBrZXk6IGAke3BhcmVudERpY3Rpb25hcnlGaWVsZC5rZXl9X2NoaWxkXyR7Y2hpbGREaWN0aW9uYXJ5VXVpZH1gLFxuICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgIGxhYmVsOiBjaGlsZERpY3Rpb25hcnlMYWJlbCxcbiAgICAgICAgICAgIGRpY3Rpb25hcnlEYXRhOiBjaGlsZERpY3Rpb25hcnksXG4gICAgICAgICAgICBsYW5ndWFnZXM6IHRoaXMuYXZhaWxhYmxlTGFuZ3VhZ2VzLFxuICAgICAgICAgICAgcHJlbG9hZGVkRGljdGlvbmFyaWVzOiB0aGlzLmRpY3Rpb25hcnlNYXAsXG4gICAgICAgICAgICBvcHRpb25zOiBjaGlsZERpY3Rpb25hcnkudmFsdWVzPy5tYXAoKHZhbHVlKSA9PiAoe1xuICAgICAgICAgICAgICB2YWx1ZTogdmFsdWUuaWQsXG4gICAgICAgICAgICAgIGxhYmVsOiB2YWx1ZS5uYW1lLFxuICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgICAgIHN0eWxlOiB0aGlzLnN0eWxlT2JqZWN0VG9TdHJpbmdFeGNlcHRCYWNrZ3JvdW5kKFxuICAgICAgICAgICAgICAgIHRoaXMuZGVzaWduW2AuZm9udC1saXN0YF0gfHwge31cbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBob29rczoge1xuICAgICAgICAgICAgb25Jbml0OiAoZmllbGQpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgdW5zdWJzY3JpYmUkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICAgICAgICAgICAgdGhpcy5maWVsZFVuc3Vic2NyaWJlU3ViamVjdHMucHVzaCh1bnN1YnNjcmliZSQpO1xuXG4gICAgICAgICAgICAgIGZpZWxkLmZvcm1Db250cm9sPy52YWx1ZUNoYW5nZXNcbiAgICAgICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodW5zdWJzY3JpYmUkKSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKGFzeW5jIChzZWxlY3RlZFZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZE9wdGlvbiA9IGNoaWxkRGljdGlvbmFyeS52YWx1ZXM/LmZpbmQoXG4gICAgICAgICAgICAgICAgICAgICh2YWwpID0+IHZhbC5pZCA9PT0gc2VsZWN0ZWRWYWx1ZVxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZE9wdGlvbiAmJiBzZWxlY3RlZE9wdGlvbi5jaGlsZERpY3Rpb25hcnlVVUlEKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRkQ2hpbGREaWN0aW9uYXJ5RmllbGQoXG4gICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRPcHRpb24uY2hpbGREaWN0aW9uYXJ5VVVJRCxcbiAgICAgICAgICAgICAgICAgICAgICBmaWVsZCxcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgICAgICAgICAgIHJlbGF0ZWREaWN0aW9uYXJpZXNUcmFuc2xhdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlQ2hpbGRGaWVsZHMoZmllbGQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUZvcm1seUNvbmZpZygpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIGZpZWxkLmhvb2tzIS5vbkRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdW5zdWJzY3JpYmUkLm5leHQoKTtcbiAgICAgICAgICAgICAgICB1bnN1YnNjcmliZSQuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBwYXJlbnRGaWVsZEdyb3VwID0gcGFyZW50RGljdGlvbmFyeUZpZWxkLnBhcmVudFxuICAgICAgICAgID8gcGFyZW50RGljdGlvbmFyeUZpZWxkLnBhcmVudC5maWVsZEdyb3VwXG4gICAgICAgICAgOiBudWxsO1xuICAgICAgICBpZiAocGFyZW50RmllbGRHcm91cCkge1xuICAgICAgICAgIGNvbnN0IHBhcmVudEluZGV4ID0gcGFyZW50RmllbGRHcm91cC5maW5kSW5kZXgoXG4gICAgICAgICAgICAoZmllbGQpID0+IGZpZWxkLmtleSA9PT0gcGFyZW50RGljdGlvbmFyeUZpZWxkLmtleVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHBhcmVudEluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgY29uc3QgZW5kSW5kZXggPSB0aGlzLmZpbmRMYXN0Q2hpbGRJbmRleChcbiAgICAgICAgICAgICAgcGFyZW50RmllbGRHcm91cCxcbiAgICAgICAgICAgICAgcGFyZW50SW5kZXhcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGNvbnN0IHBlcmNlbnRhZ2VUb0FkZCA9IHRoaXMuZ2V0RXhpc3RpbmdQZXJjZW50YWdlKFxuICAgICAgICAgICAgICBwYXJlbnRGaWVsZEdyb3VwLFxuICAgICAgICAgICAgICBwYXJlbnRJbmRleFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIG5ld0ZpZWxkLmNsYXNzTmFtZSA9IHRoaXMuZ2V0UGVyY2VudGFnZUNsYXNzTmFtZShwZXJjZW50YWdlVG9BZGQpO1xuICAgICAgICAgICAgcGFyZW50RmllbGRHcm91cC5zcGxpY2UoZW5kSW5kZXggKyAxLCAwLCBuZXdGaWVsZCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGNsYXNzTmFtZVRvQWRkID1cbiAgICAgICAgICAgICAgdHlwZSA9PT0gJ3JhZGlvJyA/IGAgY29tcG9uZW50LXJhZGlvYCA6IGAgY29tcG9uZW50LWRhdGFgO1xuICAgICAgICAgICAgbmV3RmllbGQuY2xhc3NOYW1lICs9IGNsYXNzTmFtZVRvQWRkO1xuICAgICAgICAgICAgLy90aGlzLmF0dGFjaFRvVmFsdWVDaGFuZ2VzKG5ld0ZpZWxkS2V5LCBuZXdGaWVsZCk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUZvcm1seUNvbmZpZygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBDaGlsZCBkaWN0aW9uYXJ5IG5vdCBmb3VuZCBmb3IgVVVJRCAke2NoaWxkRGljdGlvbmFyeVV1aWR9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uQ29tcGxldGlvbigpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZygnT3JpZ2luIGZvcm0gY29tcGxldGVkIHN1Y2Nlc3NmdWxseScpO1xuICAgIHRoaXMuY29tcGxldGlvbkV2ZW50LmVtaXQoKTtcbiAgfVxuXG4gIGZpbmRMYXN0Q2hpbGRJbmRleChmaWVsZHM6IEZvcm1seUZpZWxkQ29uZmlnW10sIHBhcmVudEluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHBhcmVudEtleVByZWZpeCA9IGAke2ZpZWxkc1twYXJlbnRJbmRleF0ua2V5fV9gO1xuICAgIGxldCBsYXN0SW5kZXggPSBwYXJlbnRJbmRleDtcblxuICAgIGZvciAobGV0IGkgPSBwYXJlbnRJbmRleCArIDE7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChmaWVsZHNbaV0ua2V5Py50b1N0cmluZygpLnN0YXJ0c1dpdGgocGFyZW50S2V5UHJlZml4KSkge1xuICAgICAgICBsYXN0SW5kZXggPSBpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGxhc3RJbmRleDtcbiAgfVxuXG4gIGZpbmRGaWVsZEJ5S2V5KFxuICAgIGZpZWxkczogRm9ybWx5RmllbGRDb25maWdbXSxcbiAgICBrZXk6IHN0cmluZ1xuICApOiBGb3JtbHlGaWVsZENvbmZpZyB8IG51bGwge1xuICAgIGlmICghZmllbGRzKSByZXR1cm4gbnVsbDtcbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGZpZWxkcykge1xuICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdzdGVwcGVyJyAmJiBmaWVsZC5maWVsZEdyb3VwKSB7XG4gICAgICAgIGNvbnN0IGZvdW5kSW5TdGVwcGVyID0gdGhpcy5maW5kRmllbGRCeUtleShmaWVsZC5maWVsZEdyb3VwLCBrZXkpO1xuICAgICAgICBpZiAoZm91bmRJblN0ZXBwZXIpIHJldHVybiBmb3VuZEluU3RlcHBlcjtcbiAgICAgIH1cblxuICAgICAgaWYgKGZpZWxkLmtleSA9PT0ga2V5KSB7XG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICAgIH1cbiAgICAgIGlmIChmaWVsZC5maWVsZEdyb3VwKSB7XG4gICAgICAgIGNvbnN0IGZvdW5kID0gdGhpcy5maW5kRmllbGRCeUtleShmaWVsZC5maWVsZEdyb3VwLCBrZXkpO1xuICAgICAgICBpZiAoZm91bmQpIHJldHVybiBmb3VuZDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZW1vdmVDaGlsZEZpZWxkcyhwYXJlbnRGaWVsZDogRm9ybWx5RmllbGRDb25maWcpIHtcbiAgICBjb25zdCBwYXJlbnRGaWVsZEdyb3VwID0gcGFyZW50RmllbGQucGFyZW50XG4gICAgICA/IHBhcmVudEZpZWxkLnBhcmVudC5maWVsZEdyb3VwXG4gICAgICA6IG51bGw7XG5cbiAgICBpZiAocGFyZW50RmllbGRHcm91cCkge1xuICAgICAgY29uc3QgcGFyZW50SW5kZXggPSBwYXJlbnRGaWVsZEdyb3VwLmZpbmRJbmRleChcbiAgICAgICAgKGZpZWxkKSA9PiBmaWVsZC5rZXkgPT09IHBhcmVudEZpZWxkLmtleVxuICAgICAgKTtcblxuICAgICAgaWYgKHBhcmVudEluZGV4ICE9PSAtMSkge1xuICAgICAgICBjb25zdCBwYXJlbnRLZXlQcmVmaXggPSBgJHtwYXJlbnRGaWVsZC5rZXl9X2NoaWxkX2A7XG5cbiAgICAgICAgLy8gUmVtb3ZlIG9ubHkgdGhlIHJlbGV2YW50IGNoaWxkIGZpZWxkc1xuICAgICAgICBmb3IgKGxldCBpID0gcGFyZW50RmllbGRHcm91cC5sZW5ndGggLSAxOyBpID4gcGFyZW50SW5kZXg7IGktLSkge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRGaWVsZEtleSA9IHBhcmVudEZpZWxkR3JvdXBbaV0ua2V5Py50b1N0cmluZygpO1xuICAgICAgICAgIGlmIChjdXJyZW50RmllbGRLZXkgJiYgY3VycmVudEZpZWxkS2V5LnN0YXJ0c1dpdGgocGFyZW50S2V5UHJlZml4KSkge1xuICAgICAgICAgICAgdGhpcy5jbGVhckZvcm1Db250cm9sVmFsdWUoY3VycmVudEZpZWxkS2V5KTtcbiAgICAgICAgICAgIHBhcmVudEZpZWxkR3JvdXAuc3BsaWNlKGksIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBORVc6IExvYWQgQUxMIGRpY3Rpb25hcmllcyBuZWVkZWQgZm9yIHRoaXMgYXBwIHVzaW5nIHRoZSBuZXcgYXBwLWJhc2VkIGVuZHBvaW50XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGxvYWRBbGxSZXF1aXJlZERpY3Rpb25hcmllcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuYXBwTW9kZWw/LmFwcGxpY2F0aW9uVXVpZCkge1xuICAgICAgY29uc29sZS53YXJuKCdObyBhcHAgVVVJRCBhdmFpbGFibGUgZm9yIGRpY3Rpb25hcnkgbG9hZGluZycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxuICAgICAgICB0aGlzLnNlcnZpY2UubG9hZEFwcERpY3Rpb25hcmllcyhcbiAgICAgICAgICB0aGlzLmFwcE1vZGVsLmFwcGxpY2F0aW9uVXVpZCxcbiAgICAgICAgICBFbnZpcm9ubWVudFR5cGUuQ29uZmlnXG4gICAgICAgIClcbiAgICAgICk7XG5cbiAgICAgIGlmICghcmVzcG9uc2Uuc3VjY2Vzcykge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICfinYwgQmFja2VuZCBmYWlsZWQgdG8gbG9hZCBkaWN0aW9uYXJpZXM6JyxcbiAgICAgICAgICByZXNwb25zZS5lcnJvcnNcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBTaW1wbGUgYXNzaWdubWVudCAtIEFMTCBkaWN0aW9uYXJpZXMgYW5kIGRlcGVuZGVuY2llcyBhbHJlYWR5IGxvYWRlZCBieSBiYWNrZW5kXG4gICAgICBPYmplY3QuZW50cmllcyhyZXNwb25zZS5kaWN0aW9uYXJpZXMpLmZvckVhY2goKFt1dWlkLCBkaWN0XSkgPT4ge1xuICAgICAgICB0aGlzLmRpY3Rpb25hcnlNYXAuc2V0KHV1aWQsIGRpY3QpO1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ+KdjCBGYWlsZWQgdG8gbG9hZCBhcHAgZGljdGlvbmFyaWVzOicsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBjbGVhckZvcm1Db250cm9sVmFsdWUoZmllbGRLZXk6IHN0cmluZykge1xuICAgIGNvbnN0IGtleXMgPSBmaWVsZEtleS5zcGxpdCgnLicpO1xuICAgIGxldCBjb250cm9sID0gdGhpcy5mb3JtO1xuICAgIGxldCBtb2RlbCA9IHRoaXMubW9kZWw7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICBjb250cm9sID0gY29udHJvbC5nZXQoa2V5c1tpXSkgYXMgRm9ybUdyb3VwO1xuICAgICAgbW9kZWwgPSBtb2RlbFtrZXlzW2ldXTtcbiAgICB9XG5cbiAgICBjb25zdCBmaW5hbEtleSA9IGtleXNba2V5cy5sZW5ndGggLSAxXTtcbiAgICBpZiAoY29udHJvbCAmJiBjb250cm9sLmdldChmaW5hbEtleSkpIHtcbiAgICAgIGNvbnRyb2wucmVtb3ZlQ29udHJvbChmaW5hbEtleSk7XG4gICAgfVxuXG4gICAgaWYgKG1vZGVsICYmIG1vZGVsW2ZpbmFsS2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZWxldGUgbW9kZWxbZmluYWxLZXldO1xuICAgIH1cbiAgfVxuXG4gIGZpbmRGaWVsZChcbiAgICBmaWVsZHM6IEZvcm1seUZpZWxkQ29uZmlnW10sXG4gICAga2V5OiBzdHJpbmdcbiAgKTogRm9ybWx5RmllbGRDb25maWcgfCBudWxsIHtcbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGZpZWxkcykge1xuICAgICAgaWYgKGZpZWxkLmtleSA9PT0ga2V5KSB7XG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICAgIH1cbiAgICAgIGlmIChmaWVsZC5maWVsZEdyb3VwKSB7XG4gICAgICAgIGNvbnN0IG5lc3RlZEZpZWxkID0gdGhpcy5maW5kRmllbGQoZmllbGQuZmllbGRHcm91cCwga2V5KTtcbiAgICAgICAgaWYgKG5lc3RlZEZpZWxkKSB7XG4gICAgICAgICAgcmV0dXJuIG5lc3RlZEZpZWxkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBwb3B1bGF0ZU1vZGVsV2l0aEZpbGxEYXRhKGZpbGxEYXRhOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoZmlsbERhdGEpIHtcbiAgICAgIGxldCBhdXhNb2RlbCA9IE1vZGVsUG9wdWxhdGlvbkhlbHBlci5wb3B1bGF0ZU1vZGVsV2l0aEZpbGxEYXRhKFxuICAgICAgICBmaWxsRGF0YSxcbiAgICAgICAgdGhpcy5mbHV4LFxuICAgICAgICB0aGlzLmRpY3Rpb25hcnlNYXAsXG4gICAgICAgIHRoaXMuYXZhaWxhYmxlTGFuZ3VhZ2VzXG4gICAgICApO1xuICAgICAgdGhpcy5tb2RlbCA9IHsgLi4uYXV4TW9kZWwgfTtcbiAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZmluZEFuZE1hcERlZmF1bHRWYWx1ZShcbiAgICBkaWN0aW9uYXJ5OiBEaWN0aW9uYXJ5RHRvIHwgdW5kZWZpbmVkLFxuICAgIGRlZmF1bHRWYWx1ZUlkOiBudW1iZXJcbiAgKTogRGljdGlvbmFyeVZhbHVlIHwgbnVsbCB7XG4gICAgcmV0dXJuIE1vZGVsUG9wdWxhdGlvbkhlbHBlci5maW5kQW5kTWFwRGVmYXVsdFZhbHVlKFxuICAgICAgZGljdGlvbmFyeSxcbiAgICAgIGRlZmF1bHRWYWx1ZUlkLFxuICAgICAgdGhpcy5hdmFpbGFibGVMYW5ndWFnZXNcbiAgICApO1xuICB9XG5cbiAgdXBkYXRlRm9ybWx5Q29uZmlnKCkge1xuICAgIHRoaXMuZm9ybWx5Q29uZmlnID0gWy4uLnRoaXMuZm9ybWx5Q29uZmlnXTtcbiAgfVxuXG4gIHByaXZhdGUgdW5zdWJzY3JpYmVGcm9tQWxsRmllbGRzKCkge1xuICAgIGZvciAoY29uc3Qgc3ViamVjdCBvZiB0aGlzLmZpZWxkVW5zdWJzY3JpYmVTdWJqZWN0cykge1xuICAgICAgc3ViamVjdC5uZXh0KCk7XG4gICAgICBzdWJqZWN0LmNvbXBsZXRlKCk7XG4gICAgfVxuICAgIHRoaXMuZmllbGRVbnN1YnNjcmliZVN1YmplY3RzID0gW107XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnVuc3Vic2NyaWJlRnJvbUFsbEZpZWxkcygpO1xuICAgIGlmICh0aGlzLmNvbGxlY3RvckhhbmRsZXJTdWJzY3JpcHRpb25zKSB7XG4gICAgICB0aGlzLmNvbGxlY3RvckhhbmRsZXJTdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmFjdGlvblN0ZXBTdWJzY3JpcHRpb25zKSB7XG4gICAgICB0aGlzLmFjdGlvblN0ZXBTdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmFjdGlvblN0ZXBIYW5kbGVyKSB7XG4gICAgICB0aGlzLmFjdGlvblN0ZXBIYW5kbGVyLmRlc3Ryb3koKTtcbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3RCdXR0b25zKGJ1dHRvbnNDb25maWc6IGFueVtdKTogYW55W10ge1xuICAgIGlmICghYnV0dG9uc0NvbmZpZyB8fCBidXR0b25zQ29uZmlnLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICByZXR1cm4gYnV0dG9uc0NvbmZpZy5tYXAoKGJ1dHRvbikgPT4gKHtcbiAgICAgIHR5cGU6IGJ1dHRvbi52YWx1ZS50b0xvd2VyQ2FzZSgpLFxuICAgICAgbGFiZWw6IGJ1dHRvbi50cmFuc2xhdGlvbnM/Llt0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb10gfHwgYnV0dG9uLnZhbHVlLFxuICAgICAgc3R5bGVLZXk6IGAuYnV0dG9uLSR7YnV0dG9uLnZhbHVlLnRvTG93ZXJDYXNlKCl9YCxcbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIHN0eWxlT2JqZWN0VG9TdHJpbmdFeGNlcHRCYWNrZ3JvdW5kKHN0eWxlT2JqOiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhzdHlsZU9iailcbiAgICAgIC5maWx0ZXIoKFtrZXksIHZhbHVlXSkgPT4ga2V5ICE9PSAnYmFja2dyb3VuZC1jb2xvcicpXG4gICAgICAubWFwKChba2V5LCB2YWx1ZV0pID0+IGAke2tleX06ICR7dmFsdWV9YClcbiAgICAgIC5qb2luKCc7ICcpO1xuICB9XG5cbiAgdmFsaWRhdGVNZXRob2RBcGkoZGF0YTogQXBpVmFsaWRhdGVSZXF1ZXN0KTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgaWYgKGRhdGEuYXBpSWQgPT09IHVuZGVmaW5lZCB8fCBkYXRhLmFwcElkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBvZihmYWxzZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYXBwbGljYXRpb25EYXRhU2VydmljZS52YWxpZGF0ZUFwaShkYXRhKS5waXBlKFxuICAgICAgbWFwKChyZXNwb25zZSkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnQVBJIHZhbGlkYXRpb24gcmVzcG9uc2U6JywgcmVzcG9uc2UpO1xuICAgICAgICByZXR1cm4gISFyZXNwb25zZTtcbiAgICAgIH0pLFxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgdmFsaWRhdGluZyAnICsgZGF0YS5kYXRhLCBlcnJvcik7XG4gICAgICAgIHJldHVybiBvZihmYWxzZSk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUHVibGljIG1ldGhvZCB0byBjbGVhciB0aGUgc2F2aW5nIGFmdGVyIGFjdGlvbnMgc3RhdGVcbiAgICogQ2FsbGVkIGJ5IHN0ZXBwZXIgY29tcG9uZW50IGFmdGVyIHNhdmVBcHBEYXRhU3RlcCBjb21wbGV0ZXNcbiAgICovXG4gIHB1YmxpYyBjbGVhclNhdmluZ0FmdGVyQWN0aW9uc1N0YXRlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzU2F2aW5nQWZ0ZXJBY3Rpb25zKSB7XG4gICAgICB0aGlzLmlzU2F2aW5nQWZ0ZXJBY3Rpb25zID0gZmFsc2U7XG4gICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuICB9XG4gIGxvYWRpbmdNZXNzYWdlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbn1cbiIsIjxkaXYgKm5nSWY9XCJpc0xvYWRpbmdcIiBjbGFzcz1cImxvYWRpbmctb3ZlcmxheVwiPlxuICA8bWF0LXNwaW5uZXI+PC9tYXQtc3Bpbm5lcj5cbjwvZGl2PlxuPGRpdiBbaGlkZGVuXT1cImlzTG9hZGluZ1wiPlxuICA8ZGl2ICpuZ0lmPVwic2hvd0xhbmd1YWdlU2VsZWN0b3JcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwicmlnaHQtYWxpZ25lZFwiPlxuICAgIDxidXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT1cImZsYWdzXCIgbWF0LWljb24tYnV0dG9uIGNsYXNzPVwibS1yLTVcIj5cbiAgICAgIDxpbWdcbiAgICAgICAgW3NyY109XCJyZXR1cm5GTGFnKGN1cnJlbnRMYW5ndWFnZUlzbylcIlxuICAgICAgICBjbGFzcz1cInJvdW5kZWQtY2lyY2xlIG9iamVjdC1jb3ZlciBpY29uLTIwXCJcbiAgICAgIC8+XG4gICAgPC9idXR0b24+XG4gICAgPG1hdC1tZW51ICNmbGFncz1cIm1hdE1lbnVcIiBjbGFzcz1cImNhcmRXaXRoU2hhZG93XCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIG1hdC1tZW51LWl0ZW1cbiAgICAgICAgKm5nRm9yPVwibGV0IGxhbmcgb2YgYXBwbGljYXRpb25MYW5ndWFnZXMoKVwiXG4gICAgICAgIChjbGljayk9XCJjaGFuZ2VMYW5ndWFnZShsYW5nLmlzbylcIlxuICAgICAgPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgIFtzcmNdPVwicmV0dXJuRkxhZyhsYW5nLmlzbylcIlxuICAgICAgICAgICAgY2xhc3M9XCJyb3VuZGVkLWNpcmNsZSBvYmplY3QtY292ZXIgaWNvbi0yMFwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdC1zdWJ0aXRsZS0xIGYtcy0xNFwiPnt7IGxhbmcubmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L21hdC1tZW51PlxuICA8L2Rpdj5cblxuICA8YnIgLz5cbiAgPGRpdiBjbGFzcz1cImZvcm0tY29udGFpbmVyXCI+XG4gICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtXCIgKG5nU3VibWl0KT1cInN1Ym1pdCgpXCI+XG4gICAgICA8Zm9ybWx5LWZvcm1cbiAgICAgICAgW21vZGVsXT1cIm1vZGVsXCJcbiAgICAgICAgW2ZpZWxkc109XCJmb3JtbHlDb25maWdcIlxuICAgICAgICBbb3B0aW9uc109XCJvcHRpb25zXCJcbiAgICAgICAgW2Zvcm1dPVwiZm9ybVwiXG4gICAgICA+PC9mb3JtbHktZm9ybT5cbiAgICA8L2Zvcm0+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=