@gravitee/ui-policy-studio-angular 15.13.0-angular-20-f024970 → 15.13.0-fix-cron-e0271bb

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 (171) hide show
  1. package/esm2022/gravitee-ui-policy-studio-angular.mjs +5 -0
  2. package/esm2022/lib/components/filter-pipe/gio-flter-connectors-by-mode.pipe.mjs +43 -0
  3. package/esm2022/lib/components/flow-details/gio-ps-flow-details.component.mjs +184 -0
  4. package/esm2022/lib/components/flow-details-info-bar/gio-ps-flow-details-info-bar.component.mjs +115 -0
  5. package/esm2022/lib/components/flow-details-phase/gio-ps-flow-details-phase.component.mjs +179 -0
  6. package/esm2022/lib/components/flow-details-phase-step/gio-ps-flow-details-phase-step.component.mjs +162 -0
  7. package/esm2022/lib/components/flow-execution-form-dialog/gio-ps-flow-execution-form-dialog.component.mjs +81 -0
  8. package/esm2022/lib/components/flow-form-dialog/flow-message-form-dialog/gio-ps-flow-message-form-dialog.component.mjs +109 -0
  9. package/esm2022/lib/components/flow-form-dialog/flow-native-form-dialog/gio-ps-flow-native-form-dialog.component.mjs +89 -0
  10. package/esm2022/lib/components/flow-form-dialog/flow-proxy-form-dialog/gio-ps-flow-proxy-form-dialog.component.mjs +135 -0
  11. package/esm2022/lib/components/flow-form-dialog/gio-ps-flow-form-dialog-result.model.mjs +2 -0
  12. package/esm2022/lib/components/flows-menu/gio-ps-flows-menu.component.mjs +432 -0
  13. package/esm2022/lib/components/policies-catalog-dialog/gio-ps-policies-catalog-dialog.component.mjs +165 -0
  14. package/esm2022/lib/components/step-edit-dialog/gio-ps-step-edit-dialog.component.mjs +53 -0
  15. package/esm2022/lib/components/step-form/gio-ps-step-form.component.mjs +158 -0
  16. package/esm2022/lib/models/ApiProtocolType.mjs +17 -0
  17. package/esm2022/lib/models/ApiType.mjs +17 -0
  18. package/esm2022/lib/models/ConnectorsInfo.mjs +2 -0
  19. package/esm2022/lib/models/PolicySchemaFetcher.mjs +2 -0
  20. package/esm2022/lib/models/SaveOutput.mjs +2 -0
  21. package/esm2022/lib/models/flow/Flow.mjs +2 -0
  22. package/esm2022/lib/models/flow/FlowExecution.mjs +17 -0
  23. package/esm2022/lib/models/flow/HttpMethod.mjs +43 -0
  24. package/esm2022/lib/models/flow/Selector.mjs +2 -0
  25. package/esm2022/lib/models/flow/Step.mjs +2 -0
  26. package/esm2022/lib/models/flow/index.mjs +21 -0
  27. package/esm2022/lib/models/index.mjs +24 -0
  28. package/esm2022/lib/models/plan/Plan.mjs +17 -0
  29. package/esm2022/lib/models/plan/index.mjs +17 -0
  30. package/esm2022/lib/models/policy/GenericPolicy.mjs +24 -0
  31. package/esm2022/lib/models/policy/Policy.mjs +44 -0
  32. package/esm2022/lib/models/policy/SharedPolicyGroupPolicy.mjs +17 -0
  33. package/esm2022/lib/models/policy/index.mjs +19 -0
  34. package/esm2022/lib/policy-group-studio/gio-policy-group-studio.component.mjs +228 -0
  35. package/esm2022/lib/policy-studio/gio-policy-studio.component.mjs +304 -0
  36. package/esm2022/lib/policy-studio/gio-policy-studio.model.mjs +17 -0
  37. package/esm2022/lib/policy-studio/gio-policy-studio.service.mjs +74 -0
  38. package/esm2022/public-api.mjs +22 -0
  39. package/esm2022/testing/gravitee-ui-policy-studio-angular-testing.mjs +5 -0
  40. package/esm2022/testing/lib/components/flow-details/gio-ps-flow-details.harness.mjs +56 -0
  41. package/esm2022/testing/lib/components/flow-details-info-bar/gio-ps-flow-details-info-bar.harness.mjs +35 -0
  42. package/esm2022/testing/lib/components/flow-details-phase/gio-ps-flow-details-phase.harness.mjs +155 -0
  43. package/esm2022/testing/lib/components/flow-details-phase-step/gio-ps-flow-details-phase-step.harness.mjs +69 -0
  44. package/esm2022/testing/lib/components/flow-execution-form-dialog/gio-ps-flow-execution-form-dialog.harness.mjs +60 -0
  45. package/esm2022/testing/lib/components/flow-form-dialog/flow-message-form-dialog/gio-ps-flow-message-form-dialog.harness.mjs +128 -0
  46. package/esm2022/testing/lib/components/flow-form-dialog/flow-native-form-dialog/gio-ps-flow-native-form-dialog.harness.mjs +50 -0
  47. package/esm2022/testing/lib/components/flow-form-dialog/flow-proxy-form-dialog/gio-ps-flow-proxy-form-dialog.harness.mjs +98 -0
  48. package/esm2022/testing/lib/components/flows-menu/gio-ps-flows-menu.harness.mjs +91 -0
  49. package/esm2022/testing/lib/components/policies-catalog-dialog/gio-ps-policies-catalog-dialog.harness.mjs +87 -0
  50. package/esm2022/testing/lib/components/step-edit-dialog/gio-ps-step-edit-dialog.harness.mjs +30 -0
  51. package/esm2022/testing/lib/components/step-form/gio-ps-step-form.harness.mjs +56 -0
  52. package/esm2022/testing/lib/models/ApiProtocolType.mjs +17 -0
  53. package/esm2022/testing/lib/models/ApiType.mjs +17 -0
  54. package/esm2022/testing/lib/models/ConnectorsInfo.fixture.mjs +182 -0
  55. package/esm2022/testing/lib/models/ConnectorsInfo.mjs +2 -0
  56. package/esm2022/testing/lib/models/PolicySchemaFetcher.mjs +2 -0
  57. package/esm2022/testing/lib/models/SaveOutput.mjs +2 -0
  58. package/esm2022/testing/lib/models/flow/Flow.fixture.mjs +122 -0
  59. package/esm2022/testing/lib/models/flow/Flow.mjs +2 -0
  60. package/esm2022/testing/lib/models/flow/FlowExecution.fixture.mjs +43 -0
  61. package/esm2022/testing/lib/models/flow/FlowExecution.mjs +17 -0
  62. package/esm2022/testing/lib/models/flow/HttpMethod.mjs +43 -0
  63. package/esm2022/testing/lib/models/flow/Selector.mjs +2 -0
  64. package/esm2022/testing/lib/models/flow/Step.fixture.mjs +92 -0
  65. package/esm2022/testing/lib/models/flow/Step.mjs +2 -0
  66. package/esm2022/testing/lib/models/flow/index-testing.mjs +19 -0
  67. package/esm2022/testing/lib/models/flow/index.mjs +21 -0
  68. package/esm2022/testing/lib/models/index-testing.mjs +20 -0
  69. package/esm2022/testing/lib/models/index.mjs +24 -0
  70. package/esm2022/testing/lib/models/plan/Plan.fixture.mjs +31 -0
  71. package/esm2022/testing/lib/models/plan/Plan.mjs +17 -0
  72. package/esm2022/testing/lib/models/plan/index-testing.mjs +17 -0
  73. package/esm2022/testing/lib/models/plan/index.mjs +17 -0
  74. package/esm2022/testing/lib/models/policy/GenericPolicy.mjs +24 -0
  75. package/esm2022/testing/lib/models/policy/Policy.fixture.mjs +194 -0
  76. package/esm2022/testing/lib/models/policy/Policy.mjs +44 -0
  77. package/esm2022/testing/lib/models/policy/SharedPolicyGroupPolicy.mjs +17 -0
  78. package/esm2022/testing/lib/models/policy/index-testing.mjs +17 -0
  79. package/esm2022/testing/lib/models/policy/index.mjs +19 -0
  80. package/esm2022/testing/lib/policy-group-studio/gio-policy-group-studio.harness.mjs +52 -0
  81. package/esm2022/testing/lib/policy-studio/gio-policy-studio.harness.mjs +202 -0
  82. package/esm2022/testing/lib/policy-studio/gio-policy-studio.model.mjs +17 -0
  83. package/esm2022/testing/public-testing-api.mjs +19 -0
  84. package/fesm2022/gravitee-ui-policy-studio-angular-testing.mjs +1 -1
  85. package/fesm2022/gravitee-ui-policy-studio-angular-testing.mjs.map +1 -1
  86. package/fesm2022/gravitee-ui-policy-studio-angular.mjs +95 -92
  87. package/fesm2022/gravitee-ui-policy-studio-angular.mjs.map +1 -1
  88. package/index.d.ts +3 -404
  89. package/lib/components/filter-pipe/gio-flter-connectors-by-mode.pipe.d.ts +8 -0
  90. package/lib/components/flow-details/gio-ps-flow-details.component.d.ts +29 -0
  91. package/lib/components/flow-details-info-bar/gio-ps-flow-details-info-bar.component.d.ts +20 -0
  92. package/lib/components/flow-details-phase/gio-ps-flow-details-phase.component.d.ts +47 -0
  93. package/lib/components/flow-details-phase-step/gio-ps-flow-details-phase-step.component.d.ts +33 -0
  94. package/lib/components/flow-execution-form-dialog/gio-ps-flow-execution-form-dialog.component.d.ts +18 -0
  95. package/lib/components/flow-form-dialog/flow-message-form-dialog/gio-ps-flow-message-form-dialog.component.d.ts +21 -0
  96. package/lib/components/flow-form-dialog/flow-native-form-dialog/gio-ps-flow-native-form-dialog.component.d.ts +21 -0
  97. package/lib/components/flow-form-dialog/flow-proxy-form-dialog/gio-ps-flow-proxy-form-dialog.component.d.ts +24 -0
  98. package/lib/components/flow-form-dialog/gio-ps-flow-form-dialog-result.model.d.ts +2 -0
  99. package/lib/components/flows-menu/gio-ps-flows-menu.component.d.ts +57 -0
  100. package/lib/components/policies-catalog-dialog/gio-ps-policies-catalog-dialog.component.d.ts +47 -0
  101. package/lib/components/step-edit-dialog/gio-ps-step-edit-dialog.component.d.ts +24 -0
  102. package/lib/components/step-form/gio-ps-step-form.component.d.ts +35 -0
  103. package/lib/models/ApiProtocolType.d.ts +1 -0
  104. package/lib/models/ApiType.d.ts +1 -0
  105. package/lib/models/ConnectorsInfo.d.ts +7 -0
  106. package/lib/models/PolicySchemaFetcher.d.ts +5 -0
  107. package/lib/models/SaveOutput.d.ts +7 -0
  108. package/lib/models/flow/Flow.d.ts +24 -0
  109. package/lib/models/flow/FlowExecution.d.ts +11 -0
  110. package/lib/models/flow/HttpMethod.d.ts +3 -0
  111. package/lib/models/flow/Selector.d.ts +37 -0
  112. package/lib/models/flow/Step.d.ts +34 -0
  113. package/lib/models/flow/index.d.ts +5 -0
  114. package/lib/models/index.d.ts +8 -0
  115. package/lib/models/plan/Plan.d.ts +6 -0
  116. package/lib/models/plan/index.d.ts +1 -0
  117. package/lib/models/policy/GenericPolicy.d.ts +22 -0
  118. package/lib/models/policy/Policy.d.ts +28 -0
  119. package/lib/models/policy/SharedPolicyGroupPolicy.d.ts +11 -0
  120. package/lib/models/policy/index.d.ts +3 -0
  121. package/lib/policy-group-studio/gio-policy-group-studio.component.d.ts +70 -0
  122. package/lib/policy-studio/gio-policy-studio.component.d.ts +98 -0
  123. package/lib/policy-studio/gio-policy-studio.model.d.ts +17 -0
  124. package/lib/policy-studio/gio-policy-studio.service.d.ts +30 -0
  125. package/package.json +11 -7
  126. package/public-api.d.ts +3 -0
  127. package/testing/index.d.ts +3 -369
  128. package/testing/lib/components/flow-details/gio-ps-flow-details.harness.d.ts +12 -0
  129. package/testing/lib/components/flow-details-info-bar/gio-ps-flow-details-info-bar.harness.d.ts +5 -0
  130. package/testing/lib/components/flow-details-phase/gio-ps-flow-details-phase.harness.d.ts +69 -0
  131. package/testing/lib/components/flow-details-phase-step/gio-ps-flow-details-phase-step.harness.d.ts +21 -0
  132. package/testing/lib/components/flow-execution-form-dialog/gio-ps-flow-execution-form-dialog.harness.d.ts +13 -0
  133. package/testing/lib/components/flow-form-dialog/flow-message-form-dialog/gio-ps-flow-message-form-dialog.harness.d.ts +37 -0
  134. package/testing/lib/components/flow-form-dialog/flow-native-form-dialog/gio-ps-flow-native-form-dialog.harness.d.ts +17 -0
  135. package/testing/lib/components/flow-form-dialog/flow-proxy-form-dialog/gio-ps-flow-proxy-form-dialog.harness.d.ts +33 -0
  136. package/testing/lib/components/flows-menu/gio-ps-flows-menu.harness.d.ts +31 -0
  137. package/testing/lib/components/policies-catalog-dialog/gio-ps-policies-catalog-dialog.harness.d.ts +20 -0
  138. package/testing/lib/components/step-edit-dialog/gio-ps-step-edit-dialog.harness.d.ts +8 -0
  139. package/testing/lib/components/step-form/gio-ps-step-form.harness.d.ts +18 -0
  140. package/testing/lib/models/ApiProtocolType.d.ts +1 -0
  141. package/testing/lib/models/ApiType.d.ts +1 -0
  142. package/testing/lib/models/ConnectorsInfo.d.ts +7 -0
  143. package/testing/lib/models/ConnectorsInfo.fixture.d.ts +12 -0
  144. package/testing/lib/models/PolicySchemaFetcher.d.ts +5 -0
  145. package/testing/lib/models/SaveOutput.d.ts +7 -0
  146. package/testing/lib/models/flow/Flow.d.ts +24 -0
  147. package/testing/lib/models/flow/Flow.fixture.d.ts +6 -0
  148. package/testing/lib/models/flow/FlowExecution.d.ts +11 -0
  149. package/testing/lib/models/flow/FlowExecution.fixture.d.ts +3 -0
  150. package/testing/lib/models/flow/HttpMethod.d.ts +3 -0
  151. package/testing/lib/models/flow/Selector.d.ts +37 -0
  152. package/testing/lib/models/flow/Step.d.ts +34 -0
  153. package/testing/lib/models/flow/Step.fixture.d.ts +5 -0
  154. package/testing/lib/models/flow/index-testing.d.ts +3 -0
  155. package/testing/lib/models/flow/index.d.ts +5 -0
  156. package/testing/lib/models/index-testing.d.ts +4 -0
  157. package/testing/lib/models/index.d.ts +8 -0
  158. package/testing/lib/models/plan/Plan.d.ts +6 -0
  159. package/testing/lib/models/plan/Plan.fixture.d.ts +2 -0
  160. package/testing/lib/models/plan/index-testing.d.ts +1 -0
  161. package/testing/lib/models/plan/index.d.ts +1 -0
  162. package/testing/lib/models/policy/GenericPolicy.d.ts +22 -0
  163. package/testing/lib/models/policy/Policy.d.ts +28 -0
  164. package/testing/lib/models/policy/Policy.fixture.d.ts +4 -0
  165. package/testing/lib/models/policy/SharedPolicyGroupPolicy.d.ts +11 -0
  166. package/testing/lib/models/policy/index-testing.d.ts +1 -0
  167. package/testing/lib/models/policy/index.d.ts +3 -0
  168. package/testing/lib/policy-group-studio/gio-policy-group-studio.harness.d.ts +20 -0
  169. package/testing/lib/policy-studio/gio-policy-studio.harness.d.ts +78 -0
  170. package/testing/lib/policy-studio/gio-policy-studio.model.d.ts +17 -0
  171. package/testing/public-testing-api.d.ts +3 -0
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3Jhdml0ZWUtdWktcG9saWN5LXN0dWRpby1hbmd1bGFyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcHJvamVjdHMvdWktcG9saWN5LXN0dWRpby1hbmd1bGFyL3NyYy9ncmF2aXRlZS11aS1wb2xpY3ktc3R1ZGlvLWFuZ3VsYXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
@@ -0,0 +1,43 @@
1
+ /*
2
+ * Copyright (C) 2023 The Gravitee team (http://gravitee.io)
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ import { Pipe } from '@angular/core';
17
+ import { filter, isEmpty } from 'lodash';
18
+ import * as i0 from "@angular/core";
19
+ export class GioFilterConnectorsByModePipe {
20
+ transform(items, mode, activeModes = []) {
21
+ if (items) {
22
+ if (!mode) {
23
+ return items;
24
+ }
25
+ if (isEmpty(activeModes) || activeModes.includes(mode)) {
26
+ return filter(items, (item) => {
27
+ return item.supportedModes.includes(mode);
28
+ });
29
+ }
30
+ }
31
+ return [];
32
+ }
33
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: GioFilterConnectorsByModePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
34
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.4", ngImport: i0, type: GioFilterConnectorsByModePipe, isStandalone: true, name: "gioFilterConnectorsByMode" }); }
35
+ }
36
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: GioFilterConnectorsByModePipe, decorators: [{
37
+ type: Pipe,
38
+ args: [{
39
+ standalone: true,
40
+ name: 'gioFilterConnectorsByMode',
41
+ }]
42
+ }] });
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2lvLWZsdGVyLWNvbm5lY3RvcnMtYnktbW9kZS5waXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWktcG9saWN5LXN0dWRpby1hbmd1bGFyL3NyYy9saWIvY29tcG9uZW50cy9maWx0ZXItcGlwZS9naW8tZmx0ZXItY29ubmVjdG9ycy1ieS1tb2RlLnBpcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxPQUFPLEVBQUUsSUFBSSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUNwRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLFFBQVEsQ0FBQzs7QUFRekMsTUFBTSxPQUFPLDZCQUE2QjtJQUNqQyxTQUFTLENBQUMsS0FBc0IsRUFBRSxJQUFtQixFQUFFLGNBQStCLEVBQUU7UUFDN0YsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDVixPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7WUFFRCxJQUFJLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZELE9BQU8sTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQW1CLEVBQUUsRUFBRTtvQkFDM0MsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDNUMsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQzs4R0FkVSw2QkFBNkI7NEdBQTdCLDZCQUE2Qjs7MkZBQTdCLDZCQUE2QjtrQkFKekMsSUFBSTttQkFBQztvQkFDSixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsSUFBSSxFQUFFLDJCQUEyQjtpQkFDbEMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBHcmF2aXRlZSB0ZWFtIChodHRwOi8vZ3Jhdml0ZWUuaW8pXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgUGlwZSwgUGlwZVRyYW5zZm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZmlsdGVyLCBpc0VtcHR5IH0gZnJvbSAnbG9kYXNoJztcblxuaW1wb3J0IHsgQ29ubmVjdG9ySW5mbywgQ29ubmVjdG9yTW9kZSB9IGZyb20gJy4uLy4uL21vZGVscyc7XG5cbkBQaXBlKHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgbmFtZTogJ2dpb0ZpbHRlckNvbm5lY3RvcnNCeU1vZGUnLFxufSlcbmV4cG9ydCBjbGFzcyBHaW9GaWx0ZXJDb25uZWN0b3JzQnlNb2RlUGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xuICBwdWJsaWMgdHJhbnNmb3JtKGl0ZW1zOiBDb25uZWN0b3JJbmZvW10sIG1vZGU6IENvbm5lY3Rvck1vZGUsIGFjdGl2ZU1vZGVzOiBDb25uZWN0b3JNb2RlW10gPSBbXSk6IENvbm5lY3RvckluZm9bXSB7XG4gICAgaWYgKGl0ZW1zKSB7XG4gICAgICBpZiAoIW1vZGUpIHtcbiAgICAgICAgcmV0dXJuIGl0ZW1zO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNFbXB0eShhY3RpdmVNb2RlcykgfHwgYWN0aXZlTW9kZXMuaW5jbHVkZXMobW9kZSkpIHtcbiAgICAgICAgcmV0dXJuIGZpbHRlcihpdGVtcywgKGl0ZW06IENvbm5lY3RvckluZm8pID0+IHtcbiAgICAgICAgICByZXR1cm4gaXRlbS5zdXBwb3J0ZWRNb2Rlcy5pbmNsdWRlcyhtb2RlKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBbXTtcbiAgfVxufVxuIl19
@@ -0,0 +1,184 @@
1
+ /*
2
+ * Copyright (C) 2022 The Gravitee team (http://gravitee.io)
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
17
+ import { tap } from 'rxjs/operators';
18
+ import { isEmpty } from 'lodash';
19
+ import { GIO_DIALOG_WIDTH, GioBannerModule, GioIconsModule, GioLoaderModule } from '@gravitee/ui-particles-angular';
20
+ import { MatTabsModule } from '@angular/material/tabs';
21
+ import { MatButtonModule } from '@angular/material/button';
22
+ import { CommonModule } from '@angular/common';
23
+ import { MatTooltipModule } from '@angular/material/tooltip';
24
+ import { GioPolicyStudioFlowMessageFormDialogComponent, } from '../flow-form-dialog/flow-message-form-dialog/gio-ps-flow-message-form-dialog.component';
25
+ import { GioPolicyStudioFlowProxyFormDialogComponent, } from '../flow-form-dialog/flow-proxy-form-dialog/gio-ps-flow-proxy-form-dialog.component';
26
+ import { GioPolicyStudioDetailsPhaseComponent } from '../flow-details-phase/gio-ps-flow-details-phase.component';
27
+ import { GioFilterConnectorsByModePipe } from '../filter-pipe/gio-flter-connectors-by-mode.pipe';
28
+ import { GioPolicyStudioDetailsInfoBarComponent } from '../flow-details-info-bar/gio-ps-flow-details-info-bar.component';
29
+ import { GioPolicyStudioFlowNativeFormDialogComponent, } from '../flow-form-dialog/flow-native-form-dialog/gio-ps-flow-native-form-dialog.component';
30
+ import * as i0 from "@angular/core";
31
+ import * as i1 from "@angular/material/dialog";
32
+ import * as i2 from "@angular/common";
33
+ import * as i3 from "@angular/material/tabs";
34
+ import * as i4 from "@angular/material/button";
35
+ import * as i5 from "@angular/material/icon";
36
+ import * as i6 from "@gravitee/ui-particles-angular";
37
+ import * as i7 from "@angular/material/tooltip";
38
+ export class GioPolicyStudioDetailsComponent {
39
+ constructor(matDialog) {
40
+ this.matDialog = matDialog;
41
+ this.readOnly = false;
42
+ this.loading = false;
43
+ this.flow = undefined;
44
+ this.entrypointsInfo = [];
45
+ this.endpointsInfo = [];
46
+ this.policies = [];
47
+ this.genericPolicies = [];
48
+ this.flowChange = new EventEmitter();
49
+ this.deleteFlow = new EventEmitter();
50
+ this.messageFlowEntrypointsInfo = [];
51
+ this.operations = [];
52
+ }
53
+ ngOnChanges(changes) {
54
+ if (changes.entrypointsInfo || changes.flow) {
55
+ const channelSelector = this.flow?.selectors?.find(s => s.type === 'CHANNEL');
56
+ this.operations = channelSelector?.operations ?? [];
57
+ if (!channelSelector) {
58
+ // If no channel selector found. Keep default value
59
+ this.messageFlowEntrypointsInfo = [];
60
+ return;
61
+ }
62
+ this.messageFlowEntrypointsInfo =
63
+ this.entrypointsInfo?.filter(e =>
64
+ // If not entrypoints are defined, all entrypoints are valid
65
+ !channelSelector.entrypoints || isEmpty(channelSelector.entrypoints) || channelSelector.entrypoints?.includes(e.type)) ?? [];
66
+ }
67
+ }
68
+ onEditFlow() {
69
+ let dialogResult;
70
+ switch (this.apiType) {
71
+ case 'MESSAGE':
72
+ dialogResult = this.matDialog
73
+ .open(GioPolicyStudioFlowMessageFormDialogComponent, {
74
+ data: {
75
+ flow: this.flow,
76
+ entrypoints: this.entrypointsInfo ?? [],
77
+ },
78
+ role: 'alertdialog',
79
+ id: 'gioPsFlowMessageFormDialog',
80
+ width: GIO_DIALOG_WIDTH.MEDIUM,
81
+ })
82
+ .afterClosed();
83
+ break;
84
+ case 'PROXY':
85
+ dialogResult = this.matDialog
86
+ .open(GioPolicyStudioFlowProxyFormDialogComponent, {
87
+ data: {
88
+ flow: this.flow,
89
+ },
90
+ role: 'alertdialog',
91
+ id: 'gioPsFlowProxyFormDialog',
92
+ width: GIO_DIALOG_WIDTH.MEDIUM,
93
+ })
94
+ .afterClosed();
95
+ break;
96
+ case 'NATIVE':
97
+ dialogResult = this.matDialog
98
+ .open(GioPolicyStudioFlowNativeFormDialogComponent, {
99
+ data: {
100
+ flow: this.flow,
101
+ parentGroupName: this.flow._parentFlowGroupName,
102
+ },
103
+ role: 'alertdialog',
104
+ id: 'gioPsFlowNativeFormDialog',
105
+ width: GIO_DIALOG_WIDTH.MEDIUM,
106
+ })
107
+ .afterClosed();
108
+ break;
109
+ default:
110
+ throw new Error(`Unsupported API type ${this.apiType}`);
111
+ }
112
+ dialogResult
113
+ .pipe(tap(createdOrEdited => {
114
+ if (!createdOrEdited) {
115
+ return;
116
+ }
117
+ this.flowChange.emit(createdOrEdited);
118
+ }))
119
+ .subscribe();
120
+ }
121
+ onDeleteFlow() {
122
+ this.deleteFlow.emit(this.flow);
123
+ }
124
+ onEnableDisableFlow() {
125
+ if (!this.flow) {
126
+ return;
127
+ }
128
+ this.flowChange.emit({
129
+ ...this.flow,
130
+ enabled: !this.flow.enabled,
131
+ _hasChanged: true,
132
+ });
133
+ }
134
+ onStepsChange(flowPhase, steps) {
135
+ if (!this.flow) {
136
+ return;
137
+ }
138
+ this.flowChange.emit({
139
+ ...this.flow,
140
+ [flowPhase]: steps,
141
+ _hasChanged: true,
142
+ });
143
+ }
144
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: GioPolicyStudioDetailsComponent, deps: [{ token: i1.MatDialog }], target: i0.ɵɵFactoryTarget.Component }); }
145
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.4", type: GioPolicyStudioDetailsComponent, isStandalone: true, selector: "gio-ps-flow-details", inputs: { readOnly: "readOnly", loading: "loading", apiType: "apiType", flow: "flow", entrypointsInfo: "entrypointsInfo", endpointsInfo: "endpointsInfo", policies: "policies", genericPolicies: "genericPolicies", trialUrl: "trialUrl" }, outputs: { flowChange: "flowChange", deleteFlow: "deleteFlow" }, usesOnChanges: true, ngImport: i0, template: "<!--\n\n Copyright (C) 2023 The Gravitee team (http://gravitee.io)\n \n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n\n<ng-container *ngIf=\"!loading; then flowDetailsTpl; else loadingTpl\"></ng-container>\n\n<ng-template #flowDetailsTpl>\n <ng-container *ngIf=\"flow; else emptyFlows\">\n <div class=\"header\">\n <div class=\"header__label\">\n Flow details\n <div *ngIf=\"!flow.enabled\" class=\"gio-badge gio-badge-neutral\">Disabled</div>\n </div>\n <div class=\"header__configBtn\">\n <button\n [disabled]=\"readOnly\"\n class=\"header__configBtn__enableDisable\"\n mat-stroked-button\n [matTooltip]=\"flow.enabled ? 'Disable' : 'Enable'\"\n (click)=\"onEnableDisableFlow()\"\n >\n <mat-icon [svgIcon]=\"flow.enabled ? 'gio:prohibition' : 'gio:check-circled-outline'\"></mat-icon>\n </button>\n <button [disabled]=\"readOnly\" class=\"header__configBtn__edit\" mat-stroked-button (click)=\"onEditFlow()\" matTooltip=\"Edit\">\n <mat-icon svgIcon=\"gio:edit-pencil\"></mat-icon>\n </button>\n <button [disabled]=\"readOnly\" class=\"header__configBtn__delete\" mat-stroked-button (click)=\"onDeleteFlow()\" matTooltip=\"Delete\">\n <mat-icon svgIcon=\"gio:trash\"></mat-icon>\n </button>\n </div>\n </div>\n <gio-ps-flow-details-info-bar\n class=\"infoBar\"\n [class.flowDisabled]=\"!flow.enabled\"\n [flow]=\"flow\"\n [entrypointsInfo]=\"entrypointsInfo\"\n ></gio-ps-flow-details-info-bar>\n\n <div class=\"content\" [class.flowDisabled]=\"!flow.enabled\">\n <mat-tab-group *ngIf=\"apiType === 'MESSAGE'\" class=\"content__tabs\" dynamicHeight>\n <mat-tab label=\"Initial connection\" bodyClass=\"content__tabs__body\">\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Request phase\"\n description=\"Policies will be applied during the connection establishment\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"messageFlowEntrypointsInfo\"\n [endConnector]=\"endpointsInfo\"\n [steps]=\"flow.request ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"REQUEST\"\n (stepsChange)=\"onStepsChange('request', $event)\"\n ></gio-ps-flow-details-phase>\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Response phase\"\n description=\"Policies will be applied to the response from the initial connection\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"endpointsInfo\"\n [endConnector]=\"messageFlowEntrypointsInfo\"\n [steps]=\"flow.response ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"RESPONSE\"\n (stepsChange)=\"onStepsChange('response', $event)\"\n ></gio-ps-flow-details-phase>\n </mat-tab>\n <mat-tab label=\"Event messages\" bodyClass=\"content__tabs__body\">\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Publish phase\"\n description=\"Policies will be applied on messages sent to the endpoint\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"messageFlowEntrypointsInfo | gioFilterConnectorsByMode: 'PUBLISH' : operations\"\n [endConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'PUBLISH' : operations\"\n [steps]=\"flow.publish ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"PUBLISH\"\n (stepsChange)=\"onStepsChange('publish', $event)\"\n ></gio-ps-flow-details-phase>\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Subscribe phase\"\n description=\"Policies will be applied on messages received by the entrypoint\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'SUBSCRIBE' : operations\"\n [endConnector]=\"messageFlowEntrypointsInfo | gioFilterConnectorsByMode: 'SUBSCRIBE' : operations\"\n [steps]=\"flow.subscribe ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"SUBSCRIBE\"\n (stepsChange)=\"onStepsChange('subscribe', $event)\"\n ></gio-ps-flow-details-phase>\n </mat-tab>\n </mat-tab-group>\n\n <ng-container *ngIf=\"apiType === 'PROXY'\">\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Request phase\"\n description=\"Policies will be applied during the connection establishment\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"entrypointsInfo | gioFilterConnectorsByMode: 'REQUEST_RESPONSE'\"\n [endConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'REQUEST_RESPONSE'\"\n [steps]=\"flow.request ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"REQUEST\"\n (stepsChange)=\"onStepsChange('request', $event)\"\n ></gio-ps-flow-details-phase>\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Response phase\"\n description=\"Policies will be applied during the connection termination\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'REQUEST_RESPONSE'\"\n [endConnector]=\"entrypointsInfo | gioFilterConnectorsByMode: 'REQUEST_RESPONSE'\"\n [steps]=\"flow.response ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"RESPONSE\"\n (stepsChange)=\"onStepsChange('response', $event)\"\n ></gio-ps-flow-details-phase>\n </ng-container>\n\n <mat-tab-group *ngIf=\"apiType === 'NATIVE'\" class=\"content__tabs\" dynamicHeight>\n <mat-tab label=\"Global\" bodyClass=\"content__tabs__body\">\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Connect phase\"\n description=\"Policies will be applied when the client connects to the Gateway\"\n [disabledNotYetAvailable]=\"true\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'CONNECT'\"\n [endConnector]=\"entrypointsInfo | gioFilterConnectorsByMode: 'CONNECT'\"\n [steps]=\"flow.connect ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"CONNECT\"\n (stepsChange)=\"onStepsChange('connect', $event)\"\n >\n </gio-ps-flow-details-phase>\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Interact phase\"\n description=\"Policies will be applied on all interactions between the client and the Gateway\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"entrypointsInfo | gioFilterConnectorsByMode: 'INTERACT'\"\n [endConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'INTERACT'\"\n [steps]=\"flow.interact ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"INTERACT\"\n (stepsChange)=\"onStepsChange('interact', $event)\"\n ></gio-ps-flow-details-phase>\n </mat-tab>\n <mat-tab label=\"Event messages\" bodyClass=\"content__tabs__body\">\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Publish phase\"\n description=\"Policies will be applied when publishing messages\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"entrypointsInfo | gioFilterConnectorsByMode: 'PUBLISH'\"\n [endConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'PUBLISH'\"\n [steps]=\"flow.publish ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"PUBLISH\"\n (stepsChange)=\"onStepsChange('publish', $event)\"\n ></gio-ps-flow-details-phase>\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Subscribe phase\"\n description=\"Policies will be applied when fetching messages\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'SUBSCRIBE'\"\n [endConnector]=\"entrypointsInfo | gioFilterConnectorsByMode: 'SUBSCRIBE'\"\n [steps]=\"flow.subscribe ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"SUBSCRIBE\"\n (stepsChange)=\"onStepsChange('subscribe', $event)\"\n ></gio-ps-flow-details-phase>\n </mat-tab>\n </mat-tab-group>\n </div>\n </ng-container>\n\n <ng-template #emptyFlows>\n <div class=\"emptyFlows\">\n <h2>No flows yet</h2>\n <p class=\"mat-body-1\">Flows allow you to customize the behavior of your API event phases through configurable policies</p>\n </div>\n </ng-template>\n</ng-template>\n\n<ng-template #loadingTpl>\n <div class=\"header loading\">\n <div class=\"header__label\">Flow details</div>\n <div class=\"header__configBtn\">\n <button class=\"header__configBtn__edit\" mat-stroked-button disabled>\n <mat-icon svgIcon=\"gio:edit-pencil\"></mat-icon>\n </button>\n <button class=\"header__configBtn__delete\" mat-stroked-button disabled>\n <mat-icon svgIcon=\"gio:trash\"></mat-icon>\n </button>\n </div>\n </div>\n <gio-ps-flow-details-info-bar class=\"infoBar loading\"></gio-ps-flow-details-info-bar>\n <div class=\"content loading\">\n <gio-loader></gio-loader>\n </div>\n</ng-template>\n", styles: ["@charset \"UTF-8\";.gio-top-bar-menu .gio-badge-accent{background-color:var(--gio-oem-palette--active, #ffc2ac);color:var(--gio-oem-palette--active-contrast, #1e1b1b)}:host{display:flex;height:100%;flex-direction:column}.emptyFlows{display:flex;max-width:500px;height:100%;flex-direction:column;justify-content:center;margin:auto;text-align:center}.header{display:flex;align-items:center;padding:16px;border-bottom:1px solid #d2cecd}.header__label{font-family:Kanit,Helvetica Neue,sans-serif;font-size:16px;font-weight:500;letter-spacing:.4px;line-height:24px;display:flex;flex:1 1 auto;align-items:center;margin-bottom:0;gap:8px}.header__configBtn{display:flex;align-items:center;margin-left:8px;gap:8px}.infoBar{border-bottom:1px solid #d2cecd}.infoBar.loading{min-height:52px}.infoBar.flowDisabled{opacity:.5}.content{overflow:auto;flex:1 1 auto;background-color:#f7f7f8}.content.flowDisabled{opacity:.5}.content__tabs{min-height:100%;min-height:calc(100% - 64px)}.content__phase{margin:16px 16px 0}.content.loading{display:flex}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatTabsModule }, { kind: "component", type: i3.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass"], exportAs: ["matTab"] }, { kind: "component", type: i3.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "mat-align-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor", "aria-label", "aria-labelledby"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "ngmodule", type: GioIconsModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: GioPolicyStudioDetailsPhaseComponent, selector: "gio-ps-flow-details-phase", inputs: ["readOnly", "steps", "name", "description", "startConnector", "endConnector", "apiType", "genericPolicies", "policyFlowPhase", "trialUrl", "disabledNotYetAvailable"], outputs: ["stepsChange"] }, { kind: "pipe", type: GioFilterConnectorsByModePipe, name: "gioFilterConnectorsByMode" }, { kind: "ngmodule", type: GioLoaderModule }, { kind: "component", type: i6.GioLoaderComponent, selector: "gio-loader" }, { kind: "component", type: GioPolicyStudioDetailsInfoBarComponent, selector: "gio-ps-flow-details-info-bar", inputs: ["flow", "entrypointsInfo"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i7.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: GioBannerModule }] }); }
146
+ }
147
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: GioPolicyStudioDetailsComponent, decorators: [{
148
+ type: Component,
149
+ args: [{ imports: [
150
+ CommonModule,
151
+ MatTabsModule,
152
+ MatButtonModule,
153
+ GioIconsModule,
154
+ GioPolicyStudioDetailsPhaseComponent,
155
+ GioFilterConnectorsByModePipe,
156
+ GioLoaderModule,
157
+ GioPolicyStudioDetailsInfoBarComponent,
158
+ MatTooltipModule,
159
+ GioBannerModule,
160
+ ], selector: 'gio-ps-flow-details', template: "<!--\n\n Copyright (C) 2023 The Gravitee team (http://gravitee.io)\n \n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n\n<ng-container *ngIf=\"!loading; then flowDetailsTpl; else loadingTpl\"></ng-container>\n\n<ng-template #flowDetailsTpl>\n <ng-container *ngIf=\"flow; else emptyFlows\">\n <div class=\"header\">\n <div class=\"header__label\">\n Flow details\n <div *ngIf=\"!flow.enabled\" class=\"gio-badge gio-badge-neutral\">Disabled</div>\n </div>\n <div class=\"header__configBtn\">\n <button\n [disabled]=\"readOnly\"\n class=\"header__configBtn__enableDisable\"\n mat-stroked-button\n [matTooltip]=\"flow.enabled ? 'Disable' : 'Enable'\"\n (click)=\"onEnableDisableFlow()\"\n >\n <mat-icon [svgIcon]=\"flow.enabled ? 'gio:prohibition' : 'gio:check-circled-outline'\"></mat-icon>\n </button>\n <button [disabled]=\"readOnly\" class=\"header__configBtn__edit\" mat-stroked-button (click)=\"onEditFlow()\" matTooltip=\"Edit\">\n <mat-icon svgIcon=\"gio:edit-pencil\"></mat-icon>\n </button>\n <button [disabled]=\"readOnly\" class=\"header__configBtn__delete\" mat-stroked-button (click)=\"onDeleteFlow()\" matTooltip=\"Delete\">\n <mat-icon svgIcon=\"gio:trash\"></mat-icon>\n </button>\n </div>\n </div>\n <gio-ps-flow-details-info-bar\n class=\"infoBar\"\n [class.flowDisabled]=\"!flow.enabled\"\n [flow]=\"flow\"\n [entrypointsInfo]=\"entrypointsInfo\"\n ></gio-ps-flow-details-info-bar>\n\n <div class=\"content\" [class.flowDisabled]=\"!flow.enabled\">\n <mat-tab-group *ngIf=\"apiType === 'MESSAGE'\" class=\"content__tabs\" dynamicHeight>\n <mat-tab label=\"Initial connection\" bodyClass=\"content__tabs__body\">\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Request phase\"\n description=\"Policies will be applied during the connection establishment\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"messageFlowEntrypointsInfo\"\n [endConnector]=\"endpointsInfo\"\n [steps]=\"flow.request ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"REQUEST\"\n (stepsChange)=\"onStepsChange('request', $event)\"\n ></gio-ps-flow-details-phase>\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Response phase\"\n description=\"Policies will be applied to the response from the initial connection\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"endpointsInfo\"\n [endConnector]=\"messageFlowEntrypointsInfo\"\n [steps]=\"flow.response ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"RESPONSE\"\n (stepsChange)=\"onStepsChange('response', $event)\"\n ></gio-ps-flow-details-phase>\n </mat-tab>\n <mat-tab label=\"Event messages\" bodyClass=\"content__tabs__body\">\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Publish phase\"\n description=\"Policies will be applied on messages sent to the endpoint\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"messageFlowEntrypointsInfo | gioFilterConnectorsByMode: 'PUBLISH' : operations\"\n [endConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'PUBLISH' : operations\"\n [steps]=\"flow.publish ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"PUBLISH\"\n (stepsChange)=\"onStepsChange('publish', $event)\"\n ></gio-ps-flow-details-phase>\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Subscribe phase\"\n description=\"Policies will be applied on messages received by the entrypoint\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'SUBSCRIBE' : operations\"\n [endConnector]=\"messageFlowEntrypointsInfo | gioFilterConnectorsByMode: 'SUBSCRIBE' : operations\"\n [steps]=\"flow.subscribe ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"SUBSCRIBE\"\n (stepsChange)=\"onStepsChange('subscribe', $event)\"\n ></gio-ps-flow-details-phase>\n </mat-tab>\n </mat-tab-group>\n\n <ng-container *ngIf=\"apiType === 'PROXY'\">\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Request phase\"\n description=\"Policies will be applied during the connection establishment\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"entrypointsInfo | gioFilterConnectorsByMode: 'REQUEST_RESPONSE'\"\n [endConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'REQUEST_RESPONSE'\"\n [steps]=\"flow.request ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"REQUEST\"\n (stepsChange)=\"onStepsChange('request', $event)\"\n ></gio-ps-flow-details-phase>\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Response phase\"\n description=\"Policies will be applied during the connection termination\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'REQUEST_RESPONSE'\"\n [endConnector]=\"entrypointsInfo | gioFilterConnectorsByMode: 'REQUEST_RESPONSE'\"\n [steps]=\"flow.response ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"RESPONSE\"\n (stepsChange)=\"onStepsChange('response', $event)\"\n ></gio-ps-flow-details-phase>\n </ng-container>\n\n <mat-tab-group *ngIf=\"apiType === 'NATIVE'\" class=\"content__tabs\" dynamicHeight>\n <mat-tab label=\"Global\" bodyClass=\"content__tabs__body\">\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Connect phase\"\n description=\"Policies will be applied when the client connects to the Gateway\"\n [disabledNotYetAvailable]=\"true\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'CONNECT'\"\n [endConnector]=\"entrypointsInfo | gioFilterConnectorsByMode: 'CONNECT'\"\n [steps]=\"flow.connect ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"CONNECT\"\n (stepsChange)=\"onStepsChange('connect', $event)\"\n >\n </gio-ps-flow-details-phase>\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Interact phase\"\n description=\"Policies will be applied on all interactions between the client and the Gateway\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"entrypointsInfo | gioFilterConnectorsByMode: 'INTERACT'\"\n [endConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'INTERACT'\"\n [steps]=\"flow.interact ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"INTERACT\"\n (stepsChange)=\"onStepsChange('interact', $event)\"\n ></gio-ps-flow-details-phase>\n </mat-tab>\n <mat-tab label=\"Event messages\" bodyClass=\"content__tabs__body\">\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Publish phase\"\n description=\"Policies will be applied when publishing messages\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"entrypointsInfo | gioFilterConnectorsByMode: 'PUBLISH'\"\n [endConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'PUBLISH'\"\n [steps]=\"flow.publish ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"PUBLISH\"\n (stepsChange)=\"onStepsChange('publish', $event)\"\n ></gio-ps-flow-details-phase>\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Subscribe phase\"\n description=\"Policies will be applied when fetching messages\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'SUBSCRIBE'\"\n [endConnector]=\"entrypointsInfo | gioFilterConnectorsByMode: 'SUBSCRIBE'\"\n [steps]=\"flow.subscribe ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"SUBSCRIBE\"\n (stepsChange)=\"onStepsChange('subscribe', $event)\"\n ></gio-ps-flow-details-phase>\n </mat-tab>\n </mat-tab-group>\n </div>\n </ng-container>\n\n <ng-template #emptyFlows>\n <div class=\"emptyFlows\">\n <h2>No flows yet</h2>\n <p class=\"mat-body-1\">Flows allow you to customize the behavior of your API event phases through configurable policies</p>\n </div>\n </ng-template>\n</ng-template>\n\n<ng-template #loadingTpl>\n <div class=\"header loading\">\n <div class=\"header__label\">Flow details</div>\n <div class=\"header__configBtn\">\n <button class=\"header__configBtn__edit\" mat-stroked-button disabled>\n <mat-icon svgIcon=\"gio:edit-pencil\"></mat-icon>\n </button>\n <button class=\"header__configBtn__delete\" mat-stroked-button disabled>\n <mat-icon svgIcon=\"gio:trash\"></mat-icon>\n </button>\n </div>\n </div>\n <gio-ps-flow-details-info-bar class=\"infoBar loading\"></gio-ps-flow-details-info-bar>\n <div class=\"content loading\">\n <gio-loader></gio-loader>\n </div>\n</ng-template>\n", styles: ["@charset \"UTF-8\";.gio-top-bar-menu .gio-badge-accent{background-color:var(--gio-oem-palette--active, #ffc2ac);color:var(--gio-oem-palette--active-contrast, #1e1b1b)}:host{display:flex;height:100%;flex-direction:column}.emptyFlows{display:flex;max-width:500px;height:100%;flex-direction:column;justify-content:center;margin:auto;text-align:center}.header{display:flex;align-items:center;padding:16px;border-bottom:1px solid #d2cecd}.header__label{font-family:Kanit,Helvetica Neue,sans-serif;font-size:16px;font-weight:500;letter-spacing:.4px;line-height:24px;display:flex;flex:1 1 auto;align-items:center;margin-bottom:0;gap:8px}.header__configBtn{display:flex;align-items:center;margin-left:8px;gap:8px}.infoBar{border-bottom:1px solid #d2cecd}.infoBar.loading{min-height:52px}.infoBar.flowDisabled{opacity:.5}.content{overflow:auto;flex:1 1 auto;background-color:#f7f7f8}.content.flowDisabled{opacity:.5}.content__tabs{min-height:100%;min-height:calc(100% - 64px)}.content__phase{margin:16px 16px 0}.content.loading{display:flex}\n"] }]
161
+ }], ctorParameters: () => [{ type: i1.MatDialog }], propDecorators: { readOnly: [{
162
+ type: Input
163
+ }], loading: [{
164
+ type: Input
165
+ }], apiType: [{
166
+ type: Input
167
+ }], flow: [{
168
+ type: Input
169
+ }], entrypointsInfo: [{
170
+ type: Input
171
+ }], endpointsInfo: [{
172
+ type: Input
173
+ }], policies: [{
174
+ type: Input
175
+ }], genericPolicies: [{
176
+ type: Input
177
+ }], trialUrl: [{
178
+ type: Input
179
+ }], flowChange: [{
180
+ type: Output
181
+ }], deleteFlow: [{
182
+ type: Output
183
+ }] } });
184
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2lvLXBzLWZsb3ctZGV0YWlscy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS1wb2xpY3ktc3R1ZGlvLWFuZ3VsYXIvc3JjL2xpYi9jb21wb25lbnRzL2Zsb3ctZGV0YWlscy9naW8tcHMtZmxvdy1kZXRhaWxzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3VpLXBvbGljeS1zdHVkaW8tYW5ndWxhci9zcmMvbGliL2NvbXBvbmVudHMvZmxvdy1kZXRhaWxzL2dpby1wcy1mbG93LWRldGFpbHMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUVqRyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNqQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxlQUFlLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwSCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUc3RCxPQUFPLEVBQ0wsNkNBQTZDLEdBRTlDLE1BQU0sd0ZBQXdGLENBQUM7QUFFaEcsT0FBTyxFQUNMLDJDQUEyQyxHQUU1QyxNQUFNLG9GQUFvRixDQUFDO0FBRTVGLE9BQU8sRUFBRSxvQ0FBb0MsRUFBRSxNQUFNLDJE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LENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2YsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQztZQUNuQixHQUFHLElBQUksQ0FBQyxJQUFJO1lBQ1osQ0FBQyxTQUFTLENBQUMsRUFBRSxLQUFLO1lBQ2xCLFdBQVcsRUFBRSxJQUFJO1NBQ2xCLENBQUMsQ0FBQztJQUNMLENBQUM7OEdBMUpVLCtCQUErQjtrR0FBL0IsK0JBQStCLGlaQzdENUMsdzVWQStPQSxta0NEak1JLFlBQVksa0lBQ1osYUFBYSw4cEJBQ2IsZUFBZSwyTkFDZixjQUFjLG9MQUNkLG9DQUFvQywyUUFDcEMsNkJBQTZCLGlFQUM3QixlQUFlLDJHQUNmLHNDQUFzQyw2R0FDdEMsZ0JBQWdCLDRUQUNoQixlQUFlOzsyRkFNTiwrQkFBK0I7a0JBakIzQyxTQUFTOzhCQUNDO3dCQUNQLFlBQVk7d0JBQ1osYUFBYTt3QkFDYixlQUFlO3dCQUNmLGNBQWM7d0JBQ2Qsb0NBQW9DO3dCQUNwQyw2QkFBNkI7d0JBQzdCLGVBQWU7d0JBQ2Ysc0NBQXNDO3dCQUN0QyxnQkFBZ0I7d0JBQ2hCLGVBQWU7cUJBQ2hCLFlBQ1MscUJBQXFCOzhFQU14QixRQUFRO3NCQURkLEtBQUs7Z0JBSUMsT0FBTztzQkFEYixLQUFLO2dCQUlDLE9BQU87c0JBRGIsS0FBSztnQkFJQyxJQUFJO3NCQURWLEtBQUs7Z0JBSUMsZUFBZTtzQkFEckIsS0FBSztnQkFJQyxhQUFhO3NCQURuQixLQUFLO2dCQUlDLFFBQVE7c0JBRGQsS0FBSztnQkFJQyxlQUFlO3NCQURyQixLQUFLO2dCQUlDLFFBQVE7c0JBRGQsS0FBSztnQkFJQyxVQUFVO3NCQURoQixNQUFNO2dCQUlBLFVBQVU7c0JBRGhCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBHcmF2aXRlZSB0ZWFtIChodHRwOi8vZ3Jhdml0ZWUuaW8pXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IGlzRW1wdHkgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgR0lPX0RJQUxPR19XSURUSCwgR2lvQmFubmVyTW9kdWxlLCBHaW9JY29uc01vZHVsZSwgR2lvTG9hZGVyTW9kdWxlIH0gZnJvbSAnQGdyYXZpdGVlL3VpLXBhcnRpY2xlcy1hbmd1bGFyJztcbmltcG9ydCB7IE1hdFRhYnNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJzJztcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTWF0VG9vbHRpcE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xuXG5pbXBvcnQgeyBGbG93Vk0gfSBmcm9tICcuLi8uLi9wb2xpY3ktc3R1ZGlvL2dpby1wb2xpY3ktc3R1ZGlvLm1vZGVsJztcbmltcG9ydCB7XG4gIEdpb1BvbGljeVN0dWRpb0Zsb3dNZXNzYWdlRm9ybURpYWxvZ0NvbXBvbmVudCxcbiAgR2lvUG9saWN5U3R1ZGlvRmxvd01lc3NhZ2VGb3JtRGlhbG9nRGF0YSxcbn0gZnJvbSAnLi4vZmxvdy1mb3JtLWRpYWxvZy9mbG93LW1lc3NhZ2UtZm9ybS1kaWFsb2cvZ2lvLXBzLWZsb3ctbWVzc2FnZS1mb3JtLWRpYWxvZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgQXBpVHlwZSwgQ2hhbm5lbFNlbGVjdG9yLCBDb25uZWN0b3JJbmZvLCBPcGVyYXRpb24sIFBvbGljeSwgU3RlcCwgR2VuZXJpY1BvbGljeSB9IGZyb20gJy4uLy4uL21vZGVscyc7XG5pbXBvcnQge1xuICBHaW9Qb2xpY3lTdHVkaW9GbG93UHJveHlGb3JtRGlhbG9nQ29tcG9uZW50LFxuICBHaW9Qb2xpY3lTdHVkaW9GbG93UHJveHlGb3JtRGlhbG9nRGF0YSxcbn0gZnJvbSAnLi4vZmxvdy1mb3JtLWRpYWxvZy9mbG93LXByb3h5LWZvcm0tZGlhbG9nL2dpby1wcy1mbG93LXByb3h5LWZvcm0tZGlhbG9nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBHaW9Qb2xpY3lTdHVkaW9GbG93Rm9ybURpYWxvZ1Jlc3VsdCB9IGZyb20gJy4uL2Zsb3ctZm9ybS1kaWFsb2cvZ2lvLXBzLWZsb3ctZm9ybS1kaWFsb2ctcmVzdWx0Lm1vZGVsJztcbmltcG9ydCB7IEdpb1BvbGljeVN0dWRpb0RldGFpbHNQaGFzZUNvbXBvbmVudCB9IGZyb20gJy4uL2Zsb3ctZGV0YWlscy1waGFzZS9naW8tcHMtZmxvdy1kZXRhaWxzLXBoYXNlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBHaW9GaWx0ZXJDb25uZWN0b3JzQnlNb2RlUGlwZSB9IGZyb20gJy4uL2ZpbHRlci1waXBlL2dpby1mbHRlci1jb25uZWN0b3JzLWJ5LW1vZGUucGlwZSc7XG5pbXBvcnQgeyBHaW9Qb2xpY3lTdHVkaW9EZXRhaWxzSW5mb0JhckNvbXBvbmVudCB9IGZyb20gJy4uL2Zsb3ctZGV0YWlscy1pbmZvLWJhci9naW8tcHMtZmxvdy1kZXRhaWxzLWluZm8tYmFyLmNvbXBvbmVudCc7XG5pbXBvcnQge1xuICBHaW9Qb2xpY3lTdHVkaW9GbG93TmF0aXZlRm9ybURpYWxvZ0NvbXBvbmVudCxcbiAgR2lvUG9saWN5U3R1ZGlvRmxvd05hdGl2ZUZvcm1EaWFsb2dEYXRhLFxufSBmcm9tICcuLi9mbG93LWZvcm0tZGlhbG9nL2Zsb3ctbmF0aXZlLWZvcm0tZGlhbG9nL2dpby1wcy1mbG93LW5hdGl2ZS1mb3JtLWRpYWxvZy5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBNYXRUYWJzTW9kdWxlLFxuICAgIE1hdEJ1dHRvbk1vZHVsZSxcbiAgICBHaW9JY29uc01vZHVsZSxcbiAgICBHaW9Qb2xpY3lTdHVkaW9EZXRhaWxzUGhhc2VDb21wb25lbnQsXG4gICAgR2lvRmlsdGVyQ29ubmVjdG9yc0J5TW9kZVBpcGUsXG4gICAgR2lvTG9hZGVyTW9kdWxlLFxuICAgIEdpb1BvbGljeVN0dWRpb0RldGFpbHNJbmZvQmFyQ29tcG9uZW50LFxuICAgIE1hdFRvb2x0aXBNb2R1bGUsXG4gICAgR2lvQmFubmVyTW9kdWxlLFxuICBdLFxuICBzZWxlY3RvcjogJ2dpby1wcy1mbG93LWRldGFpbHMnLFxuICB0ZW1wbGF0ZVVybDogJy4vZ2lvLXBzLWZsb3ctZGV0YWlscy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2dpby1wcy1mbG93LWRldGFpbHMuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgR2lvUG9saWN5U3R1ZGlvRGV0YWlsc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyByZWFkT25seSA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBsb2FkaW5nID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGFwaVR5cGUhOiBBcGlUeXBlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBmbG93PzogRmxvd1ZNID0gdW5kZWZpbmVkO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBlbnRyeXBvaW50c0luZm86IENvbm5lY3RvckluZm9bXSA9IFtdO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBlbmRwb2ludHNJbmZvOiBDb25uZWN0b3JJbmZvW10gPSBbXTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgcG9saWNpZXM6IFBvbGljeVtdID0gW107XG5cbiAgQElucHV0KClcbiAgcHVibGljIGdlbmVyaWNQb2xpY2llczogR2VuZXJpY1BvbGljeVtdID0gW107XG5cbiAgQElucHV0KClcbiAgcHVibGljIHRyaWFsVXJsPzogc3RyaW5nO1xuXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgZmxvd0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Rmxvd1ZNPigpO1xuXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgZGVsZXRlRmxvdyA9IG5ldyBFdmVudEVtaXR0ZXI8Rmxvd1ZNPigpO1xuXG4gIHB1YmxpYyBtZXNzYWdlRmxvd0VudHJ5cG9pbnRzSW5mbzogQ29ubmVjdG9ySW5mb1tdID0gW107XG5cbiAgcHVibGljIG9wZXJhdGlvbnM6IE9wZXJhdGlvbltdID0gW107XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBtYXREaWFsb2c6IE1hdERpYWxvZykge31cblxuICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzLmVudHJ5cG9pbnRzSW5mbyB8fCBjaGFuZ2VzLmZsb3cpIHtcbiAgICAgIGNvbnN0IGNoYW5uZWxTZWxlY3RvciA9IHRoaXMuZmxvdz8uc2VsZWN0b3JzPy5maW5kKHMgPT4gcy50eXBlID09PSAnQ0hBTk5FTCcpIGFzIENoYW5uZWxTZWxlY3RvcjtcblxuICAgICAgdGhpcy5vcGVyYXRpb25zID0gY2hhbm5lbFNlbGVjdG9yPy5vcGVyYXRpb25zID8/IFtdO1xuXG4gICAgICBpZiAoIWNoYW5uZWxTZWxlY3Rvcikge1xuICAgICAgICAvLyBJZiBubyBjaGFubmVsIHNlbGVjdG9yIGZvdW5kLiBLZWVwIGRlZmF1bHQgdmFsdWVcbiAgICAgICAgdGhpcy5tZXNzYWdlRmxvd0VudHJ5cG9pbnRzSW5mbyA9IFtdO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMubWVzc2FnZUZsb3dFbnRyeXBvaW50c0luZm8gPVxuICAgICAgICB0aGlzLmVudHJ5cG9pbnRzSW5mbz8uZmlsdGVyKFxuICAgICAgICAgIGUgPT5cbiAgICAgICAgICAgIC8vIElmIG5vdCBlbnRyeXBvaW50cyBhcmUgZGVmaW5lZCwgYWxsIGVudHJ5cG9pbnRzIGFyZSB2YWxpZFxuICAgICAgICAgICAgIWNoYW5uZWxTZWxlY3Rvci5lbnRyeXBvaW50cyB8fCBpc0VtcHR5KGNoYW5uZWxTZWxlY3Rvci5lbnRyeXBvaW50cykgfHwgY2hhbm5lbFNlbGVjdG9yLmVudHJ5cG9pbnRzPy5pbmNsdWRlcyhlLnR5cGUpLFxuICAgICAgICApID8/IFtdO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvbkVkaXRGbG93KCk6IHZvaWQge1xuICAgIGxldCBkaWFsb2dSZXN1bHQ7XG4gICAgc3dpdGNoICh0aGlzLmFwaVR5cGUpIHtcbiAgICAgIGNhc2UgJ01FU1NBR0UnOlxuICAgICAgICBkaWFsb2dSZXN1bHQgPSB0aGlzLm1hdERpYWxvZ1xuICAgICAgICAgIC5vcGVuPFxuICAgICAgICAgICAgR2lvUG9saWN5U3R1ZGlvRmxvd01lc3NhZ2VGb3JtRGlhbG9nQ29tcG9uZW50LFxuICAgICAgICAgICAgR2lvUG9saWN5U3R1ZGlvRmxvd01lc3NhZ2VGb3JtRGlhbG9nRGF0YSxcbiAgICAgICAgICAgIEdpb1BvbGljeVN0dWRpb0Zsb3dGb3JtRGlhbG9nUmVzdWx0XG4gICAgICAgICAgPihHaW9Qb2xpY3lTdHVkaW9GbG93TWVzc2FnZUZvcm1EaWFsb2dDb21wb25lbnQsIHtcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgZmxvdzogdGhpcy5mbG93LFxuICAgICAgICAgICAgICBlbnRyeXBvaW50czogdGhpcy5lbnRyeXBvaW50c0luZm8gPz8gW10sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcm9sZTogJ2FsZXJ0ZGlhbG9nJyxcbiAgICAgICAgICAgIGlkOiAnZ2lvUHNGbG93TWVzc2FnZUZvcm1EaWFsb2cnLFxuICAgICAgICAgICAgd2lkdGg6IEdJT19ESUFMT0dfV0lEVEguTUVESVVNLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmFmdGVyQ2xvc2VkKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnUFJPWFknOlxuICAgICAgICBkaWFsb2dSZXN1bHQgPSB0aGlzLm1hdERpYWxvZ1xuICAgICAgICAgIC5vcGVuPEdpb1BvbGljeVN0dWRpb0Zsb3dQcm94eUZvcm1EaWFsb2dDb21wb25lbnQsIEdpb1BvbGljeVN0dWRpb0Zsb3dQcm94eUZvcm1EaWFsb2dEYXRhLCBHaW9Qb2xpY3lTdHVkaW9GbG93Rm9ybURpYWxvZ1Jlc3VsdD4oXG4gICAgICAgICAgICBHaW9Qb2xpY3lTdHVkaW9GbG93UHJveHlGb3JtRGlhbG9nQ29tcG9uZW50LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgZmxvdzogdGhpcy5mbG93LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICByb2xlOiAnYWxlcnRkaWFsb2cnLFxuICAgICAgICAgICAgICBpZDogJ2dpb1BzRmxvd1Byb3h5Rm9ybURpYWxvZycsXG4gICAgICAgICAgICAgIHdpZHRoOiBHSU9fRElBTE9HX1dJRFRILk1FRElVTSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgKVxuICAgICAgICAgIC5hZnRlckNsb3NlZCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ05BVElWRSc6XG4gICAgICAgIGRpYWxvZ1Jlc3VsdCA9IHRoaXMubWF0RGlhbG9nXG4gICAgICAgICAgLm9wZW48R2lvUG9saWN5U3R1ZGlvRmxvd05hdGl2ZUZvcm1EaWFsb2dDb21wb25lbnQsIEdpb1BvbGljeVN0dWRpb0Zsb3dOYXRpdmVGb3JtRGlhbG9nRGF0YSwgR2lvUG9saWN5U3R1ZGlvRmxvd0Zvcm1EaWFsb2dSZXN1bHQ+KFxuICAgICAgICAgICAgR2lvUG9saWN5U3R1ZGlvRmxvd05hdGl2ZUZvcm1EaWFsb2dDb21wb25lbnQsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICBmbG93OiB0aGlzLmZsb3csXG4gICAgICAgICAgICAgICAgcGFyZW50R3JvdXBOYW1lOiB0aGlzLmZsb3chLl9wYXJlbnRGbG93R3JvdXBOYW1lLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICByb2xlOiAnYWxlcnRkaWFsb2cnLFxuICAgICAgICAgICAgICBpZDogJ2dpb1BzRmxvd05hdGl2ZUZvcm1EaWFsb2cnLFxuICAgICAgICAgICAgICB3aWR0aDogR0lPX0RJQUxPR19XSURUSC5NRURJVU0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIClcbiAgICAgICAgICAuYWZ0ZXJDbG9zZWQoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIEFQSSB0eXBlICR7dGhpcy5hcGlUeXBlfWApO1xuICAgIH1cblxuICAgIGRpYWxvZ1Jlc3VsdFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcChjcmVhdGVkT3JFZGl0ZWQgPT4ge1xuICAgICAgICAgIGlmICghY3JlYXRlZE9yRWRpdGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuZmxvd0NoYW5nZS5lbWl0KGNyZWF0ZWRPckVkaXRlZCk7XG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHVibGljIG9uRGVsZXRlRmxvdygpOiB2b2lkIHtcbiAgICB0aGlzLmRlbGV0ZUZsb3cuZW1pdCh0aGlzLmZsb3cpO1xuICB9XG5cbiAgcHVibGljIG9uRW5hYmxlRGlzYWJsZUZsb3coKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmZsb3cpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmZsb3dDaGFuZ2UuZW1pdCh7XG4gICAgICAuLi50aGlzLmZsb3csXG4gICAgICBlbmFibGVkOiAhdGhpcy5mbG93LmVuYWJsZWQsXG4gICAgICBfaGFzQ2hhbmdlZDogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBvblN0ZXBzQ2hhbmdlKGZsb3dQaGFzZTogJ2Nvbm5lY3QnIHwgJ2ludGVyYWN0JyB8ICdyZXF1ZXN0JyB8ICdyZXNwb25zZScgfCAncHVibGlzaCcgfCAnc3Vic2NyaWJlJywgc3RlcHM6IFN0ZXBbXSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5mbG93KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5mbG93Q2hhbmdlLmVtaXQoe1xuICAgICAgLi4udGhpcy5mbG93LFxuICAgICAgW2Zsb3dQaGFzZV06IHN0ZXBzLFxuICAgICAgX2hhc0NoYW5nZWQ6IHRydWUsXG4gICAgfSk7XG4gIH1cbn1cbiIsIjwhLS1cblxuICAgIENvcHlyaWdodCAoQykgMjAyMyBUaGUgR3Jhdml0ZWUgdGVhbSAoaHR0cDovL2dyYXZpdGVlLmlvKVxuICAgIFxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIFxuICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbi0tPlxuXG48bmctY29udGFpbmVyICpuZ0lmPVwiIWxvYWRpbmc7IHRoZW4gZmxvd0RldGFpbHNUcGw7IGVsc2UgbG9hZGluZ1RwbFwiPjwvbmctY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGUgI2Zsb3dEZXRhaWxzVHBsPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiZmxvdzsgZWxzZSBlbXB0eUZsb3dzXCI+XG4gICAgPGRpdiBjbGFzcz1cImhlYWRlclwiPlxuICAgICAgPGRpdiBjbGFzcz1cImhlYWRlcl9fbGFiZWxcIj5cbiAgICAgICAgRmxvdyBkZXRhaWxzXG4gICAgICAgIDxkaXYgKm5nSWY9XCIhZmxvdy5lbmFibGVkXCIgY2xhc3M9XCJnaW8tYmFkZ2UgZ2lvLWJhZGdlLW5ldXRyYWxcIj5EaXNhYmxlZDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyX19jb25maWdCdG5cIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIFtkaXNhYmxlZF09XCJyZWFkT25seVwiXG4gICAgICAgICAgY2xhc3M9XCJoZWFkZXJfX2NvbmZpZ0J0bl9fZW5hYmxlRGlzYWJsZVwiXG4gICAgICAgICAgbWF0LXN0cm9rZWQtYnV0dG9uXG4gICAgICAgICAgW21hdFRvb2x0aXBdPVwiZmxvdy5lbmFibGVkID8gJ0Rpc2FibGUnIDogJ0VuYWJsZSdcIlxuICAgICAgICAgIChjbGljayk9XCJvbkVuYWJsZURpc2FibGVGbG93KClcIlxuICAgICAgICA+XG4gICAgICAgICAgPG1hdC1pY29uIFtzdmdJY29uXT1cImZsb3cuZW5hYmxlZCA/ICdnaW86cHJvaGliaXRpb24nIDogJ2dpbzpjaGVjay1jaXJjbGVkLW91dGxpbmUnXCI+PC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gW2Rpc2FibGVkXT1cInJlYWRPbmx5XCIgY2xhc3M9XCJoZWFkZXJfX2NvbmZpZ0J0bl9fZWRpdFwiIG1hdC1zdHJva2VkLWJ1dHRvbiAoY2xpY2spPVwib25FZGl0RmxvdygpXCIgbWF0VG9vbHRpcD1cIkVkaXRcIj5cbiAgICAgICAgICA8bWF0LWljb24gc3ZnSWNvbj1cImdpbzplZGl0LXBlbmNpbFwiPjwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIFtkaXNhYmxlZF09XCJyZWFkT25seVwiIGNsYXNzPVwiaGVhZGVyX19jb25maWdCdG5fX2RlbGV0ZVwiIG1hdC1zdHJva2VkLWJ1dHRvbiAoY2xpY2spPVwib25EZWxldGVGbG93KClcIiBtYXRUb29sdGlwPVwiRGVsZXRlXCI+XG4gICAgICAgICAgPG1hdC1pY29uIHN2Z0ljb249XCJnaW86dHJhc2hcIj48L21hdC1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxnaW8tcHMtZmxvdy1kZXRhaWxzLWluZm8tYmFyXG4gICAgICBjbGFzcz1cImluZm9CYXJcIlxuICAgICAgW2NsYXNzLmZsb3dEaXNhYmxlZF09XCIhZmxvdy5lbmFibGVkXCJcbiAgICAgIFtmbG93XT1cImZsb3dcIlxuICAgICAgW2VudHJ5cG9pbnRzSW5mb109XCJlbnRyeXBvaW50c0luZm9cIlxuICAgID48L2dpby1wcy1mbG93LWRldGFpbHMtaW5mby1iYXI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiY29udGVudFwiIFtjbGFzcy5mbG93RGlzYWJsZWRdPVwiIWZsb3cuZW5hYmxlZFwiPlxuICAgICAgPG1hdC10YWItZ3JvdXAgKm5nSWY9XCJhcGlUeXBlID09PSAnTUVTU0FHRSdcIiBjbGFzcz1cImNvbnRlbnRfX3RhYnNcIiBkeW5hbWljSGVpZ2h0PlxuICAgICAgICA8bWF0LXRhYiBsYWJlbD1cIkluaXRpYWwgY29ubmVjdGlvblwiIGJvZHlDbGFzcz1cImNvbnRlbnRfX3RhYnNfX2JvZHlcIj5cbiAgICAgICAgICA8Z2lvLXBzLWZsb3ctZGV0YWlscy1waGFzZVxuICAgICAgICAgICAgY2xhc3M9XCJjb250ZW50X19waGFzZVwiXG4gICAgICAgICAgICBuYW1lPVwiUmVxdWVzdCBwaGFzZVwiXG4gICAgICAgICAgICBkZXNjcmlwdGlvbj1cIlBvbGljaWVzIHdpbGwgYmUgYXBwbGllZCBkdXJpbmcgdGhlIGNvbm5lY3Rpb24gZXN0YWJsaXNobWVudFwiXG4gICAgICAgICAgICBbcmVhZE9ubHldPVwicmVhZE9ubHlcIlxuICAgICAgICAgICAgW3N0YXJ0Q29ubmVjdG9yXT1cIm1lc3NhZ2VGbG93RW50cnlwb2ludHNJbmZvXCJcbiAgICAgICAgICAgIFtlbmRDb25uZWN0b3JdPVwiZW5kcG9pbnRzSW5mb1wiXG4gICAgICAgICAgICBbc3RlcHNdPVwiZmxvdy5yZXF1ZXN0ID8/IFtdXCJcbiAgICAgICAgICAgIFthcGlUeXBlXT1cImFwaVR5cGVcIlxuICAgICAgICAgICAgW2dlbmVyaWNQb2xpY2llc109XCJnZW5lcmljUG9saWNpZXNcIlxuICAgICAgICAgICAgW3RyaWFsVXJsXT1cInRyaWFsVXJsXCJcbiAgICAgICAgICAgIHBvbGljeUZsb3dQaGFzZT1cIlJFUVVFU1RcIlxuICAgICAgICAgICAgKHN0ZXBzQ2hhbmdlKT1cIm9uU3RlcHNDaGFuZ2UoJ3JlcXVlc3QnLCAkZXZlbnQpXCJcbiAgICAgICAgICA+PC9naW8tcHMtZmxvdy1kZXRhaWxzLXBoYXNlPlxuICAgICAgICAgIDxnaW8tcHMtZmxvdy1kZXRhaWxzLXBoYXNlXG4gICAgICAgICAgICBjbGFzcz1cImNvbnRlbnRfX3BoYXNlXCJcbiAgICAgICAgICAgIG5hbWU9XCJSZXNwb25zZSBwaGFzZVwiXG4gICAgICAgICAgICBkZXNjcmlwdGlvbj1cIlBvbGljaWVzIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgcmVzcG9uc2UgZnJvbSB0aGUgaW5pdGlhbCBjb25uZWN0aW9uXCJcbiAgICAgICAgICAgIFtyZWFkT25seV09XCJyZWFkT25seVwiXG4gICAgICAgICAgICBbc3RhcnRDb25uZWN0b3JdPVwiZW5kcG9pbnRzSW5mb1wiXG4gICAgICAgICAgICBbZW5kQ29ubmVjdG9yXT1cIm1lc3NhZ2VGbG93RW50cnlwb2ludHNJbmZvXCJcbiAgICAgICAgICAgIFtzdGVwc109XCJmbG93LnJlc3BvbnNlID8/IFtdXCJcbiAgICAgICAgICAgIFthcGlUeXBlXT1cImFwaVR5cGVcIlxuICAgICAgICAgICAgW2dlbmVyaWNQb2xpY2llc109XCJnZW5lcmljUG9saWNpZXNcIlxuICAgICAgICAgICAgW3RyaWFsVXJsXT1cInRyaWFsVXJsXCJcbiAgICAgICAgICAgIHBvbGljeUZsb3dQaGFzZT1cIlJFU1BPTlNFXCJcbiAgICAgICAgICAgIChzdGVwc0NoYW5nZSk9XCJvblN0ZXBzQ2hhbmdlKCdyZXNwb25zZScsICRldmVudClcIlxuICAgICAgICAgID48L2dpby1wcy1mbG93LWRldGFpbHMtcGhhc2U+XG4gICAgICAgIDwvbWF0LXRhYj5cbiAgICAgICAgPG1hdC10YWIgbGFiZWw9XCJFdmVudCBtZXNzYWdlc1wiIGJvZHlDbGFzcz1cImNvbnRlbnRfX3RhYnNfX2JvZHlcIj5cbiAgICAgICAgICA8Z2lvLXBzLWZsb3ctZGV0YWlscy1waGFzZVxuICAgICAgICAgICAgY2xhc3M9XCJjb250ZW50X19waGFzZVwiXG4gICAgICAgICAgICBuYW1lPVwiUHVibGlzaCBwaGFzZVwiXG4gICAgICAgICAgICBkZXNjcmlwdGlvbj1cIlBvbGljaWVzIHdpbGwgYmUgYXBwbGllZCBvbiBtZXNzYWdlcyBzZW50IHRvIHRoZSBlbmRwb2ludFwiXG4gICAgICAgICAgICBbcmVhZE9ubHldPVwicmVhZE9ubHlcIlxuICAgICAgICAgICAgW3N0YXJ0Q29ubmVjdG9yXT1cIm1lc3NhZ2VGbG93RW50cnlwb2ludHNJbmZvIHwgZ2lvRmlsdGVyQ29ubmVjdG9yc0J5TW9kZTogJ1BVQkxJU0gnIDogb3BlcmF0aW9uc1wiXG4gICAgICAgICAgICBbZW5kQ29ubmVjdG9yXT1cImVuZHBvaW50c0luZm8gfCBnaW9GaWx0ZXJDb25uZWN0b3JzQnlNb2RlOiAnUFVCTElTSCcgOiBvcGVyYXRpb25zXCJcbiAgICAgICAgICAgIFtzdGVwc109XCJmbG93LnB1Ymxpc2ggPz8gW11cIlxuICAgICAgICAgICAgW2FwaVR5cGVdPVwiYXBpVHlwZVwiXG4gICAgICAgICAgICBbZ2VuZXJpY1BvbGljaWVzXT1cImdlbmVyaWNQb2xpY2llc1wiXG4gICAgICAgICAgICBbdHJpYWxVcmxdPVwidHJpYWxVcmxcIlxuICAgICAgICAgICAgcG9saWN5Rmxvd1BoYXNlPVwiUFVCTElTSFwiXG4gICAgICAgICAgICAoc3RlcHNDaGFuZ2UpPVwib25TdGVwc0NoYW5nZSgncHVibGlzaCcsICRldmVudClcIlxuICAgICAgICAgID48L2dpby1wcy1mbG93LWRldGFpbHMtcGhhc2U+XG4gICAgICAgICAgPGdpby1wcy1mbG93LWRldGFpbHMtcGhhc2VcbiAgICAgICAgICAgIGNsYXNzPVwiY29udGVudF9fcGhhc2VcIlxuICAgICAgICAgICAgbmFtZT1cIlN1YnNjcmliZSBwaGFzZVwiXG4gICAgICAgICAgICBkZXNjcmlwdGlvbj1cIlBvbGljaWVzIHdpbGwgYmUgYXBwbGllZCBvbiBtZXNzYWdlcyByZWNlaXZlZCBieSB0aGUgZW50cnlwb2ludFwiXG4gICAgICAgICAgICBbcmVhZE9ubHldPVwicmVhZE9ubHlcIlxuICAgICAgICAgICAgW3N0YXJ0Q29ubmVjdG9yXT1cImVuZHBvaW50c0luZm8gfCBnaW9GaWx0ZXJDb25uZWN0b3JzQnlNb2RlOiAnU1VCU0NSSUJFJyA6IG9wZXJhdGlvbnNcIlxuICAgICAgICAgICAgW2VuZENvbm5lY3Rvcl09XCJtZXNzYWdlRmxvd0VudHJ5cG9pbnRzSW5mbyB8IGdpb0ZpbHRlckNvbm5lY3RvcnNCeU1vZGU6ICdTVUJTQ1JJQkUnIDogb3BlcmF0aW9uc1wiXG4gICAgICAgICAgICBbc3RlcHNdPVwiZmxvdy5zdWJzY3JpYmUgPz8gW11cIlxuICAgICAgICAgICAgW2FwaVR5cGVdPVwiYXBpVHlwZVwiXG4gICAgICAgICAgICBbZ2VuZXJpY1BvbGljaWVzXT1cImdlbmVyaWNQb2xpY2llc1wiXG4gICAgICAgICAgICBbdHJpYWxVcmxdPVwidHJpYWxVcmxcIlxuICAgICAgICAgICAgcG9saWN5Rmxvd1BoYXNlPVwiU1VCU0NSSUJFXCJcbiAgICAgICAgICAgIChzdGVwc0NoYW5nZSk9XCJvblN0ZXBzQ2hhbmdlKCdzdWJzY3JpYmUnLCAkZXZlbnQpXCJcbiAgICAgICAgICA+PC9naW8tcHMtZmxvdy1kZXRhaWxzLXBoYXNlPlxuICAgICAgICA8L21hdC10YWI+XG4gICAgICA8L21hdC10YWItZ3JvdXA+XG5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhcGlUeXBlID09PSAnUFJPWFknXCI+XG4gICAgICAgIDxnaW8tcHMtZmxvdy1kZXRhaWxzLXBoYXNlXG4gICAgICAgICAgY2xhc3M9XCJjb250ZW50X19waGFzZVwiXG4gICAgICAgICAgbmFtZT1cIlJlcXVlc3QgcGhhc2VcIlxuICAgICAgICAgIGRlc2NyaXB0aW9uPVwiUG9saWNpZXMgd2lsbCBiZSBhcHBsaWVkIGR1cmluZyB0aGUgY29ubmVjdGlvbiBlc3RhYmxpc2htZW50XCJcbiAgICAgICAgICBbcmVhZE9ubHldPVwicmVhZE9ubHlcIlxuICAgICAgICAgIFtzdGFydENvbm5lY3Rvcl09XCJlbnRyeXBvaW50c0luZm8gfCBnaW9GaWx0ZXJDb25uZWN0b3JzQnlNb2RlOiAnUkVRVUVTVF9SRVNQT05TRSdcIlxuICAgICAgICAgIFtlbmRDb25uZWN0b3JdPVwiZW5kcG9pbnRzSW5mbyB8IGdpb0ZpbHRlckNvbm5lY3RvcnNCeU1vZGU6ICdSRVFVRVNUX1JFU1BPTlNFJ1wiXG4gICAgICAgICAgW3N0ZXBzXT1cImZsb3cucmVxdWVzdCA/PyBbXVwiXG4gICAgICAgICAgW2FwaVR5cGVdPVwiYXBpVHlwZVwiXG4gICAgICAgICAgW2dlbmVyaWNQb2xpY2llc109XCJnZW5lcmljUG9saWNpZXNcIlxuICAgICAgICAgIFt0cmlhbFVybF09XCJ0cmlhbFVybFwiXG4gICAgICAgICAgcG9saWN5Rmxvd1BoYXNlPVwiUkVRVUVTVFwiXG4gICAgICAgICAgKHN0ZXBzQ2hhbmdlKT1cIm9uU3RlcHNDaGFuZ2UoJ3JlcXVlc3QnLCAkZXZlbnQpXCJcbiAgICAgICAgPjwvZ2lvLXBzLWZsb3ctZGV0YWlscy1waGFzZT5cbiAgICAgICAgPGdpby1wcy1mbG93LWRldGFpbHMtcGhhc2VcbiAgICAgICAgICBjbGFzcz1cImNvbnRlbnRfX3BoYXNlXCJcbiAgICAgICAgICBuYW1lPVwiUmVzcG9uc2UgcGhhc2VcIlxuICAgICAgICAgIGRlc2NyaXB0aW9uPVwiUG9saWNpZXMgd2lsbCBiZSBhcHBsaWVkIGR1cmluZyB0aGUgY29ubmVjdGlvbiB0ZXJtaW5hdGlvblwiXG4gICAgICAgICAgW3JlYWRPbmx5XT1cInJlYWRPbmx5XCJcbiAgICAgICAgICBbc3RhcnRDb25uZWN0b3JdPVwiZW5kcG9pbnRzSW5mbyB8IGdpb0ZpbHRlckNvbm5lY3RvcnNCeU1vZGU6ICdSRVFVRVNUX1JFU1BPTlNFJ1wiXG4gICAgICAgICAgW2VuZENvbm5lY3Rvcl09XCJlbnRyeXBvaW50c0luZm8gfCBnaW9GaWx0ZXJDb25uZWN0b3JzQnlNb2RlOiAnUkVRVUVTVF9SRVNQT05TRSdcIlxuICAgICAgICAgIFtzdGVwc109XCJmbG93LnJlc3BvbnNlID8/IFtdXCJcbiAgICAgICAgICBbYXBpVHlwZV09XCJhcGlUeXBlXCJcbiAgICAgICAgICBbZ2VuZXJpY1BvbGljaWVzXT1cImdlbmVyaWNQb2xpY2llc1wiXG4gICAgICAgICAgW3RyaWFsVXJsXT1cInRyaWFsVXJsXCJcbiAgICAgICAgICBwb2xpY3lGbG93UGhhc2U9XCJSRVNQT05TRVwiXG4gICAgICAgICAgKHN0ZXBzQ2hhbmdlKT1cIm9uU3RlcHNDaGFuZ2UoJ3Jlc3BvbnNlJywgJGV2ZW50KVwiXG4gICAgICAgID48L2dpby1wcy1mbG93LWRldGFpbHMtcGhhc2U+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPG1hdC10YWItZ3JvdXAgKm5nSWY9XCJhcGlUeXBlID09PSAnTkFUSVZFJ1wiIGNsYXNzPVwiY29udGVudF9fdGFic1wiIGR5bmFtaWNIZWlnaHQ+XG4gICAgICAgIDxtYXQtdGFiIGxhYmVsPVwiR2xvYmFsXCIgYm9keUNsYXNzPVwiY29udGVudF9fdGFic19fYm9keVwiPlxuICAgICAgICAgIDxnaW8tcHMtZmxvdy1kZXRhaWxzLXBoYXNlXG4gICAgICAgICAgICBjbGFzcz1cImNvbnRlbnRfX3BoYXNlXCJcbiAgICAgICAgICAgIG5hbWU9XCJDb25uZWN0IHBoYXNlXCJcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uPVwiUG9saWNpZXMgd2lsbCBiZSBhcHBsaWVkIHdoZW4gdGhlIGNsaWVudCBjb25uZWN0cyB0byB0aGUgR2F0ZXdheVwiXG4gICAgICAgICAgICBbZGlzYWJsZWROb3RZZXRBdmFpbGFibGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbcmVhZE9ubHldPVwicmVhZE9ubHlcIlxuICAgICAgICAgICAgW3N0YXJ0Q29ubmVjdG9yXT1cImVuZHBvaW50c0luZm8gfCBnaW9GaWx0ZXJDb25uZWN0b3JzQnlNb2RlOiAnQ09OTkVDVCdcIlxuICAgICAgICAgICAgW2VuZENvbm5lY3Rvcl09XCJlbnRyeXBvaW50c0luZm8gfCBnaW9GaWx0ZXJDb25uZWN0b3JzQnlNb2RlOiAnQ09OTkVDVCdcIlxuICAgICAgICAgICAgW3N0ZXBzXT1cImZsb3cuY29ubmVjdCA/PyBbXVwiXG4gICAgICAgICAgICBbYXBpVHlwZV09XCJhcGlUeXBlXCJcbiAgICAgICAgICAgIFtnZW5lcmljUG9saWNpZXNdPVwiZ2VuZXJpY1BvbGljaWVzXCJcbiAgICAgICAgICAgIFt0cmlhbFVybF09XCJ0cmlhbFVybFwiXG4gICAgICAgICAgICBwb2xpY3lGbG93UGhhc2U9XCJDT05ORUNUXCJcbiAgICAgICAgICAgIChzdGVwc0NoYW5nZSk9XCJvblN0ZXBzQ2hhbmdlKCdjb25uZWN0JywgJGV2ZW50KVwiXG4gICAgICAgICAgPlxuICAgICAgICAgIDwvZ2lvLXBzLWZsb3ctZGV0YWlscy1waGFzZT5cbiAgICAgICAgICA8Z2lvLXBzLWZsb3ctZGV0YWlscy1waGFzZVxuICAgICAgICAgICAgY2xhc3M9XCJjb250ZW50X19waGFzZVwiXG4gICAgICAgICAgICBuYW1lPVwiSW50ZXJhY3QgcGhhc2VcIlxuICAgICAgICAgICAgZGVzY3JpcHRpb249XCJQb2xpY2llcyB3aWxsIGJlIGFwcGxpZWQgb24gYWxsIGludGVyYWN0aW9ucyBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHRoZSBHYXRld2F5XCJcbiAgICAgICAgICAgIFtyZWFkT25seV09XCJyZWFkT25seVwiXG4gICAgICAgICAgICBbc3RhcnRDb25uZWN0b3JdPVwiZW50cnlwb2ludHNJbmZvIHwgZ2lvRmlsdGVyQ29ubmVjdG9yc0J5TW9kZTogJ0lOVEVSQUNUJ1wiXG4gICAgICAgICAgICBbZW5kQ29ubmVjdG9yXT1cImVuZHBvaW50c0luZm8gfCBnaW9GaWx0ZXJDb25uZWN0b3JzQnlNb2RlOiAnSU5URVJBQ1QnXCJcbiAgICAgICAgICAgIFtzdGVwc109XCJmbG93LmludGVyYWN0ID8/IFtdXCJcbiAgICAgICAgICAgIFthcGlUeXBlXT1cImFwaVR5cGVcIlxuICAgICAgICAgICAgW2dlbmVyaWNQb2xpY2llc109XCJnZW5lcmljUG9saWNpZXNcIlxuICAgICAgICAgICAgW3RyaWFsVXJsXT1cInRyaWFsVXJsXCJcbiAgICAgICAgICAgIHBvbGljeUZsb3dQaGFzZT1cIklOVEVSQUNUXCJcbiAgICAgICAgICAgIChzdGVwc0NoYW5nZSk9XCJvblN0ZXBzQ2hhbmdlKCdpbnRlcmFjdCcsICRldmVudClcIlxuICAgICAgICAgID48L2dpby1wcy1mbG93LWRldGFpbHMtcGhhc2U+XG4gICAgICAgIDwvbWF0LXRhYj5cbiAgICAgICAgPG1hdC10YWIgbGFiZWw9XCJFdmVudCBtZXNzYWdlc1wiIGJvZHlDbGFzcz1cImNvbnRlbnRfX3RhYnNfX2JvZHlcIj5cbiAgICAgICAgICA8Z2lvLXBzLWZsb3ctZGV0YWlscy1waGFzZVxuICAgICAgICAgICAgY2xhc3M9XCJjb250ZW50X19waGFzZVwiXG4gICAgICAgICAgICBuYW1lPVwiUHVibGlzaCBwaGFzZVwiXG4gICAgICAgICAgICBkZXNjcmlwdGlvbj1cIlBvbGljaWVzIHdpbGwgYmUgYXBwbGllZCB3aGVuIHB1Ymxpc2hpbmcgbWVzc2FnZXNcIlxuICAgICAgICAgICAgW3JlYWRPbmx5XT1cInJlYWRPbmx5XCJcbiAgICAgICAgICAgIFtzdGFydENvbm5lY3Rvcl09XCJlbnRyeXBvaW50c0luZm8gfCBnaW9GaWx0ZXJDb25uZWN0b3JzQnlNb2RlOiAnUFVCTElTSCdcIlxuICAgICAgICAgICAgW2VuZENvbm5lY3Rvcl09XCJlbmRwb2ludHNJbmZvIHwgZ2lvRmlsdGVyQ29ubmVjdG9yc0J5TW9kZTogJ1BVQkxJU0gnXCJcbiAgICAgICAgICAgIFtzdGVwc109XCJmbG93LnB1Ymxpc2ggPz8gW11cIlxuICAgICAgICAgICAgW2FwaVR5cGVdPVwiYXBpVHlwZVwiXG4gICAgICAgICAgICBbZ2VuZXJpY1BvbGljaWVzXT1cImdlbmVyaWNQb2xpY2llc1wiXG4gICAgICAgICAgICBbdHJpYWxVcmxdPVwidHJpYWxVcmxcIlxuICAgICAgICAgICAgcG9saWN5Rmxvd1BoYXNlPVwiUFVCTElTSFwiXG4gICAgICAgICAgICAoc3RlcHNDaGFuZ2UpPVwib25TdGVwc0NoYW5nZSgncHVibGlzaCcsICRldmVudClcIlxuICAgICAgICAgID48L2dpby1wcy1mbG93LWRldGFpbHMtcGhhc2U+XG4gICAgICAgICAgPGdpby1wcy1mbG93LWRldGFpbHMtcGhhc2VcbiAgICAgICAgICAgIGNsYXNzPVwiY29udGVudF9fcGhhc2VcIlxuICAgICAgICAgICAgbmFtZT1cIlN1YnNjcmliZSBwaGFzZVwiXG4gICAgICAgICAgICBkZXNjcmlwdGlvbj1cIlBvbGljaWVzIHdpbGwgYmUgYXBwbGllZCB3aGVuIGZldGNoaW5nIG1lc3NhZ2VzXCJcbiAgICAgICAgICAgIFtyZWFkT25seV09XCJyZWFkT25seVwiXG4gICAgICAgICAgICBbc3RhcnRDb25uZWN0b3JdPVwiZW5kcG9pbnRzSW5mbyB8IGdpb0ZpbHRlckNvbm5lY3RvcnNCeU1vZGU6ICdTVUJTQ1JJQkUnXCJcbiAgICAgICAgICAgIFtlbmRDb25uZWN0b3JdPVwiZW50cnlwb2ludHNJbmZvIHwgZ2lvRmlsdGVyQ29ubmVjdG9yc0J5TW9kZTogJ1NVQlNDUklCRSdcIlxuICAgICAgICAgICAgW3N0ZXBzXT1cImZsb3cuc3Vic2NyaWJlID8/IFtdXCJcbiAgICAgICAgICAgIFthcGlUeXBlXT1cImFwaVR5cGVcIlxuICAgICAgICAgICAgW2dlbmVyaWNQb2xpY2llc109XCJnZW5lcmljUG9saWNpZXNcIlxuICAgICAgICAgICAgW3RyaWFsVXJsXT1cInRyaWFsVXJsXCJcbiAgICAgICAgICAgIHBvbGljeUZsb3dQaGFzZT1cIlNVQlNDUklCRVwiXG4gICAgICAgICAgICAoc3RlcHNDaGFuZ2UpPVwib25TdGVwc0NoYW5nZSgnc3Vic2NyaWJlJywgJGV2ZW50KVwiXG4gICAgICAgICAgPjwvZ2lvLXBzLWZsb3ctZGV0YWlscy1waGFzZT5cbiAgICAgICAgPC9tYXQtdGFiPlxuICAgICAgPC9tYXQtdGFiLWdyb3VwPlxuICAgIDwvZGl2PlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8bmctdGVtcGxhdGUgI2VtcHR5Rmxvd3M+XG4gICAgPGRpdiBjbGFzcz1cImVtcHR5Rmxvd3NcIj5cbiAgICAgIDxoMj5ObyBmbG93cyB5ZXQ8L2gyPlxuICAgICAgPHAgY2xhc3M9XCJtYXQtYm9keS0xXCI+Rmxvd3MgYWxsb3cgeW91IHRvIGN1c3RvbWl6ZSB0aGUgYmVoYXZpb3Igb2YgeW91ciBBUEkgZXZlbnQgcGhhc2VzIHRocm91Z2ggY29uZmlndXJhYmxlIHBvbGljaWVzPC9wPlxuICAgIDwvZGl2PlxuICA8L25nLXRlbXBsYXRlPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNsb2FkaW5nVHBsPlxuICA8ZGl2IGNsYXNzPVwiaGVhZGVyIGxvYWRpbmdcIj5cbiAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyX19sYWJlbFwiPkZsb3cgZGV0YWlsczwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJoZWFkZXJfX2NvbmZpZ0J0blwiPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImhlYWRlcl9fY29uZmlnQnRuX19lZGl0XCIgbWF0LXN0cm9rZWQtYnV0dG9uIGRpc2FibGVkPlxuICAgICAgICA8bWF0LWljb24gc3ZnSWNvbj1cImdpbzplZGl0LXBlbmNpbFwiPjwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJoZWFkZXJfX2NvbmZpZ0J0bl9fZGVsZXRlXCIgbWF0LXN0cm9rZWQtYnV0dG9uIGRpc2FibGVkPlxuICAgICAgICA8bWF0LWljb24gc3ZnSWNvbj1cImdpbzp0cmFzaFwiPjwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxnaW8tcHMtZmxvdy1kZXRhaWxzLWluZm8tYmFyIGNsYXNzPVwiaW5mb0JhciBsb2FkaW5nXCI+PC9naW8tcHMtZmxvdy1kZXRhaWxzLWluZm8tYmFyPlxuICA8ZGl2IGNsYXNzPVwiY29udGVudCBsb2FkaW5nXCI+XG4gICAgPGdpby1sb2FkZXI+PC9naW8tbG9hZGVyPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
@@ -0,0 +1,115 @@
1
+ /*
2
+ * Copyright (C) 2022 The Gravitee team (http://gravitee.io)
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ import { Component, Input } from '@angular/core';
17
+ import { isEmpty } from 'lodash';
18
+ import { GioIconsModule } from '@gravitee/ui-particles-angular';
19
+ import { MatCommonModule } from '@angular/material/core';
20
+ import { CommonModule } from '@angular/common';
21
+ import * as i0 from "@angular/core";
22
+ import * as i1 from "@angular/common";
23
+ import * as i2 from "@angular/material/icon";
24
+ export class GioPolicyStudioDetailsInfoBarComponent {
25
+ constructor() {
26
+ this.flow = undefined;
27
+ }
28
+ get condition() {
29
+ const conditionSelector = this.flow?.selectors?.find(s => s.type === 'CONDITION');
30
+ if (!conditionSelector) {
31
+ return undefined;
32
+ }
33
+ return conditionSelector?.condition;
34
+ }
35
+ // MESSAGE API type
36
+ get operations() {
37
+ const channelSelector = this.flow?.selectors?.find(s => s.type === 'CHANNEL');
38
+ if (!channelSelector) {
39
+ return undefined;
40
+ }
41
+ const operationToBadge = {
42
+ PUBLISH: 'PUB',
43
+ SUBSCRIBE: 'SUB',
44
+ };
45
+ // If no operations are selected, all operations are valid
46
+ const operations = !channelSelector.operations || isEmpty(channelSelector.operations) ? ['PUBLISH', 'SUBSCRIBE'] : channelSelector.operations;
47
+ return operations.map(o => operationToBadge[o]).sort();
48
+ }
49
+ get channel() {
50
+ const channelSelector = this.flow?.selectors?.find(s => s.type === 'CHANNEL');
51
+ if (!channelSelector) {
52
+ return undefined;
53
+ }
54
+ return channelSelector?.channel;
55
+ }
56
+ get channelOperator() {
57
+ const channelSelector = this.flow?.selectors?.find(s => s.type === 'CHANNEL');
58
+ if (!channelSelector) {
59
+ return undefined;
60
+ }
61
+ return channelSelector?.channelOperator;
62
+ }
63
+ get entrypoints() {
64
+ const channelSelector = this.flow?.selectors?.find(s => s.type === 'CHANNEL');
65
+ if (!channelSelector) {
66
+ return undefined;
67
+ }
68
+ return this.entrypointsInfo?.filter(e =>
69
+ // If no entrypoints are selected, all entrypoints are valid
70
+ !channelSelector.entrypoints || isEmpty(channelSelector.entrypoints) || channelSelector.entrypoints?.includes(e.type));
71
+ }
72
+ // PROXY API type
73
+ get path() {
74
+ const httpSelector = this.flow?.selectors?.find(s => s.type === 'HTTP');
75
+ if (!httpSelector) {
76
+ return undefined;
77
+ }
78
+ return httpSelector?.path;
79
+ }
80
+ get pathOperator() {
81
+ const httpSelector = this.flow?.selectors?.find(s => s.type === 'HTTP');
82
+ if (!httpSelector) {
83
+ return undefined;
84
+ }
85
+ return httpSelector?.pathOperator;
86
+ }
87
+ get methods() {
88
+ const httpSelector = this.flow?.selectors?.find(s => s.type === 'HTTP');
89
+ if (!httpSelector) {
90
+ return undefined;
91
+ }
92
+ return httpSelector?.methods?.length
93
+ ? httpSelector?.methods.map(m => ({
94
+ name: m,
95
+ class: `gio-method-badge-${m.toLowerCase()}`,
96
+ }))
97
+ : [
98
+ {
99
+ name: 'ALL',
100
+ class: 'gio-badge-neutral',
101
+ },
102
+ ];
103
+ }
104
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: GioPolicyStudioDetailsInfoBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
105
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.4", type: GioPolicyStudioDetailsInfoBarComponent, isStandalone: true, selector: "gio-ps-flow-details-info-bar", inputs: { flow: "flow", entrypointsInfo: "entrypointsInfo" }, ngImport: i0, template: "<!--\n\n Copyright (C) 2023 The Gravitee team (http://gravitee.io)\n \n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n<div *ngIf=\"flow?.name\" class=\"info\">\n <span class=\"info__label\">Name</span>\n <span class=\"info__value strong\">{{ flow?.name }}</span>\n</div>\n\n<div *ngIf=\"entrypoints\" class=\"info\">\n <span class=\"info__label\">Entrypoints</span>\n <span *ngFor=\"let entrypoint of entrypoints\" class=\"info__value gio-badge gio-badge-neutral\">\n <mat-icon [svgIcon]=\"entrypoint.icon\"></mat-icon>\n {{ entrypoint.name }}</span\n >\n</div>\n\n<!-- MESSAGE API type -->\n\n<div *ngIf=\"operations\" class=\"info\">\n <span class=\"info__label\">Operations</span>\n <span *ngFor=\"let operation of operations\" class=\"info__value gio-badge-neutral\"> {{ operation }}</span>\n</div>\n\n<div *ngIf=\"channel\" class=\"info\">\n <span class=\"info__label\">Channel</span>\n <span class=\"info__value strong\">{{ channel }}</span>\n</div>\n\n<div *ngIf=\"channelOperator\" class=\"info\">\n <span class=\"info__label\">Channel Operator</span>\n <span class=\"info__value gio-badge-neutral\">{{ channelOperator }}</span>\n</div>\n\n<!-- PROXY API type -->\n\n<div *ngIf=\"path\" class=\"info\">\n <span class=\"info__label\">Path</span>\n <span class=\"info__value strong\">{{ path }}</span>\n</div>\n\n<div *ngIf=\"pathOperator\" class=\"info\">\n <span class=\"info__label\">Path Operator</span>\n <span class=\"info__value gio-badge-neutral\">{{ pathOperator }}</span>\n</div>\n\n<div *ngIf=\"methods\" class=\"info\">\n <span class=\"info__label\">HTTP methods</span>\n <span *ngFor=\"let method of methods\" class=\"info__value method\" [ngClass]=\"method.class\"> {{ method.name }}</span>\n</div>\n\n<!-- Condition -->\n\n<div *ngIf=\"condition\" class=\"info\">\n <span class=\"info__label\">Condition</span>\n <span class=\"info__value gio-badge-neutral condition\">{{ condition }}</span>\n</div>\n", styles: ["@charset \"UTF-8\";.gio-top-bar-menu .gio-badge-accent{background-color:var(--gio-oem-palette--active, #ffc2ac);color:var(--gio-oem-palette--active-contrast, #1e1b1b)}:host{display:flex;flex-flow:row wrap;padding:16px;gap:12px}.info__label{font-size:14px;font-weight:500;line-height:22px;font-family:Manrope,sans-serif;letter-spacing:.4px;color:#322f2f}.info__value.strong{padding-left:8px;font-size:14px;font-weight:700;line-height:20px;font-family:Manrope,sans-serif;letter-spacing:.4px}.info__value.method{width:auto}.info__value.gio-badge mat-icon{margin-right:4px}.info__value.condition{text-transform:none}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: GioIconsModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatCommonModule }] }); }
106
+ }
107
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: GioPolicyStudioDetailsInfoBarComponent, decorators: [{
108
+ type: Component,
109
+ args: [{ imports: [CommonModule, GioIconsModule, MatCommonModule], selector: 'gio-ps-flow-details-info-bar', template: "<!--\n\n Copyright (C) 2023 The Gravitee team (http://gravitee.io)\n \n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n<div *ngIf=\"flow?.name\" class=\"info\">\n <span class=\"info__label\">Name</span>\n <span class=\"info__value strong\">{{ flow?.name }}</span>\n</div>\n\n<div *ngIf=\"entrypoints\" class=\"info\">\n <span class=\"info__label\">Entrypoints</span>\n <span *ngFor=\"let entrypoint of entrypoints\" class=\"info__value gio-badge gio-badge-neutral\">\n <mat-icon [svgIcon]=\"entrypoint.icon\"></mat-icon>\n {{ entrypoint.name }}</span\n >\n</div>\n\n<!-- MESSAGE API type -->\n\n<div *ngIf=\"operations\" class=\"info\">\n <span class=\"info__label\">Operations</span>\n <span *ngFor=\"let operation of operations\" class=\"info__value gio-badge-neutral\"> {{ operation }}</span>\n</div>\n\n<div *ngIf=\"channel\" class=\"info\">\n <span class=\"info__label\">Channel</span>\n <span class=\"info__value strong\">{{ channel }}</span>\n</div>\n\n<div *ngIf=\"channelOperator\" class=\"info\">\n <span class=\"info__label\">Channel Operator</span>\n <span class=\"info__value gio-badge-neutral\">{{ channelOperator }}</span>\n</div>\n\n<!-- PROXY API type -->\n\n<div *ngIf=\"path\" class=\"info\">\n <span class=\"info__label\">Path</span>\n <span class=\"info__value strong\">{{ path }}</span>\n</div>\n\n<div *ngIf=\"pathOperator\" class=\"info\">\n <span class=\"info__label\">Path Operator</span>\n <span class=\"info__value gio-badge-neutral\">{{ pathOperator }}</span>\n</div>\n\n<div *ngIf=\"methods\" class=\"info\">\n <span class=\"info__label\">HTTP methods</span>\n <span *ngFor=\"let method of methods\" class=\"info__value method\" [ngClass]=\"method.class\"> {{ method.name }}</span>\n</div>\n\n<!-- Condition -->\n\n<div *ngIf=\"condition\" class=\"info\">\n <span class=\"info__label\">Condition</span>\n <span class=\"info__value gio-badge-neutral condition\">{{ condition }}</span>\n</div>\n", styles: ["@charset \"UTF-8\";.gio-top-bar-menu .gio-badge-accent{background-color:var(--gio-oem-palette--active, #ffc2ac);color:var(--gio-oem-palette--active-contrast, #1e1b1b)}:host{display:flex;flex-flow:row wrap;padding:16px;gap:12px}.info__label{font-size:14px;font-weight:500;line-height:22px;font-family:Manrope,sans-serif;letter-spacing:.4px;color:#322f2f}.info__value.strong{padding-left:8px;font-size:14px;font-weight:700;line-height:20px;font-family:Manrope,sans-serif;letter-spacing:.4px}.info__value.method{width:auto}.info__value.gio-badge mat-icon{margin-right:4px}.info__value.condition{text-transform:none}\n"] }]
110
+ }], propDecorators: { flow: [{
111
+ type: Input
112
+ }], entrypointsInfo: [{
113
+ type: Input
114
+ }] } });
115
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2lvLXBzLWZsb3ctZGV0YWlscy1pbmZvLWJhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS1wb2xpY3ktc3R1ZGlvLWFuZ3VsYXIvc3JjL2xpYi9jb21wb25lbnRzL2Zsb3ctZGV0YWlscy1pbmZvLWJhci9naW8tcHMtZmxvdy1kZXRhaWxzLWluZm8tYmFyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3VpLXBvbGljeS1zdHVkaW8tYW5ndWxhci9zcmMvbGliL2NvbXBvbmVudHMvZmxvdy1kZXRhaWxzLWluZm8tYmFyL2dpby1wcy1mbG93LWRldGFpbHMtaW5mby1iYXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNoRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7O0FBVy9DLE1BQU0sT0FBTyxzQ0FBc0M7SUFObkQ7UUFRUyxTQUFJLEdBQVksU0FBUyxDQUFDO0tBK0ZsQztJQTFGQyxJQUFXLFNBQVM7UUFDbEIsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLFdBQVcsQ0FBc0IsQ0FBQztRQUN2RyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUN2QixPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FB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IChodHRwOi8vZ3Jhdml0ZWUuaW8pXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgaXNFbXB0eSB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBHaW9JY29uc01vZHVsZSB9IGZyb20gJ0BncmF2aXRlZS91aS1wYXJ0aWNsZXMtYW5ndWxhcic7XG5pbXBvcnQgeyBNYXRDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbmltcG9ydCB7IENoYW5uZWxTZWxlY3RvciwgQ29uZGl0aW9uU2VsZWN0b3IsIENvbm5lY3RvckluZm8sIEh0dHBTZWxlY3RvciwgT3BlcmF0aW9uIH0gZnJvbSAnLi4vLi4vbW9kZWxzJztcbmltcG9ydCB7IEZsb3dWTSB9IGZyb20gJy4uLy4uL3BvbGljeS1zdHVkaW8vZ2lvLXBvbGljeS1zdHVkaW8ubW9kZWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgR2lvSWNvbnNNb2R1bGUsIE1hdENvbW1vbk1vZHVsZV0sXG4gIHNlbGVjdG9yOiAnZ2lvLXBzLWZsb3ctZGV0YWlscy1pbmZvLWJhcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9naW8tcHMtZmxvdy1kZXRhaWxzLWluZm8tYmFyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZ2lvLXBzLWZsb3ctZGV0YWlscy1pbmZvLWJhci5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBHaW9Qb2xpY3lTdHVkaW9EZXRhaWxzSW5mb0JhckNvbXBvbmVudCB7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBmbG93PzogRmxvd1ZNID0gdW5kZWZpbmVkO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBlbnRyeXBvaW50c0luZm8/OiBDb25uZWN0b3JJbmZvW107XG5cbiAgcHVibGljIGdldCBjb25kaXRpb24oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjb25kaXRpb25TZWxlY3RvciA9IHRoaXMuZmxvdz8uc2VsZWN0b3JzPy5maW5kKHMgPT4gcy50eXBlID09PSAnQ09ORElUSU9OJykgYXMgQ29uZGl0aW9uU2VsZWN0b3I7XG4gICAgaWYgKCFjb25kaXRpb25TZWxlY3Rvcikge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIGNvbmRpdGlvblNlbGVjdG9yPy5jb25kaXRpb247XG4gIH1cblxuICAvLyBNRVNTQUdFIEFQSSB0eXBlXG5cbiAgcHVibGljIGdldCBvcGVyYXRpb25zKCk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjaGFubmVsU2VsZWN0b3IgPSB0aGlzLmZsb3c/LnNlbGVjdG9ycz8uZmluZChzID0+IHMudHlwZSA9PT0gJ0NIQU5ORUwnKSBhcyBDaGFubmVsU2VsZWN0b3I7XG4gICAgaWYgKCFjaGFubmVsU2VsZWN0b3IpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IG9wZXJhdGlvblRvQmFkZ2U6IFJlY29yZDxPcGVyYXRpb24sIHN0cmluZz4gPSB7XG4gICAgICBQVUJMSVNIOiAnUFVCJyxcbiAgICAgIFNVQlNDUklCRTogJ1NVQicsXG4gICAgfTtcbiAgICAvLyBJZiBubyBvcGVyYXRpb25zIGFyZSBzZWxlY3RlZCwgYWxsIG9wZXJhdGlvbnMgYXJlIHZhbGlkXG4gICAgY29uc3Qgb3BlcmF0aW9ucyA9XG4gICAgICAhY2hhbm5lbFNlbGVjdG9yLm9wZXJhdGlvbnMgfHwgaXNFbXB0eShjaGFubmVsU2VsZWN0b3Iub3BlcmF0aW9ucykgPyAoWydQVUJMSVNIJywgJ1NVQlNDUklCRSddIGFzIGNvbnN0KSA6IGNoYW5uZWxTZWxlY3Rvci5vcGVyYXRpb25zO1xuXG4gICAgcmV0dXJuIG9wZXJhdGlvbnMubWFwKG8gPT4gb3BlcmF0aW9uVG9CYWRnZVtvXSkuc29ydCgpO1xuICB9XG5cbiAgcHVibGljIGdldCBjaGFubmVsKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY2hhbm5lbFNlbGVjdG9yID0gdGhpcy5mbG93Py5zZWxlY3RvcnM/LmZpbmQocyA9PiBzLnR5cGUgPT09ICdDSEFOTkVMJykgYXMgQ2hhbm5lbFNlbGVjdG9yO1xuICAgIGlmICghY2hhbm5lbFNlbGVjdG9yKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gY2hhbm5lbFNlbGVjdG9yPy5jaGFubmVsO1xuICB9XG5cbiAgcHVibGljIGdldCBjaGFubmVsT3BlcmF0b3IoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjaGFubmVsU2VsZWN0b3IgPSB0aGlzLmZsb3c/LnNlbGVjdG9ycz8uZmluZChzID0+IHMudHlwZSA9PT0gJ0NIQU5ORUwnKSBhcyBDaGFubmVsU2VsZWN0b3I7XG4gICAgaWYgKCFjaGFubmVsU2VsZWN0b3IpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBjaGFubmVsU2VsZWN0b3I/LmNoYW5uZWxPcGVyYXRvcjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZW50cnlwb2ludHMoKTogQ29ubmVjdG9ySW5mb1tdIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjaGFubmVsU2VsZWN0b3IgPSB0aGlzLmZsb3c/LnNlbGVjdG9ycz8uZmluZChzID0+IHMudHlwZSA9PT0gJ0NIQU5ORUwnKSBhcyBDaGFubmVsU2VsZWN0b3I7XG4gICAgaWYgKCFjaGFubmVsU2VsZWN0b3IpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZW50cnlwb2ludHNJbmZvPy5maWx0ZXIoXG4gICAgICBlID0+XG4gICAgICAgIC8vIElmIG5vIGVudHJ5cG9pbnRzIGFyZSBzZWxlY3RlZCwgYWxsIGVudHJ5cG9pbnRzIGFyZSB2YWxpZFxuICAgICAgICAhY2hhbm5lbFNlbGVjdG9yLmVudHJ5cG9pbnRzIHx8IGlzRW1wdHkoY2hhbm5lbFNlbGVjdG9yLmVudHJ5cG9pbnRzKSB8fCBjaGFubmVsU2VsZWN0b3IuZW50cnlwb2ludHM/LmluY2x1ZGVzKGUudHlwZSksXG4gICAgKTtcbiAgfVxuXG4gIC8vIFBST1hZIEFQSSB0eXBlXG5cbiAgcHVibGljIGdldCBwYXRoKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgaHR0cFNlbGVjdG9yID0gdGhpcy5mbG93Py5zZWxlY3RvcnM/LmZpbmQocyA9PiBzLnR5cGUgPT09ICdIVFRQJykgYXMgSHR0cFNlbGVjdG9yO1xuICAgIGlmICghaHR0cFNlbGVjdG9yKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gaHR0cFNlbGVjdG9yPy5wYXRoO1xuICB9XG5cbiAgcHVibGljIGdldCBwYXRoT3BlcmF0b3IoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBodHRwU2VsZWN0b3IgPSB0aGlzLmZsb3c/LnNlbGVjdG9ycz8uZmluZChzID0+IHMudHlwZSA9PT0gJ0hUVFAnKSBhcyBIdHRwU2VsZWN0b3I7XG4gICAgaWYgKCFodHRwU2VsZWN0b3IpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBodHRwU2VsZWN0b3I/LnBhdGhPcGVyYXRvcjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbWV0aG9kcygpOiB7IG5hbWU6IHN0cmluZzsgY2xhc3M6IHN0cmluZyB9W10gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGh0dHBTZWxlY3RvciA9IHRoaXMuZmxvdz8uc2VsZWN0b3JzPy5maW5kKHMgPT4gcy50eXBlID09PSAnSFRUUCcpIGFzIEh0dHBTZWxlY3RvcjtcbiAgICBpZiAoIWh0dHBTZWxlY3Rvcikge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIGh0dHBTZWxlY3Rvcj8ubWV0aG9kcz8ubGVuZ3RoXG4gICAgICA/IGh0dHBTZWxlY3Rvcj8ubWV0aG9kcy5tYXAobSA9PiAoe1xuICAgICAgICAgIG5hbWU6IG0sXG4gICAgICAgICAgY2xhc3M6IGBnaW8tbWV0aG9kLWJhZGdlLSR7bS50b0xvd2VyQ2FzZSgpfWAsXG4gICAgICAgIH0pKVxuICAgICAgOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ0FMTCcsXG4gICAgICAgICAgICBjbGFzczogJ2dpby1iYWRnZS1uZXV0cmFsJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdO1xuICB9XG59XG4iLCI8IS0tXG5cbiAgICBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEdyYXZpdGVlIHRlYW0gKGh0dHA6Ly9ncmF2aXRlZS5pbylcbiAgICBcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBcbiAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4tLT5cbjxkaXYgKm5nSWY9XCJmbG93Py5uYW1lXCIgY2xhc3M9XCJpbmZvXCI+XG4gIDxzcGFuIGNsYXNzPVwiaW5mb19fbGFiZWxcIj5OYW1lPC9zcGFuPlxuICA8c3BhbiBjbGFzcz1cImluZm9fX3ZhbHVlIHN0cm9uZ1wiPnt7IGZsb3c/Lm5hbWUgfX08L3NwYW4+XG48L2Rpdj5cblxuPGRpdiAqbmdJZj1cImVudHJ5cG9pbnRzXCIgY2xhc3M9XCJpbmZvXCI+XG4gIDxzcGFuIGNsYXNzPVwiaW5mb19fbGFiZWxcIj5FbnRyeXBvaW50czwvc3Bhbj5cbiAgPHNwYW4gKm5nRm9yPVwibGV0IGVudHJ5cG9pbnQgb2YgZW50cnlwb2ludHNcIiBjbGFzcz1cImluZm9fX3ZhbHVlIGdpby1iYWRnZSBnaW8tYmFkZ2UtbmV1dHJhbFwiPlxuICAgIDxtYXQtaWNvbiBbc3ZnSWNvbl09XCJlbnRyeXBvaW50Lmljb25cIj48L21hdC1pY29uPlxuICAgIHt7IGVudHJ5cG9pbnQubmFtZSB9fTwvc3BhblxuICA+XG48L2Rpdj5cblxuPCEtLSBNRVNTQUdFIEFQSSB0eXBlIC0tPlxuXG48ZGl2ICpuZ0lmPVwib3BlcmF0aW9uc1wiIGNsYXNzPVwiaW5mb1wiPlxuICA8c3BhbiBjbGFzcz1cImluZm9fX2xhYmVsXCI+T3BlcmF0aW9uczwvc3Bhbj5cbiAgPHNwYW4gKm5nRm9yPVwibGV0IG9wZXJhdGlvbiBvZiBvcGVyYXRpb25zXCIgY2xhc3M9XCJpbmZvX192YWx1ZSBnaW8tYmFkZ2UtbmV1dHJhbFwiPiB7eyBvcGVyYXRpb24gfX08L3NwYW4+XG48L2Rpdj5cblxuPGRpdiAqbmdJZj1cImNoYW5uZWxcIiBjbGFzcz1cImluZm9cIj5cbiAgPHNwYW4gY2xhc3M9XCJpbmZvX19sYWJlbFwiPkNoYW5uZWw8L3NwYW4+XG4gIDxzcGFuIGNsYXNzPVwiaW5mb19fdmFsdWUgc3Ryb25nXCI+e3sgY2hhbm5lbCB9fTwvc3Bhbj5cbjwvZGl2PlxuXG48ZGl2ICpuZ0lmPVwiY2hhbm5lbE9wZXJhdG9yXCIgY2xhc3M9XCJpbmZvXCI+XG4gIDxzcGFuIGNsYXNzPVwiaW5mb19fbGFiZWxcIj5DaGFubmVsIE9wZXJhdG9yPC9zcGFuPlxuICA8c3BhbiBjbGFzcz1cImluZm9fX3ZhbHVlIGdpby1iYWRnZS1uZXV0cmFsXCI+e3sgY2hhbm5lbE9wZXJhdG9yIH19PC9zcGFuPlxuPC9kaXY+XG5cbjwhLS0gUFJPWFkgQVBJIHR5cGUgLS0+XG5cbjxkaXYgKm5nSWY9XCJwYXRoXCIgY2xhc3M9XCJpbmZvXCI+XG4gIDxzcGFuIGNsYXNzPVwiaW5mb19fbGFiZWxcIj5QYXRoPC9zcGFuPlxuICA8c3BhbiBjbGFzcz1cImluZm9fX3ZhbHVlIHN0cm9uZ1wiPnt7IHBhdGggfX08L3NwYW4+XG48L2Rpdj5cblxuPGRpdiAqbmdJZj1cInBhdGhPcGVyYXRvclwiIGNsYXNzPVwiaW5mb1wiPlxuICA8c3BhbiBjbGFzcz1cImluZm9fX2xhYmVsXCI+UGF0aCBPcGVyYXRvcjwvc3Bhbj5cbiAgPHNwYW4gY2xhc3M9XCJpbmZvX192YWx1ZSBnaW8tYmFkZ2UtbmV1dHJhbFwiPnt7IHBhdGhPcGVyYXRvciB9fTwvc3Bhbj5cbjwvZGl2PlxuXG48ZGl2ICpuZ0lmPVwibWV0aG9kc1wiIGNsYXNzPVwiaW5mb1wiPlxuICA8c3BhbiBjbGFzcz1cImluZm9fX2xhYmVsXCI+SFRUUCBtZXRob2RzPC9zcGFuPlxuICA8c3BhbiAqbmdGb3I9XCJsZXQgbWV0aG9kIG9mIG1ldGhvZHNcIiBjbGFzcz1cImluZm9fX3ZhbHVlIG1ldGhvZFwiIFtuZ0NsYXNzXT1cIm1ldGhvZC5jbGFzc1wiPiB7eyBtZXRob2QubmFtZSB9fTwvc3Bhbj5cbjwvZGl2PlxuXG48IS0tIENvbmRpdGlvbiAtLT5cblxuPGRpdiAqbmdJZj1cImNvbmRpdGlvblwiIGNsYXNzPVwiaW5mb1wiPlxuICA8c3BhbiBjbGFzcz1cImluZm9fX2xhYmVsXCI+Q29uZGl0aW9uPC9zcGFuPlxuICA8c3BhbiBjbGFzcz1cImluZm9fX3ZhbHVlIGdpby1iYWRnZS1uZXV0cmFsIGNvbmRpdGlvblwiPnt7IGNvbmRpdGlvbiB9fTwvc3Bhbj5cbjwvZGl2PlxuIl19