@alfresco/adf-process-services-cloud 7.1.0-15297936594 → 8.0.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 (212) hide show
  1. package/bundles/assets/adf-process-services-cloud/i18n/de.json +2 -2
  2. package/fesm2022/adf-process-services-cloud.mjs +829 -720
  3. package/fesm2022/adf-process-services-cloud.mjs.map +1 -1
  4. package/lib/app/components/app-list-cloud/app-list-cloud.component.scss +3 -3
  5. package/lib/common/date-range-filter/date-range-filter.service.d.ts +1 -1
  6. package/lib/flex.scss +81 -0
  7. package/lib/form/components/form-cloud.component.d.ts +4 -4
  8. package/lib/form/components/form-cloud.component.scss +16 -4
  9. package/lib/form/components/widgets/data-table/data-table-adapter.widget.d.ts +1 -2
  10. package/lib/form/components/widgets/data-table/data-table.widget.d.ts +1 -0
  11. package/lib/form/components/widgets/data-table/data-table.widget.scss +8 -0
  12. package/lib/form/components/widgets/data-table/helpers/data-table-path-parser.helper.d.ts +2 -1
  13. package/lib/form/components/widgets/date/date-cloud.widget.scss +10 -4
  14. package/lib/form/components/widgets/display-external-property/display-external-property.widget.scss +1 -1
  15. package/lib/form/components/widgets/display-rich-text/display-rich-text.widget.scss +0 -2
  16. package/lib/form/components/widgets/dropdown/dropdown-cloud.widget.d.ts +2 -0
  17. package/lib/form/components/widgets/dropdown/dropdown-cloud.widget.scss +2 -2
  18. package/lib/form/components/widgets/radio-buttons/radio-buttons-cloud.widget.scss +1 -2
  19. package/lib/group/components/group-cloud.component.d.ts +3 -1
  20. package/lib/group/components/group-cloud.component.scss +5 -5
  21. package/lib/mat-selectors.scss +9 -0
  22. package/lib/models/constant-values.type.d.ts +19 -0
  23. package/lib/models/process-definition-cloud.model.d.ts +2 -0
  24. package/lib/models/task-cloud.model.d.ts +2 -0
  25. package/lib/people/components/people-cloud.component.d.ts +3 -1
  26. package/lib/people/components/people-cloud.component.scss +6 -6
  27. package/lib/process/process-filters/components/edit-process-filter/edit-process-filter-cloud.component.scss +7 -7
  28. package/lib/process/process-filters/models/process-filter-cloud.model.d.ts +1 -0
  29. package/lib/process/process-header/components/process-header-cloud.component.scss +1 -1
  30. package/lib/process/start-process/components/start-process-cloud.component.d.ts +4 -2
  31. package/lib/process-services-cloud.module.d.ts +12 -0
  32. package/lib/providers.d.ts +36 -0
  33. package/lib/screen/components/screen-cloud/screen-cloud.component.d.ts +10 -1
  34. package/lib/screen/models/screen-cloud.model.d.ts +7 -3
  35. package/lib/services/web-socket.service.d.ts +2 -5
  36. package/lib/task/models/task-details-cloud.model.d.ts +1 -0
  37. package/lib/task/task-filters/components/base-task-filters-cloud.component.d.ts +1 -1
  38. package/lib/task/task-filters/components/edit-task-filters/base-edit-task-filter-cloud.component.d.ts +1 -1
  39. package/lib/task/task-filters/components/edit-task-filters/edit-service-task-filter/edit-service-task-filter-cloud.component.scss +7 -7
  40. package/lib/task/task-filters/components/edit-task-filters/edit-task-filter/edit-task-filter-cloud.component.scss +7 -7
  41. package/lib/task/task-filters/components/task-assignment-filter/task-assignment-filter.component.scss +4 -4
  42. package/lib/task/task-form/components/task-form-cloud/task-form-cloud.component.scss +3 -3
  43. package/lib/task/task-form/components/user-task-cloud/user-task-cloud.component.d.ts +11 -3
  44. package/lib/task/task-header/components/task-header-cloud.component.scss +2 -2
  45. package/lib/task/task-list/components/base-task-list-cloud.component.d.ts +1 -1
  46. package/package.json +5 -8
  47. package/public-api.d.ts +1 -0
  48. package/esm2022/adf-process-services-cloud.mjs +0 -5
  49. package/esm2022/lib/app/app-list-cloud.module.mjs +0 -20
  50. package/esm2022/lib/app/components/app-details-cloud/app-details-cloud.component.mjs +0 -67
  51. package/esm2022/lib/app/components/app-list-cloud/app-list-cloud.component.mjs +0 -126
  52. package/esm2022/lib/app/models/application-instance.model.mjs +0 -24
  53. package/esm2022/lib/app/public-api.mjs +0 -22
  54. package/esm2022/lib/app/services/apps-process-cloud.service.mjs +0 -97
  55. package/esm2022/lib/common/date-range-filter/date-range-filter.component.mjs +0 -164
  56. package/esm2022/lib/common/date-range-filter/date-range-filter.service.mjs +0 -97
  57. package/esm2022/lib/common/index.mjs +0 -18
  58. package/esm2022/lib/common/interface/environment.interface.mjs +0 -18
  59. package/esm2022/lib/common/interface/index.mjs +0 -18
  60. package/esm2022/lib/common/interface/public-api.mjs +0 -18
  61. package/esm2022/lib/common/public-api.mjs +0 -19
  62. package/esm2022/lib/form/components/cloud-form-rendering.service.mjs +0 -57
  63. package/esm2022/lib/form/components/form-cloud-custom-outcomes.component.mjs +0 -31
  64. package/esm2022/lib/form/components/form-cloud.component.mjs +0 -394
  65. package/esm2022/lib/form/components/form-definition-selector-cloud.component.mjs +0 -54
  66. package/esm2022/lib/form/components/spinner/form-spinner.component.mjs +0 -36
  67. package/esm2022/lib/form/components/widgets/attach-file/attach-file-cloud-widget.component.mjs +0 -250
  68. package/esm2022/lib/form/components/widgets/attach-file/file-properties-table/file-properties-table-cloud.component.mjs +0 -137
  69. package/esm2022/lib/form/components/widgets/data-table/data-table-adapter.widget.mjs +0 -111
  70. package/esm2022/lib/form/components/widgets/data-table/data-table.widget.mjs +0 -119
  71. package/esm2022/lib/form/components/widgets/data-table/helpers/data-table-path-parser.helper.mjs +0 -122
  72. package/esm2022/lib/form/components/widgets/date/date-cloud.widget.mjs +0 -189
  73. package/esm2022/lib/form/components/widgets/display-external-property/display-external-property.widget.mjs +0 -86
  74. package/esm2022/lib/form/components/widgets/display-rich-text/display-rich-text.widget.mjs +0 -80
  75. package/esm2022/lib/form/components/widgets/dropdown/dropdown-cloud.widget.mjs +0 -451
  76. package/esm2022/lib/form/components/widgets/dropdown/validators.mjs +0 -29
  77. package/esm2022/lib/form/components/widgets/file-viewer/file-viewer.widget.mjs +0 -47
  78. package/esm2022/lib/form/components/widgets/group/group-cloud.widget.mjs +0 -83
  79. package/esm2022/lib/form/components/widgets/people/people-cloud.widget.mjs +0 -91
  80. package/esm2022/lib/form/components/widgets/properties-viewer/properties-viewer-wrapper/properties-viewer-wrapper.component.mjs +0 -81
  81. package/esm2022/lib/form/components/widgets/properties-viewer/properties-viewer.widget.mjs +0 -54
  82. package/esm2022/lib/form/components/widgets/radio-buttons/radio-buttons-cloud.schema.mjs +0 -86
  83. package/esm2022/lib/form/components/widgets/radio-buttons/radio-buttons-cloud.widget.mjs +0 -117
  84. package/esm2022/lib/form/components/widgets/upload/upload-cloud.widget.mjs +0 -188
  85. package/esm2022/lib/form/form-cloud.module.mjs +0 -103
  86. package/esm2022/lib/form/models/form-cloud-representation.model.mjs +0 -48
  87. package/esm2022/lib/form/models/task-variable-cloud.model.mjs +0 -28
  88. package/esm2022/lib/form/public-api.mjs +0 -44
  89. package/esm2022/lib/form/services/content-cloud-node-selector.service.mjs +0 -120
  90. package/esm2022/lib/form/services/display-mode.service.mjs +0 -146
  91. package/esm2022/lib/form/services/form-cloud.service.interface.mjs +0 -18
  92. package/esm2022/lib/form/services/form-cloud.service.mjs +0 -201
  93. package/esm2022/lib/form/services/form-definition-selector-cloud.service.interface.mjs +0 -18
  94. package/esm2022/lib/form/services/form-definition-selector-cloud.service.mjs +0 -51
  95. package/esm2022/lib/form/services/form-utils.service.mjs +0 -37
  96. package/esm2022/lib/form/services/process-cloud-content.service.mjs +0 -71
  97. package/esm2022/lib/form/services/spinner/form-cloud-spinner.service.mjs +0 -50
  98. package/esm2022/lib/group/components/group-cloud.component.mjs +0 -422
  99. package/esm2022/lib/group/group-cloud.module.mjs +0 -33
  100. package/esm2022/lib/group/models/identity-group.model.mjs +0 -18
  101. package/esm2022/lib/group/public-api.mjs +0 -21
  102. package/esm2022/lib/group/services/identity-group.service.mjs +0 -89
  103. package/esm2022/lib/models/application-version.model.mjs +0 -21
  104. package/esm2022/lib/models/data-column-custom-data.mjs +0 -18
  105. package/esm2022/lib/models/date-cloud-filter.model.mjs +0 -31
  106. package/esm2022/lib/models/date-format-cloud.model.mjs +0 -18
  107. package/esm2022/lib/models/engine-event-cloud.model.mjs +0 -18
  108. package/esm2022/lib/models/filter-cloud-model.mjs +0 -128
  109. package/esm2022/lib/models/process-definition-cloud.model.mjs +0 -31
  110. package/esm2022/lib/models/process-instance-variable.model.mjs +0 -18
  111. package/esm2022/lib/models/process-variable-filter.model.mjs +0 -18
  112. package/esm2022/lib/models/task-cloud.model.mjs +0 -23
  113. package/esm2022/lib/models/task-list-sorting.model.mjs +0 -40
  114. package/esm2022/lib/models/variable-definition.mjs +0 -18
  115. package/esm2022/lib/people/components/people-cloud.component.mjs +0 -497
  116. package/esm2022/lib/people/models/identity-user.model.mjs +0 -18
  117. package/esm2022/lib/people/people-cloud.module.mjs +0 -33
  118. package/esm2022/lib/people/public-api.mjs +0 -21
  119. package/esm2022/lib/people/services/identity-user.service.mjs +0 -119
  120. package/esm2022/lib/process/process-cloud.module.mjs +0 -40
  121. package/esm2022/lib/process/process-filters/components/edit-process-filter/edit-process-filter-cloud.component.mjs +0 -802
  122. package/esm2022/lib/process/process-filters/components/process-filter-dialog/process-filter-dialog-cloud.component.mjs +0 -59
  123. package/esm2022/lib/process/process-filters/components/process-filters/process-filters-cloud.component.mjs +0 -290
  124. package/esm2022/lib/process/process-filters/models/process-filter-cloud.model.mjs +0 -169
  125. package/esm2022/lib/process/process-filters/process-filters-cloud.module.mjs +0 -44
  126. package/esm2022/lib/process/process-filters/public-api.mjs +0 -23
  127. package/esm2022/lib/process/process-filters/services/process-filter-cloud.service.mjs +0 -405
  128. package/esm2022/lib/process/process-header/components/process-header-cloud.component.mjs +0 -137
  129. package/esm2022/lib/process/process-header/process-header-cloud.module.mjs +0 -33
  130. package/esm2022/lib/process/process-header/public-api.mjs +0 -19
  131. package/esm2022/lib/process/process-list/components/process-list-cloud.component.mjs +0 -583
  132. package/esm2022/lib/process/process-list/datatable/process-list-datatable-adapter.mjs +0 -31
  133. package/esm2022/lib/process/process-list/models/perocess-instance-cloud-view.model.mjs +0 -18
  134. package/esm2022/lib/process/process-list/models/process-cloud-preferences.mjs +0 -24
  135. package/esm2022/lib/process/process-list/models/process-cloud-preset.model.mjs +0 -37
  136. package/esm2022/lib/process/process-list/models/process-cloud-query-request.model.mjs +0 -107
  137. package/esm2022/lib/process/process-list/models/process-list-sorting.model.mjs +0 -40
  138. package/esm2022/lib/process/process-list/process-list-cloud.module.mjs +0 -45
  139. package/esm2022/lib/process/process-list/public-api.mjs +0 -25
  140. package/esm2022/lib/process/process-list/services/process-list-cloud.service.mjs +0 -253
  141. package/esm2022/lib/process/process-list/services/process-task-list-cloud.service.mjs +0 -109
  142. package/esm2022/lib/process/public-api.mjs +0 -23
  143. package/esm2022/lib/process/services/process-cloud.service.mjs +0 -105
  144. package/esm2022/lib/process/start-process/components/start-process-cloud.component.mjs +0 -444
  145. package/esm2022/lib/process/start-process/models/process-instance-cloud.model.mjs +0 -18
  146. package/esm2022/lib/process/start-process/models/process-payload-cloud.model.mjs +0 -26
  147. package/esm2022/lib/process/start-process/models/process-with-form-payload-cloud.model.mjs +0 -26
  148. package/esm2022/lib/process/start-process/public-api.mjs +0 -21
  149. package/esm2022/lib/process/start-process/services/start-process-cloud.service.mjs +0 -125
  150. package/esm2022/lib/process-services-cloud.module.mjs +0 -91
  151. package/esm2022/lib/rich-text-editor/editorjs-config.mjs +0 -101
  152. package/esm2022/lib/rich-text-editor/index.mjs +0 -18
  153. package/esm2022/lib/rich-text-editor/public-api.mjs +0 -19
  154. package/esm2022/lib/rich-text-editor/rich-text-editor.component.mjs +0 -80
  155. package/esm2022/lib/rich-text-editor/rich-text-editor.module.mjs +0 -33
  156. package/esm2022/lib/screen/components/screen-cloud/screen-cloud.component.mjs +0 -154
  157. package/esm2022/lib/screen/models/screen-cloud.model.mjs +0 -18
  158. package/esm2022/lib/screen/public-api.mjs +0 -18
  159. package/esm2022/lib/services/base-cloud.service.mjs +0 -83
  160. package/esm2022/lib/services/cloud-token.service.mjs +0 -23
  161. package/esm2022/lib/services/form-fields.interfaces.mjs +0 -55
  162. package/esm2022/lib/services/local-preference-cloud.service.mjs +0 -115
  163. package/esm2022/lib/services/notification-cloud.service.mjs +0 -45
  164. package/esm2022/lib/services/preference-cloud.interface.mjs +0 -18
  165. package/esm2022/lib/services/public-api.mjs +0 -28
  166. package/esm2022/lib/services/screen-rendering.service.mjs +0 -30
  167. package/esm2022/lib/services/task-list-cloud.service.interface.mjs +0 -18
  168. package/esm2022/lib/services/user-preference-cloud.service.mjs +0 -105
  169. package/esm2022/lib/services/variable-mapper.sevice.mjs +0 -77
  170. package/esm2022/lib/services/web-socket.service.mjs +0 -182
  171. package/esm2022/lib/task/models/start-task-cloud-request.model.mjs +0 -32
  172. package/esm2022/lib/task/models/task-details-cloud.model.mjs +0 -26
  173. package/esm2022/lib/task/models/task.model.mjs +0 -23
  174. package/esm2022/lib/task/public-api.mjs +0 -26
  175. package/esm2022/lib/task/services/task-cloud.service.mjs +0 -272
  176. package/esm2022/lib/task/task-cloud.module.mjs +0 -45
  177. package/esm2022/lib/task/task-filters/components/base-task-filters-cloud.component.mjs +0 -59
  178. package/esm2022/lib/task/task-filters/components/edit-task-filters/base-edit-task-filter-cloud.component.mjs +0 -467
  179. package/esm2022/lib/task/task-filters/components/edit-task-filters/edit-service-task-filter/edit-service-task-filter-cloud.component.mjs +0 -206
  180. package/esm2022/lib/task/task-filters/components/edit-task-filters/edit-task-filter/edit-task-filter-cloud.component.mjs +0 -320
  181. package/esm2022/lib/task/task-filters/components/service-task-filters/service-task-filters-cloud.component.mjs +0 -147
  182. package/esm2022/lib/task/task-filters/components/task-assignment-filter/task-assignment-filter.component.mjs +0 -143
  183. package/esm2022/lib/task/task-filters/components/task-filter-dialog/task-filter-dialog-cloud.component.mjs +0 -73
  184. package/esm2022/lib/task/task-filters/components/task-filters/task-filters-cloud.component.mjs +0 -256
  185. package/esm2022/lib/task/task-filters/models/filter-cloud.model.mjs +0 -207
  186. package/esm2022/lib/task/task-filters/public-api.mjs +0 -27
  187. package/esm2022/lib/task/task-filters/services/service-task-filter-cloud.service.mjs +0 -283
  188. package/esm2022/lib/task/task-filters/services/task-filter-cloud.service.mjs +0 -392
  189. package/esm2022/lib/task/task-filters/task-filters-cloud.module.mjs +0 -56
  190. package/esm2022/lib/task/task-form/components/task-form-cloud/task-form-cloud.component.mjs +0 -199
  191. package/esm2022/lib/task/task-form/components/user-task-cloud/complete-task/complete-task.directive.mjs +0 -89
  192. package/esm2022/lib/task/task-form/components/user-task-cloud/user-task-cloud.component.mjs +0 -259
  193. package/esm2022/lib/task/task-form/components/user-task-cloud-buttons/claim-task/claim-task-cloud.directive.mjs +0 -101
  194. package/esm2022/lib/task/task-form/components/user-task-cloud-buttons/unclaim-task/unclaim-task-cloud.directive.mjs +0 -87
  195. package/esm2022/lib/task/task-form/components/user-task-cloud-buttons/user-task-cloud-buttons.component.mjs +0 -79
  196. package/esm2022/lib/task/task-form/public-api.mjs +0 -21
  197. package/esm2022/lib/task/task-form/task-form.module.mjs +0 -36
  198. package/esm2022/lib/task/task-header/components/task-header-cloud.component.mjs +0 -280
  199. package/esm2022/lib/task/task-header/public-api.mjs +0 -19
  200. package/esm2022/lib/task/task-header/task-header-cloud.module.mjs +0 -33
  201. package/esm2022/lib/task/task-list/components/base-task-list-cloud.component.mjs +0 -331
  202. package/esm2022/lib/task/task-list/components/service-task-list/service-task-list-cloud.component.mjs +0 -116
  203. package/esm2022/lib/task/task-list/components/task-list/datatable/task-list-datatable-adapter.mjs +0 -31
  204. package/esm2022/lib/task/task-list/components/task-list/task-list-cloud.component.mjs +0 -390
  205. package/esm2022/lib/task/task-list/models/service-task-cloud.model.mjs +0 -18
  206. package/esm2022/lib/task/task-list/models/task-cloud-view.model.mjs +0 -18
  207. package/esm2022/lib/task/task-list/public-api.mjs +0 -23
  208. package/esm2022/lib/task/task-list/services/service-task-list-cloud.service.mjs +0 -115
  209. package/esm2022/lib/task/task-list/services/task-list-cloud.service.mjs +0 -178
  210. package/esm2022/lib/task/task-list/task-list-cloud.module.mjs +0 -57
  211. package/esm2022/lib/types.mjs +0 -18
  212. package/esm2022/public-api.mjs +0 -40
@@ -1,444 +0,0 @@
1
- /*!
2
- * @license
3
- * Copyright © 2005-2025 Hyland Software, Inc. and its affiliates. All rights reserved.
4
- *
5
- * Licensed under the Apache License, Version 2.0 (the "License");
6
- * you may not use this file except in compliance with the License.
7
- * You may obtain a copy of the License at
8
- *
9
- * http://www.apache.org/licenses/LICENSE-2.0
10
- *
11
- * Unless required by applicable law or agreed to in writing, software
12
- * distributed under the License is distributed on an "AS IS" BASIS,
13
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
- * See the License for the specific language governing permissions and
15
- * limitations under the License.
16
- */
17
- import { Component, DestroyRef, EventEmitter, HostListener, inject, Input, Output, ViewChild, ViewEncapsulation } from '@angular/core';
18
- import { InplaceFormInputComponent, LocalizedDatePipe, TranslationService } from '@alfresco/adf-core';
19
- import { FormControl, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms';
20
- import { MatAutocompleteModule, MatAutocompleteTrigger } from '@angular/material/autocomplete';
21
- import { catchError, debounceTime, map } from 'rxjs/operators';
22
- import { ProcessPayloadCloud } from '../models/process-payload-cloud.model';
23
- import { ProcessWithFormPayloadCloud } from '../models/process-with-form-payload-cloud.model';
24
- import { StartProcessCloudService } from '../services/start-process-cloud.service';
25
- import { BehaviorSubject, forkJoin, of, combineLatest } from 'rxjs';
26
- import { ProcessDefinitionCloud } from '../../../models/process-definition-cloud.model';
27
- import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
28
- import { getTime } from 'date-fns';
29
- import { CommonModule } from '@angular/common';
30
- import { TranslateModule } from '@ngx-translate/core';
31
- import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
32
- import { MatCardModule } from '@angular/material/card';
33
- import { MatButtonModule } from '@angular/material/button';
34
- import { MatIconModule } from '@angular/material/icon';
35
- import { MatInputModule } from '@angular/material/input';
36
- import { MatOptionModule } from '@angular/material/core';
37
- import { FormCloudComponent } from '../../../form/components/form-cloud.component';
38
- import { FormCustomOutcomesComponent } from '../../../form/components/form-cloud-custom-outcomes.component';
39
- import * as i0 from "@angular/core";
40
- import * as i1 from "@alfresco/adf-core";
41
- import * as i2 from "@angular/common";
42
- import * as i3 from "@ngx-translate/core";
43
- import * as i4 from "@angular/material/progress-spinner";
44
- import * as i5 from "@angular/material/card";
45
- import * as i6 from "@angular/material/button";
46
- import * as i7 from "@angular/material/icon";
47
- import * as i8 from "@angular/material/input";
48
- import * as i9 from "@angular/material/form-field";
49
- import * as i10 from "@angular/material/core";
50
- import * as i11 from "@angular/material/autocomplete";
51
- import * as i12 from "@angular/forms";
52
- const MAX_NAME_LENGTH = 255;
53
- const PROCESS_DEFINITION_DEBOUNCE = 300;
54
- const DATE_TIME_IDENTIFIER_REG_EXP = new RegExp('%{datetime}', 'i');
55
- const PROCESS_DEFINITION_IDENTIFIER_REG_EXP = new RegExp('%{processdefinition}', 'i');
56
- export class StartProcessCloudComponent {
57
- get isProcessFormValid() {
58
- if (this.hasForm && this.isFormCloudLoaded) {
59
- return (this.formCloud ? !Object.keys(this.formCloud.values).length : false) || this.formCloud?.isValid || this.isProcessStarting;
60
- }
61
- else {
62
- return this.processForm.valid || this.isProcessStarting;
63
- }
64
- }
65
- get disableStartButton() {
66
- return !this.appName || !this.processDefinition.valid || this.isProcessStarting || this.isFormCloudLoading;
67
- }
68
- get isProcessDefinitionsEmpty() {
69
- return !this.processDefinitionList.length;
70
- }
71
- get processInstanceName() {
72
- return this.processForm.controls.processInstanceName;
73
- }
74
- get processDefinition() {
75
- return this.processForm.controls.processDefinition;
76
- }
77
- get hasForm() {
78
- return !!this.processDefinitionCurrent?.formKey;
79
- }
80
- get defaultStartProcessButtonLabel() {
81
- return this.translateService.instant('ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.FORM.ACTION.START').toUpperCase();
82
- }
83
- get defaultCancelProcessButtonLabel() {
84
- return this.translateService.instant('ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.FORM.ACTION.CANCEL').toUpperCase();
85
- }
86
- constructor(translateService) {
87
- this.translateService = translateService;
88
- /** (required) Name of the app. */
89
- this.appName = '';
90
- /** Maximum length of the process name. */
91
- this.maxNameLength = MAX_NAME_LENGTH;
92
- /** Name of the process. */
93
- this.name = '';
94
- /** Show/hide the process dropdown list. */
95
- this.showSelectProcessDropdown = true;
96
- /** Show/hide title. */
97
- this.showTitle = true;
98
- /** Show/hide cancel button. */
99
- this.showCancelButton = true;
100
- /** Emitted when the process is successfully started. */
101
- this.success = new EventEmitter();
102
- /** Emitted when the starting process is cancelled */
103
- this.cancel = new EventEmitter();
104
- /** Emitted when an error occurs. */
105
- this.error = new EventEmitter();
106
- /** Emitted when form content is clicked. */
107
- this.formContentClicked = new EventEmitter();
108
- /** Emitted when process definition selection changes. */
109
- this.processDefinitionSelection = new EventEmitter();
110
- this.processDefinitionList = [];
111
- this.errorMessageId = '';
112
- this.processPayloadCloud = new ProcessPayloadCloud();
113
- this.filteredProcesses = [];
114
- this.staticMappings = [];
115
- this.isProcessStarting = false;
116
- this.isFormCloudLoaded = false;
117
- this.isFormCloudLoading = false;
118
- this.processDefinitionLoaded = false;
119
- this.processForm = new FormGroup({
120
- processInstanceName: new FormControl('', [
121
- Validators.required,
122
- Validators.maxLength(this.getMaxNameLength()),
123
- Validators.pattern('^[^\\s]+(\\s+[^\\s]+)*$')
124
- ]),
125
- processDefinition: new FormControl('', [Validators.required, this.processDefinitionNameValidator()])
126
- });
127
- this.destroyRef = inject(DestroyRef);
128
- this.startProcessCloudService = inject(StartProcessCloudService);
129
- this.localizedDatePipe = inject(LocalizedDatePipe);
130
- this.displayStartSubject = new BehaviorSubject(null);
131
- this.hasVisibleOutcomesSubject = new BehaviorSubject(false);
132
- this.startProcessButtonLabel = this.defaultStartProcessButtonLabel;
133
- this.cancelButtonLabel = this.defaultCancelProcessButtonLabel;
134
- }
135
- ngOnInit() {
136
- this.processDefinition.setValue(this.processDefinitionName);
137
- this.processDefinition.valueChanges
138
- .pipe(debounceTime(PROCESS_DEFINITION_DEBOUNCE))
139
- .pipe(takeUntilDestroyed(this.destroyRef))
140
- .subscribe((processDefinitionName) => {
141
- this.selectProcessDefinitionByProcessDefinitionName(processDefinitionName);
142
- });
143
- this.showStartProcessButton$ = combineLatest([this.displayStartSubject, this.hasVisibleOutcomesSubject]).pipe(map(([displayStart, hasVisibleOutcomes]) => (displayStart !== null ? displayStart === 'true' : !hasVisibleOutcomes)));
144
- }
145
- ngOnChanges(changes) {
146
- if (changes['appName'] && changes['appName'].currentValue !== changes['appName'].previousValue) {
147
- this.appName = changes['appName'].currentValue;
148
- if (this.appName || this.appName === '') {
149
- this.loadProcessDefinitions();
150
- }
151
- }
152
- if (changes['values'] && changes['values'].currentValue !== changes['values'].previousValue) {
153
- this.resolvedValues = this.staticMappings.concat(this.values || []);
154
- }
155
- }
156
- onKeyDown(event) {
157
- event.stopPropagation();
158
- }
159
- onFormLoaded(form) {
160
- this.isFormCloudLoaded = true;
161
- this.formCloud = form;
162
- if (this.startForm) {
163
- this.hasVisibleOutcomesSubject.next(this.startForm.hasVisibleOutcomes);
164
- }
165
- }
166
- getMaxNameLength() {
167
- return this.maxNameLength > MAX_NAME_LENGTH ? MAX_NAME_LENGTH : this.maxNameLength;
168
- }
169
- selectProcessDefinitionByProcessDefinitionName(processDefinitionName) {
170
- this.filteredProcesses = this.getProcessDefinitionListByNameOrKey(processDefinitionName);
171
- if (this.isProcessFormValid && this.filteredProcesses && this.filteredProcesses.length === 1) {
172
- this.setProcessDefinitionOnForm(this.filteredProcesses[0].name);
173
- }
174
- }
175
- setProcessDefinitionOnForm(selectedProcessDefinitionName) {
176
- this.isFormCloudLoading = true;
177
- const processDefinitionCurrent = this.filteredProcesses.find((process) => process.name === selectedProcessDefinitionName || process.key === selectedProcessDefinitionName);
178
- forkJoin([
179
- this.startProcessCloudService
180
- .getStartEventFormStaticValuesMapping(this.appName, processDefinitionCurrent.id)
181
- .pipe(catchError(() => of([]))),
182
- this.startProcessCloudService
183
- .getStartEventConstants(this.appName, processDefinitionCurrent.id)
184
- .pipe(catchError(() => of([])))
185
- ]).subscribe(([staticMappings, constants]) => {
186
- this.staticMappings = staticMappings;
187
- this.resolvedValues = this.staticMappings.concat(this.values || []);
188
- this.processDefinitionCurrent = processDefinitionCurrent;
189
- this.isFormCloudLoading = false;
190
- const displayStart = constants?.find((constant) => constant.name === 'startEnabled');
191
- const startLabel = constants?.find((constant) => constant.name === 'startLabel');
192
- const displayCancel = constants?.find((constant) => constant.name === 'cancelEnabled');
193
- const cancelLabel = constants?.find((constant) => constant.name === 'cancelLabel');
194
- if (displayStart) {
195
- this.displayStartSubject.next(displayStart?.value);
196
- }
197
- if (startLabel) {
198
- this.startProcessButtonLabel = startLabel?.value?.trim()?.length > 0 ? startLabel.value.trim() : this.defaultStartProcessButtonLabel;
199
- }
200
- if (displayCancel) {
201
- this.showCancelButton = displayCancel?.value === 'true' && this.showCancelButton;
202
- }
203
- if (cancelLabel) {
204
- this.cancelButtonLabel = cancelLabel?.value?.trim()?.length > 0 ? cancelLabel.value.trim() : this.defaultCancelProcessButtonLabel;
205
- }
206
- });
207
- this.isFormCloudLoaded = false;
208
- this.processPayloadCloud.processDefinitionKey = processDefinitionCurrent.key;
209
- }
210
- getProcessDefinitionListByNameOrKey(processDefinitionName) {
211
- return this.processDefinitionList.filter((processDefinitionCloud) => !processDefinitionName || this.getProcessDefinition(processDefinitionCloud, processDefinitionName));
212
- }
213
- getProcessIfExists(processDefinition) {
214
- let matchedProcess = this.processDefinitionList.find((option) => this.getProcessDefinition(option, processDefinition));
215
- if (!matchedProcess) {
216
- matchedProcess = new ProcessDefinitionCloud();
217
- }
218
- return matchedProcess;
219
- }
220
- getProcessDefinitionByName(processDefinitionName) {
221
- const matchedProcess = processDefinitionName ? this.getProcessIfExists(processDefinitionName) : this.processDefinitionList[0];
222
- return matchedProcess;
223
- }
224
- selectDefaultProcessDefinition() {
225
- const selectedProcess = this.getProcessDefinitionByName(this.processDefinitionName);
226
- if (selectedProcess) {
227
- this.processDefinition.setValue(selectedProcess.name);
228
- this.processDefinitionSelectionChanged(selectedProcess);
229
- }
230
- }
231
- loadProcessDefinitions() {
232
- this.resetErrorMessage();
233
- this.startProcessCloudService
234
- .getProcessDefinitions(this.appName)
235
- .pipe(takeUntilDestroyed(this.destroyRef))
236
- .subscribe((processDefinitionRepresentations) => {
237
- this.processDefinitionList = processDefinitionRepresentations;
238
- if (processDefinitionRepresentations.length === 1) {
239
- this.selectDefaultProcessDefinition();
240
- }
241
- else if (this.processDefinitionName) {
242
- this.processDefinition.setValue(this.processDefinitionName);
243
- const processDefinition = this.processDefinitionList.find((process) => process.name === this.processDefinitionName);
244
- if (processDefinition) {
245
- this.filteredProcesses = this.getProcessDefinitionListByNameOrKey(processDefinition.name);
246
- this.setProcessDefinitionOnForm(processDefinition.name);
247
- this.processDefinitionSelectionChanged(processDefinition);
248
- }
249
- }
250
- this.processDefinitionLoaded = true;
251
- }, () => {
252
- this.errorMessageId = 'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.ERROR.LOAD_PROCESS_DEFS';
253
- });
254
- }
255
- isValidName(name) {
256
- return !!name;
257
- }
258
- getProcessDefinition(processDefinitionCloud, processDefinitionName) {
259
- return ((this.isValidName(processDefinitionCloud.name) &&
260
- processDefinitionCloud.name.toLowerCase().includes(processDefinitionName.toLowerCase())) ||
261
- processDefinitionCloud.key?.toLowerCase().includes(processDefinitionName.toLowerCase()));
262
- }
263
- buildProcessCloudPayload() {
264
- this.processPayloadCloud.name = this.processInstanceName.value;
265
- if (this.variables) {
266
- this.processPayloadCloud.variables = this.variables;
267
- }
268
- if (this.hasForm) {
269
- this.processPayloadCloud.variables = Object.assign(this.processPayloadCloud.variables, this.formCloud.values);
270
- }
271
- }
272
- onCustomOutcomeClicked(outcome) {
273
- this.customOutcome = outcome;
274
- this.startProcess();
275
- }
276
- startProcess() {
277
- this.isProcessStarting = true;
278
- const action = this.hasForm
279
- ? this.startProcessCloudService.startProcessWithForm(this.appName, this.processDefinitionCurrent.formKey, this.processDefinitionCurrent.version, new ProcessWithFormPayloadCloud({
280
- processName: this.processInstanceName.value,
281
- processDefinitionKey: this.processPayloadCloud.processDefinitionKey,
282
- variables: this.variables ?? {},
283
- values: this.formCloud.values,
284
- outcome: this.customOutcome
285
- }))
286
- : this.startProcessCloudService.startProcess(this.appName, new ProcessPayloadCloud({
287
- name: this.processInstanceName.value,
288
- processDefinitionKey: this.processPayloadCloud.processDefinitionKey,
289
- variables: this.variables ?? {}
290
- }));
291
- action.subscribe({
292
- next: (res) => {
293
- this.success.emit(res);
294
- this.isProcessStarting = false;
295
- },
296
- error: (err) => {
297
- this.errorMessageId = 'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.ERROR.START';
298
- this.unifyErrorResponse(err);
299
- this.error.emit(err);
300
- this.isProcessStarting = false;
301
- }
302
- });
303
- }
304
- unifyErrorResponse(err) {
305
- if (!err?.response?.body?.entry && err?.response?.body?.message) {
306
- err.response.body = {
307
- entry: JSON.parse(err.response.body.message)
308
- };
309
- }
310
- }
311
- cancelStartProcess() {
312
- this.cancel.emit();
313
- }
314
- resetErrorMessage() {
315
- this.errorMessageId = '';
316
- }
317
- resetProcessDefinitionList() {
318
- this.processDefinition.setValue('');
319
- this.filteredProcesses = this.processDefinitionList;
320
- }
321
- displayProcessNameOnDropdown(process) {
322
- if (process) {
323
- let processName = process;
324
- if (typeof process !== 'string') {
325
- processName = process.name;
326
- }
327
- return processName;
328
- }
329
- }
330
- displayDropdown(event) {
331
- event.stopPropagation();
332
- if (!this.inputAutocomplete.panelOpen) {
333
- this.resetProcessDefinitionList();
334
- this.inputAutocomplete.openPanel();
335
- }
336
- else {
337
- this.inputAutocomplete.closePanel();
338
- }
339
- }
340
- processDefinitionNameValidator() {
341
- return (control) => {
342
- const processDefinitionFieldValue = control.value;
343
- let processDefinitionNameError = false;
344
- if (processDefinitionFieldValue) {
345
- const processDefinition = this.getProcessIfExists(processDefinitionFieldValue);
346
- if (!processDefinition.key) {
347
- processDefinitionNameError = true;
348
- }
349
- }
350
- return processDefinitionNameError ? { 'invalid name': true } : null;
351
- };
352
- }
353
- getProcessDefinitionValue(process) {
354
- return process.name ? process.name : process.key;
355
- }
356
- onFormContentClicked(content) {
357
- this.formContentClicked.emit(content);
358
- }
359
- processDefinitionSelectionChanged(processDefinition) {
360
- if (processDefinition) {
361
- this.setDefaultProcessName(processDefinition.name);
362
- this.processDefinitionSelection.emit(processDefinition);
363
- }
364
- }
365
- setDefaultProcessName(processDefinitionName) {
366
- const processInstanceDetails = { processDefinitionName };
367
- const defaultProcessName = this.getDefaultProcessName(this.name, processInstanceDetails);
368
- this.processInstanceName.setValue(defaultProcessName);
369
- this.processInstanceName.markAsDirty();
370
- this.processInstanceName.markAsTouched();
371
- }
372
- getDefaultProcessName(processNameFormat, processInstance) {
373
- let processName = processNameFormat;
374
- if (processName.match(DATE_TIME_IDENTIFIER_REG_EXP)) {
375
- const presentDateTime = getTime(new Date());
376
- processName = processName.replace(DATE_TIME_IDENTIFIER_REG_EXP, this.localizedDatePipe.transform(presentDateTime, 'medium'));
377
- }
378
- if (processName.match(PROCESS_DEFINITION_IDENTIFIER_REG_EXP)) {
379
- const selectedProcessDefinitionName = processInstance ? processInstance.processDefinitionName : '';
380
- processName = processName.replace(PROCESS_DEFINITION_IDENTIFIER_REG_EXP, selectedProcessDefinitionName);
381
- }
382
- return processName;
383
- }
384
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: StartProcessCloudComponent, deps: [{ token: i1.TranslationService }], target: i0.ɵɵFactoryTarget.Component }); }
385
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.3", type: StartProcessCloudComponent, isStandalone: true, selector: "adf-cloud-start-process", inputs: { appName: "appName", maxNameLength: "maxNameLength", name: "name", processDefinitionName: "processDefinitionName", variables: "variables", values: "values", showSelectProcessDropdown: "showSelectProcessDropdown", showTitle: "showTitle", showCancelButton: "showCancelButton", displayModeConfigurations: "displayModeConfigurations" }, outputs: { success: "success", cancel: "cancel", error: "error", formContentClicked: "formContentClicked", processDefinitionSelection: "processDefinitionSelection" }, host: { listeners: { "keydown": "onKeyDown($event)" } }, providers: [LocalizedDatePipe], viewQueries: [{ propertyName: "inputAutocomplete", first: true, predicate: MatAutocompleteTrigger, descendants: true }, { propertyName: "startForm", first: true, predicate: ["startForm"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<mat-card appearance=\"outlined\" class=\"adf-start-process\" *ngIf=\"processDefinitionLoaded; else spinner\">\n\n <mat-card-content>\n <mat-card-title\n *ngIf=\"showTitle\"\n class=\"adf-title\">\n {{'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.FORM.TITLE' | translate}}\n </mat-card-title>\n\n <mat-card-subtitle id=\"error-message\" *ngIf=\"errorMessageId\">\n {{ errorMessageId | translate }}\n </mat-card-subtitle>\n\n <div *ngIf=\"!isProcessDefinitionsEmpty; else emptyProcessDefinitionsList\">\n <form [formGroup]=\"processForm\" class=\"adf-select-process-form\">\n <mat-form-field\n class=\"adf-process-input-container\"\n floatLabel=\"always\"\n *ngIf=\"showSelectProcessDropdown\"\n data-automation-id=\"adf-select-cloud-process-dropdown\">\n <mat-label class=\"adf-start-process-input-label\">{{ 'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.FORM.LABEL.TYPE' | translate }}</mat-label>\n <input\n matInput\n formControlName=\"processDefinition\"\n [matAutocomplete]=\"auto\"\n id=\"processDefinitionName\">\n <div class=\"adf-process-input-autocomplete\">\n <mat-autocomplete\n #auto=\"matAutocomplete\"\n id=\"processDefinitionOptions\"\n [displayWith]=\"displayProcessNameOnDropdown\"\n (optionSelected)=\"setProcessDefinitionOnForm($event.option.value)\" >\n <mat-option\n *ngFor=\"let processDef of filteredProcesses\"\n [value]=\"getProcessDefinitionValue(processDef)\"\n (click)=\"processDefinitionSelectionChanged(processDef)\">\n {{ getProcessDefinitionValue(processDef) }}\n </mat-option>\n </mat-autocomplete>\n <button\n id=\"adf-select-process-dropdown\"\n title=\"{{'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.FORM.SELECT_PROCESS_DROPDOWN' | translate}}\"\n mat-icon-button\n (click)=\"displayDropdown($event)\">\n <mat-icon>arrow_drop_down</mat-icon>\n </button>\n </div>\n <mat-error\n *ngIf=\"processDefinition.hasError('required')\"\n class=\"adf-error-pb\">\n {{ 'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.ERROR.PROCESS_DEFINITION_REQUIRED' | translate }}\n </mat-error>\n </mat-form-field>\n\n <adf-inplace-form-input [control]=\"processInstanceName\">\n <ng-container label>\n {{'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.FORM.LABEL.NAME' | translate}}\n </ng-container>\n\n <ng-container error>\n <span *ngIf=\"processInstanceName.hasError('required')\">\n {{ 'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.ERROR.PROCESS_NAME_REQUIRED' | translate }}\n </span>\n <span *ngIf=\"processInstanceName.hasError('maxlength')\" id=\"adf-start-process-maxlength-error\">\n {{ 'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.ERROR.MAXIMUM_LENGTH' | translate : { characters : maxNameLength } }}\n </span>\n <span *ngIf=\"processInstanceName.hasError('pattern')\">\n {{ 'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.ERROR.SPACE_VALIDATOR' | translate }}\n </span>\n </ng-container>\n </adf-inplace-form-input>\n </form>\n\n <ng-container *ngIf=\"hasForm else taskFormCloudButtons\">\n <adf-cloud-form\n #startForm\n [appName]=\"appName\"\n [appVersion]=\"processDefinitionCurrent.appVersion\"\n [data]=\"resolvedValues\"\n [formId]=\"processDefinitionCurrent.formKey\"\n [displayModeConfigurations]=\"displayModeConfigurations\"\n [showSaveButton]=\"false\"\n [showCompleteButton]=\"false\"\n [showRefreshButton]=\"false\"\n [showValidationIcon]=\"false\"\n [showTitle]=\"false\"\n (formContentClicked)=\"onFormContentClicked($event)\"\n (formLoaded)=\"onFormLoaded($event)\"\n (executeOutcome)=\"onCustomOutcomeClicked($event.outcome.name)\">\n <adf-cloud-form-custom-outcomes>\n <ng-template [ngTemplateOutlet]=\"taskFormCloudButtons\" />\n </adf-cloud-form-custom-outcomes>\n </adf-cloud-form>\n </ng-container>\n </div>\n\n </mat-card-content>\n\n</mat-card>\n\n<ng-template #taskFormCloudButtons>\n <div class=\"adf-start-process-cloud-actions\">\n <button\n *ngIf=\"showCancelButton\"\n mat-button\n (click)=\"cancelStartProcess()\"\n id=\"cancel_process\"\n >\n {{ cancelButtonLabel }}\n </button>\n <button\n *ngIf=\"showStartProcessButton$ | async\"\n color=\"primary\"\n mat-raised-button\n [disabled]=\"disableStartButton || !isProcessFormValid\"\n (click)=\"startProcess()\"\n data-automation-id=\"btn-start\"\n id=\"button-start\"\n class=\"adf-btn-start\"\n >\n {{ startProcessButtonLabel }}\n </button>\n </div>\n</ng-template>\n\n<ng-template #emptyProcessDefinitionsList>\n <mat-card-content *ngIf=\"processDefinitionLoaded\">\n <mat-card-subtitle class=\"error-message\" id=\"no-process-message\">\n {{ 'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.NO_PROCESS_DEFINITIONS' | translate | uppercase}}\n </mat-card-subtitle>\n </mat-card-content>\n</ng-template>\n\n<ng-template #spinner>\n <div class=\"adf-loading-container\">\n <mat-progress-spinner\n class=\"adf-loading\"\n color=\"primary\"\n mode=\"indeterminate\" />\n </div>\n</ng-template>\n", styles: [".adf-start-process .adf-start-process-input-label{color:var(--adf-theme-mat-grey-color-a200-dark)}.adf-start-process-cloud-actions{display:flex;justify-content:flex-end}.adf-select-process-form{display:flex;flex-direction:column}.adf-title{padding-bottom:1.25em}.adf-process-input-container{margin:0 7px}.adf-process-input-autocomplete{display:flex}.adf-process-input-autocomplete button{position:absolute;right:-14px;top:0}.adf-form-container .adf-form-container-card:has(.adf-form-container-card-content){box-shadow:none;padding:0}.adf-start-form-actions{text-align:right}.adf-loading{margin:auto}.adf-loading-container{min-height:300px;display:flex;height:100%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.UpperCasePipe, name: "uppercase" }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i4.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: MatCardModule }, { kind: "component", type: i5.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i5.MatCardContent, selector: "mat-card-content" }, { kind: "directive", type: i5.MatCardSubtitle, selector: "mat-card-subtitle, [mat-card-subtitle], [matCardSubtitle]" }, { kind: "directive", type: i5.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i6.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i6.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: InplaceFormInputComponent, selector: "adf-inplace-form-input", inputs: ["control"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i8.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i9.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i9.MatLabel, selector: "mat-label" }, { kind: "directive", type: i9.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "ngmodule", type: MatOptionModule }, { kind: "component", type: i10.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatAutocompleteModule }, { kind: "component", type: i11.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "directive", type: i11.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i12.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i12.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i12.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i12.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i12.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i12.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: FormCloudComponent, selector: "adf-cloud-form", inputs: ["appName", "appVersion", "formId", "processInstanceId", "taskId", "data", "displayModeConfigurations"], outputs: ["formSaved", "formCompleted", "formLoaded", "formDataRefreshed", "formContentClicked", "displayModeOn", "displayModeOff"] }, { kind: "component", type: FormCustomOutcomesComponent, selector: "adf-cloud-form-custom-outcomes" }], encapsulation: i0.ViewEncapsulation.None }); }
386
- }
387
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: StartProcessCloudComponent, decorators: [{
388
- type: Component,
389
- args: [{ selector: 'adf-cloud-start-process', standalone: true, imports: [
390
- CommonModule,
391
- TranslateModule,
392
- MatProgressSpinnerModule,
393
- MatCardModule,
394
- MatButtonModule,
395
- InplaceFormInputComponent,
396
- MatIconModule,
397
- MatInputModule,
398
- MatOptionModule,
399
- MatAutocompleteModule,
400
- ReactiveFormsModule,
401
- FormCloudComponent,
402
- FormCustomOutcomesComponent
403
- ], providers: [LocalizedDatePipe], encapsulation: ViewEncapsulation.None, template: "<mat-card appearance=\"outlined\" class=\"adf-start-process\" *ngIf=\"processDefinitionLoaded; else spinner\">\n\n <mat-card-content>\n <mat-card-title\n *ngIf=\"showTitle\"\n class=\"adf-title\">\n {{'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.FORM.TITLE' | translate}}\n </mat-card-title>\n\n <mat-card-subtitle id=\"error-message\" *ngIf=\"errorMessageId\">\n {{ errorMessageId | translate }}\n </mat-card-subtitle>\n\n <div *ngIf=\"!isProcessDefinitionsEmpty; else emptyProcessDefinitionsList\">\n <form [formGroup]=\"processForm\" class=\"adf-select-process-form\">\n <mat-form-field\n class=\"adf-process-input-container\"\n floatLabel=\"always\"\n *ngIf=\"showSelectProcessDropdown\"\n data-automation-id=\"adf-select-cloud-process-dropdown\">\n <mat-label class=\"adf-start-process-input-label\">{{ 'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.FORM.LABEL.TYPE' | translate }}</mat-label>\n <input\n matInput\n formControlName=\"processDefinition\"\n [matAutocomplete]=\"auto\"\n id=\"processDefinitionName\">\n <div class=\"adf-process-input-autocomplete\">\n <mat-autocomplete\n #auto=\"matAutocomplete\"\n id=\"processDefinitionOptions\"\n [displayWith]=\"displayProcessNameOnDropdown\"\n (optionSelected)=\"setProcessDefinitionOnForm($event.option.value)\" >\n <mat-option\n *ngFor=\"let processDef of filteredProcesses\"\n [value]=\"getProcessDefinitionValue(processDef)\"\n (click)=\"processDefinitionSelectionChanged(processDef)\">\n {{ getProcessDefinitionValue(processDef) }}\n </mat-option>\n </mat-autocomplete>\n <button\n id=\"adf-select-process-dropdown\"\n title=\"{{'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.FORM.SELECT_PROCESS_DROPDOWN' | translate}}\"\n mat-icon-button\n (click)=\"displayDropdown($event)\">\n <mat-icon>arrow_drop_down</mat-icon>\n </button>\n </div>\n <mat-error\n *ngIf=\"processDefinition.hasError('required')\"\n class=\"adf-error-pb\">\n {{ 'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.ERROR.PROCESS_DEFINITION_REQUIRED' | translate }}\n </mat-error>\n </mat-form-field>\n\n <adf-inplace-form-input [control]=\"processInstanceName\">\n <ng-container label>\n {{'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.FORM.LABEL.NAME' | translate}}\n </ng-container>\n\n <ng-container error>\n <span *ngIf=\"processInstanceName.hasError('required')\">\n {{ 'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.ERROR.PROCESS_NAME_REQUIRED' | translate }}\n </span>\n <span *ngIf=\"processInstanceName.hasError('maxlength')\" id=\"adf-start-process-maxlength-error\">\n {{ 'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.ERROR.MAXIMUM_LENGTH' | translate : { characters : maxNameLength } }}\n </span>\n <span *ngIf=\"processInstanceName.hasError('pattern')\">\n {{ 'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.ERROR.SPACE_VALIDATOR' | translate }}\n </span>\n </ng-container>\n </adf-inplace-form-input>\n </form>\n\n <ng-container *ngIf=\"hasForm else taskFormCloudButtons\">\n <adf-cloud-form\n #startForm\n [appName]=\"appName\"\n [appVersion]=\"processDefinitionCurrent.appVersion\"\n [data]=\"resolvedValues\"\n [formId]=\"processDefinitionCurrent.formKey\"\n [displayModeConfigurations]=\"displayModeConfigurations\"\n [showSaveButton]=\"false\"\n [showCompleteButton]=\"false\"\n [showRefreshButton]=\"false\"\n [showValidationIcon]=\"false\"\n [showTitle]=\"false\"\n (formContentClicked)=\"onFormContentClicked($event)\"\n (formLoaded)=\"onFormLoaded($event)\"\n (executeOutcome)=\"onCustomOutcomeClicked($event.outcome.name)\">\n <adf-cloud-form-custom-outcomes>\n <ng-template [ngTemplateOutlet]=\"taskFormCloudButtons\" />\n </adf-cloud-form-custom-outcomes>\n </adf-cloud-form>\n </ng-container>\n </div>\n\n </mat-card-content>\n\n</mat-card>\n\n<ng-template #taskFormCloudButtons>\n <div class=\"adf-start-process-cloud-actions\">\n <button\n *ngIf=\"showCancelButton\"\n mat-button\n (click)=\"cancelStartProcess()\"\n id=\"cancel_process\"\n >\n {{ cancelButtonLabel }}\n </button>\n <button\n *ngIf=\"showStartProcessButton$ | async\"\n color=\"primary\"\n mat-raised-button\n [disabled]=\"disableStartButton || !isProcessFormValid\"\n (click)=\"startProcess()\"\n data-automation-id=\"btn-start\"\n id=\"button-start\"\n class=\"adf-btn-start\"\n >\n {{ startProcessButtonLabel }}\n </button>\n </div>\n</ng-template>\n\n<ng-template #emptyProcessDefinitionsList>\n <mat-card-content *ngIf=\"processDefinitionLoaded\">\n <mat-card-subtitle class=\"error-message\" id=\"no-process-message\">\n {{ 'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.NO_PROCESS_DEFINITIONS' | translate | uppercase}}\n </mat-card-subtitle>\n </mat-card-content>\n</ng-template>\n\n<ng-template #spinner>\n <div class=\"adf-loading-container\">\n <mat-progress-spinner\n class=\"adf-loading\"\n color=\"primary\"\n mode=\"indeterminate\" />\n </div>\n</ng-template>\n", styles: [".adf-start-process .adf-start-process-input-label{color:var(--adf-theme-mat-grey-color-a200-dark)}.adf-start-process-cloud-actions{display:flex;justify-content:flex-end}.adf-select-process-form{display:flex;flex-direction:column}.adf-title{padding-bottom:1.25em}.adf-process-input-container{margin:0 7px}.adf-process-input-autocomplete{display:flex}.adf-process-input-autocomplete button{position:absolute;right:-14px;top:0}.adf-form-container .adf-form-container-card:has(.adf-form-container-card-content){box-shadow:none;padding:0}.adf-start-form-actions{text-align:right}.adf-loading{margin:auto}.adf-loading-container{min-height:300px;display:flex;height:100%}\n"] }]
404
- }], ctorParameters: () => [{ type: i1.TranslationService }], propDecorators: { inputAutocomplete: [{
405
- type: ViewChild,
406
- args: [MatAutocompleteTrigger]
407
- }], startForm: [{
408
- type: ViewChild,
409
- args: ['startForm']
410
- }], appName: [{
411
- type: Input
412
- }], maxNameLength: [{
413
- type: Input
414
- }], name: [{
415
- type: Input
416
- }], processDefinitionName: [{
417
- type: Input
418
- }], variables: [{
419
- type: Input
420
- }], values: [{
421
- type: Input
422
- }], showSelectProcessDropdown: [{
423
- type: Input
424
- }], showTitle: [{
425
- type: Input
426
- }], showCancelButton: [{
427
- type: Input
428
- }], displayModeConfigurations: [{
429
- type: Input
430
- }], success: [{
431
- type: Output
432
- }], cancel: [{
433
- type: Output
434
- }], error: [{
435
- type: Output
436
- }], formContentClicked: [{
437
- type: Output
438
- }], processDefinitionSelection: [{
439
- type: Output
440
- }], onKeyDown: [{
441
- type: HostListener,
442
- args: ['keydown', ['$event']]
443
- }] } });
444
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhcnQtcHJvY2Vzcy1jbG91ZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWIvcHJvY2Vzcy1zZXJ2aWNlcy1jbG91ZC9zcmMvbGliL3Byb2Nlc3Mvc3RhcnQtcHJvY2Vzcy9jb21wb25lbnRzL3N0YXJ0LXByb2Nlc3MtY2xvdWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGliL3Byb2Nlc3Mtc2VydmljZXMtY2xvdWQvc3JjL2xpYi9wcm9jZXNzL3N0YXJ0LXByb2Nlc3MvY29tcG9uZW50cy9zdGFydC1wcm9jZXNzLWNsb3VkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFDSCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFHTCxNQUFNLEVBRU4sU0FBUyxFQUNULGlCQUFpQixFQUNwQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQStCLHlCQUF5QixFQUFFLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbkksT0FBTyxFQUFtQixXQUFXLEVBQUUsU0FBUyxFQUFFLG1CQUFtQixFQUFlLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZILE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQy9GLE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRS9ELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQzVFLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBQzlGLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHlD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QWtCO3NCQURqQixNQUFNO2dCQUtQLDBCQUEwQjtzQkFEekIsTUFBTTtnQkEwR1AsU0FBUztzQkFEUixZQUFZO3VCQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCDCqSAyMDA1LTIwMjUgSHlsYW5kIFNvZnR3YXJlLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgRGVzdHJveVJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSG9zdExpc3RlbmVyLFxuICAgIGluamVjdCxcbiAgICBJbnB1dCxcbiAgICBPbkNoYW5nZXMsXG4gICAgT25Jbml0LFxuICAgIE91dHB1dCxcbiAgICBTaW1wbGVDaGFuZ2VzLFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3RW5jYXBzdWxhdGlvblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRlbnRMaW5rTW9kZWwsIEZvcm1Nb2RlbCwgSW5wbGFjZUZvcm1JbnB1dENvbXBvbmVudCwgTG9jYWxpemVkRGF0ZVBpcGUsIFRyYW5zbGF0aW9uU2VydmljZSB9IGZyb20gJ0BhbGZyZXNjby9hZGYtY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIFZhbGlkYXRvckZuLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0QXV0b2NvbXBsZXRlTW9kdWxlLCBNYXRBdXRvY29tcGxldGVUcmlnZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYXV0b2NvbXBsZXRlJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIGRlYm91bmNlVGltZSwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgUHJvY2Vzc0luc3RhbmNlQ2xvdWQgfSBmcm9tICcuLi9tb2RlbHMvcHJvY2Vzcy1pbnN0YW5jZS1jbG91ZC5tb2RlbCc7XG5pbXBvcnQgeyBQcm9jZXNzUGF5bG9hZENsb3VkIH0gZnJvbSAnLi4vbW9kZWxzL3Byb2Nlc3MtcGF5bG9hZC1jbG91ZC5tb2RlbCc7XG5pbXBvcnQgeyBQcm9jZXNzV2l0aEZvcm1QYXlsb2FkQ2xvdWQgfSBmcm9tICcuLi9tb2RlbHMvcHJvY2Vzcy13aXRoLWZvcm0tcGF5bG9hZC1jbG91ZC5tb2RlbCc7XG5pbXBvcnQgeyBTdGFydFByb2Nlc3NDbG91ZFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9zdGFydC1wcm9jZXNzLWNsb3VkLnNlcnZpY2UnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBmb3JrSm9pbiwgT2JzZXJ2YWJsZSwgb2YsIGNvbWJpbmVMYXRlc3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFByb2Nlc3NEZWZpbml0aW9uQ2xvdWQgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvcHJvY2Vzcy1kZWZpbml0aW9uLWNsb3VkLm1vZGVsJztcbmltcG9ydCB7IFRhc2tWYXJpYWJsZUNsb3VkIH0gZnJvbSAnLi4vLi4vLi4vZm9ybS9tb2RlbHMvdGFzay12YXJpYWJsZS1jbG91ZC5tb2RlbCc7XG5pbXBvcnQgeyBGb3JtQ2xvdWREaXNwbGF5TW9kZUNvbmZpZ3VyYXRpb24gfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9mb3JtLWZpZWxkcy5pbnRlcmZhY2VzJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IGdldFRpbWUgfSBmcm9tICdkYXRlLWZucyc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBNYXRQcm9ncmVzc1NwaW5uZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wcm9ncmVzcy1zcGlubmVyJztcbmltcG9ydCB7IE1hdENhcmRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jYXJkJztcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBNYXRJbnB1dE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcbmltcG9ydCB7IE1hdE9wdGlvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUNsb3VkQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vZm9ybS9jb21wb25lbnRzL2Zvcm0tY2xvdWQuY29tcG9uZW50JztcbmltcG9ydCB7IEZvcm1DdXN0b21PdXRjb21lc0NvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2Zvcm0vY29tcG9uZW50cy9mb3JtLWNsb3VkLWN1c3RvbS1vdXRjb21lcy5jb21wb25lbnQnO1xuXG5jb25zdCBNQVhfTkFNRV9MRU5HVEg6IG51bWJlciA9IDI1NTtcbmNvbnN0IFBST0NFU1NfREVGSU5JVElPTl9ERUJPVU5DRTogbnVtYmVyID0gMzAwO1xuY29uc3QgREFURV9USU1FX0lERU5USUZJRVJfUkVHX0VYUCA9IG5ldyBSZWdFeHAoJyV7ZGF0ZXRpbWV9JywgJ2knKTtcbmNvbnN0IFBST0NFU1NfREVGSU5JVElPTl9JREVOVElGSUVSX1JFR19FWFAgPSBuZXcgUmVnRXhwKCcle3Byb2Nlc3NkZWZpbml0aW9ufScsICdpJyk7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYWRmLWNsb3VkLXN0YXJ0LXByb2Nlc3MnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBDb21tb25Nb2R1bGUsXG4gICAgICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICAgICAgTWF0UHJvZ3Jlc3NTcGlubmVyTW9kdWxlLFxuICAgICAgICBNYXRDYXJkTW9kdWxlLFxuICAgICAgICBNYXRCdXR0b25Nb2R1bGUsXG4gICAgICAgIElucGxhY2VGb3JtSW5wdXRDb21wb25lbnQsXG4gICAgICAgIE1hdEljb25Nb2R1bGUsXG4gICAgICAgIE1hdElucHV0TW9kdWxlLFxuICAgICAgICBNYXRPcHRpb25Nb2R1bGUsXG4gICAgICAgIE1hdEF1dG9jb21wbGV0ZU1vZHVsZSxcbiAgICAgICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICAgICAgRm9ybUNsb3VkQ29tcG9uZW50LFxuICAgICAgICBGb3JtQ3VzdG9tT3V0Y29tZXNDb21wb25lbnRcbiAgICBdLFxuICAgIHByb3ZpZGVyczogW0xvY2FsaXplZERhdGVQaXBlXSxcbiAgICB0ZW1wbGF0ZVVybDogJy4vc3RhcnQtcHJvY2Vzcy1jbG91ZC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vc3RhcnQtcHJvY2Vzcy1jbG91ZC5jb21wb25lbnQuc2NzcyddLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgU3RhcnRQcm9jZXNzQ2xvdWRDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uSW5pdCB7XG4gICAgQFZpZXdDaGlsZChNYXRBdXRvY29tcGxldGVUcmlnZ2VyKVxuICAgIGlucHV0QXV0b2NvbXBsZXRlOiBNYXRBdXRvY29tcGxldGVUcmlnZ2VyO1xuXG4gICAgQFZpZXdDaGlsZCgnc3RhcnRGb3JtJykgc3RhcnRGb3JtOiBGb3JtQ2xvdWRDb21wb25lbnQ7XG5cbiAgICAvKiogKHJlcXVpcmVkKSBOYW1lIG9mIHRoZSBhcHAuICovXG4gICAgQElucHV0KClcbiAgICBhcHBOYW1lOiBzdHJpbmcgPSAnJztcblxuICAgIC8qKiBNYXhpbXVtIGxlbmd0aCBvZiB0aGUgcHJvY2VzcyBuYW1lLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgbWF4TmFtZUxlbmd0aDogbnVtYmVyID0gTUFYX05BTUVfTEVOR1RIO1xuXG4gICAgLyoqIE5hbWUgb2YgdGhlIHByb2Nlc3MuICovXG4gICAgQElucHV0KClcbiAgICBuYW1lOiBzdHJpbmcgPSAnJztcblxuICAgIC8qKiBOYW1lIG9mIHRoZSBwcm9jZXNzIGRlZmluaXRpb24uICovXG4gICAgQElucHV0KClcbiAgICBwcm9jZXNzRGVmaW5pdGlvbk5hbWU6IHN0cmluZztcblxuICAgIC8qKiBWYXJpYWJsZXMgdG8gYXR0YWNoIHRvIHRoZSBwYXlsb2FkLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgdmFyaWFibGVzOiBhbnk7XG5cbiAgICAvKiogUGFyYW1ldGVyIHRvIHBhc3MgZm9ybSBmaWVsZCB2YWx1ZXMgaW4gdGhlIHN0YXJ0IGZvcm0gaWYgb25lIGlzIGFzc29jaWF0ZWQuICovXG4gICAgQElucHV0KClcbiAgICB2YWx1ZXM6IFRhc2tWYXJpYWJsZUNsb3VkW107XG5cbiAgICAvKiogU2hvdy9oaWRlIHRoZSBwcm9jZXNzIGRyb3Bkb3duIGxpc3QuICovXG4gICAgQElucHV0KClcbiAgICBzaG93U2VsZWN0UHJvY2Vzc0Ryb3Bkb3duOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIC8qKiBTaG93L2hpZGUgdGl0bGUuICovXG4gICAgQElucHV0KClcbiAgICBzaG93VGl0bGU6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgLyoqIFNob3cvaGlkZSBjYW5jZWwgYnV0dG9uLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2hvd0NhbmNlbEJ1dHRvbjogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYXZhaWxhYmxlIGRpc3BsYXkgY29uZmlndXJhdGlvbnMgZm9yIHRoZSBmb3JtLlxuICAgICAqIChzdGFydCBwcm9jZXNzIGV2ZW50IGNhbiBoYXZlIGFzc2lnbmVkIGZvcm0pXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBkaXNwbGF5TW9kZUNvbmZpZ3VyYXRpb25zOiBGb3JtQ2xvdWREaXNwbGF5TW9kZUNvbmZpZ3VyYXRpb25bXTtcblxuICAgIC8qKiBFbWl0dGVkIHdoZW4gdGhlIHByb2Nlc3MgaXMgc3VjY2Vzc2Z1bGx5IHN0YXJ0ZWQuICovXG4gICAgQE91dHB1dCgpXG4gICAgc3VjY2VzcyA9IG5ldyBFdmVudEVtaXR0ZXI8UHJvY2Vzc0luc3RhbmNlQ2xvdWQ+KCk7XG5cbiAgICAvKiogRW1pdHRlZCB3aGVuIHRoZSBzdGFydGluZyBwcm9jZXNzIGlzIGNhbmNlbGxlZCAqL1xuICAgIEBPdXRwdXQoKVxuICAgIGNhbmNlbCA9IG5ldyBFdmVudEVtaXR0ZXI8UHJvY2Vzc0luc3RhbmNlQ2xvdWQ+KCk7XG5cbiAgICAvKiogRW1pdHRlZCB3aGVuIGFuIGVycm9yIG9jY3Vycy4gKi9cbiAgICBAT3V0cHV0KClcbiAgICBlcnJvciA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gICAgLyoqIEVtaXR0ZWQgd2hlbiBmb3JtIGNvbnRlbnQgaXMgY2xpY2tlZC4gKi9cbiAgICBAT3V0cHV0KClcbiAgICBmb3JtQ29udGVudENsaWNrZWQ6IEV2ZW50RW1pdHRlcjxDb250ZW50TGlua01vZGVsPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIC8qKiBFbWl0dGVkIHdoZW4gcHJvY2VzcyBkZWZpbml0aW9uIHNlbGVjdGlvbiBjaGFuZ2VzLiAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHByb2Nlc3NEZWZpbml0aW9uU2VsZWN0aW9uOiBFdmVudEVtaXR0ZXI8UHJvY2Vzc0RlZmluaXRpb25DbG91ZD4gPSBuZXcgRXZlbnRFbWl0dGVyPFByb2Nlc3NEZWZpbml0aW9uQ2xvdWQ+KCk7XG5cbiAgICBwcm9jZXNzRGVmaW5pdGlvbkxpc3Q6IFByb2Nlc3NEZWZpbml0aW9uQ2xvdWRbXSA9IFtdO1xuICAgIHByb2Nlc3NEZWZpbml0aW9uQ3VycmVudD86IFByb2Nlc3NEZWZpbml0aW9uQ2xvdWQ7XG4gICAgZXJyb3JNZXNzYWdlSWQ6IHN0cmluZyA9ICcnO1xuICAgIHByb2Nlc3NQYXlsb2FkQ2xvdWQgPSBuZXcgUHJvY2Vzc1BheWxvYWRDbG91ZCgpO1xuICAgIGZpbHRlcmVkUHJvY2Vzc2VzOiBQcm9jZXNzRGVmaW5pdGlvbkNsb3VkW10gPSBbXTtcbiAgICBzdGF0aWNNYXBwaW5nczogVGFza1ZhcmlhYmxlQ2xvdWRbXSA9IFtdO1xuICAgIHJlc29sdmVkVmFsdWVzPzogVGFza1ZhcmlhYmxlQ2xvdWRbXTtcbiAgICBjdXN0b21PdXRjb21lOiBzdHJpbmc7XG5cbiAgICBpc1Byb2Nlc3NTdGFydGluZyA9IGZhbHNlO1xuICAgIGlzRm9ybUNsb3VkTG9hZGVkID0gZmFsc2U7XG4gICAgaXNGb3JtQ2xvdWRMb2FkaW5nID0gZmFsc2U7XG4gICAgcHJvY2Vzc0RlZmluaXRpb25Mb2FkZWQgPSBmYWxzZTtcblxuICAgIHNob3dTdGFydFByb2Nlc3NCdXR0b24kOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICAgIHN0YXJ0UHJvY2Vzc0J1dHRvbkxhYmVsOiBzdHJpbmc7XG4gICAgY2FuY2VsQnV0dG9uTGFiZWw6IHN0cmluZztcblxuICAgIGZvcm1DbG91ZD86IEZvcm1Nb2RlbDtcbiAgICBwcm9jZXNzRm9ybSA9IG5ldyBGb3JtR3JvdXAoe1xuICAgICAgICBwcm9jZXNzSW5zdGFuY2VOYW1lOiBuZXcgRm9ybUNvbnRyb2woJycsIFtcbiAgICAgICAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWQsXG4gICAgICAgICAgICBWYWxpZGF0b3JzLm1heExlbmd0aCh0aGlzLmdldE1heE5hbWVMZW5ndGgoKSksXG4gICAgICAgICAgICBWYWxpZGF0b3JzLnBhdHRlcm4oJ15bXlxcXFxzXSsoXFxcXHMrW15cXFxcc10rKSokJylcbiAgICAgICAgXSksXG4gICAgICAgIHByb2Nlc3NEZWZpbml0aW9uOiBuZXcgRm9ybUNvbnRyb2woJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCB0aGlzLnByb2Nlc3NEZWZpbml0aW9uTmFtZVZhbGlkYXRvcigpXSlcbiAgICB9KTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN0YXJ0UHJvY2Vzc0Nsb3VkU2VydmljZSA9IGluamVjdChTdGFydFByb2Nlc3NDbG91ZFNlcnZpY2UpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbG9jYWxpemVkRGF0ZVBpcGUgPSBpbmplY3QoTG9jYWxpemVkRGF0ZVBpcGUpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGlzcGxheVN0YXJ0U3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPihudWxsKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGhhc1Zpc2libGVPdXRjb21lc1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcblxuICAgIGdldCBpc1Byb2Nlc3NGb3JtVmFsaWQoKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLmhhc0Zvcm0gJiYgdGhpcy5pc0Zvcm1DbG91ZExvYWRlZCkge1xuICAgICAgICAgICAgcmV0dXJuICh0aGlzLmZvcm1DbG91ZCA/ICFPYmplY3Qua2V5cyh0aGlzLmZvcm1DbG91ZC52YWx1ZXMpLmxlbmd0aCA6IGZhbHNlKSB8fCB0aGlzLmZvcm1DbG91ZD8uaXNWYWxpZCB8fCB0aGlzLmlzUHJvY2Vzc1N0YXJ0aW5nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0Zvcm0udmFsaWQgfHwgdGhpcy5pc1Byb2Nlc3NTdGFydGluZztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBkaXNhYmxlU3RhcnRCdXR0b24oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy5hcHBOYW1lIHx8ICF0aGlzLnByb2Nlc3NEZWZpbml0aW9uLnZhbGlkIHx8IHRoaXMuaXNQcm9jZXNzU3RhcnRpbmcgfHwgdGhpcy5pc0Zvcm1DbG91ZExvYWRpbmc7XG4gICAgfVxuXG4gICAgZ2V0IGlzUHJvY2Vzc0RlZmluaXRpb25zRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy5wcm9jZXNzRGVmaW5pdGlvbkxpc3QubGVuZ3RoO1xuICAgIH1cblxuICAgIGdldCBwcm9jZXNzSW5zdGFuY2VOYW1lKCk6IEZvcm1Db250cm9sPHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzRm9ybS5jb250cm9scy5wcm9jZXNzSW5zdGFuY2VOYW1lO1xuICAgIH1cblxuICAgIGdldCBwcm9jZXNzRGVmaW5pdGlvbigpOiBGb3JtQ29udHJvbDxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0Zvcm0uY29udHJvbHMucHJvY2Vzc0RlZmluaXRpb247XG4gICAgfVxuXG4gICAgZ2V0IGhhc0Zvcm0oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIXRoaXMucHJvY2Vzc0RlZmluaXRpb25DdXJyZW50Py5mb3JtS2V5O1xuICAgIH1cblxuICAgIGdldCBkZWZhdWx0U3RhcnRQcm9jZXNzQnV0dG9uTGFiZWwoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdBREZfQ0xPVURfUFJPQ0VTU19MSVNULkFERl9DTE9VRF9TVEFSVF9QUk9DRVNTLkZPUk0uQUNUSU9OLlNUQVJUJykudG9VcHBlckNhc2UoKTtcbiAgICB9XG5cbiAgICBnZXQgZGVmYXVsdENhbmNlbFByb2Nlc3NCdXR0b25MYWJlbCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ0FERl9DTE9VRF9QUk9DRVNTX0xJU1QuQURGX0NMT1VEX1NUQVJUX1BST0NFU1MuRk9STS5BQ1RJT04uQ0FOQ0VMJykudG9VcHBlckNhc2UoKTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0aW9uU2VydmljZSkge1xuICAgICAgICB0aGlzLnN0YXJ0UHJvY2Vzc0J1dHRvbkxhYmVsID0gdGhpcy5kZWZhdWx0U3RhcnRQcm9jZXNzQnV0dG9uTGFiZWw7XG4gICAgICAgIHRoaXMuY2FuY2VsQnV0dG9uTGFiZWwgPSB0aGlzLmRlZmF1bHRDYW5jZWxQcm9jZXNzQnV0dG9uTGFiZWw7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMucHJvY2Vzc0RlZmluaXRpb24uc2V0VmFsdWUodGhpcy5wcm9jZXNzRGVmaW5pdGlvbk5hbWUpO1xuICAgICAgICB0aGlzLnByb2Nlc3NEZWZpbml0aW9uLnZhbHVlQ2hhbmdlc1xuICAgICAgICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKFBST0NFU1NfREVGSU5JVElPTl9ERUJPVU5DRSkpXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHByb2Nlc3NEZWZpbml0aW9uTmFtZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0UHJvY2Vzc0RlZmluaXRpb25CeVByb2Nlc3NEZWZpbml0aW9uTmFtZShwcm9jZXNzRGVmaW5pdGlvbk5hbWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc2hvd1N0YXJ0UHJvY2Vzc0J1dHRvbiQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLmRpc3BsYXlTdGFydFN1YmplY3QsIHRoaXMuaGFzVmlzaWJsZU91dGNvbWVzU3ViamVjdF0pLnBpcGUoXG4gICAgICAgICAgICBtYXAoKFtkaXNwbGF5U3RhcnQsIGhhc1Zpc2libGVPdXRjb21lc10pID0+IChkaXNwbGF5U3RhcnQgIT09IG51bGwgPyBkaXNwbGF5U3RhcnQgPT09ICd0cnVlJyA6ICFoYXNWaXNpYmxlT3V0Y29tZXMpKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICAgICAgaWYgKGNoYW5nZXNbJ2FwcE5hbWUnXSAmJiBjaGFuZ2VzWydhcHBOYW1lJ10uY3VycmVudFZhbHVlICE9PSBjaGFuZ2VzWydhcHBOYW1lJ10ucHJldmlvdXNWYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5hcHBOYW1lID0gY2hhbmdlc1snYXBwTmFtZSddLmN1cnJlbnRWYWx1ZTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuYXBwTmFtZSB8fCB0aGlzLmFwcE5hbWUgPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkUHJvY2Vzc0RlZmluaXRpb25zKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hhbmdlc1sndmFsdWVzJ10gJiYgY2hhbmdlc1sndmFsdWVzJ10uY3VycmVudFZhbHVlICE9PSBjaGFuZ2VzWyd2YWx1ZXMnXS5wcmV2aW91c1ZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmVkVmFsdWVzID0gdGhpcy5zdGF0aWNNYXBwaW5ncy5jb25jYXQodGhpcy52YWx1ZXMgfHwgW10pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bicsIFsnJGV2ZW50J10pXG4gICAgb25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cblxuICAgIG9uRm9ybUxvYWRlZChmb3JtOiBGb3JtTW9kZWwpIHtcbiAgICAgICAgdGhpcy5pc0Zvcm1DbG91ZExvYWRlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuZm9ybUNsb3VkID0gZm9ybTtcblxuICAgICAgICBpZiAodGhpcy5zdGFydEZvcm0pIHtcbiAgICAgICAgICAgIHRoaXMuaGFzVmlzaWJsZU91dGNvbWVzU3ViamVjdC5uZXh0KHRoaXMuc3RhcnRGb3JtLmhhc1Zpc2libGVPdXRjb21lcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE1heE5hbWVMZW5ndGgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWF4TmFtZUxlbmd0aCA+IE1BWF9OQU1FX0xFTkdUSCA/IE1BWF9OQU1FX0xFTkdUSCA6IHRoaXMubWF4TmFtZUxlbmd0aDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNlbGVjdFByb2Nlc3NEZWZpbml0aW9uQnlQcm9jZXNzRGVmaW5pdGlvbk5hbWUocHJvY2Vzc0RlZmluaXRpb25OYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5maWx0ZXJlZFByb2Nlc3NlcyA9IHRoaXMuZ2V0UHJvY2Vzc0RlZmluaXRpb25MaXN0QnlOYW1lT3JLZXkocHJvY2Vzc0RlZmluaXRpb25OYW1lKTtcblxuICAgICAgICBpZiAodGhpcy5pc1Byb2Nlc3NGb3JtVmFsaWQgJiYgdGhpcy5maWx0ZXJlZFByb2Nlc3NlcyAmJiB0aGlzLmZpbHRlcmVkUHJvY2Vzc2VzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgdGhpcy5zZXRQcm9jZXNzRGVmaW5pdGlvbk9uRm9ybSh0aGlzLmZpbHRlcmVkUHJvY2Vzc2VzWzBdLm5hbWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0UHJvY2Vzc0RlZmluaXRpb25PbkZvcm0oc2VsZWN0ZWRQcm9jZXNzRGVmaW5pdGlvbk5hbWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLmlzRm9ybUNsb3VkTG9hZGluZyA9IHRydWU7XG4gICAgICAgIGNvbnN0IHByb2Nlc3NEZWZpbml0aW9uQ3VycmVudCA9IHRoaXMuZmlsdGVyZWRQcm9jZXNzZXMuZmluZChcbiAgICAgICAgICAgIChwcm9jZXNzOiBQcm9jZXNzRGVmaW5pdGlvbkNsb3VkKSA9PiBwcm9jZXNzLm5hbWUgPT09IHNlbGVjdGVkUHJvY2Vzc0RlZmluaXRpb25OYW1lIHx8IHByb2Nlc3Mua2V5ID09PSBzZWxlY3RlZFByb2Nlc3NEZWZpbml0aW9uTmFtZVxuICAgICAgICApO1xuXG4gICAgICAgIGZvcmtKb2luKFtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRQcm9jZXNzQ2xvdWRTZXJ2aWNlXG4gICAgICAgICAgICAgICAgLmdldFN0YXJ0RXZlbnRGb3JtU3RhdGljVmFsdWVzTWFwcGluZyh0aGlzLmFwcE5hbWUsIHByb2Nlc3NEZWZpbml0aW9uQ3VycmVudC5pZClcbiAgICAgICAgICAgICAgICAucGlwZShjYXRjaEVycm9yKCgpID0+IG9mKFtdIGFzIFRhc2tWYXJpYWJsZUNsb3VkW10pKSksXG4gICAgICAgICAgICB0aGlzLnN0YXJ0UHJvY2Vzc0Nsb3VkU2VydmljZVxuICAgICAgICAgICAgICAgIC5nZXRTdGFydEV2ZW50Q29uc3RhbnRzKHRoaXMuYXBwTmFtZSwgcHJvY2Vzc0RlZmluaXRpb25DdXJyZW50LmlkKVxuICAgICAgICAgICAgICAgIC5waXBlKGNhdGNoRXJyb3IoKCkgPT4gb2YoW10gYXMgVGFza1ZhcmlhYmxlQ2xvdWRbXSkpKVxuICAgICAgICBdKS5zdWJzY3JpYmUoKFtzdGF0aWNNYXBwaW5ncywgY29uc3RhbnRzXSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zdGF0aWNNYXBwaW5ncyA9IHN0YXRpY01hcHBpbmdzO1xuICAgICAgICAgICAgdGhpcy5yZXNvbHZlZFZhbHVlcyA9IHRoaXMuc3RhdGljTWFwcGluZ3MuY29uY2F0KHRoaXMudmFsdWVzIHx8IFtdKTtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc0RlZmluaXRpb25DdXJyZW50ID0gcHJvY2Vzc0RlZmluaXRpb25DdXJyZW50O1xuICAgICAgICAgICAgdGhpcy5pc0Zvcm1DbG91ZExvYWRpbmcgPSBmYWxzZTtcblxuICAgICAgICAgICAgY29uc3QgZGlzcGxheVN0YXJ0ID0gY29uc3RhbnRzPy5maW5kKChjb25zdGFudCkgPT4gY29uc3RhbnQubmFtZSA9PT0gJ3N0YXJ0RW5hYmxlZCcpO1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRMYWJlbCA9IGNvbnN0YW50cz8uZmluZCgoY29uc3RhbnQpID0+IGNvbnN0YW50Lm5hbWUgPT09ICdzdGFydExhYmVsJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IGRpc3BsYXlDYW5jZWwgPSBjb25zdGFudHM/LmZpbmQoKGNvbnN0YW50KSA9PiBjb25zdGFudC5uYW1lID09PSAnY2FuY2VsRW5hYmxlZCcpO1xuICAgICAgICAgICAgY29uc3QgY2FuY2VsTGFiZWwgPSBjb25zdGFudHM/LmZpbmQoKGNvbnN0YW50KSA9PiBjb25zdGFudC5uYW1lID09PSAnY2FuY2VsTGFiZWwnKTtcblxuICAgICAgICAgICAgaWYgKGRpc3BsYXlTdGFydCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheVN0YXJ0U3ViamVjdC5uZXh0KGRpc3BsYXlTdGFydD8udmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN0YXJ0TGFiZWwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0UHJvY2Vzc0J1dHRvbkxhYmVsID0gc3RhcnRMYWJlbD8udmFsdWU/LnRyaW0oKT8ubGVuZ3RoID4gMCA/IHN0YXJ0TGFiZWwudmFsdWUudHJpbSgpIDogdGhpcy5kZWZhdWx0U3RhcnRQcm9jZXNzQnV0dG9uTGFiZWw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChkaXNwbGF5Q2FuY2VsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93Q2FuY2VsQnV0dG9uID0gZGlzcGxheUNhbmNlbD8udmFsdWUgPT09ICd0cnVlJyAmJiB0aGlzLnNob3dDYW5jZWxCdXR0b247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY2FuY2VsTGFiZWwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNhbmNlbEJ1dHRvbkxhYmVsID0gY2FuY2VsTGFiZWw/LnZhbHVlPy50cmltKCk/Lmxlbmd0aCA+IDAgPyBjYW5jZWxMYWJlbC52YWx1ZS50cmltKCkgOiB0aGlzLmRlZmF1bHRDYW5jZWxQcm9jZXNzQnV0dG9uTGFiZWw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuaXNGb3JtQ2xvdWRMb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wcm9jZXNzUGF5bG9hZENsb3VkLnByb2Nlc3NEZWZpbml0aW9uS2V5ID0gcHJvY2Vzc0RlZmluaXRpb25DdXJyZW50LmtleTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFByb2Nlc3NEZWZpbml0aW9uTGlzdEJ5TmFtZU9yS2V5KHByb2Nlc3NEZWZpbml0aW9uTmFtZTogc3RyaW5nKTogUHJvY2Vzc0RlZmluaXRpb25DbG91ZFtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0RlZmluaXRpb25MaXN0LmZpbHRlcihcbiAgICAgICAgICAgIChwcm9jZXNzRGVmaW5pdGlvbkNsb3VkKSA9PiAhcHJvY2Vzc0RlZmluaXRpb25OYW1lIHx8IHRoaXMuZ2V0UHJvY2Vzc0RlZmluaXRpb24ocHJvY2Vzc0RlZmluaXRpb25DbG91ZCwgcHJvY2Vzc0RlZmluaXRpb25OYW1lKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UHJvY2Vzc0lmRXhpc3RzKHByb2Nlc3NEZWZpbml0aW9uOiBzdHJpbmcpOiBQcm9jZXNzRGVmaW5pdGlvbkNsb3VkIHtcbiAgICAgICAgbGV0IG1hdGNoZWRQcm9jZXNzID0gdGhpcy5wcm9jZXNzRGVmaW5pdGlvbkxpc3QuZmluZCgob3B0aW9uKSA9PiB0aGlzLmdldFByb2Nlc3NEZWZpbml0aW9uKG9wdGlvbiwgcHJvY2Vzc0RlZmluaXRpb24pKTtcbiAgICAgICAgaWYgKCFtYXRjaGVkUHJvY2Vzcykge1xuICAgICAgICAgICAgbWF0Y2hlZFByb2Nlc3MgPSBuZXcgUHJvY2Vzc0RlZmluaXRpb25DbG91ZCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1hdGNoZWRQcm9jZXNzO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UHJvY2Vzc0RlZmluaXRpb25CeU5hbWUocHJvY2Vzc0RlZmluaXRpb25OYW1lOiBzdHJpbmcpOiBQcm9jZXNzRGVmaW5pdGlvbkNsb3VkIHtcbiAgICAgICAgY29uc3QgbWF0Y2hlZFByb2Nlc3MgPSBwcm9jZXNzRGVmaW5pdGlvbk5hbWUgPyB0aGlzLmdldFByb2Nlc3NJZkV4aXN0cyhwcm9jZXNzRGVmaW5pdGlvbk5hbWUpIDogdGhpcy5wcm9jZXNzRGVmaW5pdGlvbkxpc3RbMF07XG4gICAgICAgIHJldHVybiBtYXRjaGVkUHJvY2VzcztcbiAgICB9XG5cbiAgICBwcml2YXRlIHNlbGVjdERlZmF1bHRQcm9jZXNzRGVmaW5pdGlvbigpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRQcm9jZXNzID0gdGhpcy5nZXRQcm9jZXNzRGVmaW5pdGlvbkJ5TmFtZSh0aGlzLnByb2Nlc3NEZWZpbml0aW9uTmFtZSk7XG4gICAgICAgIGlmIChzZWxlY3RlZFByb2Nlc3MpIHtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc0RlZmluaXRpb24uc2V0VmFsdWUoc2VsZWN0ZWRQcm9jZXNzLm5hbWUpO1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzRGVmaW5pdGlvblNlbGVjdGlvbkNoYW5nZWQoc2VsZWN0ZWRQcm9jZXNzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkUHJvY2Vzc0RlZmluaXRpb25zKCkge1xuICAgICAgICB0aGlzLnJlc2V0RXJyb3JNZXNzYWdlKCk7XG5cbiAgICAgICAgdGhpcy5zdGFydFByb2Nlc3NDbG91ZFNlcnZpY2VcbiAgICAgICAgICAgIC5nZXRQcm9jZXNzRGVmaW5pdGlvbnModGhpcy5hcHBOYW1lKVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAgICAgICAgIChwcm9jZXNzRGVmaW5pdGlvblJlcHJlc2VudGF0aW9uczogUHJvY2Vzc0RlZmluaXRpb25DbG91ZFtdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0RlZmluaXRpb25MaXN0ID0gcHJvY2Vzc0RlZmluaXRpb25SZXByZXNlbnRhdGlvbnM7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzRGVmaW5pdGlvblJlcHJlc2VudGF0aW9ucy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0RGVmYXVsdFByb2Nlc3NEZWZpbml0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5wcm9jZXNzRGVmaW5pdGlvbk5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0RlZmluaXRpb24uc2V0VmFsdWUodGhpcy5wcm9jZXNzRGVmaW5pdGlvbk5hbWUpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9jZXNzRGVmaW5pdGlvbiA9IHRoaXMucHJvY2Vzc0RlZmluaXRpb25MaXN0LmZpbmQoKHByb2Nlc3MpID0+IHByb2Nlc3MubmFtZSA9PT0gdGhpcy5wcm9jZXNzRGVmaW5pdGlvbk5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb2Nlc3NEZWZpbml0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJlZFByb2Nlc3NlcyA9IHRoaXMuZ2V0UHJvY2Vzc0RlZmluaXRpb25MaXN0QnlOYW1lT3JLZXkocHJvY2Vzc0RlZmluaXRpb24ubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRQcm9jZXNzRGVmaW5pdGlvbk9uRm9ybShwcm9jZXNzRGVmaW5pdGlvbi5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NEZWZpbml0aW9uU2VsZWN0aW9uQ2hhbmdlZChwcm9jZXNzRGVmaW5pdGlvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NEZWZpbml0aW9uTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2VJZCA9ICdBREZfQ0xPVURfUFJPQ0VTU19MSVNULkFERl9DTE9VRF9TVEFSVF9QUk9DRVNTLkVSUk9SLkxPQURfUFJPQ0VTU19ERUZTJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNWYWxpZE5hbWUobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIW5hbWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRQcm9jZXNzRGVmaW5pdGlvbihwcm9jZXNzRGVmaW5pdGlvbkNsb3VkOiBQcm9jZXNzRGVmaW5pdGlvbkNsb3VkLCBwcm9jZXNzRGVmaW5pdGlvbk5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKHRoaXMuaXNWYWxpZE5hbWUocHJvY2Vzc0RlZmluaXRpb25DbG91ZC5uYW1lKSAmJlxuICAgICAgICAgICAgICAgIHByb2Nlc3NEZWZpbml0aW9uQ2xvdWQubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHByb2Nlc3NEZWZpbml0aW9uTmFtZS50b0xvd2VyQ2FzZSgpKSkgfHxcbiAgICAgICAgICAgIHByb2Nlc3NEZWZpbml0aW9uQ2xvdWQua2V5Py50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHByb2Nlc3NEZWZpbml0aW9uTmFtZS50b0xvd2VyQ2FzZSgpKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGJ1aWxkUHJvY2Vzc0Nsb3VkUGF5bG9hZCgpIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzUGF5bG9hZENsb3VkLm5hbWUgPSB0aGlzLnByb2Nlc3NJbnN0YW5jZU5hbWUudmFsdWU7XG4gICAgICAgIGlmICh0aGlzLnZhcmlhYmxlcykge1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzUGF5bG9hZENsb3VkLnZhcmlhYmxlcyA9IHRoaXMudmFyaWFibGVzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzRm9ybSkge1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzUGF5bG9hZENsb3VkLnZhcmlhYmxlcyA9IE9iamVjdC5hc3NpZ24odGhpcy5wcm9jZXNzUGF5bG9hZENsb3VkLnZhcmlhYmxlcywgdGhpcy5mb3JtQ2xvdWQudmFsdWVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uQ3VzdG9tT3V0Y29tZUNsaWNrZWQob3V0Y29tZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuY3VzdG9tT3V0Y29tZSA9IG91dGNvbWU7XG4gICAgICAgIHRoaXMuc3RhcnRQcm9jZXNzKCk7XG4gICAgfVxuXG4gICAgc3RhcnRQcm9jZXNzKCkge1xuICAgICAgICB0aGlzLmlzUHJvY2Vzc1N0YXJ0aW5nID0gdHJ1ZTtcblxuICAgICAgICBjb25zdCBhY3Rpb24gPSB0aGlzLmhhc0Zvcm1cbiAgICAgICAgICAgID8gdGhpcy5zdGFydFByb2Nlc3NDbG91ZFNlcnZpY2Uuc3RhcnRQcm9jZXNzV2l0aEZvcm0oXG4gICAgICAgICAgICAgICAgICB0aGlzLmFwcE5hbWUsXG4gICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NEZWZpbml0aW9uQ3VycmVudC5mb3JtS2V5LFxuICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzRGVmaW5pdGlvbkN1cnJlbnQudmVyc2lvbixcbiAgICAgICAgICAgICAgICAgIG5ldyBQcm9jZXNzV2l0aEZvcm1QYXlsb2FkQ2xvdWQoe1xuICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NOYW1lOiB0aGlzLnByb2Nlc3NJbnN0YW5jZU5hbWUudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0RlZmluaXRpb25LZXk6IHRoaXMucHJvY2Vzc1BheWxvYWRDbG91ZC5wcm9jZXNzRGVmaW5pdGlvbktleSxcbiAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZXM6IHRoaXMudmFyaWFibGVzID8/IHt9LFxuICAgICAgICAgICAgICAgICAgICAgIHZhbHVlczogdGhpcy5mb3JtQ2xvdWQudmFsdWVzLFxuICAgICAgICAgICAgICAgICAgICAgIG91dGNvbWU6IHRoaXMuY3VzdG9tT3V0Y29tZVxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgOiB0aGlzLnN0YXJ0UHJvY2Vzc0Nsb3VkU2VydmljZS5zdGFydFByb2Nlc3MoXG4gICAgICAgICAgICAgICAgICB0aGlzLmFwcE5hbWUsXG4gICAgICAgICAgICAgICAgICBuZXcgUHJvY2Vzc1BheWxvYWRDbG91ZCh7XG4gICAgICAgICAgICAgICAgICAgICAgbmFtZTogdGhpcy5wcm9jZXNzSW5zdGFuY2VOYW1lLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NEZWZpbml0aW9uS2V5OiB0aGlzLnByb2Nlc3NQYXlsb2FkQ2xvdWQucHJvY2Vzc0RlZmluaXRpb25LZXksXG4gICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVzOiB0aGlzLnZhcmlhYmxlcyA/PyB7fVxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICBhY3Rpb24uc3Vic2NyaWJlKHtcbiAgICAgICAgICAgIG5leHQ6IChyZXMpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnN1Y2Nlc3MuZW1pdChyZXMpO1xuICAgICAgICAgICAgICAgIHRoaXMuaXNQcm9jZXNzU3RhcnRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcjogKGVycikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JNZXNzYWdlSWQgPSAnQURGX0NMT1VEX1BST0NFU1NfTElTVC5BREZfQ0xPVURfU1RBUlRfUFJPQ0VTUy5FUlJPUi5TVEFSVCc7XG4gICAgICAgICAgICAgICAgdGhpcy51bmlmeUVycm9yUmVzcG9uc2UoZXJyKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVycm9yLmVtaXQoZXJyKTtcbiAgICAgICAgICAgICAgICB0aGlzLmlzUHJvY2Vzc1N0YXJ0aW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgdW5pZnlFcnJvclJlc3BvbnNlKGVycjogYW55KSB7XG4gICAgICAgIGlmICghZXJyPy5yZXNwb25zZT8uYm9keT8uZW50cnkgJiYgZXJyPy5yZXNwb25zZT8uYm9keT8ubWVzc2FnZSkge1xuICAgICAgICAgICAgZXJyLnJlc3BvbnNlLmJvZHkgPSB7XG4gICAgICAgICAgICAgICAgZW50cnk6IEpTT04ucGFyc2UoZXJyLnJlc3BvbnNlLmJvZHkubWVzc2FnZSlcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjYW5jZWxTdGFydFByb2Nlc3MoKSB7XG4gICAgICAgIHRoaXMuY2FuY2VsLmVtaXQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlc2V0RXJyb3JNZXNzYWdlKCkge1xuICAgICAgICB0aGlzLmVycm9yTWVzc2FnZUlkID0gJyc7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZXNldFByb2Nlc3NEZWZpbml0aW9uTGlzdCgpIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzRGVmaW5pdGlvbi5zZXRWYWx1ZSgnJyk7XG4gICAgICAgIHRoaXMuZmlsdGVyZWRQcm9jZXNzZXMgPSB0aGlzLnByb2Nlc3NEZWZpbml0aW9uTGlzdDtcbiAgICB9XG5cbiAgICBkaXNwbGF5UHJvY2Vzc05hbWVPbkRyb3Bkb3duKHByb2Nlc3M6IGFueSkge1xuICAgICAgICBpZiAocHJvY2Vzcykge1xuICAgICAgICAgICAgbGV0IHByb2Nlc3NOYW1lID0gcHJvY2VzcztcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBwcm9jZXNzTmFtZSA9IHByb2Nlc3MubmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwcm9jZXNzTmFtZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRpc3BsYXlEcm9wZG93bihldmVudCkge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgaWYgKCF0aGlzLmlucHV0QXV0b2NvbXBsZXRlLnBhbmVsT3Blbikge1xuICAgICAgICAgICAgdGhpcy5yZXNldFByb2Nlc3NEZWZpbml0aW9uTGlzdCgpO1xuICAgICAgICAgICAgdGhpcy5pbnB1dEF1dG9jb21wbGV0ZS5vcGVuUGFuZWwoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRBdXRvY29tcGxldGUuY2xvc2VQYW5lbCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvY2Vzc0RlZmluaXRpb25OYW1lVmFsaWRhdG9yKCk6IFZhbGlkYXRvckZuIHtcbiAgICAgICAgcmV0dXJuIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHwgbnVsbCA9PiB7XG4gICAgICAgICAgICBjb25zdCBwcm9jZXNzRGVmaW5pdGlvbkZpZWxkVmFsdWUgPSBjb250cm9sLnZhbHVlO1xuICAgICAgICAgICAgbGV0IHByb2Nlc3NEZWZpbml0aW9uTmFtZUVycm9yID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGlmIChwcm9jZXNzRGVmaW5pdGlvbkZpZWxkVmFsdWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9jZXNzRGVmaW5pdGlvbiA9IHRoaXMuZ2V0UHJvY2Vzc0lmRXhpc3RzKHByb2Nlc3NEZWZpbml0aW9uRmllbGRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFwcm9jZXNzRGVmaW5pdGlvbi5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0RlZmluaXRpb25OYW1lRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NEZWZpbml0aW9uTmFtZUVycm9yID8geyAnaW52YWxpZCBuYW1lJzogdHJ1ZSB9IDogbnVsbDtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBnZXRQcm9jZXNzRGVmaW5pdGlvblZhbHVlKHByb2Nlc3M6IFByb2Nlc3NEZWZpbml0aW9uQ2xvdWQpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy5uYW1lID8gcHJvY2Vzcy5uYW1lIDogcHJvY2Vzcy5rZXk7XG4gICAgfVxuXG4gICAgb25Gb3JtQ29udGVudENsaWNrZWQoY29udGVudDogQ29udGVudExpbmtNb2RlbCkge1xuICAgICAgICB0aGlzLmZvcm1Db250ZW50Q2xpY2tlZC5lbWl0KGNvbnRlbnQpO1xuICAgIH1cblxuICAgIHByb2Nlc3NEZWZpbml0aW9uU2VsZWN0aW9uQ2hhbmdlZChwcm9jZXNzRGVmaW5pdGlvbjogUHJvY2Vzc0RlZmluaXRpb25DbG91ZCkge1xuICAgICAgICBpZiAocHJvY2Vzc0RlZmluaXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuc2V0RGVmYXVsdFByb2Nlc3NOYW1lKHByb2Nlc3NEZWZpbml0aW9uLm5hbWUpO1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzRGVmaW5pdGlvblNlbGVjdGlvbi5lbWl0KHByb2Nlc3NEZWZpbml0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldERlZmF1bHRQcm9jZXNzTmFtZShwcm9jZXNzRGVmaW5pdGlvbk5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBjb25zdCBwcm9jZXNzSW5zdGFuY2VEZXRhaWxzOiBQcm9jZXNzSW5zdGFuY2VDbG91ZCA9IHsgcHJvY2Vzc0RlZmluaXRpb25OYW1lIH07XG4gICAgICAgIGNvbnN0IGRlZmF1bHRQcm9jZXNzTmFtZSA9IHRoaXMuZ2V0RGVmYXVsdFByb2Nlc3NOYW1lKHRoaXMubmFtZSwgcHJvY2Vzc0luc3RhbmNlRGV0YWlscyk7XG4gICAgICAgIHRoaXMucHJvY2Vzc0luc3RhbmNlTmFtZS5zZXRWYWx1ZShkZWZhdWx0UHJvY2Vzc05hbWUpO1xuICAgICAgICB0aGlzLnByb2Nlc3NJbnN0YW5jZU5hbWUubWFya0FzRGlydHkoKTtcbiAgICAgICAgdGhpcy5wcm9jZXNzSW5zdGFuY2VOYW1lLm1hcmtBc1RvdWNoZWQoKTtcbiAgICB9XG5cbiAgICBnZXREZWZhdWx0UHJvY2Vzc05hbWUocHJvY2Vzc05hbWVGb3JtYXQ6IHN0cmluZywgcHJvY2Vzc0luc3RhbmNlPzogUHJvY2Vzc0luc3RhbmNlQ2xvdWQpOiBzdHJpbmcge1xuICAgICAgICBsZXQgcHJvY2Vzc05hbWUgPSBwcm9jZXNzTmFtZUZvcm1hdDtcbiAgICAgICAgaWYgKHByb2Nlc3NOYW1lLm1hdGNoKERBVEVfVElNRV9JREVOVElGSUVSX1JFR19FWFApKSB7XG4gICAgICAgICAgICBjb25zdCBwcmVzZW50RGF0ZVRpbWUgPSBnZXRUaW1lKG5ldyBEYXRlKCkpO1xuICAgICAgICAgICAgcHJvY2Vzc05hbWUgPSBwcm9jZXNzTmFtZS5yZXBsYWNlKERBVEVfVElNRV9JREVOVElGSUVSX1JFR19FWFAsIHRoaXMubG9jYWxpemVkRGF0ZVBpcGUudHJhbnNmb3JtKHByZXNlbnREYXRlVGltZSwgJ21lZGl1bScpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9jZXNzTmFtZS5tYXRjaChQUk9DRVNTX0RFRklOSVRJT05fSURFTlRJRklFUl9SRUdfRVhQKSkge1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRQcm9jZXNzRGVmaW5pdGlvbk5hbWUgPSBwcm9jZXNzSW5zdGFuY2UgPyBwcm9jZXNzSW5zdGFuY2UucHJvY2Vzc0RlZmluaXRpb25OYW1lIDogJyc7XG4gICAgICAgICAgICBwcm9jZXNzTmFtZSA9IHByb2Nlc3NOYW1lLnJlcGxhY2UoUFJPQ0VTU19ERUZJTklUSU9OX0lERU5USUZJRVJfUkVHX0VYUCwgc2VsZWN0ZWRQcm9jZXNzRGVmaW5pdGlvbk5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9jZXNzTmFtZTtcbiAgICB9XG59XG4iLCI8bWF0LWNhcmQgYXBwZWFyYW5jZT1cIm91dGxpbmVkXCIgY2xhc3M9XCJhZGYtc3RhcnQtcHJvY2Vzc1wiICpuZ0lmPVwicHJvY2Vzc0RlZmluaXRpb25Mb2FkZWQ7IGVsc2Ugc3Bpbm5lclwiPlxuXG4gICAgPG1hdC1jYXJkLWNvbnRlbnQ+XG4gICAgICAgIDxtYXQtY2FyZC10aXRsZVxuICAgICAgICAgICAgKm5nSWY9XCJzaG93VGl0bGVcIlxuICAgICAgICAgICAgY2xhc3M9XCJhZGYtdGl0bGVcIj5cbiAgICAgICAgICAgICAgICB7eydBREZfQ0xPVURfUFJPQ0VTU19MSVNULkFERl9DTE9VRF9TVEFSVF9QUk9DRVNTLkZPUk0uVElUTEUnIHwgdHJhbnNsYXRlfX1cbiAgICAgICAgPC9tYXQtY2FyZC10aXRsZT5cblxuICAgICAgICA8bWF0LWNhcmQtc3VidGl0bGUgaWQ9XCJlcnJvci1tZXNzYWdlXCIgKm5nSWY9XCJlcnJvck1lc3NhZ2VJZFwiPlxuICAgICAgICAgICAge3sgZXJyb3JNZXNzYWdlSWQgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgPC9tYXQtY2FyZC1zdWJ0aXRsZT5cblxuICAgICAgICA8ZGl2ICpuZ0lmPVwiIWlzUHJvY2Vzc0RlZmluaXRpb25zRW1wdHk7IGVsc2UgZW1wdHlQcm9jZXNzRGVmaW5pdGlvbnNMaXN0XCI+XG4gICAgICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cInByb2Nlc3NGb3JtXCIgY2xhc3M9XCJhZGYtc2VsZWN0LXByb2Nlc3MtZm9ybVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZFxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFkZi1wcm9jZXNzLWlucHV0LWNvbnRhaW5lclwiXG4gICAgICAgICAgICAgICAgICAgIGZsb2F0TGFiZWw9XCJhbHdheXNcIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNob3dTZWxlY3RQcm9jZXNzRHJvcGRvd25cIlxuICAgICAgICAgICAgICAgICAgICBkYXRhLWF1dG9tYXRpb24taWQ9XCJhZGYtc2VsZWN0LWNsb3VkLXByb2Nlc3MtZHJvcGRvd25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWwgY2xhc3M9XCJhZGYtc3RhcnQtcHJvY2Vzcy1pbnB1dC1sYWJlbFwiPnt7ICdBREZfQ0xPVURfUFJPQ0VTU19MSVNULkFERl9DTE9VRF9TVEFSVF9QUk9DRVNTLkZPUk0uTEFCRUwuVFlQRScgfCB0cmFuc2xhdGUgfX08L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicHJvY2Vzc0RlZmluaXRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJwcm9jZXNzRGVmaW5pdGlvbk5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZGYtcHJvY2Vzcy1pbnB1dC1hdXRvY29tcGxldGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWF1dG9jb21wbGV0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjYXV0bz1cIm1hdEF1dG9jb21wbGV0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwicHJvY2Vzc0RlZmluaXRpb25PcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc3BsYXlXaXRoXT1cImRpc3BsYXlQcm9jZXNzTmFtZU9uRHJvcGRvd25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3B0aW9uU2VsZWN0ZWQpPVwic2V0UHJvY2Vzc0RlZmluaXRpb25PbkZvcm0oJGV2ZW50Lm9wdGlvbi52YWx1ZSlcIiA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBwcm9jZXNzRGVmIG9mIGZpbHRlcmVkUHJvY2Vzc2VzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZ2V0UHJvY2Vzc0RlZmluaXRpb25WYWx1ZShwcm9jZXNzRGVmKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInByb2Nlc3NEZWZpbml0aW9uU2VsZWN0aW9uQ2hhbmdlZChwcm9jZXNzRGVmKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXRQcm9jZXNzRGVmaW5pdGlvblZhbHVlKHByb2Nlc3NEZWYpIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJhZGYtc2VsZWN0LXByb2Nlc3MtZHJvcGRvd25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7J0FERl9DTE9VRF9QUk9DRVNTX0xJU1QuQURGX0NMT1VEX1NUQVJUX1BST0NFU1MuRk9STS5TRUxFQ1RfUFJPQ0VTU19EUk9QRE9XTicgfCB0cmFuc2xhdGV9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGlzcGxheURyb3Bkb3duKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5hcnJvd19kcm9wX2Rvd248L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJwcm9jZXNzRGVmaW5pdGlvbi5oYXNFcnJvcigncmVxdWlyZWQnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhZGYtZXJyb3ItcGJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgJ0FERl9DTE9VRF9QUk9DRVNTX0xJU1QuQURGX0NMT1VEX1NUQVJUX1BST0NFU1MuRVJST1IuUFJPQ0VTU19ERUZJTklUSU9OX1JFUVVJUkVEJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICAgICAgICAgIDxhZGYtaW5wbGFjZS1mb3JtLWlucHV0IFtjb250cm9sXT1cInByb2Nlc3NJbnN0YW5jZU5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBsYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7J0FERl9DTE9VRF9QUk9DRVNTX0xJU1QuQURGX0NMT1VEX1NUQVJUX1BST0NFU1MuRk9STS5MQUJFTC5OQU1FJyB8IHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgZXJyb3I+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInByb2Nlc3NJbnN0YW5jZU5hbWUuaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAnQURGX0NMT1VEX1BST0NFU1NfTElTVC5BREZfQ0xPVURfU1RBUlRfUFJPQ0VTUy5FUlJPUi5QUk9DRVNTX05BTUVfUkVRVUlSRUQnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInByb2Nlc3NJbnN0YW5jZU5hbWUuaGFzRXJyb3IoJ21heGxlbmd0aCcpXCIgaWQ9XCJhZGYtc3RhcnQtcHJvY2Vzcy1tYXhsZW5ndGgtZXJyb3JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAnQURGX0NMT1VEX1BST0NFU1NfTElTVC5BREZfQ0xPVURfU1RBUlRfUFJPQ0VTUy5FUlJPUi5NQVhJTVVNX0xFTkdUSCcgfCB0cmFuc2xhdGUgOiB7IGNoYXJhY3RlcnMgOiBtYXhOYW1lTGVuZ3RoIH0gfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicHJvY2Vzc0luc3RhbmNlTmFtZS5oYXNFcnJvcigncGF0dGVybicpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgJ0FERl9DTE9VRF9QUk9DRVNTX0xJU1QuQURGX0NMT1VEX1NUQVJUX1BST0NFU1MuRVJST1IuU1BBQ0VfVkFMSURBVE9SJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2FkZi1pbnBsYWNlLWZvcm0taW5wdXQ+XG4gICAgICAgICAgICA8L2Zvcm0+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJoYXNGb3JtIGVsc2UgdGFza0Zvcm1DbG91ZEJ1dHRvbnNcIj5cbiAgICAgICAgICAgICAgICA8YWRmLWNsb3VkLWZvcm1cbiAgICAgICAgICAgICAgICAgICAgI3N0YXJ0Rm9ybVxuICAgICAgICAgICAgICAgICAgICBbYXBwTmFtZV09XCJhcHBOYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgW2FwcFZlcnNpb25dPVwicHJvY2Vzc0RlZmluaXRpb25DdXJyZW50LmFwcFZlcnNpb25cIlxuICAgICAgICAgICAgICAgICAgICBbZGF0YV09XCJyZXNvbHZlZFZhbHVlc1wiXG4gICAgICAgICAgICAgICAgICAgIFtmb3JtSWRdPVwicHJvY2Vzc0RlZmluaXRpb25DdXJyZW50LmZvcm1LZXlcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzcGxheU1vZGVDb25maWd1cmF0aW9uc109XCJkaXNwbGF5TW9kZUNvbmZpZ3VyYXRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgW3Nob3dTYXZlQnV0dG9uXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgW3Nob3dDb21wbGV0ZUJ1dHRvbl09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgIFtzaG93UmVmcmVzaEJ1dHRvbl09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgIFtzaG93VmFsaWRhdGlvbkljb25dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICBbc2hvd1RpdGxlXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgKGZvcm1Db250ZW50Q2xpY2tlZCk9XCJvbkZvcm1Db250ZW50Q2xpY2tlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgKGZvcm1Mb2FkZWQpPVwib25Gb3JtTG9hZGVkKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAoZXhlY3V0ZU91dGNvbWUpPVwib25DdXN0b21PdXRjb21lQ2xpY2tlZCgkZXZlbnQub3V0Y29tZS5uYW1lKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGFkZi1jbG91ZC1mb3JtLWN1c3RvbS1vdXRjb21lcz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwidGFza0Zvcm1DbG91ZEJ1dHRvbnNcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9hZGYtY2xvdWQtZm9ybS1jdXN0b20tb3V0Y29tZXM+XG4gICAgICAgICAgICAgICAgPC9hZGYtY2xvdWQtZm9ybT5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cblxuICAgIDwvbWF0LWNhcmQtY29udGVudD5cblxuPC9tYXQtY2FyZD5cblxuPG5nLXRlbXBsYXRlICN0YXNrRm9ybUNsb3VkQnV0dG9ucz5cbiAgICA8ZGl2IGNsYXNzPVwiYWRmLXN0YXJ0LXByb2Nlc3MtY2xvdWQtYWN0aW9uc1wiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqbmdJZj1cInNob3dDYW5jZWxCdXR0b25cIlxuICAgICAgICAgICAgbWF0LWJ1dHRvblxuICAgICAgICAgICAgKGNsaWNrKT1cImNhbmNlbFN0YXJ0UHJvY2VzcygpXCJcbiAgICAgICAgICAgIGlkPVwiY2FuY2VsX3Byb2Nlc3NcIlxuICAgICAgICA+XG4gICAgICAgICAgICB7eyBjYW5jZWxCdXR0b25MYWJlbCB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKm5nSWY9XCJzaG93U3RhcnRQcm9jZXNzQnV0dG9uJCB8IGFzeW5jXCJcbiAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgICAgICBtYXQtcmFpc2VkLWJ1dHRvblxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVTdGFydEJ1dHRvbiB8fCAhaXNQcm9jZXNzRm9ybVZhbGlkXCJcbiAgICAgICAgICAgIChjbGljayk9XCJzdGFydFByb2Nlc3MoKVwiXG4gICAgICAgICAgICBkYXRhLWF1dG9tYXRpb24taWQ9XCJidG4tc3RhcnRcIlxuICAgICAgICAgICAgaWQ9XCJidXR0b24tc3RhcnRcIlxuICAgICAgICAgICAgY2xhc3M9XCJhZGYtYnRuLXN0YXJ0XCJcbiAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7IHN0YXJ0UHJvY2Vzc0J1dHRvbkxhYmVsIH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNlbXB0eVByb2Nlc3NEZWZpbml0aW9uc0xpc3Q+XG4gICAgPG1hdC1jYXJkLWNvbnRlbnQgKm5nSWY9XCJwcm9jZXNzRGVmaW5pdGlvbkxvYWRlZFwiPlxuICAgICAgICA8bWF0LWNhcmQtc3VidGl0bGUgY2xhc3M9XCJlcnJvci1tZXNzYWdlXCIgaWQ9XCJuby1wcm9jZXNzLW1lc3NhZ2VcIj5cbiAgICAgICAgICAgIHt7ICdBREZfQ0xPVURfUFJPQ0VTU19MSVNULkFERl9DTE9VRF9TVEFSVF9QUk9DRVNTLk5PX1BST0NFU1NfREVGSU5JVElPTlMnIHwgdHJhbnNsYXRlIHwgdXBwZXJjYXNlfX1cbiAgICAgICAgPC9tYXQtY2FyZC1zdWJ0aXRsZT5cbiAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3NwaW5uZXI+XG4gICAgPGRpdiBjbGFzcz1cImFkZi1sb2FkaW5nLWNvbnRhaW5lclwiPlxuICAgICAgICA8bWF0LXByb2dyZXNzLXNwaW5uZXJcbiAgICAgICAgICAgIGNsYXNzPVwiYWRmLWxvYWRpbmdcIlxuICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgICAgIG1vZGU9XCJpbmRldGVybWluYXRlXCIgLz5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=