ng-kinintel 0.0.397 → 20.0.2

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 (184) hide show
  1. package/fesm2022/ng-kinintel.mjs +11874 -0
  2. package/fesm2022/ng-kinintel.mjs.map +1 -0
  3. package/index.d.ts +2818 -5
  4. package/package.json +6 -14
  5. package/esm2020/lib/components/alert-groups/alert-groups.component.mjs +0 -76
  6. package/esm2020/lib/components/alert-groups/edit-alert-group/edit-alert-group.component.mjs +0 -83
  7. package/esm2020/lib/components/dashboard-editor/configure-item/configure-item.component.mjs +0 -853
  8. package/esm2020/lib/components/dashboard-editor/configure-item/edit-dashboard-alert/edit-dashboard-alert.component.mjs +0 -56
  9. package/esm2020/lib/components/dashboard-editor/configure-item/html-documentation/html-documentation.component.mjs +0 -114
  10. package/esm2020/lib/components/dashboard-editor/configure-item/table-cell-formatter/table-cell-formatter.component.mjs +0 -163
  11. package/esm2020/lib/components/dashboard-editor/configure-item/vis-network-options.json +0 -135
  12. package/esm2020/lib/components/dashboard-editor/dashboard-editor.component.mjs +0 -580
  13. package/esm2020/lib/components/dashboard-editor/dashboard-parameter/dashboard-parameter.component.mjs +0 -15
  14. package/esm2020/lib/components/dashboard-editor/dashboard-settings/dashboard-settings.component.mjs +0 -50
  15. package/esm2020/lib/components/dashboard-editor/item-component/item-component.component.mjs +0 -1226
  16. package/esm2020/lib/components/dashboard-editor/source-selector-dialog/source-selector-dialog.component.mjs +0 -111
  17. package/esm2020/lib/components/dashboards/dashboards.component.mjs +0 -163
  18. package/esm2020/lib/components/dashboards/view-dashboard/view-dashboard.component.mjs +0 -429
  19. package/esm2020/lib/components/data-explorer/change-source-warning/change-source-warning.component.mjs +0 -20
  20. package/esm2020/lib/components/data-explorer/data-explorer.component.mjs +0 -243
  21. package/esm2020/lib/components/data-explorer/export-data/export-data.component.mjs +0 -62
  22. package/esm2020/lib/components/data-explorer/snapshot-api-access/snapshot-api-access.component.mjs +0 -70
  23. package/esm2020/lib/components/data-explorer/snapshot-profile-dialog/snapshot-profile-dialog.component.mjs +0 -190
  24. package/esm2020/lib/components/data-picker/data-picker.component.mjs +0 -79
  25. package/esm2020/lib/components/data-search/data-search.component.mjs +0 -11
  26. package/esm2020/lib/components/data-sharing-invite/data-sharing-invite.component.mjs +0 -52
  27. package/esm2020/lib/components/dataset/create-dataset/create-dataset.component.mjs +0 -47
  28. package/esm2020/lib/components/dataset/dataset-editor/available-columns/available-columns.component.mjs +0 -28
  29. package/esm2020/lib/components/dataset/dataset-editor/dataset-add-join/dataset-add-join.component.mjs +0 -344
  30. package/esm2020/lib/components/dataset/dataset-editor/dataset-column-settings/dataset-column-editor/dataset-column-editor.component.mjs +0 -80
  31. package/esm2020/lib/components/dataset/dataset-editor/dataset-column-settings/dataset-column-settings.component.mjs +0 -54
  32. package/esm2020/lib/components/dataset/dataset-editor/dataset-create-formula/dataset-create-formula.component.mjs +0 -67
  33. package/esm2020/lib/components/dataset/dataset-editor/dataset-editor.component.mjs +0 -1134
  34. package/esm2020/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter/dataset-filter.component.mjs +0 -201
  35. package/esm2020/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter-inclusion/dataset-filter-inclusion.component.mjs +0 -25
  36. package/esm2020/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter-junction/dataset-filter-junction.component.mjs +0 -72
  37. package/esm2020/lib/components/dataset/dataset-editor/dataset-filters/dataset-filters.component.mjs +0 -62
  38. package/esm2020/lib/components/dataset/dataset-editor/dataset-name-dialog/dataset-name-dialog.component.mjs +0 -41
  39. package/esm2020/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-add-parameter/dataset-add-parameter.component.mjs +0 -78
  40. package/esm2020/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-parameter-type/dataset-parameter-type.component.mjs +0 -39
  41. package/esm2020/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-parameter-values.component.mjs +0 -75
  42. package/esm2020/lib/components/dataset/dataset-editor/dataset-summarise/dataset-summarise.component.mjs +0 -107
  43. package/esm2020/lib/components/dataset/dataset-editor/move-transformation-confirmation/move-transformation-confirmation.component.mjs +0 -20
  44. package/esm2020/lib/components/dataset/dataset-editor/remove-transformation-warning/remove-transformation-warning.component.mjs +0 -20
  45. package/esm2020/lib/components/dataset/dataset-editor/save-as-query/save-as-query.component.mjs +0 -58
  46. package/esm2020/lib/components/dataset/dataset-editor/share-query/share-query.component.mjs +0 -110
  47. package/esm2020/lib/components/dataset/dataset-editor/upstream-changes-confirmation/upstream-changes-confirmation.component.mjs +0 -20
  48. package/esm2020/lib/components/dataset/dataset.component.mjs +0 -294
  49. package/esm2020/lib/components/datasource/create-datasource/advanced-settings/advanced-settings.component.mjs +0 -130
  50. package/esm2020/lib/components/datasource/create-datasource/api-access/api-access.component.mjs +0 -132
  51. package/esm2020/lib/components/datasource/create-datasource/create-datasource.component.mjs +0 -729
  52. package/esm2020/lib/components/datasource/create-datasource/import-data/import-data.component.mjs +0 -146
  53. package/esm2020/lib/components/datasource/create-datasource/import-data/import-wizard/import-wizard.component.mjs +0 -165
  54. package/esm2020/lib/components/datasource/create-datasource/tabular-datasource/tabular-datasource.component.mjs +0 -145
  55. package/esm2020/lib/components/datasource/datasource.component.mjs +0 -162
  56. package/esm2020/lib/components/datasource/document-datasource/document-datasource.component.mjs +0 -297
  57. package/esm2020/lib/components/export-project/export-project.component.mjs +0 -29
  58. package/esm2020/lib/components/feeds/feed/feed.component.mjs +0 -92
  59. package/esm2020/lib/components/feeds/feeds.component.mjs +0 -145
  60. package/esm2020/lib/components/job-tasks/job-tasks.component.mjs +0 -25
  61. package/esm2020/lib/components/marketplace/marketplace.component.mjs +0 -65
  62. package/esm2020/lib/components/metadata/metadata.component.mjs +0 -65
  63. package/esm2020/lib/components/notification-groups/edit-notification-group/edit-notification-group.component.mjs +0 -113
  64. package/esm2020/lib/components/notification-groups/notification-groups.component.mjs +0 -86
  65. package/esm2020/lib/components/project-picker/project-picker.component.mjs +0 -118
  66. package/esm2020/lib/components/project-settings/project-link-selection/project-link-selection.component.mjs +0 -104
  67. package/esm2020/lib/components/project-settings/project-settings.component.mjs +0 -155
  68. package/esm2020/lib/components/query-caching/edit-query-cache/edit-query-cache.component.mjs +0 -51
  69. package/esm2020/lib/components/query-caching/query-cache-view/query-cache-view.component.mjs +0 -121
  70. package/esm2020/lib/components/query-caching/query-caching.component.mjs +0 -162
  71. package/esm2020/lib/components/shared-with-me/feed-api-modal/feed-api-modal.component.mjs +0 -45
  72. package/esm2020/lib/components/shared-with-me/shared-with-me.component.mjs +0 -174
  73. package/esm2020/lib/components/snapshots/snapshots.component.mjs +0 -244
  74. package/esm2020/lib/components/tag-picker/tag-picker.component.mjs +0 -74
  75. package/esm2020/lib/components/task-time-periods/task-time-periods.component.mjs +0 -55
  76. package/esm2020/lib/components/whitelisted-sql-functions/whitelisted-sql-functions.component.mjs +0 -40
  77. package/esm2020/lib/guards/dashboard-changes.guard.mjs +0 -22
  78. package/esm2020/lib/kinintel-config.mjs +0 -3
  79. package/esm2020/lib/ng-kinintel.module.mjs +0 -437
  80. package/esm2020/lib/objects/action-event.mjs +0 -16
  81. package/esm2020/lib/services/alert.service.mjs +0 -52
  82. package/esm2020/lib/services/dashboard.service.mjs +0 -75
  83. package/esm2020/lib/services/data-processor.service.mjs +0 -56
  84. package/esm2020/lib/services/data-search.service.mjs +0 -36
  85. package/esm2020/lib/services/dataset.service.mjs +0 -187
  86. package/esm2020/lib/services/datasource.service.mjs +0 -93
  87. package/esm2020/lib/services/external.service.mjs +0 -33
  88. package/esm2020/lib/services/feed.service.mjs +0 -50
  89. package/esm2020/lib/services/notification.service.mjs +0 -41
  90. package/esm2020/lib/services/project.service.mjs +0 -130
  91. package/esm2020/lib/services/tag.service.mjs +0 -63
  92. package/esm2020/ng-kinintel.mjs +0 -5
  93. package/esm2020/public-api.mjs +0 -43
  94. package/fesm2015/ng-kinintel.mjs +0 -12182
  95. package/fesm2015/ng-kinintel.mjs.map +0 -1
  96. package/fesm2020/ng-kinintel.mjs +0 -11872
  97. package/fesm2020/ng-kinintel.mjs.map +0 -1
  98. package/lib/components/alert-groups/alert-groups.component.d.ts +0 -30
  99. package/lib/components/alert-groups/edit-alert-group/edit-alert-group.component.d.ts +0 -28
  100. package/lib/components/dashboard-editor/configure-item/configure-item.component.d.ts +0 -256
  101. package/lib/components/dashboard-editor/configure-item/edit-dashboard-alert/edit-dashboard-alert.component.d.ts +0 -16
  102. package/lib/components/dashboard-editor/configure-item/html-documentation/html-documentation.component.d.ts +0 -59
  103. package/lib/components/dashboard-editor/configure-item/table-cell-formatter/table-cell-formatter.component.d.ts +0 -26
  104. package/lib/components/dashboard-editor/dashboard-editor.component.d.ts +0 -85
  105. package/lib/components/dashboard-editor/dashboard-parameter/dashboard-parameter.component.d.ts +0 -8
  106. package/lib/components/dashboard-editor/dashboard-settings/dashboard-settings.component.d.ts +0 -22
  107. package/lib/components/dashboard-editor/item-component/item-component.component.d.ts +0 -264
  108. package/lib/components/dashboard-editor/source-selector-dialog/source-selector-dialog.component.d.ts +0 -30
  109. package/lib/components/dashboards/dashboards.component.d.ts +0 -56
  110. package/lib/components/dashboards/view-dashboard/view-dashboard.component.d.ts +0 -81
  111. package/lib/components/data-explorer/change-source-warning/change-source-warning.component.d.ts +0 -11
  112. package/lib/components/data-explorer/data-explorer.component.d.ts +0 -61
  113. package/lib/components/data-explorer/export-data/export-data.component.d.ts +0 -17
  114. package/lib/components/data-explorer/snapshot-api-access/snapshot-api-access.component.d.ts +0 -25
  115. package/lib/components/data-explorer/snapshot-profile-dialog/snapshot-profile-dialog.component.d.ts +0 -44
  116. package/lib/components/data-picker/data-picker.component.d.ts +0 -32
  117. package/lib/components/data-search/data-search.component.d.ts +0 -5
  118. package/lib/components/data-sharing-invite/data-sharing-invite.component.d.ts +0 -21
  119. package/lib/components/dataset/create-dataset/create-dataset.component.d.ts +0 -17
  120. package/lib/components/dataset/dataset-editor/available-columns/available-columns.component.d.ts +0 -12
  121. package/lib/components/dataset/dataset-editor/dataset-add-join/dataset-add-join.component.d.ts +0 -61
  122. package/lib/components/dataset/dataset-editor/dataset-column-settings/dataset-column-editor/dataset-column-editor.component.d.ts +0 -21
  123. package/lib/components/dataset/dataset-editor/dataset-column-settings/dataset-column-settings.component.d.ts +0 -20
  124. package/lib/components/dataset/dataset-editor/dataset-create-formula/dataset-create-formula.component.d.ts +0 -19
  125. package/lib/components/dataset/dataset-editor/dataset-editor.component.d.ts +0 -131
  126. package/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter/dataset-filter.component.d.ts +0 -63
  127. package/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter-inclusion/dataset-filter-inclusion.component.d.ts +0 -11
  128. package/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter-junction/dataset-filter-junction.component.d.ts +0 -20
  129. package/lib/components/dataset/dataset-editor/dataset-filters/dataset-filters.component.d.ts +0 -16
  130. package/lib/components/dataset/dataset-editor/dataset-name-dialog/dataset-name-dialog.component.d.ts +0 -18
  131. package/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-add-parameter/dataset-add-parameter.component.d.ts +0 -23
  132. package/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-parameter-type/dataset-parameter-type.component.d.ts +0 -13
  133. package/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-parameter-values.component.d.ts +0 -22
  134. package/lib/components/dataset/dataset-editor/dataset-summarise/dataset-summarise.component.d.ts +0 -27
  135. package/lib/components/dataset/dataset-editor/move-transformation-confirmation/move-transformation-confirmation.component.d.ts +0 -11
  136. package/lib/components/dataset/dataset-editor/remove-transformation-warning/remove-transformation-warning.component.d.ts +0 -11
  137. package/lib/components/dataset/dataset-editor/save-as-query/save-as-query.component.d.ts +0 -25
  138. package/lib/components/dataset/dataset-editor/share-query/share-query.component.d.ts +0 -41
  139. package/lib/components/dataset/dataset-editor/upstream-changes-confirmation/upstream-changes-confirmation.component.d.ts +0 -11
  140. package/lib/components/dataset/dataset.component.d.ts +0 -74
  141. package/lib/components/datasource/create-datasource/advanced-settings/advanced-settings.component.d.ts +0 -26
  142. package/lib/components/datasource/create-datasource/api-access/api-access.component.d.ts +0 -31
  143. package/lib/components/datasource/create-datasource/create-datasource.component.d.ts +0 -112
  144. package/lib/components/datasource/create-datasource/import-data/import-data.component.d.ts +0 -28
  145. package/lib/components/datasource/create-datasource/import-data/import-wizard/import-wizard.component.d.ts +0 -40
  146. package/lib/components/datasource/create-datasource/tabular-datasource/tabular-datasource.component.d.ts +0 -34
  147. package/lib/components/datasource/datasource.component.d.ts +0 -46
  148. package/lib/components/datasource/document-datasource/document-datasource.component.d.ts +0 -64
  149. package/lib/components/export-project/export-project.component.d.ts +0 -9
  150. package/lib/components/feeds/feed/feed.component.d.ts +0 -30
  151. package/lib/components/feeds/feeds.component.d.ts +0 -47
  152. package/lib/components/job-tasks/job-tasks.component.d.ts +0 -11
  153. package/lib/components/marketplace/marketplace.component.d.ts +0 -42
  154. package/lib/components/metadata/metadata.component.d.ts +0 -24
  155. package/lib/components/notification-groups/edit-notification-group/edit-notification-group.component.d.ts +0 -37
  156. package/lib/components/notification-groups/notification-groups.component.d.ts +0 -28
  157. package/lib/components/project-picker/project-picker.component.d.ts +0 -37
  158. package/lib/components/project-settings/project-link-selection/project-link-selection.component.d.ts +0 -32
  159. package/lib/components/project-settings/project-settings.component.d.ts +0 -40
  160. package/lib/components/query-caching/edit-query-cache/edit-query-cache.component.d.ts +0 -17
  161. package/lib/components/query-caching/query-cache-view/query-cache-view.component.d.ts +0 -35
  162. package/lib/components/query-caching/query-caching.component.d.ts +0 -38
  163. package/lib/components/shared-with-me/feed-api-modal/feed-api-modal.component.d.ts +0 -21
  164. package/lib/components/shared-with-me/shared-with-me.component.d.ts +0 -43
  165. package/lib/components/snapshots/snapshots.component.d.ts +0 -52
  166. package/lib/components/tag-picker/tag-picker.component.d.ts +0 -27
  167. package/lib/components/task-time-periods/task-time-periods.component.d.ts +0 -20
  168. package/lib/components/whitelisted-sql-functions/whitelisted-sql-functions.component.d.ts +0 -17
  169. package/lib/guards/dashboard-changes.guard.d.ts +0 -11
  170. package/lib/kinintel-config.d.ts +0 -10
  171. package/lib/ng-kinintel.module.d.ts +0 -116
  172. package/lib/objects/action-event.d.ts +0 -12
  173. package/lib/services/alert.service.d.ts +0 -17
  174. package/lib/services/dashboard.service.d.ts +0 -25
  175. package/lib/services/data-processor.service.d.ts +0 -18
  176. package/lib/services/data-search.service.d.ts +0 -14
  177. package/lib/services/dataset.service.d.ts +0 -56
  178. package/lib/services/datasource.service.d.ts +0 -34
  179. package/lib/services/external.service.d.ts +0 -12
  180. package/lib/services/feed.service.d.ts +0 -19
  181. package/lib/services/notification.service.d.ts +0 -16
  182. package/lib/services/project.service.d.ts +0 -27
  183. package/lib/services/tag.service.d.ts +0 -19
  184. package/public-api.d.ts +0 -38
@@ -1,145 +0,0 @@
1
- import { Component } from '@angular/core';
2
- import * as lodash from 'lodash';
3
- import '@revolist/revogrid';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "../../../../services/datasource.service";
6
- import * as i2 from "@angular/common";
7
- import * as i3 from "@angular/material/legacy-button";
8
- import * as i4 from "@angular/material/icon";
9
- import * as i5 from "@angular/forms";
10
- import * as i6 from "@angular/material/legacy-checkbox";
11
- const _ = lodash.default;
12
- export class TabularDatasourceComponent {
13
- constructor(datasourceService) {
14
- this.datasourceService = datasourceService;
15
- this.selectedItem = {};
16
- this.autoIncrementColumn = false;
17
- this.datasourceUpdate = {
18
- title: '',
19
- instanceImportKey: '',
20
- fields: [],
21
- adds: [],
22
- updates: [],
23
- deletes: []
24
- };
25
- this.limit = 25;
26
- this.page = 1;
27
- this.endOfResults = false;
28
- this._ = _;
29
- this.datasourceTypes = [
30
- 'string', 'integer', 'float', 'date', 'datetime', 'mediumstring', 'longstring'
31
- ];
32
- this.rows = [];
33
- this.columns = [
34
- {
35
- name: 'Column 1',
36
- prop: 'column_1',
37
- type: 'string'
38
- },
39
- {
40
- name: 'Column 2',
41
- prop: 'column_2',
42
- type: 'string'
43
- }
44
- ];
45
- this.offset = 0;
46
- this.rows = [{
47
- column_1: 'hello',
48
- column_2: 'world'
49
- }, {
50
- column_1: 'hello',
51
- column_2: 'world'
52
- }];
53
- }
54
- pageSizeChange(value) {
55
- this.limit = value;
56
- this.loadDatasource();
57
- }
58
- increaseOffset() {
59
- this.page = this.page + 1;
60
- this.offset = (this.limit * this.page) - this.limit;
61
- this.loadDatasource();
62
- }
63
- decreaseOffset() {
64
- this.page = this.page <= 1 ? 1 : this.page - 1;
65
- this.offset = (this.limit * this.page) - this.limit;
66
- this.loadDatasource();
67
- }
68
- deleteSelectedColumn() {
69
- }
70
- addRow() {
71
- }
72
- addColumn() {
73
- }
74
- updateColumnName() {
75
- }
76
- resetTable() {
77
- const message = 'Are you sure you would like to reset the entire table? This will remove all data and columns. This action cannot be undone.';
78
- if (window.confirm(message)) {
79
- this.rows = [];
80
- this.columns = [
81
- {
82
- title: 'Column 1',
83
- name: 'column_1',
84
- type: 'string'
85
- },
86
- {
87
- title: 'Column 2',
88
- name: 'column_2',
89
- type: 'string'
90
- }
91
- ];
92
- }
93
- }
94
- updateAutoIncrementColumn(value) {
95
- if (value) {
96
- this.columns.map(column => {
97
- column.keyField = false;
98
- return column;
99
- });
100
- this.columns.unshift({
101
- title: 'ID',
102
- name: 'id',
103
- type: 'id'
104
- });
105
- }
106
- else {
107
- _.remove(this.columns, { type: 'id' });
108
- }
109
- }
110
- import() {
111
- }
112
- save(exit = false) {
113
- }
114
- apiAccess() {
115
- }
116
- loadDatasource() {
117
- if (this.datasourceInstanceKey) {
118
- const evaluatedDatasource = {
119
- key: this.datasourceInstanceKey,
120
- transformationInstances: [],
121
- parameterValues: {},
122
- offset: this.offset,
123
- limit: this.limit
124
- };
125
- this.datasourceService.evaluateDatasource(evaluatedDatasource).then((res) => {
126
- this.columns = res.columns.map(column => {
127
- column.previousName = column.name;
128
- return column;
129
- });
130
- this.rows = res.allData;
131
- this.endOfResults = this.rows.length < this.limit;
132
- this.datasourceUpdate.title = res.instanceTitle;
133
- this.datasourceUpdate.instanceImportKey = res.instanceImportKey;
134
- this.autoIncrementColumn = _.some(this.columns, { type: 'id' });
135
- });
136
- }
137
- }
138
- }
139
- TabularDatasourceComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TabularDatasourceComponent, deps: [{ token: i1.DatasourceService }], target: i0.ɵɵFactoryTarget.Component });
140
- TabularDatasourceComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TabularDatasourceComponent, selector: "ki-tabular-datasource", ngImport: i0, template: "<div class=\"border-b w-full flex items-center justify-between \">\n <div class=\"leading-5 px-4 text-xs uppercase tracking-wider font-medium border-r-2 text-gray-600\">\n Operations\n </div>\n <div class=\"flex items-center flex-wrap w-full justify-end bg-white\">\n <button (click)=\"apiAccess()\" [disabled]=\"!datasourceInstanceKey\"\n class=\"disabled:opacity-50 w-20 flex flex-col items-center justify-center py-1 px-2 text-xs text-gray-600 cursor-pointer hover:bg-gray-100\">\n <mat-icon class=\"text-xl\">api</mat-icon>\n api access\n </button>\n <button (click)=\"import()\"\n class=\"w-20 flex flex-col items-center justify-center py-1 px-2 text-xs text-gray-600 cursor-pointer hover:bg-gray-100\">\n <mat-icon class=\"text-xl\">upload_file</mat-icon>\n upload\n </button>\n <button (click)=\"save()\"\n class=\"w-20 flex flex-col items-center justify-center py-1 px-2 text-xs text-gray-600 cursor-pointer hover:bg-gray-100\">\n <mat-icon class=\"text-xl\">save</mat-icon>\n save\n </button>\n </div>\n</div>\n<div class=\"flex create-datasource-container\">\n <div class=\"flex-1 relative overflow-y-scroll table-scroll\">\n\n <div class=\"create-datasource\">\n <div id=\"tableWrapper\" class=\"flex-1 overflow-y-scroll relative\">\n <revo-grid [columns]=\"columns\" [source]=\"rows\" theme=\"material\"/>\n </div>\n\n <div class=\"border-t bg-gray-50 py-2 flex align-center justify-between\">\n <button (click)=\"addRow()\">\n <mat-icon>add_circle</mat-icon>\n </button>\n <div class=\"flex items-center\">\n <select [value]=\"limit\" (change)=\"pageSizeChange($event.target.value)\"\n class=\"mr-8 p-2\">\n <option [value]=\"10\">10</option>\n <option [value]=\"25\">25</option>\n <option [value]=\"50\">50</option>\n <option [value]=\"100\">100</option>\n <option [value]=\"250\">250</option>\n <option [value]=\"1000\">1000</option>\n </select>\n <button mat-icon-button class=\"mr-4\" (click)=\"decreaseOffset()\" [disabled]=\"page <= 1\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n <button mat-icon-button (click)=\"increaseOffset()\" [disabled]=\"endOfResults\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"border-l border-r bg-gray-50 -ml-2.5\">\n <button mat-icon-button color=\"primary\" (click)=\"addColumn()\"\n class=\"-mt-0.5\">\n <mat-icon>add_circle</mat-icon>\n </button>\n </div>\n\n <div class=\"bg-gray-100 w-72 h-full p-3 flex justify-between flex-col\">\n <div>\n <div class=\"uppercase font-medium tracking-wider mb-4 text-xs text-gray-600\">\n Settings\n </div>\n <label class=\"mb-4\">\n Datasource Name\n <input type=\"text\" class=\"w-full\" placeholder=\"Enter datasource name\"\n [ngClass]=\"{'border border-red-500': !datasourceUpdate.title}\"\n [(ngModel)]=\"datasourceUpdate.title\">\n <div class=\"text-xs text-red-500\" *ngIf=\"!datasourceUpdate.title\">\n Please enter a name for this datasource\n </div>\n </label>\n\n <mat-checkbox class=\"mb-4\" [checked]=\"_.find(columns, {type: 'id'})\"\n (change)=\"updateAutoIncrementColumn($event.checked)\">\n Add ID Column\n </mat-checkbox>\n\n <div>\n <button mat-button class=\"text-red-500\" (click)=\"resetTable()\">\n Reset Table\n </button>\n </div>\n\n <hr class=\"my-4\">\n\n <ng-template [ngIf]=\"selectedItem && selectedItem._tableType\">\n <div class=\"uppercase font-medium tracking-wider mb-4 text-xs text-gray-600\">\n Column\n </div>\n <label class=\"mb-4\">\n Column Title\n <input type=\"text\" [(ngModel)]=\"selectedItem.title\" placeholder=\"Enter column title\"\n (change)=\"updateColumnName()\">\n </label>\n\n <ng-template [ngIf]=\"selectedItem.type === 'id'\">\n <label class=\"mb-4\">\n Column Type\n <select [(ngModel)]=\"selectedItem.type\" disabled>\n <option [value]=\"'id'\">ID</option>\n </select>\n </label>\n\n <mat-checkbox class=\"mb-4\" [checked]=\"true\" disabled>\n {{_.filter(columns, 'keyField').length > 1 ? 'Part of Unique Identifier' : 'Unique Identifier'}}\n </mat-checkbox>\n </ng-template>\n\n <ng-template [ngIf]=\"selectedItem.type !== 'id'\">\n <label class=\"mb-4\">\n Column Type\n <select [(ngModel)]=\"selectedItem.type\" class=\"capitalize\">\n <option [value]=\"null\">-- Select column type --</option>\n <option *ngFor=\"let type of datasourceTypes\" [value]=\"type\">\n {{type}}\n </option>\n </select>\n </label>\n\n <mat-checkbox class=\"mb-4\" [(ngModel)]=\"selectedItem.keyField\"\n [disabled]=\"_.find(columns, {type:'id'})\">\n {{_.filter(columns, 'keyField').length > 1 ? 'Part of Unique Identifier' : 'Unique Identifier'}}\n </mat-checkbox>\n\n </ng-template>\n\n\n\n\n <div>\n <button mat-button color=\"warn\" (click)=\"deleteSelectedColumn()\">Delete Column</button>\n </div>\n\n <hr class=\"my-4\">\n </ng-template>\n\n\n <table class=\"datasource-table w-full\">\n <tbody>\n <tr class=\"bg-indigo-100\">\n <td class=\"pl-2\">Updated</td>\n <td class=\"pl-2 text-right\">{{datasourceUpdate.updates.length || ''}}</td>\n </tr>\n <tr class=\"bg-gray-200 opacity-30\">\n <td class=\"pl-2\">Deleted</td>\n <td class=\"pl-2 text-right\">{{datasourceUpdate.deletes.length || ''}}</td>\n </tr>\n <tr class=\"bg-green-50\">\n <td class=\"pl-2\">Added</td>\n <td class=\"pl-2 text-right\">{{datasourceUpdate.adds.length || ''}}</td>\n </tr>\n </tbody>\n </table>\n </div>\n\n <button mat-flat-button color=\"primary\" (click)=\"save(true)\">\n Save & Exit\n </button>\n </div>\n</div>\n\n\n", styles: [":host{display:block;background-color:#fff;height:calc(100vh - 104px)}.action-toolbar{display:flex;align-items:center;flex-wrap:wrap;width:100%;justify-content:flex-end;background-color:#fff;border-bottom:1px solid #ddd}.action-toolbar button{min-width:50px;padding:0 13px;color:#505050}.create-datasource-container{min-width:1024px;height:calc(100% - 49px)}.create-datasource-container .table-scroll::-webkit-scrollbar{width:.75em;background:transparent}.create-datasource-container .table-scroll::-webkit-scrollbar-thumb{background:#d2d2d2}.create-datasource-container .add-column{position:absolute;top:0;right:0}.create-datasource-container .create-datasource{margin-left:-1px;margin-top:-1px;display:flex;flex-direction:column;justify-content:space-between;height:100%}.create-datasource-container .create-datasource table.datasource-table td,.create-datasource-container .create-datasource table.datasource-table th{border:1px solid #ddd;vertical-align:middle;padding:.5rem}.create-datasource-container .create-datasource table.datasource-table th{font-weight:500}.create-datasource-container .create-datasource table.datasource-table th .header-title{min-height:20px;display:flex;align-items:center}.create-datasource-container .create-datasource table.datasource-table th .header-title mat-icon{height:20px;width:20px;font-size:20px;line-height:20px;color:#ffc400b3}.create-datasource-container .create-datasource table.datasource-table th button.header-actions{width:30px;height:30px;line-height:30px;top:50%;transform:translateY(-50%);right:0;color:gray}.create-datasource-container .create-datasource table.datasource-table th button.header-actions mat-icon{line-height:20px;height:20px;width:20px;font-size:20px}.create-datasource-container .create-datasource table.datasource-table .input-wrapper button.cell-actions{width:30px;height:30px;line-height:30px;top:50%;transform:translateY(-50%);right:0;color:gray;display:none}.create-datasource-container .create-datasource table.datasource-table .input-wrapper button.cell-actions mat-icon{line-height:20px;height:20px;width:20px;font-size:20px}.create-datasource-container .create-datasource table.datasource-table .input-wrapper:hover button.cell-actions{display:block}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.MatLegacyButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i5.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i6.MatLegacyCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }] });
141
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TabularDatasourceComponent, decorators: [{
142
- type: Component,
143
- args: [{ selector: 'ki-tabular-datasource', template: "<div class=\"border-b w-full flex items-center justify-between \">\n <div class=\"leading-5 px-4 text-xs uppercase tracking-wider font-medium border-r-2 text-gray-600\">\n Operations\n </div>\n <div class=\"flex items-center flex-wrap w-full justify-end bg-white\">\n <button (click)=\"apiAccess()\" [disabled]=\"!datasourceInstanceKey\"\n class=\"disabled:opacity-50 w-20 flex flex-col items-center justify-center py-1 px-2 text-xs text-gray-600 cursor-pointer hover:bg-gray-100\">\n <mat-icon class=\"text-xl\">api</mat-icon>\n api access\n </button>\n <button (click)=\"import()\"\n class=\"w-20 flex flex-col items-center justify-center py-1 px-2 text-xs text-gray-600 cursor-pointer hover:bg-gray-100\">\n <mat-icon class=\"text-xl\">upload_file</mat-icon>\n upload\n </button>\n <button (click)=\"save()\"\n class=\"w-20 flex flex-col items-center justify-center py-1 px-2 text-xs text-gray-600 cursor-pointer hover:bg-gray-100\">\n <mat-icon class=\"text-xl\">save</mat-icon>\n save\n </button>\n </div>\n</div>\n<div class=\"flex create-datasource-container\">\n <div class=\"flex-1 relative overflow-y-scroll table-scroll\">\n\n <div class=\"create-datasource\">\n <div id=\"tableWrapper\" class=\"flex-1 overflow-y-scroll relative\">\n <revo-grid [columns]=\"columns\" [source]=\"rows\" theme=\"material\"/>\n </div>\n\n <div class=\"border-t bg-gray-50 py-2 flex align-center justify-between\">\n <button (click)=\"addRow()\">\n <mat-icon>add_circle</mat-icon>\n </button>\n <div class=\"flex items-center\">\n <select [value]=\"limit\" (change)=\"pageSizeChange($event.target.value)\"\n class=\"mr-8 p-2\">\n <option [value]=\"10\">10</option>\n <option [value]=\"25\">25</option>\n <option [value]=\"50\">50</option>\n <option [value]=\"100\">100</option>\n <option [value]=\"250\">250</option>\n <option [value]=\"1000\">1000</option>\n </select>\n <button mat-icon-button class=\"mr-4\" (click)=\"decreaseOffset()\" [disabled]=\"page <= 1\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n <button mat-icon-button (click)=\"increaseOffset()\" [disabled]=\"endOfResults\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"border-l border-r bg-gray-50 -ml-2.5\">\n <button mat-icon-button color=\"primary\" (click)=\"addColumn()\"\n class=\"-mt-0.5\">\n <mat-icon>add_circle</mat-icon>\n </button>\n </div>\n\n <div class=\"bg-gray-100 w-72 h-full p-3 flex justify-between flex-col\">\n <div>\n <div class=\"uppercase font-medium tracking-wider mb-4 text-xs text-gray-600\">\n Settings\n </div>\n <label class=\"mb-4\">\n Datasource Name\n <input type=\"text\" class=\"w-full\" placeholder=\"Enter datasource name\"\n [ngClass]=\"{'border border-red-500': !datasourceUpdate.title}\"\n [(ngModel)]=\"datasourceUpdate.title\">\n <div class=\"text-xs text-red-500\" *ngIf=\"!datasourceUpdate.title\">\n Please enter a name for this datasource\n </div>\n </label>\n\n <mat-checkbox class=\"mb-4\" [checked]=\"_.find(columns, {type: 'id'})\"\n (change)=\"updateAutoIncrementColumn($event.checked)\">\n Add ID Column\n </mat-checkbox>\n\n <div>\n <button mat-button class=\"text-red-500\" (click)=\"resetTable()\">\n Reset Table\n </button>\n </div>\n\n <hr class=\"my-4\">\n\n <ng-template [ngIf]=\"selectedItem && selectedItem._tableType\">\n <div class=\"uppercase font-medium tracking-wider mb-4 text-xs text-gray-600\">\n Column\n </div>\n <label class=\"mb-4\">\n Column Title\n <input type=\"text\" [(ngModel)]=\"selectedItem.title\" placeholder=\"Enter column title\"\n (change)=\"updateColumnName()\">\n </label>\n\n <ng-template [ngIf]=\"selectedItem.type === 'id'\">\n <label class=\"mb-4\">\n Column Type\n <select [(ngModel)]=\"selectedItem.type\" disabled>\n <option [value]=\"'id'\">ID</option>\n </select>\n </label>\n\n <mat-checkbox class=\"mb-4\" [checked]=\"true\" disabled>\n {{_.filter(columns, 'keyField').length > 1 ? 'Part of Unique Identifier' : 'Unique Identifier'}}\n </mat-checkbox>\n </ng-template>\n\n <ng-template [ngIf]=\"selectedItem.type !== 'id'\">\n <label class=\"mb-4\">\n Column Type\n <select [(ngModel)]=\"selectedItem.type\" class=\"capitalize\">\n <option [value]=\"null\">-- Select column type --</option>\n <option *ngFor=\"let type of datasourceTypes\" [value]=\"type\">\n {{type}}\n </option>\n </select>\n </label>\n\n <mat-checkbox class=\"mb-4\" [(ngModel)]=\"selectedItem.keyField\"\n [disabled]=\"_.find(columns, {type:'id'})\">\n {{_.filter(columns, 'keyField').length > 1 ? 'Part of Unique Identifier' : 'Unique Identifier'}}\n </mat-checkbox>\n\n </ng-template>\n\n\n\n\n <div>\n <button mat-button color=\"warn\" (click)=\"deleteSelectedColumn()\">Delete Column</button>\n </div>\n\n <hr class=\"my-4\">\n </ng-template>\n\n\n <table class=\"datasource-table w-full\">\n <tbody>\n <tr class=\"bg-indigo-100\">\n <td class=\"pl-2\">Updated</td>\n <td class=\"pl-2 text-right\">{{datasourceUpdate.updates.length || ''}}</td>\n </tr>\n <tr class=\"bg-gray-200 opacity-30\">\n <td class=\"pl-2\">Deleted</td>\n <td class=\"pl-2 text-right\">{{datasourceUpdate.deletes.length || ''}}</td>\n </tr>\n <tr class=\"bg-green-50\">\n <td class=\"pl-2\">Added</td>\n <td class=\"pl-2 text-right\">{{datasourceUpdate.adds.length || ''}}</td>\n </tr>\n </tbody>\n </table>\n </div>\n\n <button mat-flat-button color=\"primary\" (click)=\"save(true)\">\n Save & Exit\n </button>\n </div>\n</div>\n\n\n", styles: [":host{display:block;background-color:#fff;height:calc(100vh - 104px)}.action-toolbar{display:flex;align-items:center;flex-wrap:wrap;width:100%;justify-content:flex-end;background-color:#fff;border-bottom:1px solid #ddd}.action-toolbar button{min-width:50px;padding:0 13px;color:#505050}.create-datasource-container{min-width:1024px;height:calc(100% - 49px)}.create-datasource-container .table-scroll::-webkit-scrollbar{width:.75em;background:transparent}.create-datasource-container .table-scroll::-webkit-scrollbar-thumb{background:#d2d2d2}.create-datasource-container .add-column{position:absolute;top:0;right:0}.create-datasource-container .create-datasource{margin-left:-1px;margin-top:-1px;display:flex;flex-direction:column;justify-content:space-between;height:100%}.create-datasource-container .create-datasource table.datasource-table td,.create-datasource-container .create-datasource table.datasource-table th{border:1px solid #ddd;vertical-align:middle;padding:.5rem}.create-datasource-container .create-datasource table.datasource-table th{font-weight:500}.create-datasource-container .create-datasource table.datasource-table th .header-title{min-height:20px;display:flex;align-items:center}.create-datasource-container .create-datasource table.datasource-table th .header-title mat-icon{height:20px;width:20px;font-size:20px;line-height:20px;color:#ffc400b3}.create-datasource-container .create-datasource table.datasource-table th button.header-actions{width:30px;height:30px;line-height:30px;top:50%;transform:translateY(-50%);right:0;color:gray}.create-datasource-container .create-datasource table.datasource-table th button.header-actions mat-icon{line-height:20px;height:20px;width:20px;font-size:20px}.create-datasource-container .create-datasource table.datasource-table .input-wrapper button.cell-actions{width:30px;height:30px;line-height:30px;top:50%;transform:translateY(-50%);right:0;color:gray;display:none}.create-datasource-container .create-datasource table.datasource-table .input-wrapper button.cell-actions mat-icon{line-height:20px;height:20px;width:20px;font-size:20px}.create-datasource-container .create-datasource table.datasource-table .input-wrapper:hover button.cell-actions{display:block}\n"] }]
144
- }], ctorParameters: function () { return [{ type: i1.DatasourceService }]; } });
145
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFidWxhci1kYXRhc291cmNlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWtpbmludGVsL3NyYy9saWIvY29tcG9uZW50cy9kYXRhc291cmNlL2NyZWF0ZS1kYXRhc291cmNlL3RhYnVsYXItZGF0YXNvdXJjZS90YWJ1bGFyLWRhdGFzb3VyY2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmcta2luaW50ZWwvc3JjL2xpYi9jb21wb25lbnRzL2RhdGFzb3VyY2UvY3JlYXRlLWRhdGFzb3VyY2UvdGFidWxhci1kYXRhc291cmNlL3RhYnVsYXItZGF0YXNvdXJjZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFDLE9BQU8sS0FBSyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBR2pDLE9BQU8sb0JBQW9CLENBQUM7Ozs7Ozs7O0FBRDVCLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFRekIsTUFBTSxPQUFPLDBCQUEwQjtJQW9DbkMsWUFBb0IsaUJBQW9DO1FBQXBDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFqQ2pELGlCQUFZLEdBQVEsRUFBRSxDQUFDO1FBQ3ZCLHdCQUFtQixHQUFHLEtBQUssQ0FBQztRQUM1QixxQkFBZ0IsR0FBUTtZQUMzQixLQUFLLEVBQUUsRUFBRTtZQUNULGlCQUFpQixFQUFFLEVBQUU7WUFDckIsTUFBTSxFQUFFLEVBQUU7WUFDVixJQUFJLEVBQUUsRUFBRTtZQUNSLE9BQU8sRUFBRSxFQUFFO1lBQ1gsT0FBTyxFQUFFLEVBQUU7U0FDZCxDQUFDO1FBQ0ssVUFBSyxHQUFHLEVBQUUsQ0FBQztRQUNYLFNBQUksR0FBRyxDQUFDLENBQUM7UUFDVCxpQkFBWSxHQUFHLEtBQUss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bUJBQW1CLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUMsSUFBSSxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7WUFDbEUsQ0FBQyxDQUFDLENBQUM7U0FDTjtJQUNMLENBQUM7O3dIQXZKUSwwQkFBMEI7NEdBQTFCLDBCQUEwQiw2RENYdkMsNjJPQXVLQTs0RkQ1SmEsMEJBQTBCO2tCQUx0QyxTQUFTOytCQUNFLHVCQUF1QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0ICogYXMgbG9kYXNoIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQge0RhdGFzb3VyY2VTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi8uLi9zZXJ2aWNlcy9kYXRhc291cmNlLnNlcnZpY2UnO1xuY29uc3QgXyA9IGxvZGFzaC5kZWZhdWx0O1xuaW1wb3J0ICdAcmV2b2xpc3QvcmV2b2dyaWQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdraS10YWJ1bGFyLWRhdGFzb3VyY2UnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFidWxhci1kYXRhc291cmNlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGFidWxhci1kYXRhc291cmNlLmNvbXBvbmVudC5zYXNzJ11cbn0pXG5leHBvcnQgY2xhc3MgVGFidWxhckRhdGFzb3VyY2VDb21wb25lbnQge1xuXG4gICAgcHVibGljIGRhdGFzb3VyY2VJbnN0YW5jZUtleTogc3RyaW5nO1xuICAgIHB1YmxpYyBzZWxlY3RlZEl0ZW06IGFueSA9IHt9O1xuICAgIHB1YmxpYyBhdXRvSW5jcmVtZW50Q29sdW1uID0gZmFsc2U7XG4gICAgcHVibGljIGRhdGFzb3VyY2VVcGRhdGU6IGFueSA9IHtcbiAgICAgICAgdGl0bGU6ICcnLFxuICAgICAgICBpbnN0YW5jZUltcG9ydEtleTogJycsXG4gICAgICAgIGZpZWxkczogW10sXG4gICAgICAgIGFkZHM6IFtdLFxuICAgICAgICB1cGRhdGVzOiBbXSxcbiAgICAgICAgZGVsZXRlczogW11cbiAgICB9O1xuICAgIHB1YmxpYyBsaW1pdCA9IDI1O1xuICAgIHB1YmxpYyBwYWdlID0gMTtcbiAgICBwdWJsaWMgZW5kT2ZSZXN1bHRzID0gZmFsc2U7XG4gICAgcHVibGljIF8gPSBfO1xuICAgIHB1YmxpYyByZWFkb25seSBkYXRhc291cmNlVHlwZXM6IGFueSA9IFtcbiAgICAgICAgJ3N0cmluZycsICdpbnRlZ2VyJywgJ2Zsb2F0JywgJ2RhdGUnLCAnZGF0ZXRpbWUnLCAnbWVkaXVtc3RyaW5nJywgJ2xvbmdzdHJpbmcnXG4gICAgXTtcbiAgICBwdWJsaWMgcm93czogYW55ID0gW107XG4gICAgcHVibGljIGNvbHVtbnM6IGFueSA9IFtcbiAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ0NvbHVtbiAxJyxcbiAgICAgICAgICAgIHByb3A6ICdjb2x1bW5fMScsXG4gICAgICAgICAgICB0eXBlOiAnc3RyaW5nJ1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnQ29sdW1uIDInLFxuICAgICAgICAgICAgcHJvcDogJ2NvbHVtbl8yJyxcbiAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnXG4gICAgICAgIH1cbiAgICBdO1xuXG4gICAgcHJpdmF0ZSBvZmZzZXQgPSAwO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBkYXRhc291cmNlU2VydmljZTogRGF0YXNvdXJjZVNlcnZpY2UpIHtcbiAgICAgICAgdGhpcy5yb3dzID0gW3tcbiAgICAgICAgICAgIGNvbHVtbl8xOiAnaGVsbG8nLFxuICAgICAgICAgICAgY29sdW1uXzI6ICd3b3JsZCdcbiAgICAgICAgfSwge1xuICAgICAgICAgICAgY29sdW1uXzE6ICdoZWxsbycsXG4gICAgICAgICAgICBjb2x1bW5fMjogJ3dvcmxkJ1xuICAgICAgICB9XTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcGFnZVNpemVDaGFuZ2UodmFsdWUpIHtcbiAgICAgICAgdGhpcy5saW1pdCA9IHZhbHVlO1xuICAgICAgICB0aGlzLmxvYWREYXRhc291cmNlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGluY3JlYXNlT2Zmc2V0KCkge1xuICAgICAgICB0aGlzLnBhZ2UgPSB0aGlzLnBhZ2UgKyAxO1xuICAgICAgICB0aGlzLm9mZnNldCA9ICh0aGlzLmxpbWl0ICogdGhpcy5wYWdlKSAtIHRoaXMubGltaXQ7XG4gICAgICAgIHRoaXMubG9hZERhdGFzb3VyY2UoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVjcmVhc2VPZmZzZXQoKSB7XG4gICAgICAgIHRoaXMucGFnZSA9IHRoaXMucGFnZSA8PSAxID8gMSA6IHRoaXMucGFnZSAtIDE7XG4gICAgICAgIHRoaXMub2Zmc2V0ID0gKHRoaXMubGltaXQgKiB0aGlzLnBhZ2UpIC0gdGhpcy5saW1pdDtcbiAgICAgICAgdGhpcy5sb2FkRGF0YXNvdXJjZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBkZWxldGVTZWxlY3RlZENvbHVtbigpIHtcblxuICAgIH1cblxuICAgIHB1YmxpYyBhZGRSb3coKSB7XG5cbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkQ29sdW1uKCkge1xuXG4gICAgfVxuXG4gICAgcHVibGljIHVwZGF0ZUNvbHVtbk5hbWUoKSB7XG5cbiAgICB9XG5cbiAgICBwdWJsaWMgcmVzZXRUYWJsZSgpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9ICdBcmUgeW91IHN1cmUgeW91IHdvdWxkIGxpa2UgdG8gcmVzZXQgdGhlIGVudGlyZSB0YWJsZT8gVGhpcyB3aWxsIHJlbW92ZSBhbGwgZGF0YSBhbmQgY29sdW1ucy4gVGhpcyBhY3Rpb24gY2Fubm90IGJlIHVuZG9uZS4nO1xuICAgICAgICBpZiAod2luZG93LmNvbmZpcm0obWVzc2FnZSkpIHtcbiAgICAgICAgICAgIHRoaXMucm93cyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5jb2x1bW5zID0gW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICdDb2x1bW4gMScsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdjb2x1bW5fMScsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiAnQ29sdW1uIDInLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnY29sdW1uXzInLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnc3RyaW5nJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgdXBkYXRlQXV0b0luY3JlbWVudENvbHVtbih2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuY29sdW1ucy5tYXAoY29sdW1uID0+IHtcbiAgICAgICAgICAgICAgICBjb2x1bW4ua2V5RmllbGQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29sdW1uO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuY29sdW1ucy51bnNoaWZ0KHtcbiAgICAgICAgICAgICAgICB0aXRsZTogJ0lEJyxcbiAgICAgICAgICAgICAgICBuYW1lOiAnaWQnLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdpZCdcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgXy5yZW1vdmUodGhpcy5jb2x1bW5zLCB7dHlwZTogJ2lkJ30pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGltcG9ydCgpIHtcblxuICAgIH1cblxuICAgIHB1YmxpYyBzYXZlKGV4aXQgPSBmYWxzZSkge1xuXG4gICAgfVxuXG4gICAgcHVibGljIGFwaUFjY2VzcygpIHtcblxuICAgIH1cblxuICAgIHByaXZhdGUgbG9hZERhdGFzb3VyY2UoKSB7XG4gICAgICAgIGlmICh0aGlzLmRhdGFzb3VyY2VJbnN0YW5jZUtleSkge1xuICAgICAgICAgICAgY29uc3QgZXZhbHVhdGVkRGF0YXNvdXJjZSA9IHtcbiAgICAgICAgICAgICAgICBrZXk6IHRoaXMuZGF0YXNvdXJjZUluc3RhbmNlS2V5LFxuICAgICAgICAgICAgICAgIHRyYW5zZm9ybWF0aW9uSW5zdGFuY2VzOiBbXSxcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJWYWx1ZXM6IHt9LFxuICAgICAgICAgICAgICAgIG9mZnNldDogdGhpcy5vZmZzZXQsXG4gICAgICAgICAgICAgICAgbGltaXQ6IHRoaXMubGltaXRcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLmRhdGFzb3VyY2VTZXJ2aWNlLmV2YWx1YXRlRGF0YXNvdXJjZShldmFsdWF0ZWREYXRhc291cmNlKS50aGVuKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY29sdW1ucyA9IHJlcy5jb2x1bW5zLm1hcChjb2x1bW4gPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb2x1bW4ucHJldmlvdXNOYW1lID0gY29sdW1uLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb2x1bW47XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5yb3dzID0gcmVzLmFsbERhdGE7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmVuZE9mUmVzdWx0cyA9IHRoaXMucm93cy5sZW5ndGggPCB0aGlzLmxpbWl0O1xuXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhc291cmNlVXBkYXRlLnRpdGxlID0gcmVzLmluc3RhbmNlVGl0bGU7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhc291cmNlVXBkYXRlLmluc3RhbmNlSW1wb3J0S2V5ID0gcmVzLmluc3RhbmNlSW1wb3J0S2V5O1xuXG4gICAgICAgICAgICAgICAgdGhpcy5hdXRvSW5jcmVtZW50Q29sdW1uID0gXy5zb21lKHRoaXMuY29sdW1ucywge3R5cGU6ICdpZCd9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImJvcmRlci1iIHctZnVsbCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gXCI+XG4gICAgPGRpdiBjbGFzcz1cImxlYWRpbmctNSBweC00IHRleHQteHMgdXBwZXJjYXNlIHRyYWNraW5nLXdpZGVyIGZvbnQtbWVkaXVtIGJvcmRlci1yLTIgdGV4dC1ncmF5LTYwMFwiPlxuICAgICAgICBPcGVyYXRpb25zXG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGZsZXgtd3JhcCB3LWZ1bGwganVzdGlmeS1lbmQgYmctd2hpdGVcIj5cbiAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiYXBpQWNjZXNzKClcIiBbZGlzYWJsZWRdPVwiIWRhdGFzb3VyY2VJbnN0YW5jZUtleVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJkaXNhYmxlZDpvcGFjaXR5LTUwIHctMjAgZmxleCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcHktMSBweC0yIHRleHQteHMgdGV4dC1ncmF5LTYwMCBjdXJzb3ItcG9pbnRlciBob3ZlcjpiZy1ncmF5LTEwMFwiPlxuICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwidGV4dC14bFwiPmFwaTwvbWF0LWljb24+XG4gICAgICAgICAgICBhcGkgYWNjZXNzXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIChjbGljayk9XCJpbXBvcnQoKVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ3LTIwIGZsZXggZmxleC1jb2wgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHB5LTEgcHgtMiB0ZXh0LXhzIHRleHQtZ3JheS02MDAgY3Vyc29yLXBvaW50ZXIgaG92ZXI6YmctZ3JheS0xMDBcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cInRleHQteGxcIj51cGxvYWRfZmlsZTwvbWF0LWljb24+XG4gICAgICAgICAgICB1cGxvYWRcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gKGNsaWNrKT1cInNhdmUoKVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ3LTIwIGZsZXggZmxleC1jb2wgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHB5LTEgcHgtMiB0ZXh0LXhzIHRleHQtZ3JheS02MDAgY3Vyc29yLXBvaW50ZXIgaG92ZXI6YmctZ3JheS0xMDBcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cInRleHQteGxcIj5zYXZlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIHNhdmVcbiAgICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJmbGV4IGNyZWF0ZS1kYXRhc291cmNlLWNvbnRhaW5lclwiPlxuICAgIDxkaXYgY2xhc3M9XCJmbGV4LTEgcmVsYXRpdmUgb3ZlcmZsb3cteS1zY3JvbGwgdGFibGUtc2Nyb2xsXCI+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNyZWF0ZS1kYXRhc291cmNlXCI+XG4gICAgICAgICAgICA8ZGl2IGlkPVwidGFibGVXcmFwcGVyXCIgY2xhc3M9XCJmbGV4LTEgb3ZlcmZsb3cteS1zY3JvbGwgcmVsYXRpdmVcIj5cbiAgICAgICAgICAgICAgICA8cmV2by1ncmlkIFtjb2x1bW5zXT1cImNvbHVtbnNcIiBbc291cmNlXT1cInJvd3NcIiB0aGVtZT1cIm1hdGVyaWFsXCIvPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3JkZXItdCBiZy1ncmF5LTUwIHB5LTIgZmxleCBhbGlnbi1jZW50ZXIganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAgKGNsaWNrKT1cImFkZFJvdygpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5hZGRfY2lyY2xlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBbdmFsdWVdPVwibGltaXRcIiAoY2hhbmdlKT1cInBhZ2VTaXplQ2hhbmdlKCRldmVudC50YXJnZXQudmFsdWUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1yLTggcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCIxMFwiPjEwPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCIyNVwiPjI1PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCI1MFwiPjUwPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCIxMDBcIj4xMDA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cIjI1MFwiPjI1MDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwiMTAwMFwiPjEwMDA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIGNsYXNzPVwibXItNFwiIChjbGljayk9XCJkZWNyZWFzZU9mZnNldCgpXCIgW2Rpc2FibGVkXT1cInBhZ2UgPD0gMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmNoZXZyb25fbGVmdDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwiaW5jcmVhc2VPZmZzZXQoKVwiIFtkaXNhYmxlZF09XCJlbmRPZlJlc3VsdHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5jaGV2cm9uX3JpZ2h0PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYm9yZGVyLWwgYm9yZGVyLXIgYmctZ3JheS01MCAtbWwtMi41XCI+XG4gICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIChjbGljayk9XCJhZGRDb2x1bW4oKVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCItbXQtMC41XCI+XG4gICAgICAgICAgICA8bWF0LWljb24+YWRkX2NpcmNsZTwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImJnLWdyYXktMTAwIHctNzIgaC1mdWxsIHAtMyBmbGV4IGp1c3RpZnktYmV0d2VlbiBmbGV4LWNvbFwiPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVwcGVyY2FzZSBmb250LW1lZGl1bSB0cmFja2luZy13aWRlciBtYi00IHRleHQteHMgdGV4dC1ncmF5LTYwMFwiPlxuICAgICAgICAgICAgICAgIFNldHRpbmdzXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cIm1iLTRcIj5cbiAgICAgICAgICAgICAgICBEYXRhc291cmNlIE5hbWVcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cInctZnVsbFwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgZGF0YXNvdXJjZSBuYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydib3JkZXIgYm9yZGVyLXJlZC01MDAnOiAhZGF0YXNvdXJjZVVwZGF0ZS50aXRsZX1cIlxuICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImRhdGFzb3VyY2VVcGRhdGUudGl0bGVcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC14cyB0ZXh0LXJlZC01MDBcIiAqbmdJZj1cIiFkYXRhc291cmNlVXBkYXRlLnRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICAgIFBsZWFzZSBlbnRlciBhIG5hbWUgZm9yIHRoaXMgZGF0YXNvdXJjZVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9sYWJlbD5cblxuICAgICAgICAgICAgPG1hdC1jaGVja2JveCBjbGFzcz1cIm1iLTRcIiBbY2hlY2tlZF09XCJfLmZpbmQoY29sdW1ucywge3R5cGU6ICdpZCd9KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidXBkYXRlQXV0b0luY3JlbWVudENvbHVtbigkZXZlbnQuY2hlY2tlZClcIj5cbiAgICAgICAgICAgICAgICBBZGQgSUQgQ29sdW1uXG4gICAgICAgICAgICA8L21hdC1jaGVja2JveD5cblxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gY2xhc3M9XCJ0ZXh0LXJlZC01MDBcIiAoY2xpY2spPVwicmVzZXRUYWJsZSgpXCI+XG4gICAgICAgICAgICAgICAgICAgIFJlc2V0IFRhYmxlXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGhyIGNsYXNzPVwibXktNFwiPlxuXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwic2VsZWN0ZWRJdGVtICYmIHNlbGVjdGVkSXRlbS5fdGFibGVUeXBlXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVwcGVyY2FzZSBmb250LW1lZGl1bSB0cmFja2luZy13aWRlciBtYi00IHRleHQteHMgdGV4dC1ncmF5LTYwMFwiPlxuICAgICAgICAgICAgICAgICAgICBDb2x1bW5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJtYi00XCI+XG4gICAgICAgICAgICAgICAgICAgIENvbHVtbiBUaXRsZVxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkSXRlbS50aXRsZVwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgY29sdW1uIHRpdGxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidXBkYXRlQ29sdW1uTmFtZSgpXCI+XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cblxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJzZWxlY3RlZEl0ZW0udHlwZSA9PT0gJ2lkJ1wiPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJtYi00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBDb2x1bW4gVHlwZVxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBbKG5nTW9kZWwpXT1cInNlbGVjdGVkSXRlbS50eXBlXCIgZGlzYWJsZWQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwiJ2lkJ1wiPklEPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cblxuICAgICAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94IGNsYXNzPVwibWItNFwiIFtjaGVja2VkXT1cInRydWVcIiBkaXNhYmxlZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7Xy5maWx0ZXIoY29sdW1ucywgJ2tleUZpZWxkJykubGVuZ3RoID4gMSA/ICdQYXJ0IG9mIFVuaXF1ZSBJZGVudGlmaWVyJyA6ICdVbmlxdWUgSWRlbnRpZmllcid9fVxuICAgICAgICAgICAgICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cInNlbGVjdGVkSXRlbS50eXBlICE9PSAnaWQnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cIm1iLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbiBUeXBlXG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IFsobmdNb2RlbCldPVwic2VsZWN0ZWRJdGVtLnR5cGVcIiBjbGFzcz1cImNhcGl0YWxpemVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCJudWxsXCI+LS0gU2VsZWN0IGNvbHVtbiB0eXBlIC0tPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgdHlwZSBvZiBkYXRhc291cmNlVHlwZXNcIiBbdmFsdWVdPVwidHlwZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3R5cGV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGVja2JveCBjbGFzcz1cIm1iLTRcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkSXRlbS5rZXlGaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIl8uZmluZChjb2x1bW5zLCB7dHlwZTonaWQnfSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7Xy5maWx0ZXIoY29sdW1ucywgJ2tleUZpZWxkJykubGVuZ3RoID4gMSA/ICdQYXJ0IG9mIFVuaXF1ZSBJZGVudGlmaWVyJyA6ICdVbmlxdWUgSWRlbnRpZmllcid9fVxuICAgICAgICAgICAgICAgICAgICA8L21hdC1jaGVja2JveD5cblxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cblxuXG5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gY29sb3I9XCJ3YXJuXCIgKGNsaWNrKT1cImRlbGV0ZVNlbGVjdGVkQ29sdW1uKClcIj5EZWxldGUgQ29sdW1uPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8aHIgY2xhc3M9XCJteS00XCI+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG5cbiAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cImRhdGFzb3VyY2UtdGFibGUgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cImJnLWluZGlnby0xMDBcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwicGwtMlwiPlVwZGF0ZWQ8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJwbC0yIHRleHQtcmlnaHRcIj57e2RhdGFzb3VyY2VVcGRhdGUudXBkYXRlcy5sZW5ndGggfHwgJyd9fTwvdGQ+XG4gICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJiZy1ncmF5LTIwMCBvcGFjaXR5LTMwXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInBsLTJcIj5EZWxldGVkPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwicGwtMiB0ZXh0LXJpZ2h0XCI+e3tkYXRhc291cmNlVXBkYXRlLmRlbGV0ZXMubGVuZ3RoIHx8ICcnfX08L3RkPlxuICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwiYmctZ3JlZW4tNTBcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwicGwtMlwiPkFkZGVkPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwicGwtMiB0ZXh0LXJpZ2h0XCI+e3tkYXRhc291cmNlVXBkYXRlLmFkZHMubGVuZ3RoIHx8ICcnfX08L3RkPlxuICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxidXR0b24gbWF0LWZsYXQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIChjbGljayk9XCJzYXZlKHRydWUpXCI+XG4gICAgICAgICAgICBTYXZlICYgRXhpdFxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuXG5cbiJdfQ==
@@ -1,162 +0,0 @@
1
- import { Component, Input } from '@angular/core';
2
- import { BehaviorSubject, merge, Subject } from 'rxjs';
3
- import { debounceTime, distinctUntilChanged, map, switchMap } from 'rxjs/operators';
4
- import { DataExplorerComponent } from '../data-explorer/data-explorer.component';
5
- import * as lodash from 'lodash';
6
- import * as i0 from "@angular/core";
7
- import * as i1 from "@angular/material/legacy-dialog";
8
- import * as i2 from "../../services/datasource.service";
9
- import * as i3 from "../../services/project.service";
10
- import * as i4 from "@angular/router";
11
- import * as i5 from "@angular/common";
12
- import * as i6 from "@angular/material/legacy-button";
13
- import * as i7 from "@angular/material/icon";
14
- import * as i8 from "@angular/material/legacy-menu";
15
- import * as i9 from "@angular/forms";
16
- const _ = lodash.default;
17
- export class DatasourceComponent {
18
- constructor(dialog, datasourceService, projectService, router, route) {
19
- this.dialog = dialog;
20
- this.datasourceService = datasourceService;
21
- this.projectService = projectService;
22
- this.router = router;
23
- this.route = route;
24
- this.newDocumentURL = '/document-datasource';
25
- this.newTabularURL = '/import-data';
26
- this.datasourceURL = '/datasource';
27
- this.noProject = false;
28
- this.datasources = [];
29
- this.searchText = new BehaviorSubject('');
30
- this.limit = 10;
31
- this.offset = 0;
32
- this.page = 1;
33
- this.endOfResults = false;
34
- this.reload = new Subject();
35
- this.isProjectAdmin = false;
36
- this.canImportData = false;
37
- }
38
- ngOnInit() {
39
- this.searchText.subscribe(() => {
40
- this.page = 1;
41
- this.offset = 0;
42
- });
43
- const pagingValues = this.projectService.getDataItemPagingValues();
44
- this.limit = pagingValues.limit || 10;
45
- this.offset = pagingValues.offset || 0;
46
- this.page = pagingValues.page || 1;
47
- this.isProjectAdmin = this.projectService.isActiveProjectAdmin();
48
- this.canImportData = this.projectService.doesActiveProjectHavePrivilege('customdatasourceaccess');
49
- this.projectSub = this.projectService.activeProject.subscribe(() => {
50
- this.isProjectAdmin = this.projectService.isActiveProjectAdmin();
51
- });
52
- if (this.canImportData) {
53
- this.route.params.subscribe(async (param) => {
54
- if (param.key) {
55
- const datasource = await this.datasourceService.getDatasource(param.key);
56
- this.explore(datasource);
57
- }
58
- });
59
- merge(this.searchText, this.reload)
60
- .pipe(debounceTime(300), distinctUntilChanged(), switchMap(() => this.getDatasources())).subscribe((sources) => {
61
- if (this.filterResults) {
62
- this.datasources = _.filter(sources, this.filterResults);
63
- }
64
- else {
65
- this.datasources = sources;
66
- }
67
- });
68
- }
69
- }
70
- ngOnDestroy() {
71
- this.projectSub.unsubscribe();
72
- }
73
- createDatasource() {
74
- }
75
- explore(datasource) {
76
- this.router.navigate([this.datasourceURL], { fragment: datasource.key });
77
- const datasetInstanceSummary = {
78
- datasetInstanceId: null,
79
- datasourceInstanceKey: datasource.key,
80
- transformationInstances: [],
81
- parameterValues: {},
82
- parameters: [],
83
- originDataItemTitle: datasource.title
84
- };
85
- const dialogRef = this.dialog.open(DataExplorerComponent, {
86
- width: '100vw',
87
- height: '100vh',
88
- maxWidth: '100vw',
89
- maxHeight: '100vh',
90
- hasBackdrop: false,
91
- data: {
92
- datasetInstanceSummary,
93
- showChart: false,
94
- admin: this.admin,
95
- breadcrumb: this.title || 'Datasources'
96
- }
97
- });
98
- dialogRef.afterClosed().subscribe(res => {
99
- if (res && res.breadcrumb) {
100
- return this.router.navigate([res.breadcrumb], { fragment: null });
101
- }
102
- this.router.navigate([this.datasourceURL], { fragment: null });
103
- });
104
- }
105
- async delete(key) {
106
- const message = 'Are you sure you would like to delete this item?';
107
- if (window.confirm(message)) {
108
- await this.datasourceService.deleteDatasource(key);
109
- this.reload.next(Date.now());
110
- }
111
- }
112
- increaseOffset() {
113
- this.page = this.page + 1;
114
- this.offset = (this.limit * this.page) - this.limit;
115
- this.reload.next(Date.now());
116
- }
117
- decreaseOffset() {
118
- this.page = this.page <= 1 ? 1 : this.page - 1;
119
- this.offset = (this.limit * this.page) - this.limit;
120
- this.reload.next(Date.now());
121
- }
122
- pageSizeChange(value) {
123
- this.page = 1;
124
- this.offset = 0;
125
- this.limit = value;
126
- this.reload.next(Date.now());
127
- }
128
- getDatasources() {
129
- this.projectService.setDataItemPagingValue(this.limit, this.offset, this.page);
130
- return this.datasourceService.getDatasources(this.searchText.getValue() || '', this.filterResults ? '1000' : this.limit.toString(), this.filterResults ? '0' : this.offset.toString(), this.noProject).pipe(map((sources) => {
131
- this.endOfResults = sources.length < this.limit;
132
- return sources;
133
- }));
134
- }
135
- }
136
- DatasourceComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DatasourceComponent, deps: [{ token: i1.MatLegacyDialog }, { token: i2.DatasourceService }, { token: i3.ProjectService }, { token: i4.Router }, { token: i4.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component });
137
- DatasourceComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: DatasourceComponent, selector: "ki-datasource", inputs: { admin: "admin", title: "title", description: "description", exploreText: "exploreText", hideNew: "hideNew", newDocumentURL: "newDocumentURL", newTabularURL: "newTabularURL", datasourceURL: "datasourceURL", noProject: "noProject", filterResults: "filterResults" }, ngImport: i0, template: "<div class=\"p-6 bg-white border-b border-gray-200\">\n <div class=\"md:flex md:items-center md:justify-between md:space-x-5\">\n <div class=\"flex items-start flex-1\">\n <div class=\"pt-1.5\">\n <h1 class=\"text-2xl font-bold text-gray-900 capitalize\">{{title || 'Datasources'}}</h1>\n <p class=\"text-sm font-medium text-gray-500\">\n {{description || 'A list of all the datasources currently available.'}}\n </p>\n </div>\n </div>\n <div class=\"mt-6 flex flex-col-reverse justify-stretch\" *ngIf=\"isProjectAdmin && !hideNew && canImportData\">\n <button mat-flat-button color=\"primary\" [matMenuTriggerFor]=\"create\">\n Import Data\n <mat-icon>expand_more</mat-icon>\n </button>\n <mat-menu #create=\"matMenu\">\n <button mat-menu-item [routerLink]=\"[newTabularURL]\">\n New Tabular Datasource\n </button>\n <button mat-menu-item [routerLink]=\"[newDocumentURL]\">\n New Document Datasource\n </button>\n </mat-menu>\n </div>\n </div>\n</div>\n\n<div class=\"px-4 sm:px-6 lg:px-8 mt-0\">\n <div class=\"flex flex-col\">\n <div *ngIf=\"!canImportData\" class=\"mt-8 border-l-4 border-yellow-400 bg-yellow-50 p-4\">\n <div class=\"flex\">\n <div class=\"flex-shrink-0\">\n <svg class=\"h-5 w-5 text-yellow-400\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\"\n d=\"M8.485 2.495c.673-1.167 2.357-1.167 3.03 0l6.28 10.875c.673 1.167-.17 2.625-1.516 2.625H3.72c-1.347 0-2.189-1.458-1.515-2.625L8.485 2.495zM10 5a.75.75 0 01.75.75v3.5a.75.75 0 01-1.5 0v-3.5A.75.75 0 0110 5zm0 9a1 1 0 100-2 1 1 0 000 2z\"\n clip-rule=\"evenodd\"/>\n </svg>\n </div>\n <div class=\"ml-3\">\n <p class=\"text-sm text-yellow-700 mb-0\">\n Imported Data is reserved for our Accredited users. Please <a class=\"font-medium text-yellow-700 underline hover:text-yellow-600\"\n href=\"https://dnsrf.org/joining-options/index.html\">review our Tiers</a> to find out more.\n </p>\n </div>\n </div>\n </div>\n <div *ngIf=\"canImportData\" class=\"-my-2 -mx-4 sm:-mx-6 lg:-mx-8\">\n <div class=\"inline-block min-w-full py-2 align-middle\">\n <div class=\"mt-3 sm:mt-0 flex-1\">\n <label for=\"mobile-search-candidate\" class=\"sr-only\">Search</label>\n <div class=\"flex\">\n <div class=\"relative flex-grow focus-within:z-10\">\n <div class=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n <svg class=\"h-5 w-5 text-gray-400\" xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\"\n d=\"M8 4a4 4 0 100 8 4 4 0 000-8zM2 8a6 6 0 1110.89 3.476l4.817 4.817a1 1 0 01-1.414 1.414l-4.816-4.816A6 6 0 012 8z\"\n clip-rule=\"evenodd\"/>\n </svg>\n </div>\n <input type=\"text\" name=\"mobile-search-candidate\" id=\"mobile-search-candidate\"\n class=\"text-sm block w-full rounded-none pl-10 border-t-0 border-l-0 border-r-0 border-gray-300\"\n placeholder=\"Search {{title || 'datasources'}}\"\n (keyup)=\"searchText.next($event.target.value)\">\n </div>\n </div>\n </div>\n <table class=\"min-w-full border-separate\" style=\"border-spacing: 0\">\n <tbody class=\"bg-white\">\n <ng-template [ngIf]=\"datasources.length\">\n <tr class=\"border-t border-gray-200\">\n <th colspan=\"2\" scope=\"colgroup\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-100 py-3.5 px-4 text-left text-xs font-semibold text-gray-900\">\n <span *ngIf=\"!admin\">Project&nbsp;</span>{{title || 'Datasources'}}\n </th>\n </tr>\n <tr *ngFor=\"let element of datasources; let i = index\" class=\"hover:bg-gray-50\">\n <td class=\"whitespace-nowrap border-gray-200 py-2 px-4 text-sm text-gray-900\"\n [ngClass]=\"{'border-b-0': i === datasources.length - 1, 'border-b': i !== datasources.length - 1}\">\n <div class=\"flex flex-col\">\n <div\n class=\"item-title-select flex items-center font-medium cursor-pointer hover:underline\"\n (click)=\"explore(element)\">\n {{element.title}}\n </div>\n <div (click)=\"element.viewDescription = !element.viewDescription\"\n class=\"text-gray-400 font-thin w-2/3 overflow-ellipsis overflow-hidden whitespace-nowrap cursor-pointer hover:underline\">\n {{element.summary}}\n </div>\n <div *ngIf=\"element.viewDescription && element.description\" class=\"mt-4\"\n [innerHTML]=\"element.description\"></div>\n </div>\n </td>\n <td class=\"relative whitespace-nowrap border-gray-200 py-2 px-4 text-right text-sm font-medium\"\n [ngClass]=\"{'border-b-0': i === datasources.length - 1, 'border-b': i !== datasources.length - 1}\">\n <div class=\"flex items-center justify-end\">\n <ng-template [ngIf]=\"isProjectAdmin\">\n <button mat-button color=\"primary\" *ngIf=\"element.type === 'custom'\"\n [routerLink]=\"[newTabularURL, element.key]\">\n Edit\n </button>\n <button mat-button color=\"primary\" *ngIf=\"element.type === 'document'\"\n [routerLink]=\"[newDocumentURL, element.key]\">\n Edit\n </button>\n <ng-template [ngIf]=\"element.type === 'document' || element.type === 'custom'\">\n <div class=\"divider\"></div>\n </ng-template>\n </ng-template>\n\n <button mat-button color=\"primary\"\n (click)=\"explore(element)\"> {{exploreText || 'Explore'}}</button>\n\n <ng-template [ngIf]=\"element.type === 'document' || element.type === 'custom'\">\n <div class=\"divider\"></div>\n <button color=\"primary\" mat-icon-button [matMenuTriggerFor]=\"itemMenu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #itemMenu=\"matMenu\">\n <button mat-menu-item (click)=\"delete(element.key)\">Delete</button>\n </mat-menu>\n </ng-template>\n\n\n </div>\n </td>\n </tr>\n <tr *ngIf=\"!filterResults\">\n <td colspan=\"2\"\n class=\"border-t bg-gray-50 whitespace-nowrap border-b border-gray-200 py-1 px-4 text-sm text-gray-900\">\n <div class=\"paging-toolbar flex align-center justify-end\">\n <div class=\"flex items-center justify-center\">\n <div class=\"text-xs text-gray-400 mr-10\">\n Showing {{offset + 1}}\n - {{(page * limit) - (limit - datasources.length)}}</div>\n <select [value]=\"limit\" (change)=\"pageSizeChange($event.target.value)\"\n class=\"p-1.5 mr-8\">\n <option [value]=\"1\">1</option>\n <option [value]=\"5\">5</option>\n <option [value]=\"10\">10</option>\n <option [value]=\"25\">25</option>\n <option [value]=\"50\">50</option>\n <option [value]=\"100\">100</option>\n <option [value]=\"250\">250</option>\n <option [value]=\"1000\">1000</option>\n </select>\n <button mat-icon-button class=\"mr-4\" (click)=\"decreaseOffset()\"\n [disabled]=\"page <= 1\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n <button mat-icon-button (click)=\"increaseOffset()\" [disabled]=\"endOfResults\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n </div>\n\n </div>\n </td>\n </tr>\n </ng-template>\n </tbody>\n </table>\n </div>\n </div>\n </div>\n</div>\n", styles: [".divider{width:1px;height:17px;background-color:#cecece}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i6.MatLegacyButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i8.MatLegacyMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i8.MatLegacyMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i8.MatLegacyMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "directive", type: i9.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i9.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }] });
138
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DatasourceComponent, decorators: [{
139
- type: Component,
140
- args: [{ selector: 'ki-datasource', template: "<div class=\"p-6 bg-white border-b border-gray-200\">\n <div class=\"md:flex md:items-center md:justify-between md:space-x-5\">\n <div class=\"flex items-start flex-1\">\n <div class=\"pt-1.5\">\n <h1 class=\"text-2xl font-bold text-gray-900 capitalize\">{{title || 'Datasources'}}</h1>\n <p class=\"text-sm font-medium text-gray-500\">\n {{description || 'A list of all the datasources currently available.'}}\n </p>\n </div>\n </div>\n <div class=\"mt-6 flex flex-col-reverse justify-stretch\" *ngIf=\"isProjectAdmin && !hideNew && canImportData\">\n <button mat-flat-button color=\"primary\" [matMenuTriggerFor]=\"create\">\n Import Data\n <mat-icon>expand_more</mat-icon>\n </button>\n <mat-menu #create=\"matMenu\">\n <button mat-menu-item [routerLink]=\"[newTabularURL]\">\n New Tabular Datasource\n </button>\n <button mat-menu-item [routerLink]=\"[newDocumentURL]\">\n New Document Datasource\n </button>\n </mat-menu>\n </div>\n </div>\n</div>\n\n<div class=\"px-4 sm:px-6 lg:px-8 mt-0\">\n <div class=\"flex flex-col\">\n <div *ngIf=\"!canImportData\" class=\"mt-8 border-l-4 border-yellow-400 bg-yellow-50 p-4\">\n <div class=\"flex\">\n <div class=\"flex-shrink-0\">\n <svg class=\"h-5 w-5 text-yellow-400\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\"\n d=\"M8.485 2.495c.673-1.167 2.357-1.167 3.03 0l6.28 10.875c.673 1.167-.17 2.625-1.516 2.625H3.72c-1.347 0-2.189-1.458-1.515-2.625L8.485 2.495zM10 5a.75.75 0 01.75.75v3.5a.75.75 0 01-1.5 0v-3.5A.75.75 0 0110 5zm0 9a1 1 0 100-2 1 1 0 000 2z\"\n clip-rule=\"evenodd\"/>\n </svg>\n </div>\n <div class=\"ml-3\">\n <p class=\"text-sm text-yellow-700 mb-0\">\n Imported Data is reserved for our Accredited users. Please <a class=\"font-medium text-yellow-700 underline hover:text-yellow-600\"\n href=\"https://dnsrf.org/joining-options/index.html\">review our Tiers</a> to find out more.\n </p>\n </div>\n </div>\n </div>\n <div *ngIf=\"canImportData\" class=\"-my-2 -mx-4 sm:-mx-6 lg:-mx-8\">\n <div class=\"inline-block min-w-full py-2 align-middle\">\n <div class=\"mt-3 sm:mt-0 flex-1\">\n <label for=\"mobile-search-candidate\" class=\"sr-only\">Search</label>\n <div class=\"flex\">\n <div class=\"relative flex-grow focus-within:z-10\">\n <div class=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n <svg class=\"h-5 w-5 text-gray-400\" xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\"\n d=\"M8 4a4 4 0 100 8 4 4 0 000-8zM2 8a6 6 0 1110.89 3.476l4.817 4.817a1 1 0 01-1.414 1.414l-4.816-4.816A6 6 0 012 8z\"\n clip-rule=\"evenodd\"/>\n </svg>\n </div>\n <input type=\"text\" name=\"mobile-search-candidate\" id=\"mobile-search-candidate\"\n class=\"text-sm block w-full rounded-none pl-10 border-t-0 border-l-0 border-r-0 border-gray-300\"\n placeholder=\"Search {{title || 'datasources'}}\"\n (keyup)=\"searchText.next($event.target.value)\">\n </div>\n </div>\n </div>\n <table class=\"min-w-full border-separate\" style=\"border-spacing: 0\">\n <tbody class=\"bg-white\">\n <ng-template [ngIf]=\"datasources.length\">\n <tr class=\"border-t border-gray-200\">\n <th colspan=\"2\" scope=\"colgroup\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-100 py-3.5 px-4 text-left text-xs font-semibold text-gray-900\">\n <span *ngIf=\"!admin\">Project&nbsp;</span>{{title || 'Datasources'}}\n </th>\n </tr>\n <tr *ngFor=\"let element of datasources; let i = index\" class=\"hover:bg-gray-50\">\n <td class=\"whitespace-nowrap border-gray-200 py-2 px-4 text-sm text-gray-900\"\n [ngClass]=\"{'border-b-0': i === datasources.length - 1, 'border-b': i !== datasources.length - 1}\">\n <div class=\"flex flex-col\">\n <div\n class=\"item-title-select flex items-center font-medium cursor-pointer hover:underline\"\n (click)=\"explore(element)\">\n {{element.title}}\n </div>\n <div (click)=\"element.viewDescription = !element.viewDescription\"\n class=\"text-gray-400 font-thin w-2/3 overflow-ellipsis overflow-hidden whitespace-nowrap cursor-pointer hover:underline\">\n {{element.summary}}\n </div>\n <div *ngIf=\"element.viewDescription && element.description\" class=\"mt-4\"\n [innerHTML]=\"element.description\"></div>\n </div>\n </td>\n <td class=\"relative whitespace-nowrap border-gray-200 py-2 px-4 text-right text-sm font-medium\"\n [ngClass]=\"{'border-b-0': i === datasources.length - 1, 'border-b': i !== datasources.length - 1}\">\n <div class=\"flex items-center justify-end\">\n <ng-template [ngIf]=\"isProjectAdmin\">\n <button mat-button color=\"primary\" *ngIf=\"element.type === 'custom'\"\n [routerLink]=\"[newTabularURL, element.key]\">\n Edit\n </button>\n <button mat-button color=\"primary\" *ngIf=\"element.type === 'document'\"\n [routerLink]=\"[newDocumentURL, element.key]\">\n Edit\n </button>\n <ng-template [ngIf]=\"element.type === 'document' || element.type === 'custom'\">\n <div class=\"divider\"></div>\n </ng-template>\n </ng-template>\n\n <button mat-button color=\"primary\"\n (click)=\"explore(element)\"> {{exploreText || 'Explore'}}</button>\n\n <ng-template [ngIf]=\"element.type === 'document' || element.type === 'custom'\">\n <div class=\"divider\"></div>\n <button color=\"primary\" mat-icon-button [matMenuTriggerFor]=\"itemMenu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #itemMenu=\"matMenu\">\n <button mat-menu-item (click)=\"delete(element.key)\">Delete</button>\n </mat-menu>\n </ng-template>\n\n\n </div>\n </td>\n </tr>\n <tr *ngIf=\"!filterResults\">\n <td colspan=\"2\"\n class=\"border-t bg-gray-50 whitespace-nowrap border-b border-gray-200 py-1 px-4 text-sm text-gray-900\">\n <div class=\"paging-toolbar flex align-center justify-end\">\n <div class=\"flex items-center justify-center\">\n <div class=\"text-xs text-gray-400 mr-10\">\n Showing {{offset + 1}}\n - {{(page * limit) - (limit - datasources.length)}}</div>\n <select [value]=\"limit\" (change)=\"pageSizeChange($event.target.value)\"\n class=\"p-1.5 mr-8\">\n <option [value]=\"1\">1</option>\n <option [value]=\"5\">5</option>\n <option [value]=\"10\">10</option>\n <option [value]=\"25\">25</option>\n <option [value]=\"50\">50</option>\n <option [value]=\"100\">100</option>\n <option [value]=\"250\">250</option>\n <option [value]=\"1000\">1000</option>\n </select>\n <button mat-icon-button class=\"mr-4\" (click)=\"decreaseOffset()\"\n [disabled]=\"page <= 1\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n <button mat-icon-button (click)=\"increaseOffset()\" [disabled]=\"endOfResults\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n </div>\n\n </div>\n </td>\n </tr>\n </ng-template>\n </tbody>\n </table>\n </div>\n </div>\n </div>\n</div>\n", styles: [".divider{width:1px;height:17px;background-color:#cecece}\n"] }]
141
- }], ctorParameters: function () { return [{ type: i1.MatLegacyDialog }, { type: i2.DatasourceService }, { type: i3.ProjectService }, { type: i4.Router }, { type: i4.ActivatedRoute }]; }, propDecorators: { admin: [{
142
- type: Input
143
- }], title: [{
144
- type: Input
145
- }], description: [{
146
- type: Input
147
- }], exploreText: [{
148
- type: Input
149
- }], hideNew: [{
150
- type: Input
151
- }], newDocumentURL: [{
152
- type: Input
153
- }], newTabularURL: [{
154
- type: Input
155
- }], datasourceURL: [{
156
- type: Input
157
- }], noProject: [{
158
- type: Input
159
- }], filterResults: [{
160
- type: Input
161
- }] } });
162
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YXNvdXJjZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1raW5pbnRlbC9zcmMvbGliL2NvbXBvbmVudHMvZGF0YXNvdXJjZS9kYXRhc291cmNlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWtpbmludGVsL3NyYy9saWIvY29tcG9uZW50cy9kYXRhc291cmNlL2RhdGFzb3VyY2UuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBZ0IsS0FBSyxFQUE0QixNQUFNLGVBQWUsQ0FBQztBQUN4RixPQUFPLEVBQUMsZUFBZSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQWUsTUFBTSxNQUFNLENBQUM7QUFDbkUsT0FBTyxFQUFDLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFbEYsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sMENBQTBDLENBQUM7QUFJL0UsT0FBTyxLQUFLLE1BQU0sTUFBTSxRQUFRLENBQUM7Ozs7Ozs7Ozs7O0FBQ2pDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFPekIsTUFBTSxPQUFPLG1CQUFtQjtJQTBCNUIsWUFBb0IsTUFBaUIsRUFDakIsaUJBQW9DLEVBQ3BDLGNBQThCLEVBQzlCLE1BQWMsRUFDZCxLQUFxQjtRQUpyQixXQUFNLEdBQU4sTUFBTSxDQUFXO1FBQ2pCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDcEMsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxVQUFLLEdBQUwsS0FBSyxDQUFnQjtRQXZCaEMsbUJBQWMsR0FBRyxzQkFBc0IsQ0FBQztRQUN4QyxrQkFBYSxHQUFHLGNBQWMsQ0FBQztRQUMvQixr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Y0FBYztzQkFBdEIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIG1lcmdlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAsIHN3aXRjaE1hcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtNYXRMZWdhY3lEaWFsb2cgYXMgTWF0RGlhbG9nfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9sZWdhY3ktZGlhbG9nJztcbmltcG9ydCB7RGF0YUV4cGxvcmVyQ29tcG9uZW50fSBmcm9tICcuLi9kYXRhLWV4cGxvcmVyL2RhdGEtZXhwbG9yZXIuY29tcG9uZW50JztcbmltcG9ydCB7RGF0YXNvdXJjZVNlcnZpY2V9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RhdGFzb3VyY2Uuc2VydmljZSc7XG5pbXBvcnQge1Byb2plY3RTZXJ2aWNlfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9wcm9qZWN0LnNlcnZpY2UnO1xuaW1wb3J0IHtBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0ICogYXMgbG9kYXNoIGZyb20gJ2xvZGFzaCc7XG5jb25zdCBfID0gbG9kYXNoLmRlZmF1bHQ7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAna2ktZGF0YXNvdXJjZScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2RhdGFzb3VyY2UuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2RhdGFzb3VyY2UuY29tcG9uZW50LnNhc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBEYXRhc291cmNlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gICAgQElucHV0KCkgYWRtaW46IGJvb2xlYW47XG4gICAgQElucHV0KCkgdGl0bGU6IHN0cmluZztcbiAgICBASW5wdXQoKSBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGV4cGxvcmVUZXh0OiBzdHJpbmc7XG4gICAgQElucHV0KCkgaGlkZU5ldzogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBuZXdEb2N1bWVudFVSTCA9ICcvZG9jdW1lbnQtZGF0YXNvdXJjZSc7XG4gICAgQElucHV0KCkgbmV3VGFidWxhclVSTCA9ICcvaW1wb3J0LWRhdGEnO1xuICAgIEBJbnB1dCgpIGRhdGFzb3VyY2VVUkwgPSAnL2RhdGFzb3VyY2UnO1xuICAgIEBJbnB1dCgpIG5vUHJvamVjdCA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIGZpbHRlclJlc3VsdHM6IGFueTtcblxuXG4gICAgcHVibGljIGRhdGFzb3VyY2VzOiBhbnkgPSBbXTtcbiAgICBwdWJsaWMgc2VhcmNoVGV4dCA9IG5ldyBCZWhhdmlvclN1YmplY3QoJycpO1xuICAgIHB1YmxpYyBsaW1pdCA9IDEwO1xuICAgIHB1YmxpYyBvZmZzZXQgPSAwO1xuICAgIHB1YmxpYyBwYWdlID0gMTtcbiAgICBwdWJsaWMgZW5kT2ZSZXN1bHRzID0gZmFsc2U7XG4gICAgcHVibGljIHJlbG9hZCA9IG5ldyBTdWJqZWN0KCk7XG4gICAgcHVibGljIGlzUHJvamVjdEFkbWluID0gZmFsc2U7XG4gICAgcHVibGljIGNhbkltcG9ydERhdGEgPSBmYWxzZTtcblxuICAgIHByaXZhdGUgcHJvamVjdFN1YjogU3Vic2NyaXB0aW9uO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBkaWFsb2c6IE1hdERpYWxvZyxcbiAgICAgICAgICAgICAgICBwcml2YXRlIGRhdGFzb3VyY2VTZXJ2aWNlOiBEYXRhc291cmNlU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcml2YXRlIHByb2plY3RTZXJ2aWNlOiBQcm9qZWN0U2VydmljZSxcbiAgICAgICAgICAgICAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlKSB7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2VhcmNoVGV4dC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wYWdlID0gMTtcbiAgICAgICAgICAgIHRoaXMub2Zmc2V0ID0gMDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgcGFnaW5nVmFsdWVzID0gdGhpcy5wcm9qZWN0U2VydmljZS5nZXREYXRhSXRlbVBhZ2luZ1ZhbHVlcygpO1xuICAgICAgICB0aGlzLmxpbWl0ID0gcGFnaW5nVmFsdWVzLmxpbWl0IHx8IDEwO1xuICAgICAgICB0aGlzLm9mZnNldCA9IHBhZ2luZ1ZhbHVlcy5vZmZzZXQgfHwgMDtcbiAgICAgICAgdGhpcy5wYWdlID0gcGFnaW5nVmFsdWVzLnBhZ2UgfHwgMTtcblxuICAgICAgICB0aGlzLmlzUHJvamVjdEFkbWluID0gdGhpcy5wcm9qZWN0U2VydmljZS5pc0FjdGl2ZVByb2plY3RBZG1pbigpO1xuICAgICAgICB0aGlzLmNhbkltcG9ydERhdGEgPSB0aGlzLnByb2plY3RTZXJ2aWNlLmRvZXNBY3RpdmVQcm9qZWN0SGF2ZVByaXZpbGVnZSgnY3VzdG9tZGF0YXNvdXJjZWFjY2VzcycpO1xuXG4gICAgICAgIHRoaXMucHJvamVjdFN1YiA9IHRoaXMucHJvamVjdFNlcnZpY2UuYWN0aXZlUHJvamVjdC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5pc1Byb2plY3RBZG1pbiA9IHRoaXMucHJvamVjdFNlcnZpY2UuaXNBY3RpdmVQcm9qZWN0QWRtaW4oKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMuY2FuSW1wb3J0RGF0YSkge1xuICAgICAgICAgICAgdGhpcy5yb3V0ZS5wYXJhbXMuc3Vic2NyaWJlKGFzeW5jIHBhcmFtID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocGFyYW0ua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFzb3VyY2UgPSBhd2FpdCB0aGlzLmRhdGFzb3VyY2VTZXJ2aWNlLmdldERhdGFzb3VyY2UocGFyYW0ua2V5KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leHBsb3JlKGRhdGFzb3VyY2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBtZXJnZSh0aGlzLnNlYXJjaFRleHQsIHRoaXMucmVsb2FkKVxuICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICBkZWJvdW5jZVRpbWUoMzAwKSxcbiAgICAgICAgICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldERhdGFzb3VyY2VzKClcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICkuc3Vic2NyaWJlKChzb3VyY2VzOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJSZXN1bHRzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YXNvdXJjZXMgPSBfLmZpbHRlcihzb3VyY2VzLCB0aGlzLmZpbHRlclJlc3VsdHMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YXNvdXJjZXMgPSBzb3VyY2VzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMucHJvamVjdFN1Yi51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjcmVhdGVEYXRhc291cmNlKCkge1xuXG4gICAgfVxuXG4gICAgcHVibGljIGV4cGxvcmUoZGF0YXNvdXJjZSkge1xuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdGhpcy5kYXRhc291cmNlVVJMXSwge2ZyYWdtZW50OiBkYXRhc291cmNlLmtleX0pO1xuICAgICAgICBjb25zdCBkYXRhc2V0SW5zdGFuY2VTdW1tYXJ5ID0ge1xuICAgICAgICAgICAgZGF0YXNldEluc3RhbmNlSWQ6IG51bGwsXG4gICAgICAgICAgICBkYXRhc291cmNlSW5zdGFuY2VLZXk6IGRhdGFzb3VyY2Uua2V5LFxuICAgICAgICAgICAgdHJhbnNmb3JtYXRpb25JbnN0YW5jZXM6IFtdLFxuICAgICAgICAgICAgcGFyYW1ldGVyVmFsdWVzOiB7fSxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtdLFxuICAgICAgICAgICAgb3JpZ2luRGF0YUl0ZW1UaXRsZTogZGF0YXNvdXJjZS50aXRsZVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKERhdGFFeHBsb3JlckNvbXBvbmVudCwge1xuICAgICAgICAgICAgd2lkdGg6ICcxMDB2dycsXG4gICAgICAgICAgICBoZWlnaHQ6ICcxMDB2aCcsXG4gICAgICAgICAgICBtYXhXaWR0aDogJzEwMHZ3JyxcbiAgICAgICAgICAgIG1heEhlaWdodDogJzEwMHZoJyxcbiAgICAgICAgICAgIGhhc0JhY2tkcm9wOiBmYWxzZSxcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICBkYXRhc2V0SW5zdGFuY2VTdW1tYXJ5LFxuICAgICAgICAgICAgICAgIHNob3dDaGFydDogZmFsc2UsXG4gICAgICAgICAgICAgICAgYWRtaW46IHRoaXMuYWRtaW4sXG4gICAgICAgICAgICAgICAgYnJlYWRjcnVtYjogdGhpcy50aXRsZSB8fCAnRGF0YXNvdXJjZXMnXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgICAgIGlmIChyZXMgJiYgcmVzLmJyZWFkY3J1bWIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3Jlcy5icmVhZGNydW1iXSwge2ZyYWdtZW50OiBudWxsfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdGhpcy5kYXRhc291cmNlVVJMXSwge2ZyYWdtZW50OiBudWxsfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBkZWxldGUoa2V5KSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSAnQXJlIHlvdSBzdXJlIHlvdSB3b3VsZCBsaWtlIHRvIGRlbGV0ZSB0aGlzIGl0ZW0/JztcbiAgICAgICAgaWYgKHdpbmRvdy5jb25maXJtKG1lc3NhZ2UpKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmRhdGFzb3VyY2VTZXJ2aWNlLmRlbGV0ZURhdGFzb3VyY2Uoa2V5KTtcbiAgICAgICAgICAgIHRoaXMucmVsb2FkLm5leHQoRGF0ZS5ub3coKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgaW5jcmVhc2VPZmZzZXQoKSB7XG4gICAgICAgIHRoaXMucGFnZSA9IHRoaXMucGFnZSArIDE7XG4gICAgICAgIHRoaXMub2Zmc2V0ID0gKHRoaXMubGltaXQgKiB0aGlzLnBhZ2UpIC0gdGhpcy5saW1pdDtcbiAgICAgICAgdGhpcy5yZWxvYWQubmV4dChEYXRlLm5vdygpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVjcmVhc2VPZmZzZXQoKSB7XG4gICAgICAgIHRoaXMucGFnZSA9IHRoaXMucGFnZSA8PSAxID8gMSA6IHRoaXMucGFnZSAtIDE7XG4gICAgICAgIHRoaXMub2Zmc2V0ID0gKHRoaXMubGltaXQgKiB0aGlzLnBhZ2UpIC0gdGhpcy5saW1pdDtcbiAgICAgICAgdGhpcy5yZWxvYWQubmV4dChEYXRlLm5vdygpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcGFnZVNpemVDaGFuZ2UodmFsdWUpIHtcbiAgICAgICAgdGhpcy5wYWdlID0gMTtcbiAgICAgICAgdGhpcy5vZmZzZXQgPSAwO1xuICAgICAgICB0aGlzLmxpbWl0ID0gdmFsdWU7XG4gICAgICAgIHRoaXMucmVsb2FkLm5leHQoRGF0ZS5ub3coKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXREYXRhc291cmNlcygpIHtcbiAgICAgICAgdGhpcy5wcm9qZWN0U2VydmljZS5zZXREYXRhSXRlbVBhZ2luZ1ZhbHVlKHRoaXMubGltaXQsIHRoaXMub2Zmc2V0LCB0aGlzLnBhZ2UpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFzb3VyY2VTZXJ2aWNlLmdldERhdGFzb3VyY2VzKFxuICAgICAgICAgICAgdGhpcy5zZWFyY2hUZXh0LmdldFZhbHVlKCkgfHwgJycsXG4gICAgICAgICAgICB0aGlzLmZpbHRlclJlc3VsdHMgPyAnMTAwMCcgOiB0aGlzLmxpbWl0LnRvU3RyaW5nKCksXG4gICAgICAgICAgICB0aGlzLmZpbHRlclJlc3VsdHMgPyAnMCcgOiB0aGlzLm9mZnNldC50b1N0cmluZygpLFxuICAgICAgICAgICAgdGhpcy5ub1Byb2plY3RcbiAgICAgICAgKS5waXBlKG1hcCgoc291cmNlczogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbmRPZlJlc3VsdHMgPSBzb3VyY2VzLmxlbmd0aCA8IHRoaXMubGltaXQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNvdXJjZXM7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cblxufVxuIiwiPGRpdiBjbGFzcz1cInAtNiBiZy13aGl0ZSBib3JkZXItYiBib3JkZXItZ3JheS0yMDBcIj5cbiAgICA8ZGl2IGNsYXNzPVwibWQ6ZmxleCBtZDppdGVtcy1jZW50ZXIgbWQ6anVzdGlmeS1iZXR3ZWVuIG1kOnNwYWNlLXgtNVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1zdGFydCBmbGV4LTFcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdC0xLjVcIj5cbiAgICAgICAgICAgICAgICA8aDEgY2xhc3M9XCJ0ZXh0LTJ4bCBmb250LWJvbGQgdGV4dC1ncmF5LTkwMCBjYXBpdGFsaXplXCI+e3t0aXRsZSB8fCAnRGF0YXNvdXJjZXMnfX08L2gxPlxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXktNTAwXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7ZGVzY3JpcHRpb24gfHwgJ0EgbGlzdCBvZiBhbGwgdGhlIGRhdGFzb3VyY2VzIGN1cnJlbnRseSBhdmFpbGFibGUuJ319XG4gICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNiBmbGV4IGZsZXgtY29sLXJldmVyc2UganVzdGlmeS1zdHJldGNoXCIgKm5nSWY9XCJpc1Byb2plY3RBZG1pbiAmJiAhaGlkZU5ldyAmJiBjYW5JbXBvcnREYXRhXCI+XG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1mbGF0LWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiBbbWF0TWVudVRyaWdnZXJGb3JdPVwiY3JlYXRlXCI+XG4gICAgICAgICAgICAgICAgSW1wb3J0IERhdGFcbiAgICAgICAgICAgICAgICA8bWF0LWljb24+ZXhwYW5kX21vcmU8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8bWF0LW1lbnUgI2NyZWF0ZT1cIm1hdE1lbnVcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gW3JvdXRlckxpbmtdPVwiW25ld1RhYnVsYXJVUkxdXCI+XG4gICAgICAgICAgICAgICAgICAgIE5ldyBUYWJ1bGFyIERhdGFzb3VyY2VcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gW3JvdXRlckxpbmtdPVwiW25ld0RvY3VtZW50VVJMXVwiPlxuICAgICAgICAgICAgICAgICAgICBOZXcgRG9jdW1lbnQgRGF0YXNvdXJjZVxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9tYXQtbWVudT5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj5cblxuPGRpdiBjbGFzcz1cInB4LTQgc206cHgtNiBsZzpweC04IG10LTBcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbFwiPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiIWNhbkltcG9ydERhdGFcIiBjbGFzcz1cIm10LTggYm9yZGVyLWwtNCBib3JkZXIteWVsbG93LTQwMCBiZy15ZWxsb3ctNTAgcC00XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LXNocmluay0wXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJoLTUgdy01IHRleHQteWVsbG93LTQwMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNOC40ODUgMi40OTVjLjY3My0xLjE2NyAyLjM1Ny0xLjE2NyAzLjAzIDBsNi4yOCAxMC44NzVjLjY3MyAxLjE2Ny0uMTcgMi42MjUtMS41MTYgMi42MjVIMy43MmMtMS4zNDcgMC0yLjE4OS0xLjQ1OC0xLjUxNS0yLjYyNUw4LjQ4NSAyLjQ5NXpNMTAgNWEuNzUuNzUgMCAwMS43NS43NXYzLjVhLjc1Ljc1IDAgMDEtMS41IDB2LTMuNUEuNzUuNzUgMCAwMTEwIDV6bTAgOWExIDEgMCAxMDAtMiAxIDEgMCAwMDAgMnpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcC1ydWxlPVwiZXZlbm9kZFwiLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1sLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LXNtIHRleHQteWVsbG93LTcwMCBtYi0wXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBJbXBvcnRlZCBEYXRhIGlzIHJlc2VydmVkIGZvciBvdXIgQWNjcmVkaXRlZCB1c2Vycy4gUGxlYXNlIDxhIGNsYXNzPVwiZm9udC1tZWRpdW0gdGV4dC15ZWxsb3ctNzAwIHVuZGVybGluZSBob3Zlcjp0ZXh0LXllbGxvdy02MDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgaHJlZj1cImh0dHBzOi8vZG5zcmYub3JnL2pvaW5pbmctb3B0aW9ucy9pbmRleC5odG1sXCI+cmV2aWV3IG91ciBUaWVyczwvYT4gdG8gZmluZCBvdXQgbW9yZS5cbiAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiY2FuSW1wb3J0RGF0YVwiIGNsYXNzPVwiLW15LTIgLW14LTQgc206LW14LTYgbGc6LW14LThcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbmxpbmUtYmxvY2sgbWluLXctZnVsbCBweS0yIGFsaWduLW1pZGRsZVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0zIHNtOm10LTAgZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJtb2JpbGUtc2VhcmNoLWNhbmRpZGF0ZVwiIGNsYXNzPVwic3Itb25seVwiPlNlYXJjaDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUgZmxleC1ncm93IGZvY3VzLXdpdGhpbjp6LTEwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFic29sdXRlIGluc2V0LXktMCBsZWZ0LTAgcGwtMyBmbGV4IGl0ZW1zLWNlbnRlciBwb2ludGVyLWV2ZW50cy1ub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJoLTUgdy01IHRleHQtZ3JheS00MDBcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTggNGE0IDQgMCAxMDAgOCA0IDQgMCAwMDAtOHpNMiA4YTYgNiAwIDExMTAuODkgMy40NzZsNC44MTcgNC44MTdhMSAxIDAgMDEtMS40MTQgMS40MTRsLTQuODE2LTQuODE2QTYgNiAwIDAxMiA4elwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwLXJ1bGU9XCJldmVub2RkXCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBuYW1lPVwibW9iaWxlLXNlYXJjaC1jYW5kaWRhdGVcIiBpZD1cIm1vYmlsZS1zZWFyY2gtY2FuZGlkYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LXNtIGJsb2NrIHctZnVsbCByb3VuZGVkLW5vbmUgcGwtMTAgYm9yZGVyLXQtMCBib3JkZXItbC0wIGJvcmRlci1yLTAgYm9yZGVyLWdyYXktMzAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2gge3t0aXRsZSB8fCAnZGF0YXNvdXJjZXMnfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5dXApPVwic2VhcmNoVGV4dC5uZXh0KCRldmVudC50YXJnZXQudmFsdWUpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwibWluLXctZnVsbCBib3JkZXItc2VwYXJhdGVcIiBzdHlsZT1cImJvcmRlci1zcGFjaW5nOiAwXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0Ym9keSBjbGFzcz1cImJnLXdoaXRlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJkYXRhc291cmNlcy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cImJvcmRlci10IGJvcmRlci1ncmF5LTIwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPVwiMlwiIHNjb3BlPVwiY29sZ3JvdXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInN0aWNreSB0b3AtMCB6LTEwIGJvcmRlci1iIGJvcmRlci1ncmF5LTMwMCBiZy1ncmF5LTEwMCBweS0zLjUgcHgtNCB0ZXh0LWxlZnQgdGV4dC14cyBmb250LXNlbWlib2xkIHRleHQtZ3JheS05MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhYWRtaW5cIj5Qcm9qZWN0Jm5ic3A7PC9zcGFuPnt7dGl0bGUgfHwgJ0RhdGFzb3VyY2VzJ319XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IGVsZW1lbnQgb2YgZGF0YXNvdXJjZXM7IGxldCBpID0gaW5kZXhcIiBjbGFzcz1cImhvdmVyOmJnLWdyYXktNTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ3aGl0ZXNwYWNlLW5vd3JhcCBib3JkZXItZ3JheS0yMDAgcHktMiBweC00IHRleHQtc20gIHRleHQtZ3JheS05MDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2JvcmRlci1iLTAnOiBpID09PSBkYXRhc291cmNlcy5sZW5ndGggLSAxLCAnYm9yZGVyLWInOiBpICE9PSBkYXRhc291cmNlcy5sZW5ndGggLSAxfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaXRlbS10aXRsZS1zZWxlY3QgZmxleCBpdGVtcy1jZW50ZXIgZm9udC1tZWRpdW0gY3Vyc29yLXBvaW50ZXIgaG92ZXI6dW5kZXJsaW5lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZXhwbG9yZShlbGVtZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ZWxlbWVudC50aXRsZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKGNsaWNrKT1cImVsZW1lbnQudmlld0Rlc2NyaXB0aW9uID0gIWVsZW1lbnQudmlld0Rlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWdyYXktNDAwIGZvbnQtdGhpbiB3LTIvMyBvdmVyZmxvdy1lbGxpcHNpcyBvdmVyZmxvdy1oaWRkZW4gd2hpdGVzcGFjZS1ub3dyYXAgY3Vyc29yLXBvaW50ZXIgaG92ZXI6dW5kZXJsaW5lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tlbGVtZW50LnN1bW1hcnl9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZWxlbWVudC52aWV3RGVzY3JpcHRpb24gJiYgZWxlbWVudC5kZXNjcmlwdGlvblwiIGNsYXNzPVwibXQtNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwiZWxlbWVudC5kZXNjcmlwdGlvblwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInJlbGF0aXZlIHdoaXRlc3BhY2Utbm93cmFwIGJvcmRlci1ncmF5LTIwMCBweS0yIHB4LTQgdGV4dC1yaWdodCB0ZXh0LXNtIGZvbnQtbWVkaXVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydib3JkZXItYi0wJzogaSA9PT0gZGF0YXNvdXJjZXMubGVuZ3RoIC0gMSwgJ2JvcmRlci1iJzogaSAhPT0gZGF0YXNvdXJjZXMubGVuZ3RoIC0gMX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktZW5kXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiaXNQcm9qZWN0QWRtaW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgKm5nSWY9XCJlbGVtZW50LnR5cGUgPT09ICdjdXN0b20nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cIltuZXdUYWJ1bGFyVVJMLCBlbGVtZW50LmtleV1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWRpdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAqbmdJZj1cImVsZW1lbnQudHlwZSA9PT0gJ2RvY3VtZW50J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm91dGVyTGlua109XCJbbmV3RG9jdW1lbnRVUkwsIGVsZW1lbnQua2V5XVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFZGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cImVsZW1lbnQudHlwZSA9PT0gJ2RvY3VtZW50JyB8fCBlbGVtZW50LnR5cGUgPT09ICdjdXN0b20nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXZpZGVyXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZXhwbG9yZShlbGVtZW50KVwiPiB7e2V4cGxvcmVUZXh0IHx8ICdFeHBsb3JlJ319PC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJlbGVtZW50LnR5cGUgPT09ICdkb2N1bWVudCcgfHwgZWxlbWVudC50eXBlID09PSAnY3VzdG9tJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXZpZGVyXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiBtYXQtaWNvbi1idXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT1cIml0ZW1NZW51XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5tb3JlX3ZlcnQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbWVudSAjaXRlbU1lbnU9XCJtYXRNZW51XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiZGVsZXRlKGVsZW1lbnQua2V5KVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW1lbnU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dHIgKm5nSWY9XCIhZmlsdGVyUmVzdWx0c1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYm9yZGVyLXQgYmctZ3JheS01MCB3aGl0ZXNwYWNlLW5vd3JhcCBib3JkZXItYiBib3JkZXItZ3JheS0yMDAgcHktMSBweC00IHRleHQtc20gdGV4dC1ncmF5LTkwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFnaW5nLXRvb2xiYXIgZmxleCBhbGlnbi1jZW50ZXIganVzdGlmeS1lbmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXhzIHRleHQtZ3JheS00MDAgbXItMTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hvd2luZyB7e29mZnNldCArIDF9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHt7KHBhZ2UgKiBsaW1pdCkgLSAobGltaXQgLSBkYXRhc291cmNlcy5sZW5ndGgpfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IFt2YWx1ZV09XCJsaW1pdFwiIChjaGFuZ2UpPVwicGFnZVNpemVDaGFuZ2UoJGV2ZW50LnRhcmdldC52YWx1ZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLTEuNSBtci04XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cIjFcIj4xPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cIjVcIj41PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cIjEwXCI+MTA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwiMjVcIj4yNTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCI1MFwiPjUwPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cIjEwMFwiPjEwMDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCIyNTBcIj4yNTA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwiMTAwMFwiPjEwMDA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBjbGFzcz1cIm1yLTRcIiAoY2xpY2spPVwiZGVjcmVhc2VPZmZzZXQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwicGFnZSA8PSAxXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5jaGV2cm9uX2xlZnQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJpbmNyZWFzZU9mZnNldCgpXCIgW2Rpc2FibGVkXT1cImVuZE9mUmVzdWx0c1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+Y2hldnJvbl9yaWdodDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG4iXX0=