ngx-edu-sharing-ui 10.0.20 → 10.0.22

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 (131) hide show
  1. package/assets/scss/material-theme.scss +3 -3
  2. package/assets/scss/mixins.scss +1 -1
  3. package/assets/scss/variables-root.scss +2 -0
  4. package/assets/scss/variables-scss.scss +3 -4
  5. package/assets/scss/variables.scss +1 -1
  6. package/fesm2022/ngx-edu-sharing-ui.mjs +376 -319
  7. package/fesm2022/ngx-edu-sharing-ui.mjs.map +1 -1
  8. package/lib/index.d.ts +1 -0
  9. package/lib/list-items/list-widget.d.ts +1 -1
  10. package/lib/mds-viewer/mds-editor-instance-service.abstract.d.ts +14 -0
  11. package/lib/mds-viewer/widget/mds-widget.component.d.ts +6 -4
  12. package/package.json +8 -9
  13. package/esm2022/lib/actionbar/actionbar.component.mjs +0 -206
  14. package/esm2022/lib/common/edu-sharing-ui-common.module.mjs +0 -170
  15. package/esm2022/lib/directives/border-box-observer.directive.mjs +0 -71
  16. package/esm2022/lib/directives/check-text-overflow.directive.mjs +0 -71
  17. package/esm2022/lib/directives/drag-nodes/drag-nodes.mjs +0 -14
  18. package/esm2022/lib/directives/drag-nodes/nodes-drag-source.directive.mjs +0 -79
  19. package/esm2022/lib/directives/drag-nodes/nodes-drag.directive.mjs +0 -49
  20. package/esm2022/lib/directives/drag-nodes/nodes-drop-target.directive.mjs +0 -105
  21. package/esm2022/lib/directives/focus-state.directive.mjs +0 -44
  22. package/esm2022/lib/directives/icon.directive.mjs +0 -184
  23. package/esm2022/lib/directives/infinite-scroll.directive.mjs +0 -85
  24. package/esm2022/lib/dropdown/dropdown.component.mjs +0 -83
  25. package/esm2022/lib/edu-sharing-ui-configuration.mjs +0 -48
  26. package/esm2022/lib/edu-sharing-ui.module.mjs +0 -82
  27. package/esm2022/lib/index.mjs +0 -96
  28. package/esm2022/lib/list-items/available-widgets.mjs +0 -27
  29. package/esm2022/lib/list-items/format-duration.pipe.mjs +0 -20
  30. package/esm2022/lib/list-items/list-base/list-base.component.mjs +0 -46
  31. package/esm2022/lib/list-items/list-collection-info/list-collection-info.component.mjs +0 -29
  32. package/esm2022/lib/list-items/list-counts/list-counts.component.mjs +0 -56
  33. package/esm2022/lib/list-items/list-items.module.mjs +0 -50
  34. package/esm2022/lib/list-items/list-node-license/list-node-license.component.mjs +0 -41
  35. package/esm2022/lib/list-items/list-node-replication-source/list-node-replication-source.component.mjs +0 -47
  36. package/esm2022/lib/list-items/list-node-workflow/list-node-workflow.component.mjs +0 -24
  37. package/esm2022/lib/list-items/list-text/list-text.component.mjs +0 -106
  38. package/esm2022/lib/list-items/list-widget.mjs +0 -49
  39. package/esm2022/lib/list-items/node-row/node-row.component.mjs +0 -24
  40. package/esm2022/lib/list-items/node-source.pipe.mjs +0 -49
  41. package/esm2022/lib/mds/mds-helper.service.mjs +0 -167
  42. package/esm2022/lib/mds/mds.module.mjs +0 -16
  43. package/esm2022/lib/mds-viewer/mds-viewer.component.mjs +0 -170
  44. package/esm2022/lib/mds-viewer/mds-viewer.service.mjs +0 -18
  45. package/esm2022/lib/mds-viewer/replace-element-with-div.mjs +0 -47
  46. package/esm2022/lib/mds-viewer/view-instance.service.mjs +0 -27
  47. package/esm2022/lib/mds-viewer/widget/mds-widget.component.mjs +0 -379
  48. package/esm2022/lib/node-entries/combined-data-source.mjs +0 -41
  49. package/esm2022/lib/node-entries/custom-templates-data-source.mjs +0 -7
  50. package/esm2022/lib/node-entries/drag-preview/drag-preview.component.mjs +0 -21
  51. package/esm2022/lib/node-entries/entries-model.mjs +0 -24
  52. package/esm2022/lib/node-entries/items-cap.mjs +0 -47
  53. package/esm2022/lib/node-entries/list-item-label.pipe.mjs +0 -37
  54. package/esm2022/lib/node-entries/node-cache.mjs +0 -73
  55. package/esm2022/lib/node-entries/node-data-source-remote.mjs +0 -4
  56. package/esm2022/lib/node-entries/node-data-source.mjs +0 -117
  57. package/esm2022/lib/node-entries/node-entries-card/node-entries-card.component.mjs +0 -117
  58. package/esm2022/lib/node-entries/node-entries-card-grid/node-entries-card-grid.component.mjs +0 -329
  59. package/esm2022/lib/node-entries/node-entries-card-small/node-entries-card-small.component.mjs +0 -44
  60. package/esm2022/lib/node-entries/node-entries-global-options/node-entries-global-options.component.mjs +0 -27
  61. package/esm2022/lib/node-entries/node-entries-global.service.mjs +0 -71
  62. package/esm2022/lib/node-entries/node-entries-table/column-chooser/column-chooser.component.mjs +0 -42
  63. package/esm2022/lib/node-entries/node-entries-table/node-entries-table.component.mjs +0 -294
  64. package/esm2022/lib/node-entries/node-entries-templates.service.mjs +0 -11
  65. package/esm2022/lib/node-entries/node-entries-wrapper.component.mjs +0 -369
  66. package/esm2022/lib/node-entries/node-entries.component.mjs +0 -132
  67. package/esm2022/lib/node-entries/node-entries.module.mjs +0 -161
  68. package/esm2022/lib/node-entries/node-rating/node-rating.component.mjs +0 -125
  69. package/esm2022/lib/node-entries/node-stats-badges/node-stats-badges.component.mjs +0 -48
  70. package/esm2022/lib/node-entries/node-type-badge/node-type-badge.component.mjs +0 -36
  71. package/esm2022/lib/node-entries/option-button/option-button.component.mjs +0 -75
  72. package/esm2022/lib/node-entries/preview-image/preview-image.component.mjs +0 -53
  73. package/esm2022/lib/node-entries/sort-select-panel/sort-select-panel.component.mjs +0 -41
  74. package/esm2022/lib/node-url/node-url.component.mjs +0 -132
  75. package/esm2022/lib/pipes/file-size.pipe.mjs +0 -32
  76. package/esm2022/lib/pipes/format-date.pipe.mjs +0 -38
  77. package/esm2022/lib/pipes/mds-duration.pipe.mjs +0 -25
  78. package/esm2022/lib/pipes/node-icon.pipe.mjs +0 -18
  79. package/esm2022/lib/pipes/node-image-size.pipe.mjs +0 -24
  80. package/esm2022/lib/pipes/node-image.pipe.mjs +0 -55
  81. package/esm2022/lib/pipes/node-license.pipe.mjs +0 -24
  82. package/esm2022/lib/pipes/node-person-name.pipe.mjs +0 -50
  83. package/esm2022/lib/pipes/node-title.pipe.mjs +0 -35
  84. package/esm2022/lib/pipes/option-tooltip.pipe.mjs +0 -33
  85. package/esm2022/lib/pipes/property-slug.pipe.mjs +0 -16
  86. package/esm2022/lib/pipes/replace-chars.pipe.mjs +0 -29
  87. package/esm2022/lib/pipes/vcard-name.pipe.mjs +0 -25
  88. package/esm2022/lib/services/abstract/app.service.mjs +0 -3
  89. package/esm2022/lib/services/abstract/keyboard-shortcuts.service.mjs +0 -10
  90. package/esm2022/lib/services/abstract/options-helper.service.mjs +0 -3
  91. package/esm2022/lib/services/abstract/toast.service.mjs +0 -3
  92. package/esm2022/lib/services/accessibility.service.mjs +0 -73
  93. package/esm2022/lib/services/app-container.service.mjs +0 -69
  94. package/esm2022/lib/services/local-events.service.mjs +0 -43
  95. package/esm2022/lib/services/node-entries.service.mjs +0 -201
  96. package/esm2022/lib/services/node-helper.service.mjs +0 -330
  97. package/esm2022/lib/services/nodes-drag-drop.service.mjs +0 -155
  98. package/esm2022/lib/services/options-helper-data.service.mjs +0 -142
  99. package/esm2022/lib/services/render-helper.service.mjs +0 -114
  100. package/esm2022/lib/services/repo-url.service.mjs +0 -50
  101. package/esm2022/lib/services/search-helper.service.mjs +0 -52
  102. package/esm2022/lib/services/temporary-storage.service.mjs +0 -48
  103. package/esm2022/lib/services/ui.service.mjs +0 -327
  104. package/esm2022/lib/sort-dropdown/sort-dropdown.component.mjs +0 -50
  105. package/esm2022/lib/spinner/spinner.component.mjs +0 -19
  106. package/esm2022/lib/spinner-small/spinner-small.component.mjs +0 -18
  107. package/esm2022/lib/translations/fallback-translation-handler.mjs +0 -6
  108. package/esm2022/lib/translations/translation-loader.mjs +0 -219
  109. package/esm2022/lib/translations/translation-source.mjs +0 -11
  110. package/esm2022/lib/translations/translations.module.mjs +0 -82
  111. package/esm2022/lib/translations/translations.service.mjs +0 -238
  112. package/esm2022/lib/types/accessibillity.mjs +0 -19
  113. package/esm2022/lib/types/api-models.mjs +0 -2
  114. package/esm2022/lib/types/drag-drop.mjs +0 -2
  115. package/esm2022/lib/types/injection-tokens.mjs +0 -31
  116. package/esm2022/lib/types/keyboard-shortcuts.mjs +0 -11
  117. package/esm2022/lib/types/list-item.mjs +0 -41
  118. package/esm2022/lib/types/option-item.mjs +0 -192
  119. package/esm2022/lib/types/workflow.mjs +0 -25
  120. package/esm2022/lib/util/DateHelper.mjs +0 -200
  121. package/esm2022/lib/util/VCard.mjs +0 -278
  122. package/esm2022/lib/util/color-helper.mjs +0 -124
  123. package/esm2022/lib/util/duration-helper.mjs +0 -102
  124. package/esm2022/lib/util/functions.mjs +0 -13
  125. package/esm2022/lib/util/helper.mjs +0 -64
  126. package/esm2022/lib/util/isNumeric.mjs +0 -11
  127. package/esm2022/lib/util/rest-helper.mjs +0 -42
  128. package/esm2022/lib/util/ui-animation.mjs +0 -146
  129. package/esm2022/lib/util/ui-constants.mjs +0 -21
  130. package/esm2022/ngx-edu-sharing-ui.mjs +0 -5
  131. package/esm2022/public-api.mjs +0 -2
@@ -1,201 +0,0 @@
1
- import { SelectionModel } from '@angular/cdk/collections';
2
- import { Injectable, signal } from '@angular/core';
3
- import { BehaviorSubject } from 'rxjs';
4
- import { NodeDataSourceRemote } from '../node-entries/node-data-source-remote';
5
- import { delay, map } from 'rxjs/operators';
6
- import * as i0 from "@angular/core";
7
- import * as i1 from "./ui.service";
8
- import * as i2 from "./abstract/toast.service";
9
- import * as i3 from "../node-entries/node-entries-global.service";
10
- /**
11
- Custom selection model which adds the click source of the selection.
12
- USED IN EXTENSIONS!
13
- */
14
- export class CustomSelectionModel extends SelectionModel {
15
- constructor() {
16
- super(...arguments);
17
- /**
18
- * used in extensions
19
- */
20
- this.changedClickSource = this.changed.pipe(delay(0), map((c) => {
21
- return { ...c, clickSource: this._clickSource };
22
- }));
23
- }
24
- deselect(...values) {
25
- this._clickSource = null;
26
- super.deselect(...values);
27
- }
28
- toggle(value) {
29
- this._clickSource = null;
30
- super.toggle(value);
31
- }
32
- clear() {
33
- this._clickSource = null;
34
- super.clear();
35
- }
36
- select(...values) {
37
- this._clickSource = null;
38
- super.select(...values);
39
- }
40
- /**
41
- * used in extensions
42
- * @param value
43
- */
44
- set clickSource(value) {
45
- this._clickSource = value;
46
- }
47
- }
48
- export class NodeEntriesService {
49
- get dataSource() {
50
- return this.dataSource$.value;
51
- }
52
- set dataSource(value) {
53
- this.dataSource$.next(value);
54
- }
55
- get paginationStrategy() {
56
- return this.entriesGlobal.getPaginationStrategy(this.scope);
57
- }
58
- get columns() {
59
- return this.columnsSubject.value?.columns;
60
- }
61
- set columns(columns) {
62
- this.columnsSubject.next({ columns, fromUser: true });
63
- }
64
- get options() {
65
- return this.options$.value;
66
- }
67
- set options(options) {
68
- this.options$.next(options);
69
- }
70
- set globalOptions(globalOptions) {
71
- this.globalOptionsSubject.next(globalOptions);
72
- }
73
- get sort() {
74
- return this.sortSubject.value;
75
- }
76
- set sort(value) {
77
- this.sortSubject.next(value);
78
- }
79
- get gridConfig() {
80
- return this.gridConfig$.value;
81
- }
82
- set gridConfig(value) {
83
- this.gridConfig$.next(value);
84
- }
85
- constructor(uiService, toast, entriesGlobal) {
86
- this.uiService = uiService;
87
- this.toast = toast;
88
- this.entriesGlobal = entriesGlobal;
89
- this.dataSource$ = new BehaviorSubject(null);
90
- /**
91
- * Subject that reflects the current columns configuration.
92
- *
93
- * Updated when loading configuration and through user interaction.
94
- */
95
- this.columnsSubject = new BehaviorSubject(null);
96
- this.selection = new CustomSelectionModel(true, []);
97
- this.options$ = new BehaviorSubject(null);
98
- this.globalOptionsSubject = new BehaviorSubject([]);
99
- this.sortSubject = new BehaviorSubject(void 0);
100
- this.gridConfig$ = new BehaviorSubject(null);
101
- this.scrollGradientColor = signal('fff');
102
- }
103
- onClicked({ event, ...data }) {
104
- if (event.ctrlKey || event.metaKey) {
105
- this.selection.toggle(data.element);
106
- }
107
- else if (event.shiftKey) {
108
- this.expandSelectionTo(data.element);
109
- }
110
- else {
111
- this.clickItem.emit(data);
112
- }
113
- }
114
- onCheckboxChanged(node, checked) {
115
- if (this.uiService.shiftKeyPressed) {
116
- this.expandSelectionTo(node);
117
- }
118
- if (checked !== this.selection.isSelected(node)) {
119
- this.selection.toggle(node);
120
- }
121
- }
122
- toggleSelectAll() {
123
- if (this.isAllSelected()) {
124
- this.selection.clear();
125
- }
126
- else {
127
- this.selectAll();
128
- }
129
- }
130
- loadMore(source) {
131
- if (this.paginationStrategy !== 'infinite-scroll') {
132
- return false;
133
- }
134
- if (source === 'scroll' && this.disableInfiniteScroll) {
135
- return false;
136
- }
137
- // TODO: focus next item when triggered via button.
138
- if (this.dataSource instanceof NodeDataSourceRemote) {
139
- return this.dataSource.loadMore();
140
- }
141
- else {
142
- if (this.dataSource.hasMore()) {
143
- this.fetchData.emit({
144
- offset: this.dataSource.getData().length,
145
- reset: false,
146
- });
147
- return true;
148
- }
149
- else {
150
- return false;
151
- }
152
- }
153
- }
154
- selectAll() {
155
- this.selection.select(...this.dataSource.getData());
156
- }
157
- isAllSelected() {
158
- return this.dataSource.getData().every((node) => this.selection.isSelected(node));
159
- }
160
- expandSelectionTo(node) {
161
- const nodeIndex = this.dataSource.getData().indexOf(node);
162
- const selectionIndexes = this.selection.selected
163
- .map((node) => this.dataSource.getData().indexOf(node))
164
- .filter((index) => index >= 0);
165
- if (Math.min(...selectionIndexes) < nodeIndex) {
166
- for (let i = Math.min(...selectionIndexes) + 1; i <= nodeIndex; i++) {
167
- this.selection.select(this.dataSource.getData()[i]);
168
- }
169
- }
170
- else if (Math.max(...selectionIndexes) > nodeIndex) {
171
- for (let i = nodeIndex; i < Math.max(...selectionIndexes); i++) {
172
- this.selection.select(this.dataSource.getData()[i]);
173
- }
174
- }
175
- }
176
- openDropdown(dropdown, node, onDone = null) {
177
- if (!this.selection.selected.includes(node)) {
178
- this.selection.clear();
179
- this.selection.select(node);
180
- }
181
- // Wait for the menu to reflect changed options.
182
- setTimeout(() => {
183
- dropdown.callbackObjects = this.selection.selected;
184
- dropdown.ngOnChanges();
185
- if (dropdown.canShowDropdown()) {
186
- if (onDone) {
187
- onDone();
188
- }
189
- }
190
- else {
191
- this.toast.toast('NO_AVAILABLE_OPTIONS');
192
- }
193
- });
194
- }
195
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: NodeEntriesService, deps: [{ token: i1.UIService }, { token: i2.Toast }, { token: i3.NodeEntriesGlobalService }], target: i0.ɵɵFactoryTarget.Injectable }); }
196
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: NodeEntriesService }); }
197
- }
198
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: NodeEntriesService, decorators: [{
199
- type: Injectable
200
- }], ctorParameters: () => [{ type: i1.UIService }, { type: i2.Toast }, { type: i3.NodeEntriesGlobalService }] });
201
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1lbnRyaWVzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lZHUtc2hhcmluZy11aS9zcmMvbGliL3NlcnZpY2VzL25vZGUtZW50cmllcy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQWdCLFVBQVUsRUFBRSxNQUFNLEVBQWtCLE1BQU0sZUFBZSxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUF3QnZDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQy9FLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7O0FBSTVDOzs7R0FHRztBQUNILE1BQU0sT0FBTyxvQkFBd0IsU0FBUSxjQUFpQjtJQUE5RDs7UUFFSTs7V0FFRztRQUNNLHVCQUFrQixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUMzQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQ1IsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDTixPQUFPLEVBQUUsR0FBRyxDQUFDLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwRCxDQUFDLENBQUMsQ0FDTCxDQUFDO0lBNEJOLENBQUM7SUEzQkcsUUFBUSxDQUFDLEdBQUcsTUFBVztRQUNuQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUN6QixLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFRO1FBQ1gsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDekIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FB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QyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDMUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxDQUFDO1FBQ0QsZ0RBQWdEO1FBQ2hELFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDWixRQUFRLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBNkIsQ0FBQztZQUN4RSxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDdkIsSUFBSSxRQUFRLENBQUMsZUFBZSxFQUFFLEVBQUUsQ0FBQztnQkFDN0IsSUFBSSxNQUFNLEVBQUUsQ0FBQztvQkFDVCxNQUFNLEVBQUUsQ0FBQztnQkFDYixDQUFDO1lBQ0wsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUM7WUFDN0MsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzsrR0F2S1Esa0JBQWtCO21IQUFsQixrQkFBa0I7OzRGQUFsQixrQkFBa0I7a0JBRDlCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTZWxlY3Rpb25Nb2RlbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2xsZWN0aW9ucyc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIsIEluamVjdGFibGUsIHNpZ25hbCwgV3JpdGFibGVTaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTm9kZSB9IGZyb20gJ25neC1lZHUtc2hhcmluZy1hcGknO1xuaW1wb3J0IHtcbiAgICBDbGlja1NvdXJjZSxcbiAgICBGZXRjaEV2ZW50LFxuICAgIEdyaWRDb25maWcsXG4gICAgSW50ZXJhY3Rpb25UeXBlLFxuICAgIExpc3REcmFnR3JvcENvbmZpZyxcbiAgICBMaXN0RXZlbnRJbnRlcmZhY2UsXG4gICAgTGlzdE9wdGlvbnMsXG4gICAgTGlzdFNvcnRDb25maWcsXG4gICAgTm9kZUNsaWNrRXZlbnQsXG4gICAgTm9kZUVudHJpZXNEYXRhVHlwZSxcbiAgICBOb2RlRW50cmllc0Rpc3BsYXlUeXBlLFxufSBmcm9tICcuLi9ub2RlLWVudHJpZXMvZW50cmllcy1tb2RlbCc7XG5pbXBvcnQgeyBOb2RlRGF0YVNvdXJjZSB9IGZyb20gJy4uL25vZGUtZW50cmllcy9ub2RlLWRhdGEtc291cmNlJztcbmltcG9ydCB7XG4gICAgTm9kZUVudHJpZXNHbG9iYWxTZXJ2aWNlLFxuICAgIFBhZ2luYXRpb25TdHJhdGVneSxcbn0gZnJvbSAnLi4vbm9kZS1lbnRyaWVzL25vZGUtZW50cmllcy1nbG9iYWwuc2VydmljZSc7XG5cbmltcG9ydCB7IE9wdGlvbkl0ZW0sIFNjb3BlIH0gZnJvbSAnLi4vdHlwZXMvb3B0aW9uLWl0ZW0nO1xuaW1wb3J0IHsgTGlzdEl0ZW0gfSBmcm9tICcuLi90eXBlcy9saXN0LWl0ZW0nO1xuaW1wb3J0IHsgVUlTZXJ2aWNlIH0gZnJvbSAnLi91aS5zZXJ2aWNlJztcbmltcG9ydCB7IE5vZGVEYXRhU291cmNlUmVtb3RlIH0gZnJvbSAnLi4vbm9kZS1lbnRyaWVzL25vZGUtZGF0YS1zb3VyY2UtcmVtb3RlJztcbmltcG9ydCB7IGRlbGF5LCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBEcm9wZG93bkNvbXBvbmVudCB9IGZyb20gJy4uL2Ryb3Bkb3duL2Ryb3Bkb3duLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUb2FzdCB9IGZyb20gJy4vYWJzdHJhY3QvdG9hc3Quc2VydmljZSc7XG5cbi8qKlxuIEN1c3RvbSBzZWxlY3Rpb24gbW9kZWwgd2hpY2ggYWRkcyB0aGUgY2xpY2sgc291cmNlIG9mIHRoZSBzZWxlY3Rpb24uXG4gVVNFRCBJTiBFWFRFTlNJT05TIVxuICovXG5leHBvcnQgY2xhc3MgQ3VzdG9tU2VsZWN0aW9uTW9kZWw8VD4gZXh0ZW5kcyBTZWxlY3Rpb25Nb2RlbDxUPiB7XG4gICAgcHJpdmF0ZSBfY2xpY2tTb3VyY2U6IENsaWNrU291cmNlO1xuICAgIC8qKlxuICAgICAqIHVzZWQgaW4gZXh0ZW5zaW9uc1xuICAgICAqL1xuICAgIHJlYWRvbmx5IGNoYW5nZWRDbGlja1NvdXJjZSA9IHRoaXMuY2hhbmdlZC5waXBlKFxuICAgICAgICBkZWxheSgwKSxcbiAgICAgICAgbWFwKChjKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4geyAuLi5jLCBjbGlja1NvdXJjZTogdGhpcy5fY2xpY2tTb3VyY2UgfTtcbiAgICAgICAgfSksXG4gICAgKTtcbiAgICBkZXNlbGVjdCguLi52YWx1ZXM6IFRbXSkge1xuICAgICAgICB0aGlzLl9jbGlja1NvdXJjZSA9IG51bGw7XG4gICAgICAgIHN1cGVyLmRlc2VsZWN0KC4uLnZhbHVlcyk7XG4gICAgfVxuXG4gICAgdG9nZ2xlKHZhbHVlOiBUKSB7XG4gICAgICAgIHRoaXMuX2NsaWNrU291cmNlID0gbnVsbDtcbiAgICAgICAgc3VwZXIudG9nZ2xlKHZhbHVlKTtcbiAgICB9XG5cbiAgICBjbGVhcigpIHtcbiAgICAgICAgdGhpcy5fY2xpY2tTb3VyY2UgPSBudWxsO1xuICAgICAgICBzdXBlci5jbGVhcigpO1xuICAgIH1cblxuICAgIHNlbGVjdCguLi52YWx1ZXM6IFRbXSkge1xuICAgICAgICB0aGlzLl9jbGlja1NvdXJjZSA9IG51bGw7XG4gICAgICAgIHN1cGVyLnNlbGVjdCguLi52YWx1ZXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHVzZWQgaW4gZXh0ZW5zaW9uc1xuICAgICAqIEBwYXJhbSB2YWx1ZVxuICAgICAqL1xuICAgIHNldCBjbGlja1NvdXJjZSh2YWx1ZTogQ2xpY2tTb3VyY2UpIHtcbiAgICAgICAgdGhpcy5fY2xpY2tTb3VyY2UgPSB2YWx1ZTtcbiAgICB9XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBOb2RlRW50cmllc1NlcnZpY2U8VCBleHRlbmRzIE5vZGVFbnRyaWVzRGF0YVR5cGU+IHtcbiAgICBsaXN0OiBMaXN0RXZlbnRJbnRlcmZhY2U8VD47XG4gICAgcmVhZG9ubHkgZGF0YVNvdXJjZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE5vZGVEYXRhU291cmNlPFQ+IHwgbnVsbD4obnVsbCk7XG4gICAgLyoqXG4gICAgICogc2NvcGUgdGhlIGN1cnJlbnQgbGlzdCBpcyBpbiwgZS5nLiB3b3Jrc3BhY2VcbiAgICAgKiBUaGlzIGlzIHVzZWQgZm9yIGFkZGl0aW9uYWwgY29uZmlnIGluamVjdGlvbiBiYXNlZCBvbiB0aGUgc2NvcGVcbiAgICAgKi9cbiAgICBzY29wZTogU2NvcGU7XG4gICAgZ2V0IGRhdGFTb3VyY2UoKTogTm9kZURhdGFTb3VyY2U8VD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhU291cmNlJC52YWx1ZTtcbiAgICB9XG4gICAgc2V0IGRhdGFTb3VyY2UodmFsdWU6IE5vZGVEYXRhU291cmNlPFQ+KSB7XG4gICAgICAgIHRoaXMuZGF0YVNvdXJjZSQubmV4dCh2YWx1ZSk7XG4gICAgfVxuICAgIGdldCBwYWdpbmF0aW9uU3RyYXRlZ3koKTogUGFnaW5hdGlvblN0cmF0ZWd5IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW50cmllc0dsb2JhbC5nZXRQYWdpbmF0aW9uU3RyYXRlZ3kodGhpcy5zY29wZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN1YmplY3QgdGhhdCByZWZsZWN0cyB0aGUgY3VycmVudCBjb2x1bW5zIGNvbmZpZ3VyYXRpb24uXG4gICAgICpcbiAgICAgKiBVcGRhdGVkIHdoZW4gbG9hZGluZyBjb25maWd1cmF0aW9uIGFuZCB0aHJvdWdoIHVzZXIgaW50ZXJhY3Rpb24uXG4gICAgICovXG4gICAgY29sdW1uc1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHsgY29sdW1uczogTGlzdEl0ZW1bXTsgZnJvbVVzZXI6IGJvb2xlYW4gfT4obnVsbCk7XG4gICAgZ2V0IGNvbHVtbnMoKTogTGlzdEl0ZW1bXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbHVtbnNTdWJqZWN0LnZhbHVlPy5jb2x1bW5zO1xuICAgIH1cbiAgICBzZXQgY29sdW1ucyhjb2x1bW5zOiBMaXN0SXRlbVtdKSB7XG4gICAgICAgIHRoaXMuY29sdW1uc1N1YmplY3QubmV4dCh7IGNvbHVtbnMsIGZyb21Vc2VyOiB0cnVlIH0pO1xuICAgIH1cbiAgICBjb25maWd1cmVDb2x1bW5zOiBib29sZWFuO1xuICAgIGRpc3BsYXlUeXBlOiBOb2RlRW50cmllc0Rpc3BsYXlUeXBlO1xuICAgIHNlbGVjdGlvbiA9IG5ldyBDdXN0b21TZWxlY3Rpb25Nb2RlbDxUPih0cnVlLCBbXSk7XG4gICAgZWxlbWVudEludGVyYWN0aW9uVHlwZTogSW50ZXJhY3Rpb25UeXBlO1xuICAgIG9wdGlvbnMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxMaXN0T3B0aW9ucz4obnVsbCk7XG4gICAgZ2V0IG9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMkLnZhbHVlO1xuICAgIH1cbiAgICBzZXQgb3B0aW9ucyhvcHRpb25zOiBMaXN0T3B0aW9ucykge1xuICAgICAgICB0aGlzLm9wdGlvbnMkLm5leHQob3B0aW9ucyk7XG4gICAgfVxuICAgIGNoZWNrYm94OiBib29sZWFuO1xuICAgIGdsb2JhbE9wdGlvbnNTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxPcHRpb25JdGVtW10+KFtdKTtcbiAgICBzZXQgZ2xvYmFsT3B0aW9ucyhnbG9iYWxPcHRpb25zOiBPcHRpb25JdGVtW10pIHtcbiAgICAgICAgdGhpcy5nbG9iYWxPcHRpb25zU3ViamVjdC5uZXh0KGdsb2JhbE9wdGlvbnMpO1xuICAgIH1cbiAgICBzb3J0U3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TGlzdFNvcnRDb25maWc+KHZvaWQgMCk7XG4gICAgZ2V0IHNvcnQoKTogTGlzdFNvcnRDb25maWcge1xuICAgICAgICByZXR1cm4gdGhpcy5zb3J0U3ViamVjdC52YWx1ZTtcbiAgICB9XG4gICAgc2V0IHNvcnQodmFsdWU6IExpc3RTb3J0Q29uZmlnKSB7XG4gICAgICAgIHRoaXMuc29ydFN1YmplY3QubmV4dCh2YWx1ZSk7XG4gICAgfVxuICAgIHNvcnRDaGFuZ2U6IEV2ZW50RW1pdHRlcjxMaXN0U29ydENvbmZpZz47XG4gICAgZHJhZ0Ryb3A6IExpc3REcmFnR3JvcENvbmZpZzxUPjtcbiAgICBjbGlja0l0ZW06IEV2ZW50RW1pdHRlcjxOb2RlQ2xpY2tFdmVudDxUPj47XG4gICAgZGJsQ2xpY2tJdGVtOiBFdmVudEVtaXR0ZXI8Tm9kZUNsaWNrRXZlbnQ8VD4+O1xuICAgIGZldGNoRGF0YTogRXZlbnRFbWl0dGVyPEZldGNoRXZlbnQ+O1xuICAgIHJlYWRvbmx5IGdyaWRDb25maWckID0gbmV3IEJlaGF2aW9yU3ViamVjdDxHcmlkQ29uZmlnIHwgbnVsbD4obnVsbCk7XG4gICAgZ2V0IGdyaWRDb25maWcoKTogR3JpZENvbmZpZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyaWRDb25maWckLnZhbHVlO1xuICAgIH1cbiAgICBzZXQgZ3JpZENvbmZpZyh2YWx1ZTogR3JpZENvbmZpZykge1xuICAgICAgICB0aGlzLmdyaWRDb25maWckLm5leHQodmFsdWUpO1xuICAgIH1cbiAgICBwcmltYXJ5SW5zdGFuY2U6IGJvb2xlYW47XG4gICAgc2luZ2xlQ2xpY2tIaW50OiAnZHluYW1pYycgfCAnc3RhdGljJztcbiAgICBkaXNhYmxlSW5maW5pdGVTY3JvbGw6IGJvb2xlYW47XG4gICAgc2Nyb2xsR3JhZGllbnRDb2xvcjogV3JpdGFibGVTaWduYWw8c3RyaW5nPiA9IHNpZ25hbCgnZmZmJyk7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSB1aVNlcnZpY2U6IFVJU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSB0b2FzdDogVG9hc3QsXG4gICAgICAgIHByaXZhdGUgZW50cmllc0dsb2JhbDogTm9kZUVudHJpZXNHbG9iYWxTZXJ2aWNlLFxuICAgICkge31cblxuICAgIG9uQ2xpY2tlZCh7IGV2ZW50LCAuLi5kYXRhIH06IE5vZGVDbGlja0V2ZW50PFQ+ICYgeyBldmVudDogTW91c2VFdmVudCB9KSB7XG4gICAgICAgIGlmIChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnRvZ2dsZShkYXRhLmVsZW1lbnQpO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICAgICAgICB0aGlzLmV4cGFuZFNlbGVjdGlvblRvKGRhdGEuZWxlbWVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNsaWNrSXRlbS5lbWl0KGRhdGEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25DaGVja2JveENoYW5nZWQobm9kZTogVCwgY2hlY2tlZDogYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy51aVNlcnZpY2Uuc2hpZnRLZXlQcmVzc2VkKSB7XG4gICAgICAgICAgICB0aGlzLmV4cGFuZFNlbGVjdGlvblRvKG5vZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoZWNrZWQgIT09IHRoaXMuc2VsZWN0aW9uLmlzU2VsZWN0ZWQobm9kZSkpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnRvZ2dsZShub2RlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRvZ2dsZVNlbGVjdEFsbCgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNBbGxTZWxlY3RlZCgpKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5jbGVhcigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RBbGwoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxvYWRNb3JlKHNvdXJjZTogJ2J1dHRvbicgfCAnc2Nyb2xsJyk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5wYWdpbmF0aW9uU3RyYXRlZ3kgIT09ICdpbmZpbml0ZS1zY3JvbGwnKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNvdXJjZSA9PT0gJ3Njcm9sbCcgJiYgdGhpcy5kaXNhYmxlSW5maW5pdGVTY3JvbGwpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPOiBmb2N1cyBuZXh0IGl0ZW0gd2hlbiB0cmlnZ2VyZWQgdmlhIGJ1dHRvbi5cbiAgICAgICAgaWYgKHRoaXMuZGF0YVNvdXJjZSBpbnN0YW5jZW9mIE5vZGVEYXRhU291cmNlUmVtb3RlKSB7XG4gICAgICAgICAgICByZXR1cm4gKHRoaXMuZGF0YVNvdXJjZSBhcyBOb2RlRGF0YVNvdXJjZVJlbW90ZSkubG9hZE1vcmUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFTb3VyY2UuaGFzTW9yZSgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mZXRjaERhdGEuZW1pdCh7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldDogdGhpcy5kYXRhU291cmNlLmdldERhdGEoKS5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgIHJlc2V0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZWxlY3RBbGwoKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdCguLi50aGlzLmRhdGFTb3VyY2UuZ2V0RGF0YSgpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzQWxsU2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFTb3VyY2UuZ2V0RGF0YSgpLmV2ZXJ5KChub2RlKSA9PiB0aGlzLnNlbGVjdGlvbi5pc1NlbGVjdGVkKG5vZGUpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGV4cGFuZFNlbGVjdGlvblRvKG5vZGU6IFQpIHtcbiAgICAgICAgY29uc3Qgbm9kZUluZGV4ID0gdGhpcy5kYXRhU291cmNlLmdldERhdGEoKS5pbmRleE9mKG5vZGUpO1xuICAgICAgICBjb25zdCBzZWxlY3Rpb25JbmRleGVzID0gdGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWRcbiAgICAgICAgICAgIC5tYXAoKG5vZGUpID0+IHRoaXMuZGF0YVNvdXJjZS5nZXREYXRhKCkuaW5kZXhPZihub2RlKSlcbiAgICAgICAgICAgIC5maWx0ZXIoKGluZGV4KSA9PiBpbmRleCA+PSAwKTtcbiAgICAgICAgaWYgKE1hdGgubWluKC4uLnNlbGVjdGlvbkluZGV4ZXMpIDwgbm9kZUluZGV4KSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gTWF0aC5taW4oLi4uc2VsZWN0aW9uSW5kZXhlcykgKyAxOyBpIDw9IG5vZGVJbmRleDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uc2VsZWN0KHRoaXMuZGF0YVNvdXJjZS5nZXREYXRhKClbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKE1hdGgubWF4KC4uLnNlbGVjdGlvbkluZGV4ZXMpID4gbm9kZUluZGV4KSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gbm9kZUluZGV4OyBpIDwgTWF0aC5tYXgoLi4uc2VsZWN0aW9uSW5kZXhlcyk7IGkrKykge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdCh0aGlzLmRhdGFTb3VyY2UuZ2V0RGF0YSgpW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9wZW5Ecm9wZG93bihkcm9wZG93bjogRHJvcGRvd25Db21wb25lbnQsIG5vZGU6IFQsIG9uRG9uZTogKCkgPT4gdm9pZCA9IG51bGwpIHtcbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZC5pbmNsdWRlcyhub2RlKSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uY2xlYXIoKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdChub2RlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXYWl0IGZvciB0aGUgbWVudSB0byByZWZsZWN0IGNoYW5nZWQgb3B0aW9ucy5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBkcm9wZG93bi5jYWxsYmFja09iamVjdHMgPSB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZCBhcyB1bmtub3duIGFzIE5vZGVbXTtcbiAgICAgICAgICAgIGRyb3Bkb3duLm5nT25DaGFuZ2VzKCk7XG4gICAgICAgICAgICBpZiAoZHJvcGRvd24uY2FuU2hvd0Ryb3Bkb3duKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAob25Eb25lKSB7XG4gICAgICAgICAgICAgICAgICAgIG9uRG9uZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2FzdC50b2FzdCgnTk9fQVZBSUxBQkxFX09QVElPTlMnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuIl19
@@ -1,330 +0,0 @@
1
- import { Inject, Injectable, Optional } from '@angular/core';
2
- import { RestConstants, } from 'ngx-edu-sharing-api';
3
- import * as Workflow from '../types/workflow';
4
- import { UIConstants } from '../util/ui-constants';
5
- import { ASSETS_BASE_PATH } from '../types/injection-tokens';
6
- import { of } from 'rxjs';
7
- import { NodesRightMode } from '../types/option-item';
8
- import * as i0 from "@angular/core";
9
- import * as i1 from "@ngx-translate/core";
10
- import * as i2 from "ngx-edu-sharing-api";
11
- import * as i3 from "./repo-url.service";
12
- export class NodeHelperService {
13
- constructor(translate, apiHelpersService, networkService, configService, repoUrlService, assetsBasePath) {
14
- this.translate = translate;
15
- this.apiHelpersService = apiHelpersService;
16
- this.networkService = networkService;
17
- this.configService = configService;
18
- this.repoUrlService = repoUrlService;
19
- this.assetsBasePath = assetsBasePath;
20
- this.LICENSE_URLS = {
21
- CC_BY_ABOUT: 'https://creativecommons.org/licenses/list.{{language}}',
22
- CC_BY: 'https://creativecommons.org/licenses/by/{{version}}/{{locale}}deed.{{language}}',
23
- CC_BY_ND: 'https://creativecommons.org/licenses/by-nd/{{version}}/{{locale}}deed.{{language}}',
24
- CC_BY_SA: 'https://creativecommons.org/licenses/by-sa/{{version}}/{{locale}}deed.{{language}}',
25
- CC_BY_NC: 'https://creativecommons.org/licenses/by-nc/{{version}}/{{locale}}deed.{{language}}',
26
- CC_BY_NC_ND: 'https://creativecommons.org/licenses/by-nc-nd/{{version}}/{{locale}}deed.{{language}}',
27
- CC_BY_NC_SA: 'https://creativecommons.org/licenses/by-nc-sa/{{version}}/{{locale}}deed.{{language}}',
28
- CC_0: 'https://creativecommons.org/publicdomain/zero/1.0/legalcode.{{language}}',
29
- PDM: 'https://creativecommons.org/public-domain/pdm/',
30
- };
31
- }
32
- getCollectionScopeInfo(node) {
33
- const scope = node.collection ? node.collection.scope : null;
34
- let icon = 'help';
35
- let scopeName = 'UNKNOWN';
36
- if (scope === RestConstants.COLLECTIONSCOPE_MY) {
37
- icon = 'lock';
38
- scopeName = 'MY';
39
- }
40
- if (scope === RestConstants.COLLECTIONSCOPE_ORGA ||
41
- scope === RestConstants.COLLECTIONSCOPE_CUSTOM) {
42
- icon = 'group';
43
- scopeName = 'SHARED';
44
- }
45
- if (scope === RestConstants.COLLECTIONSCOPE_ALL ||
46
- scope === RestConstants.COLLECTIONSCOPE_CUSTOM_PUBLIC) {
47
- icon = 'language';
48
- scopeName = 'PUBLIC';
49
- }
50
- if (node.collection?.type === RestConstants.COLLECTIONTYPE_EDITORIAL) {
51
- icon = 'star';
52
- scopeName = 'TYPE_EDITORIAL';
53
- }
54
- if (node.collection?.type === RestConstants.COLLECTIONTYPE_MEDIA_CENTER) {
55
- icon = 'business';
56
- scopeName = 'TYPE_MEDIA_CENTER';
57
- }
58
- return { icon, scopeName };
59
- }
60
- /**
61
- * Return the license icon of a node
62
- */
63
- async getLicenseIcon(node) {
64
- // prefer manual mapping instead of backend data to support custom states from local edits
65
- const license = node.properties?.[RestConstants.CCM_PROP_LICENSE]?.[0];
66
- if (license) {
67
- return this.getLicenseIconByString(license);
68
- }
69
- return node.license ? this.repoUrlService.getRepoUrl(node.license.icon, node) : null;
70
- }
71
- /**
72
- * Get a license icon by using the property value string
73
- */
74
- getLicenseIconByString(string, useNoneAsFallback = true) {
75
- let icon = string.replace(/_/g, '-').toLowerCase();
76
- if (icon == '')
77
- icon = 'none';
78
- const LICENSE_ICONS = [
79
- 'cc-0',
80
- 'cc-by-nc',
81
- 'cc-by-nc-nd',
82
- 'cc-by-nc-sa',
83
- 'cc-by-nd',
84
- 'cc-by-sa',
85
- 'cc-by',
86
- 'copyright-free',
87
- 'copyright-license',
88
- 'custom',
89
- 'edu-nc-nd-noDo',
90
- 'edu-nc-nd',
91
- 'edu-p-nr-nd-noDo',
92
- 'edu-p-nr-nd',
93
- 'none',
94
- 'pdm',
95
- 'schulfunk',
96
- 'unterrichts-und-lehrmedien',
97
- ];
98
- if (LICENSE_ICONS.indexOf(icon) == -1 && !useNoneAsFallback)
99
- return null; // icon='none';
100
- if (icon == 'none' && !useNoneAsFallback)
101
- return null;
102
- const result = this.apiHelpersService.getServerUrl() + '/../ccimages/licenses/' + icon + '.svg';
103
- return result;
104
- }
105
- /**
106
- * Return a translated name of a license name for a node
107
- * @param node
108
- * @param translate
109
- * @returns {string|any|string|any|string|any|string|any|string|any|string}
110
- */
111
- getLicenseName(node) {
112
- let prop = node.properties[RestConstants.CCM_PROP_LICENSE]?.[0];
113
- if (!prop)
114
- prop = '';
115
- return this.getLicenseNameByString(prop);
116
- }
117
- /**
118
- * Return a translated name for a license string
119
- * @param string
120
- * @param translate
121
- * @returns {any}
122
- */
123
- getLicenseNameByString(name) {
124
- if (name == '') {
125
- name = 'NONE';
126
- }
127
- return this.translate.instant('LICENSE.NAMES.' + name);
128
- // return name.replace(/_/g,"-");
129
- }
130
- /**
131
- * return the License URL (e.g. for CC_BY licenses) for a license string and version
132
- * @param licenseProperty
133
- * @param licenseVersion
134
- * @param licenseLocale
135
- */
136
- getLicenseUrlByString(licenseProperty, licenseVersion, licenseLocale) {
137
- const isV4 = licenseVersion === '4.0';
138
- const locale = isV4 || !licenseLocale ? '' : licenseLocale.toLowerCase() + '/';
139
- const url = this.LICENSE_URLS[licenseProperty];
140
- if (!url) {
141
- return of(null);
142
- }
143
- return of(url
144
- .replace('{{version}}', licenseVersion)
145
- .replace('{{locale}}', locale)
146
- .replace('{{language}}', this.translate.currentLang || 'en'));
147
- }
148
- getWorkflowStatusById(id) {
149
- const workflows = this.getWorkflows();
150
- return workflows.filter((w) => w.id === id)?.[0];
151
- }
152
- getWorkflowStatus(node, useFromConfig = false) {
153
- let value = node.properties[RestConstants.CCM_PROP_WF_STATUS]?.[0];
154
- if (!value) {
155
- return this.getDefaultWorkflowStatus(useFromConfig);
156
- }
157
- return {
158
- current: this.getWorkflowStatusById(value),
159
- initial: this.getWorkflowStatusById(value),
160
- };
161
- }
162
- getDefaultWorkflowStatus(useFromConfig = false) {
163
- const result = {
164
- current: null,
165
- initial: null,
166
- };
167
- result.initial = this.getWorkflows()[0];
168
- let defaultStatus = null;
169
- if (useFromConfig) {
170
- defaultStatus = this.configService.instant('workflow.defaultStatus');
171
- }
172
- if (defaultStatus) {
173
- result.current = this.getWorkflows().find((w) => w.id === defaultStatus);
174
- }
175
- else {
176
- result.current = result.initial;
177
- }
178
- return result;
179
- }
180
- getWorkflows() {
181
- return this.configService.instant('workflow.workflows', [
182
- Workflow.WORKFLOW_STATUS_UNCHECKED,
183
- Workflow.WORKFLOW_STATUS_TO_CHECK,
184
- Workflow.WORKFLOW_STATUS_HASFLAWS,
185
- Workflow.WORKFLOW_STATUS_CHECKED,
186
- ]);
187
- }
188
- copyDataToNode(target, source) {
189
- target.properties = source.properties;
190
- target.name = source.name;
191
- target.title = source.title;
192
- target.iconURL = source.iconURL;
193
- target.preview = source.preview;
194
- target.authorityName = source.authorityName;
195
- target.profile = source.profile;
196
- target.status = source.status;
197
- }
198
- isNodeCollection(node) {
199
- return node.aspects?.includes(RestConstants.CCM_ASPECT_COLLECTION) || !!node.collection;
200
- }
201
- getSourceIconPath(src) {
202
- return (this.assetsBasePath ?? '') + 'assets/images/sources/' + src.toLowerCase() + '.png';
203
- }
204
- getNodeLink(mode, node) {
205
- if (!node?.ref) {
206
- return null;
207
- }
208
- let data = null;
209
- if (this.isNodeCollection(node)) {
210
- const scope = node.collection?.scope;
211
- const type = node.collection?.type;
212
- const queryParams = {
213
- id: node.ref.id,
214
- };
215
- if (type === RestConstants.COLLECTIONTYPE_EDITORIAL) {
216
- queryParams.scope = RestConstants.COLLECTIONSCOPE_TYPE_EDITORIAL;
217
- }
218
- else if (type === RestConstants.COLLECTIONTYPE_MEDIA_CENTER) {
219
- queryParams.scope = RestConstants.COLLECTIONSCOPE_TYPE_MEDIA_CENTER;
220
- }
221
- else if (scope === RestConstants.COLLECTIONSCOPE_CUSTOM_PUBLIC) {
222
- queryParams.scope = RestConstants.COLLECTIONSCOPE_ALL;
223
- }
224
- data = {
225
- routerLink: UIConstants.ROUTER_PREFIX + 'collections',
226
- queryParams,
227
- };
228
- }
229
- else {
230
- if (node.isDirectory) {
231
- let path;
232
- if (node.properties?.[RestConstants.CCM_PROP_EDUSCOPENAME]?.[0] ===
233
- RestConstants.SAFE_SCOPE) {
234
- path = UIConstants.ROUTER_PREFIX + 'workspace/safe';
235
- }
236
- else {
237
- path = UIConstants.ROUTER_PREFIX + 'workspace';
238
- }
239
- data = {
240
- routerLink: path,
241
- queryParams: { id: node.ref.id },
242
- };
243
- }
244
- else if (node.ref) {
245
- const fromHome = this.networkService.isFromHomeRepository(node);
246
- data = {
247
- routerLink: UIConstants.ROUTER_PREFIX + 'render/' + node.ref.id,
248
- queryParams: {
249
- repository: fromHome ? null : node.ref.repo,
250
- proposal: node.proposal?.ref.id,
251
- proposalCollection: node.proposalCollection?.ref.id,
252
- },
253
- };
254
- }
255
- }
256
- if (data === null) {
257
- return '';
258
- }
259
- if (mode === 'routerLink') {
260
- return '/' + data.routerLink;
261
- }
262
- // enforce clearing of parameters which should only be consumed once
263
- data.queryParams.redirectFromSSO = null;
264
- return data.queryParams;
265
- }
266
- /**
267
- * Returns true if this node is a copy of another node, just used as a publish target.
268
- */
269
- isNodePublishedCopy(o) {
270
- return !!o.properties?.[RestConstants.CCM_PROP_PUBLISHED_ORIGINAL]?.[0];
271
- }
272
- /**
273
- * returns true if this is a revoked node
274
- * (published copy that has been revoked)
275
- */
276
- isNodeRevoked(node) {
277
- return node?.aspects?.includes(RestConstants.CCM_ASPECT_REVOKED);
278
- }
279
- /**
280
- * returns true if all nodes have the requested right
281
- * mode (only works for collection refs):
282
- * Local: check only rights of the node itself
283
- * Effective: check only rights of the original node this refers to (collection ref). If it is not a collection ref, fallback to local
284
- */
285
- getNodesRight(nodes, right, mode = NodesRightMode.Local) {
286
- if (nodes == null)
287
- return true;
288
- for (const node of nodes) {
289
- let currentMode = mode;
290
- // if no access effective present and not a collection ref. use the local data
291
- if (!node.aspects?.includes(RestConstants.CCM_ASPECT_IO_REFERENCE) &&
292
- !node.accessEffective?.length) {
293
- currentMode = NodesRightMode.Local;
294
- }
295
- if (currentMode === NodesRightMode.Effective) {
296
- if (!node.aspects?.includes(RestConstants.CCM_ASPECT_IO_REFERENCE)) {
297
- if (node.accessEffective && node.accessEffective.indexOf(right) !== -1) {
298
- continue;
299
- }
300
- }
301
- if (node.accessEffective && node.accessEffective.indexOf(right) !== -1) {
302
- continue;
303
- }
304
- if (RestConstants.IMPLICIT_COLLECTION_PERMISSIONS.indexOf(right) === -1) {
305
- // permission not matched on original -> implicit permissions from collection may apply
306
- return false;
307
- }
308
- }
309
- // check regular node rights
310
- if (!node.access || node.access.indexOf(right) === -1) {
311
- return false;
312
- }
313
- }
314
- return true;
315
- }
316
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: NodeHelperService, deps: [{ token: i1.TranslateService }, { token: i2.ApiHelpersService }, { token: i2.NetworkService }, { token: i2.ConfigService }, { token: i3.RepoUrlService }, { token: ASSETS_BASE_PATH, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
317
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: NodeHelperService, providedIn: 'root' }); }
318
- }
319
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: NodeHelperService, decorators: [{
320
- type: Injectable,
321
- args: [{
322
- providedIn: 'root',
323
- }]
324
- }], ctorParameters: () => [{ type: i1.TranslateService }, { type: i2.ApiHelpersService }, { type: i2.NetworkService }, { type: i2.ConfigService }, { type: i3.RepoUrlService }, { type: undefined, decorators: [{
325
- type: Optional
326
- }, {
327
- type: Inject,
328
- args: [ASSETS_BASE_PATH]
329
- }] }] });
330
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1oZWxwZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VkdS1zaGFyaW5nLXVpL3NyYy9saWIvc2VydmljZXMvbm9kZS1oZWxwZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQU1ILGFBQWEsR0FFaEIsTUFBTSxxQkFBcUIsQ0FBQztBQUU3QixPQUFPLEtBQUssUUFBUSxNQUFNLG1CQUFtQixDQUFDO0FBRzlDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzFCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7Ozs7QUFLdEQsTUFBTSxPQUFPLGlCQUFpQjtJQWlCMUIsWUFDYyxTQUEyQixFQUMzQixpQkFBb0MsRUFDcEMsY0FBOEIsRUFDOUIsYUFBNEIsRUFDNUIsY0FBOEIsRUFDTSxjQUFzQjtRQUwxRCxjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQUMzQixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDTSxtQkFBYyxHQUFkLGNBQWMsQ0FBUTtRQXRCL0QsaUJBQVksR0FBRztZQUNwQixXQUFXLEVBQUUsd0RBQXdEO1lBQ3JFLEtBQUssRUFBRSxpRkFBaUY7WUFDeEYsUUFBUSxFQUNKLG9GQUFvRjtZQUN4RixRQUFRLEVBQ0osb0ZBQW9GO1lBQ3hGLFFBQVEsRUFDSixvRkFBb0Y7WUFD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LENBQUMsRUFBRSxDQUFDO2dCQUNwRCxPQUFPLEtBQUssQ0FBQztZQUNqQixDQUFDO1FBQ0wsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7K0dBalVRLGlCQUFpQiw0S0F1QkYsZ0JBQWdCO21IQXZCL0IsaUJBQWlCLGNBRmQsTUFBTTs7NEZBRVQsaUJBQWlCO2tCQUg3QixVQUFVO21CQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQjs7MEJBd0JRLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBBcGlIZWxwZXJzU2VydmljZSxcbiAgICBDb25maWdTZXJ2aWNlLFxuICAgIE5ldHdvcmtTZXJ2aWNlLFxuICAgIE5vZGUsXG4gICAgUHJvcG9zYWxOb2RlLFxuICAgIFJlc3RDb25zdGFudHMsXG4gICAgVXNlcixcbn0gZnJvbSAnbmd4LWVkdS1zaGFyaW5nLWFwaSc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgKiBhcyBXb3JrZmxvdyBmcm9tICcuLi90eXBlcy93b3JrZmxvdyc7XG5pbXBvcnQgeyBSZXBvVXJsU2VydmljZSB9IGZyb20gJy4vcmVwby11cmwuc2VydmljZSc7XG5pbXBvcnQgeyBQYXJhbXMgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgVUlDb25zdGFudHMgfSBmcm9tICcuLi91dGlsL3VpLWNvbnN0YW50cyc7XG5pbXBvcnQgeyBBU1NFVFNfQkFTRV9QQVRIIH0gZnJvbSAnLi4vdHlwZXMvaW5qZWN0aW9uLXRva2Vucyc7XG5pbXBvcnQgeyBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTm9kZXNSaWdodE1vZGUgfSBmcm9tICcuLi90eXBlcy9vcHRpb24taXRlbSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIE5vZGVIZWxwZXJTZXJ2aWNlIHtcbiAgICByZWFkb25seSBMSUNFTlNFX1VSTFMgPSB7XG4gICAgICAgIENDX0JZX0FCT1VUOiAnaHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2xpc3Que3tsYW5ndWFnZX19JyxcbiAgICAgICAgQ0NfQlk6ICdodHRwczovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkve3t2ZXJzaW9ufX0ve3tsb2NhbGV9fWRlZWQue3tsYW5ndWFnZX19JyxcbiAgICAgICAgQ0NfQllfTkQ6XG4gICAgICAgICAgICAnaHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LW5kL3t7dmVyc2lvbn19L3t7bG9jYWxlfX1kZWVkLnt7bGFuZ3VhZ2V9fScsXG4gICAgICAgIENDX0JZX1NBOlxuICAgICAgICAgICAgJ2h0dHBzOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1zYS97e3ZlcnNpb259fS97e2xvY2FsZX19ZGVlZC57e2xhbmd1YWdlfX0nLFxuICAgICAgICBDQ19CWV9OQzpcbiAgICAgICAgICAgICdodHRwczovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktbmMve3t2ZXJzaW9ufX0ve3tsb2NhbGV9fWRlZWQue3tsYW5ndWFnZX19JyxcbiAgICAgICAgQ0NfQllfTkNfTkQ6XG4gICAgICAgICAgICAnaHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LW5jLW5kL3t7dmVyc2lvbn19L3t7bG9jYWxlfX1kZWVkLnt7bGFuZ3VhZ2V9fScsXG4gICAgICAgIENDX0JZX05DX1NBOlxuICAgICAgICAgICAgJ2h0dHBzOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1uYy1zYS97e3ZlcnNpb259fS97e2xvY2FsZX19ZGVlZC57e2xhbmd1YWdlfX0nLFxuICAgICAgICBDQ18wOiAnaHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL3B1YmxpY2RvbWFpbi96ZXJvLzEuMC9sZWdhbGNvZGUue3tsYW5ndWFnZX19JyxcbiAgICAgICAgUERNOiAnaHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL3B1YmxpYy1kb21haW4vcGRtLycsXG4gICAgfSBhcyB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcm90ZWN0ZWQgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgYXBpSGVscGVyc1NlcnZpY2U6IEFwaUhlbHBlcnNTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgbmV0d29ya1NlcnZpY2U6IE5ldHdvcmtTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIHJlcG9VcmxTZXJ2aWNlOiBSZXBvVXJsU2VydmljZSxcbiAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChBU1NFVFNfQkFTRV9QQVRIKSBwcml2YXRlIGFzc2V0c0Jhc2VQYXRoOiBzdHJpbmcsXG4gICAgKSB7fVxuXG4gICAgcHVibGljIGdldENvbGxlY3Rpb25TY29wZUluZm8obm9kZTogTm9kZSk6IHsgaWNvbjogc3RyaW5nOyBzY29wZU5hbWU6IHN0cmluZyB9IHtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSBub2RlLmNvbGxlY3Rpb24gPyBub2RlLmNvbGxlY3Rpb24uc2NvcGUgOiBudWxsO1xuICAgICAgICBsZXQgaWNvbiA9ICdoZWxwJztcbiAgICAgICAgbGV0IHNjb3BlTmFtZSA9ICdVTktOT1dOJztcbiAgICAgICAgaWYgKHNjb3BlID09PSBSZXN0Q29uc3RhbnRzLkNPTExFQ1RJT05TQ09QRV9NWSkge1xuICAgICAgICAgICAgaWNvbiA9ICdsb2NrJztcbiAgICAgICAgICAgIHNjb3BlTmFtZSA9ICdNWSc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgc2NvcGUgPT09IFJlc3RDb25zdGFudHMuQ09MTEVDVElPTlNDT1BFX09SR0EgfHxcbiAgICAgICAgICAgIHNjb3BlID09PSBSZXN0Q29uc3RhbnRzLkNPTExFQ1RJT05TQ09QRV9DVVNUT01cbiAgICAgICAgKSB7XG4gICAgICAgICAgICBpY29uID0gJ2dyb3VwJztcbiAgICAgICAgICAgIHNjb3BlTmFtZSA9ICdTSEFSRUQnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHNjb3BlID09PSBSZXN0Q29uc3RhbnRzLkNPTExFQ1RJT05TQ09QRV9BTEwgfHxcbiAgICAgICAgICAgIHNjb3BlID09PSBSZXN0Q29uc3RhbnRzLkNPTExFQ1RJT05TQ09QRV9DVVNUT01fUFVCTElDXG4gICAgICAgICkge1xuICAgICAgICAgICAgaWNvbiA9ICdsYW5ndWFnZSc7XG4gICAgICAgICAgICBzY29wZU5hbWUgPSAnUFVCTElDJztcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5jb2xsZWN0aW9uPy50eXBlID09PSBSZXN0Q29uc3RhbnRzLkNPTExFQ1RJT05UWVBFX0VESVRPUklBTCkge1xuICAgICAgICAgICAgaWNvbiA9ICdzdGFyJztcbiAgICAgICAgICAgIHNjb3BlTmFtZSA9ICdUWVBFX0VESVRPUklBTCc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuY29sbGVjdGlvbj8udHlwZSA9PT0gUmVzdENvbnN0YW50cy5DT0xMRUNUSU9OVFlQRV9NRURJQV9DRU5URVIpIHtcbiAgICAgICAgICAgIGljb24gPSAnYnVzaW5lc3MnO1xuICAgICAgICAgICAgc2NvcGVOYW1lID0gJ1RZUEVfTUVESUFfQ0VOVEVSJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBpY29uLCBzY29wZU5hbWUgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBsaWNlbnNlIGljb24gb2YgYSBub2RlXG4gICAgICovXG4gICAgYXN5bmMgZ2V0TGljZW5zZUljb24obm9kZTogTm9kZSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIC8vIHByZWZlciBtYW51YWwgbWFwcGluZyBpbnN0ZWFkIG9mIGJhY2tlbmQgZGF0YSB0byBzdXBwb3J0IGN1c3RvbSBzdGF0ZXMgZnJvbSBsb2NhbCBlZGl0c1xuICAgICAgICBjb25zdCBsaWNlbnNlID0gbm9kZS5wcm9wZXJ0aWVzPy5bUmVzdENvbnN0YW50cy5DQ01fUFJPUF9MSUNFTlNFXT8uWzBdO1xuICAgICAgICBpZiAobGljZW5zZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TGljZW5zZUljb25CeVN0cmluZyhsaWNlbnNlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZS5saWNlbnNlID8gdGhpcy5yZXBvVXJsU2VydmljZS5nZXRSZXBvVXJsKG5vZGUubGljZW5zZS5pY29uLCBub2RlKSA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGEgbGljZW5zZSBpY29uIGJ5IHVzaW5nIHRoZSBwcm9wZXJ0eSB2YWx1ZSBzdHJpbmdcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0TGljZW5zZUljb25CeVN0cmluZyhzdHJpbmc6IFN0cmluZywgdXNlTm9uZUFzRmFsbGJhY2sgPSB0cnVlKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IGljb24gPSBzdHJpbmcucmVwbGFjZSgvXy9nLCAnLScpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChpY29uID09ICcnKSBpY29uID0gJ25vbmUnO1xuXG4gICAgICAgIGNvbnN0IExJQ0VOU0VfSUNPTlMgPSBbXG4gICAgICAgICAgICAnY2MtMCcsXG4gICAgICAgICAgICAnY2MtYnktbmMnLFxuICAgICAgICAgICAgJ2NjLWJ5LW5jLW5kJyxcbiAgICAgICAgICAgICdjYy1ieS1uYy1zYScsXG4gICAgICAgICAgICAnY2MtYnktbmQnLFxuICAgICAgICAgICAgJ2NjLWJ5LXNhJyxcbiAgICAgICAgICAgICdjYy1ieScsXG4gICAgICAgICAgICAnY29weXJpZ2h0LWZyZWUnLFxuICAgICAgICAgICAgJ2NvcHlyaWdodC1saWNlbnNlJyxcbiAgICAgICAgICAgICdjdXN0b20nLFxuICAgICAgICAgICAgJ2VkdS1uYy1uZC1ub0RvJyxcbiAgICAgICAgICAgICdlZHUtbmMtbmQnLFxuICAgICAgICAgICAgJ2VkdS1wLW5yLW5kLW5vRG8nLFxuICAgICAgICAgICAgJ2VkdS1wLW5yLW5kJyxcbiAgICAgICAgICAgICdub25lJyxcbiAgICAgICAgICAgICdwZG0nLFxuICAgICAgICAgICAgJ3NjaHVsZnVuaycsXG4gICAgICAgICAgICAndW50ZXJyaWNodHMtdW5kLWxlaHJtZWRpZW4nLFxuICAgICAgICBdO1xuICAgICAgICBpZiAoTElDRU5TRV9JQ09OUy5pbmRleE9mKGljb24pID09IC0xICYmICF1c2VOb25lQXNGYWxsYmFjaykgcmV0dXJuIG51bGw7IC8vIGljb249J25vbmUnO1xuICAgICAgICBpZiAoaWNvbiA9PSAnbm9uZScgJiYgIXVzZU5vbmVBc0ZhbGxiYWNrKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgcmVzdWx0ID1cbiAgICAgICAgICAgIHRoaXMuYXBpSGVscGVyc1NlcnZpY2UuZ2V0U2VydmVyVXJsKCkgKyAnLy4uL2NjaW1hZ2VzL2xpY2Vuc2VzLycgKyBpY29uICsgJy5zdmcnO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSB0cmFuc2xhdGVkIG5hbWUgb2YgYSBsaWNlbnNlIG5hbWUgZm9yIGEgbm9kZVxuICAgICAqIEBwYXJhbSBub2RlXG4gICAgICogQHBhcmFtIHRyYW5zbGF0ZVxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd8YW55fHN0cmluZ3xhbnl8c3RyaW5nfGFueXxzdHJpbmd8YW55fHN0cmluZ3xhbnl8c3RyaW5nfVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRMaWNlbnNlTmFtZShub2RlOiBOb2RlKSB7XG4gICAgICAgIGxldCBwcm9wID0gbm9kZS5wcm9wZXJ0aWVzW1Jlc3RDb25zdGFudHMuQ0NNX1BST1BfTElDRU5TRV0/LlswXTtcbiAgICAgICAgaWYgKCFwcm9wKSBwcm9wID0gJyc7XG4gICAgICAgIHJldHVybiB0aGlzLmdldExpY2Vuc2VOYW1lQnlTdHJpbmcocHJvcCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgdHJhbnNsYXRlZCBuYW1lIGZvciBhIGxpY2Vuc2Ugc3RyaW5nXG4gICAgICogQHBhcmFtIHN0cmluZ1xuICAgICAqIEBwYXJhbSB0cmFuc2xhdGVcbiAgICAgKiBAcmV0dXJucyB7YW55fVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRMaWNlbnNlTmFtZUJ5U3RyaW5nKG5hbWU6IHN0cmluZykge1xuICAgICAgICBpZiAobmFtZSA9PSAnJykge1xuICAgICAgICAgICAgbmFtZSA9ICdOT05FJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnTElDRU5TRS5OQU1FUy4nICsgbmFtZSk7XG4gICAgICAgIC8vIHJldHVybiBuYW1lLnJlcGxhY2UoL18vZyxcIi1cIik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmV0dXJuIHRoZSBMaWNlbnNlIFVSTCAoZS5nLiBmb3IgQ0NfQlkgbGljZW5zZXMpIGZvciBhIGxpY2Vuc2Ugc3RyaW5nIGFuZCB2ZXJzaW9uXG4gICAgICogQHBhcmFtIGxpY2Vuc2VQcm9wZXJ0eVxuICAgICAqIEBwYXJhbSBsaWNlbnNlVmVyc2lvblxuICAgICAqIEBwYXJhbSBsaWNlbnNlTG9jYWxlXG4gICAgICovXG4gICAgcHVibGljIGdldExpY2Vuc2VVcmxCeVN0cmluZyhcbiAgICAgICAgbGljZW5zZVByb3BlcnR5OiBzdHJpbmcsXG4gICAgICAgIGxpY2Vuc2VWZXJzaW9uOiBzdHJpbmcsXG4gICAgICAgIGxpY2Vuc2VMb2NhbGU6IHN0cmluZyxcbiAgICApIHtcbiAgICAgICAgY29uc3QgaXNWNCA9IGxpY2Vuc2VWZXJzaW9uID09PSAnNC4wJztcbiAgICAgICAgY29uc3QgbG9jYWxlID0gaXNWNCB8fCAhbGljZW5zZUxvY2FsZSA/ICcnIDogbGljZW5zZUxvY2FsZS50b0xvd2VyQ2FzZSgpICsgJy8nO1xuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLkxJQ0VOU0VfVVJMU1tsaWNlbnNlUHJvcGVydHldO1xuICAgICAgICBpZiAoIXVybCkge1xuICAgICAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvZihcbiAgICAgICAgICAgIHVybFxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKCd7e3ZlcnNpb259fScsIGxpY2Vuc2VWZXJzaW9uKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKCd7e2xvY2FsZX19JywgbG9jYWxlKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKCd7e2xhbmd1YWdlfX0nLCB0aGlzLnRyYW5zbGF0ZS5jdXJyZW50TGFuZyB8fCAnZW4nKSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0V29ya2Zsb3dTdGF0dXNCeUlkKGlkOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3Qgd29ya2Zsb3dzID0gdGhpcy5nZXRXb3JrZmxvd3MoKTtcbiAgICAgICAgcmV0dXJuIHdvcmtmbG93cy5maWx0ZXIoKHcpID0+IHcuaWQgPT09IGlkKT8uWzBdO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0V29ya2Zsb3dTdGF0dXMobm9kZTogTm9kZSwgdXNlRnJvbUNvbmZpZyA9IGZhbHNlKTogV29ya2Zsb3cuV29ya2Zsb3dEZWZpbml0aW9uU3RhdHVzIHtcbiAgICAgICAgbGV0IHZhbHVlID0gbm9kZS5wcm9wZXJ0aWVzW1Jlc3RDb25zdGFudHMuQ0NNX1BST1BfV0ZfU1RBVFVTXT8uWzBdO1xuICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXREZWZhdWx0V29ya2Zsb3dTdGF0dXModXNlRnJvbUNvbmZpZyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGN1cnJlbnQ6IHRoaXMuZ2V0V29ya2Zsb3dTdGF0dXNCeUlkKHZhbHVlKSxcbiAgICAgICAgICAgIGluaXRpYWw6IHRoaXMuZ2V0V29ya2Zsb3dTdGF0dXNCeUlkKHZhbHVlKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZ2V0RGVmYXVsdFdvcmtmbG93U3RhdHVzKHVzZUZyb21Db25maWcgPSBmYWxzZSk6IFdvcmtmbG93LldvcmtmbG93RGVmaW5pdGlvblN0YXR1cyB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIGN1cnJlbnQ6IG51bGwgYXMgV29ya2Zsb3cuV29ya2Zsb3dEZWZpbml0aW9uLFxuICAgICAgICAgICAgaW5pdGlhbDogbnVsbCBhcyBXb3JrZmxvdy5Xb3JrZmxvd0RlZmluaXRpb24sXG4gICAgICAgIH07XG4gICAgICAgIHJlc3VsdC5pbml0aWFsID0gdGhpcy5nZXRXb3JrZmxvd3MoKVswXTtcbiAgICAgICAgbGV0IGRlZmF1bHRTdGF0dXM6IHN0cmluZyA9IG51bGw7XG4gICAgICAgIGlmICh1c2VGcm9tQ29uZmlnKSB7XG4gICAgICAgICAgICBkZWZhdWx0U3RhdHVzID0gdGhpcy5jb25maWdTZXJ2aWNlLmluc3RhbnQoJ3dvcmtmbG93LmRlZmF1bHRTdGF0dXMnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVmYXVsdFN0YXR1cykge1xuICAgICAgICAgICAgcmVzdWx0LmN1cnJlbnQgPSB0aGlzLmdldFdvcmtmbG93cygpLmZpbmQoKHcpID0+IHcuaWQgPT09IGRlZmF1bHRTdGF0dXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0LmN1cnJlbnQgPSByZXN1bHQuaW5pdGlhbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBnZXRXb3JrZmxvd3MoKTogV29ya2Zsb3cuV29ya2Zsb3dEZWZpbml0aW9uW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25maWdTZXJ2aWNlLmluc3RhbnQoJ3dvcmtmbG93LndvcmtmbG93cycsIFtcbiAgICAgICAgICAgIFdvcmtmbG93LldPUktGTE9XX1NUQVRVU19VTkNIRUNLRUQsXG4gICAgICAgICAgICBXb3JrZmxvdy5XT1JLRkxPV19TVEFUVVNfVE9fQ0hFQ0ssXG4gICAgICAgICAgICBXb3JrZmxvdy5XT1JLRkxPV19TVEFUVVNfSEFTRkxBV1MsXG4gICAgICAgICAgICBXb3JrZmxvdy5XT1JLRkxPV19TVEFUVVNfQ0hFQ0tFRCxcbiAgICAgICAgXSk7XG4gICAgfVxuICAgIGNvcHlEYXRhVG9Ob2RlPFQgZXh0ZW5kcyBOb2RlIHwgVXNlcj4odGFyZ2V0OiBULCBzb3VyY2U6IFQpIHtcbiAgICAgICAgdGFyZ2V0LnByb3BlcnRpZXMgPSBzb3VyY2UucHJvcGVydGllcztcbiAgICAgICAgKHRhcmdldCBhcyBOb2RlKS5uYW1lID0gKHNvdXJjZSBhcyBOb2RlKS5uYW1lO1xuICAgICAgICAodGFyZ2V0IGFzIE5vZGUpLnRpdGxlID0gKHNvdXJjZSBhcyBOb2RlKS50aXRsZTtcbiAgICAgICAgKHRhcmdldCBhcyBOb2RlKS5pY29uVVJMID0gKHNvdXJjZSBhcyBOb2RlKS5pY29uVVJMO1xuICAgICAgICAodGFyZ2V0IGFzIE5vZGUpLnByZXZpZXcgPSAoc291cmNlIGFzIE5vZGUpLnByZXZpZXc7XG4gICAgICAgICh0YXJnZXQgYXMgVXNlcikuYXV0aG9yaXR5TmFtZSA9IChzb3VyY2UgYXMgVXNlcikuYXV0aG9yaXR5TmFtZTtcbiAgICAgICAgKHRhcmdldCBhcyBVc2VyKS5wcm9maWxlID0gKHNvdXJjZSBhcyBVc2VyKS5wcm9maWxlO1xuICAgICAgICAodGFyZ2V0IGFzIFVzZXIpLnN0YXR1cyA9IChzb3VyY2UgYXMgVXNlcikuc3RhdHVzO1xuICAgIH1cbiAgICBpc05vZGVDb2xsZWN0aW9uKG5vZGU6IE5vZGUpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIG5vZGUuYXNwZWN0cz8uaW5jbHVkZXMoUmVzdENvbnN0YW50cy5DQ01fQVNQRUNUX0NPTExFQ1RJT04pIHx8ICEhbm9kZS5jb2xsZWN0aW9uO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0U291cmNlSWNvblBhdGgoc3JjOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmFzc2V0c0Jhc2VQYXRoID8/ICcnKSArICdhc3NldHMvaW1hZ2VzL3NvdXJjZXMvJyArIHNyYy50b0xvd2VyQ2FzZSgpICsgJy5wbmcnO1xuICAgIH1cblxuICAgIGdldE5vZGVMaW5rKG1vZGU6ICdyb3V0ZXJMaW5rJyB8ICdxdWVyeVBhcmFtcycsIG5vZGU6IE5vZGUpIHtcbiAgICAgICAgaWYgKCFub2RlPy5yZWYpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGxldCBkYXRhOiB7IHJvdXRlckxpbms6IHN0cmluZzsgcXVlcnlQYXJhbXM6IFBhcmFtcyB9ID0gbnVsbDtcbiAgICAgICAgaWYgKHRoaXMuaXNOb2RlQ29sbGVjdGlvbihub2RlKSkge1xuICAgICAgICAgICAgY29uc3Qgc2NvcGUgPSBub2RlLmNvbGxlY3Rpb24/LnNjb3BlO1xuICAgICAgICAgICAgY29uc3QgdHlwZSA9IG5vZGUuY29sbGVjdGlvbj8udHlwZTtcbiAgICAgICAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1zOiBQYXJhbXMgPSB7XG4gICAgICAgICAgICAgICAgaWQ6IG5vZGUucmVmLmlkLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmICh0eXBlID09PSBSZXN0Q29uc3RhbnRzLkNPTExFQ1RJT05UWVBFX0VESVRPUklBTCkge1xuICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zLnNjb3BlID0gUmVzdENvbnN0YW50cy5DT0xMRUNUSU9OU0NPUEVfVFlQRV9FRElUT1JJQUw7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFJlc3RDb25zdGFudHMuQ09MTEVDVElPTlRZUEVfTUVESUFfQ0VOVEVSKSB7XG4gICAgICAgICAgICAgICAgcXVlcnlQYXJhbXMuc2NvcGUgPSBSZXN0Q29uc3RhbnRzLkNPTExFQ1RJT05TQ09QRV9UWVBFX01FRElBX0NFTlRFUjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2NvcGUgPT09IFJlc3RDb25zdGFudHMuQ09MTEVDVElPTlNDT1BFX0NVU1RPTV9QVUJMSUMpIHtcbiAgICAgICAgICAgICAgICBxdWVyeVBhcmFtcy5zY29wZSA9IFJlc3RDb25zdGFudHMuQ09MTEVDVElPTlNDT1BFX0FMTDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRhdGEgPSB7XG4gICAgICAgICAgICAgICAgcm91dGVyTGluazogVUlDb25zdGFudHMuUk9VVEVSX1BSRUZJWCArICdjb2xsZWN0aW9ucycsXG4gICAgICAgICAgICAgICAgcXVlcnlQYXJhbXMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKG5vZGUuaXNEaXJlY3RvcnkpIHtcbiAgICAgICAgICAgICAgICBsZXQgcGF0aDtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIG5vZGUucHJvcGVydGllcz8uW1Jlc3RDb25zdGFudHMuQ0NNX1BST1BfRURVU0NPUEVOQU1FXT8uWzBdID09PVxuICAgICAgICAgICAgICAgICAgICBSZXN0Q29uc3RhbnRzLlNBRkVfU0NPUEVcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcGF0aCA9IFVJQ29uc3RhbnRzLlJPVVRFUl9QUkVGSVggKyAnd29ya3NwYWNlL3NhZmUnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBhdGggPSBVSUNvbnN0YW50cy5ST1VURVJfUFJFRklYICsgJ3dvcmtzcGFjZSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRhdGEgPSB7XG4gICAgICAgICAgICAgICAgICAgIHJvdXRlckxpbms6IHBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zOiB7IGlkOiBub2RlLnJlZi5pZCB9LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUucmVmKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZnJvbUhvbWUgPSB0aGlzLm5ldHdvcmtTZXJ2aWNlLmlzRnJvbUhvbWVSZXBvc2l0b3J5KG5vZGUpO1xuICAgICAgICAgICAgICAgIGRhdGEgPSB7XG4gICAgICAgICAgICAgICAgICAgIHJvdXRlckxpbms6IFVJQ29uc3RhbnRzLlJPVVRFUl9QUkVGSVggKyAncmVuZGVyLycgKyBub2RlLnJlZi5pZCxcbiAgICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9zaXRvcnk6IGZyb21Ib21lID8gbnVsbCA6IG5vZGUucmVmLnJlcG8sXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wb3NhbDogKG5vZGUgYXMgUHJvcG9zYWxOb2RlKS5wcm9wb3NhbD8ucmVmLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcG9zYWxDb2xsZWN0aW9uOiAobm9kZSBhcyBQcm9wb3NhbE5vZGUpLnByb3Bvc2FsQ29sbGVjdGlvbj8ucmVmLmlkLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhdGEgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuICAgICAgICBpZiAobW9kZSA9PT0gJ3JvdXRlckxpbmsnKSB7XG4gICAgICAgICAgICByZXR1cm4gJy8nICsgZGF0YS5yb3V0ZXJMaW5rO1xuICAgICAgICB9XG4gICAgICAgIC8vIGVuZm9yY2UgY2xlYXJpbmcgb2YgcGFyYW1ldGVycyB3aGljaCBzaG91bGQgb25seSBiZSBjb25zdW1lZCBvbmNlXG4gICAgICAgIGRhdGEucXVlcnlQYXJhbXMucmVkaXJlY3RGcm9tU1NPID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIGRhdGEucXVlcnlQYXJhbXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgbm9kZSBpcyBhIGNvcHkgb2YgYW5vdGhlciBub2RlLCBqdXN0IHVzZWQgYXMgYSBwdWJsaXNoIHRhcmdldC5cbiAgICAgKi9cbiAgICBpc05vZGVQdWJsaXNoZWRDb3B5KG86IE5vZGUpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhby5wcm9wZXJ0aWVzPy5bUmVzdENvbnN0YW50cy5DQ01fUFJPUF9QVUJMSVNIRURfT1JJR0lOQUxdPy5bMF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYSByZXZva2VkIG5vZGVcbiAgICAgKiAocHVibGlzaGVkIGNvcHkgdGhhdCBoYXMgYmVlbiByZXZva2VkKVxuICAgICAqL1xuICAgIGlzTm9kZVJldm9rZWQobm9kZTogTm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZT8uYXNwZWN0cz8uaW5jbHVkZXMoUmVzdENvbnN0YW50cy5DQ01fQVNQRUNUX1JFVk9LRUQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiByZXR1cm5zIHRydWUgaWYgYWxsIG5vZGVzIGhhdmUgdGhlIHJlcXVlc3RlZCByaWdodFxuICAgICAqIG1vZGUgKG9ubHkgd29ya3MgZm9yIGNvbGxlY3Rpb24gcmVmcyk6XG4gICAgICogICBMb2NhbDogY2hlY2sgb25seSByaWdodHMgb2YgdGhlIG5vZGUgaXRzZWxmXG4gICAgICogICBFZmZlY3RpdmU6IGNoZWNrIG9ubHkgcmlnaHRzIG9mIHRoZSBvcmlnaW5hbCBub2RlIHRoaXMgcmVmZXJzIHRvIChjb2xsZWN0aW9uIHJlZikuIElmIGl0IGlzIG5vdCBhIGNvbGxlY3Rpb24gcmVmLCBmYWxsYmFjayB0byBsb2NhbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXROb2Rlc1JpZ2h0KG5vZGVzOiBOb2RlW10sIHJpZ2h0OiBzdHJpbmcsIG1vZGUgPSBOb2Rlc1JpZ2h0TW9kZS5Mb2NhbCkge1xuICAgICAgICBpZiAobm9kZXMgPT0gbnVsbCkgcmV0dXJuIHRydWU7XG4gICAgICAgIGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlcykge1xuICAgICAgICAgICAgbGV0IGN1cnJlbnRNb2RlID0gbW9kZTtcbiAgICAgICAgICAgIC8vIGlmIG5vIGFjY2VzcyBlZmZlY3RpdmUgcHJlc2VudCBhbmQgbm90IGEgY29sbGVjdGlvbiByZWYuIHVzZSB0aGUgbG9jYWwgZGF0YVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICFub2RlLmFzcGVjdHM/LmluY2x1ZGVzKFJlc3RDb25zdGFudHMuQ0NNX0FTUEVDVF9JT19SRUZFUkVOQ0UpICYmXG4gICAgICAgICAgICAgICAgIW5vZGUuYWNjZXNzRWZmZWN0aXZlPy5sZW5ndGhcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRNb2RlID0gTm9kZXNSaWdodE1vZGUuTG9jYWw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY3VycmVudE1vZGUgPT09IE5vZGVzUmlnaHRNb2RlLkVmZmVjdGl2ZSkge1xuICAgICAgICAgICAgICAgIGlmICghbm9kZS5hc3BlY3RzPy5pbmNsdWRlcyhSZXN0Q29uc3RhbnRzLkNDTV9BU1BFQ1RfSU9fUkVGRVJFTkNFKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5hY2Nlc3NFZmZlY3RpdmUgJiYgbm9kZS5hY2Nlc3NFZmZlY3RpdmUuaW5kZXhPZihyaWdodCkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobm9kZS5hY2Nlc3NFZmZlY3RpdmUgJiYgbm9kZS5hY2Nlc3NFZmZlY3RpdmUuaW5kZXhPZihyaWdodCkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoUmVzdENvbnN0YW50cy5JTVBMSUNJVF9DT0xMRUNUSU9OX1BFUk1JU1NJT05TLmluZGV4T2YocmlnaHQpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBwZXJtaXNzaW9uIG5vdCBtYXRjaGVkIG9uIG9yaWdpbmFsIC0+IGltcGxpY2l0IHBlcm1pc3Npb25zIGZyb20gY29sbGVjdGlvbiBtYXkgYXBwbHlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGNoZWNrIHJlZ3VsYXIgbm9kZSByaWdodHNcbiAgICAgICAgICAgIGlmICghbm9kZS5hY2Nlc3MgfHwgbm9kZS5hY2Nlc3MuaW5kZXhPZihyaWdodCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn1cbiJdfQ==